Skip to content

Doc How Booking Chat

PlutoGr edited this page Oct 17, 2026 · 1 revision

Как работают заявки и чат

Клиент оставляет заявку на тур, менеджер ведёт её до предложения, клиент подтверждает. Всё это время у заявки есть чат.

Простой пример

Шаг Кто Запрос Статус заявки
1 клиент POST /bookings { tourId, comment } New (0)
2 менеджер PATCH /bookings/{id}/status { newStatus: 1 } InProgress (1)
3 клиент и менеджер чат: SendMessage(bookingId, "Можно на неделю позже?") без изменений
4 менеджер POST /bookings/{id}/proposal { notes } без изменений, у заявки появилось предложение
5 менеджер PATCH …/status { newStatus: 2 } ProposalSent (2)
6 клиент POST /bookings/{id}/confirm { proposalId } Confirmed (3)
7 менеджер PATCH …/status { newStatus: 4 } Closed (4)

На любом шаге до закрытия клиент или менеджер может отменить заявку (Cancelled, 5).

Схема статусов

stateDiagram-v2
    [*] --> New
    New --> InProgress
    InProgress --> ProposalSent: есть предложение
    ProposalSent --> InProgress
    ProposalSent --> Confirmed: confirm
    Confirmed --> Closed
    New --> Cancelled
    InProgress --> Cancelled
    ProposalSent --> Cancelled
    Confirmed --> Cancelled
Loading

Недопустимый переход: 422. Клиент может перевести только свою заявку и только в Cancelled. Confirmed ставится только через confirm.

Снимок тура

Заявка ссылается на тур по id, а предложение хранит копию тура (TourSnapshot: название, описание, цена, валюта, длительность, время снимка).

Пример: менеджер отправил предложение по цене 1200 USD, через день в каталоге цена стала 1350 USD. В предложении клиента остаётся 1200 USD.

  • При создании заявки Booking вызывает Catalog GetTourSnapshot: тур должен быть опубликован, иначе 422 tour-unavailable.
  • При создании предложения вызывается GetTourSnapshotForExistingBooking: подходит и снятый с публикации тур, черновик нет.
  • Цена в снимке: самое дешёвое предложение тура, действующее сегодня; если его нет, самое дешёвое из всех; если предложений нет, 0 USD.

Чат заявки

  1. Фронтенд загружает историю GET /chat/booking/{bookingId}/messages.
  2. Открывает соединение SignalR /chat/hubs/chat (одно на открытую заявку) и вызывает JoinBookingGroup.
  3. Отправка: SendMessage. Сервер сохраняет сообщение и шлёт MessageReceived группе booking_{id}.

Каждый вызов Chat проверяет доступ у Booking (ValidateBookingAccess): клиент этой заявки или любой Manager и Admin. Подробно: Chat.

Где на фронтенде

Кто Страница
клиент /dashboard/bookings, /dashboard/bookings/:id
менеджер, админ /manager/bookings, /manager/bookings/:id

Чего пока нет

  • Уведомлений о смене статуса и новых сообщениях: события пишутся в outbox Booking, но не отправляются (MVP-1).
  • Назначения заявки конкретному менеджеру: любой менеджер видит и ведёт любую заявку.

Clone this wiki locally