# Plan – Roostersoftware Speciaal Onderwijs Modulair, flexibel roostersysteem voor het speciaal onderwijs. Kleine aantallen, veel flexibiliteit per leerling, groep, subgroep, leerkracht en ondersteuner. ## 1. Uitgangspunten - **Type**: webapplicatie (browser, werkt op pc en tablet). - **Bouw**: Claude bouwt het leeuwendeel; jij stuurt, test en geeft richting. - **MVP-focus**: (1) basisroostering, (2) flexibiliteit & uitzonderingen, (3) conflictdetectie. - **Schaal**: één school, kleine aantallen — dus eenvoud boven complexe infrastructuur, maar het datamodel moet de flexibiliteit echt aankunnen. ## 2. Kernidee: het rooster als bouwstenen De kracht voor speciaal onderwijs zit in *modulariteit*. In plaats van één vast groepsrooster bouwen we het rooster op uit losse **roosterblokken** die je aan wie dan ook kunt koppelen. Een blok = "wie doet wat, wanneer, waar, met wie". Een blok kan toegewezen worden aan: - een hele **groep**, - een **subgroep** (deel van een groep), - een **individuele leerling** (afwijking van het groepsrooster), - met daaraan gekoppeld één of meer **leerkrachten** en/of **ondersteuners**. Het rooster van een individuele leerling is dan: het groepsrooster **plus/min** zijn persoonlijke uitzonderingen. Zo houd je kleine aantallen overzichtelijk én volledig flexibel. ## 3. Datamodel (de modules) Onafhankelijke, herbruikbare entiteiten: - **Persoon** – basis voor leerling, leerkracht, ondersteuner (één tabel, met rol/type). - Leerling: hoort bij een groep, kan in subgroepen zitten. - Leerkracht / Praktijkondersteuner / Klassenondersteuner: inzetbaarheid, beschikbaarheid. - **Groep** – klas; bevat leerlingen. - **Subgroep** – flexibele deelverzameling van leerlingen (bv. niveaugroepje rekenen), kan groep-overstijgend zijn. - **Activiteit/Vak** – wat er gedaan wordt (rekenen, gym, therapie, pauze…). - **Locatie** – lokaal/ruimte (optioneel maar handig voor conflictdetectie). - **Tijdslot** – dag + begin/eindtijd. We werken met **vaste schooltijden** (een instelbaar dagritme), maar tijdslots blijven aanpasbaar. - **Roosterblok** – de spil: koppelt activiteit + tijdslot + doelgroep (groep/subgroep/leerling) + begeleiders + locatie. - **Uitzondering** – afwijking voor een individu of dag (afwezigheid, vervanging, eenmalige wijziging). - **Schooljaar / Kalender** – jaaroverzicht met studiedagen, vrije dagen en vakanties. Een vrije/vakantiedag schakelt automatisch de roosterblokken op die dag uit, zodat het weekrooster en het jaaroverzicht altijd kloppen. Modulair betekent: elke entiteit staat los en is later uitbreidbaar (bv. ouders, vervoer, doelen/handelingsplan) zonder de kern te herbouwen. ## 4. Conflictdetectie Bij het plaatsen/wijzigen van een blok controleert het systeem automatisch op: - **Dubbele inzet leerkracht/ondersteuner** – staat iemand op twee plekken tegelijk. - **Dubbele inzet leerling** – zit een leerling in twee blokken op hetzelfde moment. - **Locatiebotsing** – twee blokken in dezelfde ruimte tegelijk. - **Onderbezetting** – blok zonder begeleider (waarschuwing, niet blokkerend). Conflicten tonen we als duidelijke waarschuwingen; jij beslist of het mag. ## 5. Technische opzet - **Backend**: Django (Python) met Django REST Framework. Django's **"apps"** vormen ons modulesysteem: elke functie is een losse, in-/uitschakelbare app. - **Frontend**: React – het roosterraster en de schermen. - **Database**: SQLite om te starten (geen serverbeheer); later 1-op-1 te upgraden naar PostgreSQL. - **Auth/rechten**: Django's ingebouwde gebruikers- en rechtensysteem (basis aanwezig, volledig uitgerold in de multi-user-module). - **Draaien**: lokaal te starten; later te hosten op een eenvoudige server of clouddienst. ## 5b. Modulaire architectuur — een echt plugin-framework (verkoopargument) Modulariteit is een **verkoopargument**: een school koopt de kern en schakelt naar wens modules bij. Modules moeten daarom écht aan/uit te zetten zijn — niet alleen nette code, maar instelbaar per school via een beheerscherm. **Het plugin-framework (onderdeel van de kern):** - **Moduleregister** – elke module meldt zichzelf aan met naam, beschrijving, versie en afhankelijkheden. - **Aan/uit per school** – een beheerder zet modules in een **beheerscherm** in of uit; uitgeschakelde modules zijn onzichtbaar (geen menu's, geen schermen, geen API). - **Vaste aanhechtpunten (hooks)** – de kern biedt nette uitbreidpunten (menu, schermen, rooster-acties, exports) waar een module zich op aanhaakt, zónder de kern te wijzigen. - **Afhankelijkheden & licenties** – het register bewaakt afhankelijkheden tussen modules en biedt een haak voor licenties/feature-flags, zodat modules per school verkocht en geactiveerd kunnen worden. Zo kun je het product gelaagd aanbieden: iedereen krijgt de kern, en modules als printen, ouderportaal of multi-user zijn losse, activeerbare uitbreidingen. **Kern (altijd aan):** personen, groepen, subgroepen, activiteiten, locaties, tijdslots, roosterblokken, schooljaar/kalender, conflictdetectie + het plugin-framework zelf. **Modules (in-/uitschakelbaar per school):** - **Printen/Exporteren** – roosters als PDF/print, per groep/leerling/leerkracht. - **Multi-user & toegang** – inloggen met rollen: leerling, ouder, leerkracht, ondersteuner en diverse lagen collega's (bv. directie, administratie), elk met eigen rechten en weergave. - *(later mogelijk)* ouderportaal, vervoer, doelen/handelingsplan, meldingen. ## 6. Gefaseerde aanpak **Fase 0 – Fundament + plugin-framework** Django-project, React-frontend, database, basis-UI-skelet én het plugin-framework: moduleregister, aan/uit-beheerscherm en uitbreidpunten. Dit framework is de ruggengraat van het verkoopargument, dus het komt meteen in fase 0. **Fase 1 – Basisgegevens (CRUD)** Personen (leerlingen, leerkrachten, ondersteuners), groepen, subgroepen, activiteiten, locaties invoeren en beheren. **Fase 2 – Schooljaar & roostering** Schooljaarkalender (studiedagen/vrije dagen/vakanties) + roosterblokken toewijzen aan groep/subgroep/leerling met begeleiders. Weekrooster tonen per groep, per leerling en per leerkracht. **Fase 3 – Flexibiliteit & uitzonderingen** Individuele afwijkingen, subgroep-roosters, afwezigheid/vervanging. Leerlingrooster = groepsrooster + uitzonderingen. Vrije/vakantiedagen schakelen blokken automatisch uit. **Fase 4 – Conflictdetectie** Automatische controle bij plaatsen/wijzigen, met heldere waarschuwingen. **Fase 5 – Module: Printen/Exporteren** Eerste echte losse module — roosters als PDF/print, per groep/leerling/leerkracht. **Fase 6 – Module: Multi-user & toegang** Inloggen met rollen (leerling, ouder, leerkracht, ondersteuner, collega-lagen), elk met eigen rechten en weergave. Na elke fase heb je een werkende versie die je kunt uitproberen; we passen aan op basis van wat je ziet. De modules (fase 5–6) bewijzen meteen dat de modulaire opzet werkt. ## 7. Beslissingen (vastgelegd) - **Techstack**: Django (backend, modules via apps) + React (frontend) + SQLite → later PostgreSQL. - **Tijden**: vaste schooltijden, plus een jaaroverzicht met studiedagen, vrije dagen en vakanties. - **Locaties**: meenemen in de MVP (ook voor conflictdetectie). - **Multi-user**: niet in de MVP, maar als losse module gebouwd (leerling-, ouder- en gelaagde collega-logins). - **Modulariteit**: een echt plugin-framework als verkoopargument — modules per school in-/uitschakelbaar via een beheerscherm, met haak voor licenties. Komt al in fase 0. ## 8. Volgende stap Ik start met **Fase 0**: Django-project met modulestructuur, React-frontend en database opzetten — zodat we snel een werkend skelet hebben om op verder te bouwen. Zeg het woord en ik begin.