Dane aplikacji
Aplikacja korzysta z modułów Noe (bazy słownikowe Noe::Db) oraz modułu Kalendarz (Calendar::Event). Wydarzenia są jednorazowe i trzymają snapshot danych w polu fields.
Bazy słownikowe (Noe::Db)
Kody baz (code w /noe/dbs/:code/records.json):
| Code | Nazwa | Pola |
|---|---|---|
pz_classes |
Klasy | name |
pz_rooms |
Sale | name |
pz_teachers |
Nauczyciele |
name, hourly_rate
|
pz_students |
Uczniowie |
name, class_name
|
pz_types |
Typy zajęć |
name, color
|
pz_bells |
Dzwonki |
lesson_no, label, start, end
|
API rekordów (każda baza działa tak samo):
GET /noe/dbs/pz_teachers/records.json
POST /noe/dbs/pz_teachers/records.json { "record": { "data": { "name": "...", "hourly_rate": 80 } } }
PATCH /noe/dbs/pz_teachers/records/:id.json { "record": { "data": { ... } } }
DELETE /noe/dbs/pz_teachers/records/:id.json
Wydarzenia w kalendarzu
Kalendarz nazywa się Zajęcia dodatkowe. Wydarzenia tworzone są standardowym API kalendarza:
POST /calendar/events.json
Content-Type: application/json
{
"event": {
"calendar_id": 42,
"name": "Logopedia - Jan Kowalski - 3A",
"start_time": "2026-06-10T13:30:00+02:00",
"end_time": "2026-06-10T14:15:00+02:00",
"fields": {
"teacher_name": "Jan Kowalski",
"class_name": "3A",
"room_name": "Sala 12",
"student_name": "Anna Nowak",
"support_type": "Logopedia",
"hourly_rate": 80,
"cost": 60.0,
"lesson_no": 4
}
}
}
Pole fields to snapshot - pełne nazwy i kwoty, nie ID. Dzięki temu:
- raport działa nawet po skasowaniu nauczyciela ze słownika,
- zmiana stawki nauczyciela nie modyfikuje już istniejących wydarzeń (zostają z historyczną stawką),
- wydarzenie jest samowystarczalne - można je edytować w
/calendari raport to uwzględni.
Listowanie wydarzeń na raport
GET /calendar/events.json?calendar_id=42&from=2026-06-01&to=2026-06-30&per_page=100&page=1
Aplikacja paginuje strony po 100, łączy je i agreguje po polach teacher_name, support_type, class_name w pamięci klienta - bez osobnego endpointu raportowego.
Konfiguracja
Kalendarz Zajęcia dodatkowe i wszystkie sześć baz słownikowych aplikacja zakłada sama przy pierwszym uruchomieniu (view = setup). Po założeniu przechodzi do widoku planu (view = app).