Путь роли по экранам (user-flow). Узлы — экраны S-NN, события и решения; тип кодируется цветом (словарь §5). Внешние системы — пунктиром. Граф 1:1 с Mermaid-каноном warehouse-receiving-inventory.md.
user-flows/warehouse-receiving-inventory.md.
%%{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"},"flowchart":{"curve":"basis","nodeSpacing":40,"rankSpacing":52,"htmlLabels":true,"useMaxWidth":false,"padding":16}}}%%
flowchart TD
Start(["Завсклад: складская операция"]) --> TASK{"Какая задача:
приёмка, инвентаризация
или списание?"}
TASK -->|"приёмка / перемещение"| S15["S-15 · Приёмка / накладные"]
TASK -->|"инвентаризация"| S16["S-16 · Инвентаризация"]
TASK -->|"списание"| S17["S-17 · Списание"]
S15 --> KIND{"Тип документа:
приход или расход-перемещение?"}
KIND -->|"приход (от поставщика /
по перемещению)"| RECV["Приходная накладная — DRAFT"]
KIND -->|"расход (исходящее
перемещение на другую точку)"| OUTD["Расходная накладная — DRAFT"]
OUTD -->|"«Отправить»"| SENT["SENT: документ заблокирован,
остаток отправителя списан"]
SENT -. "приёмка на точке-получателе
(та же S-15, др. точка)" .-> RECV
RECV --> FACT["Ввести факт прихода +
срок годности партии (FEFO)"]
FACT --> DEFECT{"Брак / пересорт?"}
DEFECT -->|"да"| RETINV["Возвратная накладная поставщику"]
RETINV --> D_RET(["Возврат оформлен"])
DEFECT -->|"нет"| POSTGATE["Шаг: «Провести»
(авториз-шлюз)"]
POSTGATE --> POSTED["Проведена: FIFO-слой партии,
документ ReadOnly"]
POSTED --> D_RECV(["Склад пополнен по факту"])
D_RECV --> S15
S16 --> OPENINV["Открыть ревизию — выбрать позиции"]
OPENINV --> BLIND["Слепой пересчёт: книжный остаток
скрыт «••••», ввести факт"]
BLIND --> CLOSEGATE["Шаг: «Закрыть ревизию»
(авториз-шлюз)"]
CLOSEGATE --> DIFFGATE{"Факт = книжный остаток?"}
DIFFGATE -->|"да"| NODIFF["Расхождений нет"]
DIFFGATE -->|"нет"| DIFF["Расхождение зафиксировано"]
NODIFF --> ADJ["Остатки скорректированы"]
DIFF --> ADJ
ADJ --> D_INV(["Инвентаризация проведена"])
D_INV --> S16
S17 --> REASON["Указать причину (Порча / HACCP /
Недостача) + позиции"]
REASON --> STOCKGATE{"Остаток > 0
в этот момент?"}
STOCKGATE -->|"нет"| RACE["Блок: нечего списывать
(race condition — успели продать)"]
RACE --> S17
STOCKGATE -->|"да"| POSTWO["Шаг: «Провести акт»
(авториз-шлюз)"]
POSTWO --> WO["Ингредиенты списаны по ТТК
→ стоимость в убыток"]
WO --> D_WO(["Списание проведено"])
D_WO --> S17
AUTO1(["Staff Meal 100% — авто-акт (E-14)"]) -. "авто" .-> AUTOWO["Авто-акт — сразу «Проведён»"]
AUTO2(["Возврат готового блюда — HACCP (E-04/E-06)"]) -. "авто" .-> AUTOWO
AUTOWO --> D_WO
classDef screen fill:#e5ecf6,stroke:#5b7bb0,color:#243a5f;
classDef gate fill:#f8e8cf,stroke:#c9791f,color:#7a4a10;
classDef event fill:#dcefe1,stroke:#3c8a5b,color:#1c4a30;
classDef warn fill:#faedd0,stroke:#d99a2b,color:#7a4d06;
classDef auth fill:#ede7f6,stroke:#7e57c2,color:#4527a0;
classDef stop fill:#f6dcd5,stroke:#bc3f2b,color:#7a241c;
class S15,S16,S17,RECV,OUTD,SENT,FACT,POSTED,OPENINV,BLIND,NODIFF,ADJ,REASON,WO,AUTOWO screen;
class TASK,KIND,DEFECT,DIFFGATE,STOCKGATE gate;
class Start,D_RET,D_RECV,D_INV,D_WO,AUTO1,AUTO2 event;
class RETINV,DIFF warn;
class POSTGATE,CLOSEGATE,POSTWO auth;
class RACE stop;