parfum/app/Traits/Forms/WithFormStockAdjustment.php

76 lines
2.6 KiB
PHP

<?php
namespace App\Traits\Forms;
use App\Models\Outlet;
use App\Services\StockActivityLogService;
use Illuminate\Database\Eloquent\Model;
trait WithFormStockAdjustment
{
public array $stock_adjustments = [];
protected function loadStockAdjustments(Model $item): void
{
$this->stock_adjustments = [
'outlet' => [],
];
$user = auth()->user();
$userOutletIds = $user->outlets->pluck('id')->toArray();
$itemOutlets = $item->outlets()
->whereIn('outlets.id', $userOutletIds)
->withPivot('stock')
->get();
foreach ($itemOutlets as $outlet) {
$stock = $outlet->pivot->stock ?? 0;
$this->stock_adjustments['outlet'][$outlet->id] = [
'name' => $outlet->name,
'stock' => $stock,
'new_stock' => (string) $stock,
'note' => '',
];
}
}
protected function saveStockAdjustments(Model $item, string $itemType): void
{
$itemName = $item->name.($itemType === 'bottle' ? " ({$item->size}ml)" : '');
if (isset($this->stock_adjustments['outlet'])) {
foreach ($this->stock_adjustments['outlet'] as $id => $adj) {
$newStock = (int) str_replace(['.', ','], '', (string) ($adj['new_stock'] ?: '0'));
$oldStock = (int) $adj['stock'];
if ($newStock === $oldStock) {
continue;
}
$outlet = Outlet::find($id);
if ($outlet) {
$item->outlets()->syncWithoutDetaching([$id => ['stock' => $newStock]]);
StockActivityLogService::logOutlet(
logName: 'adjustment',
event: 'update',
description: "Penyesuaian manual untuk {$itemName}: berubah dari ".formatCurrencyNumber($oldStock).' menjadi '.formatCurrencyNumber($newStock).'. Catatan: '.($adj['note'] ?: '-'),
performedOn: $item,
outlet: $outlet,
quantityChange: $newStock - $oldStock,
previousStock: $oldStock,
newStock: $newStock,
extraProperties: [
'note' => $adj['note'],
'adjustment_type' => 'manual',
'item_type' => $itemType,
'item_id' => $item->id,
]
);
}
}
}
}
}