Enhance school simulation management by introducing a new SchoolWeekDays option, allowing configuration of the number of working days in a week. Update the API to include school week days in responses and enhance documentation to reflect these changes. Revise UI components to support the new management features, ensuring a seamless user experience when hiring and assigning staff. Update localization strings for improved clarity and consistency across the application.
ci / server (push) Failing after 3m37s
ci / client (push) Successful in 13s

This commit is contained in:
Leonid Pershin
2026-08-19 00:47:09 +03:00
parent 94842ab192
commit 2ebc783585
38 changed files with 1837 additions and 208 deletions
+8 -8
View File
@@ -11,16 +11,16 @@
## Задачи
- [ ] Под часами появляются два верхних раздела: «Обзор» и «Управление». В «Обзоре» — всё, что
- [x] Под часами появляются два верхних раздела: «Обзор» и «Управление». В «Обзоре» — всё, что
есть сейчас; часы и дата видны в обоих
- [ ] Строка денег: выделено, расписано, свободно
- [ ] Список непокрытых предметов — что школа не может преподавать
- [ ] Список соискателей: имя, запрашиваемая ставка, сильные навыки; выбор показывает карточку
- [x] Строка денег: выделено, расписано, свободно
- [x] Список непокрытых предметов — что школа не может преподавать
- [x] Список соискателей: имя, запрашиваемая ставка, сильные навыки; выбор показывает карточку
человека справа — ту же, что в «Людях»
- [ ] Кнопка найма; отказ по пределу показывается текстом, а не молчанием
- [ ] Список штата: кто нанят, какие предметы ведёт, сколько стоит
- [ ] Назначение и снятие предмета с карточки нанятого
- [ ] Строки через `t(...)`, обе локали
- [x] Кнопка найма; отказ по пределу показывается текстом, а не молчанием
- [x] Список штата: кто нанят, какие предметы ведёт, сколько стоит
- [x] Назначение и снятие предмета с карточки нанятого
- [x] Строки через `t(...)`, обе локали
## Критерий готовности
+6 -6
View File
@@ -11,15 +11,15 @@
## Задачи
- [ ] Каркас дня в `core` дефом: начало первого урока, число уроков, длина урока, длины перемен
- [x] Каркас дня в `core` дефом: начало первого урока, число уроков, длина урока, длины перемен
и какая из них большая
- [ ] Длина учебной недели — в `SimulationOptions`, пять дней по умолчанию
- [ ] Каникулы дефами: осенние, зимние, весенние, лето — диапазонами дат внутри учебного года
- [ ] Запрос «какой сейчас слот»: номер урока или перемена, или «вне учебного дня» — по игровому
- [x] Длина учебной недели — в `SimulationOptions`, пять дней по умолчанию
- [x] Каникулы дефами: осенние, зимние, весенние, лето — диапазонами дат внутри учебного года
- [x] Запрос «какой сейчас слот»: номер урока или перемена, или «вне учебного дня» — по игровому
времени, выходным и каникулам
- [ ] Требование к типу помещения у `SubjectDef`: физкультура в спортзале, информатика в
- [x] Требование к типу помещения у `SubjectDef`: физкультура в спортзале, информатика в
компьютерном классе; без требования — кабинет класса
- [ ] `GET /api/catalog` отдаёт каркас дня — он понадобится сетке расписания
- [x] `GET /api/catalog` отдаёт каркас дня — он понадобится сетке расписания
## Критерий готовности
+2 -2
View File
@@ -52,7 +52,7 @@
| [10. Предметы и мебель](10-subjects.md) | ✅ | `SubjectDef`, одна учительская должность, кабинет как число мест |
| [11. Пустая школа и пул](11-applicants.md) | ✅ | Школа без сотрудников, соискатели с запросом по зарплате |
| [12. Наём и бюджет](12-hiring-budget.md) | ✅ | Наём, назначение предметов, предел фонда оплаты |
| [13. Раздел «Управление»](13-management-tab.md) | | Деньги, соискатели, штат и назначения на экране |
| [13. Раздел «Управление»](13-management-tab.md) | | Деньги, соискатели, штат и назначения на экране |
## Срез 4. Расписание
@@ -64,7 +64,7 @@
| Фаза | Статус | Зачем |
| --- | --- | --- |
| [14. Каркас дня и каникулы](14-school-calendar.md) | | Звонки, длина недели, каникулы |
| [14. Каркас дня и каникулы](14-school-calendar.md) | | Звонки, длина недели, каникулы |
| [15. Планировщик](15-timetable-planner.md) | ⬜ | Раскладка часов по слотам, четыре запрета |
| [16. Расписание в школе](16-timetable-in-school.md) | ⬜ | Сейв, снимок, «кто где сейчас» |
| [17. Расписание на экране](17-timetable-screen.md) | ⬜ | Скобки в дереве, сетка класса, расписание учителя |
+32 -5
View File
@@ -30,13 +30,15 @@ the wire format is unambiguous, and the client formats it back in UTC.
### `GET /api/schools`
Everything the main menu needs in one request.
Everything the main menu needs in one request. `schoolWeekDays` is 57 working days counted
from Monday (five is MonFri; six adds Saturday). It is a school rule, not a catalog def.
```json
{
"maxSchools": 6,
"defaultStartDate": "2012-03-31T06:00:00Z",
"gameMinutesPerRealSecond": 5,
"schoolWeekDays": 5,
"schools": [
{ "id": 1, "name": "Гимназия №14", "gameTime": "2012-03-31T07:35:00Z", "running": false, "speedIndex": 1 }
]
@@ -79,8 +81,15 @@ total is computed on the server.
it is independent of the UI language.
`subjects` is the list of placeable subjects (`defName`, label, `gradeMin`/`gradeMax`,
`hoursPerWeek`, and `skills` with shares). The assignment form in a later phase reads it; the
create editor does not.
`hoursPerWeek`, `skills` with shares, and optional `room`). `room` is the RoomDef the lesson
needs — PE uses a gym, informatics a computer lab; omit it and the class homeroom is used.
`dayFrame` is the one concrete bell schedule (`firstLesson` as `HH:mm`, lesson count and
lengths, which break is the long one). `holidays` are month-day ranges that repeat every
academic year; a range whose start is after its end wraps across 1 January.
The assignment form in a later phase reads subjects; the timetable grid reads the day frame.
The create editor does not.
`lang` is the same value Hello carries — not `Accept-Language`. Anything other than `en` is
Russian.
@@ -245,7 +254,8 @@ when hiring or assigning, not at month end; money itself does not move.
"age": 34,
"isParent": false,
"hourlyWageAsk": 50,
"monthlyBase": 4000
"monthlyBase": 4000,
"skills": [{ "id": "Mathematics", "label": "Математика", "value": "72" }]
}
],
"staff": [
@@ -261,13 +271,30 @@ when hiring or assigning, not at month end; money itself does not move.
"monthlyPay": 5000,
"subjects": [{ "defName": "Mathematics", "label": "Математика" }]
}
],
"positions": [{ "defName": "Teacher", "label": "Учитель" }],
"subjects": [
{
"defName": "Mathematics",
"label": "Математика",
"gradeMin": 5,
"gradeMax": 11,
"hoursPerWeek": 5
}
]
}
```
Applicants here are the same people as in `saves/{id}.people.json`. A parent keeps the same
id on the roster; hiring them sets `isStaff` on that person and does not create a second
entity. Generated candidates (`aN.p0`) join the roster only when hired.
entity. Generated candidates (`aN.p0`) join the roster only when hired. `skills` on an
applicant are the three strongest, for the management list; the full set is on the person
card. `positions` and `subjects` are the school's catalog, so the hire and assign pickers
do not need a second request.
`GET /api/schools/{id}/people/{personId}` also opens a card for someone who is only in the
applicant pool (needs are the frozen snapshot — they are not in the World yet). Unknown
ids that are in neither place stay `404` `unknown-person`.
### `POST /api/schools/{id}/staff/hire`