Document commercial calendars: booking_open, specialists, restricted UX.
Refs EventHub/EventHubSpec#6 Refs EventHub/EventHubBack#54
This commit is contained in:
+26
-15
@@ -8,8 +8,9 @@
|
||||
|
||||
| Режим | Описание | Ключевые возможности |
|
||||
|-------|----------|----------------------|
|
||||
| Участник | Поиск и запись на события коммерческих календарей | Поиск, просмотр календаря/события, запись, отмена своей записи, отзывы, жалобы, тикеты |
|
||||
| Владелец | Управление своими календарями | CRUD календарей и событий, список заявок, confirm/decline, подписка |
|
||||
| Участник | Поиск и запись на события коммерческих календарей | Поиск, просмотр, запись (если `booking_open`), отмена, отзывы, жалобы, тикеты |
|
||||
| Владелец | Управление своими календарями | CRUD календарей/событий/специалистов, заявки confirm/decline, подписка |
|
||||
| Специалист | Confirm заявок на «свои» события | Те же экраны календаря; confirm/decline только где `specialist_id` = текущий user |
|
||||
|
||||
Deep-link на календарь, владельцем которого является текущий пользователь, показывает owner-действия (редактирование, заявки).
|
||||
|
||||
@@ -50,7 +51,9 @@ Deep-link на календарь, владельцем которого явл
|
||||
|
||||
- Главная сущность — **календарь**. Центр UI — виджет с видами **месяц** (default) / **неделя** / **день**.
|
||||
- Главные вкладки: **Календарь** (`/`, `/c/:id`), **Найти** (`/search`), **Записи** (`/bookings`), **Ещё** (`/more`).
|
||||
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). `personal` чужой — только просмотр; `commercial` — запись на событие.
|
||||
- Контекст виджета: свой календарь (селектор) или чужой (browse после поиска). Чужой `personal` —
|
||||
только просмотр; чужой `commercial` с `booking_open=true` — запись; при `booking_open=false`
|
||||
(restricted / нет подписки владельца) — просмотр + сообщение «Запись временно недоступна».
|
||||
- Выбор события открывает карточку действий: mobile — bottom sheet; desktop — боковая панель. Действия зависят от роли (owner / participant).
|
||||
- Без выбранного события — панель «О календаре» (описание, title/meta, рейтинг, отзывы).
|
||||
Форма отзыва на календарь/событие — только при confirmed booking; жалоба доступна без записи.
|
||||
@@ -114,24 +117,31 @@ Redirects: `/discover` → `/search`; `/calendars/:id` → `/c/:id`; `/calendars
|
||||
|
||||
### 5.4. Календари
|
||||
- Список своих: `GET /v1/calendars`
|
||||
- CRUD: `POST/PUT/DELETE /v1/calendars`, `GET /v1/calendars/:id` (поле `following`)
|
||||
- CRUD: `POST/PUT/DELETE /v1/calendars`, `GET /v1/calendars/:id` (`following`, `booking_open`)
|
||||
- Follow чужого: `POST/DELETE /v1/calendars/:id/follow`, список `GET /v1/user/following`
|
||||
(UI: «Отслеживать» в about, страница `/following`; не путать с `/subscription`)
|
||||
- Просмотр коммерческого чужого календаря по id (доступ по правилам бэка)
|
||||
- Просмотр коммерческого чужого календаря по id; при `booking_open=false` — баннер
|
||||
«Запись временно недоступна», кнопка записи скрыта
|
||||
- HTML month view владельца: `GET /v1/calendars/:calendar_id/view?month=YYYY-MM` — при переключении виджета на **прошедший месяц** (owner + вид «Месяц») автоматически подменяет клиентский grid серверным HTML (live/архив, задача #15). Текущий и будущие месяцы — React-виджет по `GET …/events`.
|
||||
- Создание `commercial` требует активной подписки (ответ 402 → экран подписки)
|
||||
- Создание / апгрейд `commercial` без подписки → `402` → `/subscription`; после оплаты —
|
||||
возврат к созданию/редактированию
|
||||
- Владелец commercial: управление специалистами (`GET/POST/PUT/DELETE …/specialists`);
|
||||
выбор `specialist_id` в форме события; баннер «подписка истекла / истекает»
|
||||
|
||||
### 5.5. События
|
||||
- Список: `GET /v1/calendars/:calendar_id/events`
|
||||
- CRUD владельца: `POST/PUT/DELETE`
|
||||
- Детали: `GET /v1/events/:id`
|
||||
- CRUD владельца: `POST/PUT/DELETE` (в т.ч. опциональный `specialist_id`)
|
||||
- Детали: `GET /v1/events/:id` (отображение специалиста, если задан)
|
||||
- Вхождения: `GET /v1/events/:id/occurrences`
|
||||
- Отмена вхождения: `DELETE /v1/events/:id/occurrences/:start_time`
|
||||
|
||||
### 5.6. Запись (bookings)
|
||||
- Участник: `POST /v1/events/:id/bookings`, `GET /v1/user/bookings`, `DELETE /v1/bookings/:id`, `GET /v1/bookings/:id`
|
||||
- Владелец: `GET /v1/events/:id/bookings`, `PUT /v1/bookings/:id` с `{ action: confirm | decline }`
|
||||
- Статусы: `pending` | `confirmed` | `cancelled` (режим confirmation календаря: `auto` | `manual` | timeout)
|
||||
- Участник: `POST /v1/events/:id/bookings` только при `booking_open`; иначе UI-сообщение /
|
||||
ответ `403`; `GET /v1/user/bookings`, `DELETE /v1/bookings/:id`, `GET /v1/bookings/:id`
|
||||
- Владелец и specialist: `GET /v1/events/:id/bookings`, `PUT /v1/bookings/:id`
|
||||
`{ action: confirm | decline }` (specialist — только свои события, см. BackSpec §2.1.2)
|
||||
- Статусы: `pending` | `confirmed` | `cancelled`; confirmation: `auto` | `manual` | timeout
|
||||
- Pending резервирует capacity (как на бэке)
|
||||
|
||||
### 5.7. Отзывы
|
||||
`GET/POST /v1/reviews`, `GET/PUT/DELETE /v1/reviews/:id`, `GET /v1/user/reviews`. Цели: `event` | `calendar`.
|
||||
@@ -145,7 +155,8 @@ UI: форма отзыва скрыта без confirmed booking (event — boo
|
||||
`GET /v1/subscription`, `POST /v1/subscription` (`start_trial` | `activate` + `plan` + опционально `payment_info`).
|
||||
Планы и цены (как Back `plan_price/1`, minor units → ₽): monthly **999**, quarterly **2499**, biannual **4499**, annual **7999**.
|
||||
UI: карточки сравнения, локализованный «Бесплатно» без подписки, trial, демо-оплата (шлюз-заглушка).
|
||||
Создание commercial-календаря без подписки → `402` → редирект на `/subscription`.
|
||||
Создание commercial без подписки → `402` → `/subscription`. После renew commercial-календари
|
||||
владельца снова с `booking_open=true` без смены type (BackSpec §2.1.2 restricted → full).
|
||||
|
||||
### 5.10. Тикеты
|
||||
- ErrorBoundary / необработанные ошибки → `POST /v1/tickets` с `source=frontend`
|
||||
@@ -195,13 +206,13 @@ E2E: `e2e/TESTIDS.md`. Моки (`npm run test:e2e`, `project=mock`) — тол
|
||||
|
||||
## 7. Ограничения MVP (Future)
|
||||
|
||||
Не реализуется в UI, пока нет user HTTP API:
|
||||
- приглашения / шаринг календаря (`calendar_share`)
|
||||
- CRUD специалистов (`calendar_specialist`)
|
||||
Не в текущей волне commercial (§2.1.2 BackSpec уже в scope UI):
|
||||
- приглашения / шаринг календаря (`calendar_share`) — фаза 2
|
||||
- серверный logout / revoke session
|
||||
- загрузка файлов (вложения)
|
||||
- явный `client_type=mobile` (фаза 3 бэка)
|
||||
- push-уведомления (таблица `notification` без полноценной доставки)
|
||||
- waitlist / оплата услуги клиентом (B2C)
|
||||
|
||||
Лайки/дизлайки отзывов: `PUT/DELETE /v1/reviews/:id/vote`, поле `my_vote` в ответах отзывов (EventHubBack#47).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user