Самокритика 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

  1. E1.1 micro-патч — фиксы #1, #3, #4 (RBAC scope в KPI, маршрутизация, workflow статусов сделки). 1 день.
  2. E2 — парсинг курсов из TG, автозабор indicative_rate в сделке.
  3. E3 — клиент-бот с FSM + карточка-заявка менеджеру.

Что НЕ проверял

  • Прохождение полного флоу «логин → создание сделки → закрытие → отображение в дашборде» вручную. По curl всё отвечает 200, формы работают на CSRF — но end-to-end через POST не прогонял. Жду что ты сам пройдёшь.
  • Mobile — глазами не смотрел, по структуре должно быть OK (наследует v0.5).