'De făcut', 'in_progress' => 'În lucru', 'done' => 'Finalizat', ]; protected $fillable = [ 'company_id', 'work_order_id', 'labor_id', 'master_id', 'name', 'hours', 'price_per_hour', 'total', 'status', 'notes', 'requires_approval', 'approved_at', 'approval_token', 'declined_at', ]; protected $casts = [ 'hours' => 'decimal:2', 'price_per_hour' => 'decimal:2', 'total' => 'decimal:2', 'requires_approval' => 'boolean', 'approved_at' => 'datetime', 'declined_at' => 'datetime', ]; public function isPendingApproval(): bool { return $this->requires_approval && $this->approved_at === null && $this->declined_at === null; } public function workOrder(): BelongsTo { return $this->belongsTo(WorkOrder::class); } public function labor(): BelongsTo { return $this->belongsTo(Labor::class); } public function master(): BelongsTo { return $this->belongsTo(User::class, 'master_id'); } protected static function booted(): void { static::saving(function (self $row) { $row->total = round((float) $row->hours * (float) $row->price_per_hour, 2); if ($row->requires_approval && empty($row->approval_token)) { $row->approval_token = \Illuminate\Support\Str::random(24); } }); static::saved(fn (self $row) => $row->workOrder?->recalcTotal()); static::deleted(fn (self $row) => $row->workOrder?->recalcTotal()); } }