POST /webhooks/travelline.TravellineEvent, статус Pending). Повторные eventId пропускаются (идемпотентность).BookingSync, IntegrationAudit). Проблемные случаи — в ManualIntervention.Периодически ReconciliationHostedService сверяет активные брони в Travelline с локальным BookingSync и компенсирует пропущенные веб-хуки.
| Метод и путь | POST /webhooks/travelline |
| Тело | JSON-массив событий (до 1000 шт.) |
| Авторизация | Заголовок API-KEY — только если в конфиге задан непустой Travelline:WebhookApiKey |
Пример события заезда:
[
{
"eventId": "evt-001",
"eventType": "webpms:check_in",
"creationTime": "2026-05-19T10:00:00Z",
"payload": { "bookingNumber": "20260519-17783-421894386" }
}
]
| Путь | Назначение |
|---|---|
GET /health/live |
Проверка, что процесс запущен |
GET /health/ready |
Готовность службы (в т. ч. Service DB) |
GET /api/info/version |
Версия сборки |
GET /scalar, GET /docs |
Документация OpenAPI |
eventType |
Действие в БАРС (на каждого гостя room stay) |
|---|---|
webpms:check_in |
Поиск/создание клиента, выдача абонемента; деактивация абонементов гостей, исчезнувших из guestsIds |
webpms:change_check_in_datetime |
Обновление даты начала; то же для удалённых из номера гостей |
webpms:change_check_out_datetime |
Обновление даты окончания; то же для удалённых из номера гостей |
webpms:cancel_check_in |
Деактивация абонемента |
webpms:check_out |
Закрытие абонемента; при досрочном выезде — сокращение срока до конца дня выезда |
webpms:cancel_check_out |
Восстановление даты окончания из брони |
webpms:create_booking |
Только запись в аудит |
webpms:cancel_booking |
Только запись в аудит |
webpms:change_room |
Только запись в аудит |
Несколько гостей в номере — отдельный абонемент на каждого PmsGuestId. Срок действия общий для room stay.
Гость без телефона (например, ребёнок) — используется синтетический номер на основе PmsGuestId; клиент и абонемент создаются автоматически.
Повторный заезд той же брони/гостя — если абонемент ещё активен в БАРС, обновляются только даты. После cancel_check_in (или если в БАРС абонемент уже неактивен, а в службе привязка ещё помечена активной) выдаётся новый абонемент.
Удаление гостя из номера — при обработке брони сравнивается список guestsIds с сохранёнными привязками. Гость, которого больше нет в номере, получает деактивацию абонемента. То же выполняется при периодической сверке.
Выдача абонемента в БАРС — транзакция оформляется как продажа (в детальной выписке лицевого счёта — «Приобретение товаров и услуг»). При Bars:WriteControlTape=true (по умолчанию) операция пишется в контрольную ленту кассы и доступна в отчётах по продажам абонементов.
Даты проживания — приоритет у фактических дат заезда/выезда; иначе плановые. Часовой пояс — Hotel:TimeZoneId.
Периодическая сверка — после старта службы первая сверка откладывается на InitialDelayMinutes (по умолчанию 5 мин). Запросы к Travelline идут с таймаутом и повторами; брони обрабатываются с ограничением параллелизма. Если новые ключи сверки не заданы в конфиге — используются значения по умолчанию.
Ошибки обработки — повтор с backoff до Service:MaxRetryAttempts; после исчерпания попыток событие переходит в статус Dead. Отсутствие телефона у взрослого гостя (legacy-сценарий) может потребовать ручного вмешательства (NeedsManual).
| База | Назначение |
|---|---|
Service DB (ConnectionStrings:DefaultConnection) |
Очередь событий, BookingSync, аудит, ручные вмешательства. Миграции EF Core применяются при старте |
БАРС / KSO (Bars:ConnectionString) |
PersonalInfo, SuperAccount, AccountStock (абонементы), транзакции выдачи; при WriteControlTape — также [Check] / [CheckDetail] |
При Bars:UseStub=true запись в БАРС не выполняется (режим разработки).
| Режим | Travelline:UseStubApi |
Bars:UseStub |
Назначение |
|---|---|---|---|
| Локальная разработка | true |
true |
Без внешних систем |
| Тестовый контур | true |
false |
Реальная запись в БАРС, фиктивные брони Travelline |
| Промышленный | false |
false |
Реальный OAuth Travelline и запись в БАРС |
GET /health/ready — ответ Healthy.webpms:check_in с новым eventId.accepted=1, затем обработка outbox (ClientResolved, StockAttached или аналог).TravellineEvent со статусом Processed.Bars:UseStub=false — новый клиент и абонемент в БАРС; в выписке ЛС — «Приобретение товаров и услуг»; при включённой контрольной ленте — запись на кассе PMS.cancel_check_in → повторный check_in (новый активный абонемент); удаление гостя из guestsIds (деактивация его абонемента).Сверка Travelline завершена.Подробный сценарий тестового контура — в docs/test-contour.md.