Update staffing management to enhance payroll and hiring functionalities
ci / server (push) Failing after 3m39s
ci / client (push) Successful in 14s

- Increased the `MonthlyPayrollCap` from 10,000 to 40,000, allowing for greater flexibility in hiring and subject assignments.
- Revised payroll calculation logic to ensure that staff members are compensated based on their actual weekly hours, with a minimum payment reflecting one full rate.
- Updated documentation to clarify the new payroll structure and its implications for hiring and subject assignments.
- Enhanced tests to validate the new payroll cap and ensure proper functionality in staffing scenarios, including the handling of uncovered subjects.
- Improved localization strings to reflect changes in staffing and payroll terminology.
This commit is contained in:
Leonid Pershin
2026-08-19 12:51:38 +03:00
parent d61240d5c1
commit 25ce26064d
20 changed files with 376 additions and 112 deletions
+16 -5
View File
@@ -135,11 +135,20 @@
учебного плана. Назначили человеку математику — он забирает все часы математики во всех
параллелях, где она преподаётся, и это может оказаться много.
Ниже одной ставки (`BaseWeeklyHours`) не платят: нанятый стоит денег, даже если ему ничего не
назначили. Иначе набрать полный штат «про запас» было бы бесплатно.
Отсюда два ограничения вместо одного:
- **Деньги.** Фонд оплаты не может превысить выделенную сумму.
- **Человек.** Никто не может вести больше `MaxWeeklyHours` часов в неделю. Если часов предмета
больше, чем вытянет один, нужен второй учитель того же предмета — часы делятся между ними.
- **Деньги.** Фонд оплаты не может превысить выделенную сумму. Проверяется при найме и назначении.
- **Человек.** Никто не вытянет больше `MaxWeeklyHours` часов. Если часов предмета больше, нужен
второй учитель — часы делятся между ними, и первому становится легче и дешевле.
**Предел часов не запрещает назначение, а помечает предмет непокрытым.** Запрет завёл бы в тупик:
первый учитель предмета всегда получает все его часы, поэтому первым не смог бы стать никто.
Считать часы «до предела» тоже нельзя — тогда седьмой предмет тому, кто уже за пределом, достаётся
бесплатно, а это ровно та дыра, ради которой почасовая оплата и вводилась. Поэтому часы считаются
целиком, деньги это показывают, а список непокрытого говорит, что один человек столько не выучит.
Поэтому «нанять посильнее» и «нагрузить одного вместо двоих» — два разных способа потратить один
фонд, и в этом весь выбор среза. Дешёвый учитель, взявший три предмета, упрётся в часы; дорогой
@@ -218,8 +227,10 @@
| Пул | Общий, обновляется раз в неделю частично, детерминированно |
| Учебный план | Часы в неделю по параллелям — поле `SubjectDef`, а не задел |
| Запрос по деньгам | Цена часа: от навыков и от черт (самоуверенный просит больше) |
| Зарплата | Цена часа × недельная нагрузка из учебного плана |
| Предел нагрузки | `MaxWeeklyHours` на человека; сверх — нужен второй учитель предмета |
| Зарплата | Цена часа × недельная нагрузка из учебного плана, но не меньше одной ставки |
| Деление часов | Учителя одного предмета делят его часы поровну |
| Предел нагрузки | `MaxWeeklyHours` не запрещает назначение, а делает предмет непокрытым |
| Непокрытый предмет | Нет учителя **или** назначенные не вытягивают его часы |
| Бюджет | Фиксированная сумма в месяц из настроек; баланса нет |
| Предел | Фонд оплаты не может превысить выделенное; проверка в момент действия |
| Экран | Два верхних раздела под часами: «Обзор» и «Управление» |