UC-LLN-OEF-008 — Oefening afronden
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-OEF-008 |
| Naam | Oefening afronden |
| Domein | Leerling / Oefenen en voortgang |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, technische oefenmodule, database, statistiekservice, SignalR-hub |
| Rolcontext | Ingelogde gebruiker met actieve leerlingrol en een lopende exercise run waarvan de laatste vraag succesvol is verwerkt. |
| Betrokken schermen | Oefenscherm, laatste vraag, voortgangsindicator, resultaatroute/resultaatpopup, live-meekijkupdates. |
| Gerelateerde usecases | UC-LLN-OEF-004 — Vraag beantwoorden; UC-LLN-OEF-005 — Antwoord tonen na bevestiging; UC-LLN-OEF-006 — Geen idee gebruiken; UC-LLN-RES-001 — Resultaat na afronding bekijken; UC-LLN-RES-002 — Resultaatstatistieken bekijken; UC-LLN-HIS-001 — Oefeninggeschiedenis bekijken |
| Primaire entiteiten | ExerciseRuns, ExerciseRunProgress |
| Secundaire entiteiten / events | ExerciseRunCompleted, ExerciseRunStatisticsCalculated, ExerciseResultAvailable, LiveViewProgressUpdated, ExerciseCompletionRejected |
| Gerelateerde popups | Resultaatpopup wordt door resultaatusecases uitgewerkt |
| Popupregister | Niet van toepassing voor afronding zelf |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een leerling een lopende oefening formeel afrondt nadat de laatste vraag van de exercise run is verwerkt. De leerling komt bij de afrondactie doordat de laatste vraag is beantwoord, of doordat na het tonen van antwoordfeedback de vervolgknop functioneel verandert naar Bekijk resultaat.
Afronden betekent dat de exercise run administratief wordt voltooid. Het systeem vult het afrondmoment, zet de run op afgerond, berekent of consolideert de uniforme totalen en berekent de eindstatistieken die later nodig zijn voor resultaatweergave, geschiedenis en PDF-export. De modulespecifieke vraag- en antwoorddetails blijven beschikbaar in de opgeslagen payload of voortgangsstructuur, maar de uniforme runvelden worden na afronding leidend voor normale uitleesscenario's.
Deze usecase gaat over de overgang van een lopende run naar een afgeronde run. Het gedetailleerd tonen van het resultaat, de volledige resultatentabel, statistiekensectie en PDF-export vallen onder de resultaat- en geschiedenisusecases. Deze usecase mag de resultaatweergave openen, maar wordt niet de bron voor alle presentatie- en PDF-regels.
DRY-afbakening: vraagverwerking blijft onderdeel van UC-LLN-OEF-004, antwoordfeedback van UC-LLN-OEF-005 en Geen idee van UC-LLN-OEF-006. Resultaatweergave, opnieuw maken en PDF-export blijven onderdeel van het subdomein Resultaten, statistieken, geschiedenis en PDF-export.
3. Scope
Deze usecase omvat wel:
- vaststellen dat de laatste vraag is verwerkt
- tonen of beschikbaar maken van de afrondactie
- server-side controle dat de run afgerond mag worden
- vullen van afrondmoment en afgeronde status
- consolideren van uniforme totalen op runniveau
- berekenen en opslaan van eindstatistieken
- beschikbaar maken van het resultaat voor resultaatweergave
- opnemen van de run in afgeronde geschiedenis
- beëindigen of actualiseren van live-meekijkcontexten
- blokkeren van dubbele afronding
- veilige foutafhandeling wanneer niet alle vragen definitief verwerkt zijn
Deze usecase omvat niet:
- genereren van een nieuwe run
- beantwoorden van individuele vragen
- inhoudelijke modulespecifieke antwoordcontrole
- tonen van volledige resultaatpopupdetails
- PDF-export
- opnieuw maken van dezelfde oefening
- delen van een afgeronde oefening
- verwijderen of aanpassen van geschiedenis
- docent-testmodus als afzonderlijk proces
- beheren van oefeningconfiguratie
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker is succesvol ingelogd of de afrondrequest bevat nog een geldige applicatiecontext. |
| PRE-002 | De gebruiker heeft een actieve leerlingrol. |
| PRE-003 | Er bestaat een lopende ExerciseRuns-record voor deze leerling. |
| PRE-004 | De run is nog niet eerder afgerond. |
| PRE-005 | De laatste vraag van de run is succesvol verwerkt. |
| PRE-006 | Alle verplichte vraagvoortgang die nodig is voor afronding is server-side beschikbaar. |
| PRE-007 | De gekoppelde oefening- en modulecontext is voldoende herleidbaar voor resultaatreconstructie. |
| PRE-008 | De statistiekservice kan de uniforme eindwaarden berekenen of veilig falen zonder gedeeltelijke afronding. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De exercise run is formeel afgerond. |
| POST-002 | ExerciseRuns.IsCompleted of equivalente afrondvlag is gezet. |
| POST-003 | ExerciseRuns.CompletedAtUtc is gevuld met het server-side afrondmoment. |
| POST-004 | Uniforme totalen voor aantal vragen, goed, fout en Geen idee zijn consistent opgeslagen. |
| POST-005 | Eindstatistieken zijn berekend en opgeslagen op runniveau waar het datamodel deze velden ondersteunt. |
| POST-006 | De run is beschikbaar voor resultaatweergave en geschiedenis. |
| POST-007 | Niet-afgeronde-hervatlogica ziet deze run niet meer als hervatbare run. |
| POST-008 | Eventuele live-meekijkers ontvangen een laatste update of beëindigingssignaal. |
| POST-009 | Dubbele afronding veroorzaakt geen tweede berekening met afwijkende uitkomst. |
| POST-010 | Er zijn geen relaties, autorisaties, profielinstellingen, berichten of meldingen gewijzigd. |
6. Trigger
De usecase start wanneer de leerling na het verwerken van de laatste vraag de afrondactie gebruikt, bijvoorbeeld via de knop Bekijk resultaat, of wanneer de backend na het laatste bevestigde antwoord bepaalt dat de run formeel afgerond moet worden.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Oefenscherm | Beantwoordt of bevestigt de laatste vraag. | Vraagverwerking is succesvol afgerond. | UC-LLN-OEF-004 of UC-LLN-OEF-006. |
| 2 | OefenHub backend | Voortgangsservice | Bepaalt dat alle vragen definitief verwerkt zijn. | Run komt in aanmerking voor afronding. | Alle verplichte vraagstatussen voltooid. |
| 3 | OefenHub frontend | Oefenscherm | Toont de afrondactie. | Leerling kan resultaat bekijken. | Knoptekst volgt configuratie en vraagpositie. |
| 4 | Leerling | Oefenscherm | Kiest Bekijk resultaat of afrondactie. | Frontend vraagt afronding/resultaatcontext op. | Request bevat runcontext. |
| 5 | OefenHub backend | Routeguard | Controleert sessie, leerlingrol en run-eigenaar. | Alleen de eigenaar mag de run afronden. | ExerciseRuns.UserId. |
| 6 | OefenHub backend | Runservice | Controleert dat de run nog niet afgerond is. | Dubbele afronding wordt voorkomen. | Idempotente afronding. |
| 7 | OefenHub backend | Runservice | Controleert dat alle vragen definitief verwerkt zijn. | Onvolledige run wordt niet afgerond. | Vraagstatussen zijn leidend. |
| 8 | OefenHub backend | Statistiekservice | Leest vraaggebonden timing- en resultaatdata. | Berekening van eindstatistieken kan starten. | Payload / voortgangsrecords. |
| 9 | OefenHub backend | Statistiekservice | Berekent uniforme eindstatistieken. | Gemiddelde, mediaan, grenzen, uitschieters en totalen worden bepaald. | Definities uit centrale resultaatregels. |
| 10 | OefenHub backend | Runservice | Vult afrondmoment en afgeronde status. | Run is formeel voltooid. | Server-side tijd. |
| 11 | OefenHub backend | Runservice | Slaat eindtotalen en statistiekvelden op. | Run is geschikt voor geschiedenis en resultaatweergave. | Uniforme runvelden zijn leidend. |
| 12 | OefenHub backend | Database | Commit de afronding transactioneel. | Geen gedeeltelijke afronding. | Afronding en statistieken samen consistent. |
| 13 | OefenHub backend | SignalR-hub | Publiceert laatste voortgangs-/afrondupdate. | Live-meekijkers zien dat de run is afgerond of niet langer live is. | Alleen geautoriseerde meekijkers. |
| 14 | OefenHub backend | Resultaatroutering | Maakt resultaatcontext beschikbaar. | Frontend kan resultaatweergave openen. | UC-LLN-RES-001. |
| 15 | OefenHub frontend | Resultaatweergave | Opent resultaatweergave of resultaatpopup. | Leerling ziet vervolgweergave vanuit resultaatusecase. | Presentatie valt buiten deze usecase. |
| 16 | OefenHub backend | Geschiedenis-readmodel | Run is nu opneembaar in afgeronde geschiedenis. | Geschiedenis kan de run tonen. | CompletedAtUtc aanwezig. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 4 | Leerling verlaat scherm vóór afrondactie | Run blijft niet-afgerond volgens UC-LLN-OEF-007. | Niet van toepassing | Geen afronding |
| ALT-002 | 5 | Sessie is verlopen | Routeguard handelt sessie af; run wordt niet afgerond tenzij afrondrequest geldig verwerkt kan worden. | Niet van toepassing | Geen of reeds geldige vraagmutatie |
| ALT-003 | 5 | Run hoort niet bij deze leerling | Backend weigert afronding. | Toegangafhandeling | Geen |
| ALT-004 | 6 | Run is al afgerond | Backend geeft bestaande afgeronde toestand terug zonder tweede mutatie. | Niet van toepassing | Geen nieuwe mutatie |
| ALT-005 | 7 | Niet alle vragen zijn definitief verwerkt | Backend weigert afronding en houdt run lopend. | Componentmelding | Geen afronding |
| ALT-006 | 8 | Timingdata ontbreekt voor één of meer vragen | Systeem berekent alleen toegestane velden of weigert afronding volgens technische regel. | Componentmelding bij weigering | Geen gedeeltelijke afronding |
| ALT-007 | 9 | Statistiekberekening faalt | Transactie wordt niet gecommit of afronding wordt veilig geblokkeerd. | Componentmelding | Geen gedeeltelijke afronding |
| ALT-008 | 12 | Databasecommit faalt | Afronding wordt teruggedraaid. | Componentmelding | Geen blijvende mutatie |
| ALT-009 | 13 | SignalR-update faalt | Afronding blijft geldig; live-update is secundair. | Niet van toepassing | Afronding blijft geldig |
| ALT-010 | 14 | Resultaatweergave kan niet direct openen | Run blijft afgerond; resultaat is later via geschiedenis beschikbaar. | Componentmelding | Afronding blijft geldig |
| ALT-011 | 7 | Run is administratief niet meer hervatbaar door account- of toegangsblokkade | Afronding wordt alleen toegestaan wanneer de laatste geldige verwerking al binnen dezelfde context is geaccepteerd; anders wordt geblokkeerd. | Componentmelding | Geen onveilige afronding |
| ALT-012 | 6 | Dubbele klik op Bekijk resultaat | Eerste geldige afronding wint; tweede request krijgt bestaande resultaatcontext. | Niet van toepassing | Geen dubbele mutatie |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Een exercise run mag pas worden afgerond wanneer alle verplichte vragen definitief verwerkt zijn. |
| BR-002 | Afronding wordt server-side bepaald en mag niet uitsluitend op clientstate vertrouwen. |
| BR-003 | Het afrondmoment wordt server-side vastgelegd. |
| BR-004 | Een afgeronde run mag niet opnieuw als lopende run worden hervat. |
| BR-005 | Uniforme eindstatistieken worden na afronding opgeslagen op runniveau voor normale uitleesscenario's. |
| BR-006 | Resultaatweergave en geschiedenis lezen na afronding primair uit uniforme runvelden en opgeslagen vraagdetails. |
| BR-007 | Afronding moet idempotent zijn bij dubbele klik, refresh of netwerkherhaling. |
| BR-008 | Een onvolledige run blijft lopend en wordt niet als afgerond getoond. |
| BR-009 | De afronding mag geen relaties, autorisaties, berichten, meldingen of profielinstellingen wijzigen. |
| BR-010 | Live-meekijkupdates zijn secundair aan de opgeslagen afronding. |
| BR-011 | PDF-export wordt pas mogelijk doordat de run afgerond en resultaatdata beschikbaar is. |
| BR-012 | Geschiedenis toont alleen runs met geldige afronding. |
| BR-013 | De technische module levert of ondersteunt vraagdetails, maar de generieke applicatie bewaart de uniforme runuitkomst. |
| BR-014 | Wanneer Geen idee is gebruikt, telt die vraag als fout en wordt het aantal Geen idee in de uniforme totalen meegenomen. |
| BR-015 | Eindstatistieken worden niet bij onderbreking maar bij afronding berekend. |
| BR-016 | De leerling ziet geen technische berekeningsdetails die niet functioneel bedoeld zijn. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
ExerciseRunId | Moet bestaan, bij de leerling horen en nog afrondbaar zijn. |
ExerciseRuns.IsCompleted | Mag nog niet waar zijn voor een nieuwe afrondmutatie. |
| Vraagstatussen | Alle verplichte vragen moeten definitief verwerkt zijn. |
CompletedAtUtc | Wordt server-side gevuld en mag niet door client worden aangeleverd. |
| Uniforme totalen | Moeten consistent zijn met vraagresultaten. |
Dunno-teller | Moet overeenkomen met vragen die via Geen idee zijn gemarkeerd. |
| Timingdata | Moet voldoende zijn voor de statistieken die als verplicht worden berekend. |
| Modulepayload | Moet herleidbaar blijven voor resultaatdetails. |
| Resultaatcontext | Mag alleen worden teruggegeven aan geautoriseerde gebruiker of later toegestane inzagers. |
| Dubbele request | Mag niet leiden tot dubbele afronding of afwijkende statistiekwaarden. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 9 | Berekening | Statistiekservice | Eindstatistieken worden berekend op basis van opgeslagen vraagdata. |
| 10 | Mutatie | ExerciseRuns | Afrondvlag wordt gezet en CompletedAtUtc wordt gevuld. |
| 11 | Mutatie | ExerciseRuns | Uniforme totalen en statistiekvelden worden opgeslagen. |
| 12 | Event | ExerciseRunCompleted | Run is formeel afgerond. |
| 12 | Event | ExerciseRunStatisticsCalculated | Eindstatistieken zijn berekend en opgeslagen. |
| 13 | Event | LiveViewProgressUpdated | Live-meekijkers ontvangen afrondstatus of laatste voortgang. |
| 14 | Event | ExerciseResultAvailable | Resultaatcontext is beschikbaar voor resultaatweergave. |
| 16 | Afgeleid readmodel | Geschiedenis | De afgeronde run wordt zichtbaar doordat CompletedAtUtc en de afrondvlag zijn opgeslagen. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
Users | Afronding wijzigt het account niet. |
UserSettings | Afronding wijzigt geen voorkeuren of niveaukeuze. |
UserRoles | Rollen blijven ongewijzigd. |
UserRelationships | Relaties zijn niet betrokken. |
StudentLevelAuthorizations | Autorisaties worden niet gewijzigd. |
Exercises | Oefeningconfiguratie blijft ongewijzigd. |
ExerciseModules | Modulemetadata blijft ongewijzigd. |
SystemMessages | Afronding maakt geen systeembericht aan. |
PrivateMessageThreads | Afronding maakt geen privébericht aan. |
Tickets | Afronding maakt geen melding aan. |
SharedExercises | Delen van een resultaat is een aparte vervolgflow. |
| PDF-bestand | PDF wordt pas op aanvraag gegenereerd in resultaat-/exportusecase. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Normale afronding
16.2 Dubbele afrondrequest
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Afronden van de run | Afronding zelf gebruikt geen popupregister-popup; resultaatweergave wordt in resultaatusecases uitgewerkt. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Functioneel Ontwerp beschrijft starten, hervatten, beantwoorden, Geen idee, onderbreken, afronden en resultaatnavigatie binnen de leerling-oefenflow. |
| Technisch Ontwerp | Technisch Ontwerp: oefencatalogus, oefenmodulecontract, oefenruns en voortgang, live meekijken en frontend-oefencontext beschrijft de technische afbakening, server-side brondata, autorisatie en UI-compositie voor deze usecase. |
| Software Requirements Specification | Software Requirements Specification bevat centrale eisen en acceptatiecriteria voor oefenruns, voortgangsopslag, modulegedrag, foutafhandeling en veilige server-side verwerking. |
| Database-informatie | Database-informatie blijft bron voor ExerciseRuns, ExerciseRunProgress, payloadvelden, snapshots en soft links richting gebruiker en catalogus. |
| Ontwerpbronnen | Ontwerpbronnen bevatten aanvullende businessregels voor oefenflow, modulepayloads, Geen idee en voortgangsregistratie. |
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-OEF-008-001 | SRS-LRN-006 AC-LRN-006 | Een exercise run pas afronden wanneer alle verplichte vragen definitief verwerkt zijn |
REQ-UC-LLN-OEF-008-002 | SRS-AUTH-001 SRS-LRN-006 SRS-NFR-AUD-001 AC-AUTH-001 AC-LRN-006 AC-NFR-AUD-001 | Het afrondmoment server-side vastleggen |
REQ-UC-LLN-OEF-008-003 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Een afgeronde run als afgerond markeren zodat deze niet meer als lopende run hervat wordt |
REQ-UC-LLN-OEF-008-004 | SRS-CAT-001 SRS-LRN-006 AC-CAT-001 AC-LRN-006 | Uniforme totalen op runniveau opslaan bij afronding |
REQ-UC-LLN-OEF-008-005 | SRS-LRN-006 AC-LRN-006 | Eindstatistieken berekenen en opslaan bij afronding |
REQ-UC-LLN-OEF-008-006 | SRS-LRN-006 AC-LRN-006 | Een afgeronde run beschikbaar maken voor resultaatweergave |
REQ-UC-LLN-OEF-008-007 | SRS-LRN-008 SRS-NFR-AUD-001 AC-LRN-008 AC-NFR-AUD-001 | Een afgeronde run beschikbaar maken voor geschiedenisweergave |
REQ-UC-LLN-OEF-008-008 | SRS-LRN-006 SRS-ARCH-004 AC-LRN-006 AC-ARCH-004 | Dubbele afrondrequests idempotent afhandelen |
REQ-UC-LLN-OEF-008-009 | SRS-AUTH-001 SRS-LRN-003 AC-AUTH-001 AC-LRN-003 | Afronding blokkeren wanneer de run onvolledige of inconsistente vraagvoortgang heeft |
REQ-UC-LLN-OEF-008-010 | SRS-LRN-009 SRS-LIVE-001 AC-LRN-009 AC-LIVE-001 | Live-meekijkers kunnen informeren dat de run is afgerond |
REQ-UC-LLN-OEF-008-011 | SRS-AUTH-001 SRS-ACC-003 SRS-REL-001 SRS-MSG-001 SRS-TIC-002 SRS-LRN-006 AC-AUTH-001 AC-ACC-003 AC-REL-001 AC-MSG-001 AC-TIC-002 AC-LRN-006 | Bij afronding geen relaties, autorisaties, berichten, meldingen of profielinstellingen wijzigen |
REQ-UC-LLN-OEF-008-012 | SRS-LRN-006 SRS-PDF-001 AC-LRN-006 AC-PDF-001 | Resultaat- en PDF-vervolgacties baseren op de historisch opgeslagen runcontext |