80 lines
2.4 KiB
PHP
80 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Observers;
|
|
|
|
use App\Models\RepairOrder;
|
|
use App\Models\Vehicle;
|
|
use App\Models\Part;
|
|
use App\Models\MaintenanceSchedule;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Str;
|
|
|
|
class RepairOrderObserver
|
|
{
|
|
/**
|
|
* Handle the RepairOrder "creating" event.
|
|
*/
|
|
public function creating(RepairOrder $repairOrder): void
|
|
{
|
|
// Generate unique order number if not provided
|
|
if (empty($repairOrder->order_number)) {
|
|
$prefix = 'RO-' . date('Ymd');
|
|
$latest = RepairOrder::where('order_number', 'like', $prefix . '%')
|
|
->orderBy('order_number', 'desc')
|
|
->first();
|
|
|
|
$number = 1;
|
|
if ($latest) {
|
|
$parts = explode('-', $latest->order_number);
|
|
$number = intval(end($parts)) + 1;
|
|
}
|
|
|
|
$repairOrder->order_number = $prefix . '-' . str_pad($number, 4, '0', STR_PAD_LEFT);
|
|
}
|
|
|
|
// Set reported date if not provided
|
|
if (empty($repairOrder->reported_at)) {
|
|
$repairOrder->reported_at = Carbon::now();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle the RepairOrder "created" event.
|
|
*/
|
|
public function created(RepairOrder $repairOrder)
|
|
{
|
|
// Update vehicle status when a repair is created
|
|
$vehicle = Vehicle::find($repairOrder->vehicle_id);
|
|
if ($vehicle) {
|
|
$vehicle->status = 'in_repair';
|
|
$vehicle->save();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle the RepairOrder "updated" event.
|
|
*/
|
|
public function updated(RepairOrder $repairOrder)
|
|
{
|
|
// If status changed to completed, update the vehicle
|
|
if ($repairOrder->status === 'completed' && $repairOrder->getOriginal('status') !== 'completed') {
|
|
$vehicle = Vehicle::find($repairOrder->vehicle_id);
|
|
if ($vehicle) {
|
|
$vehicle->status = 'active';
|
|
$vehicle->save();
|
|
}
|
|
}
|
|
|
|
// If status changed to in_progress, set started_at
|
|
if ($repairOrder->status === 'in_progress' && $repairOrder->getOriginal('status') !== 'in_progress' && !$repairOrder->started_at) {
|
|
$repairOrder->started_at = Carbon::now();
|
|
$repairOrder->saveQuietly(); // Prevent recursion
|
|
}
|
|
|
|
// Recalculate costs when parts or labor changes
|
|
if ($repairOrder->isDirty(['labor_hours', 'parts_cost'])) {
|
|
$repairOrder->calculateCosts();
|
|
}
|
|
}
|
|
}
|