G-SERVICE Docs
Архитектура 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Описание
GetCustomerisp-viewer+Получить клиента по ID (включая контакты, договоры)
SearchCustomersisp-viewer+Полнотекстовый поиск по ФИО/ИНН/телефону (pg_trgm)
CreateCustomerisp-operator+Создать клиента + контакты + адрес (атомарно)
UpdateCustomerisp-operator+Partial update, с audit log
SignContractisp-operator+Подписать договор → event contract.signed
TerminateContractisp-operator+Расторгнуть → event contract.terminated
CheckAvailabilityisp-viewer+Проверка техвозможности (делегирует в Inventory)

Доменные события

Exchange: customer.events (Topic)

Routing KeyСобытиеПотребители
customer.createdCustomerCreatedEventBilling (создать Account), Notification (welcome)
customer.updatedCustomerUpdatedEventAnalytics
contract.signedContractSignedEventOMS (инициировать подключение)
contract.terminatedContractTerminatedEventBilling (финальный счёт), 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Поиск дублей по ФИО+телефон

Ссылки:

On this page