🧩 Функциональные модули (паритет с 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.
Прочее (реализовано)
- IBAN-валидация бенефициаров (
ibanutil.py, ISO 13616 mod-97 + длины стран).
- Реверсы платежей - reject возвращает и сумму, и комиссию (негирующая
RevenueEntry, source
payment_fee_reversal).
- Депозиты (money-in) через ledger
credit (entry_type topup), не хаком.
- Печатные PDF (browser Print-to-PDF): выписка клиента + комплаенс-досье.
- Дашборд-мини-графики (inline SVG: маржа + платежи 14 дней).
- Whitelabel-темизация: слой бренд-токенов (
--brand-*) в кабинете, дефолт-тема
нейтральная (коробка) + StefaPay-тема (Manrope, navy+gold) поверх.
Сознательно НЕ строим
| Область |
Почему |
| 🌐 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.