input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d')); $endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d')); $rawTransaksis = NeracasaldoModel::whereBetween('Tanggal', [$startDate, $endDate]) ->orderBy('kode', 'asc') ->get(); $totalsPerAkun = []; foreach ($rawTransaksis as $transaksi) { // Fungsi untuk menambahkan atau memperbarui total per akun $processAkun = function($kode, $kategori, $debit, $kredit) use (&$totalsPerAkun) { if (!empty($kode) && !empty($kategori)) { if (!isset($totalsPerAkun[$kategori])) { $totalsPerAkun[$kategori] = [ 'kode' => $kode, 'kategori' => $kategori, 'debit' => 0, 'kredit' => 0 ]; } $totalsPerAkun[$kategori]['debit'] += floatval($debit ?? 0); $totalsPerAkun[$kategori]['kredit'] += floatval($kredit ?? 0); } }; // Proses untuk semua kategori $processAkun($transaksi->kode, $transaksi->kategori, $transaksi->uang_masuk, $transaksi->uang_keluar); $processAkun($transaksi->kode2, $transaksi->kategori2, $transaksi->uang_masuk2, $transaksi->uang_keluar2); $processAkun($transaksi->kode3, $transaksi->kategori3, $transaksi->uang_masuk3, $transaksi->uang_keluar3); $processAkun($transaksi->kode4, $transaksi->kategori4, $transaksi->uang_masuk4, $transaksi->uang_keluar4); $processAkun($transaksi->kode5, $transaksi->kategori5, $transaksi->uang_masuk5, $transaksi->uang_keluar5); } // Hitung saldo akhir dan atur posisi debit/kredit sesuai jenis akun $finalTransaksis = []; foreach ($totalsPerAkun as $kategori => $data) { $kodeAwal = substr($data['kode'], 0, 3); $saldo = $data['debit'] - $data['kredit']; // Tentukan posisi saldo (debit/kredit) berdasarkan jenis akun if (in_array($kodeAwal, ['111', '112']) || in_array($kodeAwal, ['251', '252'])) { // Aktiva dan Beban: saldo normal di debit if ($saldo != 0) { $finalTransaksis[] = [ 'kode' => $data['kode'], 'kategori' => $kategori, 'debit' => $saldo, 'kredit' => 0 ]; } } else { // Pasiva dan Pendapatan: saldo normal di kredit if ($saldo != 0) { $finalTransaksis[] = [ 'kode' => $data['kode'], 'kategori' => $kategori, 'debit' => 0, 'kredit' => -$saldo ]; } } } // Urutkan berdasarkan kode usort($finalTransaksis, function($a, $b) { return $a['kode'] <=> $b['kode']; }); // Konversi ke collection setelah selesai $transaksis = collect($finalTransaksis); return view('Neracasaldo', compact('transaksis', 'startDate', 'endDate')); } public function filter(Request $request) { return $this->index($request); } public function create() { return view('neracasaldo.create'); } public function store(Request $request) { $request->validate([ 'Tanggal' => 'required|date', 'kode' => 'required|string', 'kategori' => 'required|string', ]); NeracasaldoModel::create($request->all()); return redirect()->route('neracasaldo.index') ->with('success', 'Data berhasil ditambahkan'); } public function edit($id) { $transaksi = NeracasaldoModel::findOrFail($id); return view('neracasaldo.edit', compact('transaksi')); } public function update(Request $request, $id) { $request->validate([ 'Tanggal' => 'required|date', 'kode' => 'required|string', 'kategori' => 'required|string', ]); $transaksi = NeracasaldoModel::findOrFail($id); $transaksi->update($request->all()); return redirect()->route('neracasaldo.index') ->with('success', 'Data berhasil diperbarui'); } public function destroy($id) { $transaksi = NeracasaldoModel::findOrFail($id); $transaksi->delete(); return redirect()->route('neracasaldo.index') ->with('success', 'Data berhasil dihapus'); } public function show($id) { $transaksi = NeracasaldoModel::findOrFail($id); return view('neracasaldo.show', compact('transaksi')); } public function exportExcel(Request $request) { try { // Ambil parameter filter tanggal $startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d')); $endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d')); $rawTransaksis = NeracasaldoModel::whereBetween('Tanggal', [$startDate, $endDate]) ->orderBy('kode', 'asc') ->get(); $processedData = []; $totalsPerAkun = []; $totalDebit = 0; $totalKredit = 0; // Proses data transaksi foreach ($rawTransaksis as $transaksi) { $processAkun = function($kode, $kategori, $debit, $kredit) use (&$totalsPerAkun) { if (!empty($kode) && !empty($kategori)) { if (!isset($totalsPerAkun[$kategori])) { $totalsPerAkun[$kategori] = [ 'kode' => $kode, 'kategori' => $kategori, 'debit' => 0, 'kredit' => 0 ]; } $totalsPerAkun[$kategori]['debit'] += floatval($debit ?? 0); $totalsPerAkun[$kategori]['kredit'] += floatval($kredit ?? 0); } }; // Proses semua kolom transaksi $processAkun($transaksi->kode, $transaksi->kategori, $transaksi->uang_masuk, $transaksi->uang_keluar); $processAkun($transaksi->kode2, $transaksi->kategori2, $transaksi->uang_masuk2, $transaksi->uang_keluar2); $processAkun($transaksi->kode3, $transaksi->kategori3, $transaksi->uang_masuk3, $transaksi->uang_keluar3); $processAkun($transaksi->kode4, $transaksi->kategori4, $transaksi->uang_masuk4, $transaksi->uang_keluar4); $processAkun($transaksi->kode5, $transaksi->kategori5, $transaksi->uang_masuk5, $transaksi->uang_keluar5); } // Proses saldo untuk setiap akun foreach ($totalsPerAkun as $kategori => $data) { $kodeAwal = substr($data['kode'], 0, 3); $saldo = $data['debit'] - $data['kredit']; // Reset nilai debit dan kredit $debit = 0; $kredit = 0; // Logika untuk menentukan posisi saldo if (in_array($kodeAwal, ['111', '112', '251', '252'])) { // Aktiva dan Beban if ($saldo > 0) { $debit = $saldo; } else { $kredit = abs($saldo); } } else { // Pasiva dan Pendapatan if ($saldo < 0) { $kredit = abs($saldo); } else { $debit = $saldo; } } if ($saldo != 0) { $processedData[] = [ 'kode' => $data['kode'], 'kategori' => $kategori, 'debit' => $debit, 'kredit' => $kredit ]; $totalDebit += $debit; $totalKredit += $kredit; } } // Tambahkan baris total $processedData[] = [ 'kode' => '', 'kategori' => 'Total', 'debit' => $totalDebit, 'kredit' => $totalKredit ]; // Buat class export inline dengan format yang diperbaiki $export = new class($processedData) implements FromCollection, WithHeadings { protected $data; public function __construct($data) { // Format data untuk Excel $formattedData = collect($data)->map(function ($item) { return [ 'kode' => $item['kode'], 'kategori' => $item['kategori'], 'debit' => $item['debit'] > 0 ? $item['debit'] : 0, 'kredit' => $item['kredit'] > 0 ? $item['kredit'] : 0 ]; }); $this->data = $formattedData; } public function collection() { return $this->data; } public function headings(): array { return [ 'Kode', 'Nama Akun', 'Debit', 'Kredit' ]; } }; return Excel::download($export, 'neraca-saldo-'.date('Y-m-d').'.xlsx'); } catch (\Exception $e) { return redirect()->back()->with('error', 'Gagal mengekspor Excel: ' . $e->getMessage()); } } public function exportPDF(Request $request) { try { // Ambil parameter filter tanggal jika ada $startDate = $request->input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d')); $endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d')); $rawTransaksis = NeracasaldoModel::whereBetween('Tanggal', [$startDate, $endDate]) ->orderBy('kode', 'asc') ->get(); $processedData = []; $totalsPerAkun = []; $totalDebit = 0; $totalKredit = 0; // Proses data seperti di fungsi index foreach ($rawTransaksis as $transaksi) { $processAkun = function($kode, $kategori, $debit, $kredit) use (&$totalsPerAkun) { if (!empty($kode) && !empty($kategori)) { if (!isset($totalsPerAkun[$kategori])) { $totalsPerAkun[$kategori] = [ 'kode' => $kode, 'kategori' => $kategori, 'debit' => 0, 'kredit' => 0 ]; } $totalsPerAkun[$kategori]['debit'] += floatval($debit ?? 0); $totalsPerAkun[$kategori]['kredit'] += floatval($kredit ?? 0); } }; $processAkun($transaksi->kode, $transaksi->kategori, $transaksi->uang_masuk, $transaksi->uang_keluar); $processAkun($transaksi->kode2, $transaksi->kategori2, $transaksi->uang_masuk2, $transaksi->uang_keluar2); $processAkun($transaksi->kode3, $transaksi->kategori3, $transaksi->uang_masuk3, $transaksi->uang_keluar3); $processAkun($transaksi->kode4, $transaksi->kategori4, $transaksi->uang_masuk4, $transaksi->uang_keluar4); $processAkun($transaksi->kode5, $transaksi->kategori5, $transaksi->uang_masuk5, $transaksi->uang_keluar5); } foreach ($totalsPerAkun as $kategori => $data) { $kodeAwal = substr($data['kode'], 0, 3); $saldo = $data['debit'] - $data['kredit']; // Reset nilai debit dan kredit $debit = 0; $kredit = 0; // Logika untuk menentukan posisi saldo if (in_array($kodeAwal, ['111', '112', '251', '252'])) { // Aktiva dan Beban if ($saldo > 0) { $debit = $saldo; } else { $kredit = abs($saldo); } } else { // Pasiva dan Pendapatan if ($saldo < 0) { $kredit = abs($saldo); } else { $debit = $saldo; } } if ($saldo != 0) { $processedData[] = [ 'kode' => $data['kode'], 'kategori' => $kategori, 'debit' => $debit, 'kredit' => $kredit ]; $totalDebit += $debit; $totalKredit += $kredit; } } // Tambahkan baris total $processedData[] = [ 'kode' => '', 'kategori' => 'Total', 'debit' => $totalDebit, 'kredit' => $totalKredit ]; // Generate PDF dengan style yang diperbaiki $html = '
Periode: ' . date('F Y', strtotime($startDate)) . '
Kode | Nama Akun | Debit | Kredit |
---|---|---|---|
'.$data['kode'].' | '.$data['kategori'].' | '.($data['debit'] > 0 ? number_format($data['debit'], 0, ',', '.') : '-').' | '.($data['kredit'] > 0 ? number_format($data['kredit'], 0, ',', '.') : '-').' |
Total: | '.number_format($totalDebit, 0, ',', '.').' | '.number_format($totalKredit, 0, ',', '.').' |