'datetime', 'estimated_completion_time' => 'datetime', 'actual_start_time' => 'datetime', 'actual_completion_time' => 'datetime', 'quality_check_date' => 'datetime', 'quality_check_required' => 'boolean', 'customer_notification_required' => 'boolean', 'completion_percentage' => 'decimal:2', ]; protected static function boot() { parent::boot(); static::creating(function ($workOrder) { if (empty($workOrder->work_order_number)) { $workOrder->work_order_number = 'WO-' . date('Y') . '-' . str_pad( static::whereYear('created_at', now()->year)->count() + 1, 6, '0', STR_PAD_LEFT ); } }); } public function jobCard(): BelongsTo { return $this->belongsTo(JobCard::class); } public function estimate(): BelongsTo { return $this->belongsTo(Estimate::class); } public function serviceCoordinator(): BelongsTo { return $this->belongsTo(User::class, 'service_coordinator_id'); } public function assignedTechnician(): BelongsTo { return $this->belongsTo(Technician::class, 'assigned_technician_id'); } public function qualityCheckedBy(): BelongsTo { return $this->belongsTo(User::class, 'quality_checked_by_id'); } public function timesheets(): HasMany { return $this->hasMany(Timesheet::class); } public function tasks(): HasMany { return $this->hasMany(WorkOrderTask::class); } public function parts(): BelongsToMany { return $this->belongsToMany(Part::class, 'work_order_parts') ->withPivot(['quantity_used', 'unit_cost', 'status', 'allocated_at', 'used_at']) ->withTimestamps(); } }