Архитектура ISP (OSS/BSS)
Customer Core Service
Единый источник правды о клиентах, контактах, договорах, адресах и партнёрах.
Customer Core Service
Bounded Context: Customer Management
Владелец данных: Customer, Contract, Contact, Address, Partner
Технологии: NestJS (Bun 1.3+), Drizzle ORM, PostgreSQL, ConnectRPC, RabbitMQ, BullMQ
Ответственность
Customer Core — единый источник правды о клиентах и партнёрах. Это CRM-ядро платформы, аналог модулей Customers в Splynx и Абоненты в Hydra Billing. Сервис объединяет:
- CRM: Профили клиентов (физлица / юрлица), контакты, история взаимодействий, теги, сегменты.
- Contracts: Договоры, статусы, подписание, расторжение, автоматическая нумерация.
- Address: Адреса абонентов, привязка к ФИАС, зоны покрытия, проверка технической возможности (availability check).
- Partners: Дилеры, реселлеры, иерархия партнёров, партнёрские комиссии.
- KYC (Know Your Customer): Верификация персональных данных (паспорт, ИНН) при заключении договора.
Бизнес-правила Customer Lifecycle
| Этап | Описание | Событие |
|---|---|---|
| Lead | Первичная заявка, ещё не клиент | — |
| Prospect | Проверена техвозможность, готов к подключению | customer.created |
| Active | Договор подписан, есть активные подписки | contract.signed |
| Suspended | Все подписки приостановлены (dunning) | — (управляет Billing) |
| Churned | Договор расторгнут, данные в архиве | contract.terminated |
Агрегат: Customer
Loading diagram...
Правила агрегата:
- Создание/изменение Contact и Contract — только через Aggregate Root
Customer. - При удалении Customer — каскадная анонимизация (ФЗ-152), не физическое удаление.
innуникален для юрлиц, для физлиц может отсутствовать.
ConnectRPC API
service CustomerService {
rpc GetCustomer(GetCustomerRequest) returns (GetCustomerResponse);
rpc ListCustomers(ListCustomersRequest) returns (ListCustomersResponse);
rpc SearchCustomers(SearchCustomersRequest) returns (SearchCustomersResponse);
rpc CreateCustomer(CreateCustomerRequest) returns (CreateCustomerResponse);
rpc UpdateCustomer(UpdateCustomerRequest) returns (UpdateCustomerResponse);
rpc SignContract(SignContractRequest) returns (SignContractResponse);
rpc TerminateContract(TerminateContractRequest) returns (TerminateContractResponse);
rpc CheckAvailability(CheckAvailabilityRequest) returns (CheckAvailabilityResponse);
rpc ListServiceAreas(ListServiceAreasRequest) returns (ListServiceAreasResponse);
}| Метод | RBAC | Описание |
|---|---|---|
GetCustomer | isp-viewer+ | Получить клиента по ID (включая контакты, договоры) |
SearchCustomers | isp-viewer+ | Полнотекстовый поиск по ФИО/ИНН/телефону (pg_trgm) |
CreateCustomer | isp-operator+ | Создать клиента + контакты + адрес (атомарно) |
UpdateCustomer | isp-operator+ | Partial update, с audit log |
SignContract | isp-operator+ | Подписать договор → event contract.signed |
TerminateContract | isp-operator+ | Расторгнуть → event contract.terminated |
CheckAvailability | isp-viewer+ | Проверка техвозможности (делегирует в Inventory) |
Доменные события
Exchange: customer.events (Topic)
| Routing Key | Событие | Потребители |
|---|---|---|
customer.created | CustomerCreatedEvent | Billing (создать Account), Notification (welcome) |
customer.updated | CustomerUpdatedEvent | Analytics |
contract.signed | ContractSignedEvent | OMS (инициировать подключение) |
contract.terminated | ContractTerminatedEvent | Billing (финальный счёт), OMS (деактивация) |
Зависимости
Loading diagram...
- Исходящие: ConnectRPC → Inventory (CheckAvailability делегация). Events → Billing, OMS, Notification.
- Входящие: BFF → Customer Core (все CRUD-операции).
База данных
- PostgreSQL (отдельная БД
customer_core_db) - Расширения:
pg_trgm(полнотекстовый поиск),uuid-ossp - Миграции: drizzle-kit
- Индексы: GIN-индекс на
full_name, B-tree наinn,phone
Background Jobs (BullMQ)
| Job | Расписание | Описание |
|---|---|---|
customer.anonymize | По запросу | Анонимизация ПДн (ФЗ-152) |
customer.deduplicate | Ежедневно, 04:00 | Поиск дублей по ФИО+телефон |
Ссылки:
- Protobuf-контракт: customer/v1/customer_service.proto
- Слой BSS: BSS Layer
- Legacy маппинг: Маппинг Legacy CRM