Skip to content

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):

  1. Проверка рабочего дня. По дате смены (start_date или shift.start_date) вызвать is_working_day(year, month, day). Если день нерабочий (выходной/праздник) — не начислять оплату за смену: pay_shift_flat = 0, вклад переработок = 0, mast_pay_plus_over_time_pay_flat = 0 (или только вычеты обед/штраф по согласованию).

  2. Рабочий день. Получить ставку за час через фасад get_cost_per_hour_for_month(salary, year, month) и использовать её как pay_of_hour_flat. Расчёт оплаты за смену — по существующей логике pay_shift() с этой ставкой. Переработки не учитывать: вклад от application() для переработок/сверхурочной смены при type=4 обнулять (application_flat = 0 для переработок), over_time не использовать.

  3. Константа типа. Использовать именованную константу TYPE_PRODUCTION_CALENDAR = 4 (в модели Salary или в app/manufacture/constants.py) во всех проверках.

  4. Граничные случаи. При отсутствии даты смены не вызывать API; оплату по календарю не начислять. При type=4 и monthly_salary is None или 0 — не вызывать API, ставка = 0.

Обоснование

  1. Соответствие ADR-002 — выходные не оплачиваются (проверка is_working_day), переработки не оплачиваются (обнуление application_flat для переработок).
  2. Минимальные изменения в модели — вызов фасадов вместо прямой работы с HTTP; зависимость от сервиса инкапсулирована в фасаде.
  3. Консистентность — один источник правды для «рабочий ли день» и «стоимость часа» (календарь + monthly_salary).

Consequences

  • (+) Расчёт смен при type=4 полностью соответствует бизнес-правилам (только рабочие дни, без переработок).
  • (-) При сбое API календаря или отсутствии даты смены оплата за смену может быть 0; необходимо логирование через logger (не print).

Источник: backend/narmak_v2/app/manufacture/ADR.md (ADR-004)