GET /api/pin-manager/crm/deals/{dealId} — Карточка любой сделки (Менеджер ПИН)
Read-модель карточки сделки для Менеджера ПИН: менеджер ПИН — авто-участник всех сделок платформы
(ParticipantRole.PinManager, US-MGR-01) и читает любую сделку любого застройщика без ограничения по
tenant (платформенный scope), видя привилегированные данные — полный номер эскроу-счёта и все документы,
включая PII (ClientPassport/ContractDraftDocument), — для проверки и ручного вмешательства
(US-MGR-02/04). Только чтение: дом полей сделки — deal.md, документов —
deal-document.md; здесь описана лишь дельта проекции карточки застройщика
(developer/get-deal.md) и алгоритм её сборки.
Назначение
Отдаёт Менеджеру ПИН единую карточку одной сделки по dealId без ограничения по tenant (платформенный
scope): статус/этап, снимок объекта и цены, ФИО/телефон клиента, условия оплаты и договора, банк и полный
номер эскроу-счёта, полный состав участников и все документы сделки любых типов, включая персональные
(ClientPassport, ContractDraftDocument) — для проверки и ручного вмешательства (US-MGR-02/04). Менеджер
ПИН — авто-участник всех сделок (ParticipantRole.PinManager, US-MGR-01) и привилегированная сторона по
deal.md (полный эскроу) и deal-document.md
(PII-документы). Только чтение. Таймлайн «Ход сделки» и скачивание файлов — отдельные методы; вкладки «Об
объекте недвижимости»/«О проекте» — данные chessboard.
Metadata
| Поле | Значение |
|---|---|
| Сервис/контекст | crm |
| API area | pin-manager |
| Feature group | deals |
| Статус | draft |
| Документ | docs/06-services/crm/api/pin-manager/get-deal.md |
Актор и доступ
| Проверка | Значение |
|---|---|
| Actor type | User (Менеджер ПИН; Служба заботы — read-only через ту же проекцию) |
| Auth policy / Permissions | crm.deals.view, platform-scope claim Менеджера ПИН (US-MGR) |
| Scope (RBAC) | платформа — кросс-tenant, любой DeveloperCompanyId |
| Record-level | не применяется (сквозная видимость всех сделок; Менеджер ПИН — авто-участник, US-MGR-01) |
| Tenant isolation | запрос не tenanted: чтение сквозное, без tenant-предиката (platform-scope, ADR-0052) |
| Audit | read-sensitive: доступ Менеджера ПИН к полному эскроу и PII-документам логируется как факт; сами значения (номер счёта, PII) в логи не пишутся, телефон — маска |
Менеджер ПИН читает любую сделку любого DeveloperCompanyId без tenant-предиката (platform-scope,
US-MGR-01, ADR-0052) — Служба заботы имеет тот же read-only доступ через эту проекцию. Полный номер
эскроу-счёта и все документы (включая PII-типы ClientPassport/ContractDraftDocument) отдаются без
маскирования: доступ read-sensitive — факт обращения логируется, а сами значения (номер счёта, PII) в логи
не пишутся, телефон клиента — маской.
HTTP-контракт
| Поле | Значение |
|---|---|
| Method | GET |
| Route | /api/pin-manager/crm/deals/{dealId} |
| Success status | 200 |
| Idempotency header | не применяется (безопасный GET) |
| Correlation | сквозной trace через заголовок traceparent |
Входные данные / параметры запроса
| Поле | Источник | Тип | Обязательность | Валидация / Ограничения | Безопасность |
|---|---|---|---|---|---|
DealId | route | Guid | Да | != Guid.Empty; сделка любого tenant (шаг 3) | — |
ActorUserId | identity claims | Guid | Да | JWT Менеджера ПИН (platform-scope) | audit/логи |
TenantId в запрос не передаётся: доступ платформенный, сделка выбирается только по DealId.
Модель ответа DealCardModel
Возвращается та же проекция DealCardModel, что и в карточке застройщика — полный дом полей и под-моделей
(MoneyModel, DealMemberModel, DealDocumentSummaryModel) описан в
developer/get-deal.md; дом полей сущностей — deal.md (VO
Money, enum DealStatus/DealContractType/PaymentMethod/EscrowStatus/DealChatStatus),
deal-document.md, client.md. Все enum сериализуются
строкой. Ниже — только дельта привилегированного доступа Менеджера ПИН.
| Поле | Тип | Источник | Masking (Менеджер ПИН) | Описание дельты |
|---|---|---|---|---|
EscrowAccountNumber | string? | Deal.EscrowAccountNumber | полный (без маски) | Менеджер ПИН — привилегированная сторона (deal.md); наружу отдаётся полный номер, в логи не пишется. |
ClientPhoneNumber | string | ClientEntity.PhoneNumber (снимок) | полный; маска в логах | Телефон покупателя (E.164, PII). |
Documents | DealDocumentSummaryModel[] | документы сделки (шаг 3) | без фильтра по типу | Все документы, включая PII-типы ClientPassport/ContractDraftDocument (deal-document.md); скачивание файла — пресайн-ссылка storage (отдельный запрос). |
Members | DealMemberModel[] | активные DealMemberEntity (шаг 3) | — | Полный активный состав, включая PinManager (US-MGR-01). |
Прочие поля (DealId, Title, Status, StepId, StepGroup, PropertyObjectId, ProjectId, Price, PaymentMethod,
ContractType, BankId, EscrowStatus, BookingId, ChatStatus, CreatedAt, UpdatedAt и др.) — 1:1 с
developer/get-deal.md, без масок. Таймлайн в этот ответ не входит — отдельный
paged-метод (deal-timeline-event.md).
Алгоритм
- Контекст и доступ. Операцию выполняет Менеджер ПИН с permission
crm.deals.viewв platform-scope;TenantIdв запрос не передаётся (кросс-tenant, сквозной доступ). - Проверка входа и предусловий.
DealId != Guid.Empty→ иначеVALIDATION_FAILED. Чтение разрешено во всех статусах, включая терминальныеCompleted/Cancelled. Проверок tenant/record-level нет — доступ платформенный. - Что читаем. Сделку по
DealIdсквозным доступом (без tenant-предиката, читается сделка любогоDeveloperCompanyId); если сделки нет или она soft-deleted →CRM_DEAL_NOT_FOUND. Дополнительно: активных участников сделки (включаяPinManager); клиентаClientId— display-снимок ФИО/телефона (только контактные поля); все документы сделки без фильтра по типу (Менеджер ПИН видит PII-типы). Таймлайн «Ход сделки» здесь не загружается — отдельный paged-метод. - Бизнес-правила и маппинг. Переходов состояний нет (чтение). Сделка →
DealCardModel(developer/get-deal.md);Money→MoneyModel; клиент →ClientName/ClientPhoneNumber; участники →DealMemberModel[]; документы →DealDocumentSummaryModel[]. Эскроу не маскируется (Менеджер ПИН привилегирован, deal.md). Enum-поля сериализуются строкой. - Результат. Карточка
DealCardModel→ HTTP200. Данные согласованы на момент запроса; ФИО клиента — eventual-реплика изidentity,ChatStatus— eventual-проекция изmessenger. Ручные вмешательства Менеджера ПИН (смена статуса/этапа, ручная запись в таймлайн — US-MGR-02/04) выполняют отдельные операции; карточка лишь отражает их результат.
Диаграмма
Побочные эффекты
| Тип | Детали |
|---|---|
| Отдельные запросы вкладок | «Ход сделки» — таймлайн (deal-timeline-event.md); скачивание документа — пресайн-ссылка storage (Менеджер ПИН имеет доступ к PII-типам); объект/проект/банк — данные chessboard/catalog. В этот ответ не входят. |
Ошибки и failure modes
| Код | HTTP status | Условие | Сообщение | Retry |
|---|---|---|---|---|
VALIDATION_FAILED | 400 | DealId = Guid.Empty | «Некорректный идентификатор сделки» | no retry |
CRM_DEAL_NOT_FOUND | 404 | сделки нет или soft-deleted (tenant для Менеджера ПИН не ограничивает) | «Сделка не найдена» | no retry |
Предусловия и постусловия
Предусловия (истинны до сценария):
- актор — Менеджер ПИН (или Служба заботы, read-only) с permission
crm.deals.viewв platform-scope; кросс-tenant,TenantIdв запрос не передаётся; - чтение разрешено во всех статусах сделки, включая терминальные
Completed/Cancelled.
Постусловия (после запроса):
- состояние не изменяется (read-only); факт read-sensitive доступа к полному эскроу и PII-документам логируется (сами значения — номер счёта, PII — не пишутся, телефон маскируется);
- возвращена полная карточка: полный
EscrowAccountNumber(без маски), все документы включая PII-типы (ClientPassport/ContractDraftDocument), полный активный состав участников (включаяPinManager).
Кросс-сервисные ожидания (eventual-реплики). ФИО/телефон клиента — eventual-реплика из identity (допустимо отставание display-данных); ChatStatus — eventual-проекция из messenger (Pending/Provisioning/Ready/Failed, ADR-0055): до готовности чата возможен Provisioning/Pending. Ручные вмешательства (смена статуса/этапа, ручная запись) — отдельные операции; карточка лишь отражает их результат.
Acceptance Criteria
- Happy path. Дано: существующая сделка любого застройщика. Когда:
GET …/deals/{dealId}. Тогда:200, полныйEscrowAccountNumberбез маски,Documentsвключают PII-типы,MembersвключаютPinManager. - Кросс-tenant. Дано: сделка чужого
DeveloperCompanyId. Когда:GET. Тогда:200(tenant не ограничивает — platform-scope). - Терминальная сделка. Дано:
Status = Completed/Cancelled. Когда:GET. Тогда:200(чтение разрешено во всех статусах). - Чат ещё не готов. Дано: проекция
messengerдля сделки —Provisioning. Когда:GET. Тогда:200,ChatStatus = Provisioning(промежуточное eventual-состояние). - Не найдена/soft-deleted. Когда: сделки нет или она скрыта. Тогда:
404 CRM_DEAL_NOT_FOUND. - Пустой идентификатор. Когда:
DealId = Guid.Empty. Тогда:400 VALIDATION_FAILED.
Совместимость и наблюдаемость
- Новые optional поля
DealCardModel— additive (без breaking change); удаление/переименование/смена типа — breaking (migration + rollout). Enum-поля (DealStatus/ContractType/PaymentMethod/EscrowStatus/DealDocumentStatus/…) сериализуются строкой; клиент обязан толерантно обрабатывать неизвестное значение. - Logs:
pin-manager deal-card viewed(DealId, tenant сделки,ActorUserId; read-sensitive audit — факт доступа к полному эскроу/PII; сам номер счёта и PII не пишутся, телефон — маской); metrics:crm_deal_card_requests_total{result, area="pin-manager"}, latency p95 < 1 с (SLO чтений); traces — сквозной trace черезtraceparent; dashboardpin-crm.
Обратные ссылки
Автоссылки: где используется этот документ.
- Use Cases (1): UC-CRM-006. Вмешательство Менеджера ПИН
- registries (1): Реестр API-методов PIN
Связанные документы
- Модель ответа
DealCardModel(дом полей проекции): developer/get-deal.md; карточка инвестора — investor/get-deal.md. - Сущности: deal.md (дом полей, VO
Money, привилегия эскроу), deal-document.md (все типы, доступ Менеджера ПИН к PII), deal-timeline-event.md (таймлайн — отдельный paged-метод), client.md, booking.md, pipeline-step.md. - События контекста (результат отражается в карточке): deal-stage-changed, document-status-changed.
- Карта областей — README контекста; tenancy/platform-scope — ADR-0052.