Блог · 2026-08
Зарплата и возвраты оплат
5 августа 2026: разбивка начислений по оплатам больше не учитывает полностью возвращённые платежи — без «двойных» строк в /salary.
5 августа 2026: исправление отображения начислений, когда по заявке есть возврат оплаты.
Симптом
В карточке зарплаты сотрудника одно начисление по заявке выглядело как две (или больше) строки с долями по разным оплатам — хотя в базе сумма начисления одна, а net оплат уже уменьшен возвратом.
Типичный сценарий:
- По заявке внесли оплату (например, 3000 ₽).
- Добавили ещё одну оплату и сделали по ней полный возврат.
- В
/salaryначисление дробилось и на «живую», и на полностью возвращённую оплату.
Итог суммы по строкам мог совпадать с начислением в БД, но визуально казалось, что зарплата «задвоилась» или размазана по отменённому платежу.
Причина
Разбивка начислений по оплатам в дашборде ЗП брала все платежи со статусом captured и отфильтровывала только строки с kind = refund.
Исходная оплата после возврата остаётся captured (возврат — отдельная запись), поэтому она продолжала участвовать в пропорции.
Расчёт суммы начисления в SalaryService уже учитывал возвраты (net), а отображение — нет.
Исправление
Перед разбивкой:
- суммируются возвраты по
refunded_of_id; - из суммы оплаты вычитается возвращённое (net);
- при полном возврате (net ≤ 0) оплата не попадает в разбивку;
- при частичном — в долю идёт оставшийся net.
Файл: app/services/salary_dashboard_service.py.
Что проверить
- Заявка с оплатой + полный возврат другой оплаты → в карточке сотрудника одна доля на «живую» оплату.
- Сумма строк по заявке =
amount_centsначисления в БД. - Повторное закрытие / смена мастера без лишнего пересчёта — как в предыдущем посте.
Связанные фиксы зарплаты (тот же день)
- не пересоздавать ЗП при смене мастера и повторном закрытии;
- при переносе начислений обновлять отображаемый % под нового исполнителя.
Связанный UI-баг: двойная модалка оплаты из /all_orders
При закрытии заявки из реестра открывалась вкладка с open_payment_modal=1. После внесения оплаты страница перезагружалась с тем же флагом в URL — модалка просила сумму снова.
Исправление (templates/order_detail.html): флаг сразу снимается из URL; модалка не открывается при долге ≤ 0; после оплаты reload идёт на чистый URL; из потока all_orders после оплаты включается выбор печати, как при закрытии с карточки.