['nullable', 'string', 'max:50'], 'note' => ['nullable', 'string', 'max:100'], 'purchase_date' => ['required', 'date', 'before_or_equal:today'], 'outlet_id' => ['required', Rule::exists('outlets', 'id')], 'total' => ['required', new UnsignedInteger], 'image' => ['nullable', 'array', 'max:1'], ]; } public function validationAttributes(): array { return [ 'invoice_number' => 'nomor invoice', 'note' => 'catatan', 'purchase_date' => 'tanggal belanja', 'outlet_id' => 'outlet', 'image' => 'gambar', ]; } public function setPurchase(Purchase $purchase): void { $this->purchase = $purchase; $this->invoice_number = $purchase->invoice_number; $this->note = $purchase->note; $this->purchase_date = $purchase->purchase_date; $this->outlet_id = $purchase->outlet_id; $this->total = $purchase->total; $this->image = $this->mapMediaCollection($purchase->getMedia('image')); } public function store(): void { $this->validate(); $purchaseItems = $this->loadPurchaseItems(); DB::transaction(function () use ($purchaseItems) { $purchase = Purchase::create($this->prepareSavedData()); $purchase->load('outlet'); $this->uploadMedia($this->image, $purchase, 'image'); foreach ($purchaseItems as $item) { $item->update(['purchase_id' => $purchase->id]); $this->increaseOutletStock($purchase->outlet, $item); } }); } public function update(): void { $this->validate(); DB::transaction(function () { $this->purchase->update($this->prepareSavedData()); $this->syncMedia($this->image, $this->purchase, 'image'); $this->uploadMedia($this->image, $this->purchase, 'image'); }); } private function prepareSavedData(): array { return [ 'invoice_number' => $this->invoice_number, 'note' => $this->note, 'outlet_id' => $this->outlet_id, 'purchase_date' => $this->purchase_date, 'total' => replaceCurrency($this->total), ]; } }