workshop_lara_nova/app/Observers/RepairOrderObserver.php
2025-03-22 10:19:15 +00:00

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