Car-Repairs-Shop/app/Models/WorkOrder.php
sackey e839d40a99
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
Initial commit
2025-07-30 17:15:50 +00:00

108 lines
2.9 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class WorkOrder extends Model
{
use HasFactory;
protected $fillable = [
'work_order_number',
'job_card_id',
'estimate_id',
'service_coordinator_id',
'assigned_technician_id',
'priority',
'status',
'work_description',
'special_instructions',
'safety_requirements',
'estimated_start_time',
'estimated_completion_time',
'actual_start_time',
'actual_completion_time',
'quality_check_required',
'quality_checked_by_id',
'quality_check_date',
'quality_check_notes',
'customer_notification_required',
'notes',
'completion_percentage',
];
protected $casts = [
'estimated_start_time' => '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();
}
}