UC-GEN-ACC-005 — Account anonimiseren en afhankelijke toegang opruimen
1. Kerngegevens
| Veld | Waarde |
|---|---|
| Usecase-ID | UC-GEN-ACC-005 |
| Naam | Account anonimiseren en afhankelijke toegang opruimen |
| Domein | Generiek / Account |
| Primaire actor | Systeem |
| Secundaire actor(en) | Accountservice, autorisatieservice, relatieservice, berichtenservice, meldingenservice, docentstructuurservice, oefenrunservice, deelservice, live-meekijkservice, accountlogkanaal, database |
| Rolcontext | Interne systeemverwerking na een definitief bevestigde accountverwijdering of een geautoriseerde beheeractie die dezelfde anonimiseer- en opruimregels gebruikt. De actor die de verwijdering heeft geïnitieerd blijft als triggercontext beschikbaar voor logging en autorisatie, maar deze usecase is zelf geen scherm- of gebruikersdialoog. |
| Betrokken schermen | Niet van toepassing als primair scherm. Deze usecase wordt aangeroepen vanuit UC-GEN-ACC-004 — Account verwijderen aanvragen of vanuit een beheerflow voor accountverwijdering. Eventuele voorafgaande bevestigings- of opvolgerkeuzeschermen horen bij de aanroepende usecase. |
| Gerelateerde usecases | UC-GEN-ACC-001 — Eerste login en account provisioning; UC-GEN-ACC-002 — Inloggen en sessie verwerken; UC-GEN-ACC-004 — Account verwijderen aanvragen; UC-GEN-REL-004 — Relatie ontkoppelen; UC-GEN-MSG-005 — Privéberichtthread verwijderen; UC-GEN-TIC-014 — Melding heropenen door beheerder; UC-GEN-PROF-001 — Profiel bekijken |
| Primaire entiteiten | Users, UserRoles, UserSettings, accountlogkanaal |
| Secundaire entiteiten / events | UserRelationships, RelationshipEvents, RelationshipInvitations, SystemMessages, PrivateMessageThreadParticipants, PrivateMessages, Tickets, TicketAssignments, TicketDiscussionMessages, TicketHistory, LevelAuthorizations, Levels, LevelCollaborators, Exercises, ExerciseRuns, SharedExercises, LiveViewAudit, AccountAnonymizationStarted, AccountIdentityAnonymized, AccountAccessRevoked, AccountRelationshipsDeactivated, AccountInvitationsInvalidated, AccountTeachingAccessCleaned, AccountExerciseRunsDetachedFromActiveUse, AccountMessagesDetachedFromActiveUse, AccountTicketsDetachedFromActiveUse, AccountAnonymizationCompleted, AccountAnonymizationFailed |
| Gerelateerde popups | Niet van toepassing |
| Popupregister | Geen nieuwe popupregister-popups. Deze usecase is een systeemverwerking; bevestiging, blokkade of foutmelding hoort bij de aanroepende gebruikers- of beheerusecase. |
| MoSCoW | Must |
2. Omschrijving
Deze usecase beschrijft de interne OefenHub-verwerking waarmee een account na een definitieve verwijderbeslissing wordt geanonimiseerd en waarmee afhankelijke toegang, relaties en openstaande domeincontext worden opgeruimd. De gebruiker ziet deze verwerking niet als afzonderlijke schermflow. Vanuit gebruikersperspectief is de verwijderactie al bevestigd in UC-GEN-ACC-004; deze usecase borgt daarna dat de database- en domeincontext consistent, auditbaar en privacybewust wordt aangepast.
De verwerking anonimiseert zichtbare persoonsgegevens in het interne Users-record, beëindigt reguliere OefenHub-toegang, deactiveert roltoekenningen en relaties waar nodig, maakt openstaande uitnodigingen niet langer bruikbaar, beëindigt afhankelijke niveau- en leerlingtoegang, voorkomt hervatting van open oefenruns en zorgt dat bestaande historie alleen nog onder geanonimiseerde identiteit zichtbaar is.
De externe identity provider blijft buiten deze usecase. OefenHub wijzigt geen wachtwoorden, credentialgegevens, identity-providerclaims of primaire identity-provideraccounts. De interne ExternalId-koppeling blijft zodanig beheerst dat dezelfde externe identiteit niet stilzwijgend opnieuw als regulier nieuw OefenHub-account kan worden geprovisioneerd.
3. Scope
Deze usecase omvat wel:
- uitvoeren van de anonimiseer- en opruimverwerking na een definitieve verwijdertrigger;
- server-side valideren dat de verwerking op precies één intern
Users-record wordt uitgevoerd; - blokkeren van reguliere toegang door het account inactief te maken;
- anonimiseren van zichtbare persoonsgegevens in
Users; - deactiveren of beëindigen van actieve roltoekenningen;
- bewaren van de technische externe koppeling of een gelijkwaardige blokkeerreferentie om ongewenste reprovisioning te voorkomen;
- beëindigen van actieve relaties en vastleggen van relatie-events;
- ongeldig maken van openstaande relatie-uitnodigingen door of naar het account;
- beëindigen van niveauautorisaties, docent-leerlingtoegang en andere rolgebonden toegang die afhankelijk is van het account;
- verwerken van niveau-eigenaarschap en collaboratorcontext wanneer het account docentcontext had;
- loskoppelen van actieve privéberichtdeelnames uit de zichtbare mailboxcontext van het verwijderde account zonder threadinhoud voor andere deelnemers generiek te verwijderen;
- afhandelen van meldingen en ticketcontext waarin het account melder, beheerder of deelnemer was;
- beëindigen van live-meekijksessies of auditcontexten waarin het account actief betrokken was;
- voorkomen dat open oefenruns nog hervatbaar zijn;
- behoud van afgeronde oefengeschiedenis en auditrecords onder geanonimiseerde identiteit;
- vastleggen van technische/accountlogging zonder tokens, wachtwoorden of secrets;
- transactionele bewaking tegen half uitgevoerde anonimisering.
Deze usecase omvat niet:
- de gebruikersbevestiging voor accountverwijdering;
- keuze van een opvolgende eigenaar door de gebruiker;
- beheerderdeactivering als afzonderlijke beheeractie;
- verwijderen of wijzigen van het externe identity-provideraccount;
- wachtwoordcontrole, wachtwoord-reset of credential lifecycle;
- export van persoonsgegevens vóór verwijdering;
- hard verwijderen van afgeronde oefenruns, auditrecords, historie of private-message-inhoud van andere deelnemers;
- aanpassen van functionele rolcatalogi, statuscatalogi, popupdefinities of systeemnotificaties;
- genereren van seeddata, importscripts of implementatiecode.
4. Pre-condities
| ID | Voorwaarde |
|---|---|
| PRE-001 | Er is een definitieve en geautoriseerde verwijdertrigger ontvangen vanuit een aanroepende usecase. |
| PRE-002 | De triggercontext verwijst naar precies één intern Users.Id. |
| PRE-003 | De autorisatie voor de verwijdertrigger is al bepaald door de aanroepende usecase. |
| PRE-004 | De backend kan het interne account inclusief rollen, instellingen en afhankelijkheden server-side laden. |
| PRE-005 | De backend kan bepalen welke relaties, uitnodigingen, berichten, meldingen, oefenruns, gedeelde oefeningen, niveauautorisaties, levels en live-meekijkcontext aan het account gekoppeld zijn. |
| PRE-006 | Wanneer het account eigenaar is van docentniveaus waarvoor meerdere actieve collaborators bestaan, is per niveau een geldige opvolger aangeleverd door de aanroepende usecase. |
| PRE-007 | Het accountlogkanaal is beschikbaar om de lifecycle-actie herleidbaar vast te leggen. |
| PRE-008 | De verwerking kan binnen een beheerste transactie of transactionele workflow worden uitgevoerd, zodat een gedeeltelijke verwerking niet tot een bruikbare half-geanonimiseerde accounttoestand leidt. |
5. Post-condities
| ID | Resultaat |
|---|---|
| POST-001 | Het interne account is geanonimiseerd en reguliere OefenHub-toegang is beëindigd. |
| POST-002 | Zichtbare persoonsgegevens zijn vervangen door de vastgestelde geanonimiseerde waarden. |
| POST-003 | Het account is niet langer bruikbaar als actieve gebruiker in login-, frontend-, relatie-, berichten-, meldingen-, oefen- of live-meekijkflows. |
| POST-004 | Actieve roltoekenningen leveren geen actieve frontendcontext meer op. |
| POST-005 | Actieve relaties van of naar het account zijn administratief beëindigd en vastgelegd via relatie-events. |
| POST-006 | Openstaande relatie-uitnodigingen van of naar het account zijn niet langer accepteerbaar. |
| POST-007 | Afhankelijke leerling-, docent-, ouder-/voogd- en collaborator-toegang is beëindigd of overgedragen volgens de domeinregels. |
| POST-008 | Docentniveaus waarvan het account eigenaar was, hebben een geldige nieuwe eigenaar of zijn historisch/inactief gemaakt volgens de beschikbare collaboratorcontext. |
| POST-009 | Open oefenruns van het account zijn niet meer hervatbaar en tellen niet mee in normale geschiedenis- of statistiekweergaven. |
| POST-010 | Afgeronde geschiedenis, auditrecords en historisch noodzakelijke gegevens blijven raadpleegbaar onder geanonimiseerde identiteit. |
| POST-011 | Privéberichtthreads en systeemberichten blijven voor andere betrokkenen volgens hun eigen domeinregels bestaan, maar het verwijderde account heeft geen mailboxzichtbaarheid of actieve deelname meer. |
| POST-012 | Open meldingen of beheercontexten waarin het account betrokken was, zijn zodanig aangepast dat opvolging door bevoegde gebruikers mogelijk blijft zonder persoonsgegevens van het verwijderde account te tonen. |
| POST-013 | Actieve live-meekijksessies van of naar het account zijn beëindigd; auditregels blijven historisch beschikbaar onder geanonimiseerde identiteit. |
| POST-014 | De anonimisering en opruiming zijn technisch herleidbaar vastgelegd in accountlogging en relevante domeinhistorie. |
| POST-015 | Bij een verwerkingsfout is geen reguliere toegang ontstaan voor een half-geanonimiseerd account en is de fout veilig gelogd. |
6. Trigger
De usecase start wanneer een aanroepende usecase, zoals UC-GEN-ACC-004, na definitieve bevestiging de backend opdracht geeft om het interne account te anonimiseren en de afhankelijke toegang op te ruimen.
7. Normale processtroom
| Stap | Actor | Scherm / component | Actie | Systeemrespons | Data / regel |
|---|---|---|---|---|---|
| 1 | Aanroepende usecase | Accountverwijdering / beheerflow | Geeft een definitieve verwijdertrigger door aan de accountservice. | Accountservice start de systeemverwerking. | De trigger bevat Users.Id, actorcontext en eventuele opvolgerkeuzes. |
| 2 | Accountservice | Backend | Valideert dat precies één intern account wordt verwerkt. | Verwerking gaat alleen door bij een eenduidige accountcontext. | Route- of clientwaarden zijn niet leidend. |
| 3 | Accountservice | Backend | Laadt het actuele Users-record, rollen, instellingen en technische koppeling. | Accountservice bepaalt of het account nog verwerkbaar is. | Users.ExternalId blijft relevant voor reprovisioningblokkade. |
| 4 | Accountservice | Transactiecoördinatie | Start een transactionele verwerking of workflow met rollback-/compensatiebewaking. | De verwerking wordt als één consistente lifecycleactie behandeld. | Half uitgevoerde anonimisering mag geen actieve toegang opleveren. |
| 5 | Accountservice | Accountlogkanaal | Registreert de start van anonimisering. | AccountAnonymizationStarted wordt technisch herleidbaar vastgelegd. | Logging bevat geen wachtwoorden, tokens of secrets. |
| 6 | Autorisatieservice | Rollen en context | Deactiveert of beëindigt actieve UserRoles voor reguliere contextbepaling. | Het account levert geen actieve frontendcontext meer op. | De rolcatalogus zelf wijzigt niet. |
| 7 | Relatieservice | Relaties | Deactiveert actieve relaties van of naar het account. | Relaties blijven historisch aanwezig maar zijn niet actief. | UserRelationships.IsActive = false; relatie-events worden vastgelegd. |
| 8 | Relatieservice | Uitnodigingen | Maakt openstaande uitnodigingen van of naar het account niet langer accepteerbaar. | Pending uitnodigingen kunnen niet meer worden geaccepteerd. | Uitnodigingen worden niet hard verwijderd. |
| 9 | Docentstructuurservice | Niveaus en collaborators | Verwerkt niveaus waarvan het account eigenaar is. | Niveau-eigenaarschap wordt overgedragen of het niveau wordt historisch/inactief gemaakt. | Alleen actieve collaborators kunnen opvolger zijn. |
| 10 | Docentstructuurservice | Niveauautorisaties | Beëindigt leerling- en docenttoegang die afhankelijk is van het account. | Leerlingen, docenten of ouders krijgen geen toegang meer via de verwijderde relatie- of rolcontext. | Historische autorisatieregels blijven herleidbaar. |
| 11 | Berichtenservice | Privéberichten en systeemberichten | Beëindigt actieve mailboxzichtbaarheid en deelname van het verwijderde account. | Andere deelnemers behouden hun zichtbaarheid volgens berichtendomeinregels. | Threadinhoud wordt niet generiek hard verwijderd. |
| 12 | Meldingenservice | Tickets en beheercontext | Verwerkt meldingen waarin het account melder, beheerder of deelnemer is. | Open opvolging blijft mogelijk zonder persoonsgegevens van het account te tonen. | Beheerderkoppelingen van het verwijderde account worden beëindigd. |
| 13 | Oefenrunservice | Oefenruns | Markeert open runs van het account als niet-hervatbaar voor reguliere gebruikersflows. | Open runs verschijnen niet meer in normale geschiedenis, statistiek of verdergaanlogica. | Afgeronde runs blijven historisch beschikbaar onder geanonimiseerde identiteit. |
| 14 | Deelservice | Gedeelde oefeningen | Neutraliseert open gedeelde-oefeningafhankelijkheden van of naar het account waar nodig. | Ontvangers houden reeds uitgevoerde geschiedenis; open afhankelijkheden van het verwijderde account worden niet langer actief bruikbaar. | Ontvangen gedeelde oefeningen worden niet als nieuwe runs aangemaakt door deze flow. |
| 15 | Live-meekijkservice | Live-meekijken | Beëindigt actieve live-meekijksessies waarbij het account meekijkt of bekeken wordt. | Realtime deelname stopt; audit blijft historisch beschikbaar. | LiveViewAudit.EndedAtUtc wordt gevuld waar nodig. |
| 16 | Accountservice | Users | Vervangt zichtbare identiteit door geanonimiseerde waarden en zet reguliere toegang uit. | Het account is geanonimiseerd en inactief. | FirstName = Anoniem, MiddleName = #, LastName = <systeemcode>, Email = anoniem.<code>@verwijderd.acc, IsActive = false. |
| 17 | Accountservice | UserSettings | Maakt gebruikersinstellingen niet langer actief toepasbaar in reguliere flows. | Instellingen blijven alleen historisch gekoppeld waar nodig. | Voorkeuren en toegankelijkheidswaarden leveren geen actieve context meer op. |
| 18 | Accountservice | Accountlogkanaal | Registreert oude en nieuwe zichtbare identiteit in afgeschermde accountlogging. | De lifecycleactie is technisch herleidbaar. | Afgeschermde logging is geen gebruikersgerichte historie. |
| 19 | Accountservice | Transactiecoördinatie | Rondt de verwerking af. | Mutaties worden definitief vastgelegd. | AccountAnonymizationCompleted wordt vastgelegd. |
| 20 | Accountservice | Applicatiesessie | Signaleert aan de aanroepende context dat alle actieve sessies van het account beëindigd moeten zijn. | De gebruiker kan niet doorgaan met een bestaande OefenHub-sessie. | Er is geen aparte OefenHub-sessietabel. |
8. Alternatieve en exceptionele processtromen
| ID | Vanaf stap | Situatie | Systeemgedrag | Popup / melding | Datamutatie |
|---|---|---|---|---|---|
| ALT-001 | 2 | De triggercontext verwijst niet naar precies één intern account. | Backend blokkeert de verwerking en logt de fout. | Niet van toepassing binnen deze systeemusecase. | Geen domeinmutatie; AccountAnonymizationFailed wordt technisch gelogd. |
| ALT-002 | 3 | Het account bestaat niet meer als intern Users-record. | Backend beschouwt de verwerking als ongeldig en rondt niet af. | Niet van toepassing. | Geen domeinmutatie behalve technische logging. |
| ALT-003 | 3 | Het account is al geanonimiseerd of inactief door een eerdere afgeronde verwerking. | Backend voert geen tweede anonimisering uit, maar mag idempotent controleren of afhankelijke toegang al is beëindigd. | Niet van toepassing. | Alleen ontbrekende veilige opruimacties mogen alsnog worden uitgevoerd; dubbele logging wordt vermeden of als idempotente hercontrole gemarkeerd. |
| ALT-004 | 4 | De verwerking kan niet transactioneel worden gestart. | Backend blokkeert de anonimisering voordat persoonsgegevens of toegang worden gewijzigd. | Niet van toepassing. | Geen domeinmutatie; technische logging. |
| ALT-005 | 6 | Roltoekenningen kunnen niet veilig worden beëindigd. | Verwerking wordt afgebroken of teruggedraaid. | Niet van toepassing. | Geen half actieve anonimisering; fout wordt gelogd. |
| ALT-006 | 7 | Een relatie kan door dataconsistentie niet gedeactiveerd worden. | Verwerking wordt afgebroken of de relatieactie wordt in een compensatiestap verwerkt voordat het account als afgerond geanonimiseerd geldt. | Niet van toepassing. | Geen afgeronde accountanonimisering zolang actieve relaties niet veilig zijn verwerkt. |
| ALT-007 | 8 | Een uitnodiging is inmiddels geaccepteerd of verlopen. | Backend verwerkt de actuele status en activeert niets opnieuw. | Niet van toepassing. | Afgehandelde uitnodigingen blijven historisch; alleen nog openstaande uitnodigingen worden ongeldig gemaakt. |
| ALT-008 | 9 | Account is eigenaar van een niveau met meerdere collaborators maar er is geen geldige opvolger aangeleverd. | Verwerking wordt geblokkeerd en teruggegeven aan de aanroepende usecase. | Aanroepende usecase bepaalt de gebruikers- of beheerafhandeling. | Geen anonimisering; AccountAnonymizationFailed of AccountAnonymizationBlocked wordt technisch vastgelegd. |
| ALT-009 | 9 | Account is eigenaar van een niveau zonder actieve collaborator. | Backend maakt het niveau historisch/inactief volgens de accountverwijderingsregel. | Niet van toepassing. | Levels en relevante zichtbaarheid/toegangsrecords worden bijgewerkt. |
| ALT-010 | 9 | Account is eigenaar van een niveau met precies één actieve collaborator. | Backend draagt eigenaarschap automatisch over aan die collaborator. | Niet van toepassing. | Levels.OwnerUserId wordt bijgewerkt; historyregel wordt vastgelegd. |
| ALT-011 | 12 | Account is actieve beheerder op open tickets. | Backend beëindigt de actieve beheerderkoppeling voor dit account en laat de melding opvolgbaar voor overige beheerders. | Niet van toepassing. | TicketAssignments wordt beëindigd; TicketHistory wordt aangevuld. |
| ALT-012 | 12 | Account is melder van een open ticket. | Backend behoudt het ticket historisch en maakt persoonsgegevens geanonimiseerd zichtbaar; gebruikersacties vanuit dit account zijn niet meer mogelijk. | Niet van toepassing. | Ticket blijft bestaan; zichtbare identiteit komt uit geanonimiseerd account. |
| ALT-013 | 13 | Een open oefenrun is onderdeel van een actieve live-meekijksessie. | Backend beëindigt eerst de live-meekijkcontext en maakt de run daarna niet-hervatbaar. | Niet van toepassing. | LiveViewAudit.EndedAtUtc en runcontext worden bijgewerkt. |
| ALT-014 | 16 | De geanonimiseerde e-mail of systeemcode botst met bestaande data. | Backend genereert een nieuwe systeemcode en valideert opnieuw. | Niet van toepassing. | Geen definitieve gebruikersmutatie totdat unieke waarden beschikbaar zijn. |
| ALT-015 | 18 | Accountlogkanaal is niet beschikbaar voor verplichte lifecyclelogging. | Backend rondt de anonimisering niet af zolang verplichte logging niet mogelijk is. | Niet van toepassing. | Transactie wordt afgebroken of teruggedraaid; fout wordt technisch gelogd via beschikbaar fallbackkanaal. |
| ALT-016 | 19 | Afronding faalt na gedeeltelijke mutaties. | Backend voert rollback of compensatie uit volgens de transactionele workflow en markeert de verwerking niet als voltooid. | Niet van toepassing. | Geen reguliere toegang voor half-geanonimiseerd account; fout wordt herleidbaar vastgelegd. |
9. Business rules
| ID | Regel |
|---|---|
| BR-001 | Accountanonimisering mag alleen starten na een definitieve en geautoriseerde verwijdertrigger. |
| BR-002 | De anonimiseerflow verwerkt altijd precies één intern Users-record. |
| BR-003 | OefenHub anonimiseert alleen het interne applicatieaccount en beheert geen identity-provideraccount of credentials. |
| BR-004 | Wachtwoorden, tokens, secrets en identity-providercredentials mogen nooit in accountlogging of domeinhistorie worden opgeslagen. |
| BR-005 | Zichtbare persoonsgegevens worden vervangen door de vastgestelde geanonimiseerde waarden: FirstName = Anoniem, MiddleName = #, LastName = <systeemcode> en Email = anoniem.<code>@verwijderd.acc. |
| BR-006 | De systeemwaarde # in MiddleName is gereserveerd voor systeemgebruik en mag niet door reguliere gebruikersinvoer ontstaan. |
| BR-007 | Na anonimisering staat Users.IsActive = false en mag het account geen reguliere OefenHub-toegang meer krijgen. |
| BR-008 | De interne externe-identiteitskoppeling of een gelijkwaardige blokkeerreferentie moet voorkomen dat dezelfde externe identiteit stilzwijgend opnieuw als regulier nieuw OefenHub-account wordt geprovisioneerd. |
| BR-009 | Actieve UserRoles van het account mogen na anonimisering geen frontendcontext, autorisatie of beheeractie meer opleveren. |
| BR-010 | Actieve relaties van of naar het account worden administratief beëindigd; relationele historie wordt niet hard verwijderd wanneer auditbaarheid nodig is. |
| BR-011 | Openstaande relatie-uitnodigingen van of naar het account worden niet langer accepteerbaar en worden niet opnieuw geactiveerd door latere login of provisioning. |
| BR-012 | Systeemberichten worden niet hard verwijderd als algemene accountopruiming; zij verliezen alleen bruikbaarheid voor het verwijderde account en blijven voor andere domeinverwijzingen volgens de berichtregels bestaan. |
| BR-013 | Privéberichtinhoud en threadhistorie worden niet generiek verwijderd voor andere deelnemers. |
| BR-014 | Mailboxzichtbaarheid en deelname van het verwijderde account worden beëindigd volgens participantgebonden berichtregels. |
| BR-015 | Niveauautorisaties en leerling-/docenttoegang die afhankelijk zijn van het account worden beëindigd of niet langer toepasbaar gemaakt. |
| BR-016 | Een niveau mag na verwijdering van de eigenaar geen onbepaalde actieve eigenaar houden. |
| BR-017 | Bij nul actieve collaborators wordt een niveau historisch/inactief gemaakt volgens de verwijderregel. |
| BR-018 | Bij precies één actieve collaborator wordt eigenaarschap automatisch aan die collaborator overgedragen. |
| BR-019 | Bij meerdere actieve collaborators moet de aanroepende usecase een geldige opvolger hebben aangeleverd voordat anonimisering definitief wordt uitgevoerd. |
| BR-020 | Open oefenruns van het verwijderde account blijven administratief niet-afgerond maar mogen niet hervatbaar zijn en mogen niet in normale geschiedenis- of statistiekweergaven verschijnen. |
| BR-021 | Afgeronde oefenruns blijven historisch raadpleegbaar onder geanonimiseerde identiteit wanneer zij functioneel of administratief nodig blijven. |
| BR-022 | Live-meekijksessies waarbij het account betrokken is worden beëindigd; auditinformatie blijft historisch beschikbaar onder geanonimiseerde identiteit. |
| BR-023 | Open meldingen blijven opvolgbaar voor bevoegde gebruikers, maar persoonsgegevens van het verwijderde account worden niet meer getoond. |
| BR-024 | Accountanonimisering moet transactioneel of via een gecontroleerde workflow worden bewaakt zodat geen bruikbare half-geanonimiseerde accounttoestand ontstaat. |
| BR-025 | Verplichte account lifecycle-logging moet slagen voordat de anonimisering als afgerond wordt beschouwd. |
| BR-026 | Deze systeemusecase introduceert geen aparte sessietabel, accountstatus-tabel of verwijderaanvraagtabel. |
| BR-027 | Seeddata, importscripts en technische implementatiecode vallen buiten deze usecase. |
10. Datavalidatie
| Veld / object | Validatie |
|---|---|
| Verwijdertrigger | Moet afkomstig zijn uit een geautoriseerde aanroepende usecase en moet definitief zijn. |
Users.Id | Moet precies één bestaand intern account aanwijzen. |
| Actorcontext | Moet herleidbaar zijn voor accountlogging, maar bepaalt niet zelfstandig het te anonimiseren account. |
Users.ExternalId | Moet zodanig behouden of vervangen worden door een veilige blokkeerreferentie dat ongewenste reprovisioning voor dezelfde externe identiteit wordt voorkomen. |
| Geanonimiseerde systeemcode | Moet kort, niet-voorspelbaar, niet-persoonsherleidbaar en voldoende uniek zijn. |
| Geanonimiseerd e-mailadres | Moet voldoen aan anoniem.<code>@verwijderd.acc en mag niet botsen met bestaande actieve accountidentiteit. |
MiddleName | De systeemwaarde # mag alleen door deze of een vergelijkbare systeemflow worden gezet. |
Users.IsActive | Moet na succesvolle verwerking false zijn. |
UserRoles | Actieve roltoekenningen van het account mogen na verwerking geen actieve autorisatie meer opleveren. |
| Relaties | Alleen actieve relaties van of naar het account worden gedeactiveerd; inactieve relaties blijven historisch ongewijzigd. |
| Relatie-uitnodigingen | Alleen uitnodigingen die nog openstaand of functioneel bruikbaar zijn worden ongeldig gemaakt; afgehandelde uitnodigingen worden niet heropend. |
| Niveau-opvolger | Moet een actieve collaborator zijn van het betreffende niveau. |
| Niveau zonder opvolger | Mag niet actief met verwijderde eigenaar blijven bestaan. |
| Niveauautorisaties | Toegang afhankelijk van het verwijderde account mag na verwerking niet meer autoriseren. |
| Privéberichtdeelnames | De verwijderde gebruiker mag geen actieve mailboxzichtbaarheid of antwoordmogelijkheid behouden. |
| Tickets | Tickets mogen niet naar persoonsgegevens van het verwijderde account renderen, maar blijven historisch en beheersmatig opvolgbaar. |
| Open oefenruns | Mogen niet meer hervatbaar zijn en mogen niet in normale geschiedenis- of statistiekweergaven verschijnen. |
| Afgeronde oefenruns | Mogen niet worden gekoppeld aan zichtbare persoonsgegevens van de verwijderde gebruiker. |
| Accountlog | Moet oude en nieuwe zichtbare identiteit afgeschermd kunnen vastleggen zonder credentials of tokens. |
11. Datamutaties en events
| Stap | Type | Entiteit / event | Mutatie |
|---|---|---|---|
| 1 | Input | Verwijdertrigger | Ontvangt Users.Id, actorcontext en eventuele opvolgerkeuzes uit de aanroepende usecase. |
| 2 | Read | Users | Valideert dat precies één intern account wordt verwerkt. |
| 3 | Read | Users, UserRoles, UserSettings | Laadt de actuele account-, rol- en instellingencontext. |
| 4 | Technisch | Transactie / workflow | Start gecontroleerde transactionele verwerking. |
| 5 | Technisch event | AccountAnonymizationStarted | Legt de start van de anonimiseerflow vast. |
| 6 | Update | UserRoles | Deactiveert of beëindigt actieve roltoekenningen voor reguliere autorisatie. |
| 6 | Technisch event | AccountAccessRevoked | Legt vast dat applicatietoegang wordt ingetrokken. |
| 7 | Update | UserRelationships | Zet actieve relaties van of naar het account op inactief. |
| 7 | Create | RelationshipEvents | Legt relatiebeëindiging door accountanonimisering vast. |
| 7 | Technisch event | AccountRelationshipsDeactivated | Legt vast dat actieve relaties zijn beëindigd. |
| 8 | Update | RelationshipInvitations | Maakt openstaande uitnodigingen door of naar het account niet langer accepteerbaar. |
| 8 | Technisch event | AccountInvitationsInvalidated | Legt vast dat open uitnodigingen zijn geneutraliseerd. |
| 9 | Update | Levels | Draagt eigenaarschap over of maakt het niveau historisch/inactief. |
| 9 | Update | LevelCollaborators | Beëindigt actieve collaboratorcontext van het verwijderde account waar nodig. |
| 9 | Create | Niveauhistorie / accountlog | Legt eigendomsoverdracht of historisch/inactief maken vast. |
| 10 | Update | LevelAuthorizations | Beëindigt leerling- of docenttoegang die afhankelijk is van het account. |
| 10 | Technisch event | AccountTeachingAccessCleaned | Legt vast dat onderwijsgerelateerde toegang is opgeruimd. |
| 11 | Update | PrivateMessageThreadParticipants | Beëindigt mailboxzichtbaarheid en actieve deelname van het verwijderde account. |
| 11 | Technisch event | AccountMessagesDetachedFromActiveUse | Legt vast dat berichtcontext is losgekoppeld van actief gebruik. |
| 12 | Update | TicketAssignments | Beëindigt actieve beheerderskoppelingen van het verwijderde account. |
| 12 | Update | Tickets / ticketcontext | Zorgt dat open tickets opvolgbaar blijven zonder persoonsgegevens van het account te tonen. |
| 12 | Create | TicketHistory | Legt relevante beëindiging van beheercontext of geanonimiseerde meldercontext vast. |
| 12 | Technisch event | AccountTicketsDetachedFromActiveUse | Legt vast dat meldingencontext is losgekoppeld van actief gebruik. |
| 13 | Update | ExerciseRuns | Maakt open runs niet-hervatbaar en sluit ze uit van normale geschiedenis-/statistiekweergaven. |
| 13 | Technisch event | AccountExerciseRunsDetachedFromActiveUse | Legt vast dat open oefenruns niet meer actief bruikbaar zijn. |
| 14 | Update | SharedExercises | Neutraliseert open gedeelde-oefeningafhankelijkheden van of naar het account waar nodig. |
| 15 | Update | LiveViewAudit | Vult EndedAtUtc voor actieve live-meekijksessies waarbij het account betrokken is. |
| 16 | Update | Users | Vervangt zichtbare persoonsgegevens en zet IsActive = false. |
| 16 | Technisch event | AccountIdentityAnonymized | Legt vast dat zichtbare identiteit is geanonimiseerd. |
| 17 | Update | UserSettings | Maakt instellingen niet langer actief toepasbaar in reguliere gebruikersflows of laat ze alleen historisch gekoppeld. |
| 18 | Log | Accountlogkanaal | Legt oude en nieuwe identiteit afgeschermd vast volgens accountloggerregels. |
| 19 | Technisch event | AccountAnonymizationCompleted | Legt succesvolle afronding vast. |
| 20 | Technisch | Applicatiesessie | Signaleert sessiebeëindiging voor alle actieve applicatiesessies van het account. |
| ALT-001 t/m ALT-016 | Technisch event | AccountAnonymizationFailed / AccountAnonymizationBlocked | Legt geblokkeerde of mislukte verwerking vast zonder afgeronde anonimisering te claimen. |
12. Geen datamutaties
| Entiteit | Reden |
|---|---|
| Identity-provideraccount | De externe identity provider blijft bronhouder voor authenticatie, registratie, wachtwoorden, sessies en e-mailadres als authenticatiegegeven. |
| Wachtwoorden / credentials | OefenHub bewaart, controleert of wijzigt geen wachtwoorden of credentialgegevens. |
| Identity-providerclaims | Claims worden niet aangepast door interne accountanonimisering. |
Roles | De rolcatalogus verandert niet door het anonimiseren van één account. |
ProfileAvatars | De goedgekeurde avatarset wordt niet gewijzigd. |
PrivateMessages | Berichtinhoud wordt niet generiek hard verwijderd; deelnemerszichtbaarheid wordt participantgebonden verwerkt. |
SystemMessages | Systeemberichten worden niet generiek hard verwijderd; actieve bruikbaarheid voor het verwijderde account vervalt. |
Afgeronde ExerciseRuns | Afgeronde runs blijven historisch beschikbaar onder geanonimiseerde identiteit wanneer zij functioneel of administratief nodig blijven. |
| Audit- en historyrecords | Bestaande historie wordt niet hard verwijderd wanneer herleidbaarheid nodig blijft. |
ExerciseModules, Exercises, categorieën en niveaucatalogi | Accountanonimisering wijzigt geen technische modules, oefenconfiguraties of centrale catalogusdefinities. |
SiteNotifications | Accountanonimisering maakt, wijzigt of sluit geen systeemnotificaties. |
PopupDetails / popupregister | Deze systeemusecase gebruikt geen eigen popupdefinities. |
| Nieuwe accountstatus-entiteit | De lifecycle gebruikt bestaande accountvelden, domeinmutaties en logging; er komt geen aparte accountstatus- of verwijderaanvraagtabel. |
| Nieuwe sessietabel | Sessiebeëindiging is technische applicatielogica; er wordt geen OefenHub-sessietabel geïntroduceerd. |
13. State diagram
Er is geen zelfstandig persistent accountstatusmodel naast Users.IsActive, geanonimiseerde identiteit en logging. Het onderstaande diagram toont daarom de afgeleide lifecycle van het interne account tijdens deze systeemverwerking.
14. Decision flow
15. Data lifecycle diagram
16. Sequence diagrammen
16.1 Hoofdroute accountanonimisering
16.2 Blokkade bij ontbrekende opvolger
17. Popupverwijzingen
| PopupKey | Moment | Variant | Doel |
|---|---|---|---|
| Niet van toepassing | Deze usecase toont geen eigen popup. | Niet van toepassing | Bevestigings-, blokkade- en foutmeldingen horen bij de aanroepende gebruikers- of beheerusecase. |
18. Afleiding naar Functioneel Ontwerp / Technisch Ontwerp / Software Requirements Specification
| Doeldocument | Afleiding |
|---|---|
| Functioneel Ontwerp | Beschrijf accountanonimisering als interne vervolgverwerking na bevestigde accountverwijdering, gescheiden van de gebruikersdialoog. |
| Functioneel Ontwerp | Beschrijft dat OefenHub het interne applicatieaccount anonimiseert, reguliere toegang beëindigt en afhankelijke toegang opruimt, zonder het identity-provideraccount te beheren. |
| Functioneel Ontwerp | Beschrijft dat bestaande geschiedenis en auditinformatie onder geanonimiseerde identiteit beschikbaar blijven wanneer dat functioneel of administratief noodzakelijk is. |
| Functioneel Ontwerp | Beschrijf de gevolgen voor relaties, uitnodigingen, niveauautorisaties, docentniveau-eigenaarschap, privéberichten, meldingen, oefenruns, gedeelde oefeningen en live-meekijken. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, relatiebeheer | Beschrijft de transactionele workflow voor accountanonimisering uit, inclusief rollback- of compensatiegedrag bij fouten. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, relatiebeheer | Beschrijft de mutatieregels vast voor Users, UserRoles, UserSettings, UserRelationships, RelationshipInvitations, LevelAuthorizations, Levels, LevelCollaborators, PrivateMessageThreadParticipants, Tickets, ExerciseRuns, SharedExercises en LiveViewAudit. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, relatiebeheer | Beschrijft hoe ExternalId of een veilige blokkeerreferentie ongewenste reprovisioning voor dezelfde externe identiteit voorkomt. |
| Technisch Ontwerp: identiteit, authenticatie en rolcontext, privacy en anonimisering, relatiebeheer | Beschrijft dat account lifecycle-logging oude en nieuwe zichtbare identiteit afgeschermd vastlegt zonder credentials, tokens of secrets. |
| Software Requirements Specification | Bevat requirements voor interne anonimisering, toegangsbeëindiging, afhankelijkheidsopruiming, historische raadpleegbaarheid, transactionele veiligheid en logging. |
| Database-informatie | Beschrijft de relevante datamodelafspraken voor identiteit/autorisatie, relatiebeheer, docentstructuur, communicatie, meldingen, oefenruns en audit/technische uitgangspunten. |
| Ontwerpbronnen | Bevat business rules, autorisatiematrix, domeinobjecten, command-register, event-register en matrices voor accountanonimisering en afhankelijke toegang opruimen. |
| Documentatie-impact | Wijzigingen in deze flow worden beoordeeld op impact voor Functioneel Ontwerp, Technisch Ontwerp, Software Requirements Specification, database-informatie en ontwerpbronnen. |
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-GEN-ACC-005-001 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 SRS-NFR-PRV-001 AC-AUTH-001 AC-ACC-002 AC-ACC-004 AC-NFR-PRV-001 | Na een definitieve en geautoriseerde verwijdertrigger het interne OefenHub-account kunnen anonimiseren |
REQ-UC-GEN-ACC-005-002 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-NFR-PRV-001 | Accountanonimisering uitsluitend uitvoeren op precies één intern Users-record |
REQ-UC-GEN-ACC-005-003 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 | Zichtbare persoonsgegevens vervangen door de vastgestelde geanonimiseerde waarden |
REQ-UC-GEN-ACC-005-004 | SRS-AUTH-001 SRS-ACC-002 SRS-ACC-004 SRS-ACC-006 SRS-NFR-PRV-001 AC-AUTH-001 AC-ACC-002 AC-ACC-004 AC-ACC-006 AC-NFR-PRV-001 | Na anonimisering reguliere OefenHub-toegang blokkeren door het account inactief te maken |
REQ-UC-GEN-ACC-005-005 | SRS-ACC-001 AC-ACC-001 | Voorkomen dat dezelfde externe identiteit stilzwijgend opnieuw als regulier nieuw OefenHub-account wordt geprovisioneerd |
REQ-UC-GEN-ACC-005-006 | SRS-ACC-002 SRS-NFR-SEC-001 SRS-NFR-PRV-001 AC-ACC-002 AC-NFR-SEC-001 AC-NFR-PRV-001 | Geen identity-provideraccount, wachtwoord, credential of identity-providerclaim wijzigen binnen deze usecase |
REQ-UC-GEN-ACC-005-007 | SRS-AUTH-001 SRS-ACC-002 AC-AUTH-001 AC-ACC-002 | Actieve roltoekenningen van het account beëindigen of niet langer autoriserend laten zijn |
REQ-UC-GEN-ACC-005-008 | SRS-ACC-002 SRS-REL-003 SRS-REL-006 SRS-NFR-AUD-001 AC-ACC-002 AC-REL-003 AC-REL-006 AC-NFR-AUD-001 | Actieve relaties van of naar het account administratief beëindigen met behoud van auditbare relatiehistorie |
REQ-UC-GEN-ACC-005-009 | SRS-ACC-002 SRS-REL-002 AC-ACC-002 AC-REL-002 | Openstaande relatie-uitnodigingen van of naar het account niet langer accepteerbaar maken |
REQ-UC-GEN-ACC-005-010 | SRS-AUTH-001 SRS-ACC-002 SRS-LRN-009 SRS-TCH-006 SRS-GUA-001 AC-AUTH-001 AC-ACC-002 AC-LRN-009 AC-TCH-006 AC-GUA-001 | Afhankelijke leerling-, docent-, ouder-/voogd- en collaborator-toegang beëindigen of overdragen volgens de geldende domeinregels |
REQ-UC-GEN-ACC-005-011 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-006 SRS-CAT-005 SRS-TCH-006 AC-ACC-002 AC-ACC-004 AC-ACC-006 AC-CAT-005 AC-TCH-006 | Niveau-eigenaarschap van een verwijderde docent overdragen aan een geldige collaborator of het niveau historisch/inactief maken wanneer geen opvolger bestaat |
REQ-UC-GEN-ACC-005-012 | SRS-ACC-002 SRS-ACC-004 SRS-MSG-003 AC-ACC-002 AC-ACC-004 AC-MSG-003 | Mailboxzichtbaarheid en actieve privéberichtdeelname van het verwijderde account beëindigen zonder threadinhoud voor andere deelnemers generiek te verwijderen |
REQ-UC-GEN-ACC-005-013 | SRS-ACC-002 SRS-ACC-004 SRS-TIC-002 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-TIC-002 AC-NFR-PRV-001 | Open ticket- en meldingencontext zodanig verwerken dat opvolging mogelijk blijft zonder persoonsgegevens van het verwijderde account te tonen |
REQ-UC-GEN-ACC-005-014 | SRS-ACC-002 SRS-LRN-002 SRS-LRN-007 SRS-NFR-AUD-001 AC-ACC-002 AC-LRN-002 AC-LRN-007 AC-NFR-AUD-001 | Open oefenruns van het account niet-hervatbaar maken en uitsluiten van normale geschiedenis- en statistiekweergaven |
REQ-UC-GEN-ACC-005-015 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 SRS-NFR-AUD-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 AC-NFR-AUD-001 | Afgeronde geschiedenis en auditrecords waar nodig behouden onder geanonimiseerde identiteit |
REQ-UC-GEN-ACC-005-016 | SRS-ACC-002 SRS-LIVE-003 SRS-NFR-AUD-001 AC-ACC-002 AC-LIVE-003 AC-NFR-AUD-001 | Actieve live-meekijksessies waarbij het account betrokken is beëindigen en auditinformatie historisch behouden |
REQ-UC-GEN-ACC-005-017 | SRS-ACC-002 SRS-ACC-004 SRS-ACC-008 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-ACC-008 AC-NFR-PRV-001 | Accountanonimisering transactioneel of via een gecontroleerde workflow bewaken om half-geanonimiseerde actieve accounttoestanden te voorkomen |
REQ-UC-GEN-ACC-005-018 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-PRV-001 SRS-NFR-AUD-001 SRS-NFR-LOG-001 AC-ACC-002 AC-ACC-004 AC-NFR-PRV-001 AC-NFR-AUD-001 AC-NFR-LOG-001 | Verplichte account lifecycle-logging vastleggen voordat anonimisering als afgerond geldt |
REQ-UC-GEN-ACC-005-019 | SRS-ACC-002 SRS-NFR-SEC-001 SRS-NFR-PRV-001 SRS-NFR-LOG-001 AC-ACC-002 AC-NFR-SEC-001 AC-NFR-PRV-001 AC-NFR-LOG-001 | In account lifecycle-logging geen wachtwoorden, tokens, secrets of credentialgegevens opslaan |
REQ-UC-GEN-ACC-005-020 | SRS-ACC-002 SRS-ACC-004 SRS-NFR-SEC-001 SRS-NFR-PRV-001 AC-ACC-002 AC-ACC-004 AC-NFR-SEC-001 AC-NFR-PRV-001 | Fouten of blokkades tijdens anonimisering veilig loggen zonder afgeronde anonimisering te claimen wanneer de verwerking niet consistent is afgerond |