From 881324915411a3c4c833557c1efd3d5eea011854 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Mon, 9 Mar 2026 13:49:51 +0700 Subject: [PATCH] feat: Add new Filament Analisys page to display various business statistics and breakdowns. --- app/Filament/Pages/Analisys.php | 106 ++++++++++++++++++ .../views/filament/pages/analisys.blade.php | 106 ++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 app/Filament/Pages/Analisys.php create mode 100644 resources/views/filament/pages/analisys.blade.php diff --git a/app/Filament/Pages/Analisys.php b/app/Filament/Pages/Analisys.php new file mode 100644 index 0000000..69005b2 --- /dev/null +++ b/app/Filament/Pages/Analisys.php @@ -0,0 +1,106 @@ + number_format((float) $val, $val == floor($val) ? 0 : 2, ',', '.'); + + // 1. Count customers + $countPelanggan = Customer::count(); + + // 2. Count total eggs (by unit) + $totalEggsByUnit = EggCollectionItem::query() + ->join('egg_collections', 'egg_collection_items.egg_collection_id', '=', 'egg_collections.id') + ->join('units', 'egg_collection_items.unit_id', '=', 'units.id') + ->whereNull('egg_collections.deleted_at') + ->selectRaw('units.name as unit_name, + sum(case when is_broken = 0 then quantity else 0 end) as total_good, + sum(case when is_broken = 1 then quantity else 0 end) as total_broken') + ->groupBy('units.name') + ->get() + ->map(fn ($item) => [ + 'unit_name' => $item->unit_name, + 'total_good' => $formatNumber($item->total_good), + 'total_broken' => $formatNumber($item->total_broken), + ]); + + // 3. Count total orders + $countPesanan = Order::count(); + + // 4. Count total delayed goods (by unit) + $totalDelayedByUnit = DelayedGood::query() + ->join('units', 'delayed_goods.unit_id', '=', 'units.id') + ->selectRaw('units.name as unit_name, sum(quantity) as total') + ->groupBy('units.name') + ->get() + ->map(fn ($item) => [ + 'unit_name' => $item->unit_name, + 'total' => $formatNumber($item->total), + ]); + + // 5. Revenue (from orders and delayed goods) + $pendapatanPesanan = Order::sum('total_amount'); + $pendapatanTertunda = DelayedGood::sum('total_amount'); + $totalPendapatan = $pendapatanPesanan + $pendapatanTertunda; + + // 6. Expenses + $totalPengeluaran = Expense::sum('amount'); + + // 7. Payroll + $totalPenggajian = Payroll::sum('total_salary'); + + // 8. Feed purchases + $totalBelanjaPakan = FeedPurchase::sum('total_price'); + + // 9. Gross profit (Revenue - COGS/Feed) + $labaKotor = $totalPendapatan - $totalBelanjaPakan; + + // 10. Net profit (Gross Profit - Expenses - Payroll) + $labaBersih = $labaKotor - $totalPengeluaran - $totalPenggajian; + + // 11. Unpaid accounts receivable (delayed goods) + $totalPiutang = DelayedGood::sum('total_amount') - DelayedGood::sum('paid_amount'); + + $mainStats = [ + ['label' => 'Total Pelanggan', 'desc' => 'Jumlah pelanggan terdaftar', 'value' => $countPelanggan, 'prefix' => ''], + ['label' => 'Total Pesanan', 'desc' => 'Jumlah transaksi pesanan', 'value' => $countPesanan, 'prefix' => ''], + ['label' => 'Laba Bersih', 'desc' => 'Setelah dikurangi beban operasional', 'value' => $formatNumber($labaBersih), 'prefix' => 'Rp'], + ['label' => 'Total Piutang', 'desc' => 'Piutang barang tertunda', 'value' => $formatNumber($totalPiutang), 'prefix' => 'Rp'], + ['label' => 'Total Pendapatan', 'desc' => 'Akumulasi semua pemasukan', 'value' => $formatNumber($totalPendapatan), 'prefix' => 'Rp'], + ['label' => 'Laba Kotor', 'desc' => 'Pendapatan dikurangi biaya pakan', 'value' => $formatNumber($labaKotor), 'prefix' => 'Rp'], + ['label' => 'Total Pengeluaran', 'desc' => 'Biaya operasional & umum', 'value' => $formatNumber($totalPengeluaran), 'prefix' => 'Rp'], + ['label' => 'Total Penggajian', 'desc' => 'Total gaji karyawan', 'value' => $formatNumber($totalPenggajian), 'prefix' => 'Rp'], + ['label' => 'Belanja Pakan', 'desc' => 'Total pembelian pakan ayam', 'value' => $formatNumber($totalBelanjaPakan), 'prefix' => 'Rp'], + ]; + + return [ + 'mainStats' => $mainStats, + 'totalEggsByUnit' => $totalEggsByUnit, + 'totalDelayedByUnit' => $totalDelayedByUnit, + ]; + } +} diff --git a/resources/views/filament/pages/analisys.blade.php b/resources/views/filament/pages/analisys.blade.php new file mode 100644 index 0000000..6d62a61 --- /dev/null +++ b/resources/views/filament/pages/analisys.blade.php @@ -0,0 +1,106 @@ + +
+ {{-- Main Stats Grid --}} +
+ @foreach ($mainStats as $stat) +
+
+ {{ $stat['label'] }} +
+ @if ($stat['prefix']) + {{ $stat['prefix'] }} + @endif + {{ $stat['value'] }} +
+ {{ $stat['desc'] }} +
+
+ @endforeach +
+ + {{-- Units Breakdown --}} +
+ {{-- Production --}} +
+
+

Produksi Telur (By Unit)

+
+
+ @forelse($totalEggsByUnit as $item) +
+
+ {{ $item['unit_name'] }} +
+
+
+ Bagus + {{ $item['total_good'] }} +
+
+ Pecah + {{ $item['total_broken'] }} +
+
+
+ @empty +
Belum ada data produksi
+ @endforelse +
+
+ + {{-- Delayed --}} +
+
+

Barang Tertunda (By Unit)

+
+
+ @forelse($totalDelayedByUnit as $item) +
+ {{ $item['unit_name'] }} + {{ $item['total'] }} +
+ @empty +
Tidak ada barang tertunda
+ @endforelse +
+
+
+
+ + +