UC-LLN-OEF-007 — Oefening onderbreken
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-OEF-007 |
| Naam | Oefening onderbreken |
| Domein | Leerling / Oefenen en voortgang |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, routeguard, database, SignalR-hub, live-meekijkers |
| Rolcontext | Ingelogde gebruiker met actieve leerlingrol en een lopende, niet-afgeronde exercise run. |
| Betrokken schermen | Oefenscherm, browsernavigatie, routeguard, oefening-startpagina, live-meekijkweergave. |
| Gerelateerde usecases | UC-LLN-OEF-001 — Oefening-startpagina openen; UC-LLN-OEF-002 — Verder gaan met niet-afgeronde oefening; UC-LLN-OEF-004 — Vraag beantwoorden; UC-LLN-OEF-008 — Oefening afronden; UC-LLN-TOEG-003 — Oefeningstoegang controleren bij openen |
| Primaire entiteiten | ExerciseRuns, ExerciseRunProgress |
| Secundaire entiteiten / events | LiveViewSessionEndedByStudentExit, LiveViewProgressUpdated, LiveViewAudit |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft wat er gebeurt wanneer een leerling een lopende oefening onderbreekt door het oefenscherm te verlaten voordat de volledige exercise run is afgerond. Een leerling heeft hiervoor geen aparte pauzeknop nodig. Het verlaten van de pagina, het navigeren naar een andere route, het sluiten van het tabblad of het verlopen van de browsercontext kan functioneel allemaal leiden tot een onderbroken oefening.
OefenHub bewaart na iedere bevestigde vraag al server-side de voortgang. Daardoor hoeft bij onderbreken geen volledige nieuwe opslagactie plaats te vinden om de oefening later hervatbaar te maken. De bestaande opgeslagen voortgang blijft de bron van waarheid. Niet-bevestigde invoer in een antwoordveld wordt niet als definitieve voortgang beschouwd en hoeft niet persistent te worden opgeslagen.
De exercise run blijft administratief bestaan als niet-afgeronde run. Zij verschijnt daarom niet als afgeronde geschiedenisregel en krijgt geen eindstatistieken. De run kan later via de vervolgactie Verder gaan worden hervat zolang de leerling, oefening, module en toegangscontext dat nog toestaan.
Wanneer een ouder/voogd of docent op dat moment live meekijkt, moet het systeem de meekijkcontext informeren dat de leerling de oefencontext heeft verlaten. De live-weergave is daarmee niet langer actueel. De beëindiging van een live-meekijksessie is afgeleid van het verlaten van de oefencontext en mag niet worden verward met het afronden van de oefening.
DRY-afbakening: deze usecase beschrijft niet opnieuw hoe antwoorden worden opgeslagen, hoe een run wordt hervat of hoe live meekijken wordt gestart. Antwoordopslag blijft onderdeel van UC-LLN-OEF-004, hervatten van UC-LLN-OEF-002 en live meekijken van de rolgebonden docent-/ouderflows. Deze usecase beschrijft alleen het veilige effect van onderbreking op de leerlingrun.
3. Scope
Deze usecase omvat wel:
- verlaten van een lopende oefening door een leerling
- onderscheid tussen bevestigde voortgang en niet-bevestigde invoer
- behouden van de niet-afgeronde exercise run
- voorkomen dat de run als afgeronde geschiedenisregel verschijnt
- voorkomen dat eindstatistieken worden berekend
- beschikbaar houden van hervatten via
Verder gaanwanneer de context nog geldig is - informeren of beëindigen van actieve live-meekijkcontexten
- veilige afhandeling bij browserrefresh, routewisseling, tab sluiten of sessieverloop
- geen mutaties aan relaties, autorisaties, profielinstellingen of berichten
Deze usecase omvat niet:
- starten van een nieuwe oefening
- beantwoorden of corrigeren van een vraag
- tonen van het juiste antwoord na bevestiging
- afronden van de oefening
- berekenen van eindstatistieken
- tonen van resultaatpopup of geschiedenis
- verwijderen van een niet-afgeronde run
- live meekijken starten door docent of ouder/voogd
- intrekken of beheren van toegang door docent
- accountlogout als zelfstandige accountflow
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De gebruiker heeft een actieve leerlingcontext of had die bij het starten van de run. |
| PRE-002 | Er bestaat een ExerciseRuns-record voor deze leerling. |
| PRE-003 | De run is nog niet afgerond. |
| PRE-004 | De laatst bevestigde vraagvoortgang is server-side opgeslagen of er is nog geen bevestigde vraagvoortgang. |
| PRE-005 | De frontend kan het verlaten van de oefencontext functioneel detecteren of de backend kan bij latere toegang afleiden dat de run niet afgerond is. |
| PRE-006 | Eventuele live-meekijkers zijn gekoppeld aan dezelfde actuele run via hun eigen autorisatiecontext. |
| PRE-007 | Er bestaat geen verplichting om bij onderbreken een reden of bevestiging aan de leerling te vragen. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | De exercise run blijft bestaan als niet-afgeronde run. |
| POST-002 | ExerciseRuns.IsCompleted blijft false of equivalent niet-afgerond. |
| POST-003 | ExerciseRuns.CompletedAtUtc blijft leeg. |
| POST-004 | Bevestigde vraagvoortgang blijft bewaard. |
| POST-005 | Niet-bevestigde invoer wordt niet als definitieve vraagvoortgang opgeslagen. |
| POST-006 | De run verschijnt niet in afgeronde geschiedenis of resultaatlijsten. |
| POST-007 | De run kan later hervat worden wanneer de toegangscontext nog geldig is. |
| POST-008 | Actieve live-meekijkers worden geïnformeerd dat de leerling de oefencontext heeft verlaten of de livecontext wordt beëindigd. |
| POST-009 | Er worden geen eindstatistieken berekend. |
| POST-010 | Er worden geen relaties, autorisaties, berichten, meldingen of profielgegevens gewijzigd. |
6. Trigger
De usecase start wanneer een leerling tijdens een lopende oefening het oefenscherm verlaat voordat de exercise run formeel is afgerond.
Voorbeelden van triggers zijn:
- de leerling navigeert naar een andere pagina;
- de leerling gebruikt de browserknop terug;
- de leerling sluit het tabblad of de browser;
- de leerling verliest verbinding en keert niet direct terug;
- de sessie verloopt tijdens een lopende oefening;
- de applicatie detecteert dat de actieve oefencomponent wordt verlaten.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Oefenscherm | Werkt aan een lopende oefening. | Frontend toont actuele vraag en voortgang. | Run is niet afgerond. |
| 2 | Leerling | Oefenscherm / browser | Verlaat de oefencontext. | Frontend detecteert routewisseling of componentafbraak wanneer technisch mogelijk. | Geen aparte pauzeknop vereist. |
| 3 | OefenHub frontend | Oefencomponent | Controleert of er niet-bevestigde invoer aanwezig is. | Niet-bevestigde invoer wordt niet als definitief antwoord beschouwd. | Alleen bevestigde antwoorden tellen. |
| 4 | OefenHub frontend | Oefencomponent | Stuurt waar mogelijk een lichte onderbrekingsmelding naar backend. | Backend ontvangt signaal dat oefencontext is verlaten. | Best-effort; run blijft ook zonder signaal niet-afgerond. |
| 5 | OefenHub backend | Runservice | Laadt de lopende run. | Systeem verifieert dat de run nog niet afgerond is. | ExerciseRuns.IsCompleted = false. |
| 6 | OefenHub backend | Runservice | Behoudt de bestaande voortgangstoestand. | Er wordt geen afronding uitgevoerd. | Geen eindstatistieken. |
| 7 | OefenHub backend | SignalR-hub | Controleert actieve live-meekijkcontexten. | Geautoriseerde meekijkers krijgen bericht dat de leerling de oefencontext heeft verlaten. | Geen nieuwe oefenresultaten. |
| 8 | OefenHub backend | Live-meekijkcontext | Beëindigt actieve live-meekijkregistraties voor deze run. | Meekijkweergave blijft alleen-lezen en niet-actueel. | LiveViewAudit.EndedAtUtc waar van toepassing. |
| 9 | OefenHub frontend | Nieuwe route / verlaten context | Toont de gekozen nieuwe pagina of sluit de context. | Leerling is niet langer in de oefenweergave. | Geen resultaatpopup. |
| 10 | OefenHub backend | Run-readmodel | Houdt run beschikbaar voor hervatten. | Verder gaan kan de run later tonen. | UC-LLN-OEF-002. |
| 11 | OefenHub backend | Geschiedenis-readmodel | Sluit de run uit van afgeronde geschiedenis. | Run verschijnt niet als afgeronde geschiedenisregel. | CompletedAtUtc ontbreekt. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Browser wordt abrupt gesloten | Backend ontvangt mogelijk geen directe melding; run blijft door ontbreken van afronding niet-afgerond. | Niet van toepassing | Geen extra mutatie vereist |
| ALT-002 | 2 | Netwerk valt weg | Laatst bevestigde server-side voortgang blijft behouden. | Niet van toepassing | Geen nieuwe vraagmutatie |
| ALT-003 | 3 | Leerling heeft tekst ingevuld maar niet bevestigd | Niet-bevestigde invoer wordt niet als antwoord opgeslagen. | Niet van toepassing | Geen |
| ALT-004 | 4 | Onderbrekingsmelding bereikt backend niet | Run blijft op basis van bestaande status niet-afgerond. | Niet van toepassing | Geen |
| ALT-005 | 5 | Run is intussen al afgerond via geldige afrondflow | Onderbrekingsverwerking doet niets meer. | Niet van toepassing | Geen nieuwe mutatie |
| ALT-006 | 5 | Sessie is verlopen | Account-/sessieflow handelt sessie af; run blijft niet-afgerond. | Niet van toepassing | Geen oefenmutatie |
| ALT-007 | 7 | Er zijn geen live-meekijkers | Systeem hoeft geen livebericht te verzenden. | Niet van toepassing | Geen |
| ALT-008 | 7 | SignalR-update faalt | Runstatus blijft correct; live-informatie kan gemist worden. | Niet van toepassing | Geen wijziging aan run |
| ALT-009 | 8 | Live-meekijksessie heeft aparte auditregistratie | Eindmoment van de actieve meekijkregistratie wordt gevuld. | Niet van toepassing | LiveViewAudit.EndedAtUtc |
| ALT-010 | 10 | Autorisatie vervalt na onderbreken | Run blijft historisch bestaan maar mag mogelijk niet meer hervat worden. | Componentmelding bij hervatten | Geen mutatie in deze usecase |
| ALT-011 | 10 | Oefening of module wordt na onderbreken inactief | Hervatten wordt bij een volgend verzoek opnieuw server-side gecontroleerd. | Componentmelding bij hervatten | Geen mutatie in deze usecase |
| ALT-012 | 11 | Geschiedenis wordt direct na onderbreken geopend | Run wordt niet getoond tussen afgeronde resultaten. | Lege of ongewijzigde geschiedenisweergave | Geen |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Een leerling hoeft een oefening niet expliciet te pauzeren om deze te kunnen onderbreken. |
| BR-002 | Een onderbroken run blijft een niet-afgeronde exercise run. |
| BR-003 | Alleen bevestigde antwoorden zijn definitieve voortgang. |
| BR-004 | Niet-bevestigde invoer in het antwoordveld hoeft niet persistent te worden opgeslagen. |
| BR-005 | Onderbreken mag IsCompleted niet op true zetten. |
| BR-006 | Onderbreken mag geen CompletedAtUtc vullen. |
| BR-007 | Onderbreken mag geen eindstatistieken berekenen. |
| BR-008 | Een onderbroken run verschijnt niet in afgeronde oefengeschiedenis. |
| BR-009 | Een onderbroken run kan later worden hervat via de laatste niet-afgeronde run, mits de context nog geldig is. |
| BR-010 | Meekijkers moeten weten dat de livecontext niet langer actief is wanneer de leerling de oefencontext verlaat. |
| BR-011 | Onderbreken wijzigt geen niveauautorisaties, relaties of oefeningconfiguratie. |
| BR-012 | Onderbreken stuurt geen systeembericht naar de leerling. |
| BR-013 | Onderbreken maakt geen resultaatpopup en geen PDF-export beschikbaar. |
| BR-014 | Abrupt verlaten zonder backendmelding mag niet leiden tot dataverlies van eerder bevestigde antwoorden. |
| BR-015 | De hervatbaarheid wordt bij latere toegang opnieuw server-side gecontroleerd. |
| BR-016 | Onderbreking is geen fouttoestand zolang de run consistent niet-afgerond blijft. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
ExerciseRunId | Moet bestaan wanneer een onderbrekingsmelding wordt verwerkt. |
ExerciseRuns.UserId | Moet overeenkomen met de leerling die de oefencontext verlaat. |
ExerciseRuns.IsCompleted | Moet false zijn om als onderbroken run te gelden. |
| Laatst bevestigde vraag | Alleen server-side bevestigde voortgang geldt als bewaard. |
| Niet-bevestigde invoer | Wordt niet gevalideerd als definitief antwoord. |
| Live-meekijkcontext | Alleen gekoppelde livecontexten voor dezelfde run worden geïnformeerd. |
CompletedAtUtc | Mag niet gevuld worden door onderbreken. |
| Eindstatistieken | Mogen niet berekend worden zonder afronding. |
| Hervatroute | Wordt later opnieuw gevalideerd via UC-LLN-OEF-002 en UC-LLN-TOEG-003. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 6 | Geen mutatie | ExerciseRuns | Run blijft niet-afgerond; geen afrondingsvelden worden gezet. |
| 7 | Event | LiveViewSessionEndedByStudentExit | Live-meekijkcontext wordt geïnformeerd dat de leerling de oefencontext heeft verlaten. |
| 8 | Mutatie | LiveViewAudit | EndedAtUtc wordt gevuld voor actieve live-meekijkregistraties die door het verlaten van deze run eindigen. |
| 11 | Geen mutatie | Geschiedenis-readmodel | De run wordt door bestaande status niet opgenomen in afgeronde geschiedenis. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
Users | Onderbreken wijzigt het account niet. |
UserSettings | Niveaucontext en voorkeuren blijven ongewijzigd. |
UserRoles | Rollen worden niet gewijzigd. |
UserRelationships | Relaties zijn niet betrokken. |
StudentLevelAuthorizations | Autorisaties worden niet toegekend of ingetrokken. |
Exercises | Oefeningconfiguratie blijft ongewijzigd. |
ExerciseModules | Modulemetadata blijft ongewijzigd. |
SystemMessages | Onderbreken veroorzaakt geen systeembericht. |
PrivateMessageThreads | Onderbreken veroorzaakt geen privébericht. |
Tickets | Onderbreken maakt geen melding aan. |
ExerciseRuns.CompletedAtUtc | Afrondmoment wordt niet gevuld. |
| Eindstatistiekvelden | Statistieken worden pas bij afronding berekend. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Onderbreken met detecteerbare routewisseling
16.2 Abrupt verlaten zonder backendmelding
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Onderbreken van een oefening | Er is geen domeinspecifieke popup nodig; verlaten van de oefencontext is toegestaan gedrag. |
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-007-001 | SRS-LRN-006 AC-LRN-006 | Een lopende oefening niet automatisch afronden wanneer de leerling het oefenscherm verlaat |
REQ-UC-LLN-OEF-007-002 | SRS-LRN-003 AC-LRN-003 | Eerder bevestigde antwoorden en voortgang behouden wanneer een oefening wordt onderbroken |
REQ-UC-LLN-OEF-007-003 | SRS-LRN-003 AC-LRN-003 | Niet-bevestigde invoer niet als definitief antwoord opslaan |
REQ-UC-LLN-OEF-007-004 | SRS-LRN-002 SRS-LRN-007 AC-LRN-002 AC-LRN-007 | Een onderbroken run als niet-afgerond beschikbaar houden zolang hervatten functioneel toegestaan is |
REQ-UC-LLN-OEF-007-005 | SRS-LRN-006 AC-LRN-006 | Voor een onderbroken run geen afrondmoment vullen |
REQ-UC-LLN-OEF-007-006 | SRS-LRN-009 AC-LRN-009 | Voor een onderbroken run geen eindstatistieken berekenen |
REQ-UC-LLN-OEF-007-007 | SRS-LRN-010 SRS-NFR-AUD-001 AC-LRN-010 AC-NFR-AUD-001 | Een onderbroken run niet tonen als afgeronde geschiedenisregel |
REQ-UC-LLN-OEF-007-008 | SRS-LRN-009 SRS-LIVE-001 AC-LRN-009 AC-LIVE-001 | Eventuele live-meekijkcontexten informeren of beëindigen wanneer de leerling de oefencontext verlaat |
REQ-UC-LLN-OEF-007-009 | SRS-AUTH-001 SRS-LRN-002 SRS-LRN-007 AC-AUTH-001 AC-LRN-002 AC-LRN-007 | Latere hervatting opnieuw server-side controleren op toegang en contextgeldigheid |
REQ-UC-LLN-OEF-007-010 | SRS-TIC-002 SRS-LRN-009 SRS-NFR-SEC-001 AC-TIC-002 AC-LRN-009 AC-NFR-SEC-001 | Abrupt verlaten zonder backendmelding veilig kunnen verwerken op basis van de bestaande runstatus |
REQ-UC-LLN-OEF-007-011 | SRS-AUTH-001 SRS-ACC-003 SRS-REL-001 SRS-MSG-001 SRS-TIC-002 SRS-LRN-009 AC-AUTH-001 AC-ACC-003 AC-REL-001 AC-MSG-001 AC-TIC-002 AC-LRN-009 | Bij onderbreken geen relaties, autorisaties, berichten, meldingen of profielinstellingen wijzigen |
REQ-UC-LLN-OEF-007-012 | SRS-LRN-009 SRS-POP-001 AC-LRN-009 AC-POP-001 | Onderbreken als normaal gebruik kunnen afhandelen zonder verplichte fout- of bevestigingspopup |