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

182 lines
5.4 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 Create extends Component
{
use WithFileUploads;
#[Validate('required|exists:customers,id')]
public $customer_id = '';
#[Validate('required|string|size:17|unique:vehicles,vin')]
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|unique:vehicles,license_plate')]
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()
{
// If customer ID is passed via query parameter, pre-select it
if (request()->has('customer')) {
$this->customer_id = request()->get('customer');
}
}
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'];
// Fill form fields with decoded data
if (!empty($data['make'])) {
$this->make = $data['make'];
}
if (!empty($data['model'])) {
$this->model = $data['model'];
}
if (!empty($data['year'])) {
$this->year = $data['year'];
}
if (!empty($data['engine_type'])) {
$this->engine_type = $data['engine_type'];
}
if (!empty($data['transmission'])) {
$this->transmission = $data['transmission'];
}
// Show success message
$filledFields = array_filter([
$data['make'] ? 'Make' : null,
$data['model'] ? 'Model' : null,
$data['year'] ? 'Year' : null,
$data['engine_type'] ? 'Engine' : null,
$data['transmission'] ? 'Transmission' : null,
]);
if (!empty($filledFields)) {
$this->vinDecodeSuccess = 'VIN decoded successfully! Auto-filled: ' . implode(', ', $filledFields);
} else {
$this->vinDecodeError = 'VIN was decoded but no vehicle information was found.';
}
// 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 createVehicle()
{
$this->validate();
// Handle vehicle image upload
$vehicleImagePath = null;
if ($this->vehicle_image) {
$vehicleImagePath = $this->vehicle_image->store('vehicles', 'public');
}
$vehicle = Vehicle::create([
'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,
'vehicle_image' => $vehicleImagePath,
]);
session()->flash('success', 'Vehicle added successfully!');
return $this->redirect('/vehicles/' . $vehicle->id, navigate: true);
}
public function render()
{
$customers = Customer::where('status', 'active')->orderBy('first_name')->get();
return view('livewire.vehicles.create', [
'customers' => $customers,
]);
}
}