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(); } } }