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

E-04 — Возврат

Процесс возврата Волны 1. Пул-дорожка Кассир и внешняя система WebKassa (сторно / реверс чека), гейты решений и раскладка «выдать деньги» по тендерам (карта → реверс, нал → ящик, бонусы → баланс). Danger-ветка — «возврат без права → авторизация MSR-картой». Граф 1:1 с Mermaid-каноном front/refund.md.

ДисплейFraunces
ИнтерфейсHanken Grotesk
Цифры / кодыJetBrains Mono
1 · Роль · внешние · danger-оп Контекст процесса Роль-исполнитель, внешняя система и опасные операции возврата. Правила — business-rules §5.
Роль-исполнитель Кассир (право на возврат; нет права → авторизация MSR). Оформляет возврат / сторно чека.
Внешние WebKassa — фискальное сторно / возврат чека (реверс на эквайера / Kaspi проходит фискально через неё).
△ Опасные операции Возврат без права → авторизация MSR-картой. Прошлая (закрытая) смена → авторизация уполномоченного («холодный» чек); нал — с кассы + обязательная объяснительная.
Прошлая (закрытая) смена — по способу исходной оплаты Решение D-03 (пересм. 2026-07-27, как Odoo): возврат прошлой смены = операция текущей смены; картой / Kaspi QR → реверс на кассе под авторизацией уполномоченного; наличными → тоже с кассы + обязательная объяснительная + коммент (знаковым движением текущей смены); бонусы → на баланс. Альтитуда → слой 4/5: имена полей запроса/ответа WebKassa (механика — business-rules §5); здесь только «сторно / возврат чека».
2 · Пулы-дорожки Дорожки-исполнители Два пула канона: роль-исполнитель и внешняя система. Тип узла = цвет + метка-kicker + значок-форма (не цветом одним).
Кассирроль-исполнитель
◆ задачи + гейты
S1Нажать «Возврат»событие
GRЕсть право на возврат?гейт
AUАвторизация: прокатка MSR-картыdanger·auth
GFФПД валиден? (скан QR / ввод)гейт
ESCБлок на кассе → эскалация в бухгалтериюотказ
SELВыбрать позиции + причина (не больше проданного)задача
SHIFTЧек текущей или прошлой смены?гейт
STOСторнировать чек / позициизадача
AUMАвториз. уполномоченного (холодный чек); возврат по вчерашнему чеку (в текущей смене)danger·auth
PAYВыдать по тендерам — на свой источник (сплит → неск. веток)гейт
RCARDРеверс на ту же карту (эквайер)задача
CASHНал из ящика (прошлая смена → + объяснительная + коммент)задача
RBONНа бонусный баланс (CRM · Этап 2)задача
CBСторно начисленного кэшбэка пропорц. возврату (Этап 2)задача
D1Возврат оформленсобытие
D2Возврат вне кассысобытие
Внешн. системаsystem
◫ рамка
WKWebKassaвозврат чека → подтверждениесистема
3 · BPMN-граф Поток процесса Режим fallback-mermaid (§5/§7): тёплая тема поверх канона. Связи — sequence сплошная, message пунктир.
событие задача / шаг гейт (решение) авторизация MSR уполномоченного система (WebKassa) danger / отказ / авторизация sequence flow message flow
%%{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 Cash["Кассир"]
        S1(["Нажать «Возврат»"]) --> GR{"Есть право
на возврат?"} GR -->|нет| AU["Авторизация: прокатка MSR-карты"] AU --> GF{"ФПД валиден?
(скан QR / ввод)"} GR -->|да| GF GF -->|"нет / без чека"| ESC["Блок на кассе →
эскалация в бухгалтерию"] GF -->|да| SEL["Выбрать позиции к возврату + причина
(не больше проданного)"] SEL --> SHIFT{"Чек текущей
или прошлой смены?"} SHIFT -->|"текущая"| STO["Сторнировать чек / позиции"] SHIFT -->|"прошлая (закрытая)"| AUM["Авториз. уполномоченного (холодный чек);
возврат по вчерашнему чеку (в текущей смене)"] STO --> PAY{"Выдать по тендерам — «каждый способ на свой источник»
(сплит-чек → несколько веток разом)"} AUM --> PAY PAY -->|"карта / Kaspi QR"| RCARD["Реверс на ту же карту (эквайер)"] PAY -->|"наличные"| CASH["Нал из ящика
(прошлая смена → + объяснительная + коммент)"] PAY -->|"бонусами (потрачены · Этап 2)"| RBON["На бонусный баланс (CRM)"] RCARD --> CB CASH --> CB RBON --> CB CB["Сторно начисленного кэшбэка
пропорц. возврату (Этап 2)"] --> D1(["Возврат оформлен"]) ESC --> D2(["Возврат вне кассы"]) end subgraph Ext["Внешн. система"] WK["WebKassa"] end PAY -. "возврат чека" .-> WK WK -. "подтверждение" .-> D1 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:#7a241c; class STO,SEL,RCARD,CASH,RBON,CB task; class WK ext; class GR,GF,SHIFT,PAY gate; class AU,AUM,ESC danger; class S1,D1,D2 event; style Cash fill:#fbf7ef,stroke:#e2d6c1; style Ext fill:#f6efe2,stroke:#d0c1a6;
◍ fallback-mermaid Санкционировано design-system §5/§7 для ВСЕХ L1: swimlane «Кассир» + 4 гейта + двунаправленный message-flow (PAY↔WebKassa) делают hand-authored CSS-grid хрупким.
Danger / контроль-ветки канона. (1) Гейт GR «нет» → AU авторизация прокаткой MSR-карты перед проверкой ФПД. (2) Прошлая («холодная») смена → AUM авторизация уполномоченного; возврат = операция текущей смены. Нал за прошлую смену — с кассы + обязательная объяснительная (контроль кросс-сменной выдачи), CASH. (3) Невалидный ФПД / без чека → ESC блок на кассе и эскалация. Все контроль-ветки протоколируются (Audit Trail).