Границы сервисов PIN
Карта 21 bounded contexts, владение данными и интеграционные потоки. Детальные ТЗ —
docs/06-services/<context>/; принятые решения — technical-assignment.md.
Context map
Владение данными (source of truth)
| Контекст | Владеет (агрегаты) | Читает у других |
|---|---|---|
identity | Company, User, Role, Permission, RolePermission, UserRole, scope-назначения; AgentMembership (мульти-членство: несколько активных агентств, active-agency-контекст → tenant_id, self-leave/terminate — ADR-0070/0072) | Talent Identity (sync-реплика) |
profile | PersonalProfile, ContactInfo, Document (шифрованные), RequisiteTemplate, VerificationRequest | identity (UserId), handbook (страны/города — resolve) |
chessboard | Developer, Project, Building, Flat/Lot, Layout, LayoutGroup, Bank, Hotelier, статусы объектов | Talent Chessboard (sync), handbook (справочники), crm (смена статуса — событиями) |
handbook | CountryEntity, RegionEntity, CityEntity, CurrencyEntity, LanguageEntity, HandbookSyncState + snapshot-модели (ACL-реплика Talent Handbook, PostgreSQL-only, не tenanted — ADR-0063) | Talent Handbook (sync-реплика) |
catalog | Проекции витрины, оверрайды отображения, ранжирование, поисковые Elasticsearch-проекции (ADR-0059) | chessboard, invest-analytics, rewards, promotion, identity |
promotion | PromotionPackage, Promotion (полиморфный таргет: проект / объект недвижимости / агент / пост), приоритеты показа, статусы (ADR-0060) | chessboard, identity, news (посты-таргеты) |
invest-analytics | История цен (ClickHouse), эконом-модель (model/lot-type/month), расчётные серии | chessboard (объекты), Talent Chessboard (цены) |
rewards | Scoped + time-bounded ставки (застройщик/проект/группа планировок, удержание ПИН, распределение агентство↔агент, реферальная — ADR-0068), комиссионная политика агентства, начисления/выплаты, гейт получения денег (MoneyReceived — ADR-0067) | chessboard (Layout), crm (сделки, участники), identity (членство агента — user-centric метрики) |
wallet | WalletAccountEntity (счета по видам: AgentCommission/ReferralCommission/AgencyCommission + системные PlatformSettlement/PlatformRevenue), LedgerTransactionEntity/LedgerEntryEntity (двойная запись, append-only — ADR-0005/0065); счета user-centric (переживают смену агентства) | rewards (проводки: кредиты/дебеты/компенсации), identity (display-реплика холдеров) |
referral | ReferralLink, ReferralRegistration, реферальная связь | identity (регистрация/авторизация) |
crm | Лид, Заявка на фиксацию, Сделка, Клиент; единая модель участников (Executor — ровно один активный исполнитель; additive CoAgent/Assistant/Lawyer; несколько инвесторов; иммутабельные снапшоты AgencyCompanyId/AgentUserId как атрибуция — ADR-0071); Бронирование, Программа бронирования, Программы покупки, Документы сделки, таймлайн | identity (active-agency → tenant, увольнение агента — ADR-0072), chessboard (объект), profile (реквизиты), referral, calendar (записи на встречу) |
calendar | CalendarEventEntity (+ EventReminderEntity), AvailabilitySlotEntity, AppointmentEntity; реплики сделок CRM (маршрутизация дедлайнов) и display-данных пользователей (ADR-0064) | crm (сделки/брони/участники — событиями), identity (display-реплика) |
investor-owner | Объект инвестора (портфель), сопоставление Owner↔Investor | Talent Owners, crm (завершение сделки), invest-analytics |
news | Post (блоки typed jsonb), snapshot-история, категории | selections (копия подборки), identity (автор/категории) |
favorites | Favorite (user/session, заметка) | chessboard/catalog (объект), user-activity (сессия) |
selections | Selection, элементы, публичные ссылки, копии для постов | favorites, chessboard/catalog |
user-activity | Session (Status, LastActivityAt), LotView (длительность просмотра), LotViewStats (агрегаты: сколько раз/как долго на лот), ActionEvent (фильтры/действия), anonymous_id — PostgreSQL-only, закрытие polling-delta (ADR-0056) | identity (связывание при входе) |
messenger | Chat, Message (история правок, IP/UA), Participant, Contact, ChatEvent (TPH), чёрный список; realtime — SignalR-hub (ADR-0055) | crm (сделка/участники), identity |
notifications | NotificationTemplate, DispatchLog, каналы/подписки | все (события) |
support | Ticket, очередь, ArbitrageCase, KnowledgeBase, шаблонные ответы | crm/identity/messenger (через permissions) |
dev-stats | ClickHouse: lot_view_facts (PARTITION месяц, ORDER BY Developer→Project→Building→LayoutGroup→Layout→Lot→ViewedAt, TTL 3 года) + дневные rollup-ы; реплика измерений шахматки (ADR-0057) | user-activity (события просмотров/сессий), chessboard (справочники) |
Поиск. Полнотекстовый поиск каталога — Elasticsearch-проекции (ADR-0059, канон
Talent.Common.Domain.Searchповерх Elasticsearch);catalogдержит rebuildable search-документы, PostgreSQL-FTS не самостоятельный движок.
Ключевые интеграционные потоки (Kafka, pin.<context>.<event>.v1)
| Поток | Producer → Consumer | Назначение |
|---|---|---|
| Компании/пользователи Talent | Talent Identity → identity | Создание CompanyEntity/UserEntity (реплики) |
| Справочники Talent | Talent Handbook → handbook | Синк стран/регионов/городов/валют/языков (ACL-реплика, ADR-0063) |
| Справочники PIN | handbook → chessboard, profile, crm (реплики/resolve) | Локальные реплики справочников; write-path-валидация |
| Объекты/цены Talent | Talent Chessboard → chessboard, invest-analytics | Синк каталога; append-only история цен |
| Членство агента | identity → rewards, wallet | Мульти-членство/увольнение (ADR-0070/0072); user-centric метрики агента, display-реплика холдеров |
| Реферальная привязка | referral → crm, messenger, notifications | Создание лида, контакт, СМС |
| Заявки (консультация/бронь/презентация) | catalog/front → crm | Лид + события в лиде |
| Статус объекта | crm (booking) → chessboard, catalog | Резерв/Бронь/Продан + таймеры |
| Жизненный цикл сделки | crm → messenger, notifications, rewards, investor-owner, calendar | Чат сделки, уведомления, комиссия (получатель = активный Executor, ADR-0069 v1), объект собственника, дедлайны/маршрутизация в календаре |
| Расписание и записи | crm ↔ calendar | CRM → сделки/брони/участники (дедлайны, переназначение владельца); calendar → запись на встречу/исход (get-or-create клиента/лида, лента лида — ADR-0064) |
| Проводки кошелька | rewards → wallet | Кредит после гейта MoneyReceived (ADR-0067), дебет по выплате, компенсации; двойная запись (ADR-0065) |
| Действия пользователя | user-activity → crm (карточка лида) | Проброс просмотров/фильтров агенту |
| Статистика просмотров | user-activity → dev-stats (ClickHouse facts) | Метрики/графики застройщика: кто/сколько/как долго/как часто (3 года) |
| Публикация поста | news ← selections (копия) | Блок-подборка в посте |
| Продвижение (полиморфный таргет) | promotion → catalog, news | Приоритет показа в витрине; промо-блоки в ленте |
Особые границы
- Мессенджер — собственный мини-мессенджер PIN (ADR-0055): REST + SignalR-hub.
- Админ-система — за пределами
identity(ADR-0053): отдельные API/фронт; здесь только граница.
Правила границ
- Контекст не читает чужие таблицы; только API/события/реплики. Cross-context — через
IKafkaEvent+outbox. - Каждый контекст = свой набор проектов
Pin.<Context>.{Domain,Application,Infrastructure,Api,Background,Migrator}поверхTalent.Common.*; namespacePin.<Context>.<Aggregate>. - Изменение границ — только через ADR.
Обратные ссылки
Автоссылки: где используется этот документ.
- Домен (CQRS) (3): Entity / Aggregate: BookingEntity, Entity / Aggregate: CallSessionEntity — сигналинг и лог звонка (media отложен), Entity / Aggregate: ReferralBondEntity
- API (5): GET /api/internal/user-activity/users/{userId}/property-object-activity — Активность инвестора по объектам недвижимости (карточка лида CRM), GET /api/internal/user-activity/users/{userId}/property-objects/view-stats — Батч просмотров инвестора по объектам недвижимости (обогащение карточек CRM), GET /api/internal/user-activity/users/{userId}/timeline — Хронология действий пользователя (карточка лида CRM), POST /api/agent/crm/bookings/{bookingId}/cancel — Отменить бронь, POST /api/agent/crm/bookings/{bookingId}/confirm — Подтвердить бронь (бесплатная программа)
- Use Cases (3): UC-ACT-004. Агент/менеджер видит активность инвестора (для карточки лида), UC-CRM-019. Агент просматривает каталог в контексте инвестора активного лида, UC-REF-006. Ссылка от инвестора (не агента/застройщика) → связь без лида (модификатор R5)
- События (7): Event Contract: pin.crm.booking-cancelled (BookingCancelledEvent), Event Contract: pin.crm.booking-confirmed (BookingConfirmedEvent), Event Contract: pin.crm.booking-created (BookingCreatedEvent), Event Contract: pin.crm.booking-expired (BookingExpiredEvent), Event Contract: pin.referral.bond-closed (ReferralBondClosedKafkaEvent), Event Contract: pin.referral.bond-created (ReferralBondCreatedKafkaEvent), Event Contract: pin.user-activity.action-tracked (ActionTrackedKafkaEvent)
- Консюмеры (1): Consumer: Talent Chessboard Sync (pin-chessboard-talent-sync)
- Фоновые задачи (1): Background Job: BookingExpirationJob
- Саги (1): Saga «Booking» (Резерв → Бронь → передача в продажу)
- adr (3): ADR-0060: Продвижение — отдельный bounded context promotion (полиморфный таргет); catalog и news — консюмеры буста, ADR-0063 — справочники pin.handbook (репликация из Talent Handbook), ADR-0064 — контекст calendar (календарь и запись на показ/консультацию)
- index.md (15): Документация PIN, Calendar Service, Chessboard Service (Pin.Chessboard), CRM Service, DevStats Service (Pin.DevStats), Handbook Service, Messenger Service, News Service (Pin.News), Notifications Service, Profile Service (Pin.Profile), Referral Service, Rewards Service (+3)
- glossary.md (1): Глоссарий PIN
- registries (1): Реестр сущностей PIN