@extends('layouts.app') @section('content') @if(session('success')) @endif @if(session('error')) @endif @php $statusRaw = strtolower($booking->status ?? ''); $isOk = in_array($statusRaw, ['confirmed','ok','success']); $isBad = in_array($statusRaw, ['failed','cancelled','canceled','error']); $heroCls = $isOk ? 'ok' : ($isBad ? 'bad' : 'pend'); $heroIcon = $isOk ? 'bi-check-lg' : ($isBad ? 'bi-x-lg' : 'bi-hourglass-split'); $heroTitle = $isOk ? 'Booking Confirmed' : ($isBad ? 'Booking Failed / Cancelled' : 'Booking Pending'); $heroSub = $isOk ? 'Your reservation at '.($booking->hotel_name ?? 'the hotel').' is confirmed.' : ($isBad ? 'Your reservation at '.($booking->hotel_name ?? 'the hotel').' could not be completed.' : 'Your reservation is currently being processed.'); // ── Build unified guest list from booking_items / passenger_details ── $bookingItems = is_array($booking->booking_items) ? $booking->booking_items : json_decode($booking->booking_items ?? '[]', true); $passengerDetails = $booking->passenger_details ?? []; if (is_string($passengerDetails)) { $passengerDetails = json_decode($passengerDetails, true); } if (is_string($passengerDetails)) { $passengerDetails = json_decode($passengerDetails, true); } $passengerDetails = is_array($passengerDetails) ? $passengerDetails : []; $rooms = []; // Preferred source: booking_items[0]['rooms'][...]['guests'] $itemRooms = $bookingItems[0]['rooms'] ?? []; if (!empty($itemRooms)) { foreach ($itemRooms as $idx => $room) { $rawGuests = $room['guests'] ?? []; $guests = is_string($rawGuests) ? (json_decode($rawGuests, true) ?? []) : (is_array($rawGuests) ? $rawGuests : []); $rooms[] = [ 'label' => $room['description'] ?? $room['room_type'] ?? ('Room ' . ($idx + 1)), 'adults' => $room['no_of_adults'] ?? 0, 'children' => $room['no_of_children'] ?? 0, 'guests' => array_map(function($g) { return [ 'name' => trim(($g['first_name'] ?? '') . ' ' . ($g['last_name'] ?? '')), 'type' => !empty($g['is_child']) ? 'CH' : 'AD', 'age' => $g['age'] ?? null, ]; }, $guests), ]; } } // Fallback: passenger_details[*]['paxes'] if (empty($rooms) && is_array($passengerDetails) && count($passengerDetails)) { foreach ($passengerDetails as $idx => $room) { $paxes = $room['paxes'] ?? []; $adults = count(array_filter($paxes, fn($p) => ($p['type'] ?? '') === 'AD')); $children = count(array_filter($paxes, fn($p) => ($p['type'] ?? '') === 'CH')); $rooms[] = [ 'label' => 'Room ' . ($idx+1), 'adults' => $adults, 'children' => $children, 'guests' => array_map(function($p) { return [ 'name' => trim((($p['title'] ?? '') . ' ' . ($p['name'] ?? '') . ' ' . ($p['surname'] ?? ''))), 'type' => $p['type'] ?? 'AD', 'age' => $p['age'] ?? null, ]; }, $paxes), ]; } } // Last fallback — single holder only if (empty($rooms)) { $rooms[] = [ 'label' => 'Room 1', 'adults' => 1, 'children' => 0, 'guests' => [[ 'name' => trim(($booking->holder_title ?? '') . ' ' . ($booking->holder_name ?? '') . ' ' . ($booking->holder_surname ?? '')), 'type' => 'AD', 'age' => null, ]], ]; } $priceBreakdown = is_array($booking->price_breakdown) ? $booking->price_breakdown : json_decode($booking->price_breakdown ?? '[]', true); $breakdownItems = $priceBreakdown['breakdown'] ?? []; @endphp
{{-- HERO --}}

{{ $heroTitle }}

{{ $heroSub }}

{{ strtoupper($booking->status ?? 'pending') }}
Booking Reference: {{ $booking->booking_reference }}
{{-- TRIP & STAY DETAILS --}}

Trip & Stay Details

Booking Date {{ \Carbon\Carbon::parse($booking->booking_date)->format('d M Y, h:i A') }}
Check-in {{ \Carbon\Carbon::parse($booking->checkin)->format('d M Y, h:i A') }}
Check-out {{ \Carbon\Carbon::parse($booking->checkout)->format('d M Y, h:i A') }}
Payment Status {{ strtoupper($booking->payment_status ?? 'N/A') }}
{{-- HOTEL & CONTACT --}}

Hotel & Contact Details

Hotel Name {{ $booking->hotel_name }}
Address {{ $booking->hotel_address }}{{ $booking->city_name ? ', '.$booking->city_name : '' }}{{ $booking->country_name ? ', '.$booking->country_name : '' }}
Lead Guest Email {{ $booking->holder_email }}
Lead Guest Phone {{ $booking->holder_phone }}
{{-- GUEST DETAILS (ALL ROOMS / ALL GUESTS) --}}

Guest Details

@foreach($rooms as $ridx => $room)
{{ $room['label'] }} {{ $room['adults'] }} Adult{{ $room['adults'] != 1 ? 's' : '' }}@if($room['children'] > 0), {{ $room['children'] }} Child{{ $room['children'] != 1 ? 'ren' : '' }}@endif
@forelse($room['guests'] as $gidx => $g)
{{ $g['name'] ?: 'Guest '.($gidx+1) }}
@if($ridx === 0 && $gidx === 0)
Primary contact for this booking
@elseif($g['type'] === 'CH' && $g['age'] !== null)
Age: {{ $g['age'] }} years
@endif
{{ $g['type'] === 'CH' ? 'Child' : 'Adult' }}
@empty
No guest details available
@endforelse
@endforeach
{{-- PRICE SUMMARY --}}

Price Summary

@forelse($breakdownItems as $item) @empty @endforelse @if(!empty($payAtHotel)) @foreach($payAtHotel as $payCurrency => $amount) @endforeach @endif
{{ $item['description'] ?? 'Charge' }} {{ number_format($item['amount'] ?? 0, 2) }} {{ $booking->currency }}
Room Charges {{ number_format($booking->total_price ?? 0, 2) }} {{ $booking->currency }}
Total Amount Paid {{ number_format($booking->total_price ?? 0, 2) }} {{ $booking->currency }}
Payable at Hotel {{ number_format($amount, 2) }} {{ $payCurrency ?? 'USD' }}
{{-- end .cf-wrap --}}
{{-- ACTION BAR --}}
Booking List Print
@csrf
@endsection