Skip to main content

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

OnderdeelBinnen scopeBuiten scope
ResultaatpresentatieTonen 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 geschiedenisOpnieuw openen van dezelfde historische resultaatweergave voor een afgeronde run.Tonen van niet-afgeronde runs als historisch resultaat.
PDF-exportTijdelijke download van dezelfde inhoudelijke resultaatdata als resultaatweergave of resultaatdetail.Permanente opslag van PDF-bestanden, rapportages over meerdere runs, bulkexport of exportbeheer.
BestandsnaamGenereren van een veilige downloadnaam met datum, OefenHub, categorie en oefening.Vrij beheerbare bestandsnaamsjablonen door eindgebruikers of docenten.
PDF-layoutregelsFunctionele eisen aan inhoud, pagina-einden, tabelheaders, vervolgtekst en footer.Technische QuestPDF-componentstructuur, styling op codeklasse-niveau of printerdrivergedrag.
Module-specifieke notatieVeilige exportrepresentatie voor module-inhoud zoals breuken, machten of samengestelde antwoorden.Vrije HTML, scripts, client-rendering of onveilige modulemarkup in PDF-output.
RoltoegangServer-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.

BronlaagBetekenis
FOBeschrijft resultaatpresentatie en PDF-export als functioneel domeincontract.
UsecasesBeschrijven processtappen, condities, autorisatie, uitzonderingen en requirements per rol.
SchermdocumentatieBeschrijft zichtbare onderdelen, modalgedrag, tabellen, acties, lege toestanden en waardelagen.
Database-informatieBeschrijft ExerciseRuns, ExerciseRunProgress, payloadvelden, statistiekvelden en historische context.
Oefenmodule-documentatieBeschrijft module-specifieke vraagweergave, antwoordstructuur en exportrepresentatie.
OntwerpbronnenBeschrijven business rules, statusmodellen, popupkeys en algemene beveiligingsregels.
Technisch ontwerpWerkt 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:

GegevensbronGebruik
ExerciseRunsHoofdrecord met gebruiker, niveau, categorie, oefening, module, afrondmoment, totalen, statistieken en context.
ExerciseRunProgressServer-side vraagvoortgang en operationele vraagstatus waar nodig voor detailopbouw en controle.
Module-specifieke vraagpayloadVraaginhoud, antwoordstructuur, juiste antwoorden, gegeven antwoorden en modulecontext.
Uniforme runveldenTotalen, aantallen, timing, statistieken en afrondstatus.
Historische contextvelden / verwijzingenNiveau, categorie, oefening, module en eventuele gedeelde-oefening- of duplicaatcontext.
Module-exportrepresentatieVeilige 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:

OnderdeelFunctionele betekenis
TitelDuidt aan dat het om resultaat van een oefening gaat.
ContextregelHistorische categorie en oefening.
SamenvattingGebruiker, afrondmoment, aantal vragen, goed, fout en eventueel Geen idee.
VraagdetailsVolledige vraaginhoud en antwoordinformatie per vraag.
ResultaatstatusGoed, fout of Geen idee waar van toepassing.
Juiste antwoordBeschikbaar bij fout of Geen idee, en waar module dit ondersteunt.
StatistiekenOpgeslagen runstatistieken zoals gemiddelde tijd, mediaan, grenzen, uitschieters en totale doorlooptijd.
VervolgactiesSluiten, opnieuw maken, delen waar toegestaan en PDF-download.
DuplicaatinformatieAlleen 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:

IngangBetekenis
Direct na afrondingDe gebruiker bereikt resultaat vanuit de zojuist afgeronde oefenrun.
OefeninggeschiedenisDe gebruiker opent een afgeronde run binnen één oefeningcontext.
Geschiedenis allesDe gebruiker opent een afgeronde run vanuit een brede historische dataset.
DocentgeschiedenisEen docent opent een resultaat binnen eigen docentcontext.
Ouder-/voogdgeschiedenisEen 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:

VeldBron / regel
Naam gebruikerDe gebruiker of het kind/de leerling waarop de run betrekking heeft, volgens de actuele weergaveregels en privacycontext.
DatumHet afrondmoment van de run is leidend.
CategorieHistorische categoriecontext van de run of gedeelde oefening.
OefeningHistorische oefeningcontext van de run of gedeelde oefening.
Aantal vragenTotalQuestions of gelijkwaardige opgeslagen runwaarde.
GoedCorrectCount.
FoutIncorrectCount.
Geen ideeDunnoCount, 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:

KolomBetekenis
NummerPositie van de vraag binnen de run.
VraagVolledige opgave of veilige module-representatie daarvan.
Gegeven antwoordAntwoord van de gebruiker, inclusief module-specifieke structuur waar relevant.
Juiste antwoordCorrecte uitkomst of veilige representatie.
ResultaatGoed, fout of Geen idee.
GemarkeerdMarkering 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:

StatusBetekenis
GoedHet gegeven antwoord is door de module als correct beoordeeld.
FoutHet gegeven antwoord is onjuist of ontbreekt waar een antwoord vereist was.
Geen ideeDe 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:

StatistiekBetekenis
Gemiddelde tijd per vraagRekenobject over vraagdoorlooptijden van de afgeronde run.
MediaanMiddelste waarde van vraagdoorlooptijden volgens de vastgelegde statistiekregel.
OndergrensOndergrens van de statistische bandbreedte.
BovengrensBovengrens van de statistische bandbreedte.
Totale doorlooptijdTotale tijd van de oefenrun zoals functioneel bepaald.
Uitschieters ondergrensAantal en overzicht van vragen onder de ondergrens.
Uitschieters bovengrensAantal en overzicht van vragen boven de bovengrens.
Snelste vraagKortste vraagdoorlooptijd waar beschikbaar.
Langzaamste vraagLangste vraagdoorlooptijd waar beschikbaar.
NauwkeurigheidAfgeleide 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:

VoorwaardeRegel
Run bestaatDe geselecteerde run moet bestaan.
Run is afgerondAlleen afgeronde runs zijn exporteerbaar.
Actor heeft inzageDe gebruiker moet binnen de actuele rolcontext het resultaat mogen zien.
Resultaatdata is beschikbaarSamenvatting, vraagdetails en statistieken moeten veilig opgehaald kunnen worden.
PDF-service is beschikbaarDe backend moet een PDF kunnen genereren of veilig kunnen falen.
Module-inhoud is exporteerbaarModule-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:

SectieInhoud
Kop / titelResultaattitel en context van categorie en oefening.
SamenvattingNaam, afrondmoment, aantal vragen, goed, fout en eventueel Geen idee.
ResultatentabelVraag, gegeven antwoord, juiste antwoord, resultaatstatus en markering waar relevant.
StatistiekenDezelfde opgeslagen statistiekwaarden als in resultaatweergave.
DuplicaatmeldingAlleen wanneer functioneel relevant.
FooterConsistente 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.

RegelBetekenis
Volledige opgavenVragen worden volledig getoond en niet inhoudelijk ingekort.
Meerregelige antwoordenGegeven en juiste antwoorden mogen over meerdere regels afbreken.
Herhaalde tabelheadersDe resultaattabel toont kolomheaders opnieuw op vervolgpagina’s.
Geen gesplitste tabelrijenEen tabelrij wordt niet over twee pagina’s verdeeld.
VervolgtekstVervolgpagina’s maken herkenbaar dat de resultaattabel wordt voortgezet.
Blokken bij elkaar houdenVolledige inhoudsblokken zoals statistieken worden waar mogelijk niet halverwege gesplitst.
Consistente footerIedere pagina gebruikt dezelfde footerstructuur.

De technische implementatie van deze regels hoort in het technisch ontwerp, maar de functionele eis geldt in FO.

De PDF-footer is op alle pagina’s consistent opgebouwd.

Minimaal bevat de footer:

PositieInhoud
LinksOefenHub.
MiddenPagina X van Y.
RechtsExportdatum.

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:

OnderdeelRegel
Datum/tijdWordt veilig en deterministisch geformatteerd.
Vaste tekstOefenHub_Resultaat blijft herkenbaar aanwezig.
CategorieGebaseerd op historische categoriecontext.
OefeningGebaseerd op historische oefeningcontext.
Ongeldige tekensWorden opgeschoond of verwijderd.
SpatiesWorden genormaliseerd en vervangen door underscores.
Dubbele underscoresWorden samengevoegd.
LengtebegrenzingZichtbare 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.

RolcontextToegang
LeerlingEigen afgeronde runs binnen eigen geschiedenis- of resultaatcontext.
DocentAfgeronde leerlingruns binnen eigen docentcontext en niveauautorisatiegrens.
Ouder/voogdAfgeronde runs van actief gekoppelde kinderen over alle niveaus zolang de relatie actief is.
BeheerderAlleen 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 / domeinRegel
ExerciseRunsGeen score-, status-, statistiek- of contextwijziging.
ExerciseRunProgressGeen vraagvoortgangswijziging.
VraagpayloadGeen herschrijven of normaliseren tijdens export.
UsersGeen profiel- of accountwijziging.
UserSettingsGeen voorkeurwijziging.
ExercisesGeen oefeningconfiguratiewijziging.
ExerciseModulesGeen modulemetadatawijziging.
RelatiesGeen relatie-aanmaak, acceptatie of beëindiging.
SystemMessagesGeen systeembericht door normale export.
PrivateMessageThreadsGeen privébericht door normale export.
TicketsGeen melding door normale export.
Permanente PDF-tabelGeen 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:

TellerRegel
Aantal vragenKomt uit runvelden of betrouwbare runpayloadafleiding.
Goed/foutLeest opgeslagen uniforme totalen.
Geen ideeLeest DunnoCount en toont alleen waar relevant.
DuplicatenWorden afgeleid uit duplicaatrelaties, niet uit vrije tekst.
GeschiedenisregelsAlleen afgeronde, toegestane runs tellen mee.
Ouder-/voogdresultatenAlleen runs van actief gekoppelde kinderen tellen mee.
DocentresultatenAlleen 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 toestandBetekenis
Geen afgeronde runsEr zijn geen resultaten om te tonen of te exporteren.
Geen resultaten binnen filterDe gekozen filterselectie levert geen afgeronde runs op.
Geen Geen idee-waardenDe kolom of samenvattingswaarde kan ontbreken of nul tonen volgens schermregel.
Geen duplicaatcontextEr wordt geen duplicaatmelding getoond.
Geen deelcontextEr wordt geen gedeelde-oefeningcontext getoond.
Geen module-specifieke exporthelper nodigGenerieke representatie is voldoende.
Geen ouder-/voogdkinderenEr is geen ouderresultaatdataset.
Geen docentresultaten binnen contextDe 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:

FouttoestandFunctionele afhandeling
Run bestaat nietToon veilige niet-beschikbaarafhandeling.
Run is niet afgerondBlokkeer resultaatdetail en PDF-export.
Actor heeft geen toegangWeiger zonder resultaatdata te tonen.
Relatie of docentcontext vervallenWeiger nieuwe detail- of exportactie.
Vraagpayload ontbreekt of is corruptToon veilige fout of beperkte niet-beschikbaarafhandeling volgens technische keuze.
Statistieken ontbrekenToon niet-beschikbaar of faal veilig volgens exportregel.
Module-exportrepresentatie faaltGebruik veilige fallback of faal veilig.
PDF-service faaltGeen download; resultaatdata blijft ongewijzigd.
Bestandsnaam bevat ongeldige tekensSchoon op volgens bestandsnaamregel.
Browserdownload wordt onderbrokenDomeindata blijft ongewijzigd; gebruiker kan opnieuw proberen.
Caching levert oude contextServer-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;
  • moduleKey en schemaVersion in 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

HoofdstukRelatie
Rollen, context en autorisatieBepaalt rolcontext, relatiecontext en server-side toegang.
Oefencatalogus, niveaus, categorieën en oefeningenLevert historische niveau-, categorie-, oefening- en modulecontext.
Leerling: oefenen, voortgang en resultatenBeschrijft run-lifecycle, vraagbeantwoording, afronding, resultaat en geschiedenis.
Gedeelde oefeningenBeschrijft shared-records, snapshots en eigen runs van ontvangers.
DocentfunctionaliteitBeschrijft docentresultaatinzage binnen eigen context.
Ouder-/voogdfunctionaliteitBeschrijft ouder-/voogdresultaatinzage en read-only grenzen.
Live meekijkenBeschrijft live voortgang als andere context dan afgerond resultaat.
Oefenmodules en modulepayloadsBeschrijft modulepayload, schemaherleidbaarheid en module-exportrepresentatie.
Schermlaag en UX-specificatiesBeschrijft schermlaagprincipes, read-only gedrag, lege toestanden en popupkeys.

18.39 Gerelateerde bronverwijzingen

BronLink
Technisch Ontwerp — PDF-exportPDF-export met QuestPDF
Technisch Ontwerp — oefenruns en resultatenOefenruns, voortgang, resultaten, statistieken en PDF-brondata
Technisch Ontwerp — oefenmodulecontractOefenmodulecontract en dynamische module-integratie
Usecases — leerling resultaten en geschiedenisLeerling — resultaten 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-003 — Resultaatdetail vanuit geschiedenis openenResultaatdetail vanuit geschiedenis openen
Usecases — docent resultaten en geschiedenisDocent — resultaten en geschiedenis
UC-DOC-RES-005 — Resultaat als PDF downloaden binnen docentcontextResultaat als PDF downloaden binnen docentcontext
Usecases — ouder/voogd resultaten en geschiedenisOuder/voogd — resultaten en geschiedenis
UC-OVG-RES-006 — Resultaat als PDF downloaden binnen oudercontextResultaat als PDF downloaden binnen oudercontext
Schermdocumentatie — leerling geschiedenis detailsGeschiedenis details
Schermdocumentatie — leerling geschiedenis allesGeschiedenis alles
Schermdocumentatie — docent geschiedenisDocent — bekijk geschiedenis
Database-informatie — oefenruns, delen en voortgangOefenruns, delen en voortgang
Oefenmodule — Optellen en aftrekken simpelOptellen en aftrekken simpel
Ontwerpbron — business rulesBusiness rules
Ontwerpbron — autorisatiematrixAutorisatiematrix
FO — leerling: oefenen, voortgang en resultatenLeerling: oefenen, voortgang en resultaten
FO — gedeelde oefeningenGedeelde oefeningen
FO — oefenmodules en modulepayloadsOefenmodules en modulepayloads