Leerling: oefenen, voortgang, resultaten en geschiedenis
8.1 Doel
Dit hoofdstuk beschrijft het functionele domein waarin een leerling een toegankelijke oefening opent, een oefenrun start of hervat, vragen beantwoordt, voortgang opslaat, een run afrondt en daarna resultaat en geschiedenis raadpleegt.
Het hoofdstuk beschrijft de samenhang tussen:
- oefening-startpagina;
- nieuwe oefenrun starten;
- verder gaan met een niet-afgeronde run;
- vraag voor vraag oefenen;
- antwoordverwerking;
- antwoordfeedback;
Geen idee;- onderbreken;
- afronden;
- resultaatweergave;
- statistieken;
- oefening opnieuw maken;
- PDF-download als raakvlak;
- oefeninggebonden geschiedenis;
- brede geschiedenis;
- gedeelde-oefeningcontext als raakvlak;
- live-meekijken als read-only afgeleide;
- anti-afleiding tijdens actieve oefenruns.
Het hoofdstuk is geen schermspecificatie en geen technische modulehandleiding. Usecases blijven leidend voor procesflows, schermdocumentatie blijft leidend voor exacte zichtbare onderdelen en FO-22 blijft leidend voor technische module- en payloadgrenzen.
8.2 Domeinafbakening
| Onderdeel | Binnen dit hoofdstuk | Buiten dit hoofdstuk |
|---|---|---|
| Oefening-startpagina | Introductie en contextuele acties Verder gaan, Start nieuwe en Geschiedenis. | Exacte layout, microcopy en schermcomponenten. |
| Nieuwe run starten | Run aanmaken vanuit een toegankelijke oefening met gekozen aantal vragen. | Oefeningconfiguratie wijzigen of docenttestmodus uitwerken. |
| Hervatten | Laatst gestarte niet-afgeronde run binnen dezelfde oefening en actieve niveaucontext openen. | Runs uit andere niveaus, niet-toegankelijke contexten of afgeronde runs hervatten. |
| Vraagbeantwoording | Antwoord opslaan, vraagstatus verwerken, totalen bijwerken en live-readmodel voeden. | Module-specifieke antwoordlogica als implementatiedetail dupliceren. |
| Antwoordfeedback | Op basis van opgeslagen vraagstatus juiste uitkomst en vervolgactie tonen. | Een tweede inhoudelijke antwoordmutatie uitvoeren. |
Geen idee | Afzonderlijke vraagroute met waarschuwing, markering, fouttelling en verborgen voorkeur. | Algemene voorkeurenpagina of beheer van gebruikersinstellingen volledig beschrijven. |
| Onderbreken | Niet-afgeronde run bewaren zonder eindstatus of geschiedenisregel. | Een pauzeknop of aparte pauzestatus introduceren. |
| Afronden | Run formeel voltooien, afrondmoment zetten, totalen/statistieken vastleggen. | Volledige resultaatpresentatie en PDF-layout dupliceren. |
| Resultaat | Eigen afgeronde run tonen met samenvatting, vraagdetails, statistieken en acties. | Docent-, ouder-/voogd- of beheerderresultaatweergave uitwerken. |
| Geschiedenis | Eigen afgeronde leerlingruns tonen en filteren. | Resultaten van andere leerlingen tonen. |
| PDF-export | Als vervolgactie en bronraakvlak benoemen. | Volledige PDF-opmaak en exportregels dupliceren uit FO-18. |
| Gedeelde oefeningen | Benoemen dat gedeelde runs zelfstandige leerlingruns kunnen worden. | De volledige deel-, ontvang- en verwijderflow dupliceren uit FO-09. |
| Live meekijken | Benoemen dat live meekijken opgeslagen voortgang gebruikt. | Viewerflows, audit en reconnectgedrag volledig dupliceren uit FO-15. |
8.3 Bronpositie
| Bronlaag | Betekenis voor dit hoofdstuk |
|---|---|
| FO | Beschrijft functionele samenhang, domeingrenzen en bron-van-waarheidregels. |
| Usecases leerling/oefenaanbod-en-toegang | Bepalen of een oefening überhaupt zichtbaar, openbaar, toegankelijk en startbaar is. |
| Usecases leerling/oefenen-en-voortgang | Beschrijven startpagina, hervatten, starten, beantwoorden, feedback, Geen idee, onderbreken en afronden. |
| Usecases leerling/resultaten-en-geschiedenis | Beschrijven resultaatweergave, statistieken, opnieuw maken, PDF-download en geschiedenis. |
| Usecases leerling/gedeelde-oefeningen | Beschrijven delen, ontvangen, starten, opnieuw maken en verwijderen van gedeelde oefeningen. |
| Schermdocumentatie leerling | Beschrijft zichtbare schermonderdelen, acties, lege toestanden en responsief gedrag. |
| Database-informatie | Beschrijft ExerciseRuns, ExerciseRunProgress, SharedExercises, uniforme velden en payloadgrenzen. |
| Oefenmodule-documentatie | Beschrijft modulecontract, modulespecifieke configuratie, vraaggeneratie, antwoordcontrole en renderrepresentaties. |
| FO-15 | Beschrijft live meekijken als read-only viewerfunctie boven opgeslagen voortgang. |
| FO-18 | Beschrijft resultaatpresentatie en PDF-export als historische exportlaag. |
| FO-13 | Beschrijft berichten, badges en systeemnotificaties die tijdens actieve leerlingruns visueel worden uitgesteld. |
8.4 Functionele hoofdobjecten
| Object / readmodel | Betekenis |
|---|---|
ExerciseRuns | Hoofdrecord van één unieke oefenuitvoering door één gebruiker. |
ExerciseRunProgress | Server-side voortgang per vraag binnen een run. |
Exercises | Concrete oefening die de leerling start of hervat. |
ExerciseModules | Technische module die vraaggeneratie, vraagweergave en antwoordcontrole ondersteunt. |
| Moduleconfiguratiepayload | Modulespecifieke configuratie van de concrete oefening zoals gebruikt bij runstart. |
| Runpayload | Modulespecifieke vraag-, antwoord- en volgorde-informatie voor één run. |
| Vraagvoortgangspayload | Modulespecifieke vraagtoestand en lokale voortgang per vraag. |
| Uniforme runvelden | Relationele velden voor totalen, timing, status, statistieken, duplicate- en share-context. |
| Geschiedenisreadmodel | Afgeleide lijst over afgeronde, niet-test runs van de leerling. |
| Resultaatviewmodel | Afgeleide resultaatweergave uit runcontext, vraagdetails en statistieken. |
| PDF-exportmodel | Tijdelijke exportrepresentatie op basis van dezelfde historische resultaatbron. |
| Livevoortgangreadmodel | Afgeleide actuele stand voor bevoegde meekijkers. |
ExerciseRuns en ExerciseRunProgress zijn bronhoudend voor runstatus, voortgang, resultaat en geschiedenis. Readmodels, resultaatcomponenten, PDF-modellen en liveweergaven zijn afgeleid.
8.5 Leerlingcontext
De leerling werkt altijd vanuit:
- een actief intern OefenHub-account;
- een actieve leerlingrol;
- een geldige leerlingcontext;
- een actuele niveaucontext waar dat functioneel vereist is;
- een toegankelijke categorie- en oefeningcontext;
- een concrete actieve oefening;
- een beschikbare technische module of historische render-/controlelogica.
De leerlingrol is niet combineerbaar met ouder-/voogd-, docent- of beheerdersrollen. Dit hoofdstuk beschrijft daarom uitsluitend de reguliere leerlingrun, niet testen door docenten en niet raadplegen door ouders, docenten of beheerders.
8.6 Toegang vóór oefenen
Een leerling kan pas oefenen wanneer server-side is vastgesteld dat de oefening binnen de actuele leerlingcontext toegankelijk is.
| Controle | Regel |
|---|---|
| Account | Het interne account moet actief en bruikbaar zijn. |
| Rolcontext | De gebruiker moet een actieve leerlingrol hebben. |
| Niveaucontext | De gekozen of actieve niveaucontext moet geldig zijn. |
| Niveauvorm | Open niveaus mogen zonder individuele autorisatie gebruikt worden; privéniveaus vereisen actieve autorisatie. |
| Categorie | De categorie moet binnen het niveau beschikbaar en functioneel zichtbaar zijn. |
| Oefening | De concrete oefening moet actief, gekoppeld en startbaar zijn. |
| Module | De bijbehorende technische module moet voor starten of hervatten bruikbaar zijn. |
| Route | Directe URL’s en bookmarks worden opnieuw server-side gecontroleerd. |
Frontend-zichtbaarheid van een categorie, oefening, startknop of hervatknop is nooit autorisatiebewijs.
8.7 Oefening-startpagina
Na keuze van een toegankelijke oefening opent de oefening-startpagina.
Deze startpagina is een afgeleid readmodel over:
- leerlingcontext;
- actieve niveaucontext;
- categoriecontext;
- concrete oefening;
- oefeningmetadata;
- modulebeschikbaarheid;
- niet-afgeronde runs;
- afgeronde geschiedenisindicatie.
De startpagina maakt geen run aan en wijzigt geen voortgang. Zij bepaalt alleen welke vervolgacties de leerling op dat moment mag zien.
8.7.1 Acties op de startpagina
| Actie | Voorwaarde | Functioneel gedrag |
|---|---|---|
Verder gaan | Er bestaat minimaal één niet-afgeronde run voor dezelfde leerling, oefening en actieve niveaucontext. | Hervat de laatst gestarte niet-afgeronde run. |
Start nieuwe | De oefening is actief, startbaar en modulecontext is bruikbaar. | Genereert direct een nieuwe run met het gekozen aantal vragen. |
Geschiedenis | De leerling heeft toegang tot de eigen geschiedeniscontext. | Opent de oefeninggebonden geschiedenis of een lege geschiedenisstaat. |
De leerling kan op de startpagina alleen het aantal vragen kiezen. Er is geen apart leerlingconfiguratiescherm voor modulespecifieke instellingen.
8.7.2 Geen datamutatie bij openen
Het openen van de oefening-startpagina wijzigt niet:
ExerciseRuns;ExerciseRunProgress;- gebruikersinstellingen;
- relaties;
- autorisaties;
- systeemberichten;
- meldingen;
- live-meekijksessies.
Een verouderde startpaginaweergave mag niet worden gebruikt om later alsnog een ontoegankelijke oefening te starten of te hervatten. Iedere vervolgactie voert opnieuw server-side controle uit.
8.8 Run-lifecycle
| Fase | Status / bron | Functionele betekenis |
|---|---|---|
| Startpagina geopend | Afgeleid readmodel | Er is nog geen runmutatie. |
| Nieuwe run gegenereerd | ExerciseRuns aangemaakt | De leerling heeft bewust Start nieuwe gekozen. |
| Eerste vraag getoond | StartedAtUtc / vraagvoortgang | De run is operationeel gestart. |
| Vraag beantwoord | ExerciseRunProgress bijgewerkt | Eén vraag is server-side verwerkt. |
| Feedback getoond | Afgeleid uit opgeslagen vraagstatus | Er vindt geen tweede antwoordmutatie plaats. |
| Run onderbroken | IsCompleted = false | De run blijft niet-afgerond en verschijnt niet in geschiedenis. |
| Run hervat | Bestaande run gelezen | Geen nieuwe run en geen nieuwe vraagvolgorde. |
| Laatste vraag verwerkt | Voortgang compleet | Afrondactie kan beschikbaar worden. |
| Run afgerond | IsCompleted = true, CompletedAtUtc gevuld | Resultaat en geschiedenis worden beschikbaar. |
| Resultaat bekeken | Resultaatviewmodel | Geen wijziging aan run of voortgang. |
| PDF gedownload | Tijdelijke exportresponse | Geen blijvend PDF-record en geen runmutatie. |
| Opnieuw gemaakt | Nieuwe zelfstandige run | Bronrun blijft ongewijzigd. |
Voor normale leerlingruns wordt geen zware extra statusmachine geïntroduceerd. Functioneel zijn startmoment, voortgang, IsCompleted, afrondmoment en opgeslagen totalen/statistieken voldoende.
8.9 Nieuwe run starten
Een nieuwe leerlingrun ontstaat pas na een expliciete startactie vanuit een toegankelijke oefening.
Bij Start nieuwe gebeurt minimaal:
- de backend controleert opnieuw de leerling-, niveau-, categorie- en oefeningcontext;
- het gekozen aantal vragen wordt gevalideerd;
- de concrete oefeningconfiguratie wordt gelezen;
- de gekoppelde technische module wordt aangeroepen voor vraaggeneratie;
- een nieuw
ExerciseRuns-record wordt aangemaakt; - uniforme runmetadata wordt vastgelegd;
- module-specifieke vraagdata wordt opgeslagen in de runpayload;
- per vraag wordt server-side voortgang voorbereid of aangemaakt;
- de leerling wordt direct naar het oefenscherm met de eerste vraag geleid.
8.9.1 Aantal vragen
De leerling mag alleen het aantal vragen kiezen binnen de toegestane grenzen.
| Regel | Betekenis |
|---|---|
| Standaardwaarde | De UI toont een geldige standaardwaarde, bijvoorbeeld 15. |
| Minimale waarde | De waarde moet positief en binnen module-/oefeninggrenzen vallen. |
| Maximum | Het systeemmaximum voorkomt te grote runs. |
| Ongeldige invoer | Er ontstaat geen run wanneer invoer ongeldig is. |
| Geen configuratiescherm | De leerling wijzigt geen modulespecifieke docentconfiguratie. |
Een nieuwe run overschrijft bestaande niet-afgeronde runs niet. Er kunnen meerdere niet-afgeronde runs naast elkaar bestaan; Verder gaan kiest later de laatst gestarte niet-afgeronde run binnen dezelfde context.
8.10 Hervatten met Verder gaan
Verder gaan gebruikt altijd de laatst gestarte niet-afgeronde run binnen dezelfde leerling-, oefening- en actieve niveaucontext.
| Situatie | Gedrag |
|---|---|
| Eén niet-afgeronde run | Deze run wordt hervat. |
| Meerdere niet-afgeronde runs | De laatst gestarte niet-afgeronde run wordt hervat. |
| Niet-afgeronde run uit ander niveau | Wordt niet via deze actie hervat. |
| Niet-afgeronde run uit andere oefening | Wordt niet via deze actie hervat. |
| Toegang intussen vervallen | Hervatten wordt server-side geblokkeerd. |
| Run intussen afgerond | Verder gaan is niet meer van toepassing. |
| Modulecontext niet meer uitvoerbaar | Hervatten wordt veilig geblokkeerd of leidt tot niet-beschikbaarafhandeling. |
Hervatten maakt geen nieuwe ExerciseRun aan en wijzigt de vraagvolgorde niet. De bestaande run, runpayload en voortgangsregels blijven leidend.
8.11 Oefenscherm en vraagweergave
Tijdens oefenen ziet de leerling steeds één vraag tegelijk.
Minimaal zichtbaar zijn:
- de opgave;
- een antwoordveld of modulespecifieke invoercomponent;
- voortgang binnen de run, bijvoorbeeld
Vraag 1 van 15; - een primaire actie voor bevestigen, antwoord tonen, volgende vraag of resultaat bekijken;
- eventueel de knop
Geen ideewanneer toegestaan; - feedback na verwerking wanneer de configuratie dat vereist.
De generieke playercontainer toont voortgang, routegedrag en generieke acties. De technische module levert de modulespecifieke vraagweergave, antwoordvorm, juiste antwoordrepresentatie en feedbackrepresentatie.
8.12 Vraagbeantwoording
Na een bevestigd antwoord verwerkt OefenHub de vraag server-side.
De verwerking omvat minimaal:
| Stap | Verantwoordelijkheid |
|---|---|
| Runcontrole | Controleren dat de run bestaat, bij de leerling hoort en niet afgerond is. |
| Vraagcontrole | Controleren dat de vraagpositie geldig en nog verwerkbaar is. |
| Modulecontrole | Module interpreteert het antwoord en bepaalt goed/fout. |
| Voortgang | Server schrijft gegeven antwoord, status, timing en vraagstate weg. |
| Totalen | Uniforme runvelden worden bijgewerkt. |
| Live-readmodel | Geautoriseerde live-meekijkers kunnen actuele voortgang ontvangen. |
| Volgende stap | Systeem bepaalt antwoordfeedback, volgende vraag of afrondactie. |
Een antwoord is pas functioneel verwerkt wanneer de server de vraagvoortgang heeft opgeslagen. Alleen client-side invoer in het antwoordveld is geen voortgangsbron.
8.13 Voortgang per vraag
ExerciseRunProgress of een gelijkwaardige voortgangsstructuur legt per vraag minimaal vast:
| Gegeven | Betekenis |
|---|---|
| Runverwijzing | Bij welke ExerciseRun de vraag hoort. |
| Volgnummer | De vraagpositie binnen deze specifieke run. |
| Vraagstatepayload | Modulespecifieke toestand, vraagparameters en antwoordstructuur. |
| Eerste toonmoment | Moment waarop de vraag voor het eerst zichtbaar werd. |
| Antwoordmoment | Moment waarop het antwoord server-side is verwerkt. |
| Juistheid | Uniforme markering goed/fout. |
Geen idee | Uniforme markering of de vraag via Geen idee is verwerkt. |
| Vraag-afgerond | Markering dat deze vraag administratief volledig verwerkt is. |
| Laatste update | Moment van laatste server-side mutatie. |
IsCompleted op vraagniveau betekent dat één vraag volledig is verwerkt. Dit is niet hetzelfde als IsCompleted op runniveau.
8.14 Uniforme runvelden
De run houdt uniforme waarden bij die platformbreed nodig zijn.
| Veldsoort | Voorbeelden | Doel |
|---|---|---|
| Identiteit | leerling, niveau, categorie, oefening, module | Historische context en autorisatie. |
| Aantallen | gevraagd aantal, totaal aantal, afgeronde vragen | Voortgang en resultaat. |
| Resultaten | goed, fout, Geen idee | Resultaatweergave en geschiedenis. |
| Timing | aangemaakt, gestart, laatst actief, afgerond | Hervatten, live meekijken en statistieken. |
| Statistieken | gemiddelde, mediaan, grenzen, uitschieters | Resultaat, geschiedenisdetail en PDF. |
| Herkomst | duplicate-run, gedeelde oefening | Opnieuw maken en gedeelde-oefeningcontext. |
| Testmarkering | IsTestRun | Uitsluiten van reguliere leerlinggeschiedenis. |
Normale geschiedenis-, resultaat-, PDF- en live-scenario’s lezen deze uniforme velden. Herberekening uit payloads is alleen herstel- of controlepad.
8.15 Payloadlagen
OefenHub maakt functioneel onderscheid tussen meerdere payloadlagen.
| Payloadlaag | Voorbeeldbron | Functionele rol |
|---|---|---|
| Configuratiepayload | Concrete oefeningconfiguratie | Bepaalt hoe de module vragen mag genereren. |
| Runpayload | ExerciseRuns.QuestionDataJsonBase64 | Bevat de concrete vraaginhoud, volgorde en modulespecifieke runstate. |
| Vraagvoortgangspayload | ExerciseRunProgress.QuestionStateJsonBase64 | Bevat modulespecifieke vraagstate en lokale voortgang. |
| Uniforme velden | Relationele run- en voortgangskolommen | Bron voor query’s, autorisatie, geschiedenis, resultaten en live-meekijken. |
Modulepayloads mogen modulespecifieke schema-informatie bevatten, zoals moduleKey en schemaVersion, zodat oudere configuraties en runs veilig geïnterpreteerd kunnen worden.
Er wordt geen nieuwe generieke databasekolom geïntroduceerd voor schemaherleidbaarheid wanneer moduleKey en schemaVersion al in de bestaande payload aanwezig zijn.
8.16 Antwoordfeedback
Wanneer de configuratie ShowAnswerAfterSubmit toestaat, toont OefenHub na verwerking:
- of het antwoord goed of fout was;
- het gegeven antwoord;
- de juiste antwoordrepresentatie;
- eventueel modulespecifieke toelichting;
- de vervolgactie
VolgendeofBekijk resultaat.
Deze feedback is grotendeels read-only. De inhoudelijke antwoordmutatie is al uitgevoerd bij de vraagverwerking of bij Geen idee.
| Situatie | Gedrag |
|---|---|
| Antwoord verwerkt en feedback toegestaan | Feedback wordt getoond uit opgeslagen vraagstate. |
| Antwoord nog niet verwerkt | Feedback is niet beschikbaar. |
Vraag via Geen idee bevestigd | Juiste antwoord wordt getoond en vraag telt als fout. |
| Laatste vraag | Vervolgactie wordt Bekijk resultaat. |
| Refresh na verwerking | Feedback kan opnieuw worden opgebouwd uit opgeslagen voortgang. |
8.17 Geen idee
Geen idee is een aparte vraagroute en geen variant van een leeg regulier antwoord.
De knop is alleen beschikbaar wanneer AllowMarkAsDunno = true voor de oefening of vraagcontext geldt.
Bij bevestigde Geen idee geldt:
- de vraag wordt als beantwoord verwerkt;
IsDunnowordt vastgelegd;- de vraag telt functioneel als fout;
- een eventueel ingevuld antwoord mag als gegeven antwoord worden bewaard;
- het juiste antwoord wordt getoond waar toegestaan;
DunnoCounten fouttotalen worden bijgewerkt;- live-meekijkers kunnen de voortgang read-only volgen.
8.17.1 Waarschuwing bij eerste gebruik
Bij eerste gebruik verschijnt een waarschuwing op basis van de popupkey POP-LLN-OEF-DUNNO-WARNING.
| Keuze | Gedrag |
|---|---|
| Annuleren | Geen definitieve vraagmutatie, geen Dunno-markering en geen voorkeur opslaan; eventueel eerder ingevulde antwoordtekst mag zichtbaar blijven als bewerkbare lokale invoer, maar wordt niet als definitieve voortgang verwerkt. |
| Bevestigen | Vraag wordt als Geen idee verwerkt en telt als fout. |
| Bevestigen met “niet opnieuw tonen” | Verborgen voorkeur wordt opgeslagen. |
| Alleen checkbox aanklikken zonder bevestigen | Geen voorkeur opslaan. |
De verborgen voorkeur hoort bij het gebruikersinstellingendomein. De oefenflow mag deze voorkeur gebruiken, maar de algemene voorkeurenpagina is niet de bron voor deze specifieke processtap.
8.18 Onderbreken
Een leerling kan een oefening onderbreken door:
- naar een andere pagina te navigeren;
- de browser te sluiten;
- het tabblad te sluiten;
- uit te loggen;
- verbinding te verliezen;
- de oefencontext op andere wijze te verlaten.
Er is geen aparte pauzeknop nodig.
Onderbreken betekent:
- de run blijft bestaan;
- de run blijft niet-afgerond;
- bevestigde voortgang blijft opgeslagen;
- niet-bevestigde invoer hoeft niet persistent te worden opgeslagen;
- er worden geen eindstatistieken berekend;
- de run verschijnt niet als afgeronde geschiedenisregel;
- live-meekijksessies worden geïnformeerd of beëindigd;
- de run kan later hervatbaar zijn zolang de context geldig blijft.
Onderbreken is dus geen afronden en geen verwijderen.
8.19 Afronden
Een run wordt pas afgerond nadat de laatste vraag definitief server-side is verwerkt en de leerling de resultaatstap bereikt of kiest.
Bij afronden verwerkt OefenHub minimaal:
| Mutatie | Betekenis |
|---|---|
CompletedAtUtc | Afrondmoment van de volledige run. |
IsCompleted = true | Run wordt resultaat- en geschiedeniswaardig. |
| Totalen | Aantal vragen, goed, fout en Geen idee worden geconsolideerd. |
| Statistieken | Gemiddelde, mediaan, grenzen, uitschieters en doorlooptijd worden berekend of vastgelegd. |
| Laatste activiteit | Laatste server-side activiteit wordt bijgewerkt. |
| Live-readmodel | Meekijkers krijgen de afgeronde toestand. |
| Geschiedenis | De run kan in afgeronde geschiedenis verschijnen. |
Dubbele afronding moet idempotent of veilig geblokkeerd worden. Een run mag niet afgerond worden wanneer niet alle vragen definitief verwerkt zijn.
8.20 Statistieken
Resultaatstatistieken worden na afronding opgeslagen of consistent uit de opgeslagen rungegevens afgeleid.
Minimaal relevant zijn:
- gemiddelde tijd per vraag;
- mediaan;
- ondergrens;
- bovengrens;
- totale doorlooptijd;
- uitschieters ondergrens;
- uitschieters bovengrens;
- aantallen uitschieters.
Normale schermen herberekenen statistieken niet opnieuw uit de payload. Resultaatweergave, geschiedenisdetail en PDF-export gebruiken dezelfde opgeslagen statistiekbron.
Wanneer statistieken ontbreken of niet veilig berekend konden worden, toont OefenHub een veilige beperkte weergave zonder technische payload of stacktrace.
8.21 Resultaat na afronding
Na afronding opent of kan de leerling de resultaatweergave openen.
De resultaatweergave gebruikt de historische runcontext en toont minimaal:
| Onderdeel | Bron |
|---|---|
| Titel en context | Run, categorie, oefening en historische context. |
| Gebruiker | Eigen leerlingcontext of geanonimiseerde historische context waar van toepassing. |
| Datum | Afrondmoment van de run. |
| Aantal vragen | Uniforme runvelden. |
| Goed/fout | Uniforme runvelden. |
Geen idee | Uniforme runvelden en vraagmarkeringen. |
| Vraagdetails | Opgeslagen vraag- en antwoordpayload. |
| Juiste antwoorden | Module- of payloadrepresentatie. |
| Resultaatstatus per vraag | Uniforme voortgangsstatus. |
| Statistieken | Opgeslagen runstatistieken. |
| Duplicate-context | Bronrunverwijzing waar relevant. |
| Deelcontext | Gedeelde-oefeningcontext waar relevant. |
Alleen bekijken van resultaat wijzigt geen run, score, voortgang, relatie, readstate of gebruikersinstelling.
8.22 Resultaatacties
Binnen de resultaatweergave kunnen vervolgacties beschikbaar zijn.
| Actie | Voorwaarde | Bronhoofdstuk / bronflow |
|---|---|---|
| Sluit resultaat | Resultaatcomponent is geopend. | Dit hoofdstuk; geen domeinmutatie. |
| Maak deze oefening opnieuw | Eigen afgeronde run is hermaakbaar en modulecontext is bruikbaar. | Dit hoofdstuk en resultaatusecase. |
| Download als PDF | Eigen afgeronde run is exporteerbaar. | FO-18 en PDF-usecase. |
| Deel deze oefening | Delen is toegestaan en leerling heeft actieve vriendrelatie. | FO-09 en gedeelde-oefeningenusecases. |
Vervolgacties worden niet beschikbaar gemaakt op basis van alleen zichtbare knoppen. De backend controleert per actie opnieuw de actuele voorwaarden.
8.23 Oefening opnieuw maken
Maak deze oefening opnieuw maakt een nieuwe zelfstandige run op basis van dezelfde vragen van een afgeronde bronrun.
| Aspect | Regel |
|---|---|
| Bronrun | Moet bestaan, afgerond zijn en toegankelijk zijn voor de leerling. |
| Vraaginhoud | Wordt overgenomen uit de bronrun. |
| Vraagvolgorde | Mag wijzigen wanneer toegestaan. |
| Nieuwe run | Heeft eigen voortgang, antwoorden, totalen en statistieken. |
| Bronrelatie | Wordt vastgelegd via DuplicateOfExerciseRunId of gelijkwaardige verwijzing. |
| Bronrun | Wordt niet gewijzigd. |
| Modulecontext | Moet uitvoerbaar of renderbaar genoeg zijn om opnieuw maken te ondersteunen. |
Wanneer de gekoppelde technische module niet meer beschikbaar of uitvoerbaar is, blijft historisch resultaat raadpleegbaar, maar opnieuw maken kan worden geblokkeerd.
8.24 PDF-download als raakvlak
PDF-download gebruikt dezelfde historische resultaatbron als de resultaatweergave.
Voor dit hoofdstuk geldt functioneel:
- PDF-download is een vervolgactie op een afgerond resultaat;
- de export wijzigt geen run, voortgang, score of geschiedenis;
- er ontstaat geen verplicht permanent PDF-record;
- dezelfde samenvatting, vraagdetails en statistieken worden gebruikt;
- autorisatie wordt opnieuw server-side gecontroleerd;
- modules mogen een veilige exportrepresentatie leveren voor modulespecifieke notatie.
De exacte PDF-layout, pagina-einden, footer, bestandsnaamlogica en QuestPDF-afbakening staan in FO-18.
8.25 Gedeelde oefeningen als raakvlak
Een leerling kan een afgeronde eigen oefening delen wanneer:
- vriendschappen functioneel beschikbaar zijn;
- oefenen delen functioneel beschikbaar is;
- de leerling actieve vrienden heeft;
- de bronrun afgerond en deelbaar is;
- de backend de relatie en voorwaarden opnieuw controleert.
Delen zelf hoort bij FO-09. Voor dit hoofdstuk is vooral relevant dat een gedeelde oefening pas een eigen run van de ontvanger wordt wanneer de ontvanger deze daadwerkelijk start.
Een uit een gedeelde oefening ontstane run is daarna een zelfstandige leerlingrun met eigen voortgang, antwoorden, totalen, statistieken en geschiedenis.
8.26 Oefeninggebonden geschiedenis
De oefeninggebonden geschiedenis toont afgeronde eigen runs binnen de relevante oefening-, categorie- en niveaucontext.
Minimaal zichtbaar zijn:
- regelnummer;
- afrondmoment;
- aantal vragen;
- aantal goed;
- aantal fout;
- aantal
Geen ideewanneer van toepassing; - functioneel herkenbare context;
- actie naar resultaatdetail.
Niet zichtbaar als reguliere geschiedenisregel zijn:
- niet-afgeronde runs;
- docent-testruns;
- runs van andere leerlingen;
- runs buiten de gekozen oefeningcontext;
- technisch corrupte of niet veilig renderbare records zonder veilige fallback.
Leerlingen kunnen oefengeschiedenis niet verwijderen.
8.27 Brede geschiedenis
Naast oefeninggebonden geschiedenis bestaat een bredere geschiedenisweergave over alle afgeronde eigen runs.
Deze brede geschiedenis kan tonen:
- normale afgeronde runs;
- duplicate-runs;
- afgeronde runs uit gedeelde oefeningen;
- runs over meerdere niveaus;
- runs over meerdere categorieën;
- runs over meerdere oefeningen.
Minimale filters zijn:
| Filter | Betekenis |
|---|---|
| Periode | Beperkt resultaten tot gekozen tijdvenster. |
| Niveau | Beperkt resultaten tot historische niveaucontext. |
| Categorie | Beperkt resultaten tot historische categoriecontext. |
| Type run | Onderscheidt normale, opnieuw gemaakte of gedeelde context waar relevant. |
Filters beperken de eigen geautoriseerde dataset. Zij openen nooit data van andere leerlingen of rollen.
8.28 Filteren en pagineren
Filteren en pagineren zijn readmodelgedrag.
Zij wijzigen niet:
- runstatus;
- voortgang;
- resultaten;
- statistieken;
- relaties;
- autorisaties;
- gebruikersinstellingen;
- systeemberichten.
Bij wijziging van filters of paginagrootte wordt de dataset opnieuw server-side opgebouwd. Een lege filteruitkomst is een normale toestand.
8.29 Resultaatdetail vanuit geschiedenis
Wanneer een leerling vanuit geschiedenis een resultaatdetail opent, controleert de backend opnieuw:
- dat de run bestaat;
- dat de run afgerond is;
- dat de run bij de leerling hoort;
- dat de routecontext geen toegang verruimt;
- dat de opgeslagen resultaatbron veilig kan worden gelezen;
- dat vervolgacties zoals PDF of opnieuw maken nog toegestaan zijn.
Het resultaatdetail gebruikt dezelfde functionele resultaatweergave als direct na afronding. Alleen de ingang verschilt.
8.30 Historische context
Een run bewaart de historische context die nodig is om het resultaat later herkenbaar te tonen.
| Context | Regel |
|---|---|
| Niveau | Run blijft verwijzen naar het niveau van het moment van genereren. |
| Categorie | Runcontext wordt niet herschreven door latere categoriemigratie. |
| Oefening | Run blijft gebaseerd op de concrete oefening van dat moment. |
| Module | Run verwijst naar de technische moduleversie of modulecontext van dat moment. |
| Vraaginhoud | Runpayload en voortgangspayload blijven bron voor vraagdetails. |
| Snapshots bij gedeelde oefeningen | Snapshotlabels blijven zoals op het moment van delen. |
Latere wijzigingen in naamgeving, categorie-indeling, oefeningconfiguratie, modulemetadata of autorisaties mogen bestaande resultaten niet stilzwijgend herschrijven.
8.31 Autorisatie en veiligheidsregels
Voor alle leerlingrunacties gelden de volgende regels.
| Regel | Betekenis |
|---|---|
| Server-side context | Iedere start-, hervat-, antwoord-, afrond-, detail- en exportactie controleert actuele server-side context. |
| Eigen run | Een leerling mag alleen eigen reguliere leerlingruns muteren. |
| Resultaatinzage | Een leerling mag alleen eigen resultaat- en geschiedenisgegevens raadplegen. |
| Clientstate | Routeparameters, browsergeschiedenis, filters en oude UI-status mogen toegang niet verruimen. |
| Technische IDs | GUID’s of technische identifiers worden niet als herkenningswaarde aan leerlingen getoond. |
| Payloadlekken | Modulepayloads, stacktraces, tokens en interne foutdetails worden niet aan gewone gebruikers getoond. |
| Geen rolmix | Ouder-/voogd-, docent- en beheerderinzage gebruiken eigen hoofdstukken en autorisatiegrenzen. |
| Geen mutatie door lezen | Resultaat bekijken, geschiedenis filteren en PDF downloaden wijzigen geen runinhoud. |
8.32 Anti-afleiding tijdens actieve oefening
Tijdens een actieve leerling-oefenrun heeft de oefencontext visuele prioriteit.
De applicatie toont of actualiseert tijdens actieve vraagbeantwoording niet opdringerig:
- berichtenbadges;
- meldingenterugkoppelingen;
- ticketactie-indicaties;
- systeemnotificatie-overlays;
- andere niet-oefengerelateerde signaleringen.
Onderliggende data blijft wel correct opgeslagen.
| Signaal | Gedrag tijdens oefening |
|---|---|
| Mailbox-systeembericht | Mag server-side worden aangemaakt, maar geen afleidende overlay boven de oefening. |
| Privébericht | Readstate en ongelezenstatus blijven correct, zichtbare badge wordt uitgesteld. |
| Melding/ticketactie | Actie-indicatie wordt uitgesteld tot na verlaten, onderbreken of afronden. |
| Systeemnotificatie | Wordt niet boven actieve oefening getoond. |
| Live-meekijkupdate | Blijft toegestaan omdat deze de oefencontext niet aan de leerling presenteert als afleiding. |
Na verlaten, onderbreken of afronden van de oefencontext worden badges, notificaties en actie-indicaties opnieuw beoordeeld.
8.33 Live meekijken als afgeleide
Live meekijken gebruikt opgeslagen voortgang als bron. SignalR of vergelijkbare realtimecommunicatie is transport, niet de bron van waarheid.
Voor leerlingruns betekent dit:
- na ieder bevestigd antwoord wordt voortgang server-side opgeslagen;
- live-meekijkers zien alleen afgeleide, toegestane voortgang;
- meekijkers kunnen geen antwoorden invullen, score wijzigen of run afronden;
- onderbreken of afronden van de run wordt aan livecontexten doorgegeven;
- verlies van realtimeverbinding mag runvoortgang niet verloren laten gaan.
De viewerflows, audit en reconnectregels staan in FO-15.
8.34 Accountverwijdering en open runs
Wanneer het account van een leerling wordt verwijderd of geanonimiseerd:
- open runs worden niet alsnog afgerond;
- open runs blijven administratief niet-afgerond;
- open runs worden niet meer regulier hervatbaar;
- open runs verschijnen niet als afgeronde geschiedenisregels;
- afgeronde historische runs kunnen onder geanonimiseerde identiteit bewaard blijven waar dat functioneel en auditmatig nodig is.
Accountverwijdering herschrijft geen historische oefenresultaten naar nieuwe actuele persoonsgegevens.
8.35 Docenttestruns
Docenttestruns zijn geen reguliere leerlingruns.
Voor dit hoofdstuk geldt:
- docenttestruns worden niet als permanente leerlinggeschiedenis getoond;
- docenttestruns worden niet meegenomen in leerlingstatistieken;
- docenttesten horen bij docentfunctionaliteit en moduleconfiguratie;
- achtergebleven testruns kunnen volgens technische cleanupregels worden opgeruimd.
De leerlinggeschiedenis toont alleen afgeronde, niet-test runs van de leerling.
8.36 Tellers en samenvattingswaarden
Tellers binnen oefen-, resultaat- en geschiedeniscontexten zijn afgeleid uit brondata.
| Teller | Telbasis |
|---|---|
| Niet-afgeronde runs | ExerciseRuns met IsCompleted = false binnen leerling-, oefening- en niveaucontext. |
| Resterende vragen | Totaal aantal vragen minus afgeronde vraagvoortgang binnen run. |
| Goed | Uniforme run- of voortgangsvelden na server-side verwerking. |
| Fout | Uniforme run- of voortgangsvelden na server-side verwerking. |
Geen idee | Uniforme dunno-markeringen. |
| Geschiedenisregels | Afgeronde, niet-test runs binnen context. |
| Brede geschiedenis | Afgeronde, niet-test eigen runs over toegestane historische contexten. |
| Populaire / recente context | Wordt elders op frontpage/readmodelniveau afgeleid. |
Tellers mogen niet uit clientstate worden opgebouwd wanneer dat toegang of resultaten kan beïnvloeden.
8.37 Lege toestanden
Lege toestanden zijn normale toestanden wanneer de leerling wel toegang heeft tot de context maar er geen relevante data is.
Voorbeelden:
- geen niet-afgeronde run voor
Verder gaan; - geen afgeronde geschiedenis voor een oefening;
- geen resultaten binnen gekozen periodefilter;
- geen brede geschiedenis;
- geen
Geen idee-markeringen; - geen uitschieters in statistieken;
- geen beschikbare deelontvangers;
- geen PDF-download mogelijk door ontbrekende exportvoorwaarde;
- geen hermaakbare bronrun;
- geen live-meekijkers actief.
Een lege toestand is geen autorisatiefout. De UI mag informatief uitleggen wat ontbreekt, zonder verborgen data te lekken.
8.38 Fouttoestanden
Fouttoestanden ontstaan wanneer de context niet veilig verwerkt kan worden.
Voorbeelden:
- leerlingcontext ontbreekt;
- niveaucontext ontbreekt of is ongeldig;
- oefening is niet toegankelijk;
- oefening is in onderhoud;
- technische module is niet beschikbaar;
- gekozen aantal vragen is ongeldig;
- run bestaat niet;
- run hoort niet bij de leerling;
- run is al afgerond bij antwoordverwerking;
- vraagpositie is ongeldig;
- vraag is al definitief verwerkt;
- payload is niet veilig te interpreteren;
- statistieken ontbreken of zijn inconsistent;
- resultaatdetail verwijst naar een niet-afgeronde run;
- PDF-export faalt;
- opnieuw maken is niet mogelijk;
- delen is niet toegestaan;
- filterparameters zijn ongeldig;
- client gebruikt verouderde startpagina- of runstatus.
Bij fouttoestanden geldt:
- er wordt geen gedeeltelijke of dubbele runmutatie uitgevoerd;
- technische details worden niet aan de leerling getoond;
- autorisatiegegevens van andere gebruikers worden niet gelekt;
- bestaande opgeslagen voortgang blijft leidend;
- de leerling wordt veilig teruggeleid naar een passende context waar mogelijk.
8.39 Relatie tot andere FO-hoofdstukken
| Hoofdstuk | Relatie |
|---|---|
| Rollen, context en autorisatie | Bepaalt leerlingrol, niet-combineerbaarheid en server-side autorisatie. |
| Applicatieschil, header, footer en navigatie | Bepaalt navigatie, badges en anti-afleiding in de applicatieschil. |
| Frontpages en overzichtsschermen | Beschrijft leerlingfrontpage, recente oefeningen, populaire categorieën en verder-oefenenblok. |
| Oefencatalogus, niveaus, categorieën en oefeningen | Bepaalt beschikbare categorieën, oefeningen en startbare oefeningcontext. |
| Gedeelde oefeningen | Beschrijft delen, ontvangen, starten en verwijderen van gedeelde oefeningen. |
| Docentfunctionaliteit | Beschrijft docentbeheer en docentresultaatinzage buiten leerlingcontext. |
| Ouder-/voogdfunctionaliteit | Beschrijft ouder-/voogdinzage in kindresultaten zonder mutatierecht. |
| Berichten, communicatie en notificaties | Beschrijft badges, systeemberichten en anti-afleidingsgedrag. |
| Live meekijken | Beschrijft read-only volgen van actieve runvoortgang. |
| PDF-export en resultaatpresentatie | Beschrijft export- en presentatieafbakening voor resultaten. |
| Oefenmodules en modulepayloads | Beschrijft modulecontract, payloadlagen, schemaVersion en moduleKey. |
8.40 Gerelateerde bronverwijzingen
| Bron | Link |
|---|---|
| Technisch Ontwerp — oefenruns en resultaten | Oefenruns, voortgang, resultaten, statistieken en PDF-brondata |
| Technisch Ontwerp — rolflows | Rollenflows technisch |
| Technisch Ontwerp — live meekijken | Realtime live meekijken met SignalR |
| Technisch Ontwerp — PDF-export | PDF-export met QuestPDF |
| Usecases — leerling oefenaanbod en toegang | Oefenaanbod en toegang |
| UC-LLN-TOEG-001 — Beschikbare categorieën bekijken | Beschikbare categorieën bekijken |
| UC-LLN-TOEG-002 — Beschikbare oefeningen bekijken | Beschikbare oefeningen bekijken |
| UC-LLN-TOEG-003 — Oefeningstoegang controleren bij openen | Oefeningstoegang controleren bij openen |
| UC-LLN-TOEG-004 — Toegang vervalt door ingetrokken autorisatie | Toegang vervalt door ingetrokken autorisatie |
| Usecases — leerling oefenen en voortgang | Oefenen en voortgang |
| UC-LLN-OEF-001 — Oefening-startpagina openen | Oefening-startpagina openen |
| UC-LLN-OEF-002 — Verder gaan met niet-afgeronde oefening | Verder gaan met niet-afgeronde oefening |
| UC-LLN-OEF-003 — Nieuwe oefening starten | Nieuwe oefening starten |
| UC-LLN-OEF-004 — Vraag beantwoorden | Vraag beantwoorden |
| UC-LLN-OEF-005 — Antwoord tonen na bevestiging | Antwoord tonen na bevestiging |
| UC-LLN-OEF-006 — Geen idee gebruiken | Geen idee gebruiken |
| UC-LLN-OEF-007 — Oefening onderbreken | Oefening onderbreken |
| UC-LLN-OEF-008 — Oefening afronden | Oefening afronden |
| Usecases — leerling resultaten en geschiedenis | Resultaten en geschiedenis |
| UC-LLN-RES-001 — Resultaat na afronding bekijken | Resultaat na afronding bekijken |
| UC-LLN-RES-002 — Resultaatstatistieken bekijken | Resultaatstatistieken bekijken |
| UC-LLN-RES-003 — Oefening opnieuw maken | Oefening opnieuw maken |
| UC-LLN-RES-004 — Resultaat als PDF downloaden | Resultaat als PDF downloaden |
| UC-LLN-HIS-001 — Oefeninggeschiedenis bekijken | Oefeninggeschiedenis bekijken |
| UC-LLN-HIS-002 — Geschiedenis filteren en pagineren | Geschiedenis filteren en pagineren |
| UC-LLN-HIS-003 — Resultaatdetail vanuit geschiedenis openen | Resultaatdetail vanuit geschiedenis openen |
| UC-LLN-HIS-004 — Geschiedenis alles bekijken | Geschiedenis alles bekijken |
| Usecases — leerling gedeelde oefeningen | Gedeelde oefeningen |
| Schermdocumentatie — leerling oefening | Oefening |
| Schermdocumentatie — start nieuwe oefening | Start nieuwe oefening |
| Schermdocumentatie — geschiedenis overzicht | Geschiedenis overzicht |
| Schermdocumentatie — geschiedenis details | Geschiedenis details |
| Schermdocumentatie — geschiedenis alles | Geschiedenis alles |
| Schermdocumentatie — gedeelde oefeningen overzicht | Gedeelde oefeningen overzicht |
| Database-informatie — oefenruns, delen en voortgang | Oefenruns, delen en voortgang |
| Oefenmodule — Optellen en aftrekken simpel | Optellen en aftrekken simpel |
| Ontwerpbron — autorisatiematrix | Autorisatiematrix |
| Ontwerpbron — business rules | Business rules |
| Ontwerpbron — popup-register | Popup-register |
| FO — oefencatalogus, niveaus, categorieën en oefeningen | Oefencatalogus, niveaus, categorieën en oefeningen |
| FO — gedeelde oefeningen | Gedeelde oefeningen |
| FO — berichten, communicatie en notificaties | Berichten, communicatie en notificaties |
| FO — live meekijken | Live meekijken |
| FO — PDF-export en resultaatpresentatie | PDF-export en resultaatpresentatie |
| FO — oefenmodules en modulepayloads | Oefenmodules en modulepayloads |