@php $title = 'Закрыть номер для Booking — Hotel Pineta'; $heading = 'Закрыть номер для Booking'; $subheading = 'Блокировка и разблокировка продажи комнат по датам'; $formatDate = static function ($value): string { if (! $value) { return '—'; } try { return \Carbon\Carbon::parse($value)->format('d.m.Y'); } catch (\Throwable $e) { return (string) $value; } }; $actionLabels = [ 'blockBookingRooms' => 'Закрыть для Booking', 'unblockBookingRooms' => 'Разблокировать', 'ping' => 'Проверка связи', ]; @endphp @extends('layouts.admin') @section('content')

Блокировка номеров для Booking

Выберите одну или несколько комнат и даты. Система поставит метку Booking в базе и в Google Таблицах. Если позже в форме «Новая бронь» выбрать источник Booking на эту комнату и даты, блокировка снимется автоматически и вместо неё запишутся данные гостя.

@csrf
@foreach ($rooms as $room) @endforeach
Можно выбрать любую комнату: 1A, 2A, 3A, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.
Идёт связь с Google Таблицами. Подождите, пожалуйста...
Разблокировка удаляет только служебные блокировки Booking. Реальные брони гостей не удаляются.

Активные блокировки Booking

@if ($blocks->isEmpty())
Сейчас блокировок Booking в ближайшем периоде нет.
@else
@foreach ($blocks as $block) @endforeach
Дата Комната Метка Синхронизация Создано
{{ $block->block_date?->format('d.m.Y') }} № {{ $block->room?->code }} {{ $block->label ?: 'Booking' }}
{{ $block->sync_status ?: '—' }}
{{ $block->synced_to_google_at?->format('d.m.Y H:i') ?: 'Google ещё не подтверждал' }}
{{ $block->created_at?->format('d.m.Y H:i') }}
{{ $block->createdBy?->name ?: 'Админ' }}
@endif

Диагностика Google Apps Script

Этот блок нужен только для проверки синхронизации Booking-блокировок. Ключ полностью не показывается.

URL скрипта: {{ $diagnostics['script_url'] ?: 'не указан' }}
Secret key: {{ $diagnostics['secret_present'] ? 'задан' : 'не задан' }}@if($diagnostics['secret_present']) · длина {{ $diagnostics['secret_length'] }} · hash {{ $diagnostics['secret_sha256_8'] }}@endif
@csrf
Проверяем связь с Google Apps Script...

Последние запросы Booking-блокировок

Показываются только последние 12 записей. Логи можно очистить, брони и блокировки при этом не удаляются.
@csrf
@if ($syncLogs->isEmpty())
Логов синхронизации пока нет.
@else
@foreach ($syncLogs as $log) @php $payload = $log->payload_json ?: []; $response = $log->response_json ?: []; $diag = data_get($response, 'diagnostics', []); $requestUrl = data_get($diag, 'request_url_masked', ''); $message = data_get($response, 'message', '—'); $httpStatus = data_get($response, 'http_status'); $action = data_get($response, 'action', data_get($payload, 'action', '—')); $rooms = data_get($response, 'rooms', data_get($diag, 'rooms', data_get($payload, 'rooms', '—'))); if (is_array($rooms)) { $rooms = implode(', ', $rooms); } $dateFrom = data_get($response, 'date_from', data_get($diag, 'date_from', data_get($payload, 'date_from'))); $dateTo = data_get($response, 'date_to', data_get($diag, 'date_to', data_get($payload, 'date_to'))); $scriptVersion = data_get($response, 'response.version', data_get($response, 'response.script_version')); @endphp @endforeach
Время Действие Комнаты Период Статус Ответ Google URL запроса
{{ $log->created_at?->format('d.m.Y H:i:s') }} {{ $actionLabels[$action] ?? $action }} {{ $rooms ?: '—' }} {{ $dateFrom ? $formatDate($dateFrom) : '—' }}@if($dateFrom || $dateTo) — {{ $dateTo ? $formatDate($dateTo) : '—' }}@endif
{{ $log->status }}
@if($httpStatus)
HTTP {{ $httpStatus }}
@endif
попыток: {{ $log->attempts ?: data_get($response, 'attempts', 1) }}
{{ $message }}
@if($scriptVersion)
версия: {{ $scriptVersion }}
@endif
{{ $requestUrl ?: '—' }}
@endif
@endsection @push('scripts') @endpush