Nedstående diagram viser opbygningen af FGVHR-servicen:
![]()
Der findes følgende brugertyper i FGVHR:
De enkelte brugertyper bestemmes udfra modellen, der udstilles i Security API. Disse regler er opsummeret i tabellerne nedenfor.
| Brugertypen: Borger | Verifikation | Mapning til FgvhrActor | ||
| SecurityContext | Ticket | Audience | Matche audience som findes som konfiguration | |
| Validity | Er valid | |||
| Message | Verificeres ikke - må gerne være der | |||
| ActingUser | UserType | Skal være Citizen | actorType | |
| IdentifierFormat | Skal være CPR | |||
| Identifier | Skal være sat | actorId | ||
| GivenName | Verificeres ikke - må gerne være der | |||
| SurName | Verificeres ikke - må gerne være der | |||
| Credentials | Verificeres ikke - må gerne være der | |||
| PersistentUniqueKey | Verificeres ikke - må gerne være der | |||
| PrincipalUser | Må ikke være der | |||
| Organisation | Må ikke være der | |||
| Client | Verificeres ikke - må gerne være der | |||
| Brugertypen: Administrativ | Verifikation | Mapning til FgvhrActor | ||
| SecurityContext | Ticket | Audience | Verificeres ikke - må gerne være der | |
| Validity | Er valid | |||
| Message | Verificeres ikke - må gerne være der | |||
| ActingUser | UserType | Skal være HealthcareProfessional | actorType | |
| IdentifierFormat | Skal være CPR | |||
| Identifier | Skal være sat | actorId | ||
| GivenName | Verificeres ikke - må gerne være der | |||
| SurName | Verificeres ikke - må gerne være der | |||
| Credentials.NationalRole | Skal være der - og skal matche config variable i FGVHR | |||
| PersistentUniqueKey | Verificeres ikke - må gerne være der | |||
| PrincipalUser | Må ikke være der | |||
| Organisation | Identifier | Skal være der | organisationIdentifier | |
| identifierFormat | Skal være der og skal være CVR | |||
| name | Skal være der | organisationName | ||
| Client | Verificeres ikke - må gerne være der | |||
| Brugertypen: System | Verifikation | Mapning til FgvhrActor | ||
| SecurityContext | Ticket | Audience | Verificeres ikke - må gerne være der | |
| Validity | Er valid | |||
| Message | Verificeres ikke - må gerne være der | |||
| ActingUser | Må ikke være der | |||
| PrincipalUser | Må ikke være der | |||
| Organisation | Identifier | Skal være der | actorId | |
| IdentifierFormat | Skal være der og skal være CVR | actorIdType | ||
| persistentUniqueKey | Skal være der ved kald gennem FSK snitflade. Bruges til whitelisting af de anvendersystemer der skal hente status for en borger. FGVHR skal konfigureres med de certifikater der har adgang. | clientKey | ||
Datamodellen består af en tabel der hedder 'citizen_consent' og den har følgende kolonner:
| kolonne | Type | beskrivelse |
|---|---|---|
| id | INT(11) | Tabellens primære nøgle (ikke relevant for scenarierne). |
| uuid | Unik ID for rækken | |
| patient_id | VARCHAR(64) | Patientens cpr nummer |
| patient_id_source | VARCHAR(64) | Typen af patient_id. Dvs. kun 'CPR' lige nu |
| created_date | DATETIME(3) | Tidspunktet hvor rækken oprettes i databasen. Bemærk at for dette tidstempel er præcisionen millisekunder. |
| citizen_signing_date | DATE | Datoen borgeren har angivet på blanketten (tom hvis den ikke kommer fra en blanket) |
| valid_from | DATE | Datoen hvor registreringen er gældende (= created_date + 7 dage). Bemærk dette felt indeholder ikke noget tidsstempel, da fravalget er gældende fra denne dato. |
| status | VARCHAR(20) | Nuværende status for borgerens fravalg ('ACTIVE', 'INACTIVE', 'ENTERED-IN-ERROR') |
| actor_role | VARCHAR(20) | Angiver hvem der har foretaget registreringen. Mulige værdier: 'CITIZEN' eller 'ADM' (Borger eller Administrativ medarb. vha. blanket) |
| actor_id | VARCHAR(64) | Angiver id for den der har foretaget registreringen. Dvs. enten et cpr nummer eller en SOR kode |
| actor_id_source | VARCHAR(64) | Typen af actor_id. Dvs. enten 'CPR' eller 'SOR' |
I det følgende beskrives en række scenarier og hvordan de tilhørende data ser ud. Rækker bliver aldrig slettet eller rettet - der bliver altid kun tilføjet nye rækker. Så fordelen ved denne løsninger er at historikken bevares.
Der er anvendt forsimplede uuid'er for læsbarhedens skyld.
| Nr | Scenarie | uuid | patient_id | patient_id_source | created_date | citizen_signing_date | valid_from | status | actor_role | actor_id | actor_id_source |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Registrering | |||||||||||
| 1 | Borger over 60år opretter selv registrering | dab09aa6fec | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | NULL | 15/08/2023 | 'ACTIVE' | 'CITIZEN' | 0101611234 | 'CPR' |
| 2 | Borger under 60år opretter selv registrering | Oprettes ikke | |||||||||
| 3 | Adm opretter registrering for borger over 60 år | b5636bd8d16c | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| 4 | Borger over 60år opretter selv registrering | 55e8864cb06d | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | NULL | 15/08/2023 | 'ACTIVE' | 'CITIZEN' | 0101611234 | 'CPR' |
| Borger sletter registreringen | f265453da124 | 0101611234 | 'CPR' | 07/09/2023 12:00:00.000 | NULL | 07/09/2023 | 'INACTIVE' | 'CITIZEN' | 0101611234 | 'CPR' | |
| Sletning | |||||||||||
| 5 | Adm opretter registrering for borger over 60 år | 03c2aed5b856 | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen | 8b3eed7ed6c8 | 0101611234 | 'CPR' | 07/09/2023 12:00:00.000 | 27/08/2023 | 07/09/2023 | 'INACTIVE' | 'ADM' | 275421000016009 | 'SOR' | |
| 6 | Adm opretter registrering for borger over 60 år | 12a97d33c361 | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen der markere som fejlregistrering | 40215a3ef2c9 | 0101611234 | 'CPR' | 07/09/2023 12:00:00.000 | NULL | 'ENTERED-IN-ERROR' | 'ADM' | 275421000016009 | 'SOR' | ||
| 7 | Adm opretter registrering for borger over 60 år | b893fa943e45 | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen | 17b18c1720be | 0101611234 | 'CPR' | 07/09/2023 12:00:00.000 | 27/08/2023 | 07/09/2023 | 'INACTIVE' | 'ADM' | 275421000016009 | 'SOR' | |
| Adm sletter registreringen der markere som fejlregistrering | 8c20aaef3f08 | 0101611234 | 'CPR' | 08/09/2023 12:00:00.000 | NULL | 'ENTERED-IN-ERROR' | 'ADM' | 275421000016009 | 'SOR' | ||
| Opdatering | |||||||||||
| 8 | Adm opretter registrering for borger over 60 år | 817db31e97d3 | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen der markere som fejlregistrering | ba8c620ba79d | 0101611234 | 'CPR' | 09/08/2023 13:00:00.000 | NULL | 'ENTERED-IN-ERROR' | 'ADM' | 275421000016009 | 'SOR' | ||
| Adm opretter registrering for borger over 60 år | cd2dcc3c1b54 | 0101611234 | 'CPR' | 09/08/2023 13:05:00.546 | 04/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' | |
Modellen skal læses på følgende måde:
Indenfor et givent CPR nummer er det altid rækken med den seneste 'created_date' der er gældende.
Hvis status er 'ENTERED-IN-ERROR', så er denne og den foregående række ikke gyldige. Dvs. i scenarie nr. 6 har borgeren ikke et aktivt fravalg, mens i scenarie nr. 7 har borgeren et aktivt fravalg.
Digital post har følgende tabeller
Letter:
| kolonne | Type | beskrivelse |
|---|---|---|
| id | BIGINT(20) | Tabellens primære nøgle |
| uuid | VARCHAR(128) | Unik ID for rækken |
| patient_id | VARCHAR(64) | Patientens cpr nummer |
| patient_id_source | VARCHAR(64) | Typen af patient_id. |
| digital_template_id | VARCHAR(256) | Template ID for digitalt brev |
| physical_template_id | VARCHAR(256) | template ID for fysisk brev |
| period | VARCHAR(64) | perioden mellem hver afsendelse af brevet |
| send_at | DATETIME(3) | tidspunkt for næste afsendelse af brevet |
| last_error | DATETIME(3) | tidspunkt for sidste fejl |
| error_counter | INT | antal fejl |
| send_status | VARCHAR(64) | status på forsendelsen: imens letter behandles sættes værdien til IN_PROGRESS, ellers er den null |
| created_date | DATETIME(3) | Tidspunktet hvor rækken oprettes i databasen. |
substitution_values:
| kolonne | Type | beskrivelse |
|---|---|---|
| id | BIGINT(20) | Tabellens primære nøgle |
| letter_id | BIGINT(20) | Fremmednøgle til letter tabellen |
| substitution_key | VARCHAR(256) | Nøgle til brevskabelon |
| substitution_value | VARCHAR(512) | Værdi til brevskabelon |
| created_date | DATETIME(3) | Tidspunktet hvor rækken oprettes i databasen. |
Der er lavet en integration til MinLog der anvendes, når der ændres i en borgers fravalg. Se detaljerne under afsnittet "Beslutninger" længere nede på siden.
Ved manglende adgang til MinLog-servicen vil servicekaldet fejle.
FGVHR anvender MinLog Producer-biblioteket til at registrere i Minlog2.
Alle ændringer af aktive fravalg afstedkommer adviseringer til NAS. Dog sendes advisering kun straks ved sletninger. Ved fravalg der først bliver aktive i fremtiden, opsamles adviseringer og afsendes af et baggrundsjob, på den dato hvor fravalget bliver aktivt.
Bemærk, der sendes ikke adviseringer ved sletning af fravalg, der ikke er aktive.
Ved manglende adgang til NAS-servicen vil servicekaldet til sletning fejle.
Det anvendte topic kan konfigureres (se driftsvejledningen).
Indholdet i notifikationen består af et ConsentUpdatedNotification-objekt, som blot indeholder dags dato. Borgerens ID sættes på NotifyContent i id-attributten.
Se følgende schema for ConsentUpdatedNotification:
<?xml version='1.0' encoding='UTF-8'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://sundhedsdatastyrelsen.dk/Fravalg-Af-Genoplivning/2023/06/01/"
targetNamespace="http://sundhedsdatastyrelsen.dk/Fravalg-Af-Genoplivning/2023/06/01/"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0">
<xs:complexType name="ConsentUpdatedNotification">
<xs:annotation>
<xs:documentation>
NAS Notification request
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="date" type="tns:DateType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DateType">
<xs:attribute name="value" type="xs:date" use="required"/>
</xs:complexType>
</xs:schema> |
Her ses et eksempel på en advisering til NAS:
<ns3:Notify xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:ns3="http://docs.oasis-open.org/wsn/b-2"
xmlns:ns4="http://docs.oasis-open.org/wsn/t-1"
xmlns:ns5="http://www.w3.org/2005/08/addressing"
xmlns:ns6="http://docs.oasis-open.org/wsrf/bf-2"
xmlns:ns7="http://docs.oasis-open.org/wsrf/rp-2" xmlns:ns8="http://nsi.dk/advis/v10"
xmlns:ns9="http://sundhedsdatastyrelsen.dk/Fravalg-Af-Genoplivning/2023/06/01/">
<ns3:NotificationMessage>
<ns3:Topic Dialect="http://docs.oasis-open.org/wsn/t-1/TopicExpression/Simple">
TESTNAS-TOPIC1</ns3:Topic>
<ns3:Message>
<ns8:NotifyContent id="1010109999" idType="cpr">
<ns9:ConsentUpdatedNotification>
<ns9:date value="2023-10-30" />
</ns9:ConsentUpdatedNotification>
</ns8:NotifyContent>
</ns3:Message>
</ns3:NotificationMessage>
</ns3:Notify> |
Gennem kald til "person information service" foretages validering af CPR-nummer og en persons alder. Minimumsalderen for fravalg er konfigurerbart (se driftsvejledningen). Desuden bruges "deceased" kaldet af slettejobbet, til at afgøre om en person er død, og de gemte fravalg derfor skal slettes.
For ændringer i borgers aktive fravalg (oprettelse og sletning), laves der et bekræftigelsesbrev til borgeren om det foretrukne valg. Ligeledes laves der et årligt notifikationsbrev tll påmindelse om det foretrukne valg. Brevene oprettes i forbindelse med ændringen og sendes asynkront vha. en Digital Post komponent, som sørger for korrekt udformning for henholdsvis Digital Post for digitale breve og Straalfors for fysiske breve.
Se iøvrigt beskrivelsen af digitalt post baggrundsjob nedenfor.
Servicen indeholder et slettejob, som kan slette fravalg for afdøde personer. Fravalg for en afdød skal slettes et år efter (kan konfigureres til noget andet end et år) efter personen er afgået ved døden. Tilknyttet digital post slettes med det samme personen er død (kan konfigureres).
Jobbet starter med at oprette en stak af cpr nummer prefixes, og for hver af disse arbejdes med parallelle spor for sletning af fravalg og tilhørende digital post.
Strukturen for for sletning af de 2 parallelle sporer ens, hvorfor beskrivelsen er samlet i en beskrivelse af operationer nedenfor, men relevante forskelle beskrevet under "variant".
Sletningen foregår overordnet ved, at der opbygges en arbejdskø der indeholder alle cpr numre for de afdøde personer. PersonInformation Service bruges til at finde disse personer,
Jobbet består af følgende operationer. Da der
Operation | Beskrivelse | Variant Consent | Variant Digital Post |
|---|---|---|---|
| Default operation | Formål: Benyttes til at fylde operationer på stakken, når stakken er tom. Java klasse: FgvhrDeceasedCleanupSupplier Batching: For hvert af tallene 00-99, oprettes en "prefix baseret operation" for både consent og for digital post Shuffles: nej Andet: - |
|
|
Prefix baseret operation (Concent og Digital post) | Formål: Givet et tal mellem 00 og 99, hentes alle borger id'er af typen cpr fra som starter med disse cifre. Java klasse: FgvhrDeceasedPatientIdPrefixCleanupSupplier/ FgvhrDeceasedPatientIdPrefixCleanupDigitalPostSupplierTest Batching: Opretter en mængde "borger id baseret operation", hver med et konfigurerbart antal af disse borger id'er Shuffles: ja Andet: - | henter fra citizen_consent | henter fra letter |
Borger id baseret operation (Concent og Digital post) | Formål: Givet en liste af borger id'er, tages de id'er der tilhører afdøde borgere. Dette afgøres ved kald til PersonInformation. Java klasse: FgvhrDeceasedPatientIdBatchCleanupSupplier/ FgvhrDeceasedPatientIdBatchCleanupDigitalPostSupplierTest Batching: Opretter eet "oprydningsjob" med de afdøde borgers id Shuffles: nej Andet: - | anvender et år som grænse til at afgøre, | anvender "nu" som grænse til at afgøre, |
Oprydningsjob (Concent og Digital post) | Formål: Givet en liste af borger id'er slettes i databasen fravalg for denne liste af id'er af typen cpr Java klasse: FgvhrCleanupOperation/ FgvhrCleanupDigitalPostOperation Batching: na Shuffles: na Andet: - | sletter i citizen_consent | sleter i letter og substitution_values |
Servicen indeholder et baggrundsjob, som sender digital post fra fravalgs servicen til trifork Digital Post Komponent.
Jobbet består af følgende operationer:
Operation | Beskrivelse |
|---|---|
| Default operation | Formål: Benyttes til at fylde operationer på stakken, når stakken er tom. Java klasse: FgvhrDigitalPostSendLetterSupplier Batching: for hver letter oprettes et "Afsendelses job" Shuffles: nej Andet: - |
| Afsendelses job | Formål: Givet et letter sendes dette med den digitale post komponent Java klasse: FgvhrDigitalPostSendOperation Batching: na Shuffles: na Andet: Et letter låses mens det behandles så andre jobs ikke tager fat i det |
Se iøvrigt driftvejledning.
Følgende tabel er beslutninger, som har indvirkning på arkitekturen bag FGVHR
| Dato | Emne | Problem, beskrivelse og beslutning | Afklaret med |
|---|---|---|---|
| 16.06.2025 | Logning af rolle til Minlog | Problem: Titel/rolle skal sendes med ved logning i MinLog. Dette overholder FGVHR ikke. Derudover er der vedtaget en mapning fra Uddannelseskoder og Nationale Roller på tværs af NSP-komponenter, som skal anvendes, når titlen logges. Beskrivelse: Logningen skal ændres til at medtage titel/rolle. Beslutning: Rettes med SDS-8569. | NSP |
| 07.02.2025 | Skrivning til Minlog | Problem: Det er blevet besluttet, at alle NSP-komponenter fremover skal logge alle borgers opslag på egne data i minlog. Dette påvirker selvfølgelig også FGVHR. Beskrivelse: FGVHR skal rettes, så den også logger borgeres egne opslag på egne data. Beslutning: Rettes med SDS-7992. | NSP |
| 14.08.2023 | Optimistisk låsning ved skrivning til registeret | Problem: Er der behov for optimistisk låsning, således der ikke sker en oprettelse/ændring af data bagom ryggen på den visning man nu ser? Beskrivelse: Der er kun to klienter som kan skrive data til register for fravalg. Den ene er borgeren selv via sundhed.dk, den anden er en administrativ medarbejder via NADM snitfladen. Administrative medarbejdere indtaster borgerens data fra papirblanketter indsendt fra de borgere som ikke er kyndige med det digitale. Sandsynligheden for at en borger skriver egne data via sundhed.dk på samme tid en administrativ medarbejder skriver borgerens data via NADM er defor minimal. Beslutning: Der indføres ikke optimistisk låsning ved skrivning ift nuværende snitflade | NSP |
| 14.08.2023 | Historik på data i FGVHR | Problem: Må borgerens historiske registrering af fravalg samt tilbagetrækninger opbevares i FGVHR? Beskrivelse: "Fravalgs-registeret" er lige nu designet til at opbevare al historik på borgerens registrerede fravalg, og ikke kun den aktuelle registrering. Data slettes først et år efter borgeren er registreret som afdød i CPR-registeret. | SDS's Juridiske afdeling |
| 25.05.2023 | Version af FHIR profil | Problem: Den 26.03.2023 blev FHIR release 5 frigivet, skal FGVHR's snitflade opdateres tilsvarende? Beskrivelse: Oprindeligt er snitfladen til FGVHR profileret efter version 4: http://hl7.org/fhir/R4/consent.html i mellemtiden 26/3 er FHIR release 5 blevet frigivet http://hl7.org/fhir/R5/consent.html Beslutning: Da der er tale om mindre justeringer baseret på en R4-R5 sammenligning, og vi samtidig kan sige, at hvis R5 havde været til rådighed, da vi lavede den første modellering, så havde vi vel valgt R5 uden at blinke ret meget, så peger de to ting tilsammen på, at vi skal basere os på version 5. | NSP |
| 27.03.2023 | Skrivning til Minlog | Problem: I hvilke situationer skal FGVHR skrive til Minlog? Beslutning:
Det vil forventeligt være meget få logninger, og desuden vil enhver tvivl om hvornår noget er ændret, derfor udvides den sædvanlige logning med retistreringer fra borgeren selv. | SDS's Juridiske afdeling |
| 23.01.2023 | Sundhedsfaglig adgang til borgerens registrering | Problem: Der er efterspurgt adgang til borgerens registrering uden om Fælles Stamkort, eksempelvis via replikering - kan det tillades? Beslutning: Status om borgerens fravalg for genoplivningsforsøg ved hjertestop udestilles kun til sundhedsfaglige systemer via Fælles Stamkort. | NSP SDS's juridiske afdeling |