Doc How Booking Chat - PlutoGr/TravelAgency GitHub Wiki
Как работают заявки и чат
Клиент оставляет заявку на тур, менеджер ведёт её до предложения, клиент подтверждает. Всё это время у заявки есть чат.
Простой пример
| Шаг | Кто | Запрос | Статус заявки |
|---|---|---|---|
| 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
Недопустимый переход: 422. Клиент может перевести только свою заявку и только в Cancelled. Confirmed ставится только через confirm.
Снимок тура
Заявка ссылается на тур по id, а предложение хранит копию тура (TourSnapshot: название, описание, цена, валюта, длительность, время снимка).
Пример: менеджер отправил предложение по цене 1200 USD, через день в каталоге цена стала 1350 USD. В предложении клиента остаётся 1200 USD.
- При создании заявки Booking вызывает Catalog
GetTourSnapshot: тур должен быть опубликован, иначе 422tour-unavailable. - При создании предложения вызывается
GetTourSnapshotForExistingBooking: подходит и снятый с публикации тур, черновик нет. - Цена в снимке: самое дешёвое предложение тура, действующее сегодня; если его нет, самое дешёвое из всех; если предложений нет, 0 USD.
Чат заявки
- Фронтенд загружает историю
GET /chat/booking/{bookingId}/messages. - Открывает соединение SignalR
/chat/hubs/chat(одно на открытую заявку) и вызываетJoinBookingGroup. - Отправка:
SendMessage. Сервер сохраняет сообщение и шлётMessageReceivedгруппеbooking_{id}.
Каждый вызов Chat проверяет доступ у Booking (ValidateBookingAccess): клиент этой заявки или любой Manager и Admin. Подробно: Chat.
Где на фронтенде
| Кто | Страница |
|---|---|
| клиент | /dashboard/bookings, /dashboard/bookings/:id |
| менеджер, админ | /manager/bookings, /manager/bookings/:id |
Чего пока нет
- Уведомлений о смене статуса и новых сообщениях: события пишутся в outbox Booking, но не отправляются (MVP-1).
- Назначения заявки конкретному менеджеру: любой менеджер видит и ведёт любую заявку.