parfum/app/Traits/Purchase/WithAddItem.php

109 lines
3.2 KiB
PHP

<?php
namespace App\Traits\Purchase;
use App\Models\Bottle;
use App\Models\Perfume;
use App\Models\Product;
use App\Models\PurchaseItem;
use Illuminate\Support\Str;
trait WithAddItem
{
public function addItem(string $type): void
{
switch ($type) {
case 'parfum':
$model = Perfume::class;
$id = $this->form->perfume_id;
$quantity = parseRupiahToInt($this->form->quantity_perfume);
break;
case 'produk':
$model = Product::class;
$id = $this->form->product_id;
$quantity = parseRupiahToInt($this->form->quantity_product);
break;
case 'botol':
$model = Bottle::class;
$id = $this->form->bottle_id;
$quantity = parseRupiahToInt($this->form->quantity_bottle);
break;
default:
$this->toast('Tipe item tidak dikenal.', 'Gagal', 'danger');
return;
}
$itemModel = $model::find($id);
if (! $itemModel) {
$this->toast(Str::ucfirst($type).' tidak ditemukan, silakan periksa kembali.', 'Gagal', 'danger');
return;
}
$costPrice = (int) $itemModel->cost_price;
if ($quantity <= 0) {
$this->toast('Jumlah '.$type.' tidak valid, silakan periksa kembali.', 'Gagal', 'danger');
return;
}
if ($costPrice <= 0) {
$this->toast('Harga '.$type.' tidak valid, silakan periksa kembali.', 'Gagal', 'danger');
return;
}
$existingItem = $this->purchaseItems
->where('purchasable_type', $model)
->where('purchasable_id', $itemModel->id)
->first();
if ($existingItem) {
$existingItem->quantity += $quantity;
$existingItem->total_price = $existingItem->unit_price * $existingItem->quantity;
$existingItem->save();
$existingItem->refresh();
$this->purchaseItems = $this->purchaseItems->map(fn ($i) => $i->id === $existingItem->id ? $existingItem : $i);
$this->toast('Jumlah '.$type.' diperbarui di keranjang.', 'Berhasil');
} else {
$item = PurchaseItem::create([
'user_id' => auth()->id(),
'purchasable_id' => $itemModel->id,
'purchasable_type' => $model,
'quantity' => $quantity,
'unit_price' => $costPrice,
'total_price' => $costPrice * $quantity,
]);
$this->purchaseItems->push($item);
$this->toast(Str::ucfirst($type).' ditambahkan ke keranjang.', 'Berhasil');
}
$this->form->total = formatCurrencyNumber($this->getTotal());
switch ($type) {
case 'parfum':
$this->reset(['form.perfume_id', 'form.quantity_perfume']);
break;
case 'produk':
$this->reset(['form.product_id', 'form.quantity_product']);
break;
case 'botol':
$this->reset(['form.bottle_id', 'form.quantity_bottle']);
break;
}
}
}