Справочник моделей данных

NOTE

Статус: Target design. Документ описывает целевую доменную модель. Соответствующий код реализован частично (см. backend/internal/core/) или пока не начат. Правила маркировки — в 50-processes/documentation-standard.md.

Сводный реестр всех доменных моделей по Bounded Contexts. Здесь — что существует и в каком BC живёт, без бизнес-правил и инвариантов (они в файлах контекстов).

Назначение файла:

  • Точка одного взгляда: «какие сущности у нас вообще есть».
  • Источник имён для код-генерации, схем БД, событий Kafka.
  • Сверка с ubiquitous-language.md и ../GLOSSARY.md.

Подробные определения, инварианты, события, команды — в contexts/. Большая картина и context map — в domain-model.md.

Условные обозначения

  • Aggregate (🟨) — граница консистентности. Изменяется командами как единое целое.
  • Entity (E) — имеет identity, изменяется во времени, но не управляет согласованностью внешних объектов.
  • Value Object (VO) — без identity, immutable.
  • Read Model (🟩) — проекция, не источник истины.
  • Plugin / Port (⚙️) — интерфейс, реализация — за пределами BC.

Каталог

ИмяТипОписание
CanonicalProduct🟨 AggregateЕдиная единица товара. Идентифицируется identity_signature. Содержит media: [MediaAsset], certificates: [MediaAsset], external_identities: [ExternalIdentity] — набор ID из разных стандартов (ETIM class, GTIN, MPN, OKPD2). ADR-0028.
IdentityProfileEШаблон критических характеристик для группы товаров.
ManufacturerEПроизводитель (бренд). С aliases[].
ManufacturerAliasVOАлиас написания.
CharacteristicEОпределение атрибута: key, value_type, default_unit.
UnitEЕдиница измерения с to_canonical.
EquivalenceClassEГруппа взаимозаменяемых canonical products.
EquivalenceMemberVOСвязка member + source + confidence.
ClassificationTagVOСвободный тег классификации.
IdentitySignatureVOХэш-фингерпринт идентичности.
LifecycleStatusVOnew / active / deprecated / discontinued.
SupplierCharacteristicMapping🟨 AggregateACL маппинг (supplier_ref, supplier_char_code) → {Direct(tracium_key) | ViaTaxonomy(standard, external_code)}. Event-sourced. ADR-0028.
SupplierClassificationMapping🟨 AggregateACL маппинг (supplier_ref, supplier_class_code) → {Direct([tags]) | ViaTaxonomy(standard, external_code)}. Event-sourced.
SupplierManufacturerMapping🟨 AggregateACL маппинг (supplier_ref, supplier_manufacturer_code) → Manufacturer.id. Event-sourced.
IdentityStandard🟨 AggregateЗапись о federated taxonomy (ETIM v7, eCl@ss, UNSPSC, GS1 GTIN, MPN, OKPD2, …). {code, version?, domain, kind: classification|characteristic_schema|identifier|hybrid, status}. ADR-0028.
TaxonomyCharacteristicMapping🟨 Aggregate(standard_ref, external_feature_code) → Characteristic.key + unit_override?. Event-sourced. Один раз на стандарт — переиспользуется всеми поставщиками.
TaxonomyClassMapping🟨 Aggregate(standard_ref, external_class_code) → [ClassificationTag]. Multi-tag. Event-sourced.
TaxonomyValueMappingVO(standard_ref, external_value_code) → tracium_value — для enum-характеристик (ETIM EV-codes).
ExternalIdentityVO(standard_ref, external_code) — marker на CanonicalProduct.external_identities[].
MappingTargetVODiscriminated union: Direct(tracium_key) или ViaTaxonomy(standard_ref, external_code).
MappingSourceVO enumdeclared / imported / inferred / operator / moderation_accepted.
MappingConfidenceVO(score: float, method: string).

Контекст: contexts/catalog.md. Deep-dive: product-identity.md, characteristics.md. Сценарий: scenarios/supplier-dictionary-sync.md.

Предложения

ИмяТипОписание
SupplierOffer🟨 AggregateТоварная канва у конкретного поставщика. Без цен/остатков.
SupplierOfferObservation🟨 Aggregate (append-only)Наблюдение цены/остатков/срока по (offer, credential, seller_ref?). Содержит MultiCurrencyPrices + StockCurrent + StockForecast + DeliveryTerm. seller_ref опционален для marketplace observations (ADR-0026). Поддерживает мультивалютные PriceSets (ADR-0025 extended).
SkuIdentityPackVO(supplier_sku, manufacturer_article?, manufacturer_code?, client_sku?) — полный набор ID, которые вернул поставщик.
OfferCharacteristicSnapshotVOСрез характеристик от поставщика, в исходной таксономии поставщика.
PackagingVOУпаковка / единица отгрузки.
PriceSetVO(net?, gross?, list_tarif?, retail_rec?, vat_rate?, currency, on_request, validity_window?, tags?) — мульти-цена в одной валюте. Валюта обязательна. validity_window: DateRange? — для discount / promo периодов (Systeme Electric pattern). ADR-0025.
MultiCurrencyPricesVOmap<ISO4217, PriceSet> — observation хранит несколько валют параллельно (DKC: RUB + KZT). Pricing выбирает PriceSet по PricingContext.requested_currency.
PriceKindVO enumnet / gross / list_tarif / retail_rec — какое поле PriceSet считается базовой ценой в данном PricingContext.
DateRangeVO(from: timestamp?, to: timestamp?) — open-ended допустим с любой стороны.
StockCurrentVOТекущий остаток на набор складов.
WarehouseStockVO(warehouse_ref, qty, available_at).
StockForecastVO(incoming[], in_way[], backorders[]) — прогноз поступлений, транзит, заявки. См. ADR-0025.
DeliveryTermVO(lead_time_when_in_stock_days?, lead_time_when_out_of_stock_days?, production_term_days?, requires_specification, source_warehouse_ref?, notes?). Расширено ADR-0025.
PricingModeVO enumfixed / on_request. Наследуется от PriceSet.on_request.
MatchConfidenceVO enumexact / strong / probable / weak / unmatched.
RawPayloadRefVOУказатель в S3 на исходный body.
MediaAssetVO(kind, url_small?, url_large?, mime, format?, watermarked, rights_source_credential_ref?). Kind: image / video / certificate / datasheet.

Контекст: contexts/offers.md.

Загрузка данных

ИмяТипОписание
EnrichmentJob🟨 AggregateAsync-задача на опрос поставщика.
JobKindVO enumdiscovery / refresh_observation / refresh_characteristics / rebuild_supply_chain / full_catalog / stock_batch / incremental_sync / manufacturer_dictionary_refresh / characteristic_dictionary_refresh / classification_dictionary_refresh / taxonomy_dictionary_refresh / distributor_office_refresh. incremental_sync — revision/date-based delta (ADR-0029). taxonomy_dictionary_refresh — ETIM/eCl@ss/… dump (ADR-0028).
JobStatusVO enumqueued / running / awaiting_report / fetching / completed / failed / skipped. awaiting_report + fetching — для async-report паттерна (ADR-0024).
JobPriorityVO enumhigh / normal / low.
RemoteJobRefVO(uuid, provider, submitted_at, deadline) — для polling async-report.
PollStrategyVO(initial_delay, interval, max_wait, backoff).
IncrementalSyncCursor🟨 Aggregate(supplier_ref, data_scope) → {cursor_kind, cursor_value, last_applied_at, health}. data_scope: materials / stock / price / characteristics / certificates / packings / nodes / distributor_offices / taxonomy_<standard>. cursor_kind: revision / date / opaque_token. ADR-0029.
CursorHealthVO enumhealthy / stale / broken.
DataScopeVO enummaterials / stock / price / characteristics / certificates / packings / nodes / distributor_offices / taxonomy_etim_v7 / taxonomy_eclass_10 / ...
RawPayloadVOСырая полезная нагрузка от коннектора.
ConnectorErrorVO enumAuthRejected / SessionExpired / RateLimited / NotFound / OnRequest / Transient / Permanent / PartialSuccess. Единая taxonomy (ADR-0024).
Connector⚙️ PortИнтерфейс реализации поставщика.
CredentialRouter⚙️ PortВыбор credential для запроса.
RateLimiter⚙️ PortДвухуровневый бюджет: AuthBucket + DataBucket[endpoint_class] (ADR-0008).
SessionManager⚙️ PortAcquire/release session handle с проактивным refresh.

Контекст: contexts/ingestion.md.

Матчинг

ИмяТипОписание
MatchDecision🟨 AggregateРешение о связке SupplierOffer ↔ CanonicalProduct.
MatchSignalVOОдин из сигналов: identity, embedding, classification, packaging, consensus, manual.
OrphanItemEOffer без identity_profile, ждущий резолюции.
OrphanCategoryVO enumhot / warm / cold.
RematchRequestVOКоманда «пересчитать матчинг по этим offers».
MatchExplanationVOСтруктурированное объяснение решения.

Контекст: contexts/matching.md.

Обогащение

ИмяТипОписание
EnrichmentTask🟨 AggregateЗадача обогащения для конкретного canonical / offer.
EnrichmentResultVOИзвлечённые поля + confidence + источник модели.
EnrichmentSourceVO enumllm / rule_calculated / manual.
LlmModelRefVOmodel_name + version + prompt_hash.

Контекст: contexts/enrichment.md.

Ценообразование

ИмяТипОписание
PriceRule🟨 AggregateПравило ценообразования.
RuleScopeVOНа что распространяется (supplier / canonical / tag / customer_pricing_group).
RuleAppliesToVOУсловия применимости.
TransformationVOpercentage / tiers / fixed / formula / logistics / vat.
PriorityVOЦелое число; больше = выше.
PricingContextVO(customer, quantity, region, delivery_point, contract, date).
PricingResultVOФинальная цена + breakdown + observation_source.
PriceBreakdownItemVOОдна строка breakdown: rule_id, label, amount.
ObservationSourceVO(type, credential_label, observed_at, fallback_reason).
CustomPricingHandler⚙️ PluginПлагин клиента: применяет ценовые правила, когда API поставщика их не отдаёт.
PricingAdjustmentVOВозврат от handler: список доп. правил для применения.

Контекст: contexts/pricing.md.

Видимость

ИмяТипОписание
DataVisibilityPolicy🟨 AggregateПравило видимости.
SubjectVOdefault / customer / customer_group / customer_pricing_group / role.
TargetKindVO enumcatalog / offer / observation / price / characteristic / analytics / media.
EffectVO enumallow / deny / transform.
PredicateVOJSONB-дерево предикатов.
TransformSpecVOОписание трансформации (redact / round / hide / price_to_range).
CompiledPolicy🟩 Read modelКэшированное исполнимое представление per-subject.

Контекст: contexts/visibility.md.

Поиск

ИмяТипОписание
SearchQueryVOЗапрос пользователя (текст / артикул / фасеты / «не хуже чем»).
SearchResult🟩 Read modelРанжированный список кандидатов.
SearchHitVOОдин результат + score + explain.
BetterDirectionVO enumhigher / lower / neutral.
EmbeddingVectorVODense vector для семантического поиска.

Контекст: contexts/search.md.

Смета

ИмяТипОписание
Estimate🟨 AggregateСмета, версионируется.
EstimateLineEОдна позиция сметы (после парсинга).
EstimateLineDraftVOСырая распарсенная строка с полями + confidence.
EstimateOptimizationVOПараметры оптимизатора (mode + constraints).
OptimizationModeVO enummin_price / min_suppliers / min_lead_time / single_manufacturer.
EstimateAlternativeVOАльтернативный offer для строки.
EstimateExplanationVO«Выбрано потому что …» — структурированно.

Контекст: contexts/estimate.md.

Клиент

ИмяТипОписание
Customer🟨 AggregateКлиент, B2B или B2C.
CustomerTypeVO enumindividual / legal_entity.
LegalInfoVOДля legal_entity: ИНН, КПП, company_name, country.
ContactInfoVOEmail, phone.
CustomerPricingGroupEГруппа тарификации (b2c_retail, b2b_standard, …).
ContractEB2B-договор: набор Price Rules + payment_profile.
PaymentProfileVOСпособ оплаты.
DeliveryAddressVOАдрес доставки.
AuthIdentityEСпособ входа (email+pass / OAuth / SSO).
SessionEАктивная сессия.
SessionContextVO(customer_id, customer_type, pricing_group, roles, session_id)Shared Kernel, передаётся вниз во все BC.

Контекст: contexts/customer.md.

Учётные данные

ИмяТипОписание
SupplierCredential🟨 AggregateУчётка доступа к API поставщика.
CredentialScopeVO enumsystem / customer.
AuthSchemaVO enumlogin_password / api_key / oauth2 / bearer_token / master_key_token_exchange / public_no_auth / custom. master_key_token_exchange — DKC pattern (MasterKey → short-lived access_token). public_no_auth — публичный file feed (КЭАЗ).
AuthPayloadVOJSONB; поля с secret: true зашифрованы.
AuthMetadataVOОткрытые поля.
FingerprintVOСтабильный hash для дедупликации.
SupplierCredentialGroupEГруппа credentials с одинаковым fingerprint.
CredentialFeaturesVO enum-setcatalog / prices / stock / place_orders / media_unwatermarked / dictionary_exports / async_reports.
CredentialConstraintsVO(warehouse_scope?, classification_tag_scope?, egress_policy?) — per-credential ограничения, выдаваемые поставщиком.
CredentialStatusVO enumdraft / validating / active / failing / expired / revoked.
CredentialContextVOShared Kernel — передаётся в Connector при опросе. Включает rate-bucket refs, warehouse scope, features.
ClientSkuMap🟨 AggregateCross-reference клиентских SKU на коды поставщика. Per-(customer_ref, supplier_ref, credential_ref).
ClientSkuMappingVO(client_sku, supplier_sku, manufacturer_article?, verified_at, source).
ClientSkuMappingSourceVO enummanual_csv / dictionary_export / observed_in_payload / operator.
MasterKeyProvider⚙️ PortVault Transit / KMS / sealed-file.

Контекст: contexts/credentials.md.

Сеть поставщиков

ИмяТипОписание
Supplier🟨 AggregateУзел графа поставщиков.
SupplierKindVO enummanufacturer / distributor / aggregator / marketplace / marketplace_seller / agent / warehouse_operator / logistics / mixed. marketplace_seller — legitimate only внутри listed_on связи с aggregator (ADR-0026).
SupplierRoleEОдна из ролей supplier’а. Расширяемый словарь.
RoleKindCodeVOМашинный код из словаря supplier_role_kind.
RoleScopeVOfull / classification_tag:{tag} / manufacturer_group:{id} / warehouse:{code}.
SupplierRelationshipEНаправленное ребро графа.
RelationshipKindCodeVOaggregates / resells / is_agent_of / uses_api_of / uses_warehouse_of / subsidiary_of / exclusive_for / listed_on / GENERIC. listed_on — marketplace_seller → aggregator (ADR-0026).
TrustLevelVO enumorigin / tier_1 / tier_2 / unverified.
SupplyChainTraceVOShared Kernel — снэпшот цепочки для offer/observation. Включает warehouse_chain[].
WarehouseEСклад, привязан к warehouse_operator. Обязательное поле kind: WarehouseKind.
WarehouseKindVO enumregional_center / logistics_center / pickup_office / manufacturer_warehouse / distributor_office / third_party / transit. Фиксированный enum, расширяется только через ADR. См. ADR-0025. distributor_office — офис официального дистрибьютора производителя (DKC /revisions/distributorOffices pattern).
SellerEДочерний узел агрегатора (marketplace). Lightweight: не требует credential / контракта. Идентифицируется (supplier_ref, external_seller_id). ADR-0026.
SellerStatusVO enumactive / inactive / banned.
SellerRatingVO(score 0..5, sample_size?, observed_at, source). source: marketplace / external_review / moderator.
PreferredSellerPolicy🟨 Aggregate (Pricing BC)Per-customer / per-pricing-group preferences: (preferred_sellers[], blocked_sellers[]). Применяется в tie-break.

Контекст: contexts/supplier-network.md.

Модерация (AI)

ИмяТипОписание
ModerationCase🟨 AggregateКейс модерации. Lifecycle queued → analyzing → decided → applied / escalated.
CaseKindVO enummatch_review / orphan_resolution / inferred_relationship_review / enrichment_critical_attr_review / priority_overlap_review / credential_group_candidate / legal_info_verification_edge / manufacturer_alias_proposal / identity_profile_proposal.
CaseSourceVO(bc, aggregate_ref, event_id) — откуда.
CaseEvidenceVOСтруктурированный input агенту.
AgentRunnerEКонфигурация агента per CaseKind: model, prompt, threshold, SLA.
AgentDecisionVO(verdict, confidence, reasoning, citations[], proposed_action).
VerdictVO enumaccept / reject / escalate / defer.
ProposedActionVOКоманда для source BC.
EscalationPolicyEКогда / куда escalate.
AgentRunE (append-only)Аудит одного выполнения LLM.
HumanEscalationEЗапись escalation, только для security-critical / low-confidence.
LlmModelRefVOShared Kernel с Enrichment.

Контекст: contexts/moderation.md. Сценарий: scenarios/ai-moderation-flow.md.

Сквозные компоненты / Shared Kernel

Минимальный общий kernel — VO, разделяемый между BC. Изменение требует RFC и согласия всех владельцев.

ИмяТипГде разделено
MoneyVO(amount: Decimal, currency: ISO4217). Pricing, Estimate, Offers.
SupplyChainTraceVOSupplier Network → Offers, Pricing, Visibility.
CredentialContextVOCredentials → Ingestion, Pricing.
SessionContextVOCustomer → Search, Pricing, Estimate, Visibility.
SubjectVOCustomer / Visibility.
CorrelationIdVOВсе BC — для трассировки.
EventMetadataVOВсе BC — actor, correlation_id, trace_id, source, reason.

Соответствие BC ↔ модули и сервисы

См. ../20-architecture/module-layout.md — отображение BC на internal/core/<module>/ и cmd/<process>/.

Соответствие BC ↔ event store / схемы

См. ../20-architecture/event-sourcing.md для списка event-sourced агрегатов. См. ../20-architecture/schemas/events/ для машинных JSON Schema интеграционных событий.