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

E-21 — Лояльность · бонусы

Процесс Волны 3 (crm/loyalty). Пулы-дорожки Кассир · Внешн. системы (SMS-шлюз OTP, CRM), четыре гейта решений и danger-ветки «списание запрещено (нет связи с CRM)» и «авто-rollback баллов» (чек не закрыт за 120 сек). Граф 1:1 с Mermaid-каноном crm/loyalty.md.

ДисплейFraunces
ИнтерфейсHanken Grotesk
Цифры / кодыJetBrains Mono
1 · Роль · внешние · danger-оп Контекст процесса Роль-исполнитель, внешние системы и опасные операции. Правила начисления/списания — business-rules §9.
Роль-исполнитель Кассир — проводит операцию с баллами: начисление (кэшбэк на момент покупки) или списание.
Внешние системы SMS-шлюз (OTP для 2FA) · CRM (система лояльности — hold / rollback баллов).
△ Опасные операции Списание офлайн запрещено (стоп-узел). Чек не закрыт за 120 секавто-rollback баллов в CRM.
2FA по SMS 2FA по SMS для списания включается / отключается (гейт G2FA): при включённой — запрос OTP через SMS-шлюз перед холдированием баллов в CRM. Начисление идёт с historical_timestamp (кэшбэк на момент покупки). Альтитуда → слой 4/5: идемпотентность hold, тайм-аут OTP, реверс rollback у CRM.
2 · Пулы-дорожки Дорожки-исполнители Два пула канона: роль-исполнитель и внешние системы. Тип узла = цвет + метка-kicker + значок-форма (не цветом одним).
Внешн. системыsystem
◫ рамка
SMSSMS-шлюз (OTP)приём запроса OTP для 2FAсистема
CRMCRM (лояльность)hold / rollback балловсистема
Кассирроль-исполнитель
◆ задачи + гейты
S1Операция с баллами старт процессасобытие
G0Начисление или списание?гейт
ACCНачислитьhistorical_timestamp · кэшбэк на момент покупкизадача
GOFFЕсть онлайн-связь с системой лояльности (CRM)?гейт
BLKСписание запрещено (без CRM нельзя холдировать)стоп-узел — dangerdanger·stop
G2FA2FA по SMS включена?гейт
OTPЗапросить OTP по SMS2FA · авторизацияauth
HOLDХолдирование баллов в CRMзадача
FISФискализация чеказадача
GCЧек закрыт за 120 сек?гейт
ROLLАвто-rollback балловdanger — тайм-аут 120 секdanger·rollback
OKСписание подтвержденозадача
D1Бонусы обновленыфиниш процессасобытие
3 · BPMN-граф Поток процесса Режим fallback-mermaid (§5/§7): тёплая тема поверх канона. Связи — sequence сплошная, message пунктир.
событие задача / шаг гейт (решение) авторизация OTP система 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}
}}%%
%% E-21 Лояльность (бонусы) · Источник: ответ E-21 + схемы 39,40,41
%% Граф-паритет: узлы/пулы/гейты/рёбра/метки ВЕРБАТИМ из docs/01-processes/crm/loyalty.md
flowchart TD
    subgraph Cash["Кассир"]
        S1(["Операция с баллами"]) --> G0{"Начисление или списание?"}
        G0 -->|начисление| ACC["Начислить (historical_timestamp,
кэшбэк на момент покупки)"] G0 -->|списание| GOFF{"Есть онлайн-связь с системой
лояльности (CRM)?"} GOFF -->|нет| BLK["Списание запрещено
(без CRM нельзя холдировать баллы)"] GOFF -->|да| G2FA{"2FA по SMS включена?"} G2FA -->|да| OTP["Запросить OTP по SMS"] G2FA -->|нет| HOLD["Холдирование баллов в CRM"] OTP --> HOLD HOLD --> FIS["Фискализация чека"] FIS --> GC{"Чек закрыт за 120 сек?"} GC -->|нет| ROLL["Авто-rollback баллов"] GC -->|да| OK["Списание подтверждено"] ACC --> D1(["Бонусы обновлены"]) OK --> D1 ROLL --> D1 end subgraph Ext["Внешн. системы"] SMS["SMS-шлюз (OTP)"] CRM["CRM (лояльность)"] end OTP -. "OTP" .-> SMS HOLD -. "hold / rollback" .-> CRM %% classDef'ы типов узлов (тёплая палитра, как в эталоне E-02): 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 ext fill:#e5ecf6,stroke:#5b7bb0,color:#243a5f; classDef auth fill:#ede7f6,stroke:#7e57c2,color:#4527a0; classDef danger fill:#f6dcd5,stroke:#bc3f2b,color:#7a241c; class ACC,HOLD,FIS,OK task; class OTP auth; class SMS,CRM ext; class G0,GOFF,G2FA,GC gate; class ROLL,BLK danger; class S1,D1 event; style Cash fill:#fbf7ef,stroke:#e2d6c1; style Ext fill:#f6efe2,stroke:#d0c1a6;
◍ fallback-mermaid Режим утверждён владельцем для всех L1 (design-system §5/§7): пулы-дорожки + 4 гейта + двунаправленные message-flow (OTP⇢SMS-шлюз, HOLD⇢CRM) делают hand-authored CSS-grid хрупким.
Danger-ветки: гейт GOFF «нет» (нет связи с CRM) → BLK «списание запрещено» — операция стопорится (без CRM нельзя проверить баланс и холдировать баллы). Гейт GC «нет» (чек не закрыт за 120 сек) → ROLL «авто-rollback баллов» в CRM — захолдированные баллы возвращаются. Обе ветки сходятся к финишу D1. Списание проходит только онлайн и при закрытии чека в срок; авторизация 2FA — узел OTP через SMS-шлюз.