Перейти к содержанию

Спецификация 01. Доменная модель (схемы сущностей)

Статус: ревизия №2 по итогам аудита корпуса · 10.10.2026. Числовые факты сопровождаются ссылками; канонические перечисления — в «Модели данных», §0.

Атрибутные схемы по доменам. Полное описание атрибутов — в ../components/12-data-model.md; здесь — визуальные связи. Имена сущностей на английском (код), подписи связей — по смыслу.

1. Ядро: заказы, оплаты, чеки

erDiagram
    ORDER ||--o{ ORDER_ITEM : "содержит"
    ORDER ||--o{ PAYMENT : "оплачен"
    ORDER ||--o| FISCAL_RECEIPT : "фискализируется"
    ORDER }o--|| LOCATION : "исполняется точкой"
    ORDER }o--o| GUEST : "принадлежит гостю"
    ORDER_ITEM }o--|| MENU_ITEM : "позиция меню"
    ORDER_ITEM ||--o{ ORDER_ITEM_MODIFIER : "модификаторы"
    ORDER_ITEM_MODIFIER }o--|| MODIFIER : "вариант"
    ORDER ||--o| DELIVERY_ASSIGNMENT : "доставка"
    ORDER ||--o{ KITCHEN_TICKET : "кухонные тикеты"

    ORDER {
        string id
        string location_id
        string channel
        string status
        string guest_id
        string promised_at
        decimal total
    }
    ORDER_ITEM {
        string id
        string menu_item_id
        int qty
        decimal price
        string station_routing
    }
    PAYMENT {
        string id
        string order_id
        string method
        decimal amount
        string status
    }
    FISCAL_RECEIPT {
        string id
        string order_id
        string kkt_id
        string fiscal_document_no
        string fiscal_sign
        string ffd_version
        string ofd_status
    }

2. Меню и производство

erDiagram
    MENU_ITEM ||--o{ RECIPE : "версии ТТК"
    RECIPE ||--o{ RECIPE_LINE : "строки состава"
    RECIPE_LINE }o--o| INGREDIENT : "сырьё"
    RECIPE_LINE }o--o| RECIPE : "полуфабрикат"
    MENU_ITEM ||--o{ MODIFIER_GROUP : "группы модификаторов"
    MODIFIER_GROUP ||--o{ MODIFIER : "варианты"
    INGREDIENT ||--o{ LOT : "партии"
    PRODUCTION_BATCH }o--|| RECIPE : "выпуск по ТТК"
    PRODUCTION_BATCH ||--o{ STOCK_MOVEMENT : "движения сырья"

    MENU_ITEM {
        string id
        string name
        decimal base_price
        string tax_group
        bool is_alcohol
        bool is_marked
    }
    RECIPE {
        string id
        string menu_item_id
        string version
        int prep_time_norm_sec
        string status
    }
    RECIPE_LINE {
        string id
        decimal qty
        decimal loss_cold_pct
        decimal loss_hot_pct
    }
    INGREDIENT {
        string id
        string name
        string unit
        int default_shelf_life
    }
    LOT {
        string id
        string ingredient_id
        decimal qty_received
        decimal price_unit
        date expires_at
    }

3. Склад и закупки

erDiagram
    INGREDIENT ||--o{ STOCK_MOVEMENT : "движения"
    LOT ||--o{ STOCK_MOVEMENT : "партийность"
    PURCHASE_ORDER ||--o{ PURCHASE_ORDER_LINE : "строки"
    PURCHASE_ORDER_LINE }o--|| INGREDIENT : "позиция"
    SUPPLIER ||--o{ PURCHASE_ORDER : "поставки"
    SUPPLIER }o--|| TENANT : "допущен УК"

    STOCK_MOVEMENT {
        string id
        string location_id
        string ingredient_id
        string type
        decimal qty
        string doc_ref
        string author_id
        datetime created_at
    }
    PURCHASE_ORDER {
        string id
        string supplier_id
        string status
        datetime expected_at
        string edo_doc_id
    }

Типы движений (9, канонический словарь — в ../components/12-data-model.md, §0): receive (приёмка), sale_writeoff (продажа по ТТК), production_in / production_out (заготовки), transfer (перемещение), writeoff_spoilage (порча), writeoff_staff (списание на персонал — антифрод), inventory_adjust (инвентаризация), return (возврат).

4. Доставка

erDiagram
    LOCATION ||--o{ DELIVERY_ZONE : "зоны"
    COURIER ||--o{ DELIVERY_ASSIGNMENT : "назначения"
    ORDER ||--o| DELIVERY_ASSIGNMENT : "заказ"
    DELIVERY_ASSIGNMENT ||--o{ DELIVERY_INCIDENT : "инциденты"

    DELIVERY_ZONE {
        string id
        string polygon
        decimal min_order
        decimal delivery_fee
        int max_promise_min
    }
    COURIER {
        string id
        string employment
        string transport
        decimal rating
    }
    DELIVERY_ASSIGNMENT {
        string id
        string order_id
        string courier_id
        string status
        datetime assigned_at
        datetime delivered_at
        string proof_photo
        string proof_code
    }

Статусы назначения (канонический словарь — в ../components/12-data-model.md, §0; токен picked заменён на picked_up, отказ — пара DeliveryIncident + failed):

stateDiagram-v2
    [*] --> assigned : "назначен"
    assigned --> picked_up : "забрал заказ"
    picked_up --> delivering : "в пути"
    delivering --> delivered : "вручён (фото или код)"
    assigned --> failed : "инцидент не устранён"
    picked_up --> failed : "инцидент не устранён"
    failed --> [*]
    delivered --> [*]

5. Гости, лояльность, отзывы

erDiagram
    GUEST ||--|| LOYALTY_ACCOUNT : "бонусный счёт"
    LOYALTY_ACCOUNT ||--o{ LOYALTY_TX : "операции"
    GUEST ||--o{ REVIEW : "отзывы"
    GUEST ||--o{ ORDER : "заказы"
    CAMPAIGN ||--o{ CAMPAIGN_EVENT : "отправки"
    CAMPAIGN_EVENT }o--|| GUEST : "гость"

    GUEST {
        string id
        string phones
        string birthday
        datetime consent_152fz_at
    }
    LOYALTY_TX {
        string id
        string type
        decimal amount
        string order_id
        string reason
    }
    REVIEW {
        string id
        string order_id
        int rating
        string source
        string response
    }

6. Франшиза и контроль

erDiagram
    TENANT ||--o{ LOCATION : "точки"
    TENANT ||--o{ FRANCHISE_AGREEMENT : "договоры"
    FRANCHISE_AGREEMENT ||--o{ ROYALTY_INVOICE : "счета роялти"
    LOCATION }o--o| LOCATION_TEMPLATE : "клон шаблона"
    TENANT ||--o{ CHECKLIST : "чек-листы"
    CHECKLIST ||--o{ AUDIT : "проверки"
    AUDIT ||--o{ REMEDIATION_TASK : "задачи"

    TENANT {
        string id
        string type
        string status
    }
    FRANCHISE_AGREEMENT {
        string id
        string number
        decimal royalty_pct
        decimal marketing_fee_pct
        date date_start
        date date_end
    }
    LOCATION_TEMPLATE {
        string id
        string version
        string menu_ref
        string rights_matrix
    }
    ROYALTY_INVOICE {
        string id
        string period
        decimal gross_revenue
        decimal royalty_amount
        string status
    }

7. Жизненный цикл заказа (единый для всех каналов)

Статусы заказа — канонический словарь ../components/12-data-model.md, §0; статусы кухонного тикета (queued | cooking | ready | served) и назначения доставки — там же.

stateDiagram-v2
    [*] --> new : "создан каналом"
    new --> accepted : "зона/стоп/цена ок"
    accepted --> kitchen : "маршрутизация позиций"
    kitchen --> ready : "все тикеты готовы"
    ready --> served : "зал: подан"
    ready --> packed : "доставка: упакован"
    packed --> delivered : "курьер вручил"
    new --> cancelled : "отмена"
    accepted --> cancelled : "отмена"
    served --> [*]
    delivered --> [*]
    cancelled --> [*]