sackey e839d40a99
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (push) Waiting to run
Initial commit
2025-07-30 17:15:50 +00:00

212 lines
7.0 KiB
PHP

<?php
namespace App\Livewire\Vehicles;
use Livewire\Component;
use App\Models\Vehicle;
use App\Models\Customer;
use App\Services\VinDecoderService;
use Livewire\Attributes\Validate;
use Livewire\WithFileUploads;
class Edit extends Component
{
use WithFileUploads;
public Vehicle $vehicle;
#[Validate('required|exists:customers,id')]
public $customer_id = '';
#[Validate('required|string|size:17')]
public $vin = '';
#[Validate('required|string|max:255')]
public $make = '';
#[Validate('required|string|max:255')]
public $model = '';
#[Validate('required|integer|min:1900|max:2030')]
public $year = '';
#[Validate('required|string|max:255')]
public $color = '';
#[Validate('required|string|max:20')]
public $license_plate = '';
#[Validate('nullable|string|max:255')]
public $engine_type = '';
#[Validate('nullable|string|max:255')]
public $transmission = '';
#[Validate('required|integer|min:0|max:999999')]
public $mileage = 0;
#[Validate('nullable|string|max:1000')]
public $notes = '';
#[Validate('nullable|image|max:2048')]
public $vehicle_image;
#[Validate('required|in:active,inactive,sold')]
public $status = 'active';
// VIN decoding properties
public $isDecodingVin = false;
public $vinDecodeError = '';
public $vinDecodeSuccess = '';
protected VinDecoderService $vinDecoderService;
public function boot(VinDecoderService $vinDecoderService)
{
$this->vinDecoderService = $vinDecoderService;
}
public function mount(Vehicle $vehicle)
{
$this->vehicle = $vehicle;
$this->customer_id = $vehicle->customer_id;
$this->vin = $vehicle->vin;
$this->make = $vehicle->make;
$this->model = $vehicle->model;
$this->year = $vehicle->year;
$this->color = $vehicle->color;
$this->license_plate = $vehicle->license_plate;
$this->engine_type = $vehicle->engine_type;
$this->transmission = $vehicle->transmission;
$this->mileage = $vehicle->mileage;
$this->notes = $vehicle->notes;
$this->status = $vehicle->status;
}
public function decodeVin()
{
// Clear previous messages
$this->vinDecodeError = '';
$this->vinDecodeSuccess = '';
// Validate VIN format first
if (strlen(trim($this->vin)) !== 17) {
$this->vinDecodeError = 'VIN must be exactly 17 characters long.';
return;
}
$this->isDecodingVin = true;
try {
$result = $this->vinDecoderService->decodeVin($this->vin);
if ($result['success']) {
$data = $result['data'];
// Ask user before overwriting existing data
$updatedFields = [];
if (!empty($data['make']) && $data['make'] !== $this->make) {
$this->make = $data['make'];
$updatedFields[] = 'Make';
}
if (!empty($data['model']) && $data['model'] !== $this->model) {
$this->model = $data['model'];
$updatedFields[] = 'Model';
}
if (!empty($data['year']) && $data['year'] != $this->year) {
$this->year = $data['year'];
$updatedFields[] = 'Year';
}
if (!empty($data['engine_type']) && $data['engine_type'] !== $this->engine_type) {
$this->engine_type = $data['engine_type'];
$updatedFields[] = 'Engine';
}
if (!empty($data['transmission']) && $data['transmission'] !== $this->transmission) {
$this->transmission = $data['transmission'];
$updatedFields[] = 'Transmission';
}
// Show success message
if (!empty($updatedFields)) {
$this->vinDecodeSuccess = 'VIN decoded successfully! Updated: ' . implode(', ', $updatedFields);
} else {
$this->vinDecodeSuccess = 'VIN decoded successfully! No changes needed - current data matches VIN.';
}
// Show error codes if any
if (!empty($data['error_codes'])) {
$this->vinDecodeError = 'VIN decoded with warnings: ' . implode(', ', array_slice($data['error_codes'], 0, 2));
}
} else {
$this->vinDecodeError = $result['error'];
}
} catch (\Exception $e) {
$this->vinDecodeError = 'An unexpected error occurred while decoding the VIN.';
} finally {
$this->isDecodingVin = false;
}
}
public function updateVehicle()
{
// Update validation rules to exclude current vehicle's unique fields
$this->validate([
'customer_id' => 'required|exists:customers,id',
'vin' => 'required|string|size:17|unique:vehicles,vin,' . $this->vehicle->id,
'make' => 'required|string|max:255',
'model' => 'required|string|max:255',
'year' => 'required|integer|min:1900|max:2030',
'color' => 'required|string|max:255',
'license_plate' => 'required|string|max:20|unique:vehicles,license_plate,' . $this->vehicle->id,
'engine_type' => 'nullable|string|max:255',
'transmission' => 'nullable|string|max:255',
'mileage' => 'required|integer|min:0|max:999999',
'notes' => 'nullable|string|max:1000',
'status' => 'required|in:active,inactive,sold',
'vehicle_image' => 'nullable|image|max:2048',
]);
// Handle vehicle image upload
$updateData = [
'customer_id' => $this->customer_id,
'vin' => strtoupper($this->vin),
'make' => $this->make,
'model' => $this->model,
'year' => $this->year,
'color' => $this->color,
'license_plate' => strtoupper($this->license_plate),
'engine_type' => $this->engine_type,
'transmission' => $this->transmission,
'mileage' => $this->mileage,
'notes' => $this->notes,
'status' => $this->status,
];
if ($this->vehicle_image) {
// Delete old image if exists
if ($this->vehicle->vehicle_image) {
\Storage::disk('public')->delete($this->vehicle->vehicle_image);
}
// Store new image
$updateData['vehicle_image'] = $this->vehicle_image->store('vehicles', 'public');
}
$this->vehicle->update($updateData);
session()->flash('success', 'Vehicle updated successfully!');
return $this->redirect('/vehicles/' . $this->vehicle->id, navigate: true);
}
public function render()
{
$customers = Customer::where('status', 'active')->orderBy('first_name')->get();
return view('livewire.vehicles.edit', [
'customers' => $customers,
]);
}
}