История изменений от 13.10.2026
Требования включены в единую спецификацию, расчётный контракт и проверки. Этот документ больше не является отдельным источником действующих требований.
Историческая редакция дополнения
Дополнение от 13.10.2026 — уточнённая редакция
Источник редакции — последний отчёт Аналитика в задача №233. Правила сверены с реализацией 5213150; принята P = FTE × персональная H. Все NEW-01–09 реализованы принятыми пакетами; общая QA и риск-ревью ещё предстоят. Матрица NEW → код → проверка → документ и расчётный контракт описывают фактическую реализацию.
Приоритет. Дополнение от 13.10.2026 (NEW-01–09) главнее противоречащих ему пунктов ТЗ v1.7: §6 «праздники и сокращённые дни пока не учитываются», FR 37/FR 24 «× 8», FR 60 «N = число сотрудников × H», §26 «Nбез = N − V». Главнее оно и допущения от 12.10 «будни × 8», и критериев задача №227 (неизменная «Σ ч») и задача №230 (N/Nбез). Ограничение задача №231 «calc.js как есть» на NEW-03 не распространяется. Не входят в редакцию: интеграции, прогноз больничных, замещение и перенос работ, пересогласование денег, политика исторического пересчёта сервиса.
Правила, выведенные из документов (вопросами к автору не являются)
| Правило | Источник |
|---|---|
| Hкал(месяц) — часы производственного календаря РФ для 40-часовой пятидневки. Праздники и переносы исключены, предпраздничный день на 1 ч короче, рабочие субботы по переносу считаются. Праздники повторно не вычитаются | DOCX п.3; ТЗ tz.md:14 («праздники и отпуска должны быть учтены»); tz.md:726 («норма часов с праздниками и сокращёнными днями») |
| H сотрудника = Hкал − часы отпуска − часы больничного за месяц. Отсутствия вводятся только в рабочих часах (≤ Hкал), день, в который совпали оба вида, учитывается один раз. Больничные не прогнозируются: только введённые значения | DOCX п.3; границы задачи |
| Часы дня в дневном плане: P = Σ(доступные часы дня сотрудника × дневной FTE). «× 8» из FR 37/FR 24 — это частный случай дня по 8 ч | FR 34, FR 37 с календарём tz.md:726 |
| N = ΣH выбранных сотрудников. N − V не считается: отпуск уже внутри H. Колонки «без отпусков» объединяются с «по норме», доля каждого вида отсутствия считается от ΣHкал; общую долю считают по объединению дат, не по V + B | DOCX п.3; формулы FR 60/§26 при новой H |
| Пустое значение отсутствия не равно 0. Если у выбранного сотрудника за месяц нет записи об отпуске или больничном, его H, N группы и проценты по N показываются прочерком. ΣHкал («норма по календарю») и явно введённые часы факта остаются видимыми; зависимые плановые часы неизвестны. После ввода 0 значение становится известным. В демо явно заполнены подтверждённые значения, включая нули | FR 62, AC 61 (видимая величина — календарная норма, как раньше видимой была N) |
| Накопительно и за период: сначала сумма часов, сумма норм, затем процент | tz.md:41, FR 60, AC 60 |
| Σ в плане: FTE — сумма месячных FTE, % — ΣP / ΣH × 100, часы — ΣP | Глоссарий Σ tz.md:32; tz.md:41 |
| «Итог» плана — сумма строк сотрудников (строки проектов — их расшифровка, повторно не прибавляются). По FTE — сумма, по % — ΣP / ΣH. При поиске по проекту строки сотрудников, как и сейчас, показывают полную загрузку, Итог — их сумма | DOCX п.6 «суммируются значения по строкам»; текущее поведение plan.js |
| NEW-08 — плановые часы проектов группы «Коммерческий» (категория или общий тип commercial) / N | DOCX п.8 «по форме плановой утилизации»; AC 64; FR 36 |
| NEW-09 — A / N × 100; при неполном факте прочерк, при N = 0 прочерк | DOCX п.9; FR 61, AC 62 |
| Финансы: расход = P × C, разница = I − расход. Неизвестная C — прочерк, не 0. Цвета: в форме и карточке отрицательная разница красная, остальное зелёное; в таблицах при отрицательной разнице расход красный, иначе без цвета | DOCX п.1, 2, 7; FR 35 |
Календарь в данных прототипа (часы на 40-часовую неделю)
| янв | фев | мар | апр | май | июн | июл | авг | сен | окт | ноя | дек | год | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026 | 120 | 152 | 168 | 175 | 151 | 167 | 184 | 168 | 176 | 176 | 159 | 176 | 1972 |
| 2027 | 120 | 151 | 176 | 175 | 152 | 167 | 176 | 176 | 176 | 168 | 159 | 176 | 1972 |
Ловушки реализации:
- 2026 — 31.12 выходной, 03.11 сокращён.
- 2027 — суббота 20.02 рабочая и сокращённая; выходные 22.02, 05.11, 31.12.
- Праздник, выпавший на выходной (09.05.2026; 01.05 и 09.05.2027), переносится на ближайший рабочий день по ст. 112 ТК.
- Границы календаря 2026-01…2027-12 едины для API и UI:
- первый месяц плана ограничить ≤ 2027-07;
- месяцы заявок — ≤ 2027-12; число месяцев формы уменьшается у границы; первый месяц некоммерческого отчёта ≤ 2027-01 для полного периода до 12 месяцев;
- на месяц без календаря
api.jsотвечает 400.
Принятая формула P и денег
Действующая постановка: P = FTE × H сотрудника после вычета отсутствий; доход = P × R, расход = P × C. Повторного согласования не требуется. При дневных изменениях используется сумма дневного FTE × доступные часы дня, исходные месячные ставки сохраняются. Отдельной нормы продажи нет; новый процесс пересогласования не вводится.
Анна, октябрь 2026: календарь 176 ч, отпуск 16 ч, больничный 0 → H = 160. При 0,5 FTE и R/C = 3500/2800: P = 80 ч, доход 280 000, расход 224 000 ₽, утилизация 50 %. Больничный 8 ч → H = 152, P = 76 ч, доход 266 000, расход 212 800 ₽. Изменение введённых отсутствий меняет расчёты прототипа во всех представлениях.
У назначенного сотрудника пустой отпуск или больничный означает неизвестную H: зависимые P, деньги и проценты — прочерк. Явно введённые фактические часы остаются видимыми. Для строки «На подбор» персональной нормы ещё нет: до назначения используется календарь; после выбора сотрудника расчёт использует его H.
Отпуск/больничный: запись {employee, month, hours} — подтверждённые рабочие часы без пересечений; {employee, month, dates} — полные дни с точным объединением дат. Даты праздников/выходных дают 0 ч, сокращённые — 7 ч. Для сводных часов без дат дневная доступность распределяется пропорционально календарным часам: это допущение демо, точные дни задаются датами. Положительные сводные часы и датированные отсутствия в одном месяце не смешиваются: API просит указать оба отсутствия датами. Пустое поле удаляет запись, 0 или пустой массив дат подтверждают отсутствие. API атомарно отклоняет сумму свыше календаря и неверные даты.
Мок принимает фактический fte либо явные hours (одно из двух). FTE преобразуется через персональную H; явные часы не теряются при неизвестных отсутствиях. При согласовании требуется подтверждённая H назначенных сотрудников; сохранение заявки с неизвестной H допускается. Проверка перегрузки использует рабочие дни, в том числе рабочую субботу, и исключает подтверждённые дни без доступных часов.
Источники календаря, проверенные 13.10.2026: 2026, 2027, постановление №1187. Федеральная пятидневка на 40 ч; региональные календари в демо не включены.
Критерии приёмки
Числа приведены для календаря выше и принятой персональной нормы.
- NEW-01: при 88 ч, R = 4000, C = 4300 → доход 352 000, расход 378 400, разница −26 400 (красная). R = C → 0 (зелёная). Неизвестная C («На подбор») → расход и разница «—».
- NEW-02: колонка «Расход» после «Доход» в форме, рассмотрении и просмотре. Пример (Михаил, «отели», отсутствия 0): окт 176 ч → 756 800 ₽ (красный, доход 704 000), ноя 159 ч → 683 700 ₽ (красный), дек 88 ч → 378 400 ₽ (красный).
- NEW-07: «Расход» между «Доход» и «Статус». Суммы в списке, карточке и сумма месяцев совпадают для всех заявок seed (тест). Для заявки-изменения — «—».
- NEW-03 календарь:
calcдаёт помесячную таблицу 2026–2027 из блока 1 (24 значения в тесте), 1 FTE в ноябре 2026 = 159 ч, 2027-02-20 — рабочий день на 7 ч. - NEW-03 норма: H = Hкал − отпуск − больничный. Окт: отпуск 16 + больничный 8 → H = 152. Отпуск = Hкал → H = 0 и % «—». Сумма отпуска и больничного > Hкал отклоняется (400). Больничный вводится в «Типы проектов, факт и отпуска» рядом с отпуском, пустое поле удаляет запись, 0 сохраняется.
- FR 62 / AC 61 в новой редакции: удалить отпуск сотрудника → его H, N и проценты по N «—», «норма по календарю» и явно введённые часы факта видны; ввести 0 → значения известны.
- AC 59 в новой редакции: Hкал 176, отпуск 16 → H = N = 160: 0,5 FTE → P = 80 ч и 50 %; явно введённый A = 88 ч → 55 %. Колонок «без отпусков» нет. AC 60: 80 + 132 ч при N 160 + 176 → 63,1 %.
- Словарь, примечание плана и README:
grep -rn "будней × 8\|без праздников\|пока не учитываются" js README.md→ пусто. - NEW-04: 4 верхние вкладки и 5 подвкладок «Отчётов». В перенесённых подвкладках работают их фильтры, кнопки шапки, раскрытие и режим РП.
- NEW-05: заголовок Σ и значения меняются с единицей (ч / FTE·мес / %). Пример: 0,5 / 1 / 0,75 FTE → Σ 2,25; 388 ч / 512 ч нормы → 75,78125 %, не сумма процентов.
- NEW-06: строка «Итог» = сумма строк сотрудников по месяцам и Σ, проекты не прибавляются повторно, не меняется при свёртке, следует поиску, фильтру свободного ресурса и области РП.
- NEW-08: кольцо коммерческой плановой утилизации рядом с плановым, с теми же фильтрами. Октябрь (все 6 сотрудников, отсутствия заполнены: отпуск Анны 16, прочие 0): N = 1040; коммерческие часы 256 → 24,6 %.
- NEW-09: кольцо фактической утилизации; при неполном факте «—» с пояснением; при полном A / N × 100; при N = 0 «—». В seed — один месяц с полным фактом.
- Дефект вне NEW: «Распределение» и CSV показывают введённые ЦФО и подразделение (отдельный коммит).
-
npm test,npm run checkиgit diff --checkпроходят. Playwright для РМ и РП на desktop и 320–390 px без JS-ошибок.
Матрица NEW-01–09
Полная матрица находится в service/docs/addendum-coverage.md; код и проверки — база 5213150. Она связывает все девять NEW, отдельный дефект ЦФО, REQ-008/009/011/018/024/026/027, файлы, unit/browser и документы. Критерии выше сохранены как чек-лист будущей общей QA, а не галочки её завершения.
Фактические значения демо
Октябрь: N = 1040 ч, P = 432 ч, FTE группы = 2,5, коммерческий план = 256 ч → 24,615…%; факт группы неполный. Ноябрь: N = 954 ч, P = A = 477 ч, полный факт → 50 %. Деньги demo-1: 2446550/2388700 ₽; demo-2: 1548700/1246200 ₽; demo-3: 2176900/неизвестный расход. Все представления используют одну персональную H.
Двенадцатинедельное окно не требует нормы 2025: недели, захватывающие дату до 2026, целиком неизвестны. Для января–марта 2026 таких недель 8/4/0. Будущая рабочая интеграция calendar/absence остаётся в Q-06; принятую формулу P и необходимость отпусков/больничных не согласовывают заново. Изменение введённых отсутствий пересчитывает текущие P/деньги демо, новая политика истории рабочего сервиса вне объёма.