['nullable', 'string', 'max:100'], 'transfer_date' => ['required', 'date', 'before_or_equal:today'], 'source_outlet_id' => ['required', Rule::exists('outlets', 'id')], 'destination_outlet_id' => ['required', Rule::exists('outlets', 'id'), 'different:source_outlet_id'], 'image' => ['nullable', 'array', 'max:1'], ]; } public function validationAttributes(): array { return [ 'note' => 'catatan', 'transfer_date' => 'tanggal transfer', 'source_outlet_id' => 'outlet asal', 'destination_outlet_id' => 'outlet tujuan', 'image' => 'gambar', ]; } public function setStockTransfer(StockTransfer $stockTransfer): void { $this->stockTransfer = $stockTransfer; $this->note = $stockTransfer->note; $this->transfer_date = $stockTransfer->transfer_date; $this->source_outlet_id = $stockTransfer->source_outlet_id; $this->destination_outlet_id = $stockTransfer->destination_outlet_id; $this->image = $this->mapMediaCollection($stockTransfer->getMedia('image')); } public function store(): void { $this->validate(); $stockTransferItems = $this->loadStockTransferItems(); DB::transaction(function () use ($stockTransferItems) { $data = $this->prepareSavedData(); $stockTransfer = StockTransfer::create($data); $stockTransfer->load(['sourceOutlet', 'destinationOutlet']); $this->uploadMedia($this->image, $stockTransfer, 'image'); foreach ($stockTransferItems as $item) { if ($item->quantity <= 0) { continue; } $item->update(['stock_transfer_id' => $stockTransfer->id]); $this->transferStockBetweenOutlets($stockTransfer->sourceOutlet, $stockTransfer->destinationOutlet, $item); } }); } public function update(): void { $this->validate(); DB::transaction(function () { $data = $this->prepareSavedData(); $this->stockTransfer->update($data); $this->syncMedia($this->image, $this->stockTransfer, 'image'); $this->uploadMedia($this->image, $this->stockTransfer, 'image'); }); } private function prepareSavedData(): array { return [ 'note' => $this->note, 'source_outlet_id' => $this->source_outlet_id, 'destination_outlet_id' => $this->destination_outlet_id, 'transfer_date' => $this->transfer_date, ]; } }