PDF-export en resultaatpresentatie
18.1 Doel
Resultaatpresentatie geeft gebruikers inzicht in afgeronde oefenruns.
PDF-export maakt dezelfde historische resultaatinformatie tijdelijk downloadbaar als PDF-bestand.
De bron blijft altijd de opgeslagen runcontext. De PDF is geen aparte functionele brondata, geen nieuw resultaatrecord en geen blijvend documentdomein binnen OefenHub.
Dit hoofdstuk beschrijft de functionele samenhang tussen:
- directe resultaatweergave na afronding;
- resultaatdetail vanuit geschiedenis;
- vraag- en antwoordpresentatie;
- runstatistieken;
- duplicaat- en gedeelde-oefeningcontext;
- PDF-download;
- rolgebonden resultaatinzage;
- historische reconstructie;
- module-specifieke exportrepresentatie;
- foutafhandeling zonder datalekken.
18.2 Domeinafbakening
| Onderdeel | Binnen scope | Buiten scope |
|---|---|---|
| Resultaatpresentatie | Tonen van samenvatting, vraagdetails, antwoorden, juiste antwoorden, resultaatstatus, statistieken en context van één afgeronde run. | Beantwoorden van vragen, corrigeren, herberekenen vanuit de UI of wijzigen van rungegevens. |
| Resultaatdetail vanuit geschiedenis | Opnieuw openen van dezelfde historische resultaatweergave voor een afgeronde run. | Tonen van niet-afgeronde runs als historisch resultaat. |
| PDF-export | Tijdelijke download van dezelfde inhoudelijke resultaatdata als resultaatweergave of resultaatdetail. | Permanente opslag van PDF-bestanden, rapportages over meerdere runs, bulkexport of exportbeheer. |
| Bestandsnaam | Genereren van een veilige downloadnaam met datum, OefenHub, categorie en oefening. | Vrij beheerbare bestandsnaamsjablonen door eindgebruikers of docenten. |
| PDF-layoutregels | Functionele eisen aan inhoud, pagina-einden, tabelheaders, vervolgtekst en footer. | Technische QuestPDF-componentstructuur, styling op codeklasse-niveau of printerdrivergedrag. |
| Module-specifieke notatie | Veilige exportrepresentatie voor module-inhoud zoals breuken, machten of samengestelde antwoorden. | Vrije HTML, scripts, client-rendering of onveilige modulemarkup in PDF-output. |
| Roltoegang | Server-side controle per leerling-, docent-, ouder-/voogd- of beheercontext. | Toegang op basis van zichtbare knop, querystring, route-id, browsergeschiedenis of eerder geladen schermdata. |
Resultaatpresentatie en PDF-export lezen bestaande resultaatdata. Zij maken geen nieuwe oefenrun aan en wijzigen geen bestaande run.
18.3 Bronpositie
Dit FO-hoofdstuk beschrijft de functionele samenhang en grenzen.
De detailbronnen blijven leidend voor hun eigen laag.
| Bronlaag | Betekenis |
|---|---|
| FO | Beschrijft resultaatpresentatie en PDF-export als functioneel domeincontract. |
| Usecases | Beschrijven processtappen, condities, autorisatie, uitzonderingen en requirements per rol. |
| Schermdocumentatie | Beschrijft zichtbare onderdelen, modalgedrag, tabellen, acties, lege toestanden en waardelagen. |
| Database-informatie | Beschrijft ExerciseRuns, ExerciseRunProgress, payloadvelden, statistiekvelden en historische context. |
| Oefenmodule-documentatie | Beschrijft module-specifieke vraagweergave, antwoordstructuur en exportrepresentatie. |
| Ontwerpbronnen | Beschrijven business rules, statusmodellen, popupkeys en algemene beveiligingsregels. |
| Technisch ontwerp | Werkt QuestPDF, PDF-service, componentopbouw, streaming en implementatiedetails uit. |
Het FO dupliceert geen volledige usecaseflows of schermspecificaties, maar legt vast welke functionele regels voor alle resultaat- en exportcontexten gelden.
18.4 Functionele hoofdregels
Voor resultaatpresentatie en PDF-export gelden de volgende hoofdregels.
- Alleen afgeronde, niet-test runs zijn normale resultaat- en geschiedenisitems.
- Een resultaatweergave leest de opgeslagen runcontext en mag geen clientstate als bron gebruiken.
- De resultaatweergave berekent normale statistieken niet opnieuw in de browser.
- PDF-export gebruikt dezelfde inhoudelijke resultaatbron als de resultaatweergave.
- PDF-export maakt geen permanent PDF-record aan.
- PDF-export wijzigt geen run, voortgang, score, statistiek, relatie, bericht, melding of gebruikersinstelling.
- Elke resultaat- en exportactie voert opnieuw server-side autorisatiecontrole uit.
- Historische runcontext blijft leidend wanneer actuele namen, configuraties, modules of autorisaties later wijzigen.
- Module-specifieke inhoud wordt veilig weergegeven via generieke of module-ondersteunde representatie.
- Exportfouten mogen geen gedeeltelijke gevoelige data tonen.
18.5 Resultaatbron
De hoofdbron voor resultaatpresentatie is de afgeronde ExerciseRun.
Voor resultaatweergave zijn minimaal relevant:
| Gegevensbron | Gebruik |
|---|---|
ExerciseRuns | Hoofdrecord met gebruiker, niveau, categorie, oefening, module, afrondmoment, totalen, statistieken en context. |
ExerciseRunProgress | Server-side vraagvoortgang en operationele vraagstatus waar nodig voor detailopbouw en controle. |
| Module-specifieke vraagpayload | Vraaginhoud, antwoordstructuur, juiste antwoorden, gegeven antwoorden en modulecontext. |
| Uniforme runvelden | Totalen, aantallen, timing, statistieken en afrondstatus. |
| Historische contextvelden / verwijzingen | Niveau, categorie, oefening, module en eventuele gedeelde-oefening- of duplicaatcontext. |
| Module-exportrepresentatie | Veilige representatie van module-specifieke notatie wanneer generieke tekstweergave onvoldoende is. |
Voor normale resultaatweergave zijn de opgeslagen uniforme runvelden leidend. Herberekening uit payload is alleen bedoeld als technische herstel- of controlefunctie en niet als normale scherm- of exportflow.
18.6 Historische context
Een resultaat hoort bij de context die gold toen de run werd gegenereerd, uitgevoerd, afgerond of gedeeld.
Historische context omvat minimaal:
- uitvoerende gebruiker;
- niveau;
- categorie;
- oefening;
- technische module;
- moduleconfiguratie;
- vraaginhoud;
- antwoordstructuur;
- juiste antwoorden;
- gegeven antwoorden;
- afrondmoment;
- totalen;
- statistieken;
- duplicaatrelatie waar relevant;
- gedeelde-oefeningcontext waar relevant.
Latere wijzigingen mogen bestaande resultaten niet stilzwijgend herschrijven.
Voorbeelden:
- een categorienaamwijziging wijzigt niet automatisch de betekenis van oude resultaten;
- een categoriemigratie herschrijft geen afgeronde runs;
- een oefening die later in onderhoud gaat blijft als historisch resultaat leesbaar;
- een module die later inactief wordt maakt bestaande PDF-export niet automatisch ongeldig;
- een ingetrokken docentautorisatie verandert niet de historische run zelf;
- een gedeelde oefening behoudt snapshotcontext waar het gedeelde record die vastlegt.
18.7 Resultaat na afronding
Wanneer een leerling een oefenrun afrondt, ontstaat resultaatpresentatie pas nadat de laatste vraag definitief is verwerkt en de run formeel is afgerond.
De resultaatweergave toont minimaal:
| Onderdeel | Functionele betekenis |
|---|---|
| Titel | Duidt aan dat het om resultaat van een oefening gaat. |
| Contextregel | Historische categorie en oefening. |
| Samenvatting | Gebruiker, afrondmoment, aantal vragen, goed, fout en eventueel Geen idee. |
| Vraagdetails | Volledige vraaginhoud en antwoordinformatie per vraag. |
| Resultaatstatus | Goed, fout of Geen idee waar van toepassing. |
| Juiste antwoord | Beschikbaar bij fout of Geen idee, en waar module dit ondersteunt. |
| Statistieken | Opgeslagen runstatistieken zoals gemiddelde tijd, mediaan, grenzen, uitschieters en totale doorlooptijd. |
| Vervolgacties | Sluiten, opnieuw maken, delen waar toegestaan en PDF-download. |
| Duplicaatinformatie | Alleen wanneer de run deel uitmaakt van een duplicaatreeks. |
De resultaatweergave is geen mutatiescherm voor de run zelf. Vervolgacties hebben eigen procesregels.
18.8 Resultaatdetail vanuit geschiedenis
Resultaatdetail vanuit geschiedenis gebruikt dezelfde inhoudelijke resultaatweergave als het directe resultaat na afronding.
Het verschil zit in de ingang:
| Ingang | Betekenis |
|---|---|
| Direct na afronding | De gebruiker bereikt resultaat vanuit de zojuist afgeronde oefenrun. |
| Oefeninggeschiedenis | De gebruiker opent een afgeronde run binnen één oefeningcontext. |
| Geschiedenis alles | De gebruiker opent een afgeronde run vanuit een brede historische dataset. |
| Docentgeschiedenis | Een docent opent een resultaat binnen eigen docentcontext. |
| Ouder-/voogdgeschiedenis | Een ouder/voogd opent een resultaat van een actief gekoppeld kind. |
In alle gevallen geldt:
- de run moet bestaan;
- de run moet afgerond zijn;
- de run mag geen reguliere weergave van een docent-testrun zijn;
- de actor moet binnen de actuele rolcontext inzage hebben;
- de presentatie leest historische rungegevens;
- openen en sluiten wijzigen geen rungegevens.
18.9 Samenvattingsblok
Het samenvattingsblok geeft compacte herkenning van het resultaat.
Minimaal bevat het blok:
| Veld | Bron / regel |
|---|---|
| Naam gebruiker | De gebruiker of het kind/de leerling waarop de run betrekking heeft, volgens de actuele weergaveregels en privacycontext. |
| Datum | Het afrondmoment van de run is leidend. |
| Categorie | Historische categoriecontext van de run of gedeelde oefening. |
| Oefening | Historische oefeningcontext van de run of gedeelde oefening. |
| Aantal vragen | TotalQuestions of gelijkwaardige opgeslagen runwaarde. |
| Goed | CorrectCount. |
| Fout | IncorrectCount. |
| Geen idee | DunnoCount, alleen zichtbaar wanneer functioneel relevant. |
Een afzonderlijk startmoment hoeft niet als samenvattingsveld getoond te worden wanneer de totale doorlooptijd in de statistiekensectie beschikbaar is.
18.10 Vraag- en antwoordtabel
De vraag- en antwoordtabel toont de inhoud van de afgeronde run in runvolgorde.
Minimaal functioneel te ondersteunen kolommen zijn:
| Kolom | Betekenis |
|---|---|
| Nummer | Positie van de vraag binnen de run. |
| Vraag | Volledige opgave of veilige module-representatie daarvan. |
| Gegeven antwoord | Antwoord van de gebruiker, inclusief module-specifieke structuur waar relevant. |
| Juiste antwoord | Correcte uitkomst of veilige representatie. |
| Resultaat | Goed, fout of Geen idee. |
| Gemarkeerd | Markering voor Geen idee wanneer de run dit ondersteunt. |
De tabel mag inhoud niet inkorten om de weergave compacter te maken.
Voor vragen en antwoorden geldt:
- meerregelige tekst is toegestaan;
- complexe notatie wordt veilig weergegeven;
- module-specifieke structuur mag via module-exportrepresentatie worden omgezet;
- technische payloadvelden of interne identifiers worden niet aan gewone gebruikers getoond;
- onveilige HTML, scripts of actieve inhoud worden nooit gerenderd.
18.11 Resultaatstatus per vraag
Per vraag moet functioneel onderscheid zichtbaar zijn tussen:
| Status | Betekenis |
|---|---|
| Goed | Het gegeven antwoord is door de module als correct beoordeeld. |
| Fout | Het gegeven antwoord is onjuist of ontbreekt waar een antwoord vereist was. |
| Geen idee | De gebruiker heeft de vraag bewust als Geen idee gemarkeerd; dit telt functioneel als fout. |
Wanneer Geen idee is gebruikt, blijft het gegeven antwoord waar relevant bewaard, maar de vraag telt als fout volgens de runregels.
De presentatie mag status visueel compact weergeven, maar het functionele onderscheid moet toegankelijk en exporteerbaar blijven.
18.12 Statistiekensectie
De statistiekensectie toont opgeslagen of consistent uit opgeslagen rungegevens afgeleide statistieken.
Minimaal relevant zijn:
| Statistiek | Betekenis |
|---|---|
| Gemiddelde tijd per vraag | Rekenobject over vraagdoorlooptijden van de afgeronde run. |
| Mediaan | Middelste waarde van vraagdoorlooptijden volgens de vastgelegde statistiekregel. |
| Ondergrens | Ondergrens van de statistische bandbreedte. |
| Bovengrens | Bovengrens van de statistische bandbreedte. |
| Totale doorlooptijd | Totale tijd van de oefenrun zoals functioneel bepaald. |
| Uitschieters ondergrens | Aantal en overzicht van vragen onder de ondergrens. |
| Uitschieters bovengrens | Aantal en overzicht van vragen boven de bovengrens. |
| Snelste vraag | Kortste vraagdoorlooptijd waar beschikbaar. |
| Langzaamste vraag | Langste vraagdoorlooptijd waar beschikbaar. |
| Nauwkeurigheid | Afgeleide verhouding tussen correcte antwoorden en totaal, waar gebruikt in schermen. |
De exacte formule- en berekeningsdetails blijven bronhoudend in het leerlingresultaatdomein en de database-/ontwerpbronnen. FO-18 beschrijft dat resultaatpresentatie en PDF-export deze opgeslagen waarden gebruiken.
18.13 Duplicaatcontext
Een run kan onderdeel zijn van een duplicaatreeks wanneer de gebruiker een eerdere oefening opnieuw maakt met dezelfde vraaginhoud.
Voor presentatie geldt:
- de bronrun blijft ongewijzigd;
- de nieuwe run is een zelfstandige run;
- de relatie wordt administratief via duplicaatcontext vastgelegd;
- resultaatweergave mag tonen dat de run onderdeel is van een duplicaatreeks;
- het getoonde aantal of de groep wordt afgeleid uit actuele duplicaatrelaties;
- duplicaatinformatie wijzigt geen score of vraaginhoud.
Wanneer er geen duplicaatcontext is, wordt geen duplicaatmelding getoond.
18.14 Gedeelde-oefeningcontext
Een ontvangen gedeelde oefening wordt pas een eigen resultaat wanneer de ontvanger de gedeelde oefening daadwerkelijk start en afrondt.
Voor resultaatpresentatie geldt:
- het resultaat van de ontvanger is een zelfstandige
ExerciseRun; - het resultaat van de afzender wordt niet gedeeld of overschreven;
- het shared-record kan snapshotinformatie bevatten over niveau, categorie en oefening;
- geschiedenis en PDF gebruiken de relevante historische of snapshotcontext;
- verwijderen uit het ontvangen-overzicht verwijdert reeds afgeronde runs niet.
PDF-export van een afgeronde gedeelde oefening gebruikt dezelfde resultaatregels als andere afgeronde runs, aangevuld met de historische gedeelde-oefeningcontext waar relevant.
18.15 PDF-export: doel en karakter
PDF-export is een tijdelijke downloadactie.
De PDF bevat functioneel dezelfde inhoudelijke resultaatinformatie als de resultaatweergave of het resultaatdetail.
PDF-export:
- is server-side geautoriseerd;
- leest bestaande resultaatdata;
- bouwt een tijdelijk PDF-document of PDF-stream op;
- biedt dit aan als browserdownload;
- maakt geen blijvend PDF-domeinrecord;
- registreert geen functioneel domeinevent;
- wijzigt geen resultaatdata;
- verandert geen readstate of berichtenstatus.
Technische logging van fouten of monitoring is implementatieondersteunend en geen functionele resultaatbron.
18.16 Beschikbaarheid van PDF-download
De actie Download als PDF is beschikbaar wanneer:
| Voorwaarde | Regel |
|---|---|
| Run bestaat | De geselecteerde run moet bestaan. |
| Run is afgerond | Alleen afgeronde runs zijn exporteerbaar. |
| Actor heeft inzage | De gebruiker moet binnen de actuele rolcontext het resultaat mogen zien. |
| Resultaatdata is beschikbaar | Samenvatting, vraagdetails en statistieken moeten veilig opgehaald kunnen worden. |
| PDF-service is beschikbaar | De backend moet een PDF kunnen genereren of veilig kunnen falen. |
| Module-inhoud is exporteerbaar | Module-inhoud moet generiek of via modulehelper veilig kunnen worden weergegeven. |
Een zichtbare downloadknop is geen autorisatiebewijs. Het downloadverzoek voert opnieuw server-side controles uit.
Wanneer export niet toegestaan is, wordt geen gedeeltelijke PDF gegenereerd.
18.17 PDF-inhoud
De PDF bevat minimaal:
| Sectie | Inhoud |
|---|---|
| Kop / titel | Resultaattitel en context van categorie en oefening. |
| Samenvatting | Naam, afrondmoment, aantal vragen, goed, fout en eventueel Geen idee. |
| Resultatentabel | Vraag, gegeven antwoord, juiste antwoord, resultaatstatus en markering waar relevant. |
| Statistieken | Dezelfde opgeslagen statistiekwaarden als in resultaatweergave. |
| Duplicaatmelding | Alleen wanneer functioneel relevant. |
| Footer | Consistente footer met OefenHub, pagina-aanduiding en exportdatum. |
De PDF hoeft niet iedere visuele eigenschap van de browserweergave exact te kopiëren. Zij moet wel dezelfde inhoudelijke resultaatinformatie bevatten.
18.18 PDF-layout en pagina-einden
Voor PDF-layout gelden functionele regels die voorkomen dat resultaatinformatie onleesbaar wordt.
| Regel | Betekenis |
|---|---|
| Volledige opgaven | Vragen worden volledig getoond en niet inhoudelijk ingekort. |
| Meerregelige antwoorden | Gegeven en juiste antwoorden mogen over meerdere regels afbreken. |
| Herhaalde tabelheaders | De resultaattabel toont kolomheaders opnieuw op vervolgpagina’s. |
| Geen gesplitste tabelrijen | Een tabelrij wordt niet over twee pagina’s verdeeld. |
| Vervolgtekst | Vervolgpagina’s maken herkenbaar dat de resultaattabel wordt voortgezet. |
| Blokken bij elkaar houden | Volledige inhoudsblokken zoals statistieken worden waar mogelijk niet halverwege gesplitst. |
| Consistente footer | Iedere pagina gebruikt dezelfde footerstructuur. |
De technische implementatie van deze regels hoort in het technisch ontwerp, maar de functionele eis geldt in FO.
18.19 Footer in PDF
De PDF-footer is op alle pagina’s consistent opgebouwd.
Minimaal bevat de footer:
| Positie | Inhoud |
|---|---|
| Links | OefenHub. |
| Midden | Pagina X van Y. |
| Rechts | Exportdatum. |
De footer mag niet per pagina inhoudelijk wisselen.
De exportdatum is het moment waarop de PDF wordt gegenereerd of aangeboden, tenzij later een centrale exportregel anders bepaalt.
18.20 Bestandsnaam
De bestandsnaam volgt het patroon:
<yyyy_MM_dd-HH.mm>_OefenHub_Resultaat_<Naam categorie>_<Naam oefening>.pdf
Voor bestandsnamen gelden minimaal de volgende regels:
| Onderdeel | Regel |
|---|---|
| Datum/tijd | Wordt veilig en deterministisch geformatteerd. |
| Vaste tekst | OefenHub_Resultaat blijft herkenbaar aanwezig. |
| Categorie | Gebaseerd op historische categoriecontext. |
| Oefening | Gebaseerd op historische oefeningcontext. |
| Ongeldige tekens | Worden opgeschoond of verwijderd. |
| Spaties | Worden genormaliseerd en vervangen door underscores. |
| Dubbele underscores | Worden samengevoegd. |
| Lengtebegrenzing | Zichtbare naamdelen worden begrensd volgens centrale exportregel. |
Een bestandsnaam is geen autorisatiebron en wordt niet gebruikt om resultaattoegang te bepalen.
18.21 Module-specifieke exportrepresentatie
Technische modules kunnen vraag- en antwoordvormen leveren die niet met simpele tekst voldoende worden weergegeven.
Voorbeelden:
- breuken;
- machten;
- wortels;
- samengestelde numerieke velden;
- meerstapsantwoorden;
- formuleachtige notatie;
- visuele representaties.
De generieke PDF-export mag daarom een veilige module-specifieke exportrepresentatie gebruiken.
Daarbij geldt:
- de module levert geen vrije actieve inhoud;
- de representatie wordt server-side veilig verwerkt;
- de generieke export blijft eigenaar van PDF-opbouw, autorisatie en download;
- de module bepaalt geen roltoegang;
- de module wijzigt geen run of resultaatdata tijdens export;
- bij falen van module-exportrepresentatie volgt veilige fallback of veilige exportfout volgens de exportregel.
18.22 Roltoegang
PDF-export en resultaatpresentatie ondersteunen meerdere rolcontexten, maar gebruiken dezelfde historische resultaatbron.
| Rolcontext | Toegang |
|---|---|
| Leerling | Eigen afgeronde runs binnen eigen geschiedenis- of resultaatcontext. |
| Docent | Afgeronde leerlingruns binnen eigen docentcontext en niveauautorisatiegrens. |
| Ouder/voogd | Afgeronde runs van actief gekoppelde kinderen over alle niveaus zolang de relatie actief is. |
| Beheerder | Alleen waar beheeranalyse of supportcontext dit expliciet functioneel toestaat. |
Combinatierollen mengen geen resultaatrechten. Een gebruiker met docent- en ouder-/voogdrol krijgt binnen docentroute geen ouderrecht en binnen ouderroute geen docentrecht.
18.23 Leerlingcontext
Een leerling mag resultaat en PDF-export gebruiken voor eigen afgeronde runs.
Voor leerlingcontext geldt:
- de run hoort bij de ingelogde leerling;
- de run is afgerond;
- niet-afgeronde runs verschijnen niet als resultaat;
- docent-testruns zijn geen leerlingresultaat;
- geschiedenisfilters mogen de eigen dataset alleen beperken;
- directe route naar een andere run wordt server-side geblokkeerd;
- PDF-download vanuit geschiedenis gebruikt dezelfde regels als directe resultaatweergave.
Wanneer een leerling toegang tot een oefening later verliest, blijft het historische afgeronde resultaat volgens de geschiedenisregels raadpleegbaar, tenzij een expliciete privacy-, account- of beheerregel dit beperkt.
18.24 Docentcontext
Een docent mag resultaatdetails en PDF-export gebruiken voor leerlingruns die binnen de eigen docentcontext vallen.
Voor docentcontext geldt:
- er is een actieve docentrol;
- er is een geldige docent-leerlingrelatie of andere expliciete docentcontext;
- de run valt binnen het niveau of de autorisatiecontext van de docent;
- filters en routes mogen geen resultaten buiten deze context openen;
- de docent kan resultaten niet wijzigen of verwijderen;
- PDF-export volgt dezelfde autorisatiegrens als schermweergave;
- het exporteren maakt geen systeembericht, privébericht of melding aan.
Een docent ziet geen resultaten van niveaus die door een andere docent zijn geautoriseerd, tenzij een afzonderlijke geldige autorisatie- of beheercontext dit toestaat.
18.25 Ouder-/voogdcontext
Een ouder/voogd mag resultaatdetails en PDF-export gebruiken voor actief gekoppelde kinderen.
Voor ouder-/voogdcontext geldt:
- er is een actieve ouder-/voogdrol;
- er is een actieve GuardianStudent-relatie met het kind;
- de run hoort bij dat gekoppelde kind;
- de run is afgerond en geen testrun;
- resultaten over alle historische niveaus van het gekoppelde kind zijn raadpleegbaar zolang de relatie actief is;
- de ouder/voogd kan geen oefening namens het kind starten, hervatten, beantwoorden, corrigeren, opnieuw maken of delen;
- PDF-export wijzigt geen kinddata en maakt geen permanent documentrecord.
Wanneer de relatie intussen beëindigd is, worden nieuwe detail- en exportacties geblokkeerd, ook als een oude route of browsergeschiedenis nog bestaat.
18.26 Beheerdercontext
Beheerders hebben geen algemene eindgebruikersresultaatflow alleen doordat zij beheerder zijn.
Beheerderinzage in resultaatdata is alleen toegestaan wanneer een expliciete beheer-, support- of analysecontext dit functioneel toestaat.
Voor beheerdercontext geldt:
- beheerdercontext is geen vrije bypass op leerling-, docent- of ouderautorisatie;
- beheeracties rond modules, categorieën of accounts herschrijven geen resultaatdata;
- beheerder kan niet live meekijken via PDF-export;
- PDF-export voor beheeranalyse moet apart functioneel begrensd zijn wanneer deze wordt ondersteund;
- gewone leerling-, docent- en ouderexportregels blijven leidend voor hun routes.
18.27 Geen datamutaties
Resultaatpresentatie en PDF-export zijn read-only ten opzichte van resultaatdata.
Zij wijzigen niet:
| Entiteit / domein | Regel |
|---|---|
ExerciseRuns | Geen score-, status-, statistiek- of contextwijziging. |
ExerciseRunProgress | Geen vraagvoortgangswijziging. |
| Vraagpayload | Geen herschrijven of normaliseren tijdens export. |
Users | Geen profiel- of accountwijziging. |
UserSettings | Geen voorkeurwijziging. |
Exercises | Geen oefeningconfiguratiewijziging. |
ExerciseModules | Geen modulemetadatawijziging. |
| Relaties | Geen relatie-aanmaak, acceptatie of beëindiging. |
SystemMessages | Geen systeembericht door normale export. |
PrivateMessageThreads | Geen privébericht door normale export. |
Tickets | Geen melding door normale export. |
| Permanente PDF-tabel | Geen verplicht blijvend PDF-domeinrecord. |
Technische requestlogging, foutlogging of monitoring mag bestaan, maar is geen functionele resultaatmutatie.
18.28 Tellers en readmodels
Resultaatpresentatie kan samenvattingswaarden tonen die al op runniveau zijn opgeslagen of via readmodels beschikbaar zijn.
Voor tellers geldt:
| Teller | Regel |
|---|---|
| Aantal vragen | Komt uit runvelden of betrouwbare runpayloadafleiding. |
| Goed/fout | Leest opgeslagen uniforme totalen. |
| Geen idee | Leest DunnoCount en toont alleen waar relevant. |
| Duplicaten | Worden afgeleid uit duplicaatrelaties, niet uit vrije tekst. |
| Geschiedenisregels | Alleen afgeronde, toegestane runs tellen mee. |
| Ouder-/voogdresultaten | Alleen runs van actief gekoppelde kinderen tellen mee. |
| Docentresultaten | Alleen runs binnen docentcontext tellen mee. |
Readmodels mogen de presentatie versnellen, maar verruimen nooit de onderliggende autorisatie of resultaatdataset.
18.29 Autorisatie- en veiligheidsregels
Voor iedere resultaat- en exportactie gelden server-side controles.
Minimaal wordt gecontroleerd:
- actor;
- accountstatus;
- rolcontext;
- relatiecontext waar relevant;
- runbestaan;
- runafronding;
- teststatus;
- objecteigenaarschap;
- docentniveaucontext;
- ouder-/voogdrelatie;
- beheercontext waar relevant;
- exportbeschikbaarheid;
- veilige module-representatie.
Niet vertrouwd worden:
- routeparameters;
- querystrings;
- browsergeschiedenis;
- clientstate;
- zichtbare knoppen;
- eerdere filterkeuze;
- downloadbestandsnaam;
- lokale cache;
- frontpage- of geschiedenisweergave die eerder geladen was.
Bij geweigerde toegang wordt geen gedeeltelijke resultaatinhoud getoond.
18.30 Privacy en gegevensminimalisatie
Resultaatpresentatie toont alleen gegevens die voor de actuele rolcontext nodig en toegestaan zijn.
Voor privacy geldt:
- gewone gebruikers zien geen technische GUID’s als primaire herkenningswaarde;
- foutmeldingen lekken geen vraagpayload, antwoorddata of moduleconfiguratie wanneer toegang ontbreekt;
- docentweergave toont alleen resultaten binnen docentcontext;
- ouder-/voogdweergave toont alleen resultaten van actief gekoppelde kinderen;
- PDF-download mag geen extra velden bevatten die niet ook inhoudelijk toegestaan zijn in resultaatweergave;
- technische snapshots, tokens, stacktraces en interne identifiers worden nooit in PDF opgenomen.
18.31 Lege toestanden
Lege toestanden zijn normaal wanneer er geen exporteerbaar of toonbaar resultaat beschikbaar is binnen de gekozen context.
Voorbeelden:
| Lege toestand | Betekenis |
|---|---|
| Geen afgeronde runs | Er zijn geen resultaten om te tonen of te exporteren. |
| Geen resultaten binnen filter | De gekozen filterselectie levert geen afgeronde runs op. |
Geen Geen idee-waarden | De kolom of samenvattingswaarde kan ontbreken of nul tonen volgens schermregel. |
| Geen duplicaatcontext | Er wordt geen duplicaatmelding getoond. |
| Geen deelcontext | Er wordt geen gedeelde-oefeningcontext getoond. |
| Geen module-specifieke exporthelper nodig | Generieke representatie is voldoende. |
| Geen ouder-/voogdkinderen | Er is geen ouderresultaatdataset. |
| Geen docentresultaten binnen context | De docent heeft geen afgeronde resultaten binnen de geselecteerde leerling-/niveaucontext. |
Een lege toestand is geen autorisatiefout zolang de gebruiker wel toegang heeft tot de context.
18.32 Fouttoestanden
Fouttoestanden ontstaan wanneer resultaatpresentatie of PDF-export niet veilig kan worden uitgevoerd.
Voorbeelden:
| Fouttoestand | Functionele afhandeling |
|---|---|
| Run bestaat niet | Toon veilige niet-beschikbaarafhandeling. |
| Run is niet afgerond | Blokkeer resultaatdetail en PDF-export. |
| Actor heeft geen toegang | Weiger zonder resultaatdata te tonen. |
| Relatie of docentcontext vervallen | Weiger nieuwe detail- of exportactie. |
| Vraagpayload ontbreekt of is corrupt | Toon veilige fout of beperkte niet-beschikbaarafhandeling volgens technische keuze. |
| Statistieken ontbreken | Toon niet-beschikbaar of faal veilig volgens exportregel. |
| Module-exportrepresentatie faalt | Gebruik veilige fallback of faal veilig. |
| PDF-service faalt | Geen download; resultaatdata blijft ongewijzigd. |
| Bestandsnaam bevat ongeldige tekens | Schoon op volgens bestandsnaamregel. |
| Browserdownload wordt onderbroken | Domeindata blijft ongewijzigd; gebruiker kan opnieuw proberen. |
| Caching levert oude context | Server-side autorisatie en actuele brondata blijven leidend. |
Foutmeldingen aan gewone gebruikers bevatten geen stacktraces, tokens, ruwe payloads of interne identifiers.
18.33 Relatie tot actieve oefening
PDF-export hoort niet bij de actieve oefencontext.
Een leerling krijgt de PDF-downloadactie pas in resultaat- of geschiedeniscontext, niet tijdens het beantwoorden van een vraag.
Tijdens een actieve leerling-oefenrun blijven anti-afleidingsregels uit het leerlingdomein leidend. PDF-export start geen oefenrun, hervat geen oefening en veroorzaakt geen live-meekijkmutatie.
18.34 Relatie tot live meekijken
Live meekijken gebruikt actuele server-side voortgang tijdens een lopende run.
Resultaatpresentatie en PDF-export gebruiken afgeronde historische rungegevens.
Daarom geldt:
- live meekijken is geen PDF-exportbron;
- een meekijksessie genereert geen PDF;
- PDF-export start of beëindigt geen live-meekijksessie;
- live voortgang wordt pas historisch resultaat nadat de run formeel is afgerond;
- browse-modus in live meekijken wijzigt geen resultaatdata.
18.35 Relatie tot gedeelde oefeningen
Gedeelde oefeningen hebben een eigen FO-hoofdstuk.
FO-18 beschrijft alleen de resultaat- en PDF-kant:
- een afgeronde gedeelde oefening verschijnt als eigen run van de ontvanger;
- PDF-export gebruikt die eigen run;
- de oorspronkelijke bronrun van de afzender wordt niet gewijzigd;
- shared snapshots kunnen historische naamgeving ondersteunen;
- delen van een resultaat zelf is niet hetzelfde als PDF-export.
18.36 Relatie tot oefenmodules en modulepayloads
FO-22 beschrijft modulecontracten en payloadlagen.
Voor FO-18 geldt:
- de resultaatpresentatie gebruikt veilige moduleweergave;
- PDF-export mag module-exportrepresentatie vragen;
- modulecode bepaalt inhoudelijke notatie en antwoordinterpretatie binnen modulegrens;
- de generieke applicatie bepaalt autorisatie, runselectie, PDF-opbouw en download;
- modulewijzigingen herschrijven historische runs niet;
moduleKeyenschemaVersionin payload ondersteunen backwards-compatible interpretatie waar nodig.
18.37 Relatie tot beheer en support
Beheerderacties rond categorieën, modules, accounts of docentondersteuning kunnen invloed hebben op toekomstige zichtbaarheid of supportcontext, maar herschrijven bestaande resultaten niet.
Voor beheer en support geldt:
- categoriemigratie herschrijft geen oude runcontext;
- modulemigratie herschrijft geen historische runpayload;
- accountanonimisering kan presentatie van persoonsgegevens beperken volgens accountregels;
- beheerderondersteuning kan supportinzage bieden waar expliciet toegestaan;
- gewone exportregels blijven read-only.
18.38 Relatie tot andere FO-hoofdstukken
| Hoofdstuk | Relatie |
|---|---|
| Rollen, context en autorisatie | Bepaalt rolcontext, relatiecontext en server-side toegang. |
| Oefencatalogus, niveaus, categorieën en oefeningen | Levert historische niveau-, categorie-, oefening- en modulecontext. |
| Leerling: oefenen, voortgang en resultaten | Beschrijft run-lifecycle, vraagbeantwoording, afronding, resultaat en geschiedenis. |
| Gedeelde oefeningen | Beschrijft shared-records, snapshots en eigen runs van ontvangers. |
| Docentfunctionaliteit | Beschrijft docentresultaatinzage binnen eigen context. |
| Ouder-/voogdfunctionaliteit | Beschrijft ouder-/voogdresultaatinzage en read-only grenzen. |
| Live meekijken | Beschrijft live voortgang als andere context dan afgerond resultaat. |
| Oefenmodules en modulepayloads | Beschrijft modulepayload, schemaherleidbaarheid en module-exportrepresentatie. |
| Schermlaag en UX-specificaties | Beschrijft schermlaagprincipes, read-only gedrag, lege toestanden en popupkeys. |
18.39 Gerelateerde bronverwijzingen
| Bron | Link |
|---|---|
| Technisch Ontwerp — PDF-export | PDF-export met QuestPDF |
| Technisch Ontwerp — oefenruns en resultaten | Oefenruns, voortgang, resultaten, statistieken en PDF-brondata |
| Technisch Ontwerp — oefenmodulecontract | Oefenmodulecontract en dynamische module-integratie |
| Usecases — leerling resultaten en geschiedenis | Leerling — 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-003 — Resultaatdetail vanuit geschiedenis openen | Resultaatdetail vanuit geschiedenis openen |
| Usecases — docent resultaten en geschiedenis | Docent — resultaten en geschiedenis |
| UC-DOC-RES-005 — Resultaat als PDF downloaden binnen docentcontext | Resultaat als PDF downloaden binnen docentcontext |
| Usecases — ouder/voogd resultaten en geschiedenis | Ouder/voogd — resultaten en geschiedenis |
| UC-OVG-RES-006 — Resultaat als PDF downloaden binnen oudercontext | Resultaat als PDF downloaden binnen oudercontext |
| Schermdocumentatie — leerling geschiedenis details | Geschiedenis details |
| Schermdocumentatie — leerling geschiedenis alles | Geschiedenis alles |
| Schermdocumentatie — docent geschiedenis | Docent — bekijk geschiedenis |
| Database-informatie — oefenruns, delen en voortgang | Oefenruns, delen en voortgang |
| Oefenmodule — Optellen en aftrekken simpel | Optellen en aftrekken simpel |
| Ontwerpbron — business rules | Business rules |
| Ontwerpbron — autorisatiematrix | Autorisatiematrix |
| FO — leerling: oefenen, voortgang en resultaten | Leerling: oefenen, voortgang en resultaten |
| FO — gedeelde oefeningen | Gedeelde oefeningen |
| FO — oefenmodules en modulepayloads | Oefenmodules en modulepayloads |