Skip to main content

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

OnderdeelBinnen dit hoofdstukBuiten dit hoofdstuk
Oefening-startpaginaIntroductie en contextuele acties Verder gaan, Start nieuwe en Geschiedenis.Exacte layout, microcopy en schermcomponenten.
Nieuwe run startenRun aanmaken vanuit een toegankelijke oefening met gekozen aantal vragen.Oefeningconfiguratie wijzigen of docenttestmodus uitwerken.
HervattenLaatst gestarte niet-afgeronde run binnen dezelfde oefening en actieve niveaucontext openen.Runs uit andere niveaus, niet-toegankelijke contexten of afgeronde runs hervatten.
VraagbeantwoordingAntwoord opslaan, vraagstatus verwerken, totalen bijwerken en live-readmodel voeden.Module-specifieke antwoordlogica als implementatiedetail dupliceren.
AntwoordfeedbackOp basis van opgeslagen vraagstatus juiste uitkomst en vervolgactie tonen.Een tweede inhoudelijke antwoordmutatie uitvoeren.
Geen ideeAfzonderlijke vraagroute met waarschuwing, markering, fouttelling en verborgen voorkeur.Algemene voorkeurenpagina of beheer van gebruikersinstellingen volledig beschrijven.
OnderbrekenNiet-afgeronde run bewaren zonder eindstatus of geschiedenisregel.Een pauzeknop of aparte pauzestatus introduceren.
AfrondenRun formeel voltooien, afrondmoment zetten, totalen/statistieken vastleggen.Volledige resultaatpresentatie en PDF-layout dupliceren.
ResultaatEigen afgeronde run tonen met samenvatting, vraagdetails, statistieken en acties.Docent-, ouder-/voogd- of beheerderresultaatweergave uitwerken.
GeschiedenisEigen afgeronde leerlingruns tonen en filteren.Resultaten van andere leerlingen tonen.
PDF-exportAls vervolgactie en bronraakvlak benoemen.Volledige PDF-opmaak en exportregels dupliceren uit FO-18.
Gedeelde oefeningenBenoemen dat gedeelde runs zelfstandige leerlingruns kunnen worden.De volledige deel-, ontvang- en verwijderflow dupliceren uit FO-09.
Live meekijkenBenoemen dat live meekijken opgeslagen voortgang gebruikt.Viewerflows, audit en reconnectgedrag volledig dupliceren uit FO-15.

8.3 Bronpositie

BronlaagBetekenis voor dit hoofdstuk
FOBeschrijft functionele samenhang, domeingrenzen en bron-van-waarheidregels.
Usecases leerling/oefenaanbod-en-toegangBepalen of een oefening überhaupt zichtbaar, openbaar, toegankelijk en startbaar is.
Usecases leerling/oefenen-en-voortgangBeschrijven startpagina, hervatten, starten, beantwoorden, feedback, Geen idee, onderbreken en afronden.
Usecases leerling/resultaten-en-geschiedenisBeschrijven resultaatweergave, statistieken, opnieuw maken, PDF-download en geschiedenis.
Usecases leerling/gedeelde-oefeningenBeschrijven delen, ontvangen, starten, opnieuw maken en verwijderen van gedeelde oefeningen.
Schermdocumentatie leerlingBeschrijft zichtbare schermonderdelen, acties, lege toestanden en responsief gedrag.
Database-informatieBeschrijft ExerciseRuns, ExerciseRunProgress, SharedExercises, uniforme velden en payloadgrenzen.
Oefenmodule-documentatieBeschrijft modulecontract, modulespecifieke configuratie, vraaggeneratie, antwoordcontrole en renderrepresentaties.
FO-15Beschrijft live meekijken als read-only viewerfunctie boven opgeslagen voortgang.
FO-18Beschrijft resultaatpresentatie en PDF-export als historische exportlaag.
FO-13Beschrijft berichten, badges en systeemnotificaties die tijdens actieve leerlingruns visueel worden uitgesteld.

8.4 Functionele hoofdobjecten

Object / readmodelBetekenis
ExerciseRunsHoofdrecord van één unieke oefenuitvoering door één gebruiker.
ExerciseRunProgressServer-side voortgang per vraag binnen een run.
ExercisesConcrete oefening die de leerling start of hervat.
ExerciseModulesTechnische module die vraaggeneratie, vraagweergave en antwoordcontrole ondersteunt.
ModuleconfiguratiepayloadModulespecifieke configuratie van de concrete oefening zoals gebruikt bij runstart.
RunpayloadModulespecifieke vraag-, antwoord- en volgorde-informatie voor één run.
VraagvoortgangspayloadModulespecifieke vraagtoestand en lokale voortgang per vraag.
Uniforme runveldenRelationele velden voor totalen, timing, status, statistieken, duplicate- en share-context.
GeschiedenisreadmodelAfgeleide lijst over afgeronde, niet-test runs van de leerling.
ResultaatviewmodelAfgeleide resultaatweergave uit runcontext, vraagdetails en statistieken.
PDF-exportmodelTijdelijke exportrepresentatie op basis van dezelfde historische resultaatbron.
LivevoortgangreadmodelAfgeleide 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.

ControleRegel
AccountHet interne account moet actief en bruikbaar zijn.
RolcontextDe gebruiker moet een actieve leerlingrol hebben.
NiveaucontextDe gekozen of actieve niveaucontext moet geldig zijn.
NiveauvormOpen niveaus mogen zonder individuele autorisatie gebruikt worden; privéniveaus vereisen actieve autorisatie.
CategorieDe categorie moet binnen het niveau beschikbaar en functioneel zichtbaar zijn.
OefeningDe concrete oefening moet actief, gekoppeld en startbaar zijn.
ModuleDe bijbehorende technische module moet voor starten of hervatten bruikbaar zijn.
RouteDirecte 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

ActieVoorwaardeFunctioneel gedrag
Verder gaanEr bestaat minimaal één niet-afgeronde run voor dezelfde leerling, oefening en actieve niveaucontext.Hervat de laatst gestarte niet-afgeronde run.
Start nieuweDe oefening is actief, startbaar en modulecontext is bruikbaar.Genereert direct een nieuwe run met het gekozen aantal vragen.
GeschiedenisDe 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

FaseStatus / bronFunctionele betekenis
Startpagina geopendAfgeleid readmodelEr is nog geen runmutatie.
Nieuwe run gegenereerdExerciseRuns aangemaaktDe leerling heeft bewust Start nieuwe gekozen.
Eerste vraag getoondStartedAtUtc / vraagvoortgangDe run is operationeel gestart.
Vraag beantwoordExerciseRunProgress bijgewerktEén vraag is server-side verwerkt.
Feedback getoondAfgeleid uit opgeslagen vraagstatusEr vindt geen tweede antwoordmutatie plaats.
Run onderbrokenIsCompleted = falseDe run blijft niet-afgerond en verschijnt niet in geschiedenis.
Run hervatBestaande run gelezenGeen nieuwe run en geen nieuwe vraagvolgorde.
Laatste vraag verwerktVoortgang compleetAfrondactie kan beschikbaar worden.
Run afgerondIsCompleted = true, CompletedAtUtc gevuldResultaat en geschiedenis worden beschikbaar.
Resultaat bekekenResultaatviewmodelGeen wijziging aan run of voortgang.
PDF gedownloadTijdelijke exportresponseGeen blijvend PDF-record en geen runmutatie.
Opnieuw gemaaktNieuwe zelfstandige runBronrun 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:

  1. de backend controleert opnieuw de leerling-, niveau-, categorie- en oefeningcontext;
  2. het gekozen aantal vragen wordt gevalideerd;
  3. de concrete oefeningconfiguratie wordt gelezen;
  4. de gekoppelde technische module wordt aangeroepen voor vraaggeneratie;
  5. een nieuw ExerciseRuns-record wordt aangemaakt;
  6. uniforme runmetadata wordt vastgelegd;
  7. module-specifieke vraagdata wordt opgeslagen in de runpayload;
  8. per vraag wordt server-side voortgang voorbereid of aangemaakt;
  9. 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.

RegelBetekenis
StandaardwaardeDe UI toont een geldige standaardwaarde, bijvoorbeeld 15.
Minimale waardeDe waarde moet positief en binnen module-/oefeninggrenzen vallen.
MaximumHet systeemmaximum voorkomt te grote runs.
Ongeldige invoerEr ontstaat geen run wanneer invoer ongeldig is.
Geen configuratieschermDe 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.

SituatieGedrag
Eén niet-afgeronde runDeze run wordt hervat.
Meerdere niet-afgeronde runsDe laatst gestarte niet-afgeronde run wordt hervat.
Niet-afgeronde run uit ander niveauWordt niet via deze actie hervat.
Niet-afgeronde run uit andere oefeningWordt niet via deze actie hervat.
Toegang intussen vervallenHervatten wordt server-side geblokkeerd.
Run intussen afgerondVerder gaan is niet meer van toepassing.
Modulecontext niet meer uitvoerbaarHervatten 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 idee wanneer 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:

StapVerantwoordelijkheid
RuncontroleControleren dat de run bestaat, bij de leerling hoort en niet afgerond is.
VraagcontroleControleren dat de vraagpositie geldig en nog verwerkbaar is.
ModulecontroleModule interpreteert het antwoord en bepaalt goed/fout.
VoortgangServer schrijft gegeven antwoord, status, timing en vraagstate weg.
TotalenUniforme runvelden worden bijgewerkt.
Live-readmodelGeautoriseerde live-meekijkers kunnen actuele voortgang ontvangen.
Volgende stapSysteem 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:

GegevenBetekenis
RunverwijzingBij welke ExerciseRun de vraag hoort.
VolgnummerDe vraagpositie binnen deze specifieke run.
VraagstatepayloadModulespecifieke toestand, vraagparameters en antwoordstructuur.
Eerste toonmomentMoment waarop de vraag voor het eerst zichtbaar werd.
AntwoordmomentMoment waarop het antwoord server-side is verwerkt.
JuistheidUniforme markering goed/fout.
Geen ideeUniforme markering of de vraag via Geen idee is verwerkt.
Vraag-afgerondMarkering dat deze vraag administratief volledig verwerkt is.
Laatste updateMoment 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.

VeldsoortVoorbeeldenDoel
Identiteitleerling, niveau, categorie, oefening, moduleHistorische context en autorisatie.
Aantallengevraagd aantal, totaal aantal, afgeronde vragenVoortgang en resultaat.
Resultatengoed, fout, Geen ideeResultaatweergave en geschiedenis.
Timingaangemaakt, gestart, laatst actief, afgerondHervatten, live meekijken en statistieken.
Statistiekengemiddelde, mediaan, grenzen, uitschietersResultaat, geschiedenisdetail en PDF.
Herkomstduplicate-run, gedeelde oefeningOpnieuw maken en gedeelde-oefeningcontext.
TestmarkeringIsTestRunUitsluiten 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.

PayloadlaagVoorbeeldbronFunctionele rol
ConfiguratiepayloadConcrete oefeningconfiguratieBepaalt hoe de module vragen mag genereren.
RunpayloadExerciseRuns.QuestionDataJsonBase64Bevat de concrete vraaginhoud, volgorde en modulespecifieke runstate.
VraagvoortgangspayloadExerciseRunProgress.QuestionStateJsonBase64Bevat modulespecifieke vraagstate en lokale voortgang.
Uniforme veldenRelationele run- en voortgangskolommenBron 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 Volgende of Bekijk resultaat.

Deze feedback is grotendeels read-only. De inhoudelijke antwoordmutatie is al uitgevoerd bij de vraagverwerking of bij Geen idee.

SituatieGedrag
Antwoord verwerkt en feedback toegestaanFeedback wordt getoond uit opgeslagen vraagstate.
Antwoord nog niet verwerktFeedback is niet beschikbaar.
Vraag via Geen idee bevestigdJuiste antwoord wordt getoond en vraag telt als fout.
Laatste vraagVervolgactie wordt Bekijk resultaat.
Refresh na verwerkingFeedback 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;
  • IsDunno wordt vastgelegd;
  • de vraag telt functioneel als fout;
  • een eventueel ingevuld antwoord mag als gegeven antwoord worden bewaard;
  • het juiste antwoord wordt getoond waar toegestaan;
  • DunnoCount en 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.

KeuzeGedrag
AnnulerenGeen 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.
BevestigenVraag wordt als Geen idee verwerkt en telt als fout.
Bevestigen met “niet opnieuw tonen”Verborgen voorkeur wordt opgeslagen.
Alleen checkbox aanklikken zonder bevestigenGeen 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:

MutatieBetekenis
CompletedAtUtcAfrondmoment van de volledige run.
IsCompleted = trueRun wordt resultaat- en geschiedeniswaardig.
TotalenAantal vragen, goed, fout en Geen idee worden geconsolideerd.
StatistiekenGemiddelde, mediaan, grenzen, uitschieters en doorlooptijd worden berekend of vastgelegd.
Laatste activiteitLaatste server-side activiteit wordt bijgewerkt.
Live-readmodelMeekijkers krijgen de afgeronde toestand.
GeschiedenisDe 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:

OnderdeelBron
Titel en contextRun, categorie, oefening en historische context.
GebruikerEigen leerlingcontext of geanonimiseerde historische context waar van toepassing.
DatumAfrondmoment van de run.
Aantal vragenUniforme runvelden.
Goed/foutUniforme runvelden.
Geen ideeUniforme runvelden en vraagmarkeringen.
VraagdetailsOpgeslagen vraag- en antwoordpayload.
Juiste antwoordenModule- of payloadrepresentatie.
Resultaatstatus per vraagUniforme voortgangsstatus.
StatistiekenOpgeslagen runstatistieken.
Duplicate-contextBronrunverwijzing waar relevant.
DeelcontextGedeelde-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.

ActieVoorwaardeBronhoofdstuk / bronflow
Sluit resultaatResultaatcomponent is geopend.Dit hoofdstuk; geen domeinmutatie.
Maak deze oefening opnieuwEigen afgeronde run is hermaakbaar en modulecontext is bruikbaar.Dit hoofdstuk en resultaatusecase.
Download als PDFEigen afgeronde run is exporteerbaar.FO-18 en PDF-usecase.
Deel deze oefeningDelen 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.

AspectRegel
BronrunMoet bestaan, afgerond zijn en toegankelijk zijn voor de leerling.
VraaginhoudWordt overgenomen uit de bronrun.
VraagvolgordeMag wijzigen wanneer toegestaan.
Nieuwe runHeeft eigen voortgang, antwoorden, totalen en statistieken.
BronrelatieWordt vastgelegd via DuplicateOfExerciseRunId of gelijkwaardige verwijzing.
BronrunWordt niet gewijzigd.
ModulecontextMoet 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 idee wanneer 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:

FilterBetekenis
PeriodeBeperkt resultaten tot gekozen tijdvenster.
NiveauBeperkt resultaten tot historische niveaucontext.
CategorieBeperkt resultaten tot historische categoriecontext.
Type runOnderscheidt 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.

ContextRegel
NiveauRun blijft verwijzen naar het niveau van het moment van genereren.
CategorieRuncontext wordt niet herschreven door latere categoriemigratie.
OefeningRun blijft gebaseerd op de concrete oefening van dat moment.
ModuleRun verwijst naar de technische moduleversie of modulecontext van dat moment.
VraaginhoudRunpayload en voortgangspayload blijven bron voor vraagdetails.
Snapshots bij gedeelde oefeningenSnapshotlabels 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.

RegelBetekenis
Server-side contextIedere start-, hervat-, antwoord-, afrond-, detail- en exportactie controleert actuele server-side context.
Eigen runEen leerling mag alleen eigen reguliere leerlingruns muteren.
ResultaatinzageEen leerling mag alleen eigen resultaat- en geschiedenisgegevens raadplegen.
ClientstateRouteparameters, browsergeschiedenis, filters en oude UI-status mogen toegang niet verruimen.
Technische IDsGUID’s of technische identifiers worden niet als herkenningswaarde aan leerlingen getoond.
PayloadlekkenModulepayloads, stacktraces, tokens en interne foutdetails worden niet aan gewone gebruikers getoond.
Geen rolmixOuder-/voogd-, docent- en beheerderinzage gebruiken eigen hoofdstukken en autorisatiegrenzen.
Geen mutatie door lezenResultaat 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.

SignaalGedrag tijdens oefening
Mailbox-systeemberichtMag server-side worden aangemaakt, maar geen afleidende overlay boven de oefening.
PrivéberichtReadstate en ongelezenstatus blijven correct, zichtbare badge wordt uitgesteld.
Melding/ticketactieActie-indicatie wordt uitgesteld tot na verlaten, onderbreken of afronden.
SysteemnotificatieWordt niet boven actieve oefening getoond.
Live-meekijkupdateBlijft 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.

TellerTelbasis
Niet-afgeronde runsExerciseRuns met IsCompleted = false binnen leerling-, oefening- en niveaucontext.
Resterende vragenTotaal aantal vragen minus afgeronde vraagvoortgang binnen run.
GoedUniforme run- of voortgangsvelden na server-side verwerking.
FoutUniforme run- of voortgangsvelden na server-side verwerking.
Geen ideeUniforme dunno-markeringen.
GeschiedenisregelsAfgeronde, niet-test runs binnen context.
Brede geschiedenisAfgeronde, niet-test eigen runs over toegestane historische contexten.
Populaire / recente contextWordt 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

HoofdstukRelatie
Rollen, context en autorisatieBepaalt leerlingrol, niet-combineerbaarheid en server-side autorisatie.
Applicatieschil, header, footer en navigatieBepaalt navigatie, badges en anti-afleiding in de applicatieschil.
Frontpages en overzichtsschermenBeschrijft leerlingfrontpage, recente oefeningen, populaire categorieën en verder-oefenenblok.
Oefencatalogus, niveaus, categorieën en oefeningenBepaalt beschikbare categorieën, oefeningen en startbare oefeningcontext.
Gedeelde oefeningenBeschrijft delen, ontvangen, starten en verwijderen van gedeelde oefeningen.
DocentfunctionaliteitBeschrijft docentbeheer en docentresultaatinzage buiten leerlingcontext.
Ouder-/voogdfunctionaliteitBeschrijft ouder-/voogdinzage in kindresultaten zonder mutatierecht.
Berichten, communicatie en notificatiesBeschrijft badges, systeemberichten en anti-afleidingsgedrag.
Live meekijkenBeschrijft read-only volgen van actieve runvoortgang.
PDF-export en resultaatpresentatieBeschrijft export- en presentatieafbakening voor resultaten.
Oefenmodules en modulepayloadsBeschrijft modulecontract, payloadlagen, schemaVersion en moduleKey.

8.40 Gerelateerde bronverwijzingen

BronLink
Technisch Ontwerp — oefenruns en resultatenOefenruns, voortgang, resultaten, statistieken en PDF-brondata
Technisch Ontwerp — rolflowsRollenflows technisch
Technisch Ontwerp — live meekijkenRealtime live meekijken met SignalR
Technisch Ontwerp — PDF-exportPDF-export met QuestPDF
Usecases — leerling oefenaanbod en toegangOefenaanbod en toegang
UC-LLN-TOEG-001 — Beschikbare categorieën bekijkenBeschikbare categorieën bekijken
UC-LLN-TOEG-002 — Beschikbare oefeningen bekijkenBeschikbare oefeningen bekijken
UC-LLN-TOEG-003 — Oefeningstoegang controleren bij openenOefeningstoegang controleren bij openen
UC-LLN-TOEG-004 — Toegang vervalt door ingetrokken autorisatieToegang vervalt door ingetrokken autorisatie
Usecases — leerling oefenen en voortgangOefenen en voortgang
UC-LLN-OEF-001 — Oefening-startpagina openenOefening-startpagina openen
UC-LLN-OEF-002 — Verder gaan met niet-afgeronde oefeningVerder gaan met niet-afgeronde oefening
UC-LLN-OEF-003 — Nieuwe oefening startenNieuwe oefening starten
UC-LLN-OEF-004 — Vraag beantwoordenVraag beantwoorden
UC-LLN-OEF-005 — Antwoord tonen na bevestigingAntwoord tonen na bevestiging
UC-LLN-OEF-006 — Geen idee gebruikenGeen idee gebruiken
UC-LLN-OEF-007 — Oefening onderbrekenOefening onderbreken
UC-LLN-OEF-008 — Oefening afrondenOefening afronden
Usecases — leerling resultaten en geschiedenisResultaten en geschiedenis
UC-LLN-RES-001 — Resultaat na afronding bekijkenResultaat na afronding bekijken
UC-LLN-RES-002 — Resultaatstatistieken bekijkenResultaatstatistieken bekijken
UC-LLN-RES-003 — Oefening opnieuw makenOefening opnieuw maken
UC-LLN-RES-004 — Resultaat als PDF downloadenResultaat als PDF downloaden
UC-LLN-HIS-001 — Oefeninggeschiedenis bekijkenOefeninggeschiedenis bekijken
UC-LLN-HIS-002 — Geschiedenis filteren en paginerenGeschiedenis filteren en pagineren
UC-LLN-HIS-003 — Resultaatdetail vanuit geschiedenis openenResultaatdetail vanuit geschiedenis openen
UC-LLN-HIS-004 — Geschiedenis alles bekijkenGeschiedenis alles bekijken
Usecases — leerling gedeelde oefeningenGedeelde oefeningen
Schermdocumentatie — leerling oefeningOefening
Schermdocumentatie — start nieuwe oefeningStart nieuwe oefening
Schermdocumentatie — geschiedenis overzichtGeschiedenis overzicht
Schermdocumentatie — geschiedenis detailsGeschiedenis details
Schermdocumentatie — geschiedenis allesGeschiedenis alles
Schermdocumentatie — gedeelde oefeningen overzichtGedeelde oefeningen overzicht
Database-informatie — oefenruns, delen en voortgangOefenruns, delen en voortgang
Oefenmodule — Optellen en aftrekken simpelOptellen en aftrekken simpel
Ontwerpbron — autorisatiematrixAutorisatiematrix
Ontwerpbron — business rulesBusiness rules
Ontwerpbron — popup-registerPopup-register
FO — oefencatalogus, niveaus, categorieën en oefeningenOefencatalogus, niveaus, categorieën en oefeningen
FO — gedeelde oefeningenGedeelde oefeningen
FO — berichten, communicatie en notificatiesBerichten, communicatie en notificaties
FO — live meekijkenLive meekijken
FO — PDF-export en resultaatpresentatiePDF-export en resultaatpresentatie
FO — oefenmodules en modulepayloadsOefenmodules en modulepayloads