feat: add stock availability validation during order processing and display specific error messages in POS form

This commit is contained in:
Yoga Pangestu 2026-06-14 02:59:29 +07:00
parent 67439af903
commit 4f23af869f
2 changed files with 31 additions and 2 deletions

View File

@ -199,6 +199,12 @@ public function syncDraftItem(array $validated, User $user): array
} }
$quantity = (int) $validated['quantity']; $quantity = (int) $validated['quantity'];
if ($quantity > $variant->stock) {
throw ValidationException::withMessages([
'quantity' => "Stok tidak mencukupi. Stok saat ini: {$variant->stock} pcs.",
]);
}
$unitPrice = (int) $price->price; $unitPrice = (int) $price->price;
$subtotal = $unitPrice * $quantity; $subtotal = $unitPrice * $quantity;
@ -311,6 +317,17 @@ public function create(array $validated, User $user): Order
]); ]);
foreach ($draftItems as $item) { foreach ($draftItems as $item) {
$variant = ProductVariant::query()->with('product')->lockForUpdate()->find($item->product_variant_id);
if ($variant === null) {
throw ValidationException::withMessages([
'items' => 'Varian produk tidak ditemukan.',
]);
}
if ($variant->stock < $item->quantity) {
throw ValidationException::withMessages([
'items' => "Stok produk {$variant->product->name} ({$variant->name}) tidak mencukupi. Stok saat ini: {$variant->stock} pcs.",
]);
}
$item->order_id = $order->id; $item->order_id = $order->id;
$item->save(); $item->save();
$this->decrementStock($item); $this->decrementStock($item);
@ -371,6 +388,17 @@ public function update(Order $order, array $validated): void
$order->save(); $order->save();
foreach ($lineItems as $itemData) { foreach ($lineItems as $itemData) {
$variant = ProductVariant::query()->with('product')->lockForUpdate()->find($itemData['product_variant_id']);
if ($variant === null) {
throw ValidationException::withMessages([
'items' => 'Varian produk tidak ditemukan.',
]);
}
if ($variant->stock < $itemData['quantity']) {
throw ValidationException::withMessages([
'items' => "Stok produk {$variant->product->name} ({$variant->name}) tidak mencukupi. Stok saat ini: {$variant->stock} pcs.",
]);
}
$orderItem = $order->items()->create($itemData); $orderItem = $order->items()->create($itemData);
$this->decrementStock($orderItem); $this->decrementStock($orderItem);
} }

View File

@ -349,8 +349,9 @@ function submit() {
form.transform(() => payload).post(props.submitUrl, { form.transform(() => payload).post(props.submitUrl, {
forceFormData: true, forceFormData: true,
onError: () => { onError: (errors) => {
toast.error('Gagal menyimpan data. Periksa kembali formulir.'); const firstError = Object.values(errors)[0];
toast.error(firstError || 'Gagal menyimpan data. Periksa kembali formulir.');
}, },
}); });
} }