# Roosterwijs — Roadmap / backlog Geplande verbeteringen, gegroepeerd. `[ ]` = nog te doen, `[x]` = klaar. Afgeronde fases (0–5) staan in `README.md`. Dit bestand bevat het werk dat nog volgt. ## Fase 6 — Rooster bewerken (snel & overzichtelijk) - [x] **Blokken kopiëren** naar andere tijden en dagen (via het bewerkpaneel naar meerdere tijdsloten tegelijk). - [x] **Blok aanpassen bij klik**: klik op een blok in de Roostermaker opent een bewerkpaneel. - [x] **Snelle inline-aanpassing per blok**: vak/activiteit, locatie, doelgroep (groep/subgroep/leerling), begeleiders en opmerking wijzigen in het paneel. - [x] Vanuit de Roostermaker (tab **Indeling**) direct **subgroepen aanmaken** onder een hoofdgroep, met verantwoordelijke(n) — kolomsgewijs overzicht van subgroepen, vakken en wie verantwoordelijk is. - [x] **Sneltoetsen** in de Roostermaker: N (nieuw blok), ←/→ (week terug/vooruit), T (deze week), Esc (paneel/sluiten); met hint. - [x] **Rol van een begeleider zichtbaar** in de Roostermaker: afkorting (LK/PO/KO) bij de begeleider in een blok en de volledige rol bij het toewijzen. - [x] **Vak-wizard** (module `blokwizard`, default uit; verschijnt als tab in de Roostermaker): stap-voor-stap vak → voor wie → wanneer/waar (+periode) → begeleiders → controle → inplannen. - [x] **Personen-wizard + import** (module `personenwizard`, default uit; tab onder Personen): leerling/medewerker enkel toevoegen óf in bulk via plakken/CSV (komma, puntkomma of tab; koprij optioneel) met preview; endpoint /api/personen-import/. ## Fase 6 — Perioderooster - [x] **Perioderooster** (`/perioderooster`, menu onder Rooster, **boven** Roostermaker): matrix met alle klassen als kolommen en de algemene tijdvakken als rijen. Vakken per klas plaatsen in een **sjabloon**-opzet (los van de kalender). Live conflictsignalering over alle klassen heen. - [x] **Voltooien → periode inladen**: bij voltooien kies of maak je een **Periode** (naam = schooljaar + nummer) met datumbereik; een **preview** toont welke vakken geplaatst en welke overlappende bestaande blokken verwijderd worden, daarna bevestigen. De sjabloon-opzet blijft bewaard voor een volgende periode. Sjabloonblokken tellen niet mee in het echte rooster/conflicten/uren/auto-rooster (`Roosterblok.sjabloon`). ## Fase 6 — Weergave & beheer - [x] **Printopties-dialog** (🖨 in Rooster/Roostermaker): kies wát (huidige selectie / alle klassen) en hóé je afdrukt — indeling (kolommen / dagen onder elkaar), vakken in kleur, begeleiding/lokaal tonen, optionele koptekst — plus **papierformaat** (A4/A3/A5/Letter) en oriëntatie (liggend/staand). Toegepast via body-classes + dynamische `@page`. - [x] **Vakkleur als vlak** (toggle 🎨, onthouden per browser): vak volledig in de activiteitskleur i.p.v. een streepje, met automatisch leesbare tekstkleur (zwart/wit op basis van helderheid). Werkt in Rooster/Roostermaker en Perioderooster. - [x] **Hele periode wissen** in het Perioderooster: in de voltooien-dialog een bestaande periode kiezen → "Deze periode wissen" verwijdert (na preview + bevestiging) alle periode-gebonden blokken binnen die periode; vaste (altijd geldige) blokken blijven staan. ## Fase 6 — Overzicht & navigatie - [~] **Alle klassen verwerkbaar in het rooster**, overzichtelijk gemaakt — een **scope-filter** (per klas/leerplein/leerling/personeel) is toegevoegd in Rooster en Roostermaker; een vast **per-leerplein-overzicht** kan nog volgen. - [x] **Snelmenu** per klas én per bovenliggende groep (chips in Rooster én Roostermaker) om direct dat rooster te tonen. - [x] **Schooljaar uit het hoofdmenu** halen en **onder Rooster** plaatsen (tab "Schooljaar") met snelle invoer + kalenderbeheer. - [x] **Instellingenmenu** (subtiel onderaan de zijbalk) waaronder **Gebruikers** en **Modulebeheer** verdwijnen. - [x] De hint **"Menu's verschijnen alleen voor ingeschakelde modules."** uit de zijbalk verwijderd. - [x] **Roostermaker-tabbalk logischer**: de losse tab "Conflicten" is vervallen (conflicten staan nu in het weekrooster zelf) en Vak-wizard + Auto-rooster zitten onder één **"Genereren ▾"**-knop. Overgebleven: Week · Jaar · Genereren · Instellingen. - [x] **Conflicten direct in het rooster**: een melding boven het weekrooster (uitklapbaar met details) én een rode omlijning rond de betrokken blokken. Client-side berekend uit de geladen blokken (begeleider/lokaal/leerling dubbel op hetzelfde tijdslot), met respect voor geldigheidsperiodes. ## Vakken - [x] Per vak **automatisch een passend icoon** (afgeleid van de naam) — getoond in het rooster en bij Activiteiten/vakken. - [x] Optioneel: een icoon handmatig kunnen kiezen/overschrijven (`icoon`-veld op Activiteit + migratie core 0007; leeg = automatisch op naam). ## Stage-module — uitbreidingen - [x] **Aparte (stage)locaties** kunnen toevoegen, los van de gewone lokalen. - [x] Een **begeleider aan meerdere stages** koppelen, maar **niet tegelijk aan een theorievak** (conflict wordt voorkomen bij opslaan + gesignaleerd via `/api/stage-conflicten/`). - [x] Een leerling **verdwijnt op een stagedag(deel) uit de klas** in het rooster (in het weekrooster gemarkeerd "Op stage" bij de betreffende blokken). - [x] Stage instelbaar **per blok, per dagdeel of per dag**. ## Lokalen & dubbele boekingen - [x] **Lokalen** als apart roomsysteem (naast de vrije Locaties), met capaciteit; gedeeld door lessen en interne stages. - [x] **Dubbele-boekingcheck** per tijdslot: gemeld in het conflicten-overzicht; per school instelbaar om opslaan **hard te blokkeren** (Lokalen-scherm). - [x] Interne stages gebruiken nu een **lokaal** (de aparte stagelocatie-lijst is vervallen) en tellen mee in de dubbele-boekingcheck. ## Groepsindeling - [x] **Eén sleep-overzicht**: bovenliggende groep → groep → subgroep genest, met een zijbalk "nog niet ingedeeld". Personen naar elk niveau slepen; × haalt ze weer weg. Leerlingen licht gekleurd, personeel donker; duidelijke gekleurde structuur per niveau. Inline aanmaken/hernoemen. - [x] **Toon-filter** (Allen / Leerlingen / Personeel) en **multi-select**: meerdere personen aanvinken en in één keer in een gekozen groep plaatsen (of de selectie samen slepen). ## Koppelingen & inzetregels - [x] **Personeel koppelen aan leerplein en subgroep** (personeelsformulier: stamgroep, subgroep-begeleiding én leerpleinen). - [x] **Theorievakken automatisch beschikbaar voor leerkrachten** (een leerkracht mag altijd op een theorievak ingezet worden; daarnaast worden theorievakken bij het aanmaken automatisch gekoppeld). - [x] **Inzetregel begeleider ↔ vak:** leerkracht/praktijkondersteuner alleen op gekoppelde vakken (leerkracht bovendien altijd op theorievakken); **klassenondersteuner overal**. - [x] **Hiërarchie vastgelegd:** subgroep → groep (Subgroep.groep) en groep → leerplein (Leerplein.groepen). ## Toegang & gebruikers - [x] Login + gebruikersbeheer gebundeld in de accounts-module; inloggen ook met e-mailadres. - [x] **Wachtwoordreset**: beheerder genereert/zet wachtwoord én self-service via e-maillink (SMTP via .env; standaard console-log). - [x] **Bulk-import van gebruikers** met automatisch gegenereerde wachtwoorden, persoon koppelen/aanmaken en een voorstel op naamgelijkenis. ## Module: Urenoverzicht - [x] **Module die berekent hoeveel uur een groep per vak krijgt.** (module `uren`, default uit; endpoint /api/urenoverzicht/) - [x] Optie om dit **per leerling** te tonen, **inclusief stage-uren**. - [x] **Filters op de uren-tabellen** (per groep, per vak, zoek op leerling). - [x] **Geschiedenis** per leerling: momentopnames opslaan (model UrenMomentopname) en een tabel leerling × datum met totaal-uren. - [x] **Vrije dagen tellen niet mee** in deze urenberekening. ## Roostermaker — vrije dagen & blok vervallen - [x] **Vak met geldigheidsperiode**: een blok kan gelden **van/tot** een datum (leeg = altijd). `geldig_van == geldig_tot` = eenmalig op die dag. - [x] **Dag leegmaken + eenmalig alternatief**: per dag knop 🧹 (alle blokken díe dag laten vervallen, blijft lesdag) en ➕ (eenmalig blok op die dag), zonder gevolgen voor andere dagen. - [x] **Vrije/vakantie-/studiedagen niet bruikbaar** in de Roostermaker: een blok slepen naar een vrije dag wordt geweigerd; vrije dagkolommen zijn gearceerd; dag-acties (leegmaken/eenmalig) verschijnen niet op vrije dagen. - [x] De actie heet nu **"dit vak laten vervallen"** (per blok, juiste tekst). - [x] Een **hele dag laten vervallen** kan direct in het weekrooster (knop in de dagkop; maakt een vrije dag aan, met "weer lesdag" om te herstellen). ## Pictogrammen & leerlingweergave (ZML) - [x] **Pictogram per vak uploaden** (afbeelding) en tonen in het rooster. - [x] **Grote leerlingweergave** (één dag, groot pictogram + vakkleur) en **ouderweergave** (weekoverzicht), per leerling of groep. - [x] Vakkleur duidelijk gebruikt in de weergaven. - [x] **Dagdeel-indeling (Ochtend/Middag)** met koppen + scheidingslijn in de leerling- en ouderweergave (grens 12:00). - [ ] Later: pictogrammen ook per losse activiteit/stap binnen een dagdeel. ## Later - [x] **Auto-rooster slimmer**: voorkeuren — vak liever ochtend/middag (zachte voorkeur met fallback), bepaalde dagen vrijhouden, en max. blokken per dag per groep. - [x] **Auto-rooster voor meerdere klassen tegelijk**: kies meerdere klassen; een vak (bv. gym/atelier) kan voor meerdere klassen gelden, met gedeelde bewaking van begeleider en lokaal over alle klassen heen. - [ ] **Algemene visuele opfris** (UX/uiterlijk). - [ ] **Module: automatisch rooster genereren.** De gebruiker ge