Přeskočit obsah

Intent: Rozvrh + substituce

Status: Implemented (seed-only — bez UI editace) · Updated: 2026-05-13

Problém

Rozvrh je páteř třídnice — bez něj day view neví co učitel učí, week view nemá co zobrazit. Sofie škola má 2 třídy, ~3-5 učitelů, ~6 předmětů, weekly recurrence Po-Pá. Rozvrh se mění zřídka (jednou za pololetí). Naopak substituce (jeden učitel za druhého) se mohou stát kdykoli během dne a musí být dohledatelné. Zároveň: rozvrh musí být jediný zdroj pravdy o tom, kdy se co učí — z něj vychází docházka, témata, day/week view.

Kdo to chce + jak ho poznáme

  • Primární role: teacher (čte rozvrh, dělá substituce), director (zakládá rozvrh — UI mimo MVP)
  • Stakeholder: Tomáš
  • Kontext použití: rozvrh čte učitel kdykoli; substituci dělá učitel jednorázově v okamžiku „beru tu hodinu místo kolegyně"

Definice úspěchu

  • schedule_slots má weekly grid (class × day_of_week × slot_order) s časy + subject + default_teacher_id. Unique (class_id, school_year_id, day_of_week, slot_order).
  • Slot bez záznamu v daný konkrétní den = prázdný (gray dashed); záznam o tom, že hodina proběhla, je v classbook_entries.
  • classbook_entries.taught_by ukazuje, kdo hodinu skutečně učil. Pokud taught_by != default_teacher_id → substituce.
  • Akce „Beru si hodinu" (takeOverLesson) přepíše taught_by na current user. Žádné UI pro plánované substituce dopředu.
  • Slot mimo schedule_slots nelze ad-hoc zaznamenat (žádné „přidat hodinu k existujícímu dnu" z UI; jen seedované sloty).

Out-of-scope

  • Editace rozvrhu z UI (dnes manuálně v Supabase / migrace).
  • Plánované budoucí substituce („zítra mě zastupuje X").
  • Konflikty rozvrhu (učitel ve 2 třídách současně) — řešeno tím, že class_staff přiřazuje učitele k oběma třídám; UI je nezakazuje.
  • Multi-school rozvrhy (Sofie = jedna škola).
  • Učební bloky napříč sloty („dvouhodinovka") — každý slot je samostatný.
  • Vyrovnávací úvazek / pracovní výkaz (kancelářská feature, Fáze 2+).