Процесс Волны 2 (warehouse/receiving). Пулы-дорожки Поставщик · Завсклад-отправитель · Завсклад-получатель, четыре гейта решений (источник · брак/пересорт · факт vs документ · отмена проведения) и danger-ветка «отмена проведения иммутабельной накладной → откат остатков + ретро-пересчёт → слой 5». Граф 1:1 с Mermaid-каноном warehouse/receiving.md.
business-rules §8.
%%{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 Sup["Поставщик · внешн."]
SUP(["Поставка товара"])
end
subgraph WA["Завсклад · точка-отправитель"]
A1["Расходная накладная
(перемещение): DRAFT"]
A2["«Отправить» → статус SENT
(документ блокируется)"]
A3["Остаток отправителя списан"]
end
subgraph WB["Завсклад · точка-получатель"]
R0(["Начать"]) --> R1{"Источник?"}
R1 -->|поставщик| ORD["Заказ поставщику"]
ORD --> RP["Приходная накладная
от поставщика"]
R1 -->|перемещение| RT["Приходная накладная
по перемещению"]
RP --> RF["Ввести факт прихода
+ срок годности партии (FEFO)"]
RT --> RF
RF --> GQ{"Брак / пересорт?"}
GQ -->|да| RET["Возвратная накладная
поставщику → вернуть"]
GQ -->|нет| GF{"Факт vs документ?"}
GF -->|точно| PROV["Провести накладную"]
GF -->|"излишек / недопоставка"| PROV
PROV --> FIFO["Создан FIFO-слой партии
(себестоимость = цена закупа)"]
FIFO --> D1(["Склад пополнен по факту"])
PROV --> IMM["Проведённая накладная —
ReadOnly (иммутабельна)"]
IMM --> GC{"Отменить
проведение?"}
GC -->|да| ROLL["Откат остатков +
ретро-пересчёт → слой 5"]
GC -->|нет| D1
RET --> D2(["Возврат поставщику оформлен"])
end
ORD -. "заказ" .-> SUP
SUP -.-> RP
A1 --> A2 --> A3
A3 -.-> RT
classDef actor fill:#fbf7ef,stroke:#94866f,color:#241b12,stroke-dasharray:5 3;
classDef ext fill:#e5ecf6,stroke:#5b7bb0,color:#243a5f;
classDef gate fill:#f8e8cf,stroke:#c9791f,color:#7a4a10;
classDef event fill:#dcefe1,stroke:#3c8a5b,color:#1c4a30;
classDef task fill:#f6e6cd,stroke:#d5842a,color:#241b12;
classDef danger fill:#f6dcd5,stroke:#bc3f2b,color:#7a1f12;
class A1,A2,A3,ORD,RP,RT,RF,PROV,FIFO,IMM task;
class SUP event;
class R1,GQ,GF,GC gate;
class R0,D1,D2 event;
class RET,ROLL danger;
style Sup fill:#faf5ea,stroke:#d0c1a6;
style WA fill:#f6efe2,stroke:#d0c1a6;
style WB fill:#fbf7ef,stroke:#e2d6c1;
IMM — ReadOnly / иммутабельна. Её отмена ведёт к ROLL — откату остатков и ретро-пересчёту себестоимости FIFO-слоёв (альтитуда → слой 5). При «нет» — финиш D1 «Склад пополнен по факту». Смежная опасная ветка — гейт GQ «да»: брак/пересорт → возвратная накладная RET → возврат поставщику D2.