5. Интеграция в расчёт смен (ActualWorkShedule) при type=4
Date: 2026-02-03
Status
Accepted
Context
В clac_payment_day() (ActualWorkShedule) сейчас ставка за час берётся из personal.worker_salary.pay_of_hour. При type=4 ставка должна вычисляться по производственному календарю, а работа в выходные и переработки не должны оплачиваться.
Decision
В clac_payment_day() при worker_salary.type == TYPE_PRODUCTION_CALENDAR (4):
Проверка рабочего дня. По дате смены (
start_dateилиshift.start_date) вызватьis_working_day(year, month, day). Если день нерабочий (выходной/праздник) — не начислять оплату за смену:pay_shift_flat = 0, вклад переработок = 0,mast_pay_plus_over_time_pay_flat = 0(или только вычеты обед/штраф по согласованию).Рабочий день. Получить ставку за час через фасад
get_cost_per_hour_for_month(salary, year, month)и использовать её какpay_of_hour_flat. Расчёт оплаты за смену — по существующей логикеpay_shift()с этой ставкой. Переработки не учитывать: вклад отapplication()для переработок/сверхурочной смены при type=4 обнулять (application_flat = 0для переработок),over_timeне использовать.Константа типа. Использовать именованную константу
TYPE_PRODUCTION_CALENDAR = 4(в модели Salary или вapp/manufacture/constants.py) во всех проверках.Граничные случаи. При отсутствии даты смены не вызывать API; оплату по календарю не начислять. При type=4 и
monthly_salaryis None или 0 — не вызывать API, ставка = 0.
Обоснование
- Соответствие ADR-002 — выходные не оплачиваются (проверка is_working_day), переработки не оплачиваются (обнуление application_flat для переработок).
- Минимальные изменения в модели — вызов фасадов вместо прямой работы с HTTP; зависимость от сервиса инкапсулирована в фасаде.
- Консистентность — один источник правды для «рабочий ли день» и «стоимость часа» (календарь + monthly_salary).
Consequences
- (+) Расчёт смен при type=4 полностью соответствует бизнес-правилам (только рабочие дни, без переработок).
- (-) При сбое API календаря или отсутствии даты смены оплата за смену может быть 0; необходимо логирование через logger (не print).
Источник: backend/narmak_v2/app/manufacture/ADR.md (ADR-004)