UC-DOC-OEF-007 - Oefening kopiëren vanuit open niveau
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-DOC-OEF-007 |
| Naam | Oefening kopiëren vanuit open niveau |
| Domein | Docent |
| Subdomein | Oefeningen configureren en testen |
| Primaire actor | Docent |
| Secundaire actor(en) | Systeem |
| Rolcontext | Docentcontext met bewerkrechten binnen het geselecteerde niveau |
| Betrokken schermen | Docent - Oefenaanbod, open niveau, oefeningdetail, kopieeractie, doelcontextkeuze |
| Gerelateerde usecases | UC-DOC-AANB-001, UC-DOC-AANB-002, UC-DOC-AANB-005, UC-DOC-OEF-001, UC-DOC-OEF-004, UC-DOC-OEF-005, UC-DOC-OEF-006 |
| Primaire entiteiten | Exercises, ExerciseModules, Levels, Categories, LevelCategories |
| Secundaire entiteiten / events | ParentExerciseId, ModuleConfigurationJsonBase64, ExerciseHistory, LevelCollaborators, open/privé-niveaucontext |
| Gerelateerde popups | POP-DOC-OEF-COPY-CONFIRM, POP-DOC-OEF-COPY-SUCCESS, POP-DOC-OEF-COPY-BLOCKED |
| Popupregister | Popup-register |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft hoe een docent een bestaande oefening uit een open niveau als uitgangspunt gebruikt voor een eigen concrete oefening. De docent wijzigt de bron niet, maar laat OefenHub een zelfstandige kopie maken in een doelcontext waarbinnen de docent bewerkrechten heeft.
De kopie krijgt een ParentExerciseId-verwijzing naar de bronoefening. Daardoor blijft zichtbaar dat de nieuwe oefening is afgeleid van een bestaande oefening, terwijl latere wijzigingen in de kopie de bron niet beïnvloeden en latere wijzigingen in de bron de kopie niet stilzwijgend overschrijven.
De nieuwe kopie staat na aanmaak in onderhoud. Daarmee wordt voorkomen dat een gekopieerde oefening direct zichtbaar of startbaar wordt voor leerlingen voordat de docent naam, icoon, configuratie en status bewust heeft gecontroleerd.
3. Scope
3.1 Binnen scope
- Selecteren van een kopieerbare oefening uit een open niveau.
- Controleren of de docent de bron mag bekijken en de doelcontext mag bewerken.
- Kiezen van het doelniveau en de doelcategorie voor de kopie.
- Aanmaken van een zelfstandige Exercises-kopie met ParentExerciseId naar de bronoefening.
- Kopiëren van naam, icoon, technische moduleverwijzing en moduleconfiguratie als startpunt.
- Standaard plaatsen van de kopie in onderhoud.
- Vastleggen van de kopieeractie in ExerciseHistory.
- Blokkeren van kopiëren wanneer bron, doel of modulecontext ongeldig is.
3.2 Buiten scope
- De bronoefening inhoudelijk wijzigen.
- Bron- en kopieconfiguraties automatisch gesynchroniseerd houden.
- Leerlingruns, resultaten of geschiedenis kopiëren.
- Een open niveau aanmaken of wijzigen.
- Doelcategorieën centraal beheren of migreren.
- De gekopieerde oefening direct activeren zonder aparte statusactie.
- Een modulemigratie uitvoeren tijdens het kopiëren.
- Centrale modulebeheerflows uitvoeren.
- Modulemigratie of technische moduleversies beheren.
- Leerlingautorisaties toekennen of intrekken.
- Relatie-uitnodigingen, docent-leerlingrelaties of docent-docentrelaties aanmaken.
- Leerlingresultaten aanpassen of verwijderen.
- Systeemnotificaties beheren of tonen.
- Beheerderondersteuning of centrale contentbeheerflows uitvoeren.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | De docent is ingelogd. |
| PRE-002 | De gebruiker heeft een actieve docentrol. |
| PRE-003 | Er is een geldige docentcontext bepaald. |
| PRE-004 | De bronoefening bevindt zich in een niveau dat voor de docent als open niveau zichtbaar is. |
| PRE-005 | De bronoefening is kopieerbaar volgens de actuele zichtbaarheid en modulebeschikbaarheid. |
| PRE-006 | De docent heeft een doelniveau geselecteerd of kan een geldig doelniveau kiezen. |
| PRE-007 | De docent is eigenaar van het doelniveau of actieve collaborator met bewerkrechten. |
| PRE-008 | De doelcategorie bestaat binnen het doelniveau of wordt via een bestaande categoriekoppeling gekozen. |
| PRE-009 | De gekoppelde technische module van de bron is nog beschikbaar voor gebruik of kopie volgens de modulebeschikbaarheidsregels. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Er is een nieuwe zelfstandige concrete oefening in de doelcontext aangemaakt wanneer alle controles slagen. |
| POST-002 | De nieuwe oefening verwijst via ParentExerciseId naar de bronoefening. |
| POST-003 | De nieuwe oefening verwijst naar een ExerciseModules-record dat volgens de actuele regels gebruikt mag worden. |
| POST-004 | De gekopieerde moduleconfiguratie is als startconfiguratie opgeslagen op de nieuwe oefening. |
| POST-005 | De kopie staat standaard In onderhoud, oftewel IsActive = false. |
| POST-006 | De kopieeractie is auditbaar vastgelegd in ExerciseHistory met ActionType COPY_FROM_PARENT. |
| POST-007 | De bronoefening, bronconfiguratie, bronhistorie en bestaande leerlingruns zijn ongewijzigd gebleven. |
| POST-008 | Bij blokkade of annulering ontstaat geen nieuwe oefening. |
6. Trigger
De docent opent een kopieerbare oefening in een open niveau en kiest de actie om deze oefening als uitgangspunt te gebruiken voor een eigen oefening.
De docent bevestigt de kopieeractie nadat bron, doelniveau en doelcategorie zijn gecontroleerd.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Docent | Open niveau / oefeningdetail | Kiest een oefening om te kopiëren | Frontend start kopieerflow | SourceExerciseId |
| 2 | Systeem | Backend | Controleert bronzichtbaarheid | Bron moet via open niveau zichtbaar zijn | Levels.Visibility = Open |
| 3 | Systeem | Backend | Controleert bronstatus en modulecontext | Bron moet veilig als startpunt gebruikt kunnen worden | Exercises, ExerciseModules |
| 4 | Systeem | Doelcontextkeuze | Laadt doelniveaus en categorieën | Alleen bewerkbare docentcontexten worden getoond | Levels, LevelCategories |
| 5 | Docent | Doelcontextkeuze | Kiest doelniveau en doelcategorie | Keuze wordt server-side opnieuw gevalideerd | TargetLevelId, TargetCategoryId |
| 6 | Docent | Kopieeractie | Bevestigt kopiëren | Systeem start transactionele aanmaak | POP-DOC-OEF-COPY-CONFIRM |
| 7 | Systeem | Backend | Maakt kopiegegevens gereed | Naam, icoon, module en configuratie worden als startpunt overgenomen | Exercise snapshot |
| 8 | Systeem | Database | Maakt nieuwe oefening aan | Nieuwe Exercises-record ontstaat in doelcontext | Exercises.ParentExerciseId |
| 9 | Systeem | Database | Zet status in onderhoud | Kopie wordt niet direct zichtbaar voor leerlingen | IsActive = false |
| 10 | Systeem | Database | Legt historie vast | Kopieeractie wordt auditbaar geregistreerd | ExerciseHistory COPY_FROM_PARENT |
| 11 | Systeem | Frontend | Toont nieuwe kopie | Docent kan kopie controleren, bewerken of later activeren | POP-DOC-OEF-COPY-SUCCESS |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | Bronniveau is niet langer open of niet meer zichtbaar | Blokkeer kopiëren | POP-DOC-OEF-COPY-BLOCKED | Geen |
| ALT-002 | 3 | Bronoefening is verwijderd, inactief of niet kopieerbaar | Blokkeer kopiëren met veilige melding | POP-DOC-OEF-COPY-BLOCKED | Geen |
| ALT-003 | 3 | Gekoppelde module is niet meer beschikbaar voor nieuwe kopieën | Blokkeer kopiëren; bron blijft historisch beschikbaar | POP-DOC-OEF-COPY-BLOCKED | Geen |
| ALT-004 | 4 | Docent heeft geen bewerkbaar doelniveau | Toon dat kopiëren niet kan zonder doelcontext | POP-DOC-OEF-COPY-BLOCKED | Geen |
| ALT-005 | 5 | Doelcategorie hoort niet bij doelniveau | Blokkeer opslag en vraag geldige doelcontext | Inline validatie | Geen |
| ALT-006 | 6 | Docent annuleert bevestiging | Sluit flow zonder kopie | POP-DOC-OEF-COPY-CONFIRM | Geen |
| ALT-007 | 8 | Transactionele opslag faalt | Rollback; geen gedeeltelijke kopie | Generieke foutafhandeling | Geen blijvende mutatie |
| ALT-008 | 10 | Historie kan niet worden vastgelegd | Kopie wordt niet als succesvol afgerond beschouwd | Generieke foutafhandeling | Rollback |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Kopiëren vanuit een open niveau wijzigt de bronoefening niet. |
| BR-002 | Een gekopieerde oefening wordt een zelfstandige concrete oefening in de doelcontext. |
| BR-003 | De kopie krijgt een ParentExerciseId-verwijzing naar de bronoefening. |
| BR-004 | De kopie krijgt standaard IsActive = false. |
| BR-005 | Latere wijzigingen in de kopie beïnvloeden de bron niet. |
| BR-006 | Latere wijzigingen in de bron beïnvloeden bestaande kopieën niet automatisch. |
| BR-007 | Leerlingruns, resultaten en geschiedenis worden nooit meegekopieerd. |
| BR-008 | De docent moet de doelcontext kunnen bewerken op het moment van kopiëren. |
| BR-009 | De technische moduleverwijzing mag alleen worden overgenomen wanneer dit volgens modulebeschikbaarheid veilig is. |
| BR-010 | De kopieeractie moet auditbaar zijn met ActionType COPY_FROM_PARENT. |
| BR-011 | Kopiëren is geen modulemigratie en wijzigt ExerciseModules niet. |
| BR-012 | De kopie mag pas leerlingzichtbaar worden na een aparte activeringsflow. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| SourceExerciseId | Moet verwijzen naar een bestaande bronoefening in een zichtbaar open niveau. |
| SourceLevelId | Moet de open-zichtbaarheidsregel ondersteunen voor de docentcontext. |
| TargetLevelId | Moet bestaan en bewerkbaar zijn voor de docent als eigenaar of actieve collaborator. |
| TargetCategoryId | Moet actief gekoppeld zijn aan het doelniveau. |
| ExerciseModuleId | Moet volgens de actuele modulebeschikbaarheidsregels voor een nieuwe kopie gebruikt mogen worden. |
| ParentExerciseId | Wordt server-side gezet op de bronoefening en is niet clientgestuurd. |
| ModuleConfigurationJsonBase64 | Wordt als startconfiguratie gekopieerd zonder inhoudelijke herinterpretatie door de frontend. |
| IsActive | Wordt bij de kopie server-side false gezet. |
| CreatedByUserId | Komt uit de server-side docentcontext. |
| ExerciseHistory.ActionType | Moet COPY_FROM_PARENT bevatten voor de kopieeractie. |
| Clientstate | Mag bronzichtbaarheid, doelrechten of modulebeschikbaarheid niet bepalen. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 1 | Read | Exercises | Bronoefening wordt gelezen. |
| 2 | Read | Levels | Open zichtbaarheid van het bronniveau wordt gecontroleerd. |
| 3 | Read | ExerciseModules | Modulebeschikbaarheid wordt gecontroleerd. |
| 4 | Read | Levels / LevelCategories | Bewerkbare doelcontexten worden geladen. |
| 8 | Create | Exercises | Nieuwe oefening wordt aangemaakt in de doelcontext. |
| 8 | Set | Exercises.ParentExerciseId | Verwijzing naar de bronoefening wordt gezet. |
| 9 | Set | Exercises.IsActive | Nieuwe kopie wordt In onderhoud geplaatst. |
| 10 | Create | ExerciseHistory | COPY_FROM_PARENT wordt vastgelegd. |
| 11 | Event | ExerciseCopiedFromParent | Domeinevent voor readmodelverversing en auditafleiding. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
| Bron-Exercises-record | De bronoefening wordt niet gewijzigd. |
| ExerciseRuns | Runs en resultaten worden niet gekopieerd. |
| ExerciseRunProgress | Voortgangsregels worden niet gekopieerd. |
| Categories | Centrale categorie-identiteit wordt niet gewijzigd. |
| ExerciseModules | Technische moduledefinities worden alleen gelezen. |
| StudentAuthorizations | Deze usecase kent geen leerlingtoegang toe en trekt geen leerlingtoegang in. |
| SystemMessages | Deze usecase maakt geen systeembericht aan. |
| PrivateMessages | Deze usecase maakt geen privébericht aan. |
| RelationshipInvitations | Relatievorming blijft buiten scope. |
| Roles / UserRoles | Rollen en roltoekenningen worden niet gewijzigd. |
13. State diagram
Deze usecase raakt geen apart statusmodel, maar zet wel de gebruiksstatus van de nieuwe kopie expliciet op In onderhoud via Exercises.IsActive = false. De statuswijziging naar Actief hoort bij UC-DOC-OEF-006.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
Normale kopieerroute
Geblokkeerde kopieerroute
17. Popupverwijzingen
| PopupKey | Moment | Doel |
|---|---|---|
POP-DOC-OEF-COPY-CONFIRM | Vóór definitief aanmaken van de kopie | Bevestigen dat een zelfstandige kopie wordt gemaakt. |
POP-DOC-OEF-COPY-SUCCESS | Na succesvolle kopie | Terugkoppelen dat de kopie in onderhoud is aangemaakt. |
POP-DOC-OEF-COPY-BLOCKED | Wanneer bron-, doel- of modulecontext ongeldig is | Uitleggen dat kopiëren niet mogelijk is. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Beschrijft dat docenten open oefeningen alleen via een expliciete kopieeractie als startpunt gebruiken en dat de bron niet wijzigt. |
| Technisch Ontwerp | Technisch Ontwerp: oefencatalogus, oefenmodulecontract, oefenruns en testuitvoering en background jobs beschrijven de technische uitwerking. Beschrijf transactionele aanmaak van de kopie, ParentExerciseId, IsActive=false en ExerciseHistory COPY_FROM_PARENT. |
| Software Requirements Specification | Leg eisen vast voor broncontrole, doelcontextcontrole, geen runkopie, audit en standaard In onderhoud. |
| Database-informatie | Controleer Exercises.ParentExerciseId, ExerciseHistory.ActionType COPY_FROM_PARENT en modulebeschikbaarheidsregels. |
| Ontwerpbronnen | Beschrijven business rules, command-register, event-register, popup-register en matrices bij. |
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-DOC-OEF-007-001 | SRS-CAT-006 SRS-LRN-009 SRS-TCH-002 AC-CAT-006 AC-LRN-009 AC-TCH-002 | Een docent toestaan een kopieerbare oefening uit een open niveau als zelfstandige oefening in een eigen doelcontext te kopiëren |
REQ-UC-DOC-OEF-007-002 | SRS-AUTH-001 SRS-CAT-006 SRS-LRN-009 SRS-TCH-002 AC-AUTH-001 AC-CAT-006 AC-LRN-009 AC-TCH-002 | Vóór kopiëren server-side controleren of de bronoefening via een open niveau zichtbaar is |
REQ-UC-DOC-OEF-007-003 | SRS-CAT-001 SRS-TCH-002 AC-CAT-001 AC-TCH-002 | Vóór kopiëren controleren of de docent het doelniveau en de doelcategorie mag bewerken |
REQ-UC-DOC-OEF-007-004 | SRS-LRN-009 SRS-TCH-002 AC-LRN-009 AC-TCH-002 | Een gekopieerde oefening aanmaken met ParentExerciseId naar de bronoefening |
REQ-UC-DOC-OEF-007-005 | SRS-LRN-009 SRS-TCH-002 AC-LRN-009 AC-TCH-002 | Een gekopieerde oefening standaard In onderhoud plaatsen |
REQ-UC-DOC-OEF-007-006 | SRS-LRN-003 SRS-TCH-002 AC-LRN-003 AC-TCH-002 | Leerlingruns, voortgang of resultaten niet kopiëren bij het kopiëren van een oefening |
REQ-UC-DOC-OEF-007-007 | SRS-TCH-001 SRS-NFR-AUD-001 AC-TCH-001 AC-NFR-AUD-001 | De kopieeractie auditbaar vastleggen in ExerciseHistory |
REQ-UC-DOC-OEF-007-008 | SRS-AUTH-001 SRS-TCH-001 SRS-MOD-003 AC-AUTH-001 AC-TCH-001 AC-MOD-003 | Kopiëren blokkeren wanneer bron, doelcontext of modulebeschikbaarheid ongeldig is |
REQ-UC-DOC-OEF-007-009 | SRS-LRN-009 SRS-TCH-002 AC-LRN-009 AC-TCH-002 | De bronoefening ongewijzigd laten bij het aanmaken van een kopie |
REQ-UC-DOC-OEF-007-010 | SRS-TCH-001 AC-TCH-001 | De kopie zelfstandig wijzigbaar maken zonder automatische synchronisatie met de bron |