From 96ed2c3ac42bd57cca5c7beef24325a48b158304 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Mon, 15 Dec 2025 21:09:41 +0700 Subject: [PATCH] feat: Implement `StockActivityLogService` and refactor stock activity logging across stock opname, order, and purchase modules to utilize it. --- .../Studio/Manage/StockOpname/Index.php | 34 +++++++------- app/Services/StockActivityLogService.php | 40 ++++++++++++++++ app/Traits/Order/WithUpdateStock.php | 47 ++++++++++--------- app/Traits/Purchase/WithUpdateStock.php | 47 ++++++++++--------- 4 files changed, 108 insertions(+), 60 deletions(-) create mode 100644 app/Services/StockActivityLogService.php diff --git a/app/Livewire/Studio/Manage/StockOpname/Index.php b/app/Livewire/Studio/Manage/StockOpname/Index.php index 0d2d904..c4cdee3 100644 --- a/app/Livewire/Studio/Manage/StockOpname/Index.php +++ b/app/Livewire/Studio/Manage/StockOpname/Index.php @@ -4,6 +4,7 @@ use App\Enums\StockOpnameStatus; use App\Models\StockOpname; +use App\Services\StockActivityLogService; use App\Traits\Components\WithConfirmation; use App\Traits\Components\WithToast; use Illuminate\Contracts\View\View; @@ -90,7 +91,7 @@ public function approveApproval(StockOpname $stockOpname): void $relationName = $relationMap[$morphType]; $currentStock = $outlet->$relationName() - ->where($itemable->getTable().'.id', $itemable->id) + ->where($itemable->getTable() . '.id', $itemable->id) ->first()?->pivot?->stock ?? 0; $quantity = $item->qty_physical; @@ -99,26 +100,27 @@ public function approveApproval(StockOpname $stockOpname): void $itemable->id => ['stock' => $quantity], ]); - activity('Stock Opname') - ->performedOn($itemable) - ->causedBy(auth()->user()) - ->withProperties([ - 'itemable_id' => $item->itemable_id, - 'itemable_type' => $item->itemable_type, - 'outlet_id' => $outlet->id, - 'quantity_change' => $quantity, - 'previous_stock' => $currentStock, - 'new_stock' => $currentStock + $quantity, - 'itemable_id' => $item->id ?? null, - ]) - ->event('Mengubah') - ->log(sprintf( + StockActivityLogService::log( + logName: 'Stock Opname', + event: 'Mengubah', + description: sprintf( 'Stok %s di %s diperbarui dari %s menjadi %s', $itemable->name, $outlet->name, $currentStock, $quantity - )); + ), + performedOn: $itemable, + outlet: $outlet, + quantityChange: $quantity - $currentStock, + previousStock: $currentStock, + newStock: $quantity, + extraProperties: [ + // Preserving 'itemable_id' pointing to StockOpnameItem id as per original code overwriting + 'itemable_id' => $item->id ?? null, + 'itemable_type' => $item->itemable_type, + ] + ); } }); diff --git a/app/Services/StockActivityLogService.php b/app/Services/StockActivityLogService.php new file mode 100644 index 0000000..dc810ac --- /dev/null +++ b/app/Services/StockActivityLogService.php @@ -0,0 +1,40 @@ +user(); + + $properties = array_merge([ + 'outlet_id' => $outlet->getKey(), + 'quantity_change' => $quantityChange, + 'previous_stock' => $previousStock, + 'new_stock' => $newStock, + ], $extraProperties); + + activity($logName) + ->performedOn($performedOn) + ->causedBy($causedBy) + ->withProperties($properties) + ->event($event) + ->log($description); + } +} diff --git a/app/Traits/Order/WithUpdateStock.php b/app/Traits/Order/WithUpdateStock.php index cc94f47..8962982 100644 --- a/app/Traits/Order/WithUpdateStock.php +++ b/app/Traits/Order/WithUpdateStock.php @@ -5,6 +5,7 @@ use App\Models\Bottle; use App\Models\Perfume; use App\Models\Product; +use App\Services\StockActivityLogService; trait WithUpdateStock { @@ -39,20 +40,21 @@ public function increaseOutletStock($outlet, $item): void ]); } - activity('Order') - ->performedOn($item->orderable) - ->causedBy(auth()->user()) - ->withProperties([ + StockActivityLogService::log( + logName: 'Order', + event: 'Menambah', + description: 'Stok ' . $item->orderable->name . ' di ' . $outlet->name . ' bertambah ' . formatCurrencyNumber($quantity), + performedOn: $item->orderable, + outlet: $outlet, + quantityChange: $quantity, + previousStock: $currentStock, + newStock: $currentStock + $quantity, + extraProperties: [ 'orderable_id' => $item->orderable_id, 'orderable_type' => $item->orderable_type, - 'outlet_id' => $outlet->id, - 'quantity_change' => $quantity, - 'previous_stock' => $currentStock, - 'new_stock' => $currentStock + $quantity, 'purchase_id' => $item->purchase_id ?? null, - ]) - ->event('Menambah') - ->log('Stok '.$item->orderable->name.' di '.$outlet->name.' bertambah '.formatCurrencyNumber($quantity)); + ] + ); } public function decreaseOutletStock($outlet, $item) @@ -95,19 +97,20 @@ public function decreaseOutletStock($outlet, $item) 'stock' => $newStock, ]); - activity('Order') - ->performedOn($item->orderable) - ->causedBy(auth()->user()) - ->withProperties([ + StockActivityLogService::log( + logName: 'Order', + event: 'Mengurangi', + description: 'Stok ' . $item->orderable->name . ' di ' . $outlet->name . ' berkurang ' . formatCurrencyNumber($quantity), + performedOn: $item->orderable, + outlet: $outlet, + quantityChange: $quantity, + previousStock: $currentStock, + newStock: $currentStock - $quantity, + extraProperties: [ 'orderable_id' => $item->orderable_id, 'orderable_type' => $item->orderable_type, - 'outlet_id' => $outlet->id, - 'quantity_change' => $quantity, - 'previous_stock' => $currentStock, - 'new_stock' => $currentStock - $quantity, 'purchase_id' => $item->purchase_id ?? null, - ]) - ->event('Mengurangi') - ->log('Stok '.$item->orderable->name.' di '.$outlet->name.' berkurang '.formatCurrencyNumber($quantity)); + ] + ); } } diff --git a/app/Traits/Purchase/WithUpdateStock.php b/app/Traits/Purchase/WithUpdateStock.php index 569afa3..83d0a02 100644 --- a/app/Traits/Purchase/WithUpdateStock.php +++ b/app/Traits/Purchase/WithUpdateStock.php @@ -5,6 +5,7 @@ use App\Models\Bottle; use App\Models\Perfume; use App\Models\Product; +use App\Services\StockActivityLogService; trait WithUpdateStock { @@ -40,20 +41,21 @@ public function increaseOutletStock($outlet, $item): void ]); } - activity('Belanja') - ->performedOn($item->purchasable) - ->causedBy(auth()->user()) - ->withProperties([ + StockActivityLogService::log( + logName: 'Belanja', + event: 'Menambah', + description: 'Stok ' . $item->purchasable->name . ' di ' . $outlet->name . ' bertambah ' . formatCurrencyNumber($quantity), + performedOn: $item->purchasable, + outlet: $outlet, + quantityChange: $quantity, + previousStock: $previousStock, + newStock: $previousStock + $quantity, + extraProperties: [ 'purchasable_id' => $item->purchasable_id, 'purchasable_type' => $item->purchasable_type, - 'outlet_id' => $outlet->id, - 'quantity_change' => $quantity, - 'previous_stock' => $previousStock, - 'new_stock' => $previousStock + $quantity, 'purchase_id' => $item->purchase_id ?? null, - ]) - ->event('Menambah') - ->log('Stok '.$item->purchasable->name.' di '.$outlet->name.' bertambah '.formatCurrencyNumber($quantity)); + ] + ); } public function decreaseOutletStock($outlet, $item): void @@ -84,19 +86,20 @@ public function decreaseOutletStock($outlet, $item): void ]); } - activity('Belanja') - ->performedOn($item->purchasable) - ->causedBy(auth()->user()) - ->withProperties([ + StockActivityLogService::log( + logName: 'Belanja', + event: 'Mengurangi', + description: 'Stok ' . $item->purchasable->name . ' di ' . $outlet->name . ' berkurang ' . $quantity, + performedOn: $item->purchasable, + outlet: $outlet, + quantityChange: $quantity, + previousStock: $currentStock, + newStock: $newStock, + extraProperties: [ 'purchasable_id' => $item->purchasable_id, 'purchasable_type' => $item->purchasable_type, - 'outlet_id' => $outlet->id, - 'quantity_change' => $quantity, - 'previous_stock' => $currentStock, - 'new_stock' => $newStock, 'purchase_id' => $item->purchase_id, - ]) - ->event('Mengurangi') - ->log('Stok '.$item->purchasable->name.' di '.$outlet->name.' berkurang '.$quantity); + ] + ); } }