P1: Запись на серию — бронировать occurrence, а не master в прошлом #67

Closed
opened 2026-08-14 10:18:58 +03:00 by cursor-ai · 4 comments
Owner

Проблема

POST /api/v1/events/:id/bookings принимает только event_id. Для recurring-слота бэкенд создаёт бронь на master start_time (в исследовании — 04.08), а не на выбранную occurrence (16.08). Клиент получает pending, который сразу истекает как «в прошлом».

Спека EventHubSpec/specification.txt §2.2.3 требует occurrence_start и материализацию occurrence перед бронью.

Исследование stage (UX 2026-08-13, stamp 1785760409054): SPA «Тишина» серия, карточка показывает 16.08, после POST — бронь на 04.08, expired.

Влияние

Невозможно записаться на будущие недели коммерческой серии. Сценарий «серия + book» сломан на stage.

Ожидаемый результат

API принимает occurrence_start (ISO). Бэкенд материализует occurrence (если её ещё нет) и создаёт бронь на эту дату/время. Master в прошлом не используется как слот записи.

Критерии приёмки

  • Контракт POST bookings включает occurrence_start для recurring
  • Бронь создаётся на выбранную occurrence, не на master start_time
  • Pending/confirmed не помечается expired из‑за даты master
  • Тесты handler/logic_booking покрывают recurring book
  • После тестов — синхронизация EventHubBackSpec (не до кода)

Файлы (подсказка)

  • src/handler_bookings.erl
  • src/logic_booking.erl (create_booking/2)

Приоритет

P1

Источник

UX-прогон stage.calentiq.com, canvas stage-ux-research, 2026-08-13.

## Проблема `POST /api/v1/events/:id/bookings` принимает только `event_id`. Для recurring-слота бэкенд создаёт бронь на master `start_time` (в исследовании — 04.08), а не на выбранную occurrence (16.08). Клиент получает pending, который сразу истекает как «в прошлом». Спека `EventHubSpec/specification.txt` §2.2.3 требует `occurrence_start` и материализацию occurrence перед бронью. Исследование stage (UX 2026-08-13, stamp `1785760409054`): SPA «Тишина» серия, карточка показывает 16.08, после POST — бронь на 04.08, expired. ## Влияние Невозможно записаться на будущие недели коммерческой серии. Сценарий «серия + book» сломан на stage. ## Ожидаемый результат API принимает `occurrence_start` (ISO). Бэкенд материализует occurrence (если её ещё нет) и создаёт бронь на эту дату/время. Master в прошлом не используется как слот записи. ## Критерии приёмки - [ ] Контракт POST bookings включает `occurrence_start` для recurring - [ ] Бронь создаётся на выбранную occurrence, не на master `start_time` - [ ] Pending/confirmed не помечается expired из‑за даты master - [ ] Тесты handler/logic_booking покрывают recurring book - [ ] После тестов — синхронизация EventHubBackSpec (не до кода) ## Файлы (подсказка) - `src/handler_bookings.erl` - `src/logic_booking.erl` (`create_booking/2`) ## Приоритет P1 ## Источник UX-прогон stage.calentiq.com, canvas stage-ux-research, 2026-08-13.
cursor-ai added the Bug label 2026-08-14 10:18:58 +03:00
cursor-ai self-assigned this 2026-08-14 10:18:58 +03:00
Author
Owner

Связка с фронтом: EventHub/EventHubFront#55 (карточка должна слать occurrence_start после этого API).
Источник: UX-прогон stage 2026-08-13.

Связка с фронтом: EventHub/EventHubFront#55 (карточка должна слать `occurrence_start` после этого API). Источник: UX-прогон stage 2026-08-13.
Author
Owner

Беру в работу первой в очереди UX (серия → запись). Код не пишу до выбора варианта.

Рекомендация: вариант A — тело POST с occurrence_start, материализация существующим core_event:materialize_occurrence/3, бронь на instance id. Согласовано со specification.txt §2.2.3 (путь у нас /bookings, не /join).

Беру в работу первой в очереди UX (серия → запись). Код не пишу до выбора варианта. Рекомендация: вариант A — тело POST с `occurrence_start`, материализация существующим `core_event:materialize_occurrence/3`, бронь на instance id. Согласовано со `specification.txt` §2.2.3 (путь у нас `/bookings`, не `/join`).
Author
Owner

EUnit logic_booking_tests: 33/33 (в т.ч. серия: required / materialize / invalid / cancelled).

Вариант A: POST body occurrence_start → materialize_occurrence → booking на instance.

Спека EventHubBackSpec §2.2.3 и блок «Запись и capacity» обновлены.

Пуш нет. Дальше по очереди Front#55.

EUnit logic_booking_tests: 33/33 (в т.ч. серия: required / materialize / invalid / cancelled). Вариант A: POST body occurrence_start → materialize_occurrence → booking на instance. Спека EventHubBackSpec §2.2.3 и блок «Запись и capacity» обновлены. Пуш нет. Дальше по очереди Front#55.
Author
Owner

Проверено на stage API: без occurrence_start → 400; с occurrence_start на будущую occurrence серии → 201, событие брони start_time совпадает с выбранным слотом (15.08 17:00 UTC), статус confirmed (не expired от master). Закрываю.

Проверено на stage API: без occurrence_start → 400; с occurrence_start на будущую occurrence серии → 201, событие брони start_time совпадает с выбранным слотом (15.08 17:00 UTC), статус confirmed (не expired от master). Закрываю.
Sign in to join this conversation.