Процесс Волны 3 (crm/loyalty). Пулы-дорожки Кассир · Внешн. системы (SMS-шлюз OTP, CRM), четыре гейта решений и danger-ветки «списание запрещено (нет связи с CRM)» и «авто-rollback баллов» (чек не закрыт за 120 сек). Граф 1:1 с Mermaid-каноном crm/loyalty.md.
business-rules §9.
%%{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;
GOFF «нет» (нет связи с CRM) → BLK «списание запрещено» — операция стопорится (без CRM нельзя проверить баланс и холдировать баллы). Гейт GC «нет» (чек не закрыт за 120 сек) → ROLL «авто-rollback баллов» в CRM — захолдированные баллы возвращаются. Обе ветки сходятся к финишу D1. Списание проходит только онлайн и при закрытии чека в срок; авторизация 2FA — узел OTP через SMS-шлюз.