UC-LLN-RES-004 — Resultaat als PDF downloaden
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-RES-004 |
| Naam | Resultaat als PDF downloaden |
| Domein | Leerling / Resultaten, statistieken, geschiedenis en PDF-export |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, PDF-service, QuestPDF, database, technische oefenmodule |
| Rolcontext | Ingelogde leerling die een afgerond resultaat bekijkt of een afgeronde run vanuit geschiedenis opent. |
| Betrokken schermen | Resultaatpopup, resultaatdetail vanuit geschiedenis, downloadactie. |
| Gerelateerde usecases | UC-LLN-RES-001 — Resultaat na afronding bekijken; UC-LLN-RES-002 — Resultaatstatistieken bekijken; UC-LLN-HIS-003 — Resultaatdetail vanuit geschiedenis openen |
| Primaire entiteiten | ExerciseRuns, vraag- en antwoordpayload, opgeslagen statistiekvelden |
| Secundaire entiteiten / events | Historische runcontext, PDF-service, module-exportrepresentatie |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Should |
2. Omschrijving
Deze usecase beschrijft hoe een leerling het resultaat van een afgeronde oefening als PDF downloadt. De PDF bevat functioneel dezelfde inhoud als de resultaatweergave: samenvatting, vraag- en antwoordtabel, juiste antwoorden, resultaat per vraag, eventuele Geen idee-markeringen, duplicaatmelding wanneer relevant en statistieken.
De PDF-export gebruikt de historisch opgeslagen runcontext en vraag-/antwoorddata zoals die golden ten tijde van genereren, afronden of delen. Latere wijzigingen in naamgeving, configuratie of module-instellingen mogen de historische PDF-inhoud niet stilzwijgend herschrijven. De export gebruikt de opgeslagen resultaatbron, niet actuele live configuratie.
Voor PDF-generatie wordt QuestPDF als beoogde techniek gebruikt. De PDF moet correct omgaan met tabellen, pagina-einden, herhaalde headers, vervolgtekst en footer/paginanummering. De bestandsnaam wordt opgebouwd uit datum/tijd, OefenHub, resultaat, categorie en oefening, waarbij ongeldige tekens worden opgeschoond.
DRY-afbakening: de resultaatinhoud zelf is bronhoudend beschreven in UC-LLN-RES-001 en UC-LLN-RES-002. Deze usecase beschrijft de exportactie, technische PDF-samenstelling, bestandsnaam en downloadafhandeling.
3. Scope
Deze usecase omvat wel:
- tonen of beschikbaar maken van de actie
Download als PDF - autoriseren van PDF-export voor de afgeronde run
- ophalen van dezelfde resultaatbron als de resultaatweergave
- samenstellen van PDF-inhoud met samenvatting, resultatentabel en statistieken
- omgaan met meerregelige vragen en antwoorden
- herhalen van tabelheaders op vervolgpagina's
- voorkomen dat tabelrijen over pagina's worden gesplitst
- toevoegen van expliciete vervolgtekst bij voortgezette tabellen
- toevoegen van consistente footer met paginanummering en exportdatum
- opschonen van bestandsnaam
- starten van bestandsdownload
- veilige foutafhandeling bij exportproblemen
Deze usecase omvat niet:
- afronden van de oefening
- wijzigen van resultaatdata
- opnieuw maken van de oefening
- delen met vrienden
- opslaan van PDF-bestanden als blijvend domeinrecord
- genereren van rapportages over meerdere runs
- beheerexports of bulkexports
- herstel van beschadigde runpayload
- technische implementatie van QuestPDF-componenten op codeklasse-niveau
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De leerling is ingelogd of heeft een geldige downloadcontext. |
| PRE-002 | De exercise run bestaat. |
| PRE-003 | De exercise run is afgerond. |
| PRE-004 | De leerling mag het resultaat bekijken en exporteren. |
| PRE-005 | De resultaatbron bevat samenvatting, vraagdetails en statistieken. |
| PRE-006 | De PDF-service is beschikbaar. |
| PRE-007 | De technische module kan waar nodig een veilige exportrepresentatie leveren voor modulespecifieke inhoud. |
| PRE-008 | De backend kan een bestandsresponse teruggeven aan de browser. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De leerling ontvangt een PDF-download van het resultaat. |
| POST-002 | De PDF is opgebouwd uit historisch opgeslagen runcontext. |
| POST-003 | De PDF bevat dezelfde inhoudelijke resultaatgegevens als de resultaatweergave. |
| POST-004 | De PDF heeft een opgeschoonde bestandsnaam. |
| POST-005 | Er is geen resultaatdata gewijzigd. |
| POST-006 | Bij mislukte export ontstaat geen gedeeltelijke domeinmutatie. |
| POST-007 | Er is geen blijvend PDF-domeinrecord aangemaakt. |
6. Trigger
De usecase start wanneer de leerling in de resultaatweergave of in een resultaatdetail vanuit geschiedenis kiest voor Download als PDF.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Resultaatpopup of resultaatdetail | Bekijkt een afgerond resultaat. | PDF-actie wordt bepaald. | UC-LLN-RES-001. |
| 2 | OefenHub backend | Resultaatservice | Controleert of PDF-export beschikbaar is. | Actie wordt getoond wanneer toegestaan. | Afgeronde run. |
| 3 | OefenHub frontend | Resultaatacties | Toont Download als PDF. | Leerling kan export starten. | Alleen bij afgeronde run. |
| 4 | Leerling | Resultaatacties | Kiest Download als PDF. | Frontend vraagt PDF aan. | Runcontext. |
| 5 | OefenHub backend | Routeguard | Controleert sessie en autorisatie. | Alleen toegestane leerling gaat door. | Eigen resultaat of geldige context. |
| 6 | OefenHub backend | Resultaatservice | Controleert dat de run bestaat en afgerond is. | Niet-resultaatwaardige runs worden geblokkeerd. | CompletedAtUtc. |
| 7 | OefenHub backend | Resultaatservice | Laadt samenvattingsgegevens. | PDF-samenvatting kan worden opgebouwd. | Naam, datum, totalen. |
| 8 | OefenHub backend | Resultaatservice | Laadt vraag- en antwoorddetails. | Resultatentabel kan worden opgebouwd. | Historische vraagdata. |
| 9 | OefenHub backend | Resultaatservice | Laadt statistiekgegevens. | Statistiekensectie kan worden opgebouwd. | UC-LLN-RES-002. |
| 10 | OefenHub backend | Resultaatservice | Laadt context voor categorie, oefening en duplicaatmelding. | PDF kan subtitel en duplicaatcontext tonen. | Historische context. |
| 11 | OefenHub backend | Module/exporthelper | Vraagt module-specifieke exportrepresentatie waar nodig. | Complexe notatie kan veilig worden weergegeven. | Bijvoorbeeld breuken of machten. |
| 12 | OefenHub backend | PDF-service | Bouwt PDF-document op. | Samenvatting, tabel en statistieken worden geplaatst. | QuestPDF. |
| 13 | OefenHub backend | PDF-service | Past pagina-einden, herhaalde headers en vervolgtekst toe. | Lange tabellen blijven leesbaar. | Tabelregels niet splitsen. |
| 14 | OefenHub backend | PDF-service | Voegt footer toe. | Elke pagina heeft consistente footer. | OefenHub, pagina X van Y, exportdatum. |
| 15 | OefenHub backend | Bestandsnaamservice | Genereert en schoont bestandsnaam op. | Bestandsnaam is veilig voor download. | Datum + categorie + oefening. |
| 16 | OefenHub backend | Downloadresponse | Retourneert PDF-bestand. | Browser start download. | application/pdf. |
| 17 | OefenHub frontend | Browser | Ontvangt download. | Leerling kan PDF openen of bewaren. | Browsergedrag. |
| 18 | OefenHub backend | Downloadafhandeling | Sluit de request af na het aanbieden van de download. | Geen domeinmutatie. | Geen PDF-domeinrecord. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Run is niet afgerond | PDF-actie wordt niet getoond. | Niet van toepassing | Geen |
| ALT-002 | 5 | Sessie is verlopen | Routeguard verwijst naar login. | Routeguardafhandeling | Geen |
| ALT-003 | 5 | Leerling mag resultaat niet zien | Export wordt geweigerd. | Toegang geweigerd | Geen |
| ALT-004 | 6 | Run bestaat niet | Export wordt geblokkeerd. | Niet-beschikbaarmelding | Geen |
| ALT-005 | 7 | Samenvattingsdata ontbreekt | Export faalt veilig. | Componentmelding | Geen |
| ALT-006 | 8 | Vraagdetails ontbreken of zijn corrupt | Export faalt veilig of toont alleen verantwoord beschikbare inhoud volgens technische keuze. | Componentmelding | Geen |
| ALT-007 | 9 | Statistieken ontbreken | Export toont veilige niet-beschikbaarafhandeling of faalt volgens exportregel. | Componentmelding | Geen |
| ALT-008 | 11 | Module-exportrepresentatie faalt | Systeem gebruikt veilige generieke representatie waar mogelijk of faalt veilig. | Componentmelding | Geen |
| ALT-009 | 12 | PDF-service faalt | Geen download; fout wordt veilig teruggekoppeld. | Componentmelding | Geen |
| ALT-010 | 13 | Tabel past niet op één pagina | PDF-service gebruikt pagina-einden en herhaalde headers. | Niet van toepassing | Geen |
| ALT-011 | 15 | Bestandsnaam bevat ongeldige tekens | Ongeldige tekens worden opgeschoond. | Niet van toepassing | Geen |
| ALT-012 | 16 | Browserdownload wordt onderbroken | Domeindata blijft ongewijzigd; gebruiker kan opnieuw proberen. | Browserafhandeling | Geen |
| ALT-013 | 18 | Logging faalt | Export blijft functioneel als PDF succesvol is gegenereerd. | Niet van toepassing | Geen domeinmutatie |
| ALT-014 | 4 | Leerling vraagt PDF vanuit geschiedenis | Dezelfde exportregels gelden op basis van historische runcontext. | Niet van toepassing | Geen |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | PDF-export is alleen beschikbaar voor afgeronde exercise runs. |
| BR-002 | PDF-export gebruikt dezelfde inhoudelijke resultaatbron als de resultaatweergave. |
| BR-003 | De PDF gebruikt het afrondmoment als leidende datum in de samenvatting. |
| BR-004 | Een afzonderlijk startmoment hoeft niet in de samenvatting getoond te worden wanneer totale doorlooptijd zichtbaar is. |
| BR-005 | De PDF bevat de volledige opgave, ook wanneer tekst moet afbreken. |
| BR-006 | Gegeven antwoorden en juiste antwoorden mogen over meerdere regels afbreken. |
| BR-007 | De PDF mag tekst niet inkorten om tabellen compacter te maken. |
| BR-008 | Een tabelrij mag niet over twee pagina's worden gesplitst. |
| BR-009 | De resultaattabel moet op vervolgpagina's opnieuw kolomheaders tonen. |
| BR-010 | Vervolgpagina's moeten expliciet herkenbaar maken dat de tabel wordt voortgezet. |
| BR-011 | Volledige inhoudsblokken worden waar mogelijk als geheel doorgeschoven wanneer splitsen onwenselijk is. |
| BR-012 | De footer is op alle pagina's identiek opgebouwd. |
| BR-013 | De footer bevat minimaal OefenHub, pagina-aanduiding en exportdatum. |
| BR-014 | De bestandsnaam wordt opgeschoond voor ongeldige tekens en genormaliseerde spaties. |
| BR-015 | Categorie- en oefeningnaamdelen in de bestandsnaam worden begrensd volgens centrale exportregel. |
| BR-016 | Modulespecifieke notatie mag via een module-exporthelper veilig worden weergegeven. |
| BR-017 | PDF-export wijzigt geen resultaatdata. |
| BR-018 | PDF-export maakt geen nieuwe exercise run aan. |
| BR-019 | PDF-export moet ook vanuit geschiedenis beschikbaar zijn. |
| BR-020 | De export gebruikt historische runcontext en niet actuele live configuratie. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
ExerciseRunId | Moet bestaan en afgerond zijn. |
| Inzagecontext | Moet PDF-export toestaan. |
| Samenvattingsvelden | Moeten beschikbaar en consistent zijn. |
| Vraagdetails | Moeten veilig renderbaar zijn. |
| Juiste antwoorden | Moeten beschikbaar zijn uit historische runcontext. |
| Statistiekvelden | Moeten beschikbaar zijn of veilig als niet-beschikbaar worden behandeld. |
| Exportrepresentatie | Mag geen actieve of onveilige inhoud bevatten. |
| Bestandsnaamdatum | Gebaseerd op exportmoment of voorgeschreven datumcomponent. |
| Categorienaamdeel | Ongeldige tekens verwijderen en lengte begrenzen. |
| Oefeningnaamdeel | Ongeldige tekens verwijderen en lengte begrenzen. |
| PDF-response | Moet als PDF-bestand worden teruggegeven. |
| Pagina-indeling | Mag tabelrijen niet inhoudelijk splitsen. |
11. Datamutaties en events
| Stap | Type | Entiteit / gegevensbron | Mutatie |
|---|---|---|---|
| 7 | Read | ExerciseRuns | Samenvatting wordt gelezen. |
| 8 | Read | Vraag- en antwoordpayload | Resultatentabeldata wordt gelezen. |
| 9 | Read | Statistiekvelden | Statistieken worden gelezen. |
| 10 | Read | Historische context | Categorie-, oefening- en duplicaatcontext wordt gelezen. |
| 12 | Generate | PDF-document | Tijdelijke PDF-stream wordt opgebouwd. |
| 15 | Generate | Bestandsnaam | Veilige downloadnaam wordt opgebouwd. |
| 16 | Response | PDF-download | PDF wordt aan browser aangeboden. |
PDF-export maakt geen blijvend PDF-domeinrecord aan en registreert geen functioneel domeinevent. Technische foutlogging is implementatieondersteunend en geen brongegeven van deze usecase.
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
ExerciseRuns | PDF-export leest resultaatdata en wijzigt de run niet. |
ExerciseRunProgress | Vraagvoortgang blijft ongewijzigd. |
| Vraagpayload | Payload wordt niet herschreven voor PDF. |
Users | Accountgegevens blijven ongewijzigd. |
UserSettings | Voorkeuren blijven ongewijzigd. |
Exercises | Oefeningconfiguratie wordt niet gewijzigd. |
ExerciseModules | Modulemetadata wordt niet gewijzigd. |
SystemMessages | Er wordt geen systeembericht aangemaakt. |
PrivateMessageThreads | Er wordt geen privébericht aangemaakt. |
Tickets | Er wordt geen melding aangemaakt. |
| Permanente PDF-tabel | Er wordt geen blijvend PDF-domeinrecord aangemaakt. |
| Nieuwe run | Opnieuw maken gebeurt in UC-LLN-RES-003. |
13. State diagram
Niet van toepassing als persistent statusobject. PDF-export is een tijdelijke exportactie die geen runstatus, resultaatstatus of blijvend PDF-domeinrecord wijzigt.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 PDF downloaden
16.2 PDF-export faalt veilig
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | PDF-download | Export gebruikt geen domeinspecifieke popupregister-popup. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Functioneel Ontwerp beschrijft geschiedenis, filters, resultaatdetail, statistieken, opnieuw maken en PDF-download vanuit leerlingcontext. |
| Technisch Ontwerp | Technisch Ontwerp: oefenruns en resultaten, PDF-export, readmodels en tellers, frontend-resultaatweergave en privacy/retentie beschrijft de technische afbakening, server-side brondata, autorisatie en UI-compositie voor deze usecase. PDF-export beschrijft QuestPDF, bestandsnaamopbouw, paginering en tijdelijke exportbestanden. |
| Software Requirements Specification | Software Requirements Specification bevat centrale eisen en acceptatiecriteria voor resultaten, geschiedenis, statistieken, PDF-export en autorisatie op historische data. |
| Database-informatie | Database-informatie blijft bron voor runresultaten, voortgangsrecords, snapshots en exportbrondata; normale PDF-downloads introduceren geen permanente PDF-tabel. |
| Ontwerpbronnen | Ontwerpbronnen bevatten aanvullende businessregels voor resultaatweergave, geschiedenis, statistieken en exportrepresentatie. |
19. SRS-trace
Deze usecase bevat geen normatieve requirementtekst. De centrale eis en acceptatiecriteria staan in de SRS; onderstaande tabel koppelt de usecase-afleiding alleen aan centrale SRS-*- en AC-*-items.
| Usecase-afleiding | Dekt | Usecasecontext |
|---|---|---|
REQ-UC-LLN-RES-004-001 | SRS-LRN-006 SRS-PDF-001 AC-LRN-006 AC-PDF-001 | Een afgerond resultaat als PDF kunnen downloaden |
REQ-UC-LLN-RES-004-002 | SRS-AUTH-001 SRS-LRN-009 SRS-PDF-003 AC-AUTH-001 AC-LRN-009 AC-PDF-003 | PDF-export server-side autoriseren |
REQ-UC-LLN-RES-004-003 | SRS-LRN-006 SRS-PDF-001 AC-LRN-006 AC-PDF-001 | De PDF baseren op dezelfde resultaatbron als de resultaatweergave |
REQ-UC-LLN-RES-004-004 | SRS-RDM-001 SRS-RDM-002 SRS-RDM-006 SRS-LRN-009 SRS-PDF-001 AC-RDM-001 AC-RDM-002 AC-RDM-006 AC-LRN-009 AC-PDF-001 | De PDF kunnen genereren met samenvatting, resultatentabel en statistieken |
REQ-UC-LLN-RES-004-005 | SRS-LRN-003 SRS-PDF-001 AC-LRN-003 AC-PDF-001 | Volledige vragen en antwoorden in de PDF tonen zonder inhoudelijke inkorting |
REQ-UC-LLN-RES-004-006 | SRS-RDM-001 SRS-LRN-009 AC-RDM-001 AC-LRN-009 | Tabelheaders herhalen op vervolgpagina's |
REQ-UC-LLN-RES-004-007 | SRS-RDM-001 SRS-LRN-009 AC-RDM-001 AC-LRN-009 | Tabelrijen niet over twee pagina's splitsen |
REQ-UC-LLN-RES-004-008 | SRS-RDM-001 SRS-RDM-006 SRS-LRN-006 AC-RDM-001 AC-RDM-006 AC-LRN-006 | Vervolgpagina's van de resultaattabel herkenbaar maken |
REQ-UC-LLN-RES-004-009 | SRS-RDM-001 SRS-LRN-009 SRS-CNT-002 AC-RDM-001 AC-LRN-009 AC-CNT-002 | Een consistente footer tonen met OefenHub, paginanummering en exportdatum |
REQ-UC-LLN-RES-004-010 | SRS-LRN-009 SRS-PDF-001 AC-LRN-009 AC-PDF-001 | De PDF-bestandsnaam opschonen en normaliseren |
REQ-UC-LLN-RES-004-011 | SRS-LRN-009 SRS-MOD-003 SRS-NFR-SEC-001 AC-LRN-009 AC-MOD-003 AC-NFR-SEC-001 | Modulespecifieke notatie veilig kunnen exporteren via generieke of moduleondersteunde representatie |
REQ-UC-LLN-RES-004-012 | SRS-LRN-010 SRS-PDF-001 SRS-NFR-AUD-001 AC-LRN-010 AC-PDF-001 AC-NFR-AUD-001 | PDF-download ook vanuit geschiedenis kunnen aanbieden |
REQ-UC-LLN-RES-004-013 | SRS-LRN-006 SRS-PDF-001 AC-LRN-006 AC-PDF-001 | Bij PDF-export geen resultaatdata wijzigen |
REQ-UC-LLN-RES-004-014 | SRS-LRN-009 SRS-SHR-001 SRS-NFR-SEC-001 AC-LRN-009 AC-SHR-001 AC-NFR-SEC-001 | Exportfouten veilig terugkoppelen zonder gedeeltelijke domeinmutatie |