input('start_date', Carbon::now()->startOfMonth()->format('Y-m-d')); $endDate = $request->input('end_date', Carbon::now()->endOfMonth()->format('Y-m-d')); try { // Ambil semua transaksi dalam periode $transaksis = DB::table('laporan_transaksis') ->whereBetween('Tanggal', [$startDate, $endDate]) ->get(); // Array untuk menyimpan total per kategori $totalsPerAkun = []; $totalPendapatan = 0; $totalBeban = 0; // 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); } }; foreach ($transaksis as $transaksi) { // Proses untuk semua kategori for ($i = 1; $i <= 5; $i++) { $kategoriField = $i === 1 ? 'kategori' : "kategori{$i}"; $uangMasukField = $i === 1 ? 'uang_masuk' : "uang_masuk{$i}"; $uangKeluarField = $i === 1 ? 'uang_keluar' : "uang_keluar{$i}"; if (!empty($transaksi->$kategoriField)) { $kodeAkun = $this->getKodeAkun($transaksi->$kategoriField); if ($kodeAkun) { $processAkun( $kodeAkun, $transaksi->$kategoriField, $transaksi->$uangMasukField, $transaksi->$uangKeluarField ); // Hitung total berdasarkan jenis akun $accountType = $this->getAccountType($kodeAkun); if ($accountType === 'PENDAPATAN') { $totalPendapatan = $this->calculateBalance( $totalPendapatan, floatval($transaksi->$uangMasukField ?? 0), floatval($transaksi->$uangKeluarField ?? 0), 'PENDAPATAN' ); } elseif ($accountType === 'BEBAN') { $totalBeban = $this->calculateBalance( $totalBeban, floatval($transaksi->$uangMasukField ?? 0), floatval($transaksi->$uangKeluarField ?? 0), 'BEBAN' ); } } } } } // Hitung laba rugi $labaRugiTotal = $totalPendapatan - $totalBeban; $labaRugiBulanIni = $labaRugiTotal; // Kelompokkan data untuk tampilan $pendapatan = []; $beban = []; foreach ($totalsPerAkun as $kategori => $data) { $accountType = $this->getAccountType($data['kode']); if ($accountType === 'PENDAPATAN') { $pendapatan[$kategori] = [ 'kategori' => $kategori, 'kode_akun' => $data['kode'], 'nominal' => $this->calculateBalance(0, $data['debit'], $data['kredit'], 'PENDAPATAN') ]; } elseif ($accountType === 'BEBAN') { $beban[$kategori] = [ 'kategori' => $kategori, 'kode_akun' => $data['kode'], 'nominal' => $this->calculateBalance(0, $data['debit'], $data['kredit'], 'BEBAN') ]; } } // Get monthly totals for chart $monthlyTotals = DB::table('laporan_transaksis') ->select( DB::raw('DATE_FORMAT(Tanggal, "%Y-%m") as periode'), DB::raw('SUM(CASE WHEN LEFT(kategori, 3) IN ("241", "242") THEN uang_masuk ELSE 0 END) as total_debit'), DB::raw('SUM(CASE WHEN LEFT(kategori, 3) IN ("251", "252") THEN uang_keluar ELSE 0 END) as total_kredit') ) ->groupBy('periode') ->orderBy('periode') ->get(); // Get category totals for distribution chart $categoryTotals = DB::table('laporan_transaksis') ->select( 'kategori', DB::raw('SUM(CASE WHEN LEFT(kategori, 3) IN ("241", "242") THEN uang_masuk ELSE 0 END) as total_debit'), DB::raw('SUM(CASE WHEN LEFT(kategori, 3) IN ("251", "252") THEN uang_keluar ELSE 0 END) as total_kredit') ) ->whereBetween('Tanggal', [$startDate, $endDate]) ->whereNotNull('kategori') ->groupBy('kategori') ->get(); // Get recent transactions $recentTransactions = DB::table('laporan_transaksis') ->orderBy('Tanggal', 'desc') ->limit(10) ->get(); // Calculate growth percentage $lastMonthStart = Carbon::parse($startDate)->subMonth()->startOfMonth(); $lastMonthEnd = Carbon::parse($startDate)->subMonth()->endOfMonth(); $lastMonthData = DB::table('laporan_transaksis') ->whereBetween('Tanggal', [$lastMonthStart, $lastMonthEnd]) ->get(); $lastMonthPendapatan = 0; $lastMonthBeban = 0; foreach ($lastMonthData as $transaksi) { $kodeAkun = $this->getKodeAkun($transaksi->kategori); if ($kodeAkun) { $accountType = $this->getAccountType($kodeAkun); if ($accountType === 'PENDAPATAN') { $lastMonthPendapatan = $this->calculateBalance( $lastMonthPendapatan, floatval($transaksi->uang_masuk ?? 0), floatval($transaksi->uang_keluar ?? 0), 'PENDAPATAN' ); } elseif ($accountType === 'BEBAN') { $lastMonthBeban = $this->calculateBalance( $lastMonthBeban, floatval($transaksi->uang_masuk ?? 0), floatval($transaksi->uang_keluar ?? 0), 'BEBAN' ); } } } $lastMonthLabaRugi = $lastMonthPendapatan - $lastMonthBeban; $currentMonthLabaRugi = $labaRugiBulanIni; $growthPercentage = $lastMonthLabaRugi != 0 ? (($currentMonthLabaRugi - $lastMonthLabaRugi) / abs($lastMonthLabaRugi)) * 100 : 100; return view('home', compact( 'startDate', 'endDate', 'totalPendapatan', 'totalBeban', 'labaRugiTotal', 'labaRugiBulanIni', 'growthPercentage', 'monthlyTotals', 'categoryTotals', 'recentTransactions', 'pendapatan', 'beban' )); } catch (\Exception $e) { Log::error("Error in HomeController: " . $e->getMessage()); throw $e; } } public function filter(Request $request) { return $this->index($request); } }