К содержанию
Nika CRM

Блог · 2026-08

Смена исполнителей и багфиксы кэша

5 августа 2026: кнопка «Сменить исполнителей» на закрытой заявке с переносом ЗП; фиксы Redis (500 на услугах, type-drift дашборда).

5 августа 2026: серия исправлений стабильности CRM и новая возможность — смена мастера/менеджера на уже закрытой заявке с переносом начисленной зарплаты.

Новая функция: «Сменить исполнителей»

Зачем

Заявку уже провели, зарплата начислена, а мастер или менеджер указаны неверно (опечатка, другой исполнитель доделал работу). Раньше статус с «запретом редактирования» блокировал карточку целиком: смена не сохранялась, начисления оставались у прежнего сотрудника.

Как пользоваться

  1. Откройте карточку закрытой (проведённой) заявки.
  2. В шапке рядом с неактивным карандашом нажмите «Сменить исполнителей» (иконка двух человек).
  3. Выберите нового менеджера и/или мастера → сохраните.

Система записывает исполнителей в заявку и, если начисления уже есть, переносит их на нового сотрудника: суммы те же, повторно закрывать заявку не нужно. На открытой заявке ту же замену можно сделать через обычное «Редактировать».

Нужно право edit_orders. Полное редактирование услуг/цен на закрытой заявке по-прежнему требует смены статуса.

Для разработчиков


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 блокировал редактирование, отдельного сценария переноса ЗП не было. Теперь это штатная функция (см. блок выше).

Что проверить после обновления

  1. Открыть заявку → добавить услугу/запчасть — ответ JSON, без 500.
  2. Главная и отчёты с Redis — без TypeError на суммах.
  3. Проведённая заявка с начислениями → «Сменить исполнителей» → в блоке зарплаты и в отчёте ЗП фигурирует новый мастер/менеджер.

Для администраторов

После деплоя на среде с Redis достаточно перезапуска web и при необходимости очистки ключей кэша (dashboard_*, reports_*, ref_*) — полный FLUSHDB не обязателен, если Redis общий с Socket.IO.

← Все записи блога · Документация