diff --git a/app/Http/Controllers/LaporanClosingBalanceController.php b/app/Http/Controllers/LaporanClosingBalanceController.php new file mode 100644 index 0000000..b6bf0c1 --- /dev/null +++ b/app/Http/Controllers/LaporanClosingBalanceController.php @@ -0,0 +1,232 @@ + $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'); + } + } +} \ No newline at end of file diff --git a/resources/views/laporan-closing-balance/index.blade.php b/resources/views/laporan-closing-balance/index.blade.php new file mode 100644 index 0000000..86e7442 --- /dev/null +++ b/resources/views/laporan-closing-balance/index.blade.php @@ -0,0 +1,322 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{ Breadcrumbs::render('laporan-closing-balance.index') }} +@endsection + +@section('content') +
| + + | ++ + Nomor Rekening + + + | ++ + Periode + + + | ++ + Saldo Cleared + + + | ++ + Saldo Akhir + + + | ++ + Tanggal Update + + + | +Action | +
|---|