'date', 'approved_at' => 'datetime', ]; } public function project(): BelongsTo { return $this->belongsTo(Project::class); } public function requester(): BelongsTo { return $this->belongsTo(User::class, 'requested_by'); } public function approver(): BelongsTo { return $this->belongsTo(User::class, 'approved_by'); } public function items(): HasMany { return $this->hasMany(MaterialRequisitionItem::class); } public function purchaseOrders(): BelongsToMany { return $this->belongsToMany(PurchaseOrder::class, 'purchase_order_requisitions') ->withTimestamps(); } public function getTotalCostAttribute(): float { return $this->items->sum(fn (MaterialRequisitionItem $item) => $item->line_total); } public function scopeDraft($query) { return $query->where('status', 'draft'); } public function scopeApproved($query) { return $query->where('status', 'approved'); } public function onApprovalCompleted($chain): void { $statusValue = is_string($chain->status) ? $chain->status : ($chain->status->value ?? 'approved'); $this->update(['status' => $statusValue]); if ($statusValue === 'approved') { $lastStep = $chain->steps()->where('status', 'approved')->orderByDesc('acted_at')->first(); $this->update([ 'approved_by' => $lastStep ? $lastStep->approver_id : null, 'approved_at' => $lastStep ? $lastStep->acted_at : now(), ]); } } }