Statusmodellen
Dit document beschrijft statuswaarden en statusovergangen voor domeinen waarin statusgedrag belangrijk is.
Tabelstructuur statusmodel
| Statusmodel-ID | Domein | Entiteit | Status / functionele state | Betekenis | Overgang naar | Trigger / command |
|---|---|---|---|---|---|---|
| SM-REL-001 | Relaties | RelationshipInvitations | Pending | Uitnodiging is aangemaakt maar nog niet verwerkt. | Accepted / Rejected / Expired / Cancelled | Acceptatie, afwijzing, termijnverloop of intrekken |
| SM-REL-002 | Relaties | RelationshipInvitations | Pending met ToUserId gevuld | Uitnodiging is gericht aan een bestaande OefenHub-gebruiker. | Accepted / Rejected / Expired / Cancelled | Ontvanger verwerkt uitnodiging via systeembericht of termijn verloopt |
| SM-REL-003 | Relaties | RelationshipInvitations | Pending met ToEmail gevuld en ToUserId = null | Uitnodiging is gericht aan een nog niet geregistreerd e-mailadres. | Pending met ToUserId gevuld / Expired / Cancelled | Registratie binnen 7 dagen, termijnverloop of intrekken |
| SM-REL-004 | Relaties | RelationshipInvitations | Pending met ontbrekende doelrolkeuze | Ontvanger is bekend maar moet de doelrol nog bewust kiezen of activeren voordat acceptatie afgerond kan worden. | Accepted / Rejected / Expired | Rolkeuze + acceptatie, afwijzing of termijnverloop |
| SM-REL-005 | Relaties | RelationshipInvitations | Accepted | Ontvanger heeft geaccepteerd; UserRelationships is aangemaakt of geactiveerd. | Eindstatus | Acceptatie via UC-GEN-REL-005 |
| SM-REL-006 | Relaties | RelationshipInvitations | Rejected | Ontvanger heeft afgewezen; er wordt geen relatie aangemaakt. | Eindstatus | Afwijzing via UC-GEN-REL-005 |
| SM-REL-007 | Relaties | RelationshipInvitations | Expired | Uitnodiging is verlopen en niet meer accepteerbaar. | Eindstatus | Geplande taak of runtime-vervalcontrole |
| SM-REL-008 | Relaties | RelationshipInvitations | Cancelled | Uitnodiging is ingetrokken door de uitnodiger voordat deze is verwerkt. | Eindstatus | Intrekactie door uitnodiger |
| SM-REL-009 | Relaties | UserRelationships | Actief | Relatie is geldig en kan relatieafhankelijke functionaliteit ontsluiten. | Inactief | Ontkoppelen, beheeractie of domeinregel |
| SM-REL-010 | Relaties | UserRelationships | Inactief | Relatie is soft-gedeactiveerd en geeft geen toekomstige relatieafhankelijke toegang meer. | Eindstatus of nieuw relatieproces | Ontkoppeling via UC-GEN-REL-004 |
| SM-REL-011 | Relaties | Ontkoppelverzoek | In behandeling | Er is een verzoek om de relatie te beëindigen, maar de relatie is nog niet direct gedeactiveerd. | Geaccepteerd / afgewezen / vervallen | Vervolgafhandeling volgens relatieflow: acceptatie, afwijzing, verval of bevoegde deactivatie |
| SM-MSG-001 | Berichten | SystemMessages | Ongelezen | ReadAtUtc is leeg en het systeembericht telt mee voor de gebruikergebonden ongelezenteller. | Gelezen | Openen via UC-GEN-MSG-003 of markeren als gelezen via UC-GEN-MSG-001 |
| SM-MSG-002 | Berichten | SystemMessages | Gelezen | ReadAtUtc is gevuld en het systeembericht telt niet als ongelezen. | Ongelezen | Markeren als ongelezen via UC-GEN-MSG-001 |
| SM-MSG-003 | Berichten | PrivateMessageThreadParticipants | Zichtbaar in mailbox | DeletedAtUtc is leeg en de thread mag in het eigen berichtenoverzicht verschijnen. | Uit eigen mailbox verwijderd | Verwijderen privéthread via UC-GEN-MSG-005 |
| SM-MSG-004 | Berichten | PrivateMessageThreadParticipants | Uit eigen mailbox verwijderd | DeletedAtUtc is gevuld; de thread blijft voor andere deelnemers en historie bestaan. | Eindstatus voor deze mailboxzichtbaarheid | Gebruikergebonden mailboxverwijdering |
| SM-MSG-005 | Berichten | Privéthread-readstate | Ongelezen | Er bestaan nieuwe berichten of thread-events na de laatst bekende leespositie van deze deelnemer. | Gelezen | Openen via UC-GEN-MSG-003, openen van threadpagina met inline antwoordblok of markeren als gelezen via UC-GEN-MSG-001 |
| SM-MSG-006 | Berichten | Privéthread-readstate | Gelezen | De deelnemer heeft de relevante bericht- en thread-eventpositie gelezen. | Ongelezen | Markeren als ongelezen of nieuwe bericht-/thread-eventactiviteit via onder meer UC-GEN-MSG-002 en UC-GEN-MSG-004 |
| SM-MSG-007 | Berichten | Antwoordverwerking privéthread | Invoer bezig | Gebruiker typt in het inline antwoordblok en heeft nog niet verzonden of geannuleerd. | Verzonden / geannuleerd / geblokkeerd | UC-GEN-MSG-004 |
| SM-MSG-008 | Berichten | Antwoordverwerking privéthread | Verzonden | Nieuw privébericht is transactioneel opgeslagen en threadmetadata/readstate zijn bijgewerkt. | Eindstatus voor deze verzendactie | UC-GEN-MSG-004 |
| SM-MSG-009 | Berichten | Antwoordverwerking privéthread | Geblokkeerd | Verzenden is geweigerd door validatie, autorisatie, featurestatus of relatiecontext. | Invoer bezig of eindstatus zonder opslag | UC-GEN-MSG-004 |
| SM-MSG-010 | Berichten | Nieuw-privéberichtverwerking | Invoer bezig | Gebruiker heeft opstelpagina geopend en nog niet verzonden of geannuleerd. | Verzonden / geannuleerd / geblokkeerd | UC-GEN-MSG-002 |
| SM-MSG-011 | Berichten | Nieuw-privéberichtverwerking | Verzonden | Threadcontext, participants, bericht en readstate zijn transactioneel opgeslagen. | Eindstatus voor deze verzendactie | UC-GEN-MSG-002 |
| SM-MSG-012 | Berichten | Nieuw-privéberichtverwerking | Geblokkeerd | Verzenden is geweigerd door validatie, autorisatie, featurestatus of relatiecontext. | Invoer bezig of eindstatus zonder opslag | UC-GEN-MSG-002 |
| SM-MSG-013 | Berichten | Privéthread-verwijderverwerking | Bevestiging gevraagd | Gebruiker heeft verwijderactie gekozen en de bevestigingspopup is zichtbaar. | Verwijderd voor participant / geannuleerd / geblokkeerd | UC-GEN-MSG-005 |
| SM-MSG-014 | Berichten | Privéthread-verwijderverwerking | Verwijderd voor participant | Eigen participantregel is gemarkeerd als uit de mailbox verwijderd. | Eindstatus voor deze mailboxzichtbaarheid | UC-GEN-MSG-005 |
| SM-MSG-015 | Berichten | Privéthread-verwijderverwerking | Geblokkeerd | Verwijderen is geweigerd door objecttype, autorisatie, reeds verwijderde context of technische fout. | Geen mutatie of bestaande eindstatus | UC-GEN-MSG-005 |
| SM-TIC-001 | Meldingen | Tickets | Nieuw | Melding is aangemaakt en nog niet opgepakt. | In behandeling / Wacht op gebruiker / Gesloten | Assignment, beheerreactie of sluitactie |
| SM-EXE-001 | Oefenen | ExerciseRuns | Lopend | Run is gestart en nog niet afgerond. | Afgerond / Onderbroken | Laatste vraag afgerond of gebruiker verlaat run |
Meldingen — ticketstatus en gebruikersstatus
| Status / toestand | Technische bron | Betekenis | Overgang / trigger | Audit |
|---|---|---|---|---|
| New | Tickets.Status | Melding is aangemaakt en heeft geen actieve beheerderkoppeling. | UC-GEN-TIC-001; UC-GEN-TIC-014 na beheerderheropenen | TicketHistory |
| InProgress | Tickets.Status + actieve TicketAssignments | Minimaal één beheerder behandelt de melding. | UC-GEN-TIC-010; gebruikersreactie op WaitingForUser; heropenen met actieve assignment | TicketHistory |
| WaitingForUser | Tickets.Status | Beheer wacht op reactie van de melder. | UC-GEN-TIC-011 wanneer externe informatie wordt gevraagd | TicketHistory en systeembericht |
| Closed | Tickets.Status + TicketClosures | Melding is formeel gesloten of opgelost. | UC-GEN-TIC-005, UC-GEN-TIC-013, UC-GEN-TIC-015 | TicketClosures, TicketHistory |
| Opgelost | Afgeleid uit actuele TicketClosures.ReopenDeadlineUtc | Gebruikersgerichte toestand zolang heropenen nog mogelijk is. | Formele oplossing met heropentermijn | Geen aparte statusrij |
| Gesloten | Afgeleid | Gebruikersgerichte toestand na acceptatie, verlopen heropentermijn of sluiting zonder heropenmogelijkheid. | UC-GEN-TIC-005, UC-GEN-TIC-006 of periodieke verwerking van verlopen termijn via UC-GEN-TIC-016 | TicketHistory waar van toepassing |
Regel: externe beheercommunicatie, oplossen/sluiten en doorzetten naar docent vereisen een actieve behandelcontext. Een melding met status New moet daarom eerst via beheerderkoppeling behandelbaar worden gemaakt.
Regel: verlopen heropentermijnen worden niet door een afzonderlijke schedulerjob per melding verwerkt, maar door een periodieke TickerQ-verwerking die minimaal iedere 12 uur op actuele databasecriteria controleert welke gesloten meldingen gebruikersgericht definitief Gesloten zijn.
Profiel, voorkeuren en toegankelijkheid
| Toestand | Technische bron | Betekenis | Overgang / trigger | Audit |
|---|---|---|---|---|
| Profiel volledig | Applicatieprofiel | De verplichte profielcontext, waaronder niveau waar verplicht, is aanwezig. | Profielgegevens wijzigen of verplicht niveau instellen | Profielhistory/logging waar ingericht |
| Niveau ontbreekt | Applicatieprofiel | De gebruiker mist een verplicht niveau en wordt naar profielcontext geleid. | Eerste login of openen van beschermde context zonder niveau | Logging waar nodig |
| Toegankelijkheid actief | Featuretoggle + UserSettings | Toegankelijkheidsinstellingen worden aangeboden en toegepast. | Feature staat aan; gebruiker wijzigt eigen instellingen | Instellingwijziging |
| Toegankelijkheid uitgeschakeld | Featuretoggle | Pagina/bediening wordt niet aangeboden; bestaande waarden blijven bewaard maar worden niet toegepast. | Beheer zet feature uit | Beheerhistory |
| Voorkeur actief | UserSettings | Voorkeur beïnvloedt presentatiegedrag binnen de toegestane context. | Gebruiker wijzigt voorkeur | Instellingwijziging |
Systeemnotificaties
| Toestand | Technische bron | Betekenis | Overgang / trigger | Audit |
|---|---|---|---|---|
| Gepland | UTC-startmoment in toekomst | Notificatie bestaat maar is nog niet zichtbaar. | Tijdvenster bereikt startmoment | Beheerhistory, geen gebruikersmutatie |
| Actief | UTC-startmoment bereikt en eindmoment leeg of toekomst | Notificatie kan worden getoond aan passende doelgroep. | UC-GEN-NOT-001 | Geen server-side gezienlog |
| Bijna verlopen | Afgeleid: eindmoment minder dan 24 uur in toekomst | Beheerindicatie; geen aparte technische trigger. | Tijd verstrijkt | Geen aparte statusmutatie |
| Verlopen | UTC-eindmoment in verleden | Notificatie wordt niet meer getoond. | Tijd verstrijkt of handmatig uitschakelen | Beheerhistory |
| Gesloten in huidige reeks | Runtime UI-state | Notificatie is door gebruiker gesloten en wordt niet direct opnieuw in dezelfde reeks getoond. | UC-GEN-NOT-002 | Geen persistente status |
| Gemarkeerd in browser | Browsermarker | OncePerBrowser-notificatie is in deze browser verwerkt. | UC-GEN-NOT-002 / UC-GEN-NOT-003 | Geen server-side registratie |
| Statusmodel-ID | Domein | Entiteit | Status / functionele state | Betekenis | Overgang naar | Trigger / command |
|---|---|---|---|---|---|---|
| SM-ACC-001 | Account | Users + identity-providercontext | Geen intern account | De identity provider heeft een gebruiker geauthenticeerd, maar OefenHub kent nog geen intern account voor de ExternalId. | Actief intern account / provisioning geblokkeerd | UC-GEN-ACC-001 |
| SM-ACC-002 | Account | Users | Actief intern account | Het interne account bestaat en Users.IsActive = true. | Gedeactiveerd/geanonimiseerd | Accountverwijdering, beheeractie of anonimisering |
| SM-ACC-003 | Account | Users | Gedeactiveerd of geanonimiseerd | Het account mag geen reguliere OefenHub-toegang meer krijgen. | Eindtoestand of beheerherstel buiten deze usecases | UC-GEN-ACC-002, UC-GEN-ACC-004, UC-GEN-ACC-005 |
| SM-ACC-004 | Accountcontext | Afgeleide sessiecontext | Geen actieve rolcontext | De gebruiker is geauthenticeerd en actief, maar heeft geen bruikbare actieve rolcontext. | Beperkte context zonder rol / roltoekenning via aparte flow | UC-GEN-ACC-003 |
| SM-ACC-005 | Accountcontext | Afgeleide sessiecontext | Onvolledige verplichte context | Een verplichte profiel- of niveaucontext ontbreekt. | Reguliere context na bestaande profiel- of niveauflow | UC-GEN-ACC-003 |
| SM-ACC-006 | Sessieverwerking | Technische applicatiesessie | OefenHub-sessie actief | De gebruiker heeft een geldige lokale applicatiecontext. | Sessie beëindigd / verlopen | UC-GEN-ACC-006 |
| SM-ACC-007 | Sessieverwerking | Technische applicatiesessie | OefenHub-sessie beëindigd | Lokale applicatiecontext is beëindigd of ongeldig. | Nieuwe sessie na login | UC-GEN-ACC-006 |
Leerling- en docentstatuscontexten
Exercise run lifecycle
Functionele toestanden van een exercise run:
Created/ aangemaakt;InProgress/ bezig of hervatbaar;Interrupted/ niet afgerond maar verlaten, functioneel afgeleid uit ontbrekend afrondmoment en opgeslagen voortgang;Completed/ afgerond met opgeslagen totalen en statistieken;TestRun/ docenttest, herkenbaar via testvlag en uitgesloten van normale leerlinggeschiedenis.
Deze toestanden worden primair afgeleid uit bestaande runvelden zoals startmoment, afrondmoment, testvlag en voortgang. Er wordt geen aparte zware statusmachine vereist voor normale leerlingruns.
Oefeningstatus
Concrete oefeningen kennen minimaal de functionele toestand In onderhoud (IsActive = false) en Actief (IsActive = true). Alleen actieve oefeningen zijn beschikbaar voor normaal leerlinggebruik. Wijziging van status vereist bevoegde docent- of beheercontext en auditregistratie.
Gedeelde oefening
Een ontvangen gedeelde oefening kan zichtbaar, gestart, afgerond via eigen run, opnieuw gemaakt of uit het eigen overzicht verwijderd zijn. Verwijdering uit het overzicht verwijdert geen afgeronde runs uit geschiedenis.
Collaboratorstatus
Collaboratorkoppelingen zijn actief of inactief. Inactieve collaborators behouden historie maar leveren geen actuele bewerkrechten meer op. Eigenaarschapsoverdracht gebruikt een eigen overdrachtsregistratie en is geen collaboratorstatus.
Live-meekijksessie
Een live-meekijksessie kent functioneel de toestanden beschikbaar, gestart, actief, beëindigd door gebruiker, beëindigd door leerlingcontext of beëindigd door verbindingsverlies. Historische vastlegging gebeurt via start- en eindmomenten in LiveViewAudit of gelijkwaardige audit.
Invulregels
| Onderwerp | Regel |
|---|---|
| Afgeleide status | Benoem wanneer een status niet als losse waarheid wordt opgeslagen maar runtime wordt afgeleid. |
| Trigger | Elke overgang moet een functionele trigger of command hebben. |
| Historie | Benoem of een overgang history/audit moet opleveren. |
| Functionele state | Gebruik een functionele state wanneer dezelfde technische status aanvullende betekenis krijgt door velden zoals ToUserId, ToEmail of doelrolkeuze. |
| Geen UI-status | Leg hier domeinstatus vast, geen stylingstatus. |
Beheerder- en ouder-/voogdcontexten
| Statusmodel-ID | Domein | Entiteit | Status / functionele state | Betekenis | Overgang naar | Trigger / command |
|---|---|---|---|---|---|---|
| SM-BEH-NOT-001 | Systeemnotificaties | SiteNotifications | Gepland | Startmoment ligt in de toekomst. | Actief / Uitgeschakeld | Tijdverloop of uitschakelen |
| SM-BEH-NOT-002 | Systeemnotificaties | SiteNotifications | Actief | Startmoment bereikt en geen verlopen eindmoment. | Bijna verlopen / Verlopen / Uitgeschakeld | Tijdverloop of uitschakelen |
| SM-BEH-NOT-003 | Systeemnotificaties | SiteNotifications | Bijna verlopen | Eindmoment ligt minder dan 24 uur in de toekomst. | Verlopen / Uitgeschakeld | Tijdverloop of uitschakelen |
| SM-BEH-NOT-004 | Systeemnotificaties | SiteNotifications | Verlopen | Eindmoment ligt in het verleden. | Eindstatus | Tijdverloop |
| SM-BEH-CAT-001 | Categoriebeheer | Categories | Actief | Categorie is zichtbaar/selecteerbaar volgens contextregels. | Uitgefaseerd / Inactief | Statuswijziging of migratie |
| SM-BEH-CAT-002 | Categoriebeheer | Categories | Uitgefaseerd | Categorie blijft historisch herleidbaar maar is niet langer kiesbaar voor nieuwe koppelingen. | Inactief / Hersteld | Statuswijziging |
| SM-BEH-CAT-003 | Categoriebeheer | CategoryMigration | Voorbereid | Broncategorie, doelcategorie en impact zijn gecontroleerd. | Uitgevoerd / Geannuleerd / Geblokkeerd | Migratiebevestiging of validatiefout |
| SM-BEH-CAT-004 | Categoriebeheer | CategoryMigration | Uitgevoerd | Koppelingen zijn naar doelcategorie overgezet en history is vastgelegd. | Eindstatus | MigrateCategory |
| SM-BEH-MOD-001 | Modulebeheer | ExerciseModules | Actief | Module is inzetbaar voor nieuwe of bestaande concrete oefeningen. | Inactief / Alleen testzichtbaar | Statuswijziging |
| SM-BEH-MOD-002 | Modulebeheer | ExerciseModules | Inactief | Module is niet inzetbaar voor nieuwe configuraties. | Actief | Statuswijziging |
| SM-BEH-MOD-003 | Modulebeheer | ExerciseModules | Testzichtbaar | Module is zichtbaar voor TestDocent-context, los van normale inzetbaarheid. | Niet testzichtbaar | Testzichtbaarheid wijzigen |
| SM-BEH-MOD-004 | Modulebeheer | ExerciseModuleMigration | Proef | Eén oefening wordt gecontroleerd gemigreerd. | Goedgekeurd / Geblokkeerd | Proefmigratiecontrole |
| SM-BEH-MOD-005 | Modulebeheer | ExerciseModuleMigration | Uitgevoerd | Scope is gemigreerd en audit is vastgelegd. | Eindstatus | Modulemigratie |
| SM-BEH-ACC-001 | Accountbeheer | Users | Actief | Account kan reguliere OefenHub-context krijgen. | Gedeactiveerd / Geanonimiseerd | Beheerderactie of accountverwijdering |
| SM-BEH-ACC-002 | Accountbeheer | Users | Gedeactiveerd | Account is tijdelijk geblokkeerd maar historie blijft bestaan. | Actief / Geanonimiseerd | Heractiveren of anonimisering |
| SM-BEH-ACC-003 | Accountbeheer | Users | Geanonimiseerd | Actuele persoonsgegevens en toegang zijn beëindigd. | Eindstatus | Anonimisering |
| SM-OVG-LIVE-001 | Ouder/voogd live | LiveViewAudit | Actief | Ouder/voogd kijkt live mee met actieve oefenrun. | Beëindigd / Verbroken | Stopactie, sessie-einde of verbindingsverlies |
| SM-OVG-LIVE-002 | Ouder/voogd live | LiveViewAudit | Beëindigd | Meekijksessie is normaal afgesloten. | Eindstatus | EndGuardianLiveView |
| SM-OVG-LIVE-003 | Ouder/voogd live | LiveViewAudit | Verbroken | Meekijksessie is beëindigd door verbindingsverlies of leerlingcontext-einde. | Eindstatus | Reconnect mislukt of run beëindigd |
Ouder-/voogdresultaten en live meekijken
| ID | Domein | Object / context | Status / toestand | Betekenis | Volgende toestand | Trigger |
|---|---|---|---|---|---|---|
| SM-OVG-RES-001 | Ouder/voogd resultaten | Resultaatraadpleging | Geautoriseerd | Actieve ouder-/voogdrelatie bestaat en de run hoort bij het gekoppelde kind. | Read-only getoond | Detail-, filter- of exportverzoek |
| SM-OVG-RES-002 | Ouder/voogd resultaten | Resultaatraadpleging | Geweigerd | Relatie ontbreekt, is beëindigd of route/run hoort niet bij de relatie. | Eindstatus | Server-side autorisatiecontrole |
| SM-OVG-LIVE-004 | Ouder/voogd live | Browse-modus | Browse | Meekijker bekijkt lokaal een andere vraag dan de actuele livevraag. | Live | Terug naar actuele livevraag |
| SM-OVG-LIVE-005 | Ouder/voogd live | Reconnect | Herstelpogingen | Realtimeverbinding probeert maximaal vijf keer te herstellen. | Live / Verbroken | SignalR-disconnect |
Read-only overzichts-, selectie-, filter-, resultaat- en PDF-exportflows wijzigen geen persistent statusobject. Alleen daadwerkelijke live-meekijksessies hebben een auditbare lifecycle via LiveViewAudit met start- en eindmoment.