teach/db
Ramon e7bb76b76d
All checks were successful
dev - build & deploy naar test / build-and-deploy (push) Successful in 1m9s
feat: klassenmanagement - niveaugroep + niveau per leerling per vakgebied (v0.4.34-beta)
- Grootste openstaande roadmap-punt. Nieuwe tabel pupil_levels
  (db/019_pupil_levels.sql, zelfde class_id/pupil_id-vorm als
  assignments) legt per vakgebied (taal/rekenen/world) een niveaugroep
  vast (groep 1-8, gebaseerd op de leerjaren van de basisschool waaraan
  de leerdoelen gekoppeld zijn) + niveau (1-3, fijnmazige verfijning
  BINNEN die groep). Klas-standaard met individuele leerling-overrides,
  net zo laagdrempelig instelbaar als de standaard - het speciaal-
  onderwijs-geval waar dat vanaf het begin de norm is.
- Server: GET/PUT/DELETE /levels/class/:id en /levels/pupil/:id
  (src/api.js) hergebruiken exact het assignments-patroon (upsert via
  partial-unique-index, pupil-eerst-dan-klas-resolutie), plus
  GET /my/level voor de leerling-kant. Zelfde permissie
  (assignments.manage) en sameSchool/teacherOnly/pupilAccessible-
  guards als de bestaande toewijzingsroutes.
- Nieuwe admin-tab "Klassenmanagement": klas + vakgebied kiezen, een
  klas-standaard instellen, en per leerling de effectieve groep/niveau
  zien (overerft van de klas tenzij een eigen afwijking is ingesteld)
  met bewerk- en terug-naar-standaard-knoppen.
- ECHTE inhoudskoppeling, niet alleen een standaardwaarde: rekenen is
  het eerste vakgebied waarvan de SLO/TULE-leerlijn direct in
  getalgrenzen te vertalen is (groep 3 t/m 20, groep 4 t/m 100, groep 5
  t/m 1000, groep 6 t/m 10.000). Nieuwe SLO_MATH_RANGES/mathRangeFor()
  in data.js; math.js's gen() gebruikt dit voor de daadwerkelijke
  getallen zodra een leerling een groep heeft (S.yearGroup), met het
  bestaande niveau 1-3 als verfijning daarbinnen. Zonder groep blijft
  het oude vaste 10/20/100-gedrag exact bestaan.
- pupil.js geeft groep/niveau door aan taal/rekenen-widgets bij het
  mounten: niveau is een standaardwaarde (een al opgeslagen bord-niveau
  blijft leidend), groep wordt voor rekenen-widgets altijd meegegeven
  (er is geen "oud" groep-concept om te respecteren). Terzijde ook de
  stille .catch() op de nieuwe async renderPupilWidgets() opgelost.
- Taal/wereldoriëntatie krijgen deze ronde nog geen eigen
  inhoudskoppeling (vraagt een eigen contentbron per groep, nog niet
  uitgezocht) - eerlijk benoemd als vervolgstap, geen loze belofte.
- Tests: test/pupil-levels.test.js (10 tests) dekt de server-routes
  (mocked-pool-patroon) én - via dezelfde vm-techniek als elders in
  test/widgets.test.js voor MONEY_LEVELS - een ECHTE (niet regex-)test
  van mathRangeFor die bevestigt dat elke groep de juiste getalgrens
  oplevert en niveau nooit boven de groep-grens uitkomt. Twee bugs
  gevonden en gefixt tijdens het schrijven van deze tests: null-yearGroup
  werd per ongeluk als groep 1 behandeld i.p.v. "geen groep", en de
  testrol had geen klas-eigenaarschap waardoor 403 in plaats van 200
  terugkwam. Volledige testsuite: 128/128.
- Live geverifieerd in de sandbox: klas-standaard + leerling-override
  instellen in de nieuwe admin-tab, en drie scenario's in de
  leerling-omgeving die bevestigen dat de daadwerkelijk gegenereerde
  sommen binnen de juiste groep-grens blijven (geen klassenmanagement →
  ongewijzigd oud gedrag; groep zonder eigen bord-niveau → volledige
  groep-grens; groep mét een al opgeslagen bord-niveau → dat niveau
  blijft leidend, geschaald naar de juiste groep-grens).
- public/js/data.js bevatte al niet-gerelateerde, nog niet gecommitte
  wijzigingen van vóór deze sessie (extra taalthema's/woorden) - alleen
  de SLO_MATH_RANGES/mathRangeFor-hunk is hier meegenomen (git add -p),
  de rest blijft bewust ongemoeid staan, net als test/language-library.test.js.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014EPxzBVRXZZnBPvSAaPAbJ
2026-07-19 15:31:26 +02:00
..
001_init.sql Initiële opzet: Fastify + static, Docker, Postgres, Forgejo Actions 2026-07-07 22:41:05 +02:00
002_schools_auth.sql v0.2.00: schoolsysteem met rollen (super/admin/groepsleiding/leerling), koppelcodes, server-API en beheerpaneel 2026-07-09 22:26:01 +02:00
003_password_state.sql v0.2.02: uitgebreid wachtwoordbeheer voor gebruikers 2026-07-12 22:32:35 +02:00
004_user_roles.sql v0.2.21-beta: meerdere functies per gebruiker (multi-rol voor staf) + zoekveld 2026-07-13 22:41:40 +02:00
005_assignments.sql v0.2.22-beta: leerling-omgeving (aparte pagina zonder whiteboard) 2026-07-13 23:14:26 +02:00
006_security_boundaries.sql v0.3.03-beta: versterk publieke beveiliging 2026-07-14 12:42:16 +02:00
007_progress.sql v0.3.09-beta: voeg voortgang-schema en -API toe 2026-07-14 14:51:50 +02:00
008_widget_share.sql v0.3.14-beta: sta toewijzing van één widget toe met kijken/werken-modus (API) 2026-07-14 15:48:14 +02:00
009_save_system.sql v0.3.17-beta: detecteer save-conflicten tussen tabbladen 2026-07-14 16:19:25 +02:00
010_shared_library.sql v0.3.26-beta: server-API voor de gedeelde bibliotheek 2026-07-14 22:27:16 +02:00
011_shared_readonly.sql v0.3.28-beta: alleen-lezen-vlag voor gedeelde items (server) 2026-07-14 22:49:17 +02:00
012_image_catalog.sql feat: voeg afbeeldingscatalogus en opslagquota toe 2026-07-15 23:45:17 +02:00
013_parent_portal.sql feat: server-kant ouderportaal (v0.3.57-beta) 2026-07-16 00:02:16 +02:00
014_cms.sql feat: server-kant CMS voor de systeemmanager (v0.3.83-beta) 2026-07-16 19:29:08 +02:00
015_user_fk_cascade.sql fix: gebruiker verwijderen werkt weer (herstel foreign-key cascade) (v0.3.95-beta) 2026-07-17 21:39:29 +02:00
016_class_name_unique.sql fix: altijd de echte serverfout tonen + klasnamen uniek per school (v0.4.1-beta) 2026-07-18 03:39:04 +02:00
017_class_teacher_roles.sql fix: schoolbeheerder aan klas koppelen, systeemmanager-promotie dichten, UI-afstand (v0.4.07-beta) 2026-07-18 04:40:39 +02:00
018_user_avatar.sql feat: eigen personage (avatar) voor leerlingen, ouders en staf (v0.4.23-beta) 2026-07-19 07:34:25 +02:00
019_pupil_levels.sql feat: klassenmanagement - niveaugroep + niveau per leerling per vakgebied (v0.4.34-beta) 2026-07-19 15:31:26 +02:00