$request->all() ]); try { DB::beginTransaction(); $query = AccountBalance::query(); // Filter berdasarkan nomor rekening jika ada if ($request->filled('account_number')) { $query->where('account_number', 'like', '%' . $request->account_number . '%'); Log::info('Filter nomor rekening diterapkan', ['account_number' => $request->account_number]); } // Filter berdasarkan rentang tanggal jika ada if ($request->filled('start_date') && $request->filled('end_date')) { $startDate = Carbon::parse($request->start_date)->format('Ymd'); $endDate = Carbon::parse($request->end_date)->format('Ymd'); $query->whereBetween('period', [$startDate, $endDate]); Log::info('Filter rentang tanggal diterapkan', [ 'start_date' => $startDate, 'end_date' => $endDate ]); } // Sorting $sortColumn = $request->get('sort', 'period'); $sortDirection = $request->get('direction', 'desc'); $query->orderBy($sortColumn, $sortDirection); // Pagination $perPage = $request->get('per_page', 10); $page = $request->get('page', 1); $results = $query->paginate($perPage, ['*'], 'page', $page); DB::commit(); Log::info('Data laporan closing balance berhasil diambil', [ 'total' => $results->total(), 'per_page' => $perPage, 'current_page' => $page ]); return response()->json([ 'data' => $results->items(), 'pagination' => [ 'current_page' => $results->currentPage(), 'last_page' => $results->lastPage(), 'per_page' => $results->perPage(), 'total' => $results->total(), 'from' => $results->firstItem(), 'to' => $results->lastItem() ] ]); } catch (\Exception $e) { DB::rollback(); Log::error('Error saat mengambil data laporan closing balance', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return response()->json([ 'error' => 'Terjadi kesalahan saat mengambil data laporan', 'message' => $e->getMessage() ], 500); } } /** * Export data laporan closing balance ke format Excel * * @param Request $request * @return \Illuminate\Http\Response */ public function export(Request $request) { Log::info('Export laporan closing balance dimulai', [ 'filters' => $request->all() ]); try { DB::beginTransaction(); $query = AccountBalance::query(); // Terapkan filter yang sama seperti di datatables if ($request->filled('account_number')) { $query->where('account_number', 'like', '%' . $request->account_number . '%'); } if ($request->filled('start_date') && $request->filled('end_date')) { $startDate = Carbon::parse($request->start_date)->format('Ymd'); $endDate = Carbon::parse($request->end_date)->format('Ymd'); $query->whereBetween('period', [$startDate, $endDate]); } $data = $query->orderBy('period', 'desc')->get(); DB::commit(); Log::info('Export laporan closing balance berhasil', [ 'total_records' => $data->count() ]); // Generate CSV content $csvContent = "Nomor Rekening,Periode,Saldo Aktual,Saldo Cleared,Tanggal Update\n"; foreach ($data as $item) { $csvContent .= sprintf( "%s,%s,%s,%s,%s\n", $item->account_number, $item->period, number_format($item->actual_balance, 2), number_format($item->cleared_balance, 2), $item->updated_at ? $item->updated_at->format('Y-m-d H:i:s') : '-' ); } $filename = 'laporan_closing_balance_' . date('Y-m-d_H-i-s') . '.csv'; return response($csvContent) ->header('Content-Type', 'text/csv') ->header('Content-Disposition', 'attachment; filename="' . $filename . '"'); } catch (\Exception $e) { DB::rollback(); Log::error('Error saat export laporan closing balance', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return response()->json([ 'error' => 'Terjadi kesalahan saat export laporan', 'message' => $e->getMessage() ], 500); } } /** * Menampilkan detail laporan closing balance untuk periode tertentu * * @param string $accountNumber * @param string $period * @return \Illuminate\View\View */ public function show($accountNumber, $period) { Log::info('Menampilkan detail laporan closing balance', [ 'account_number' => $accountNumber, 'period' => $period ]); try { DB::beginTransaction(); $closingBalance = AccountBalance::where('account_number', $accountNumber) ->where('period', $period) ->firstOrFail(); DB::commit(); Log::info('Detail laporan closing balance berhasil diambil', [ 'account_number' => $accountNumber, 'period' => $period, 'balance' => $closingBalance->actual_balance ]); return view('webstatement::laporan-closing-balance.show', [ 'closingBalance' => $closingBalance ]); } catch (\Exception $e) { DB::rollback(); Log::error('Error saat menampilkan detail laporan closing balance', [ 'account_number' => $accountNumber, 'period' => $period, 'error' => $e->getMessage() ]); return redirect()->route('laporan-closing-balance.index') ->with('error', 'Data laporan closing balance tidak ditemukan'); } } }