Перейти к основному содержимому

Кросс-сервисные сценарии PIN (OVR)

Дом сквозных бизнес-сценариев (UC-OVR-*), которые связывают несколько bounded contexts, правил, событий и пользовательских шагов в единый поток. Отдельные сервисные шаги живут в docs/06-services/<context>/use-cases/; здесь — их оркестрация и события между сервисами.

Структура каждого документа — по system-scenario-template (акторы, участвующие сервисы, sequenceDiagram, ссылки на сервисные UC, интеграционные события). Префикс OVR — см. use-case-template; реестр — use-cases-index.md.

Реестр сценариев

IDСценарийКлючевые контекстыДокумент
UC-OVR-001Запрос консультации у агента недвижимостиcatalog → crm → identity → referral → notificationsUC-OVR-001
UC-OVR-002Запрос консультации у инвест-консультанта ПИН (+2a)catalog → crm → identity → notificationsUC-OVR-002
UC-OVR-003Бронирование объекта у агента (+3a)catalog → crm/booking → chessboard → notificationsUC-OVR-003
UC-OVR-004От реферальной ссылки до объекта у собственникаreferral → crm → chessboard → investor-ownerUC-OVR-004
UC-OVR-005От лида до сделки (4 фазы)crm (lead → fixation → deal)UC-OVR-005
UC-OVR-006Сделка: от брони до регистрации (инвестор-инициатор)crm/booking → chessboard → crm/dealUC-OVR-006
UC-OVR-007Просмотр каталога «глазами инвестора» (impersonation)identity → catalog → favorites → user-activityUC-OVR-007
UC-OVR-008Агент выходит из агентства, сохраняя метрикиidentity → crm → rewards → catalog/chessboardUC-OVR-008
UC-OVR-009Продвижение поста / объекта недвижимостиpromotion → catalog → news → notificationsUC-OVR-009
UC-OVR-010От завершённой сделки до выплаты комиссии и реферального вознагражденияcrm → rewards → wallet → notificationsUC-OVR-010
UC-OVR-011Самозапись инвестора: от слота до исхода встречи и лида в воронкеcalendar → crm → identity → notificationsUC-OVR-011

Как читать

  • «Участвующие сервисы» — таблица Scope И Участники: кто владеет данными, кто оркеструет, кто потребляет.
  • Стрелки на sequenceDiagram — синхронные вызовы (API/internal) и асинхронные интеграционные события (pin.<context>.<event>.v1; надёжная доставка — ADR-0006).
  • Каждый шаг ссылается на конкретный сервисный UC/эндпоинт/событие — сценарий сам логику не дублирует.
  • Каждый сценарий несёт Предусловие (что истинно до), Постусловие (что гарантированно после — какие сущности/статусы изменились, какие события ушли) и Acceptance Criteria (Given/When/Then на happy path, ключевые edge-cases и отказы). Читать сценарий как контракт «вход → гарантированный результат».

Синхронно, асинхронно, окно согласованности

Внутри одного сценария смешаны два вида взаимодействия — их важно различать при реализации и тестировании:

  • Синхронные вызовы (сплошная стрелка ->> к API/internal-эндпоинту): результат виден вызывающему сразу, ошибка возвращается кодом (4xx/5xx) в том же обращении. Пример: crmidentity get-or-create, crmreferral правила привязки.
  • Асинхронные события (стрелка -->> через «Шину событий»): публикуются атомарно со сменой состояния агрегата-издателя (до фиксации событие не уходит; после — доставка гарантированная, at-least-once). Потребитель применяет эффект с задержкой — окно eventual-consistency. В этом окне пользователь видит прежнее состояние у контекста-потребителя (напр. объект в шахматке ещё «Свободен», пока chessboard не обработал booking-created). Типовые окна (SLA обработки): статус объекта в chessboard и буст в catalog/news — < 1 мин; уведомления и карточки в чате — < 5 мин.

Сквозные гарантии и конвенции

  • Порядок и ключ партиционирования. Порядок событий гарантирован per-aggregate ключом Kafka: лид — LeadId, бронь — BookingId, завершение сделки — DealId, реф-связка (bond) — ReferredUserId, членство агента — AgentUserId, продвижение — PurchaseId. Между разными агрегатами глобального порядка нет — сценарии не должны на него закладываться.
  • Идемпотентность. Lazy-регистрация инвестора идемпотентна по телефону; повтор публичной заявки в окне дедупликации → 409 DUPLICATE_PHONE; потребители дедуплицируют по MessageId, терминальные эффекты — по бизнес-ключу агрегата (объект в портфель / комиссия — first-seen по DealId); при повторной доставке эффект не дублируется.
  • Version-guard и конкурентность. Проекции статусов/бустов держат монотонный Version-guard: событие с версией ≤ применённой игнорируется (защита от переупорядочивания и повторов). Конкурентная правка одной сущности разрешается оптимистической блокировкой — проигравший получает 409 CONCURRENCY_CONFLICT и повторяет на свежем состоянии.
  • Единственный владелец статуса объекта. Статус объекта недвижимости меняет только chessboard и только по событиям crm; другие контексты его не пишут (защита от двойной брони/рассинхрона).
  • Иммутабельные снапшоты и атрибуция. AgentUserId/AgencyCompanyId в лидах/фиксациях/сделках — иммутабельны; back-fill при смене членства агента запрещён (ADR-0061). User-centric метрики агрегируются по AgentUserId и переживают смену компании.
  • PII не в событиях. Интеграционные события несут id-ссылки и бизнес-факты без ФИО/телефона; display-данные потребители берут из собственной реплики pin.identity.users.v1, в логах маскируют (+7***1234).

Связанные документы