-- Klassenmanagement: per vakgebied (taal/rekenen/world) een niveaugroep -- (groep 1-8, gebaseerd op de leerjaren van de basisschool, waaraan de -- leerdoelen gekoppeld zijn) en een niveau (1-3, fijnmazige verfijning -- BINNEN die groep - niet aan 3 geklemd in het datamodel zelf, widgets -- klemmen voorlopig zelf nog wel). Zelfde vorm als assignments: precies -- één van class_id/pupil_id gezet (klas-standaard, of een individuele -- afwijking - in het speciaal onderwijs vaak vanaf het begin de norm), -- nu met vakgebied als extra dimensie, dus één rij per (klas|leerling, -- vakgebied) i.p.v. één rij per klas|leerling. CREATE TABLE IF NOT EXISTS pupil_levels ( id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, class_id BIGINT REFERENCES classes(id) ON DELETE CASCADE, pupil_id BIGINT REFERENCES users(id) ON DELETE CASCADE, subject TEXT NOT NULL, year_group INT NOT NULL, level INT NOT NULL DEFAULT 1, updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), CHECK (num_nonnulls(class_id, pupil_id) = 1), CHECK (subject IN ('taal','rekenen','world')), CHECK (year_group BETWEEN 1 AND 8), CHECK (level >= 1) ); CREATE UNIQUE INDEX IF NOT EXISTS idx_pupil_levels_class ON pupil_levels(class_id, subject) WHERE class_id IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS idx_pupil_levels_pupil ON pupil_levels(pupil_id, subject) WHERE pupil_id IS NOT NULL;