UC-LLN-RES-003 — Oefening opnieuw maken
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-LLN-RES-003 |
| Naam | Oefening opnieuw maken |
| Domein | Leerling / Resultaten, statistieken, geschiedenis en PDF-export |
| Primaire actor | Leerling |
| Secundaire actor(en) | OefenHub frontend, OefenHub backend, technische oefenmodule, database |
| Rolcontext | Ingelogde leerling die een afgeronde eigen exercise run opnieuw wil maken. |
| Betrokken schermen | Resultaatpopup, geschiedenisdetail, oefenscherm, oefeningpagina. |
| Gerelateerde usecases | UC-LLN-RES-001 — Resultaat na afronding bekijken; UC-LLN-HIS-003 — Resultaatdetail vanuit geschiedenis openen; UC-LLN-OEF-003 — Nieuwe oefening starten; UC-LLN-OEF-004 — Vraag beantwoorden; UC-LLN-OEF-008 — Oefening afronden; UC-LLN-DEL-004 — Gedeelde oefening opnieuw maken |
| Primaire entiteiten | ExerciseRuns, nieuwe duplicate exercise run, vraag- en antwoordpayload |
| Secundaire entiteiten / events | Exercises, ExerciseModules, bronvraagpayload, nieuwe vraagpayload |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Niet van toepassing |
| MoSCoW | Should |
2. Omschrijving
Deze usecase beschrijft hoe een leerling vanuit een resultaatweergave of geschiedenisdetail dezelfde oefening opnieuw maakt. De nieuwe run gebruikt dezelfde vragen als de bronrun, maar mag de volgorde wijzigen. De nieuwe run is een zelfstandige exercise run met eigen voortgang, eigen antwoorden, eigen afrondmoment en eigen statistieken.
De relatie met de bronrun wordt administratief vastgelegd via DuplicateOf of een gelijkwaardige verwijzing. De bronrun wordt niet gewijzigd en de resultaten van de bronrun worden niet overschreven. De nieuwe run is alleen een nieuwe uitvoering op basis van dezelfde vraaginhoud.
Wanneer de gekoppelde technische module niet meer beschikbaar of niet meer uitvoerbaar is, is de actie niet beschikbaar. Een leerling mag historische resultaten dan nog bekijken en als PDF downloaden, maar niet meer opnieuw maken wanneer de uitvoeringscontext ontbreekt.
DRY-afbakening: het starten van een volledig nieuwe oefening op basis van actuele configuratie hoort bij UC-LLN-OEF-003. Deze usecase gaat specifiek over opnieuw maken vanuit een bestaande afgeronde bronrun. Gedeelde oefeningen opnieuw maken wordt in het subdomein Gedeelde oefeningen verder uitgewerkt.
3. Scope
Deze usecase omvat wel:
- tonen of beschikbaar maken van de actie
Maak deze oefening opnieuw - controleren dat de bronrun afgerond en toegankelijk is
- controleren dat de bronrun hermaakbaar is
- controleren dat de technische module uitvoerbaar is
- aanmaken van een nieuwe zelfstandige exercise run
- overnemen van dezelfde vraaginhoud uit de bronrun
- bepalen van de toegestane vraagvolgorde voor de nieuwe run
- vullen van
DuplicateOfof equivalente bronverwijzing - openen van het oefenscherm met de nieuwe run
- waarborgen dat bronresultaten ongewijzigd blijven
- veilige blokkade wanneer herhalen niet mogelijk is
Deze usecase omvat niet:
- tonen van het resultaat zelf
- PDF-export
- delen met vrienden
- wijzigen van de oefeningconfiguratie
- opnieuw genereren op basis van actuele oefeningconfiguratie zonder bronrun
- docent-testmodus
- herberekenen van oude statistieken
- herstel van verwijderde modules
- intrekken of wijzigen van leerlingautorisaties
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De leerling is ingelogd. |
| PRE-002 | De bronrun bestaat. |
| PRE-003 | De bronrun is afgerond. |
| PRE-004 | De leerling mag de bronrun bekijken. |
| PRE-005 | De bronrun bevat voldoende opgeslagen vraaginhoud om opnieuw te maken. |
| PRE-006 | De gekoppelde technische module of noodzakelijke render-/controlelogica is beschikbaar. |
| PRE-007 | De oefening is niet zodanig verwijderd of onbruikbaar dat opnieuw maken functioneel geblokkeerd moet worden. |
| PRE-008 | De backend kan een nieuwe zelfstandige run aanmaken. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Er is een nieuwe zelfstandige exercise run aangemaakt. |
| POST-002 | De nieuwe run verwijst naar de bronrun via DuplicateOf of equivalente bronverwijzing. |
| POST-003 | De bronrun is ongewijzigd gebleven. |
| POST-004 | De nieuwe run bevat dezelfde vraaginhoud als de bronrun. |
| POST-005 | De vraagvolgorde mag afwijken wanneer dat is toegestaan. |
| POST-006 | De leerling wordt naar het oefenscherm van de nieuwe run geleid. |
| POST-007 | De nieuwe run heeft eigen voortgang en eigen resultaten zodra de leerling deze afrondt. |
| POST-008 | Bij blokkade ontstaat geen gedeeltelijke nieuwe run. |
6. Trigger
De usecase start wanneer de leerling in de resultaatweergave of in een resultaatdetail vanuit geschiedenis kiest voor Maak deze oefening opnieuw.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Leerling | Resultaatpopup of resultaatdetail | Bekijkt een afgeronde run. | Resultaatacties worden bepaald. | UC-LLN-RES-001 of UC-LLN-HIS-003. |
| 2 | OefenHub backend | Resultaatservice | Controleert of opnieuw maken functioneel mogelijk is. | Actie wordt beschikbaar gemaakt. | Module en brondata beschikbaar. |
| 3 | OefenHub frontend | Resultaatacties | Toont Maak deze oefening opnieuw. | Leerling kan actie kiezen. | Alleen wanneer toegestaan. |
| 4 | Leerling | Resultaatacties | Kiest Maak deze oefening opnieuw. | Frontend vraagt nieuwe duplicate run aan. | Bronrun-id. |
| 5 | OefenHub backend | Routeguard | Controleert sessie en leerlingrol. | Alleen geldige leerling gaat door. | Server-side context. |
| 6 | OefenHub backend | Duplicatieservice | Controleert dat de bronrun bestaat. | Onbekende bron wordt geblokkeerd. | ExerciseRuns.Id. |
| 7 | OefenHub backend | Duplicatieservice | Controleert dat de bronrun afgerond is. | Alleen afgeronde runs zijn hermaakbaar. | CompletedAtUtc. |
| 8 | OefenHub backend | Duplicatieservice | Controleert eigenaar of toegestane inzagecontext. | Onbevoegde herhaling wordt geblokkeerd. | Eigen run. |
| 9 | OefenHub backend | Duplicatieservice | Controleert module- en oefencontext. | Hermaakbaarheid wordt bevestigd. | Module beschikbaar. |
| 10 | OefenHub backend | Duplicatieservice | Leest bronvraaginhoud en noodzakelijke metadata. | Vraagset kan worden gekopieerd. | Historische runpayload. |
| 11 | OefenHub backend | Duplicatieservice | Bepaalt nieuwe vraagvolgorde. | Nieuwe run krijgt dezelfde inhoud met toegestane volgorde. | Shuffle of bronvolgorde volgens regel. |
| 12 | OefenHub backend | Runservice | Maakt nieuwe ExerciseRuns-record aan. | Nieuwe zelfstandige run ontstaat. | Nieuwe run-id. |
| 13 | OefenHub backend | Runservice | Vult bronverwijzing. | DuplicateOf verwijst naar de bronrun. | Auditbare herkomst. |
| 14 | OefenHub backend | Runservice | Slaat nieuwe vraagpayload/voortgangsstructuur op. | Nieuwe run is startklaar. | Eigen voortgang. |
| 15 | OefenHub backend | Database | Commit nieuwe run transactioneel. | Geen half aangemaakte duplicate. | Transactie. |
| 16 | OefenHub backend | Runservice | Rondt de hermaaktransactie af. | Nieuwe run is herleidbaar via DuplicateOf. | Geen aparte auditlaag. |
| 17 | OefenHub frontend | Navigatie | Sluit resultaatweergave of routeert naar oefenscherm. | Leerling ziet eerste vraag van nieuwe run. | UC-LLN-OEF-004 volgt. |
| 18 | Leerling | Oefenscherm | Start beantwoording van de nieuwe run. | Nieuwe voortgang wordt onafhankelijk opgeslagen. | Eigen antwoorden en statistieken. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Module is verwijderd of niet uitvoerbaar | Actie wordt niet getoond of uitgeschakeld. | Tooltip/componentmelding | Geen |
| ALT-002 | 4 | Leerling dubbelklikt | Backend voorkomt dubbele duplicate-runs of behandelt idempotent volgens request. | Niet van toepassing | Maximaal één geldige run per request |
| ALT-003 | 5 | Sessie verlopen | Routeguard verwijst naar login. | Routeguardafhandeling | Geen |
| ALT-004 | 6 | Bronrun bestaat niet | Nieuwe run wordt niet aangemaakt. | Niet-beschikbaarmelding | Geen |
| ALT-005 | 7 | Bronrun is niet afgerond | Nieuwe run wordt geblokkeerd. | Componentmelding | Geen |
| ALT-006 | 8 | Bronrun hoort niet bij leerling | Backend weigert hermaakactie. | Toegang geweigerd | Geen |
| ALT-007 | 9 | Oefeningcontext is niet meer uitvoerbaar | Actie wordt geblokkeerd. | Componentmelding | Geen |
| ALT-008 | 10 | Vraagpayload is beschadigd of onvolledig | Nieuwe run wordt niet aangemaakt. | Componentmelding | Geen |
| ALT-009 | 11 | Nieuwe volgorde kan niet bepaald worden | Systeem gebruikt bronvolgorde wanneer functioneel toegestaan of blokkeert veilig. | Componentmelding bij blokkade | Geen of geldige run |
| ALT-010 | 12 | Database faalt bij aanmaken | Transactie wordt teruggedraaid. | Componentmelding | Geen blijvende run |
| ALT-011 | 14 | Voortgangsstructuur kan niet worden opgeslagen | Transactie wordt teruggedraaid. | Componentmelding | Geen gedeeltelijke run |
| ALT-012 | 17 | Navigatie naar oefenscherm faalt | Nieuwe run bestaat; leerling kan via verdergaan of oefeningpagina hervatten wanneer toegestaan. | Componentmelding | Nieuwe run blijft bestaan |
| ALT-013 | 9 | Actuele leerlingtoegang tot oorspronkelijke oefening is vervallen | Systeem bepaalt volgens centrale toegangsregel of historisch opnieuw maken nog mag; bij blokkade ontstaat geen run. | Componentmelding | Geen bij blokkade |
| ALT-014 | 4 | Bronrun is ontvangen gedeelde oefening | Specifieke regels voor gedeelde oefeningen gelden in UC-LLN-DEL-004. | Niet van toepassing | Buiten deze usecase |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Alleen afgeronde runs kunnen via Maak deze oefening opnieuw opnieuw worden gemaakt. |
| BR-002 | De nieuwe run is altijd een zelfstandige exercise run. |
| BR-003 | De bronrun wordt nooit overschreven of aangepast door opnieuw maken. |
| BR-004 | De nieuwe run verwijst administratief naar de bronrun via DuplicateOf of equivalente verwijzing. |
| BR-005 | De nieuwe run gebruikt dezelfde vraaginhoud als de bronrun. |
| BR-006 | De vraagvolgorde mag worden gewijzigd wanneer dit volgens de oefenregels is toegestaan. |
| BR-007 | De nieuwe run krijgt eigen voortgang, eigen antwoorden, eigen afrondmoment en eigen statistieken. |
| BR-008 | Wanneer de technische module niet meer beschikbaar is, is opnieuw maken niet beschikbaar. |
| BR-009 | Opnieuw maken mag geen oude geschiedenis of oude resultaten wijzigen. |
| BR-010 | Opnieuw maken mag geen relaties, autorisaties, berichten, meldingen of profielinstellingen wijzigen. |
| BR-011 | Opnieuw maken vanuit gedeelde oefeningen gebruikt de regels van het deel-subdomein. |
| BR-012 | Een fout tijdens aanmaken mag geen half bruikbare run opleveren. |
| BR-013 | Technische identifiers worden niet aan de leerling getoond als functionele uitleg. |
| BR-014 | De nieuwe run is vanaf start een normale lopende run binnen oefen- en voortgangsflows. |
| BR-015 | Als toegang tot de oefencontext vervallen is, moet server-side worden bepaald of historisch opnieuw maken nog is toegestaan. |
| BR-016 | Duplicaatrelaties blijven analyseerbaar in resultaatweergave en geschiedenis. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
Bron ExerciseRunId | Moet bestaan, afgerond en toegankelijk zijn. |
| Bronrun-eigenaar | Moet overeenkomen met leerling of expliciet toegestane context. |
CompletedAtUtc | Moet gevuld zijn voor hermaakbaarheid. |
| Vraagpayload | Moet alle noodzakelijke vraaginhoud bevatten. |
| Oefeningcontext | Moet voldoende uitvoerbaar zijn. |
| Modulecontext | Moet beschikbaar zijn voor rendering en antwoordcontrole. |
| Nieuwe run-id | Wordt server-side aangemaakt. |
DuplicateOf | Moet verwijzen naar de bronrun. |
| Vraagvolgorde | Mag alleen geldige vraagposities bevatten. |
| Startstatus nieuwe run | Moet lopend en niet afgerond zijn. |
| Transactionele verwerking | Nieuwe run en vraagstructuur moeten samen consistent worden opgeslagen. |
11. Datamutaties en events
| Stap | Type | Entiteit / gegevensbron | Mutatie |
|---|---|---|---|
| 10 | Read | Bron ExerciseRuns | Bronvraaginhoud en metadata worden gelezen. |
| 12 | Insert | Nieuwe ExerciseRuns | Nieuwe zelfstandige run wordt aangemaakt. |
| 13 | Update bij insert | Nieuwe ExerciseRuns | DuplicateOf wordt gevuld met bronrun-id. |
| 14 | Insert | Nieuwe voortgang/payload | Vraaginhoud en startvoortgang worden opgeslagen. |
| 15 | Commit | Database | Nieuwe run wordt transactioneel vastgelegd. |
De hermaakactie is functioneel herleidbaar via de nieuwe run en de DuplicateOf-verwijzing naar de bronrun. Er wordt geen apart functioneel event verondersteld voor deze usecase.
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
Bron ExerciseRuns | De bronrun blijft ongewijzigd. |
| Bronvraagpayload | De broninhoud wordt gelezen maar niet aangepast. |
| Oude statistiekvelden | Oude resultaten blijven historisch. |
Exercises | Oefeningconfiguratie wordt niet gewijzigd. |
ExerciseModules | Modulemetadata wordt niet gewijzigd. |
Users | Accountgegevens blijven ongewijzigd. |
UserSettings | Voorkeuren blijven ongewijzigd. |
UserRelationships | Relaties blijven ongewijzigd. |
SystemMessages | Er wordt geen systeembericht aangemaakt. |
PrivateMessageThreads | Er wordt geen privébericht aangemaakt. |
Tickets | Er wordt geen melding aangemaakt. |
| PDF-bestand | PDF-export staat los van opnieuw maken. |
13. State diagram
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Oefening opnieuw maken
16.2 Opnieuw maken geblokkeerd
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
| Niet van toepassing | Opnieuw maken | Blokkades worden als resultaat-/componentmelding verwerkt, niet als 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. |
| 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-003-001 | SRS-LRN-009 AC-LRN-009 | Een afgeronde eigen exercise run opnieuw kunnen laten maken wanneer de run hermaakbaar is |
REQ-UC-LLN-RES-003-002 | SRS-AUTH-001 SRS-LRN-006 AC-AUTH-001 AC-LRN-006 | De bronrun server-side valideren op bestaan, afronding en toegang |
REQ-UC-LLN-RES-003-003 | SRS-AUTH-001 SRS-LRN-009 SRS-MOD-003 AC-AUTH-001 AC-LRN-009 AC-MOD-003 | De actie blokkeren wanneer de technische module of brondata niet uitvoerbaar is |
REQ-UC-LLN-RES-003-004 | SRS-LRN-009 AC-LRN-009 | Bij opnieuw maken een nieuwe zelfstandige exercise run aanmaken |
REQ-UC-LLN-RES-003-005 | SRS-LRN-009 AC-LRN-009 | De nieuwe run laten verwijzen naar de bronrun via DuplicateOf of gelijkwaardige verwijzing |
REQ-UC-LLN-RES-003-006 | SRS-LRN-009 AC-LRN-009 | Dezelfde vraaginhoud gebruiken als de bronrun |
REQ-UC-LLN-RES-003-007 | SRS-LRN-009 AC-LRN-009 | De vraagvolgorde wijzigen wanneer dit functioneel toegestaan is |
REQ-UC-LLN-RES-003-008 | SRS-LRN-009 AC-LRN-009 | De bronrun en bronresultaten niet wijzigen |
REQ-UC-LLN-RES-003-009 | SRS-LRN-003 AC-LRN-003 | De nieuwe run eigen voortgang, antwoorden en statistieken laten hebben |
REQ-UC-LLN-RES-003-010 | SRS-LRN-009 AC-LRN-009 | De leerling na succesvolle aanmaak naar het oefenscherm van de nieuwe run leiden |
REQ-UC-LLN-RES-003-011 | SRS-LRN-009 AC-LRN-009 | Voorkomen dat een fout leidt tot een half aangemaakte duplicate run |
REQ-UC-LLN-RES-003-012 | 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 opnieuw maken geen relaties, autorisaties, berichten, meldingen of profielinstellingen wijzigen |