Механизм редиректа между apps/landing и apps/front, сохраняющий параметры брони через весь флоу авторизации — включая email-подтверждение в отдельной вкладке.
apps/landing's booking-form.vue не создаёт брони и ничего не пишет в БД —
открывает ${PUBLIC_ORIGIN}/booking/confirm (apps/front) с параметрами брони
(housing_id, даты, гости, питомцы) в query string, новой вкладкой.booking/confirm во front защищён ifAuthenticated-гардом: неавторизованного
редиректит на /auth?redirect=<исходный путь с query>.redirect через весь
флоу — для email прямо внутри JWT-токена ссылки подтверждения (см. verificationId в
документе «Авторизация») — и приземляют пользователя обратно на booking/confirm с
исходными параметрами.
BookingStatusType.BID заведён в @shared/src/catalogs/booking/status.ts, но
в текущей (утверждённой) реализации гостевого флоу нигде не используется — мёртвый код/задел на
будущее (см. «Новый жизненный цикл бронирования» — там BID становится рабочим статусом).
Это значит: даты объекта остаются доступными для других всё время, пока гость проходит
регистрацию/подтверждение и редактирует поля на confirm.vue. Как только addBooking
реально выполнится (status: 'BOOKING' жёстко зашит в confirm.vue's
onSave()), даты сразу становятся занятыми — проверено эмпирически.
confirm.vue живо (без debounce, на каждое изменение полей) перезапрашивает
housingWithPrice. Раньше эта query шла через HousingService.findOneWithPrice,
вызывающую только addSelections, а не assertBookable — недопустимые варианты
(питомцы на объекте с allow_animals=false, недопустимый возраст ребёнка, бронь короче
min_night_count) никак не отображались во время редактирования, ошибка вылезала только по
факту нажатия «Оплатить», сырой непереведённой английской строкой.
Исправлено:
Housing.unavailable_reasons — единое поле, работает и в housingWithPrice, и
в housings (подробности — документ по ценообразованию).HousingOneArgs получил with_animals (раньше housingWithPrice
вообще не принимал этот параметр).confirm.vue (apps/front) и show.vue/booking-form.vue
(apps/landing) передают with_animals в live-query, рендерят
housing.unavailable_reasons и блокируют кнопку оплаты/бронирования, пока список не пуст.
Лендинговый поиск (vertical-summary/actions.vue) аналогично затемняет
карточку в списке.