121 lines
3.8 KiB
PHP
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
|
|
}
|
|
}
|
|
}
|
|
}
|