P1: Реализовать коммерческие календари (BackSpec §2.1.2) #54

Closed
opened 2026-07-22 14:38:45 +03:00 by cursor-ai · 3 comments
Owner

Проблема

Commercial-контур неполный относительно контракта EventHubSpec#6 (§2.1.2):
booking на personal не запрещён; confirmation auto/timeout не применяется; pending не резервирует capacity;
expire делает type→personal вместо restricted; нет HTTP API specialists; нет периодического expire-job.

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

Реализация BackSpec §2.1.2 / §2.3 / §2.9:

  • gate booking + поле booking_open
  • confirmation auto/manual/timeout; capacity = pending+confirmed
  • specialist CRUD + confirm на своих событиях
  • subscription job: expired + cancel pending, без downgrade type
  • renew восстанавливает booking_open
  • eunit / API-тесты

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

  • personal booking → 403 personal_calendar
  • restricted → 403 subscription_inactive; GET calendar с booking_open=false
  • auto/manual/timeout + capacity
  • specialists CRUD + specialist confirm
  • expire/renew без смены type
  • тесты зелёные

Связь

Спека: EventHub/EventHubSpec#6

Приоритет

P1

## Проблема Commercial-контур неполный относительно контракта EventHubSpec#6 (§2.1.2): booking на personal не запрещён; confirmation auto/timeout не применяется; pending не резервирует capacity; expire делает type→personal вместо restricted; нет HTTP API specialists; нет периодического expire-job. ## Ожидаемый результат Реализация BackSpec §2.1.2 / §2.3 / §2.9: - gate booking + поле `booking_open` - confirmation auto/manual/timeout; capacity = pending+confirmed - specialist CRUD + confirm на своих событиях - subscription job: `expired` + cancel pending, без downgrade type - renew восстанавливает `booking_open` - eunit / API-тесты ## Критерии приёмки - [ ] personal booking → 403 `personal_calendar` - [ ] restricted → 403 `subscription_inactive`; GET calendar с `booking_open=false` - [ ] auto/manual/timeout + capacity - [ ] specialists CRUD + specialist confirm - [ ] expire/renew без смены type - [ ] тесты зелёные ## Связь Спека: https://git.sabilin.com/EventHub/EventHubSpec/issues/6 ## Приоритет P1
cursor-ai added the Epic label 2026-07-22 14:38:45 +03:00
cursor-ai self-assigned this 2026-07-22 14:38:45 +03:00
Author
Owner

Беру в работу. Реализация BackSpec §2.1.2: booking_open, confirmation, specialists, expire=restrict.

Беру в работу. Реализация BackSpec §2.1.2: booking_open, confirmation, specialists, expire=restrict.
Author
Owner

Прогресс (Back)

Реализовано по §2.1.2:

  • booking_open в JSON календаря; gate booking: personal / subscription_inactive / own_event
  • confirmation: auto → confirmed; manual → pending; timeout — subscription_worker
  • capacity = pending + confirmed
  • specialists CRUD API + confirm specialist на своих событиях
  • expire: expired + cancel pending, без type→personal; renew восстанавливает booking_open
  • search исключает restricted commercial
  • migration calendar_specialist PK=id

Тесты: logic_booking_tests, booking_integration_tests, logic_calendar_tests, core_subscription_tests — 42/0.

Коммит/пуш — по запросу. Front #15 — отдельно.

## Прогресс (Back) Реализовано по §2.1.2: - `booking_open` в JSON календаря; gate booking: personal / subscription_inactive / own_event - confirmation: auto → confirmed; manual → pending; timeout — `subscription_worker` - capacity = pending + confirmed - specialists CRUD API + confirm specialist на своих событиях - expire: `expired` + cancel pending, **без** type→personal; renew восстанавливает booking_open - search исключает restricted commercial - migration `calendar_specialist` PK=id Тесты: `logic_booking_tests`, `booking_integration_tests`, `logic_calendar_tests`, `core_subscription_tests` — 42/0. Коммит/пуш — по запросу. Front #15 — отдельно.
Author
Owner

Готово

Коммерческие календари реализованы на бэке.

Что сделано

  • booking_open: запись только РЅР° commercial + активная РїРѕРґРїРёСЃРєР° владельца
  • personal в†’ 403 personal_calendar; без РїРѕРґРїРёСЃРєРё в†’ 403 subscription_inactive
  • expire РїРѕРґРїРёСЃРєРё: restrict без downgrade type; pending отменяются
  • подтверждение: auto / manual / timeout; capacity считает pending+confirmed
  • specialists CRUD + confirm specialist РЅР° своём event
  • РїРѕРёСЃРє/discovery скрывает restricted commercial

Тесты

Локально: make test-all — eunit 969 + CT 40 зелёные.

Коммиты

  • Back: af5f506 (Refs #54)
  • Spec: f3f199c (Refs Spec#6, Back#54)

Front UI — отдельно EventHubFront#15.

## Готово Коммерческие календари реализованы на бэке. ### Что сделано - booking_open: запись только на commercial + активная подписка владельца - personal → 403 personal_calendar; без подписки → 403 subscription_inactive - expire подписки: restrict без downgrade type; pending отменяются - подтверждение: auto / manual / timeout; capacity считает pending+confirmed - specialists CRUD + confirm specialist на своём event - поиск/discovery скрывает restricted commercial ### Тесты Локально: make test-all — eunit 969 + CT 40 зелёные. ### Коммиты - Back: af5f506 (Refs #54) - Spec: f3f199c (Refs Spec#6, Back#54) Front UI — отдельно EventHubFront#15.
Sign in to join this conversation.