> */ public array $journeys = []; // Additional details public bool $needsAccommodation = false; public bool $needsCarHire = false; public bool $vehiclePolicyAcknowledged = false; public int $businessDays = 0; public int $privateDays = 0; public string $additionalNotes = ''; // Cost codes - array of rows /** @var array> */ public array $costCodes = []; public function mount(): void { $user = Auth::user(); $contact = $user->emergencyContacts()->first(); if ($contact) { $this->emergencyFullName = $contact->full_name; $this->emergencyPhone = $contact->phone_number; $this->emergencyRelationship = $contact->relationship; } $this->addJourney(); $this->addCostCode(); } public function addJourney(): void { $this->journeys[] = [ 'origin' => '', 'destination' => '', 'date' => '', 'time' => '', 'method' => JourneyMethod::Air->value, ]; } public function removeJourney(int $index): void { array_splice($this->journeys, $index, 1); } public function addCostCode(): void { $this->costCodes[] = [ 'business_unit' => '', 'project_grant' => '', 'account_code' => '', 'class_code' => '', ]; } public function removeCostCode(int $index): void { array_splice($this->costCodes, $index, 1); } public function saveDraft(): void { $this->saveRequest(submit: false); session()->flash('success', 'Draft saved successfully.'); } public function submit(): void { $this->saveRequest(submit: true); } private function saveRequest(bool $submit): void { $this->validate([ 'emergencyFullName' => ['required', 'string', 'max:255'], 'emergencyPhone' => ['required', 'string', 'max:50'], 'emergencyRelationship' => ['required', 'string', 'max:100'], 'reasonSummary' => ['required', 'string', 'min:10'], 'journeys' => ['required', 'array', 'min:1'], 'journeys.*.origin' => ['required', 'string', 'max:255'], 'journeys.*.destination' => ['required', 'string', 'max:255'], 'journeys.*.date' => ['required', 'date'], 'journeys.*.method' => ['required', 'string'], 'costCodes' => ['array'], 'vehiclePolicyAcknowledged' => $this->needsCarHire ? ['accepted'] : [], ], [ 'emergencyFullName.required' => 'Emergency contact name is required.', 'emergencyPhone.required' => 'Emergency contact phone is required.', 'emergencyRelationship.required' => 'Emergency contact relationship is required.', 'reasonSummary.required' => 'Please provide a reason for travel.', 'reasonSummary.min' => 'Reason must be at least 10 characters.', 'journeys.required' => 'At least one journey is required.', 'journeys.*.origin.required' => 'Origin is required for each journey.', 'journeys.*.destination.required' => 'Destination is required for each journey.', 'journeys.*.date.required' => 'Date is required for each journey.', 'vehiclePolicyAcknowledged.accepted' => 'You must acknowledge the vehicle policy when hiring a car.', ]); $user = Auth::user(); // Save emergency contact $user->emergencyContacts()->updateOrCreate( ['user_id' => $user->id], [ 'full_name' => $this->emergencyFullName, 'phone_number' => $this->emergencyPhone, 'relationship' => $this->emergencyRelationship, ] ); $workflow = ApprovalWorkflow::where('is_active', true)->first(); $travelRequest = TravelRequest::create([ 'user_id' => $user->id, 'workflow_id' => $workflow?->id, 'status' => TravelStatus::Draft, 'reason_summary' => $this->reasonSummary, 'event_type' => $this->travelCategory === 'event' && $this->eventType ? $this->eventType : null, 'general_type' => $this->travelCategory === 'general' && $this->generalType ? $this->generalType : null, 'needs_accommodation' => $this->needsAccommodation, 'needs_car_hire' => $this->needsCarHire, 'vehicle_policy_acknowledged' => $this->vehiclePolicyAcknowledged, 'business_days' => $this->businessDays, 'private_days' => $this->privateDays, 'additional_notes' => $this->additionalNotes ?: null, ]); foreach ($this->journeys as $journey) { TravelJourney::create([ 'travel_request_id' => $travelRequest->id, 'origin' => $journey['origin'], 'destination' => $journey['destination'], 'date' => $journey['date'], 'time' => $journey['time'] ?: null, 'method' => $journey['method'], ]); } foreach ($this->costCodes as $code) { if (array_filter($code)) { TravelCostCode::create([ 'travel_request_id' => $travelRequest->id, 'business_unit' => $code['business_unit'] ?: null, 'project_grant' => $code['project_grant'] ?: null, 'account_code' => $code['account_code'] ?: null, 'class_code' => $code['class_code'] ?: null, ]); } } if ($submit) { app(ApprovalService::class)->submit($travelRequest); session()->flash('success', 'Travel request submitted for approval.'); } $this->redirect(route('travel-requests.show', $travelRequest), navigate: true); } public function render(): mixed { return view('livewire.travel-request.create', [ 'user' => Auth::user(), 'journeyMethods' => JourneyMethod::cases(), 'eventTypes' => EventType::cases(), 'generalTypes' => GeneralType::cases(), ]); } } ?>

New Travel Request

@if (session('success'))
{{ session('success') }}
@endif
{{-- Applicant Details --}}
Applicant Details
{{-- Emergency Contact --}}
Emergency Contact
@error('emergencyFullName')
{{ $message }}
@enderror
@error('emergencyPhone')
{{ $message }}
@enderror
@error('emergencyRelationship')
{{ $message }}
@enderror
{{-- Reasons for Travel --}}
Reasons for Travel
@error('reasonSummary')
{{ $message }}
@enderror
@if ($travelCategory === 'event')
@else
@endif
{{-- Journeys --}}
Journeys
@error('journeys')
{{ $message }}
@enderror @foreach ($journeys as $i => $journey)
Journey {{ $i + 1 }} @if (count($journeys) > 1) @endif
@error('journeys.'.$i.'.origin')
{{ $message }}
@enderror
@error('journeys.'.$i.'.destination')
{{ $message }}
@enderror
@error('journeys.'.$i.'.date')
{{ $message }}
@enderror
@endforeach
{{-- Additional Details --}}
Additional Details
@if ($needsCarHire)
@error('vehiclePolicyAcknowledged')
{{ $message }}
@enderror
@endif
{{-- Cost Codes --}}
Cost Codes
@foreach ($costCodes as $i => $code)
Cost Code {{ $i + 1 }} @if (count($costCodes) > 1) @endif
@endforeach
{{-- Actions --}}