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