Gap-анализ бизнес-сценариев (шаг 4)¶
Дата: 2026-06-26 · Автор: команда документации (роль doc-ba). · Статус входа: черновик для планирования шага 5.
Цель: свести покрытие документации сценариями и список того, чего не хватает — и как «не описано, но есть в системе», и как «продуктовый пробел (to-be)». Это вход для дописывания сценариев (шаг 5) и Trientes (шаг 2).
Метод и источники¶
- Что задокументировано сейчас:
docs/projects/teslapay/scenarios/*(перенос из викиmain/TeslaPay/*),docs/projects/trientes/scenarios/*(пока копии TeslaPay),docs/_shared/*. - Что должно быть описано: swimlane-сценарии
admin_panel/docs/scenarios/(SC-001..015) + возможности сервисов (admin_panel/docs/services/*,analysis/*). - Продуктовые пробелы (to-be):
admin_panel/docs/analysis/missing-scenarios.md(аудит 2026-03-04: 67 недостающих сценариев, 21 «сломанное взаимодействие»).
Легенда статуса покрытия: | Метка | Значение | |---|---| | ✅ | Задокументировано сценарием (хотя бы как перенос из вики; качество/сверка — отдельно) | | 🟡 | Частично / поверхностно / требует переписи по шаблону | | 📝 | Есть в системе, но НЕ описано сценарием — основной долг документации | | 🔮 | Продуктовый пробел (to-be) — функционала нет/сломан (из missing-scenarios.md); описывать как целевой при наличии решения |
⚠️ Метки ✅/🟡 отражают наличие документа, а не сверку с кодом. Сверка (
verified_with_code) — зона doc-sa (шаг 7/5). Продуктовые пробелы 🔮 взяты из аудита от 2026-03; перед описанием как «есть» — перепроверить в коде (могли реализовать).
TeslaPay — покрытие по доменам¶
auth / профиль¶
| Сценарий | Док | Статус |
|---|---|---|
| Регистрация ФЛ | user/home.md | 🟡 переписать по шаблону |
| Авторизация | user/auth.md | 🟡 |
| 2FA | user/2FA.md | 🟡 |
| Face/Touch ID | user/facetouchid.md | 🟡 |
| PIN | user/pin.md | 🟡 |
| Восстановление пароля | user/new_password.md | 🟡 |
| Изменение профиля | user/change.md | 🟡 |
| Закрытие/удаление профиля | user/close_profile.md | 🟡 |
| Способы идентификации (справочно) | user/password.md | 🟡 |
| PSD2 SCA (усиленная аутентификация) | — | 🔮 P0 (НОВЫЙ сервис SCA; OTP обходим) |
kyc-aml¶
| Сценарий | Док | Статус |
|---|---|---|
| Идентификация (KYC) | user/ident.md | 🟡 |
| AML-светофор + правила | support/aml.md, support/aml_1..12.md | 🟡 12 правил перенесены |
| Скоринг транзакций | support/score.md | 🟡 |
| Блокировка / разблокировка | support/block.md, support/unblock.md | 🟡 |
| Синхронная AML-блокировка | — | 🔮 P0 (сейчас fire-and-forget) |
| Непрерывный мониторинг транзакций (⅚AMLD) | частично support/score | 🔮 P1 |
| Регуляторная отчётность CTR/SAR | — | 🔮 P1 (НОВЫЙ сервис) |
accounts / payments¶
| Сценарий | Док | Статус |
|---|---|---|
| Открытие счёта | payment/acc.md | 🟡 |
| Закрытие счёта | payment/close.md | 🟡 |
| Блокировка счёта | payment/account_blocked.md | 🟡 |
| Просмотр баланса / история | payment/view_balance.md, payment/history.md | 🟡 |
| Пополнение счёта | payment/topup.md | 🟡 |
| Пополнение Google/Apple Pay | finance/pay_topup.md | 🟡 |
| Оплата счетов | payment/bill_payment.md | 🟡 |
| Подписки (рекуррент) | payment/subscription.md | 🟡 |
| Перевод внутри TeslaPay | finance/transfer_int.md | 🟡 |
| Перевод карта→карта | finance/card2card.md | 🟡 |
| Перевод SEPA | finance/sepa_transfer.md | 🟡 (есть эталонный пример по шаблону) |
| Снятие в банкомате | finance/cash.md | 🟡 |
| Обмен валюты | finance/exchange.md | 🟡 |
| Выписки по счёту (PDF) | — | 🔮 P1 |
| Закрытие счёта (регуляторный поток) | 🟡 payment/close | 🔮 уточнить полноту vs требование |
| Начисление процентов / неактивные счета / аналитика расходов | — | 🔮 P2–P3 |
cards¶
| Сценарий | Док | Статус |
|---|---|---|
| Заказ виртуальной карты | payment/card_v.md | 🟡 |
| Заказ пластиковой карты | payment/card_p.md | 🟡 |
| Активация карты | card/activity.md | 🟡 |
| Управление PIN карты (смена/сброс) | — | 🔮 P0 (PIN хранится открытым текстом) |
| 3DS для онлайн-оплаты картой | — (есть платформенный acq 3ds) | 📝/🔮 P1 |
| Диспут / чарджбэк по карте | — | 🔮 P1 |
limits-fees¶
| Сценарий | Док | Статус |
|---|---|---|
| Управление лимитами | payment/change-limits.md, support/limits.md, support/limits_rule.md | 🟡 |
| Комиссии | payment/fee.md | 🟡 |
b2b¶
| Сценарий | Док | Статус |
|---|---|---|
| Регистрация юр. лица | B2B/regBus.md | 🟡 |
| Смена управляющего | B2B/changeactor.md | 🟡 |
payments / эквайринг (платформенный контур, релевантный TeslaPay)¶
| Сценарий | Док | Статус |
|---|---|---|
| Возврат / чарджбэк (карточный) | — (платформенный wiki/main/acq/Fenige/Refund/* не разнесён) | 📝/🔮 P0 |
| Частичный захват / предавторизация | — | 🔮 P1 |
| Идемпотентность вебхуков PSP | — | 🔮 P1 |
| Сверка расчётов с PSP | — | 🔮 P0 |
| Повтор платежа с резервным каналом (Fenige→FusePay) | — | 🔮 P1 |
| Восстановление по таймауту 3DS | — | 🔮 P0 |
Trientes — покрытие¶
Текущее состояние: trientes/scenarios/* — дословные копии TeslaPay (не адаптированы) + Scenarios/search.md (универсальный поиск). Собственно Trientes (крипто-эквайринг) почти не описан.
| Сценарий Trientes | Док | Статус |
|---|---|---|
| Универсальный поиск | Scenarios/search.md | 🟡 единственный «родной» |
| Депозит (крипто-приём) | — | 📝 есть в системе (crypto-acquiring), описать |
| Фиатный офрамп (крипто→фиат, продажа/вывод) | — | 🔮 P0 (только депозит существует) |
| Котировка→подтверждение (фиксация цены на N сек) | — | 🔮 P1 |
| AML-блокировка в реальном времени | — | 🔮 P0 |
| Отказоустойчивость Changelly/Binance | — | 🔮 P2 |
| Базовые сценарии (auth/accounts/cards/...) | копии TeslaPay | 🟡 пометить sync: copy/fork, адаптировать (шаг 2) |
Шаг 2 = превратить копии в корректные Trientes-сценарии: общие — пометить
sync: copy(синхронны) либоfork(разошлись); специфичные крипто-эквайринговые — написать заново (офрамп, котировка, AML-блок).
Межпродуктовые пробелы (затрагивают всё, из аудита)¶
🔮 Аудит-трейл (P0, нет нигде) · распределённая трассировка · health-check protocol · circuit breakers · DLQ Kafka · Сага/компенсация мультисервисных транзакций · rate limiting на шлюзе · graceful degradation · feature flags · управление жизненным циклом данных. Это скорее архитектурные/нефункциональные темы — кандидаты в tech-info/диаграммы потоков (doc-architect), а не в пользовательские сценарии.
Сводный долг документации (приоритезация для шага 5)¶
Группа A — переписать существующее по шаблону (🟡→✅). ~50 сценариев TeslaPay. Массовая, механическая + сверка с кодом. Бьётся по доменам между doc-sa (по сервисам) и doc-ba (сквозные).
Группа B — описать существующее, но недокументированное (📝). Приоритет: 1. Возврат/чарджбэк (payments) — есть платформенный acq, разнести/описать. 2. Депозит Trientes (crypto) — есть в crypto-acquiring. 3. 3DS онлайн-оплата картой. 4. Выписки по счёту (если реализованы — проверить).
Группа C — целевые to-be (🔮), описывать при наличии решения/после сверки. P0 в первую очередь: PSD2 SCA, синхронная AML-блокировка, управление PIN карты, сверка расчётов, восстановление 3DS, фиатный офрамп Trientes, мультисподпись/HSM (крипто).
Перед переводом любого 🔮 в «as-is» — обязательная сверка с кодом (doc-sa): аудит от 2026-03 мог устареть (часть админских пунктов уже реализована — см. раздел 6 missing-scenarios.md).
Находки сверки с кодом (по мере прогона)¶
Расхождения «вики/admin_panel ↔ реальный код», вскрытые при переписи. Детали — в
Сверка с реализациейкаждого сценария.
Домен auth (TeslaPay, сверено 2026-06-26 по CREL/users, CREL/api-gateway)¶
- D-1. Статус нового пользователя =
confirmed, а неnew(CREL/users/internal/service/user.go:187). Вики иsc-001-registration.jsonговорятnew. Вопрос владельцу: так задумано или баг? Влияет на «нужен ли KYC до финопераций». - D-2. Сложности пароля (буквы+цифры) в коде нет — только длина 8–128.
- D-3. Шага «установка PIN» в
CRELнет (вероятно фронт). Подтвердить. - D-4. Блокировки после 5 неверных OTP нет; lockout есть только у TOTP-flow (эскалирующий, порог 5).
- D-5. Отдельных шагов consent/email в
usersнет (email опционален). - D-6. Методы 2FA (enable/confirm/disable) НЕ проброшены через api-gateway — точка входа фронта не подтверждена.
- D-7. Резервных кодов 2FA (admin_panel «8 кодов») в коде нет. Вход только по
phone(email не поддержан вSignIn). - Инфра-заметка: OTP-хранилище
users— in-memory map (теряется при рестарте, без счётчика попыток).
Домен auth — доп. находки (сверено 2026-06-26 по CREL/users, CREL/api-gateway)¶
- D-8. Пользовательское закрытие/удаление аккаунта НЕ реализовано в
CREL/users/api-gateway(несмотря на детальный сценарий и регуляторное требование). Статусremovedменяется только служебно/из KYC. Критично. - D-9. PIN и Face/Touch ID — полностью клиентские: серверного следа в
CRELнет (SC-002/SC-110/SC-114). Зафиксировать как платформенный факт. - D-10. Нет серверных гейтов подтверждения (2FA/доп. фактор) на бизнес-операции (изменение профиля SC-112, восстановление пароля SC-111), хотя матрица аутентификации их требует. Системный разрыв «матрица ↔ код».
- D-11. У
password_reset_requestнет TTL — бессрочно валидный reset-ключ/код до использования (security-гэп). - D-12. Терминология: вики
remote↔ кодremoved(статус).
Домен kyc-aml (сверено 2026-06-26 по CREL/kyc, CREL/scoring, CREL/crypto-gateway, CREL/admin-api)¶
- Корректировка прежнего тезиса: AML-скоринг не «fire-and-forget». Транспорт асинхронный (Kafka
scoring_requests→scoring_responses), но операция блокируется: crypto-gateway держит tx вWaitingScoringдо ответа (CREL/crypto-gateway/internal/service/user_tx_out.go:713-738). Fire-and-forget — только запись AML-алерта в admin-api. Особый кейс Marbleblock_and_review→ ответ не публикуется до решения оператора (admin-api поллит). - KYC-провайдер — welID (Sumsub-совместимый), не «SamSub»; загрузка документов через SDK провайдера, kyc получает вебхуки (HMAC-SHA1). Вердикт RED→
ON_HOLD(не REJECTED). - Единого «AML-балла пользователя» нет; medium/high — эвристика admin-api по reason; вердикт скоринга бинарный
is_ok. - TODO: где скорятся фиат-операции (в коде инициирует только crypto-gateway); сверка aml_1..aml_12 ↔ Marble/AmlScenario — отдельная волна.
Данные (сверено 2026-06-26)¶
- accounts (
CREL/accounts): схема миграций существенно расходится сadmin_panel/docs/analysis/db/01-accounts-db.md(2026-03-04, устарел).assets.id: модельstringvs БДUUID. - users (
CREL/users): схема расходится сadmin_panel/docs/analysis/db/02-users-db.md(устарел; EAVuser_dataудалена миграцией). Возможные «мёртвые»/легаси артефакты:users.is_activated(не читается репозиторием),activation_links(нет обращений вinternal/). - Общий вывод: admin-db-дампы от 2026-03 устарели — источник истины только миграции
CREL/<svc>.
🚩 Для инженерной/продуктовой команды (не доковые решения): D-1 (статус new/confirmed), D-8 (нет закрытия аккаунта), D-10 (нет серверных 2FA-гейтов на операции), D-11 (нет TTL у reset). Это потенциальные функциональные/комплаенс/security разрывы, выявленные при документировании.
Домены accounts / payments / cards (сверено 2026-06-26)¶
🚩 Значительная часть «платёжных» сценариев вики TeslaPay — целевые (to-be), не реализованы или не подключены к пользовательскому пути: - Закрытие счёта (SC-130): gRPC-метода нет; accounts.is_active — мёртвый toggle (нигде не вызывается). - Блокировка счёта (SC-131): scoring.ManualBlock — информационный флаг для админки, не enforced на пути денег (нет проверки в api-gateway/accounts), не меняет is_active. - Внутренний перевод (SC-141): реализован, атомарен (транзит-счёт, double-entry), но лимитов и 2FA в backend НЕТ, комиссия = 0. - Google/Apple Pay (SC-140), card→card P2P (SC-142), снятие в банкомате (SC-143): как описано — не существуют (G/A Pay только в крипто-обмене; P2P нет; ATM-обработчика нет; ближайшее — debit по Verestro-карте). - SEPA (SC-101): рельс есть в fuse-pay-service (провайдер Fuse, не абстрактный SEPA), но не подключён к api-gateway и не интегрирован с accounts; деньги — float64. - Пластиковая карта (SC-150): не реализована (конвейер всегда VIRTUAL). - PDF чеки/выписки, реальные IBAN/BIC (view_balance/history): в коде нет; IBAN/BIC в gateway — захардкоженные плейсхолдеры. - Деньги: внутри accounts — корректно NUMERIC(28,8); во внешних адаптерах fuse-pay-service/Fenige — float (нарушение принципа decimal).
🚩🔒 Security — сервис cards (репозиторий АРХИВИРОВАН, фиксы заблокированы до разархивации): - Вебхуки Verestro /external-api/verestro/* (балансы, кредит/дебет, reversal) — без аутентификации. - PIN передаётся провайдеру и логируется открытым текстом (doRequest печатает payload; входящие вебхуки логируются целиком). - Контракт CreateVirtualCardResponse возвращает полный PAN+CVV (на сейчас частично нейтрализовано закомментированным кодом). - HandleRequest без транзакции (// todo: use tx!) — риск частично созданных сущностей (баланс без карты).
Данные kyc / scoring (сверено 2026-06-26)¶
- kyc:
access_tokens.CreateAccessTokenстроит INSERT с несуществующей колонкой и не вызываетExec— токен доступа фактически не сохраняется (баг/мёртвый код). - scoring:
scoring_request.amountиcrystal_checks.risk_scoreхранятся строкой (VARCHAR) при decimal-семантике; рассинхрон типов модель↔схема. - admin-db-дампы (
08-kyc-db.md,05-scoring-db.md, 2026-03) — устарели; источник истины — миграции CREL.
Домены limits-fees / support / b2b / exchange (сверено 2026-06-26)¶
- 🚩 Лимиты НЕ enforced preflight. Учёт потребления — async из Kafka (
limiterconsumer), ноCheckExceedвызывает только admin-api по запросу оператора; ни один операционный сервис (accounts/перевод/обмен/эквайринг) лимит перед операцией не проверяет. Кэш лимитов — заглушки (return nil,false); учёт/проверка не атомарны (гонка), нет дедупликации Kafka-событий. - 🚩 Блокировка пользователя (SC-013):
users.SignInНЕ проверяетis_enable— заблокированный технически может авторизоваться (потенциальный баг,CREL/users/internal/service/user.go:234-281). Отмены активных операций/сессий при блокировке нет. - 🚩 B2B не реализован: регистрация ЮЛ (SC-181) отсутствует полностью; смена управляющего (SC-180) — лишь операторский toggle
is_manager, без бизнес-воркфлоу (профиль ЮЛ, приглашение, подтверждение, KYC управляющего). - Оплата счетов (SC-171) и подписки/рекуррент (SC-172) — не реализованы (целевые; «invoice» в эквайринге — это карточный эквайринг мерчанта, не коммунальные платежи).
- Обмен валюты (SC-190): реализован в 2 контурах — quick-exchange (внутренний, decimal, курс из orderbook) + ExchangerService (крипто + фиат on/off-ramp; G/A Pay/SEPA — методы оплаты фиат-обмена). Лимитов пользователя в обмене нет.
- Единого fee-сервиса нет; комиссии считаются в эквайринге (
decimal). Self-service управления лимитами пользователем нет (ставит оператор).
Данные limiter / sender / courses (сверено 2026-06-26)¶
- limiter: суммы в БД
NUMERIC(18,2), но в Go —string+ParseFloat/NullFloat64(нарушение decimal, потеря точности). Кэш — заглушки; нет ретеншна партицийevents. - courses: курсы корректно
NUMERIC(28,8)/decimal; нюанс — SMA читаетAVG(price)вfloat64. - sender: денежных колонок нет;
notification_params.codeглобально UNIQUE — конфликт с мультипроектностью;notification_senders.config(JSONB) = credential провайдеров. - Дампов limiter/sender/courses в admin-db нет (аудит 2026-03 не смог подключиться к их БД) — сверка только по коду.
AML-правила aml_1..aml_12 (SC-201..212, сверено 2026-06-26)¶
- 🚩 Ни одно из 12 AML-правил не реализовано хардкодом в CREL. Транзакционный AML:
scoringвызывает внешний rule-engine Marble (одинScenarioID) + Crystal (KYT крипто-адресов). Вся логика правил (пороги, окна, агрегаты, словари, списки стран/категорий, velocity) — в конфиге Marble, которого нет в репозитории →verified_with_code: falseдля всех 12. admin-api.AmlScenario— только CRUD-каталог метаданных правил (код/порог/regulatory basis) для UI + запись AML-алерта поis_ok=false; движок оценки не там. Seed даёт маппинг aml_N →SCN-0NN.- 🚩 Контракт
ScoringRequestнесёт одну операцию без истории/агрегатов/страны/описания/категории/признака high-risk → правила, требующие этих данных (бездействие, обороты, ключевые слова, страны, «первая операция», круговые переводы, high-risk), на стороне CREL принципиально невычислимы без агрегации внутри Marble или доработки контракта. Вопрос владельцу: где хранятся чёрный список (aml_7), страна операции (aml_9), признак high-risk (aml_12); есть ли batch-прогон для aml_12.
Данные crypto-gateway / cards / quick-exchange / notifications (2026-06-26)¶
- 🚩🔒 crypto-gateway: приватные ключи кошельков — открытым текстом (
keys.private_key_hex, без Vault/KMS/HSM, используются напрямую при подписи; тестовые ключи в сиде). RPC-URL/API-ключи адаптеров — тоже plaintext (adapter.url/option). P0. - crypto-gateway: типы сумм непоследовательны — часть
NUMERIC, часть строкой (user_tx_out.amount,commission_*, балансы system-кошельков) — риск точности. 15 таблиц, 15 FK. - cards: текущая схема (миграции) ЛУЧШЕ устаревшего admin-дампа по PCI — хранится только last4 PAN, CVV/PIN не персистятся (PIN — плейсхолдер
wpin). Балансы — целые в минорных единицах (BIGINT). (Замечания аудита 07-cards-db о plaintext PAN/CVV — к текущей схеме не относятся.) - quick-exchange: суммы
NUMERIC(99,18), ноhistory.fee— строкой. notifications: 2 таблицы (notifications,templates), FK нет.
Что дальше¶
- Шаг 5 работает по группам A→B→C, каждый сценарий — по
_TEMPLATE/scenarios/sc-000-template.md, со сверкой кода (doc-sa) и индексом. - Шаг 2 (Trientes) использует группу из раздела Trientes выше.
- Шаг 6 (диаграммы) — после готовности сценариев, swimlane-модель уже заложена в шаблон.
- Этот файл ведёт doc-ba; обновлять по мере закрытия пробелов.