Car-Repairs-Shop/app/Models/ServiceOrder.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

115 lines
3.1 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 ServiceOrder extends Model
{
/** @use HasFactory<\Database\Factories\ServiceOrderFactory> */
use HasFactory;
protected $fillable = [
'order_number',
'customer_id',
'vehicle_id',
'assigned_technician_id',
'customer_complaint',
'recommended_services',
'priority',
'status',
'labor_cost',
'parts_cost',
'tax_amount',
'discount_amount',
'total_amount',
'scheduled_date',
'started_at',
'completed_at',
'estimated_hours',
'actual_hours',
'internal_notes',
'customer_notes',
];
protected $casts = [
'scheduled_date' => 'datetime',
'started_at' => 'datetime',
'completed_at' => 'datetime',
'labor_cost' => 'decimal:2',
'parts_cost' => 'decimal:2',
'tax_amount' => 'decimal:2',
'discount_amount' => 'decimal:2',
'total_amount' => 'decimal:2',
];
protected static function boot()
{
parent::boot();
static::creating(function ($serviceOrder) {
if (empty($serviceOrder->order_number)) {
$serviceOrder->order_number = 'SO-' . str_pad(
static::count() + 1,
6,
'0',
STR_PAD_LEFT
);
}
});
}
public function customer(): BelongsTo
{
return $this->belongsTo(Customer::class);
}
public function vehicle(): BelongsTo
{
return $this->belongsTo(Vehicle::class);
}
public function assignedTechnician(): BelongsTo
{
return $this->belongsTo(Technician::class, 'assigned_technician_id');
}
public function serviceItems(): HasMany
{
return $this->hasMany(ServiceItem::class);
}
public function parts(): BelongsToMany
{
return $this->belongsToMany(Part::class, 'service_order_parts')
->withPivot(['quantity_used', 'unit_cost', 'unit_price', 'total_cost', 'total_price', 'status', 'notes'])
->withTimestamps();
}
public function inspections(): HasMany
{
return $this->hasMany(VehicleInspection::class);
}
public function appointments(): HasMany
{
return $this->hasMany(Appointment::class);
}
public function calculateTotals(): void
{
$this->labor_cost = $this->serviceItems->sum('labor_cost');
$this->parts_cost = $this->parts->sum('pivot.total_price');
$subtotal = $this->labor_cost + $this->parts_cost - $this->discount_amount;
$this->tax_amount = $subtotal * 0.08; // 8% tax rate - should be configurable
$this->total_amount = $subtotal + $this->tax_amount;
$this->save();
}
}