🧩 Функциональные модули (паритет с Iorys)

Что реализовано и LIVE. Оценка дистанции до Iorys (на 2026-08-22): ~88% «достаточно работать банком», ~60% полный паритет со всей поверхностью Iorys. Hub сознательно НЕ строим - роль процессинга закрывает Papaya. Логика модулей - в capital_shared (см. 01/03); данные - в 02 - Модель данных.md.

Ядро банка (8 модулей, LIVE 2026-08-21)

# Модуль Что делает
1 FX / мультивалюта ставки в back-office, конвертация между кошельками клиента (fee в bps); fx.py
2 Отчёты + аудит + выписка audit-log действий операторов, CSV-выписка клиента
3 Users & Roles админка операторов (CEO-only): создать/роль/блок/локаут/сброс пароля; self- и last-CEO-guard
4 Лимиты платежей per_transaction + daily_outgoing, применяются в /pay до debit
5 Инвойсы клиент выставляет счета своим плательщикам, печатный вид, изоляция по client_id
6 Messaging оператор↔клиент (to_client/to_bank), непрочитанные, авто-mark-read
7 AML/Risk workflow кейсы риска, 4-eyes/6-eyes (low=1/medium=2/high=3), UNIQUE(case,operator), авто-подъём на high-risk-страну при онбординге, блок активации при открытом кейсе
8 Тарифы / выручка Tariff (пер-валюта: fixed+percent_bps+min/max + себестоимость + opening fee + fx_fee_bps) + ClientTariff (override) + RevenueEntry (fee+cost). 3 источника выручки: payment_fee, account_opening, fx_fee; отчёт /revenue показывает выручку/себестоимость/маржу

Комплаенс-глубина (5 модулей, LIVE 2026-08-22)

Модуль Что делает
🅰 Risk-scoring детерминированный движок risk.py (страна/доход/KYC/санкции → score 0-100 + level) → гейтит required_approval_level AML-кейса; ручной override на карточке
🅱 Sanctions-скрининг SanctionSource+SanctionEntry, нормализация имён + subset-match; онбординг авто-скринит и заводит high-risk кейс; демо-списки OFAC/EU/UN + возможность грузить реальные
🅲 Справочники CustomerTag/CompanyTag (цветные метки), Branch (филиалы), ReferralAgent (реестр, commission_bps; payout-движок отложен)
🅳 Формальные отчёты Report - EOD (пер-валюта: обороты/платежи/fees/маржа/баланс) + Journal (реестр проводок за период); CSV регенерится из params
🅴 Обмен документами ClientDocument - оператор запрашивает → клиент грузит → approve/reject; файлы BLOB (5MB cap + allowlist + sanitize), изоляция по client_id

Деньги и карты

Модуль Статус Что делает
🛤 Papaya rail simulate SEPA SCT/Inst, VoP, loro, block/close; провижн клиента/счёта; статусы pull-based
💳 NS Cards simulate выпуск (virtual/physical), reveal (view-once + 3DS step-up у клиента), freeze/close, спенд-лимиты per-tx/daily/monthly, вебхук spend HMAC; PAN не хранится; CardProgram multibrand
💰 Card-funding LIVE 16.09 CardFundingRequest - фондирование выпуска/пополнения карты, матчинг входящего платежа по уникальной сумме (base + «хвост»-центы); ledger entry card_funding
🧭 KYT LIVE screen_payment (крупная сумма / high-risk страна / велосити / структурирование) → AML-кейс (алерт, платёж не блокируется)
🪙 XBO (крипто-шлюз) ветка feature/xbo-integration USDT-TRC20 депозиты (tagged-адреса) → зачисление в client-ledger → вывод фиата; auth пробит 16.09 (3e39f4e); этап 2 (OTC, Nostro, ConversionOrder) - доделать. См. 08 - XBO
📊 Казначейка ветка feature/treasury-monitor read-only монитор активов (0 money-эндпоинтов, SELECT-only роль). См. 09 - Казначейка

Учёт и SAR (паритет закрыт, LIVE 2026-09-15)

Модуль Что делает
📒 Accounting ChartOfAccount (иерархия FINREP: Assets/Liabilities/Equity) + производный Balance Sheet из client-ledger (accounting.py build_balance_sheet): customer_deposits (liability) + retained_earnings (equity) = cash_settlement (asset), Start/Debit/Credit/Difference/End, per-currency + период. НЕ полная двойная запись - план счетов + производный баланс; эволюция до полного GL позже
🚨 SAR SarReport поверх AML-кейсов (priority, статус draft→submitted→filed→closed, narrative). Владеет compliance (sar.manage)
💳 Opening-fee настраиваемая функция тарифов: prepay (списать сразу) / first_topup (с первого пополнения). Реальный debit (openingfee.py), дефолт сид = 0 (opt-in)

Онбординг-визард (LIVE 2026-09-16)

Модуль Что делает
📧 Email-first (2 шага) email + пароль → письмо-verify → анкета; гонка дублей email → 409 (P2-1)
📝 Многоблочная анкета (9 блоков) по корпоративной анкете Stefa Pay: компания, адрес, заявитель, директора/UBO (CompanyPerson), AML-профиль, тариф (инфо), документы, SumSub; черновик после каждого шага + «Continue application»; +37 полей Company
🛡 P2-hardening revenue partial-unique (order,source) + advisory-lock на cap открытия счетов + double-reject

Детали потока - processes/01 - Онбординг клиента.md.

Прочее (реализовано)

Сознательно НЕ строим

Область Почему
🌐 Hub («Connect») процессинг отдаём партнёру Papaya (целевая архитектура)
🔀 payment-flows / schemes конструктор спекулятивно без live-мультирельса

Тесты

Каждый модуль покрыт pytest. Крайний полный прогон 2026-09-16 (ветка feature/xbo-integration, включает 21 XBO-тест): back-office 182, cabinet 73 - все зелёные. У кабинета отдельный venv (иначе тянет модели back-office без CabinetUser) - ставить -e ./shared -e ./<svc>[dev] как в CI.