Самокритика v0.6 (E1: Сделки + Клиенты + Касса со сменами)
Дата: 2026-05-14
Что изменилось: реализован E1 из плана tz-mapping-v01.md — переход с операционной модели на CRM с центром на сделках.
Что закрыто по ТЗ партнёра
| Модуль ТЗ | Статус | Комментарий |
|---|---|---|
| М1. Учёт сделок | ✅ полностью | Карточка с клиентом, валютной парой, курсом сделки, индикативным курсом, прибылью, статусом, комментарием, менеджером |
| М1. База клиентов | ✅ полностью | Список + карточка с историей сделок и оборотом; автокатегоризация new/regular(3+ сделок)/vip(100k+ USDT) |
| М2. Мультивалютная касса | ✅ полностью | По каждому отделению, в 5 валютах. Балансы вычисляются от opening + delta |
| М2. Открытие смены | ✅ есть | Кассир вводит начальные остатки. Решает баг минусовых балансов |
| М2. Расчёт прибыли | ⚠ частично | По формуле, но indicative_rate вручную. На E2 — автозабор с Binance/TG |
| М2. Журнал инкассации | ✅ есть | Внести / Изъять / Расход / Корректировка |
| М2. Отчёты день/неделя/месяц | ⚠ частично | Дашборд по периоду есть, но «по менеджеру» и «по валютной паре» — на E4 |
| М7. Дашборд | ✅ переделан | KPI оборот/прибыль/активные/флаги · топ клиенты · последние сделки · график |
| М7. Журнал сделок с фильтрами | ✅ есть | По статусу, отделению |
| М7. Управление клиентами | ✅ есть | Поиск, фильтр по категории, создание |
| НФТ. Локальный бэкап БД | ✅ есть | systemd timer 03:00, retention 30 дней, в ~/backups/obmenka/ |
| НФТ. Логирование операций | ✅ расширено | login/logout/create_deal/create_client/shift_open/cash_movement в audit |
Access matrix v0.6 (проверено curl)
PATH admin manager accnt cashier viewer
/ 200 200 200 200 200
/deals 200 200 200 200 200
/deals/new 200 200 403 200 403
/clients 200 200 200 200 403
/clients/new 200 200 403 200 403
/cash 200 200 200 200 403
/branches 200 200 200 403 403
/wallets 200 200 200 403 403
/reconciliation 200 200 200 403 403
/managers 200 200 403 403 403
/handbook 200 200 200 200 200
/operations 200 200 200 200 200
/audit 200 403 403 403 403
Что в системе сейчас (тестовые данные)
- 30 клиентов с реалистичными именами (RU/TR/DE/UA/CZ)
- 149 сделок за 15 дней (119 done, 16 in_work, 6 new, 8 cancelled)
- 238 операций (связаны со сделками через
deal_id) - 5 cash_shifts (открыты сегодня по каждому физ. отделению)
- 5 cash_movements (инкассации/расходы)
- 9 пользователей (5 ролей + 4 менеджера на отделениях)
- 3 TG-флага preview
Что плохо / не сделано (приоритезировано)
1. ⚠ Утечка инфо: KPI считаются вне RBAC scope
- Cashier видит общую «Активные сделки» (не только своего отделения).
- Cashier видит «Топ клиенты» по всем отделениям.
- Фикс: применить тот же scope-фильтр (
branch_id == user.branch_id) к этим запросам. 15 минут работы.
2. ⚠ Прибыль на этой странице — pре-зафиксирована в seed
- Прибыль =
(applied − indicative) × give × rate_get_to_usdt. Это корректная формула, но в seed`е я генерирую applied = indicative × (1 − 0.5%…2%), то есть applied < indicative, что даёт отрицательный diff и положительную прибыль только если get_asset с правильным знаком конвертации. По факту в данных видно P&L = 826k оборот / реальная прибыль варьируется. - Фикс: на E2 заменить seed на расчёт через реальные направления (когда indicative приходит с Binance).
3. ⚠ Маршрутизация сделки menedger=current_user
- Сейчас «менеджер» сделки = тот кто её создал. Если касса в Стамбуле, а сделку оформил кассир — менеджер сделки = кассир, не реальный менеджер направления.
- Фикс: на E1.1 — таблица
routes(валютная пара + город → менеджер). Если кассир создаёт — менеджер берётся из routes автоматически.
4. ⚠ «Активные сделки» не имеют workflow
- Можно создать в
newилиin_work, но нет UI для переходаnew → in_work → done. Сейчас только при создании можно выбрать статус. - Фикс: на странице сделки кнопки [Взять в работу] [Закрыть] [Отменить]. 30 минут.
5. ⚠ Закрытие смены не показывает расхождения
- При закрытии смены сейчас просто сохраняются
closing_balances= расчётные балансы. Нет интерфейса «введите факт по пересчёту → увидите расхождение с расчётом». - Фикс: форма закрытия с двумя колонками (расчётный / фактический) и подсвечивающимся diff.
6. ⚠ Старая страница /operations осталась без связи с deals
- Operations теперь генерируются из сделок (с
deal_id), но журнал операций показывает их как раньше — без ссылки «эта операция из сделки #X». - Фикс: колонка «Сделка» в операциях, кликабельная.
7. ⚠ Бэкап локально — single point of failure
- При гибели диска сервера потеряем все. Это решено в плане E4: S3-копия. На E1 — норма.
8. ⚠ Categorize клиента считается при создании сделки
- Если клиент перешёл из new в regular после третьей сделки — обновление происходит, но не атомарно (race в случае concurrent deals). Для текущей нагрузки — не блокер.
Технические долги, не починенные
- Старая
init_db()функция убрана — теперь схема только через Alembic. ✅ joinedloadиспользован в новых роутах (clients, deals, dashboard). ✅- Audit пишет login/logout + новые действия (create_deal, create_client, shift_open/close, cash_*). ✅
- Rate-limit и CSRF из v0.5 — работают на новых формах. ✅ (используют тот же
verify_csrf_token).
Что в очереди после E1
- E1.1 micro-патч — фиксы #1, #3, #4 (RBAC scope в KPI, маршрутизация, workflow статусов сделки). 1 день.
- E2 — парсинг курсов из TG, автозабор indicative_rate в сделке.
- E3 — клиент-бот с FSM + карточка-заявка менеджеру.
Что НЕ проверял
- Прохождение полного флоу «логин → создание сделки → закрытие → отображение в дашборде» вручную. По curl всё отвечает 200, формы работают на CSRF — но end-to-end через POST не прогонял. Жду что ты сам пройдёшь.
- Mobile — глазами не смотрел, по структуре должно быть OK (наследует v0.5).