quantity; switch ($item->orderable_type) { case Perfume::class: $relation = 'perfumes'; break; case Product::class: $relation = 'products'; break; case Bottle::class: $relation = 'bottles'; break; default: return; } $existing = $outlet->{$relation}() ->withPivot('stock') ->where("{$relation}.id", $item->orderable_id) ->lockForUpdate() ->first(); if ($existing) { $currentStock = $existing->pivot->stock ?? 0; $outlet->{$relation}()->updateExistingPivot($item->orderable_id, [ 'stock' => $currentStock + $quantity, ]); } else { $outlet->{$relation}()->attach($item->orderable_id, [ 'stock' => $quantity, ]); } 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, 'purchase_id' => $item->purchase_id ?? null, ] ); } public function decreaseOutletStock($outlet, $item) { $quantity = $item->quantity; switch ($item->orderable_type) { case Perfume::class: $relation = 'perfumes'; break; case Product::class: $relation = 'products'; break; case Bottle::class: $relation = 'bottles'; break; default: return; } $existing = $outlet->{$relation}() ->withPivot('stock') ->where("{$relation}.id", $item->orderable_id) ->lockForUpdate() ->first(); if (! $existing) { return ['status' => false, 'message' => "Produk {$item->orderable->name} tidak ditemukan di {$outlet->name}."]; } $currentStock = $existing->pivot->stock ?? 0; if ($currentStock < $quantity) { return ['status' => false, 'message' => "Stok produk {$item->orderable->name} tidak mencukupi. Tersisa {$currentStock}, diminta {$quantity}. Silakan hubungi Administrator."]; } $newStock = $currentStock - $quantity; $outlet->{$relation}()->updateExistingPivot($item->orderable_id, [ 'stock' => $newStock, ]); 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, 'purchase_id' => $item->purchase_id ?? null, ] ); return ['status' => true]; } }