<mxfile host="app.diagrams.net" agent="obsidian-erp" version="24.7.0">
  <diagram name="Netmonet User Flow" id="netmonet-flow-v1">
    <mxGraphModel dx="2400" dy="1600" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1700" pageHeight="2400" math="0" shadow="0">
      <root>
        <mxCell id="0" />
        <mxCell id="1" parent="0" />

        <!-- ============ TITLE ============ -->
        <mxCell id="title" value="Нетмонет — User Flow (BR 3.2)&#10;4 канала QR · приём · отображение · открытые вопросы" style="text;html=1;align=center;verticalAlign=middle;fontSize=20;fontStyle=1;fontColor=#FFFFFF;fillColor=#0f3460;strokeColor=#e94560;rounded=1;" vertex="1" parent="1">
          <mxGeometry x="40" y="20" width="1620" height="60" as="geometry" />
        </mxCell>

        <!-- =========================================================== -->
        <!-- LANE 1 — SETUP (один раз на ТТ + на сотрудника)             -->
        <!-- =========================================================== -->
        <mxCell id="lane1" value="ЭТАП 1 — Setup (один раз)&#10;Кто: Франчайзи через нашу Админку" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#FFFFFF;fillColor=#1a1a2e;strokeColor=#e94560;rounded=1;spacingLeft=10;" vertex="1" parent="1">
          <mxGeometry x="40" y="100" width="1620" height="40" as="geometry" />
        </mxCell>

        <mxCell id="s1" value="Франчайзи&#10;Админка → Интеграции&#10;Нетмонет → Подключить ТТ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
          <mxGeometry x="60" y="160" width="180" height="80" as="geometry" />
        </mxCell>

        <mxCell id="s2" value="Aggregator&#10;NetmonetSyncService&#10;POST /partners/management/employees/register" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="280" y="160" width="220" height="80" as="geometry" />
        </mxCell>

        <mxCell id="s3" value="Нетмонет&#10;Создаёт employee&#10;Возвращает 6-знач code&#10;(напр. 005509)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
          <mxGeometry x="540" y="160" width="180" height="80" as="geometry" />
        </mxCell>

        <mxCell id="s4" value="User Service&#10;PATCH /internal/users/{id}/netmonet-profile&#10;netmonet_profile_id = 005509&#10;netmonet_enabled = true" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="760" y="160" width="240" height="80" as="geometry" />
        </mxCell>

        <mxCell id="s5" value="Store Service&#10;PATCH /tables/{id}/waiter&#10;zal_tables.current_waiter_id&#10;(назначение официанта на стол)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="1040" y="160" width="240" height="80" as="geometry" />
        </mxCell>

        <mxCell id="s6" value="Статус (волна 3)&#10;✅ реализовано&#10;2026-05-05" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#2d6a4f;strokeColor=#40916c;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1320" y="160" width="160" height="80" as="geometry" />
        </mxCell>

        <mxCell id="e_s1_s2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;" edge="1" parent="1" source="s1" target="s2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_s2_s3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;" edge="1" parent="1" source="s2" target="s3"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_s3_s4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;" edge="1" parent="1" source="s3" target="s4"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_s4_s5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;dashed=1;" edge="1" parent="1" source="s4" target="s5"><mxGeometry relative="1" as="geometry" /></mxCell>

        <!-- =========================================================== -->
        <!-- LANE 2 — 4 КАНАЛА РАЗМЕЩЕНИЯ QR                              -->
        <!-- =========================================================== -->
        <mxCell id="lane2" value="ЭТАП 2 — 4 канала размещения QR (приоритеты по чату с Нетмонетом)" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#FFFFFF;fillColor=#1a1a2e;strokeColor=#e94560;rounded=1;spacingLeft=10;" vertex="1" parent="1">
          <mxGeometry x="40" y="280" width="1620" height="40" as="geometry" />
        </mxCell>

        <!-- Канал 1: чек -->
        <mxCell id="c1" value="① QR НА ЧЕКЕ  ⭐ приоритет: чай" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#0f3460;strokeColor=#e94560;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="60" y="340" width="380" height="30" as="geometry" />
        </mxCell>
        <mxCell id="c1_body" value="Per-employee deep-link.&#10;paykeeper-adapter → передаёт PK поле tip_qr_url + tip_qr_label.&#10;PK печатает: https://netmonet.co/tip/{code}  Подпись «Чай {имя}».&#10;Источник {code}: employees.netmonet_profile_id (если netmonet_enabled).&#10;Fallback: groupCode ТТ (shared tips).&#10;&#10;⛔ Блокер: PK ещё не добавил поля tip_qr_url в API создания счёта.&#10;К Леониду (PK)." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="60" y="370" width="380" height="160" as="geometry" />
        </mxCell>

        <!-- Канал 2: мерч на столе -->
        <mxCell id="c2" value="② МЕРЧ НА СТОЛЕ  ⭐ приоритет: оплата счёта" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#0f3460;strokeColor=#e94560;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="460" y="340" width="380" height="30" as="geometry" />
        </mxCell>
        <mxCell id="c2_body" value="Статичный per-table / per-workplace QR.&#10;Содержит groupCode ТТ → /qr/{groupCode}/groups/0&#10;Гость выбирает официанта (или «общий чай»).&#10;Поддерживает bill-pay (если isQrPayEnabled=true).&#10;&#10;Кто формирует:&#10;• Сейчас — наклейки заказывает франчайзи из ЛК Нетмонета&#10;• В будущем — экспорт PNG/PDF из нашей админки&#10;(карточка ТТ → Нетмонет → «Скачать наклейку»)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="460" y="370" width="380" height="160" as="geometry" />
        </mxCell>

        <!-- Канал 3: прямая ссылка + код -->
        <mxCell id="c3" value="③ ПРЯМАЯ ССЫЛКА + 6-знач код" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#0f3460;strokeColor=#e94560;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="860" y="340" width="380" height="30" as="geometry" />
        </mxCell>
        <mxCell id="c3_body" value="Гость идёт на netmonet.co → вводит code вручную.&#10;Код = тот же netmonet_profile_id или groupCode.&#10;&#10;С нашей стороны делать ничего не нужно —&#10;канал работает «из коробки» как только сотрудник&#10;зарегистрирован (этап 1).&#10;&#10;Используется как fallback если QR не сканируется." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="860" y="370" width="380" height="160" as="geometry" />
        </mxCell>

        <!-- Канал 4: терминал -->
        <mxCell id="c4" value="④ QR НА ТЕРМИНАЛЕ (PK) — БУДУЩЕЕ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#0f3460;strokeColor=#e94560;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1260" y="340" width="380" height="30" as="geometry" />
        </mxCell>
        <mxCell id="c4_body" value="Терминал PK во время оплаты картой&#10;показывает QR на экране (или после оплаты).&#10;&#10;Источник кода — тот же tip_qr_url, что для чека.&#10;&#10;⛔ Блокер: «должны появиться в скором времени»&#10;(цитата Анастасии).&#10;К Анастасии: когда планируется?&#10;Какой контракт с терминалом?" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;align=left;spacingLeft=8;dashed=1;" vertex="1" parent="1">
          <mxGeometry x="1260" y="370" width="380" height="160" as="geometry" />
        </mxCell>

        <!-- =========================================================== -->
        <!-- LANE 3 — ГОСТЬ ПЛАТИТ + WEBHOOK                              -->
        <!-- =========================================================== -->
        <mxCell id="lane3" value="ЭТАП 3 — Гость платит → Нетмонет → Webhook (Волна 2 — заблокирована)" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#FFFFFF;fillColor=#1a1a2e;strokeColor=#e94560;rounded=1;spacingLeft=10;" vertex="1" parent="1">
          <mxGeometry x="40" y="560" width="1620" height="40" as="geometry" />
        </mxCell>

        <mxCell id="g1" value="Гость&#10;Сканирует QR / вводит код&#10;Любой из 4 каналов выше" style="ellipse;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
          <mxGeometry x="60" y="620" width="200" height="80" as="geometry" />
        </mxCell>

        <mxCell id="g2" value="netmonet.co/tip/{code}&#10;Выбор суммы → оплата&#10;(СБП / карта)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
          <mxGeometry x="300" y="620" width="200" height="80" as="geometry" />
        </mxCell>

        <mxCell id="g3" value="Нетмонет backend&#10;Сохраняет транзакцию&#10;Триггерит webhook" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
          <mxGeometry x="540" y="620" width="200" height="80" as="geometry" />
        </mxCell>

        <mxCell id="g4" value="POST webhook&#10;X-Netmonet-Signature: HMAC&#10;payload: external_tip_id, amount,&#10;currency, received_at,&#10;order_number?, table_number?, code?" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="780" y="610" width="280" height="100" as="geometry" />
        </mxCell>

        <mxCell id="g5" value="⛔ БЛОКЕР&#10;Webhook-контракт не получен от support@netmonet.co.&#10;В /v3/api-docs/data НЕТ polling-эндпоинта для tips&#10;(только /reviews — без суммы).&#10;&#10;К Анастасии: спецификация webhook?&#10;Алгоритм HMAC + имя header?" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#b85450;strokeColor=#7a0000;fontColor=#FFFFFF;align=left;spacingLeft=8;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1100" y="610" width="540" height="100" as="geometry" />
        </mxCell>

        <mxCell id="e_g1_g2" style="endArrow=classic;html=1;" edge="1" parent="1" source="g1" target="g2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_g2_g3" style="endArrow=classic;html=1;" edge="1" parent="1" source="g2" target="g3"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_g3_g4" style="endArrow=classic;html=1;" edge="1" parent="1" source="g3" target="g4"><mxGeometry relative="1" as="geometry" /></mxCell>

        <!-- =========================================================== -->
        <!-- LANE 4 — AGGREGATOR обрабатывает + резолв waiter             -->
        <!-- =========================================================== -->
        <mxCell id="lane4" value="ЭТАП 4 — Aggregator принимает чаевые → резолв официанта → Order Service" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#FFFFFF;fillColor=#1a1a2e;strokeColor=#e94560;rounded=1;spacingLeft=10;" vertex="1" parent="1">
          <mxGeometry x="40" y="740" width="1620" height="40" as="geometry" />
        </mxCell>

        <mxCell id="a1" value="Aggregator Service&#10;NetmonetWebhookController&#10;POST /aggregator/netmonet/tips/new" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="60" y="800" width="220" height="80" as="geometry" />
        </mxCell>

        <mxCell id="a2" value="HMAC validation&#10;Idempotent save в tip_events&#10;(уник: external_tip_id)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="320" y="800" width="220" height="80" as="geometry" />
        </mxCell>

        <mxCell id="a3" value="Резолв waiter_id (4 пути, приоритет ↓)&#10;1) order_number → orders.waiter_id&#10;2) table_number → zal_tables.current_waiter_id&#10;3) employee code → employees.netmonet_profile_id&#10;4) ни одного — waiter_id=null,&#10;   флаг manual_distribution" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="580" y="790" width="360" height="100" as="geometry" />
        </mxCell>

        <mxCell id="a4" value="Kafka publish&#10;tips.received&#10;{tip_event_id, store_id,&#10;waiter_id?, amount,&#10;order_number?, received_at}" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
          <mxGeometry x="980" y="800" width="240" height="80" as="geometry" />
        </mxCell>

        <mxCell id="a5" value="Order Service&#10;TipsEventConsumer&#10;orders.tip_amount += amount&#10;orders.waiter_id = resolved (если был null)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="1260" y="800" width="280" height="80" as="geometry" />
        </mxCell>

        <mxCell id="e_a1_a2" style="endArrow=classic;html=1;" edge="1" parent="1" source="a1" target="a2"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_a2_a3" style="endArrow=classic;html=1;" edge="1" parent="1" source="a2" target="a3"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_a3_a4" style="endArrow=classic;html=1;" edge="1" parent="1" source="a3" target="a4"><mxGeometry relative="1" as="geometry" /></mxCell>
        <mxCell id="e_a4_a5" style="endArrow=classic;html=1;" edge="1" parent="1" source="a4" target="a5"><mxGeometry relative="1" as="geometry" /></mxCell>

        <!-- Соединение этап 3 → этап 4 -->
        <mxCell id="e_g4_a1" style="endArrow=classic;html=1;dashed=1;strokeColor=#b85450;" edge="1" parent="1" source="g4" target="a1"><mxGeometry relative="1" as="geometry" /></mxCell>

        <!-- =========================================================== -->
        <!-- LANE 5 — ОТОБРАЖЕНИЕ                                          -->
        <!-- =========================================================== -->
        <mxCell id="lane5" value="ЭТАП 5 — Где сотрудник, менеджер и франчайзи видят чаевые" style="text;html=1;align=left;verticalAlign=middle;fontSize=13;fontStyle=1;fontColor=#FFFFFF;fillColor=#1a1a2e;strokeColor=#e94560;rounded=1;spacingLeft=10;" vertex="1" parent="1">
          <mxGeometry x="40" y="920" width="1620" height="40" as="geometry" />
        </mxCell>

        <!-- Точка A: ЛК Нетмонета -->
        <mxCell id="d1_h" value="A. ЛК Нетмонета (Web + Mobile)&#10;Делает: НЕТМОНЕТ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="60" y="980" width="500" height="50" as="geometry" />
        </mxCell>
        <mxCell id="d1_b" value="Кто видит: сам ОФИЦИАНТ (логин по телефону + SMS).&#10;Видит: свои поступления (сумма, дата, отзыв, звёзды),&#10;статус вывода на карту, историю.&#10;&#10;✅ Уже работает — официант скачивает приложение Нетмонета&#10;и видит чаевые сразу после первой оплаты гостем.&#10;&#10;Нашей работы нет." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff8dc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="60" y="1030" width="500" height="180" as="geometry" />
        </mxCell>

        <!-- Точка B: наша Админка /tips -->
        <mxCell id="d2_h" value="B. Наша Админка → /tips&#10;Делает: МЫ (erp-admin)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="580" y="980" width="500" height="50" as="geometry" />
        </mxCell>
        <mxCell id="d2_b" value="Кто видит (permission tips.read):&#10;• Франшиза — все ТТ всех ЮЛ&#10;• Франчайзи — свои ЮЛ → свои ТТ&#10;• Менеджер ТТ — только свою ТТ&#10;&#10;Что: таблица (дата, ТТ, официант, сумма, источник, заказ),&#10;фильтры (период, ТТ, официант), сводка, топ-официантов.&#10;&#10;⚠ Сейчас mock-данные. Real backend заблокирован Волной 2.&#10;Чтение из /internal/aggregators/tips (после Волны 2)." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e7f6e7;strokeColor=#82b366;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="580" y="1030" width="500" height="180" as="geometry" />
        </mxCell>

        <!-- Точка C: карточка заказа на POS -->
        <mxCell id="d3_h" value="C. POS / отчёты — карточка заказа&#10;Делает: МЫ (Order + POS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="1100" y="980" width="540" height="50" as="geometry" />
        </mxCell>
        <mxCell id="d3_b" value="orders.tip_amount + orders.waiter_id в карточке заказа.&#10;&#10;Кто видит:&#10;• Кассир / менеджер на POS — «к заказу #1234 пришли чаевые 200 ₽»&#10;• В отчёте по смене — сумма чаевых на официанта за смену&#10;• В Z-отчёте — итог чаевых (если нужно для бухгалтерии)&#10;&#10;⚠ Заблокировано Волной 2.&#10;Срабатывает только если в webhook есть order_number&#10;(прилёт через QR с чека → PK передал order_number в tip_qr_url)." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf2fb;strokeColor=#6c8ebf;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="1100" y="1030" width="540" height="180" as="geometry" />
        </mxCell>

        <!-- =========================================================== -->
        <!-- ОТКРЫТЫЕ ВОПРОСЫ                                              -->
        <!-- =========================================================== -->
        <mxCell id="qhdr" value="ОТКРЫТЫЕ ВОПРОСЫ К НЕТМОНЕТУ (Анастасии)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#b85450;strokeColor=#7a0000;fontColor=#FFFFFF;fontStyle=1;fontSize=13;" vertex="1" parent="1">
          <mxGeometry x="40" y="1240" width="1620" height="40" as="geometry" />
        </mxCell>

        <mxCell id="q1" value="1. Webhook-контракт для входящих чаевых&#10;   • URL endpoint, который мы регистрируем у вас?&#10;   • Формат payload (поля: external_tip_id, amount,&#10;     currency, received_at, order_number?, table_number?, code?)&#10;   • HMAC algorithm + имя header (предполагаем X-Netmonet-Signature, SHA-256)&#10;   • Retry-политика, idempotency-ключ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="60" y="1290" width="500" height="140" as="geometry" />
        </mxCell>

        <mxCell id="q2" value="2. Канал «QR на терминале»&#10;   • Какие модели терминалов и когда?&#10;   • Кто формирует QR — терминал сам по эквайер-токену,&#10;     или поле от нас (как для чека)?&#10;   • Передаём ли мы тот же tip_qr_url через PK API?" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="580" y="1290" width="500" height="140" as="geometry" />
        </mxCell>

        <mxCell id="q3" value="3. Мерч и наклейки&#10;   • Готовы ли вы предоставить генератор PNG/PDF QR&#10;     по нашему API-токену (чтобы франчайзи скачивал&#10;     наклейки из НАШЕЙ админки)?&#10;   • Или ТТ заказывает у вас через ЛК как сейчас?" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="1100" y="1290" width="540" height="140" as="geometry" />
        </mxCell>

        <mxCell id="q4" value="4. Bill-pay (оплата всего счёта) — отдельная R на нашей стороне (out of scope BR 3.2).&#10;   Есть ли у вас полная спецификация bill-pay flow с фискализацией (передача состава чека → возврат фискального документа)?&#10;5. Polling fallback — пока нет webhook, можем ли мы получать tips через расширение /api/v1/partners/reviews&#10;   (добавить поле amount + payment_status)? Это разблокировало бы Волну 2 без webhook." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;align=left;spacingLeft=8;" vertex="1" parent="1">
          <mxGeometry x="60" y="1450" width="1580" height="100" as="geometry" />
        </mxCell>

        <!-- ============ LEGEND ============ -->
        <mxCell id="legend_hdr" value="Легенда" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#0f3460;strokeColor=#e94560;fontColor=#FFFFFF;fontStyle=1;" vertex="1" parent="1">
          <mxGeometry x="40" y="1580" width="1620" height="30" as="geometry" />
        </mxCell>
        <mxCell id="lg1" value="зелёный — наша сторона (Aggregator/User/Store/Order/Admin)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" vertex="1" parent="1">
          <mxGeometry x="60" y="1620" width="380" height="40" as="geometry" />
        </mxCell>
        <mxCell id="lg2" value="жёлтый — Нетмонет (внешний сервис)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
          <mxGeometry x="460" y="1620" width="380" height="40" as="geometry" />
        </mxCell>
        <mxCell id="lg3" value="голубой — гость / Kafka-события / POS" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
          <mxGeometry x="860" y="1620" width="380" height="40" as="geometry" />
        </mxCell>
        <mxCell id="lg4" value="красный — блокер / открытый вопрос" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
          <mxGeometry x="1260" y="1620" width="380" height="40" as="geometry" />
        </mxCell>

      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
