diff --git a/app/Livewire/Studio/Dashboard/Analysis.php b/app/Livewire/Studio/Dashboard/Analysis.php index 00cbcfc..f3af324 100644 --- a/app/Livewire/Studio/Dashboard/Analysis.php +++ b/app/Livewire/Studio/Dashboard/Analysis.php @@ -221,6 +221,36 @@ public function render(): View $profitMargin = $totalIncome > 0 ? ($netProfit / $totalIncome) * 100 : 0; $itemsPerOrder = $totalOrdersCount > 0 ? $totalItemsCount / $totalOrdersCount : 0; + // Total Asset Calculation + $totalAsset = (int) Perfume::query() + ->join('outlet_perfume', 'perfumes.id', '=', 'outlet_perfume.perfume_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('outlet_perfume.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(outlet_perfume.stock AS DECIMAL) * perfumes.cost_price')); + + $totalAsset += (int) Product::query() + ->join('outlet_product', 'products.id', '=', 'outlet_product.product_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('outlet_product.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(outlet_product.stock AS DECIMAL) * products.cost_price')); + + $totalAsset += (int) Bottle::query() + ->join('bottle_outlet', 'bottles.id', '=', 'bottle_outlet.bottle_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('bottle_outlet.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(bottle_outlet.stock AS DECIMAL) * bottles.cost_price')); + + if (empty($this->selectedOutletIds)) { + $totalAsset += (int) Perfume::query() + ->join('perfume_warehouse', 'perfumes.id', '=', 'perfume_warehouse.perfume_id') + ->sum(DB::raw('CAST(perfume_warehouse.stock AS DECIMAL) * perfumes.cost_price')); + + $totalAsset += (int) Product::query() + ->join('product_warehouse', 'products.id', '=', 'product_warehouse.product_id') + ->sum(DB::raw('CAST(product_warehouse.stock AS DECIMAL) * products.cost_price')); + + $totalAsset += (int) Bottle::query() + ->join('bottle_warehouse', 'bottles.id', '=', 'bottle_warehouse.bottle_id') + ->sum(DB::raw('CAST(bottle_warehouse.stock AS DECIMAL) * bottles.cost_price')); + } + $customerOrders = (clone $orderQuery)->select('customer_id', DB::raw('count(*) as count')) ->whereNotNull('customer_id') ->groupBy('customer_id') @@ -240,6 +270,11 @@ public function render(): View 'value' => round($profitMargin, 1).'%', 'description' => 'Persentase keuntungan bersih dibandingkan dengan total pendapatan.', ] : null, + $user->hasRole(['Developer', 'Owner']) ? [ + 'title' => 'Total Aset', + 'value' => formatCurrencyNumber($totalAsset, 'Rp'), + 'description' => 'Total nilai aset dari stok barang yang ada (Parfum, Produk, Botol) berdasarkan harga modal.', + ] : null, [ 'title' => 'Loyalty Rate', 'value' => round($loyaltyRate, 1).'%', diff --git a/app/Livewire/Studio/Dashboard/Overview.php b/app/Livewire/Studio/Dashboard/Overview.php index c95f0b1..5c744de 100644 --- a/app/Livewire/Studio/Dashboard/Overview.php +++ b/app/Livewire/Studio/Dashboard/Overview.php @@ -166,6 +166,36 @@ public function render(): View $todayProfitMargin = $todayIncome > 0 ? ($todayNetProfit / $todayIncome) * 100 : 0; $yesterdayProfitMargin = $yesterdayIncome > 0 ? ($yesterdayNetProfit / $yesterdayIncome) * 100 : 0; + // New Card: Total Asset + $totalAsset = (int) Perfume::query() + ->join('outlet_perfume', 'perfumes.id', 'outlet_perfume.perfume_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('outlet_perfume.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(outlet_perfume.stock AS DECIMAL) * perfumes.cost_price')); + + $totalAsset += (int) Product::query() + ->join('outlet_product', 'products.id', 'outlet_product.product_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('outlet_product.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(outlet_product.stock AS DECIMAL) * products.cost_price')); + + $totalAsset += (int) Bottle::query() + ->join('bottle_outlet', 'bottles.id', 'bottle_outlet.bottle_id') + ->when(! empty($outletIds), fn ($q) => $q->whereIn('bottle_outlet.outlet_id', $outletIds)) + ->sum(DB::raw('CAST(bottle_outlet.stock AS DECIMAL) * bottles.cost_price')); + + if (empty($this->selectedOutletIds)) { + $totalAsset += (int) Perfume::query() + ->join('perfume_warehouse', 'perfumes.id', 'perfume_warehouse.perfume_id') + ->sum(DB::raw('CAST(perfume_warehouse.stock AS DECIMAL) * perfumes.cost_price')); + + $totalAsset += (int) Product::query() + ->join('product_warehouse', 'products.id', 'product_warehouse.product_id') + ->sum(DB::raw('CAST(product_warehouse.stock AS DECIMAL) * products.cost_price')); + + $totalAsset += (int) Bottle::query() + ->join('bottle_warehouse', 'bottles.id', 'bottle_warehouse.bottle_id') + ->sum(DB::raw('CAST(bottle_warehouse.stock AS DECIMAL) * bottles.cost_price')); + } + // --- Chart Data Logic --- // 1. Hourly Sales Comparison (Today vs Yesterday) @@ -305,6 +335,12 @@ public function render(): View 'description' => 'Persentase keuntungan bersih dibandingkan dengan total pendapatan.', ] : null, + $user->hasRole(['Developer', 'Owner']) ? [ + 'title' => 'Total Aset', + 'value' => formatCurrencyNumber($totalAsset, 'Rp'), + 'description' => 'Total nilai aset dari stok barang yang ada (Parfum, Produk, Botol) berdasarkan harga modal.', + ] : null, + [ 'title' => 'Total Order', 'value' => $todayOrder, diff --git a/resources/views/livewire/studio/dashboard/overview.blade.php b/resources/views/livewire/studio/dashboard/overview.blade.php index 8b9c26c..ba690a0 100644 --- a/resources/views/livewire/studio/dashboard/overview.blade.php +++ b/resources/views/livewire/studio/dashboard/overview.blade.php @@ -33,14 +33,18 @@ class="!px-1 border-none bg-transparent hover:bg-zinc-300 dark:hover:bg-zinc-600
{{ $stat['value'] }} - {{ $stat['previous'] }} -
-
- - {{ $stat['trend'] }} + @if (isset($stat['previous'])) + {{ $stat['previous'] }} + @endif
+ @if (isset($stat['trend'])) +
+ + {{ $stat['trend'] }} +
+ @endif @endforeach