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

121 lines
3.8 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 VehicleObserver
{
/**
* Handle the Vehicle "creating" event.
*/
public function creating(Vehicle $vehicle): void
{
// Generate fleet number if not provided
if (empty($vehicle->fleet_number)) {
$prefix = 'FL-';
$latest = Vehicle::where('fleet_number', 'like', $prefix . '%')
->orderBy('fleet_number', 'desc')
->first();
$number = 1;
if ($latest) {
$parts = explode('-', $latest->fleet_number);
$number = intval(end($parts)) + 1;
}
$vehicle->fleet_number = $prefix . str_pad($number, 4, '0', STR_PAD_LEFT);
}
}
/**
* Handle the Vehicle "created" event.
*/
public function created(Vehicle $vehicle): void
{
// Create default maintenance schedules
$this->createDefaultMaintenanceSchedules($vehicle);
}
/**
* Handle the Vehicle "updated" event.
*/
public function updated(Vehicle $vehicle)
{
// If mileage updated, check maintenance schedules
if ($vehicle->isDirty('mileage')) {
$this->checkMaintenanceSchedules($vehicle);
}
}
/**
* Create default maintenance schedules for a new vehicle.
*/
protected function createDefaultMaintenanceSchedules(Vehicle $vehicle)
{
// Oil change schedule (every 5,000 miles or 6 months)
MaintenanceSchedule::create([
'vehicle_id' => $vehicle->id,
'name' => 'Oil Change',
'description' => 'Regular oil and filter change',
'mileage_interval' => 5000,
'day_interval' => 180,
'last_performed' => null,
'last_mileage' => $vehicle->mileage,
'next_due_mileage' => $vehicle->mileage + 5000,
'next_due_date' => Carbon::now()->addDays(180),
'is_active' => true,
]);
// Tire rotation (every 10,000 miles)
MaintenanceSchedule::create([
'vehicle_id' => $vehicle->id,
'name' => 'Tire Rotation',
'description' => 'Rotate tires to ensure even wear',
'mileage_interval' => 10000,
'day_interval' => null,
'last_performed' => null,
'last_mileage' => $vehicle->mileage,
'next_due_mileage' => $vehicle->mileage + 10000,
'next_due_date' => null,
'is_active' => true,
]);
// Full service (every 30,000 miles or yearly)
MaintenanceSchedule::create([
'vehicle_id' => $vehicle->id,
'name' => 'Full Service',
'description' => 'Complete vehicle inspection and service',
'mileage_interval' => 30000,
'day_interval' => 365,
'last_performed' => null,
'last_mileage' => $vehicle->mileage,
'next_due_mileage' => $vehicle->mileage + 30000,
'next_due_date' => Carbon::now()->addDays(365),
'is_active' => true,
]);
}
/**
* Check and update maintenance schedules.
*/
protected function checkMaintenanceSchedules(Vehicle $vehicle)
{
$schedules = MaintenanceSchedule::where('vehicle_id', $vehicle->id)
->where('is_active', true)
->get();
foreach ($schedules as $schedule) {
// If current mileage exceeds next due mileage, flag for maintenance
if ($schedule->next_due_mileage && $vehicle->mileage >= $schedule->next_due_mileage) {
// Could trigger notifications here
}
}
}
}