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

Блог · 2026-08

Зарплата и возвраты оплат

5 августа 2026: разбивка начислений по оплатам больше не учитывает полностью возвращённые платежи — без «двойных» строк в /salary.

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

Симптом

В карточке зарплаты сотрудника одно начисление по заявке выглядело как две (или больше) строки с долями по разным оплатам — хотя в базе сумма начисления одна, а net оплат уже уменьшен возвратом.

Типичный сценарий:

  1. По заявке внесли оплату (например, 3000 ₽).
  2. Добавили ещё одну оплату и сделали по ней полный возврат.
  3. В /salary начисление дробилось и на «живую», и на полностью возвращённую оплату.

Итог суммы по строкам мог совпадать с начислением в БД, но визуально казалось, что зарплата «задвоилась» или размазана по отменённому платежу.

Причина

Разбивка начислений по оплатам в дашборде ЗП брала все платежи со статусом captured и отфильтровывала только строки с kind = refund.
Исходная оплата после возврата остаётся captured (возврат — отдельная запись), поэтому она продолжала участвовать в пропорции.

Расчёт суммы начисления в SalaryService уже учитывал возвраты (net), а отображение — нет.

Исправление

Перед разбивкой:

  • суммируются возвраты по refunded_of_id;
  • из суммы оплаты вычитается возвращённое (net);
  • при полном возврате (net ≤ 0) оплата не попадает в разбивку;
  • при частичном — в долю идёт оставшийся net.

Файл: app/services/salary_dashboard_service.py.

Что проверить

  1. Заявка с оплатой + полный возврат другой оплаты → в карточке сотрудника одна доля на «живую» оплату.
  2. Сумма строк по заявке = amount_cents начисления в БД.
  3. Повторное закрытие / смена мастера без лишнего пересчёта — как в предыдущем посте.

Связанные фиксы зарплаты (тот же день)

  • не пересоздавать ЗП при смене мастера и повторном закрытии;
  • при переносе начислений обновлять отображаемый % под нового исполнителя.

Связанный UI-баг: двойная модалка оплаты из /all_orders

При закрытии заявки из реестра открывалась вкладка с open_payment_modal=1. После внесения оплаты страница перезагружалась с тем же флагом в URL — модалка просила сумму снова.

Исправление (templates/order_detail.html): флаг сразу снимается из URL; модалка не открывается при долге ≤ 0; после оплаты reload идёт на чистый URL; из потока all_orders после оплаты включается выбор печати, как при закрытии с карточки.

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