diff --git a/app/Livewire/Forms/Studio/Manage/PurchaseForm.php b/app/Livewire/Forms/Studio/Manage/PurchaseForm.php index 3a46ebb..8b0f1b0 100644 --- a/app/Livewire/Forms/Studio/Manage/PurchaseForm.php +++ b/app/Livewire/Forms/Studio/Manage/PurchaseForm.php @@ -4,6 +4,7 @@ use App\Models\Purchase; use App\Rules\UnsignedInteger; +use App\Traits\Purchase\WithPurchaseItems; use App\Traits\Purchase\WithUpdateStock; use App\Traits\WithMediaHandler; use Illuminate\Support\Facades\DB; @@ -12,7 +13,7 @@ class PurchaseForm extends Form { - use WithMediaHandler, WithUpdateStock; + use WithMediaHandler, WithPurchaseItems, WithUpdateStock; public ?Purchase $purchase = null; @@ -44,14 +45,12 @@ class PurchaseForm extends Form public string $quantity_edit = ''; - public $cartItems; - public function rules(): array { return [ 'invoice_number' => ['nullable', 'string', 'max:50'], 'note' => ['nullable', 'string', 'max:100'], - 'purchase_date' => ['required', 'date'], + 'purchase_date' => ['required', 'date', 'before_or_equal:today'], 'outlet_id' => ['required', Rule::exists('outlets', 'id')], 'total' => ['required', new UnsignedInteger], 'image' => ['nullable', 'array', 'max:1'], @@ -86,14 +85,16 @@ public function store() { $this->validate(); - DB::transaction(function () { + $purchaseItems = $this->loadPurchaseItems(); + + DB::transaction(function () use ($purchaseItems) { $purchase = Purchase::create($this->prepareSavedData()); $purchase->load('outlet'); $this->uploadMedia($this->image, $purchase, 'image'); - foreach ($this->cartItems as $item) { + foreach ($purchaseItems as $item) { $item->update(['purchase_id' => $purchase->id]); $this->increaseOutletStock($purchase->outlet, $item); diff --git a/app/Livewire/Studio/Manage/Purchase/Create.php b/app/Livewire/Studio/Manage/Purchase/Create.php index 578da7a..8ab5d39 100644 --- a/app/Livewire/Studio/Manage/Purchase/Create.php +++ b/app/Livewire/Studio/Manage/Purchase/Create.php @@ -7,9 +7,10 @@ use App\Models\Outlet; use App\Models\Perfume; use App\Models\Product; -use App\Models\PurchaseItem; use App\Traits\Purchase\WithAddItem; +use App\Traits\Purchase\WithCalculateTotal; use App\Traits\Purchase\WithDeleteItem; +use App\Traits\Purchase\WithPurchaseItems; use App\Traits\Purchase\WithUpdateItem; use App\Traits\WithAuthorization; use App\Traits\WithConfirmation; @@ -21,7 +22,7 @@ #[Title('Tambah Belanja')] class Create extends Component { - use WithAddItem, WithAuthorization, WithConfirmation, WithDeleteItem, WithToast, WithUpdatedData, WithUpdateItem; + use WithAddItem, WithAuthorization, WithCalculateTotal, WithConfirmation, WithDeleteItem, WithPurchaseItems, WithToast, WithUpdatedData, WithUpdateItem; public PurchaseForm $form; @@ -33,6 +34,8 @@ class Create extends Component public array $bottles = []; + public $purchaseItems; + public function mount() { $this->outlets = Outlet::pluck('name', 'id')->toArray(); @@ -43,14 +46,14 @@ public function mount() $this->bottles = Bottle::pluck('name', 'id')->toArray(); - $this->form->cartItems = PurchaseItem::whereNull('purchase_id')->get(); + $this->purchaseItems = $this->loadPurchaseItems(); - $this->form->total = currency($this->form->cartItems->sum('total_price'), ''); + $this->form->total = $this->getTotal(); } public function save() { - if ($this->form->cartItems->isEmpty()) { + if ($this->purchaseItems->isEmpty()) { $this->toast('Keranjang tidak boleh kosong.', 'Gagal', 'danger'); return; diff --git a/app/Traits/Purchase/WithAddItem.php b/app/Traits/Purchase/WithAddItem.php index 5664b73..6128d41 100644 --- a/app/Traits/Purchase/WithAddItem.php +++ b/app/Traits/Purchase/WithAddItem.php @@ -59,7 +59,7 @@ public function addItem(string $type) return; } - $existingItem = $this->form->cartItems + $existingItem = $this->purchaseItems ->where('purchasable_type', $model) ->where('purchasable_id', $itemModel->id) ->first(); @@ -71,11 +71,12 @@ public function addItem(string $type) $existingItem->refresh(); - $this->form->cartItems = $this->form->cartItems->map(fn ($i) => $i->id === $existingItem->id ? $existingItem : $i); + $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, @@ -83,18 +84,25 @@ public function addItem(string $type) 'total_price' => $costPrice * $quantity, ]); - $this->form->cartItems->push($item); + $this->purchaseItems->push($item); $this->toast(Str::ucfirst($type).' ditambahkan ke keranjang.', 'Berhasil'); } - $this->form->total = currency($this->form->cartItems->sum('total_price'), ''); + $this->form->total = currency($this->getTotal()); - $this->reset('form.perfume_id'); - $this->reset('form.product_id'); - $this->reset('form.bottle_id'); - $this->reset('form.quantity_perfume'); - $this->reset('form.quantity_product'); - $this->reset('form.quantity_bottle'); + 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; + } } } diff --git a/app/Traits/Purchase/WithCalculateTotal.php b/app/Traits/Purchase/WithCalculateTotal.php new file mode 100644 index 0000000..264015f --- /dev/null +++ b/app/Traits/Purchase/WithCalculateTotal.php @@ -0,0 +1,11 @@ +purchaseItems->sum(fn ($item) => $item->unit_price * $item->quantity); + } +} diff --git a/app/Traits/Purchase/WithDeleteItem.php b/app/Traits/Purchase/WithDeleteItem.php index 93d8214..976f1fc 100644 --- a/app/Traits/Purchase/WithDeleteItem.php +++ b/app/Traits/Purchase/WithDeleteItem.php @@ -8,11 +8,11 @@ trait WithDeleteItem { public function deleteItem(PurchaseItem $item) { - $this->form->cartItems = $this->form->cartItems->reject(fn ($i) => $i->id === $item->id); + $this->purchaseItems = $this->purchaseItems->reject(fn ($i) => $i->id === $item->id); $item->delete(); - $this->form->total = currency($this->form->cartItems->sum('total_price'), ''); + $this->form->total = currency($this->purchaseItems->sum('total_price'), ''); $this->toast('Item berhasil dihapus.'); } diff --git a/app/Traits/Purchase/WithPurchaseItems.php b/app/Traits/Purchase/WithPurchaseItems.php new file mode 100644 index 0000000..3ff6a71 --- /dev/null +++ b/app/Traits/Purchase/WithPurchaseItems.php @@ -0,0 +1,18 @@ +purchaseItems = PurchaseItem::query() + ->currentUser() + ->where('user_id', auth()->id()) + ->whereNull('purchase_id') + ->latest() + ->get(); + } +} diff --git a/app/Traits/Purchase/WithUpdateItem.php b/app/Traits/Purchase/WithUpdateItem.php index 60e32f1..4e32f1d 100644 --- a/app/Traits/Purchase/WithUpdateItem.php +++ b/app/Traits/Purchase/WithUpdateItem.php @@ -17,7 +17,7 @@ public function openModal(PurchaseItem $item) $this->form->item_id = $item->id; - $this->form->quantity_edit = currency($item->quantity, ''); + $this->form->quantity_edit = currency($item->quantity); } public function closeModal() @@ -36,9 +36,9 @@ public function updateItem() $item->refresh(); - $this->form->cartItems = $this->form->cartItems->map(fn ($i) => $i->id === $item->id ? $item : $i); + $this->purchaseItems = $this->purchaseItems->map(fn ($i) => $i->id === $item->id ? $item : $i); - $this->form->total = currency($this->form->cartItems->sum('total_price'), ''); + $this->form->total = currency($this->purchaseItems->sum('total_price')); $this->toast('Item berhasil diperbarui.'); diff --git a/resources/views/livewire/studio/manage/purchase/form.blade.php b/resources/views/livewire/studio/manage/purchase/form.blade.php index 58f1c5f..e1e433f 100644 --- a/resources/views/livewire/studio/manage/purchase/form.blade.php +++ b/resources/views/livewire/studio/manage/purchase/form.blade.php @@ -15,7 +15,7 @@
- {{ $bottle }} @endforeach - +
@@ -136,7 +135,7 @@ - @forelse($form->cartItems as $item) + @forelse($purchaseItems as $item)