Блог · 2026-08
Смена исполнителей и багфиксы кэша
5 августа 2026: кнопка «Сменить исполнителей» на закрытой заявке с переносом ЗП; фиксы Redis (500 на услугах, type-drift дашборда).
5 августа 2026: серия исправлений стабильности CRM и новая возможность — смена мастера/менеджера на уже закрытой заявке с переносом начисленной зарплаты.
Новая функция: «Сменить исполнителей»
Зачем
Заявку уже провели, зарплата начислена, а мастер или менеджер указаны неверно (опечатка, другой исполнитель доделал работу). Раньше статус с «запретом редактирования» блокировал карточку целиком: смена не сохранялась, начисления оставались у прежнего сотрудника.
Как пользоваться
- Откройте карточку закрытой (проведённой) заявки.
- В шапке рядом с неактивным карандашом нажмите «Сменить исполнителей» (иконка двух человек).
- Выберите нового менеджера и/или мастера → сохраните.
Система записывает исполнителей в заявку и, если начисления уже есть, переносит их на нового сотрудника: суммы те же, повторно закрывать заявку не нужно. На открытой заявке ту же замену можно сделать через обычное «Редактировать».
Нужно право edit_orders. Полное редактирование услуг/цен на закрытой заявке по-прежнему требует смены статуса.
Для разработчиков
- UI:
assignees_only=1в форме карточки заявки. - API:
POST /api/orders/<id>/assigneesсmanager_id/master_id. - Подробнее: USER_GUIDE § 5.4.1, API, сценарий рабочего дня.
1. Добавление услуги/запчасти: 500 и «Unexpected token»
Симптом: в карточке заявки кнопка добавления услуги или запчасти отвечала HTML-ошибкой вместо JSON; в консоли браузера — Unexpected token '<'.
Причина: кэш Redis сохранял объект заявки (Order) как строку. Следующий запрос читал строку и падал при обращении к полям вроде status_id.
Исправление:
- кэш моделей order / customer / device отключён;
- в JSON для моделей используется to_dict();
- проверка «можно ли редактировать» идёт через SQL, без загрузки объекта из кэша.
2. Разный тип данных из Redis и из памяти
Симптом: плавающие ошибки на главной и в отчётах (%.0f / total_sum, даты, ключи справочников) — то работает, то нет.
Причина: после промаха кэша в Redis уходил JSON (даты → строки, Decimal → число/str, ключи dict → строки), а в память клался «сырой» Python-объект. Hit из Redis и hit из memory давали разные типы.
Исправление:
- единая нормализация _to_json_safe перед записью и в Redis, и в memory;
- ключи usage-counts сразу как str(id);
- в шаблонах дашборда/отчётов для денег — |float как защита;
- на WORK очищены префиксы кэша после выката.
3. Что было сломано до кнопки «Сменить исполнителей»
До появления кнопки смена мастера/менеджера на проведённой заявке фактически не работала: UI блокировал редактирование, отдельного сценария переноса ЗП не было. Теперь это штатная функция (см. блок выше).
Что проверить после обновления
- Открыть заявку → добавить услугу/запчасть — ответ JSON, без 500.
- Главная и отчёты с Redis — без TypeError на суммах.
- Проведённая заявка с начислениями → «Сменить исполнителей» → в блоке зарплаты и в отчёте ЗП фигурирует новый мастер/менеджер.
Для администраторов
После деплоя на среде с Redis достаточно перезапуска web и при необходимости очистки ключей кэша (dashboard_*, reports_*, ref_*) — полный FLUSHDB не обязателен, если Redis общий с Socket.IO.