FlowPOS · tochka
hi-fi · схема L1 · BPMN

E-13 — Меню, номенклатура, цены и ТТК

Master Data процесс. Пулы-дорожки Финансист · HQ и Франчайзи · точка, гейты «цена ниже себестоимости?» и «Master Data или локальный?», danger-ветка Margin Alert (цена ниже себестоимости → красная ячейка → подтвердить) и read-only-запрет изменения Master Data. Волна 2 — историчность ТТК (FIFO не ломается). Граф 1:1 с Mermaid-каноном menu/menu-ttk-price.md.

ДисплейFraunces
ИнтерфейсHanken Grotesk
Цифры / кодыJetBrains Mono
1 · Роли · пулы · danger-оп Контекст процесса Владелец Master Data, франчайзи-точка и опасная операция цены. Правила расчёта себестоимости/FIFO — альтитуда слой 4/5.
Роль-владелец Финансист · HQ — заводит номенклатуру, привязывает НКТ/ШК, отдаёт приказ цены, владеет ТТК. Товар — Master Data, спускается на все точки.
Внешние / вторая дорожка Франчайзи · точка — Master Data только на чтение; может завести лишь локальный товар (вне Master Data).
△ Опасная операция Margin Alert: цена ниже себестоимости → ячейка красным → требуется явное подтверждение. Плюс read-only-запрет изменения Master Data на точке.
Механика цены и историчность Смена цены = приказ: применяется в 00:00 местного времени; Price Lock — цена корзины замораживается при открытии чека (E-02). Волна 2: изменение ТТК не ломает себестоимость уже закупленных партий — прошлые приготовления остаются по старой версии рецепта (FIFO). Альтитуда → слой 4/5: синхронизация HQ→точки, реализация price_locked_at, пересчёт FIFO.
2 · Пулы-дорожки Дорожки-исполнители Три пула канона (2 в блоке цен + 1 в блоке ТТК). Тип узла = цвет + метка-kicker + значок-форма (не цветом одним).
Финансист · HQроль · владелец Master Data
◆ задачи + гейт
S1Нужно завести товар или сменить ценусобытие
F1Создать / изменить товар: наименование + артикул (внутр. код)задача
F2Привязать код НКТ и штрих-код (внешние коды к артикулу)задача
F3Товар — Master Data: спускается на все точкизадача
F4Смена цены = приказ: ввести новую ценузадача
G1Цена ниже себестоимости?гейт
F5Margin Alert: ячейка красным, подтвердить△ danger-оп ценыwarn
F6Приказ сохранёнзадача
F700:00 местного времени: применить приказсобытие
F8Price Lock — цена корзины замораживается при открытии чеказадача
D1Меню и цены обновлены на точкахсобытие
Франчайзи · точкавторая дорожка · read-only MD
⌇ пунктир
S2Франчайзи меняет ассортиментсобытие
G2Master Data или локальный товар?гейт
B1Только чтение — изменение запрещено△ владелец — HQзапрет
FR1Завести локальный товар (вне Master Data)задача
D2Локальный товар доступенсобытие
Финансист · HQВолна 2 · владелец ТТК
◆ ТТК + гейт
TS1Создать / изменить ТТК (рецепт)событие
TT1Задать нормы закладки: брутто / нетто, % потерьзадача
TG1Меняем существующую ТТК (были приготовления)?гейт
TNEWРецепт применяется к приготовлениямзадача
THISTПрошлые приготовления — по старой версии рецептазадача
TNEW2Новая версия → только новые приготовлениязадача
TD1Себестоимость по ТТК актуальнасобытие
3 · BPMN-граф Поток процесса Режим fallback-mermaid (§5/§7): тёплая тема поверх канона. Два блока: Меню/цены и ТТК/историчность.
событие задача / шаг гейт (решение) Margin Alert (warn) read-only-запрет (danger) франчайзи · точка sequence flow message flow (владелец — HQ)

Блок 1 · E-13 Меню и цены (Волна 1) — источник: ответ E-13, G1, G2 + схемы 04, 45

%%{init:{
  "theme":"base",
  "themeVariables":{
    "fontFamily":"Hanken Grotesk, ui-sans-serif, sans-serif",
    "fontSize":"14px",
    "lineColor":"#5a4d3d",
    "primaryColor":"#f6e6cd",
    "primaryBorderColor":"#d5842a",
    "primaryTextColor":"#241b12",
    "clusterBkg":"#fbf7ef",
    "clusterBorder":"#d0c1a6",
    "edgeLabelBackground":"#fbf7ef",
    "tertiaryColor":"#f6efe2"
  },
  "flowchart":{"curve":"basis","nodeSpacing":42,"rankSpacing":52,"htmlLabels":true}
}}%%
flowchart TD
    subgraph Fin["Финансист · HQ (владелец Master Data)"]
        S1(["Нужно завести товар
или сменить цену"]) --> F1["Создать / изменить товар:
наименование + артикул (внутр. код)"] F1 --> F2["Привязать код НКТ и штрих-код
(внешние коды к артикулу)"] F2 --> F3["Товар — Master Data:
спускается на все точки"] F3 --> F4["Смена цены = приказ:
ввести новую цену"] F4 --> G1{"Цена ниже
себестоимости?"} G1 -->|да| F5["Margin Alert:
ячейка красным, подтвердить"] G1 -->|нет| F6["Приказ сохранён"] F5 --> F6 F6 --> F7(["00:00 местного времени:
применить приказ"]) F7 --> F8["Price Lock — цена корзины
замораживается при открытии чека"] F8 --> D1(["Меню и цены обновлены
на точках"]) end subgraph Fra["Франчайзи · точка"] S2(["Франчайзи меняет
ассортимент"]) --> G2{"Master Data
или локальный товар?"} G2 -->|"Master Data / рецепт"| B1["Только чтение —
изменение запрещено"] G2 -->|"локальный товар"| FR1["Завести локальный товар
(вне Master Data)"] FR1 --> D2(["Локальный товар доступен"]) end B1 -. "владелец — HQ" .-> F3 classDef event fill:#dcefe1,stroke:#3c8a5b,color:#1c4a30; classDef task fill:#f6e6cd,stroke:#d5842a,color:#241b12; classDef gate fill:#f8e8cf,stroke:#c9791f,color:#7a4a10; classDef actor fill:#fbf7ef,stroke:#94866f,color:#241b12,stroke-dasharray:5 3; classDef ext fill:#e5ecf6,stroke:#5b7bb0,color:#243a5f; classDef warn fill:#f8e8cf,stroke:#c9791f,color:#7a4a10; classDef danger fill:#f6dcd5,stroke:#bc3f2b,color:#7a241c; class F1,F2,F3,F4,F6,F8 task; class FR1 task; class G1,G2 gate; class S1,F7,D1,S2,D2 event; class F5 warn; class B1 danger; style Fin fill:#fbf7ef,stroke:#e2d6c1; style Fra fill:#faf5ea,stroke:#d0c1a6;

Блок 2 · ТТК и историчность себестоимости (Этап 1) — источник: схема 03 · FIFO не ломается

%%{init:{
  "theme":"base",
  "themeVariables":{
    "fontFamily":"Hanken Grotesk, ui-sans-serif, sans-serif",
    "fontSize":"14px",
    "lineColor":"#5a4d3d",
    "primaryColor":"#f6e6cd",
    "primaryBorderColor":"#d5842a",
    "primaryTextColor":"#241b12",
    "clusterBkg":"#fbf7ef",
    "clusterBorder":"#d0c1a6",
    "edgeLabelBackground":"#fbf7ef",
    "tertiaryColor":"#f6efe2"
  },
  "flowchart":{"curve":"basis","nodeSpacing":42,"rankSpacing":52,"htmlLabels":true}
}}%%
flowchart TD
    subgraph FinT["Финансист · HQ (владелец ТТК)"]
        TS1(["Создать / изменить ТТК (рецепт)"]) --> TT1["Задать нормы закладки:
брутто / нетто, % потерь"] TT1 --> TG1{"Меняем существующую ТТК
(были приготовления)?"} TG1 -->|"новая ТТК"| TNEW["Рецепт применяется
к приготовлениям"] TG1 -->|"изменение существующей"| THIST["Прошлые приготовления остаются
по старой версии рецепта"] THIST --> TNEW2["Новая версия →
только новые приготовления"] TNEW --> TD1(["Себестоимость по ТТК актуальна"]) TNEW2 --> TD1 end classDef actor fill:#fbf7ef,stroke:#94866f,color:#241b12,stroke-dasharray:5 3; classDef task fill:#f6e6cd,stroke:#d5842a,color:#241b12; classDef gate fill:#f8e8cf,stroke:#c9791f,color:#7a4a10; classDef event fill:#dcefe1,stroke:#3c8a5b,color:#1c4a30; class TT1,TNEW,THIST,TNEW2 task; class TG1 gate; class TS1,TD1 event; style FinT fill:#fbf7ef,stroke:#e2d6c1;
◍ fallback-mermaid Санкционировано design-system §5/§7 для ВСЕХ L1: swimlanes (Финансист·HQ / Франчайзи·точка) + гейты + cross-pool message-flow (B1 «владелец — HQ» → F3) делают hand-authored CSS-grid хрупким.
Danger / warn-ветки канона: гейт G1 «да» → F5 Margin Alert (цена ниже себестоимости: ячейка красным, требуется подтверждение) → F6. Гейт G2 «Master Data» → B1 «изменение запрещено» (read-only): владелец Master Data — HQ, message-flow B1 → F3. Локальный товар (ветка «локальный товар») франчайзи заводить вправе. Волна 2: изменение ТТК не ломает историчность — прошлые приготовления по старой версии рецепта (FIFO).