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

События

Правила

  • Финансовые события публикуются только после commit транзакции.
  • События не содержат полный PII payload.
  • Входящие события обрабатываются идемпотентно через crm_sync_logs.
  • Payment webhooks имеют отдельный журнал crm_payment_webhooks.
  • Entitlement events являются решением CRM, но целевой домен подтверждает фактическое открытие доступа.

Общий envelope

type CrmEvent<TPayload> = {
messageId: string;
messageKind: 'event';
messageType: string;
messageVersion: number;
producer: 'crm';
producerInstance: string;
traceId: string;
occurredAt: string;
correlationId?: string;
actor?: {
type: 'user' | 'service' | 'system';
id?: string;
};
data: TPayload;
metadata?: Record<string, unknown>;
};

Исходящие события

EventКогдаPayload
crm.account.createdсоздан accountaccountId, type, ownerUserId
crm.lead.createdсоздан leadleadId, accountId, source
crm.lead.convertedlead convertedleadId, accountId, dealId
crm.deal.createdсоздана сделкаdealId, accountId, leadId
crm.deal.wonсделка выигранаdealId, accountId, amount
crm.deal.lostсделка проигранаdealId, accountId, reason
crm.order.confirmedзаказ подтверждёнorderId, accountId
crm.invoice.issuedсчёт выставленinvoiceId, accountId, amount
crm.invoice.paidсчёт полностью оплаченinvoiceId, accountId, paidAt
crm.invoice.overdueсчёт просроченinvoiceId, accountId, dueAt
crm.payment.failedплатёж не прошёлpaymentId, invoiceId, reason
crm.payment.succeededплатёж успешенpaymentId, invoiceId, accountId, amount
crm.refund.createdсоздан возвратrefundId, paymentId, amount
crm.refund.succeededвозврат успешенrefundId, paymentId, amount
crm.balance.updatedизменился балансaccountId, entryId, type, amount
crm.entitlement_balance.overdrawnentitlement ушёл в отрицательный баланс потребленияentitlementId, accountId, balance
crm.entitlement.activatedдоступ активированentitlementId, targetDomain, targetRef
crm.entitlement.suspendedдоступ приостановленentitlementId, reason
crm.entitlement.resumedдоступ возобновлёнentitlementId
crm.entitlement.expiredсрок доступа истёкentitlementId, expiredAt
crm.entitlement.revokedдоступ отозванentitlementId, reason
crm.ticket.createdсоздано обращениеticketId, accountId
crm.teacher_payout.approvedвыплата утвержденаpayoutId, teacherUserId, amount
crm.teacher_payout.paidвыплата проведенаpayoutId, teacherUserId, paidAt

Входящие события

ИсточникСобытиеИспользование
storefrontstorefront.form_submission.receivedсоздать lead/account
storefrontstorefront.form_submission.forwardedсвязать submission и lead
identityuser/family/contact updatesобновить person links/read-model
LMSenrollment/progress summary eventsпоказать учебный summary в карточке
competitionsregistration/payment required eventsсоздать order/invoice/entitlement
payment providerwebhookpayment/refund status
managementtask/action eventsCRM task/timeline linkage

Payload examples

crm.payment.succeeded

type CrmPaymentSucceededPayload = {
paymentId: string;
invoiceId?: string;
accountId: string;
amount: {
amount: string;
currency: 'RUB';
};
paidAt: string;
};

crm.entitlement.activated

type CrmEntitlementActivatedPayload = {
entitlementId: string;
accountId: string;
purchaserUserId?: string;
beneficiary: {
type: 'student_profile' | 'user' | 'family_group' | 'organization' | 'manual';
ref?: string;
};
enrollmentSubject?: {
type: 'student_profile' | 'user' | 'organization_student' | 'manual';
ref: string;
};
productRef: string;
targetDomain: 'lms' | 'competitions' | 'task-bank';
targetRef?: string;
startsAt?: string;
endsAt?: string;
};

Идемпотентность

СценарийКлюч
storefront leadstorefront:{submissionId}
payment webhookprovider:{provider}:event:{providerEventId}
payment successpayment:{provider}:{providerPaymentId}:succeeded
entitlement syncentitlement:{entitlementId}:status:{status}
payroll calculationteacher:{teacherUserId}:period:{periodStart}:{periodEnd}

Retention

ДанныеСрок
financial events7 лет
payment webhook payload3 года, с redaction, если не является финансовым первичным событием
CRM timeline5 лет
support tickets3 года после закрытия
audit logs7 лет
payroll events7 лет