{{-- Форма бронирования (ТЗ §9.1). Обычная форма POST: без JavaScript она отправляется и работает — сетка слотов на выбранную по умолчанию дату отрисована сервером. Alpine только подгружает слоты при смене даты, числа гостей или продолжительности, чтобы не перезагружать страницу. --}} @props(['venue', 'city', 'slots', 'defaultFrom']) @php $durations = (array) config('restomesto.booking.allowed_durations_minutes', [120]); $defaultDuration = (int) config('restoplace.availability.default_duration_minutes', 120); $minGuests = (int) config('restomesto.booking.min_guests', 1); $maxGuests = (int) config('restomesto.booking.max_guests', 20); /* * Время по умолчанию — первый свободный слот заведения, а не «ближайший * получас»: сетка приходит из Restoplace и начинается с открытия. Иначе в * поле оказалось бы время, которого нет среди вариантов, и форма уходила * бы на заведомый отказ. */ $firstAvailable = $slots->availableSlots()[0] ?? null; $initialTime = old('time') ?? ( $firstAvailable !== null ? $firstAvailable->startsAt->setTimezone($venue->timezone)->format('H:i') : $defaultFrom->format('H:i') ); @endphp

Забронировать стол

@if (session('booking_error')) {{-- Стол заняли между просмотром и отправкой (ТЗ §9.2): показываем понятное сообщение и сразу предлагаем альтернативу. --}} @endif @if ($errors->any()) @endif @if ($slots->unavailable)

Сервис бронирования сейчас не отвечает. Попробуйте через минуту @if ($phone = $venue->publicPhone()) или позвоните: {{ $phone }} @endif.

@endif
@csrf
@if (count($durations) > 1) @else @endif
{{-- Время: сервер отрисовал сетку на дату по умолчанию, Alpine обновляет её при смене параметров. --}}
Время

На эту дату свободных слотов нет. Попробуйте другой день.

{{-- Зал и стол — только если ресторан разрешает выбор (ТЗ §9.1) --}}
{{-- Вошедшему гостю поля подставляются из профиля (ТЗ §12.1), но остаются доступными для правки: бронировать можно и на чужое имя. --}}
{{-- Согласие на обработку ПДн обязательно (ТЗ §22) --}}

Статус брони появится на её странице сразу после подтверждения заведением.