parfum/app/Traits/Restock/WithRestockAddItem.php
2026-01-02 13:13:23 +07:00

113 lines
3.6 KiB
PHP

<?php
namespace App\Traits\Restock;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
use App\Models\RestockItem;
use App\Models\Warehouse;
trait WithRestockAddItem
{
public function addItem(string $type): void
{
$this->canOrAbort('create restock');
if (! $this->form->warehouse_id) {
$this->toast('Silakan pilih gudang terlebih dahulu.', 'Gagal', 'warning');
return;
}
$warehouse = Warehouse::find($this->form->warehouse_id);
if (! $warehouse) {
$this->toast('Gudang tidak ditemukan.', 'Gagal', 'danger');
return;
}
$data = match ($type) {
'parfum' => [
'restockable_type' => Perfume::class,
'restockable_id' => $this->form->perfume_id,
'quantity' => parseRupiahToInt($this->form->quantity_perfume),
],
'produk' => [
'restockable_type' => Product::class,
'restockable_id' => $this->form->product_id,
'quantity' => parseRupiahToInt($this->form->quantity_product),
],
'botol' => [
'restockable_type' => Bottle::class,
'restockable_id' => $this->form->bottle_id,
'quantity' => parseRupiahToInt($this->form->quantity_bottle),
],
default => null,
};
if (! $data || ! $data['restockable_id'] || $data['quantity'] <= 0) {
$this->toast('Data item tidak valid.', 'Gagal', 'danger');
return;
}
// Validate stock availability
$relationName = match ($type) {
'parfum' => 'perfumes',
'produk' => 'products',
'botol' => 'bottles',
default => null,
};
if ($relationName) {
$warehouseStock = $warehouse->{$relationName}()
->where($data['restockable_type']::make()->getTable().'.id', $data['restockable_id'])
->first()
?->pivot
?->stock ?? 0;
// Is item already in cart?
$existing = RestockItem::where([
'user_id' => auth()->id(),
'restockable_id' => $data['restockable_id'],
'restockable_type' => $data['restockable_type'],
])->whereNull('restock_id')->first();
$currentCartQty = $existing ? $existing->quantity : 0;
$requestedQty = $data['quantity'];
if (($currentCartQty + $requestedQty) > $warehouseStock) {
$this->toast("Stok tidak mencukupi. Stok di gudang: {$warehouseStock}. Sudah di keranjang: {$currentCartQty}.", 'Gagal', 'danger');
return;
}
if ($existing) {
$existing->increment('quantity', $requestedQty);
} else {
RestockItem::create(array_merge($data, ['user_id' => auth()->id()]));
}
}
$this->resetFormItem($type);
$this->restockItems = $this->loadRestockItems();
$this->toast('Item berhasil ditambahkan ke keranjang.');
}
private function resetFormItem(string $type): void
{
if ($type === 'parfum') {
$this->form->perfume_id = '';
$this->form->quantity_perfume = '';
} elseif ($type === 'produk') {
$this->form->product_id = '';
$this->form->quantity_product = '';
} elseif ($type === 'botol') {
$this->form->bottle_id = '';
$this->form->quantity_bottle = '';
}
}
}