Skip to main content

9. Ticket- en meldingsbeheer

Deze pagina is de ERD-inzoomlaag voor het databasehoofdstuk ticket- en meldingsbeheer. De tabeldefinities in dat brondocument blijven leidend; deze pagina biedt een leesbare visuele ingang, zoompaden en compacte diagrammen.

9.1 Doel van deze inzoomlaag

Dit domein beschrijft het meldingen- en ticketsysteem achter de gebruikersgerichte pagina Meldingen. Het domein is functioneel rijker dan één compact ERD kan laten zien, omdat Tickets tegelijk actuele status, behandelcontext, discussie, formele sluitingen, heropeningen, technische momentopname, communicatie naar gebruikers en eventueel doorzetten naar docent raakt.

De belangrijkste ontwerpkeuzes zijn:

  • Tickets bewaart de actuele hoofdtoestand van een melding.
  • Lookup-tabellen zoals TicketStatuses, TicketCategories en TicketResolutionTypes begrenzen status, categorie en afsluitstatus.
  • TicketAssignments bepaalt of er een actieve behandelcontext met één of meerdere beheerders bestaat.
  • TicketDiscussionMessages is inhoudelijke communicatie binnen het ticket en is gescheiden van TicketHistory.
  • TicketClosures is de formele bron voor oplossen, sluiten, heropentermijn en accepteren van een oplossing.
  • TicketReopenRequests maakt heropenen herleidbaar zonder sluitrecords te overschrijven.
  • TicketForwardedToTeacher legt de uitzonderlijke doorzetactie vast en kan via soft links verwijzen naar gegenereerde privéberichtrecords.
  • TicketTechnicalSnapshots bewaart een momentopname van technische context en is geen live contextview.

9.2 Leesroute

VraagStart bijDaarna kijken naar
Wat is de actuele toestand van een melding?TicketsTicketStatuses, CurrentResolutionTypeId, CurrentReopenDeadlineUtc en ClosedAtUtc.
Waarom ziet de gebruiker Opgelost of Gesloten?TicketClosuresDe meest recente relevante sluiting, ReopenDeadlineUtc, AcceptedByUserId en afgeleide UI-status.
Welke beheerder behandelt de melding?TicketAssignmentsAlleen actieve assignments vormen de behandelcontext; historische assignments blijven bewaard.
Waar staat de inhoudelijke communicatie?TicketDiscussionMessagesVisibility = Internal of External bepaalt wie het bericht mag zien.
Waar staat de auditlaag?TicketHistoryCompacte ActionType-regels, niet de volledige discussie of oplossingstekst.
Hoe werkt heropenen?TicketReopenRequestsRequestSource, PreviousClosureId en ResultingStatusId.
Hoe werkt doorzetten naar docent?TicketForwardedToTeacherTicketClosures.ForwardedToTeacherId en gegenereerde privébericht-soft links.
Welke technische context had de melding bij aanmaak?TicketTechnicalSnapshotsSnapshotvelden zoals UserAgent, PageUrl, IpAddress en UserRolesSnapshot.
Hoe wordt de gebruiker geïnformeerd?SystemMessages in communicatieEntityType = Ticket is een logische verwijzing, geen harde FK vanuit Tickets.

9.3 Kern-ERD binnen het ticketdomein

De ticketkern is opgesplitst in twee subdiagrammen. Het eerste diagram toont de actuele bron en waardelijsten. Het tweede diagram toont behandel-, communicatie-, audit- en snapshotrecords rond hetzelfde ticket.

9.3.1 Actuele ticketbron, waardelijsten en sluitbron

9.3.2 Behandeling, discussie, audit, doorzetten en snapshot

Interpretatie

  • Eén Ticket heeft één actuele status via StatusId, maar kan meerdere historische sluitingen en heropeningen hebben.
  • CurrentResolutionTypeId, CurrentReopenDeadlineUtc, ClosedAtUtc en ClosedByUserId op Tickets zijn actuele samenvattingsvelden; de formele sluitbron staat in TicketClosures.
  • TicketTechnicalSnapshots is functioneel één-op-één met Tickets wanneer per ticket één primaire technische momentopname wordt vastgelegd.
  • TicketForwardedToTeacher kan de oorzaak zijn van een formele sluiting met resolutietype ModuleConfiguration.
  • TicketDiscussionMessages en TicketHistory blijven bewust gescheiden: discussie bevat inhoud, history bevat compacte audit.

9.4 Actor- en communicatiecontext

Vrijwel iedere mutatie in het ticketdomein heeft een actor. De actorverwijzingen zijn daarom verticaal gegroepeerd als soft links, zodat duidelijk blijft dat Users een identitybron is en geen harde database-eigenaar van ticketrecords.

Belangrijk onderscheid

RelatieBetekenis
Tickets.CreatedByUserIdDe melder. Deze gebruiker ziet de eigen melding en externe discussie zolang het account actief/toegankelijk is.
TicketAssignments.AdminUserIdBeheerder die actief of historisch aan de melding is gekoppeld.
TicketDiscussionMessages.CreatedByUserIdActor van een discussiebericht. Null is toegestaan voor systeemgegenereerde berichten.
TicketHistory.ActorUserIdActor van een compacte auditactie. Null is toegestaan voor volledig systeemgedreven acties.
TicketForwardedToTeacher.TeacherUserIdDocent die het gegenereerde privébericht ontvangt. Dit maakt geen docent-leerlingrelatie aan.
GeneratedPrivateMessageThreadId / GeneratedPrivateMessageIdOptionele soft links naar de reguliere privéberichtstructuur. Ticketdiscussie zelf wordt niet naar privéberichten gekopieerd en support legt geen harde database-FK naar communication.

9.5 Systeemberichtcontext

Ticketupdates kunnen een systeembericht naar de melder veroorzaken. Die relatie wordt niet als FK op Tickets opgeslagen. De communicatiebron is SystemMessages met EntityType = Ticket en EntityId = Tickets.Id.

Belangrijk hierbij:

  • SystemMessages.RecipientUserId -> Users.Id is een soft link naar het identity-domein en geen harde database-FK.
  • SystemMessages.EntityType = Ticket + EntityId is een beperkte logische verwijzing en geen harde database-FK naar Tickets.
  • Het openen van een systeembericht voert geen ticketactie automatisch uit; ticketdetail, discussie, accepteren of heropenen controleren opnieuw autorisatie en actuele status.
  • Interne beheercommunicatie veroorzaakt geen systeembericht naar de melder.

9.6 Ticket-lifecycle op hoofdlijnen

Afgeleide gebruikersstatus

Opgelost is geen backendstatus en geen record in TicketStatuses. De gebruikersgerichte status wordt afgeleid uit:

  • backendstatus Closed;
  • de actuele of meest recente relevante TicketClosures-registratie;
  • ReopenDeadlineUtc;
  • eventuele acceptatie via AcceptedByUserId en AcceptedAtUtc.

9.7 Sluiten, accepteren en periodiek verlopen

Belangrijke regel: het accepteren van een oplossing en het verlopen van de heropentermijn maken geen tweede sluitrecord aan. De bestaande sluiting blijft de formele bron.

9.8 Heropenen door gebruiker versus beheerder

Belangrijk verschil:

FlowOntkoppelt actieve beheerders?Resulterende statusReden zichtbaar voor melder?
Gebruiker heropentNeeInProgress of New, afhankelijk van actieve assignmentsKan als external discussie zichtbaar zijn.
Beheerder heropentJaNewInterne reden; niet als gebruikersbericht tonen.

9.9 Doorzetten naar docent

Doorzetten naar docent is een samengestelde transactie en hoort daarom niet alleen in TicketHistory thuis.

Belangrijk hierbij:

  • De doorzetactie maakt geen nieuwe docent-leerlingrelatie.
  • De doorzetactie kent geen niveauautorisatie toe.
  • De gegenereerde privéthread blijft onderdeel van het reguliere privéberichtdomein.
  • De ticketdiscussie blijft in TicketDiscussionMessages; alleen het expliciet gegenereerde bericht aan de docent staat in PrivateMessages.
  • De formele sluiting verwijst optioneel terug naar de doorzetactie via TicketClosures.ForwardedToTeacherId.

9.10 Discussie, history en snapshotlaag

LaagTabelSoort informatieZichtbaarheid
Inhoudelijke discussieTicketDiscussionMessagesBerichten, vragen, gebruikersreacties, systeemgegenereerde procesitemsExternal voor melder + beheer; Internal alleen beheer.
Compacte auditTicketHistoryActionType, actor, datum/tijd, compacte oude/nieuwe waardePrimair beheer/audit; reguliere gebruiker ziet niet de volledige history.
Formele sluitingTicketClosuresOplossing, sluitreden, resolutietype, heropentermijn, acceptatieFunctioneel zichtbaar via oplossingstab; technisch bronrecord.
HeropenregistratieTicketReopenRequestsHeropenbron, reden, vorige sluiting, resulterende statusGebruikerreden kan extern zichtbaar zijn; beheerreden blijft intern.
DoorzetactieTicketForwardedToTeacherDocent, beheerder, toelichting, gegenereerde privéberichtverwijzingenBeheergericht; melder krijgt gebruikersgerichte terugkoppeling.
Technische contextTicketTechnicalSnapshotsUser agent, pagina, IP, rolmomentopname, laatst gezienAlleen beheer/analyse; geen gebruikersgerichte actie-informatie.

9.11 Tabellen in dit domein

TabelRol in het modelBrondata of afgeleid?Belangrijkste verantwoordelijkheid
TicketStatusesLookup voor hoofdstatusBrondata / vaste waardelijstBegrenst backendstatussen zoals New, InProgress, WaitingForUser en Closed.
TicketResolutionTypesLookup voor afsluitstatusBrondata / vaste waardelijstBegrenst inhoudelijke afsluitstatussen zoals ClosedByUser of ModuleConfiguration.
TicketCategoriesLookup voor meldingscategorieBrondata / vaste waardelijstClassificeert meldingen zoals technisch probleem, inhoudelijke fout, wijzigingsverzoek of overig.
TicketsHoofdrecord van een meldingBrondataActuele toestand, melder, onderwerp, categorie, status, actuele sluitvelden en laatste activiteit.
TicketAssignmentsBehandelcontextBrondata / lifecycleActieve en historische koppeling tussen ticket en beheerder.
TicketDiscussionMessagesInhoudelijke communicatieBrondataInterne en externe discussie rond een melding.
TicketHistoryCompacte auditlaagBrondata / auditHerleidbare actiehistorie zonder lange discussie- of oplossingstekst.
TicketClosuresFormele sluitregistratieBrondataSluiten, oplossen, reactietermijn, accepteren en doorzetgerelateerde sluiting.
TicketReopenRequestsHeropenregistratieBrondataHeropenreden, herkomst, vorige closure en resulterende status.
TicketForwardedToTeacherDoorzetregistratieBrondataDoorzetten naar docent met verwijzing naar gegenereerde privécommunicatie.
TicketTechnicalSnapshotsTechnische momentopnameSnapshot-brondataContext bij indienen van de melding, niet achteraf herberekend.

9.12 Relatie-inventaris binnen dit domein

BrontabelVeldVerwijst naarRelatietypeNullableBetekenis
TicketsCreatedByUserIdUsers.IdSoft linkNMelder van het ticket.
TicketsCategoryIdTicketCategories.IdHarde FKNGekozen meldingscategorie.
TicketsStatusIdTicketStatuses.IdHarde FKNActuele backend-hoofdstatus.
TicketsCurrentResolutionTypeIdTicketResolutionTypes.IdHarde FKJActuele of laatst relevante afsluitstatus.
TicketsClosedByUserIdUsers.IdSoft linkJActor van de meest recente sluitactie op de actuele toestand.
TicketAssignmentsTicketIdTickets.IdHarde FKNTicket waarvoor de beheerder gekoppeld is.
TicketAssignmentsAdminUserIdUsers.IdSoft linkNGekoppelde beheerder.
TicketAssignmentsAssignedByUserIdUsers.IdSoft linkNActor die de koppeling maakte.
TicketAssignmentsUnassignedByUserIdUsers.IdSoft linkJActor die de koppeling beëindigde.
TicketDiscussionMessagesTicketIdTickets.IdHarde FKNTicketdiscussiecontext.
TicketDiscussionMessagesCreatedByUserIdUsers.IdSoft linkJActor van het bericht; null voor systeemgegenereerde berichten.
TicketHistoryTicketIdTickets.IdHarde FKNTicket waarop de auditregel betrekking heeft.
TicketHistoryActorUserIdUsers.IdSoft linkJActor van de auditactie; null voor volledig systeemgedreven acties.
TicketClosuresTicketIdTickets.IdHarde FKNTicket dat formeel gesloten/opgelost is.
TicketClosuresClosedByUserIdUsers.IdSoft linkNActor van de sluitactie.
TicketClosuresResolutionTypeIdTicketResolutionTypes.IdHarde FKNInhoudelijke afsluitstatus.
TicketClosuresForwardedToTeacherIdTicketForwardedToTeacher.IdHarde FKJDoorzetactie die bij deze sluiting hoort.
TicketClosuresAcceptedByUserIdUsers.IdSoft linkJMelder die de oplossing accepteerde.
TicketReopenRequestsTicketIdTickets.IdHarde FKNTicket dat wordt heropend.
TicketReopenRequestsRequestedByUserIdUsers.IdSoft linkNActor die heropent.
TicketReopenRequestsResultingStatusIdTicketStatuses.IdHarde FKNStatus na heropenen.
TicketReopenRequestsPreviousClosureIdTicketClosures.IdHarde FKJSluiting waarop het heropenen betrekking heeft.
TicketForwardedToTeacherTicketIdTickets.IdHarde FKNTicket dat wordt doorgezet.
TicketForwardedToTeacherTeacherUserIdUsers.IdSoft linkNOntvangende docent.
TicketForwardedToTeacherForwardedByAdminUserIdUsers.IdSoft linkNBeheerder die doorzet.
TicketForwardedToTeacherGeneratedPrivateMessageThreadIdPrivateMessageThreads.IdSoft linkJGegenereerde privéthread in het communicatiedomein.
TicketForwardedToTeacherGeneratedPrivateMessageIdPrivateMessages.IdSoft linkJGegenereerd privébericht in het communicatiedomein.
TicketTechnicalSnapshotsTicketIdTickets.IdHarde FKNEén primaire technische momentopname bij het ticket.

9.13 Belangrijkste relatiepatronen

1. Actuele status versus formele sluitbron

Tickets bevat actuele status- en sluitvelden voor snelle weergave. De formele bron voor sluiting, oplossing, heropentermijn en acceptatie staat in TicketClosures. Bij meerdere sluit-/heropenrondes blijven oude closures bestaan.

2. Behandelcontext via actieve assignments

Status New is alleen geldig zolang er geen actieve TicketAssignments bestaan. Externe beheercommunicatie, formeel oplossen/sluiten en doorzetten naar docent vereisen eerst een actieve behandelcontext.

3. Discussie is geen auditlog

TicketDiscussionMessages bevat inhoudelijke communicatie. TicketHistory bevat compacte auditregels. Vrije toelichtingen horen in discussie, oplossingstekst, sluitreden of heropenverzoek, niet in de historylaag.

4. Opgelost is afgeleid

Opgelost is geen statusrecord. Het is een gebruikersgerichte afleiding uit backendstatus Closed, de meest recente sluiting en de heropenbaarheid.

5. Doorzetten naar docent kruist twee domeinen

De ticketactie wordt vastgelegd in TicketForwardedToTeacher; de communicatie naar de docent loopt via reguliere PrivateMessageThreads en PrivateMessages. De verwijzingen naar die communicatie zijn soft links, zodat support geen harde database-FK naar het communicatiedomein krijgt.

6. Technische snapshot is geen live waarheid

TicketTechnicalSnapshots bewaart technische context op het moment van melden. Die gegevens worden niet opnieuw afgeleid wanneer de gebruiker, route, rollen of browsercontext later veranderen.

9.14 Afgedichte keuzes en onderhoud

OnderwerpV1.0-keuzeBron / vervolgcontrole
Ticketstatussen en resolutietypenGeen apart ERD-waardelijstenhoofdstuk nodig. De lookupwaarden en betekenis staan in ticket- en meldingsbeheer.Alleen uitbreiden wanneer nieuwe status- of resolutiewaarden worden toegevoegd.
TicketHistory.ActionTypeDe V1.0-codewaarden zijn in de database-informatie vastgelegd als gesloten domeinwaarden. Zij horen in database-informatie en code/migratie, niet als vrije SRS-waarden.Nieuwe actiecodes vereisen code-/migratie-impactcontrole.
Periodieke TickerQ-verwerkingGeen apart ERD-sequencediagram nodig. De lifecycle in dit hoofdstuk en de schedulingbeschrijving in het Technisch Ontwerp zijn voldoende.Alleen uitwerken wanneer de job meerdere onafhankelijke datadomeinen gaat muteren.
UI-termen versus databasewaardenDe mapping staat in de database-informatie. Opgelost blijft afgeleid en wordt niet opgeslagen als backendstatus.Schermdocumentatie blijft leidend voor labels per schermcontext.
Ticketgerelateerde popupkeys/templatesTemplate- en popupkeys blijven configuratie/contentbeheer; tickets verwijzen functioneel terug via keygebruik en runtimecommunicatie.Nieuwe keys volgen de seeddata- en placeholderregels uit configuratie/contentbeheer.

Deze punten zijn daarmee geen open ERD-blokkers meer. Zij blijven normale onderhoudscontroles bij wijzigingen aan ticketflows, templates of waardelijsten.

9.15 Status en vervolgvalidatie

Het ticketdomein is in eerste diepte uitgewerkt. De belangrijkste reviewlijn is nu of de formele bronnen voor status, sluiting, heropening, discussie en doorzetten naar docent consistent blijven met de implementatie.

Controleer bij latere wijzigingen expliciet:

  • of Tickets.StatusId alleen de processtatus beschrijft en niet de afgeleide gebruikersstatus Opgelost;
  • of TicketClosures de formele sluitbron blijft;
  • of TicketDiscussionMessages niet wordt gebruikt als auditvervanger;
  • of TicketForwardedToTeacher de enige plek blijft waar de doorzettransactie naar een docent wordt vastgelegd;
  • of systeemcommunicatie naar tickets via het communicatiedomein blijft lopen en niet via losse database-URL's.