input('status')); if ($status === null) { return false; } return $this->user()?->can($status->transitionPermission()->value) ?? false; } /** * @return array */ public function rules(): array { return [ 'status' => ['required', Rule::enum(CuttingStatus::class)], 'reason' => ['nullable', 'string', 'max:500'], 'verification_note' => ['nullable', 'string', 'max:500'], 'results' => ['nullable', 'array'], 'results.*.product_variant_id' => ['required_with:results', 'integer', 'exists:product_variants,id'], 'results.*.warehouse_stock' => ['required_with:results', 'integer', 'min:0'], 'results.*.cutting_reject' => ['required_with:results', 'integer', 'min:0'], ]; } /** * @return array */ public function attributes(): array { return [ 'status' => 'status', 'reason' => 'alasan penolakan', 'verification_note' => 'catatan verifikasi', ]; } public function withValidator(Validator $validator): void { $validator->after(function (Validator $validator): void { /** @var Cutting $cutting */ $cutting = $this->route('cutting'); $status = CuttingStatus::tryFrom((string) $this->input('status')); if ($status === null) { return; } if (! $cutting->status->canTransitionTo($status)) { $validator->errors()->add('status', 'Status cutting tidak dapat diubah.'); } if ($status === CuttingStatus::REJECTED && trim((string) $this->input('reason')) === '') { $validator->errors()->add('reason', 'Alasan penolakan wajib diisi.'); } if ($status === CuttingStatus::VERIFIED && $this->has('results')) { $cuttingResults = $cutting->results->keyBy('product_variant_id'); foreach ($this->input('results', []) as $index => $item) { $variantId = $item['product_variant_id'] ?? 0; $warehouseStock = (int) ($item['warehouse_stock'] ?? 0); $cuttingReject = (int) ($item['cutting_reject'] ?? 0); $originalResult = $cuttingResults->get($variantId); if ($originalResult === null) { $validator->errors()->add("results.{$index}.product_variant_id", 'Varian produk tidak ditemukan pada cutting ini.'); continue; } if (($warehouseStock + $cuttingReject) !== (int) $originalResult->cutting_result) { $validator->errors()->add("results.{$index}.warehouse_stock", "Total jumlah (diterima + reject) harus sama dengan hasil cutting asli ({$originalResult->cutting_result} pcs)."); } } } }); } }