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

Модель данных

Зачем нужно

Документ описывает канонические сущности CRM: account, contacts, leads, deals, products, price plans, billing, balance, entitlement, support, payroll и audit.

Правила модели

  • Каждая сущность имеет id, created_at, updated_at, если явно не указано иначе.
  • Ссылки на соседние домены хранятся как external refs, а не FK.
  • Финансовая история append-only: исправление через adjustment/refund, не через удаление.
  • PII хранится минимально и маскируется в логах.
  • Все финансовые и чувствительные ручные действия пишутся в audit.
  • Покупатель, плательщик, получатель продукта и учебный субъект разделены. CRM не должна считать, что purchaser = payer = beneficiary = enrollment subject.

Коммерческие роли в покупке

ПонятиеНазначениеВозможная ссылка
purchaserпользователь, инициировавший покупкуuser_id
payerплатёжный субъект или контакт оплатыbilling account / crm_person_link
beneficiaryполучатель продуктаstudent_profile_id, user_id, family_group_id
enrollment subjectучебный субъект для LMS/competitionsstudent_profile_id или другой учебный subject

Покупатель и получатель могут совпадать, но не обязаны совпадать: взрослый может купить продукт ребёнку, ребёнок с linked user может купить продукт себе, а будущий семейный продукт может назначаться на family_group.

Клиентская карточка

crm_account

Клиентская единица.

ПолеНазначение
typefamily, person, organization, lead
display_nameрабочее имя карточки
statusnew, active, paused, archived, blocked
owner_user_idответственный менеджер
risk_flagsдолг, спор, VIP, duplicate

Связь account с человеком.

Роли: payer, student, parent, teacher, contact, guardian.

crm_contact

Контакт: email, phone, messenger, address. Контакт может быть связан с account или person link.

Products and pricing

CRM владеет коммерческой упаковкой обучения и событий. Продукт не равен LMS course, LMS roadmap topic, competition season или storefront catalog item.

product_type

Справочник типов коммерческой упаковки.

Примеры: course, mini_group, intensive, circle, individual, competition, training_set, consultation.

product

Коммерческая единица, которую можно продавать, включать в заказ и показывать на витрине через read-model.

ПолеНазначение
type_idтип продукта
slugстабильный ключ для CRM/storefront
titleкоммерческое название
statusdraft, active, paused, archived
target_domainдомен исполнения: lms, competitions, task-bank, manual
target_refссылка на course, season, service или другой объект исполнения
roadmap_refsLMS refs на roadmap program/module/topic/pathway, которые продукт помогает пройти
default_entitlement_policyправило выдачи доступа

roadmap_refs не делают CRM владельцем учебной программы. CRM описывает коммерческий способ прохождения фрагмента roadmap, а LMS остаётся владельцем topic progress, completion, scheduled educational facts и evidence.

product_run

Конкретный запуск продукта: поток, сезон, набор, дата старта или окно набора.

ПолеНазначение
product_idпродукт
titleназвание запуска
starts_at, ends_atпериод
capacityограничение мест
lms_delivery_refsссылки на LMS group/session/course version/track, если запуск календарный
statusplanned, open, closed, running, finished, cancelled

product_run может указывать на LMS group, session, course version или track, но не хранит attendance, progress или completion.

price_plan

Правило цены для продукта или запуска.

ПолеНазначение
product_id, product_run_idобласть применения
titleназвание тарифа
amount, currencyцена
billing_modeone_time, subscription, installment, manual
statusdraft, active, retired
valid_from, valid_toпериод действия

Продажи

crm_lead

Потенциальный клиент.

ПолеНазначение
sourcestorefront, call, referral, manual, import
statuslead lifecycle
campaign_refкампания или UTM
payloadминимальный безопасный контекст

crm_deal

Продажная возможность.

crm_order

Оформленный заказ на продукт, услугу, олимпиаду или пакет. Order связывает deal, account, purchaser/payer, beneficiary и invoice.

ПолеНазначение
account_idCRM account
deal_idoptional сделка
purchaser_user_ididentity user, инициировавший покупку, если известен
payer_person_link_idCRM person link плательщика или контакт оплаты
beneficiary_type, beneficiary_refполучатель продукта: student_profile, user, family_group, organization, manual
enrollment_subject_type, enrollment_subject_refучебный subject, если отличается от beneficiary
statusdraft, confirmed, cancelled, fulfilled
amount_total, currencyprice snapshot заказа

crm_order_item

Позиция заказа: product_id, optional product_run_id, price_plan_id, quantity, price snapshot, discount.

Биллинг

crm_invoice

Счёт к оплате.

ПолеНазначение
account_idклиент
order_idзаказ
statusdraft, issued, partially_paid, paid, overdue, cancelled, void
amount_totalсумма
amount_paidоплачено
currencyвалюта
due_atсрок оплаты

crm_payment

Факт платежа.

Правила:

  • provider payment id уникален внутри provider;
  • webhook idempotency key обязателен;
  • successful payment создаёт balance entry;
  • payment не редактируется после success, кроме ссылок на refund/metadata.

crm_refund

Возврат.

Возврат имеет причину, ссылку на payment, сумму, status и audit. Возврат может быть частичным.

crm_adjustment

Ручная финансовая корректировка: скидка, списание долга, перенос баланса, исправление ошибки.

crm_balance_entry

Append-only строка баланса.

Типы: invoice_debit, payment_credit, refund_debit, adjustment_credit, adjustment_debit, writeoff.

Entitlement

crm_entitlement

Операционное право доступа.

ПолеНазначение
account_idклиент
purchaser_user_idкто инициировал покупку, если известен
beneficiary_type, beneficiary_refполучатель продукта: student_profile, user, family_group, organization, manual
enrollment_subject_type, enrollment_subject_refучебный subject для домена исполнения, если применимо
product_refпродукт или offer
target_domainlms, competitions, task-bank
target_refкурс, сезон, набор или service access
statuspending, active, suspended, expired, revoked
source_type, source_idinvoice/payment/manual/order
starts_at, ends_atпериод действия

Entitlement не является LMS enrollment. CRM принимает решение о доступе и публикует событие или command для домена-владельца.

crm_entitlement_consumption_log

Append-only журнал фактического потребления доступа, инициированного LMS, competitions или task-bank.

ПолеНазначение
entitlement_idправо доступа CRM
consumer_domainдомен, который сообщил потребление
consumer_refsession, attendance, attempt, tour participation или другой объект
quantityсколько списано
statusrecorded, reverted
occurred_atкогда произошло потребление

Support и коммуникации

crm_interaction

Коммуникация: call, email, message, meeting, note.

crm_ticket

Обращение support/operations.

crm_note

Внутренняя заметка. Может иметь visibility: internal, support, finance, restricted.

Payroll

crm_teacher_rate

Ставка преподавателя с периодом действия и правилом расчёта.

crm_payable_activity

Факт, который может стать начислением: занятие, проверка, замена, консультация.

crm_payroll_period

Расчётный период.

crm_payroll_item

Строка начисления: activity, rate, amount, source snapshot.

crm_teacher_payout

Итоговая выплата преподавателю: status, approval, amount, adjustments.

Интеграции и audit

crm_sync_log

Журнал интеграционной обработки: source, event id, status, retry, error.

crm_audit_log

Аудит действий: actor, action, entity, before/after, request id.