💰 Казначейка (Treasury Monitor, read-only)
Отдельный read-only сервис-панель для мониторинга активов и денежных потоков банка. Код - ветка
feature/treasury-monitor(коммит32b07e6) головногоcapital, каталогtreasury/(в main НЕ смержено). Бренд Stefa Pay (navy + gold, Manrope). Обновлено: 16.09.2026.
Что это
Дашборд казначея: остатки клиентов по валютам, карточки ностро, платежи в пути, оборот за 14 дней, начисленные комиссии, последние движения. Архитектурная гарантия: двигать деньги из этого сервиса невозможно - 0 money-эндпоинтов.
Состав
- FastAPI + async SQLAlchemy, server-rendered Jinja2 (
app/templates/dashboard.html). - 7 эндпоинтов, все GET:
/(дашборд) ·/health·/robots.txt·/api/summary·/api/nostro·/api/payments·/api/balances/clients·/api/fees·/api/turnover. - Любой POST/PUT/PATCH/DELETE → 405 (
ReadOnlyGuardMiddlewareрежет до роутинга). - Статический превью без БД:
treasury/preview.html(+ генераторmake_preview.py). - 🌐 Публичное демо (mock, статика): capital-treasury-demo.pages.dev - Cloudflare Pages, помечено DEMO. Живой сервис на реальных данных за Cloudflare Access - позже.
- Тесты:
tests/test_readonly.py- все эндпоинты GET-only, все write-методы 405.
Экраны
| Виджет | Что показывает |
|---|---|
| KPI-панель | total client funds (EUR) · resting / in-flight / held поручения · оборот день/месяц · комиссии |
| Карточки ностро (6) | Harbor Hills EUR/USD · Papaya EUR · EMQ GBP · XBO USDT (TRC20) · XBO EUR; сальдо = own + client funds, стек-бар |
| Матрица платежей | ~80 платежей: номер, компания, сумма, статус, где находится, чьё следующее действие (Treasury/Operations/Bank/Compliance) |
| Матрица клиентов | компания → остатки по валютам (сортировка по EUR-эквиваленту) |
| Комиссии | доход по источникам: payment_fee / fx_fee / account_opening / card_fee |
| Оборот 14 дней | line-чарт (inline SVG) по дневным дебет-постингам |
Данные - SELECT по: ClientWallet, Company, PaymentOrder, Beneficiary,
ClientLedgerEntry, RevenueEntry, FxRate.
Безопасность (несколько слоёв)
- Код: ни одного write-роута;
wallet.py/ платёжные движки не импортируются; сессии БД безcommit(). - БД: отдельная SELECT-only роль
capital_ro; конфиг fail-closed в prod - отвергает sqlite-URL и подключение владельцемcapital. - HTTP: CSP, nosniff, X-Frame DENY, HSTS, Referrer-Policy, Permissions-Policy.
- Доступ: опциональный
TREASURY_ACCESS_TOKEN(backstop); основной гейт - Cloudflare Access (Zero-Trust, настраивается вне репо).
Что осталось до прода
| # | Доделка | Статус |
|---|---|---|
| 1 | Таблица nostro_accounts в Capital (реальные балансы ностро + reconciliation) |
нет - карточки пока из статик-конфига app/nostro.py, own_liquidity = placeholder |
| 2 | Reconciliation-фид от провайдеров (Papaya / Harbor / XBO) + сверка | placeholder «Reconciliation: -» |
| 3 | Фиксация FX-курса на 00:00 для оборота (сейчас - текущий курс) | нет |
| 4 | Создать роль capital_ro в prod-БД (SQL есть в README сервиса) |
перед деплоем |
| 5 | Cloudflare Access на домен казначейки | перед деплоем |
| 6 | Мерж feature/treasury-monitor в main + деплой |
ждёт очереди мержей |
🚫 Железное: при любых доделках сохранить read-only - 0 money-эндпоинтов, SELECT-only роль. Это принцип фичи, не техдолг.