Update staffing management to enhance payroll and hiring functionalities
- 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:
+16
-5
@@ -135,11 +135,20 @@
|
||||
учебного плана. Назначили человеку математику — он забирает все часы математики во всех
|
||||
параллелях, где она преподаётся, и это может оказаться много.
|
||||
|
||||
Ниже одной ставки (`BaseWeeklyHours`) не платят: нанятый стоит денег, даже если ему ничего не
|
||||
назначили. Иначе набрать полный штат «про запас» было бы бесплатно.
|
||||
|
||||
Отсюда два ограничения вместо одного:
|
||||
|
||||
- **Деньги.** Фонд оплаты не может превысить выделенную сумму.
|
||||
- **Человек.** Никто не может вести больше `MaxWeeklyHours` часов в неделю. Если часов предмета
|
||||
больше, чем вытянет один, нужен второй учитель того же предмета — часы делятся между ними.
|
||||
- **Деньги.** Фонд оплаты не может превысить выделенную сумму. Проверяется при найме и назначении.
|
||||
- **Человек.** Никто не вытянет больше `MaxWeeklyHours` часов. Если часов предмета больше, нужен
|
||||
второй учитель — часы делятся между ними, и первому становится легче и дешевле.
|
||||
|
||||
**Предел часов не запрещает назначение, а помечает предмет непокрытым.** Запрет завёл бы в тупик:
|
||||
первый учитель предмета всегда получает все его часы, поэтому первым не смог бы стать никто.
|
||||
Считать часы «до предела» тоже нельзя — тогда седьмой предмет тому, кто уже за пределом, достаётся
|
||||
бесплатно, а это ровно та дыра, ради которой почасовая оплата и вводилась. Поэтому часы считаются
|
||||
целиком, деньги это показывают, а список непокрытого говорит, что один человек столько не выучит.
|
||||
|
||||
Поэтому «нанять посильнее» и «нагрузить одного вместо двоих» — два разных способа потратить один
|
||||
фонд, и в этом весь выбор среза. Дешёвый учитель, взявший три предмета, упрётся в часы; дорогой
|
||||
@@ -218,8 +227,10 @@
|
||||
| Пул | Общий, обновляется раз в неделю частично, детерминированно |
|
||||
| Учебный план | Часы в неделю по параллелям — поле `SubjectDef`, а не задел |
|
||||
| Запрос по деньгам | Цена часа: от навыков и от черт (самоуверенный просит больше) |
|
||||
| Зарплата | Цена часа × недельная нагрузка из учебного плана |
|
||||
| Предел нагрузки | `MaxWeeklyHours` на человека; сверх — нужен второй учитель предмета |
|
||||
| Зарплата | Цена часа × недельная нагрузка из учебного плана, но не меньше одной ставки |
|
||||
| Деление часов | Учителя одного предмета делят его часы поровну |
|
||||
| Предел нагрузки | `MaxWeeklyHours` не запрещает назначение, а делает предмет непокрытым |
|
||||
| Непокрытый предмет | Нет учителя **или** назначенные не вытягивают его часы |
|
||||
| Бюджет | Фиксированная сумма в месяц из настроек; баланса нет |
|
||||
| Предел | Фонд оплаты не может превысить выделенное; проверка в момент действия |
|
||||
| Экран | Два верхних раздела под часами: «Обзор» и «Управление» |
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
## Задачи
|
||||
|
||||
- [x] Выделяемая на месяц сумма — в `SimulationOptions`, с умолчанием
|
||||
- [x] Фонд оплаты школы: сумма базовых ставок плюс надбавки за предметы сверх первого
|
||||
- [x] Фонд оплаты школы: у каждого цена часа × недельная нагрузка, но не меньше одной ставки.
|
||||
Нагрузка берётся из учебного плана и делится между учителями предмета
|
||||
- [x] Наём: соискатель уходит из пула, становится работником, попадает в ростер. Родитель
|
||||
остаётся родителем — новой сущности не заводится
|
||||
- [x] Назначение предмета нанятому и снятие предмета
|
||||
|
||||
+14
-5
@@ -229,10 +229,18 @@ Money, uncovered subjects, the applicant pool and current staff. Reads the **pub
|
||||
roster, applicant snapshot and catalog — it does not post to the worker. Unknown `{id}` is
|
||||
`404` `unknown-school`. `?lang=ru|en` labels subjects and positions.
|
||||
|
||||
`allocated` is `Simulation:MonthlyPayrollCap`. `payroll` is the sum of each staff member's
|
||||
monthly base (`hourlyWageAsk × baseWeeklyHours × weeksPerMonth`) plus
|
||||
`extraSubjectSurcharge` of that base for every subject after the first. The cap is checked
|
||||
when hiring or assigning, not at month end; money itself does not move.
|
||||
`allocated` is `Simulation:MonthlyPayrollCap`. A staff member is paid
|
||||
`hourlyWageAsk × weeklyHours × weeksPerMonth`, never less than one full rate
|
||||
(`baseWeeklyHours`), and `payroll` is the sum over staff. The cap is checked when hiring or
|
||||
assigning, not at month end; money itself does not move.
|
||||
|
||||
`weeklyHours` is not stored: it is the curriculum. For every subject assigned to a person,
|
||||
`hoursPerWeek` of that subject across the classes that study it, divided between everyone
|
||||
teaching it. So a second teacher of a subject halves what the first one carries — and costs.
|
||||
|
||||
A subject appears in `uncovered` when nobody teaches it **or** when the people who do cannot
|
||||
between them carry its hours (`maxWeeklyHours` each). Both mean the same thing to a player:
|
||||
those lessons will not happen.
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -270,7 +278,8 @@ when hiring or assigning, not at month end; money itself does not move.
|
||||
"position": "Teacher",
|
||||
"positionLabel": "Учитель",
|
||||
"hourlyWageAsk": 50,
|
||||
"monthlyPay": 5000,
|
||||
"weeklyHours": 35,
|
||||
"monthlyPay": 7000,
|
||||
"subjects": [{ "defName": "Mathematics", "label": "Математика" }]
|
||||
}
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user