Overblik over servicen

Nedstående diagram viser opbygningen af FGVHR-servicen:

Sikkerhed

Brugertyper

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: BorgerVerifikationMapning til FgvhrActor
SecurityContextTicketAudienceMatche audience som findes som konfiguration
 


ValidityEr valid

Message
Verificeres ikke - må gerne være der

ActingUserUserTypeSkal være CitizenactorType


IdentifierFormatSkal være CPR


IdentifierSkal være satactorId


GivenNameVerificeres ikke - må gerne være der


SurNameVerificeres ikke - må gerne være der


CredentialsVerificeres ikke - må gerne være der


PersistentUniqueKeyVerificeres 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: AdministrativVerifikationMapning til FgvhrActor
SecurityContextTicketAudienceVerificeres ikke - må gerne være der 


ValidityEr valid

Message
Verificeres ikke - må gerne være der

ActingUserUserTypeSkal være HealthcareProfessionalactorType


IdentifierFormatSkal være CPR


IdentifierSkal være satactorId


GivenNameVerificeres ikke - må gerne være der


SurNameVerificeres ikke - må gerne være der


Credentials.NationalRoleSkal være der - og skal matche config variable i FGVHR


PersistentUniqueKeyVerificeres ikke - må gerne være der

PrincipalUser
Må ikke være der

OrganisationIdentifierSkal være derorganisationIdentifier


identifierFormatSkal være der og skal være CVR


nameSkal være derorganisationName

Client
Verificeres ikke - må gerne være der
Brugertypen: SystemVerifikationMapning til FgvhrActor
SecurityContextTicketAudienceVerificeres ikke - må gerne være der 


ValidityEr valid

Message
Verificeres ikke - må gerne være der

ActingUser
Må ikke være der

PrincipalUser
Må ikke være der

OrganisationIdentifierSkal være deractorId


IdentifierFormatSkal være der og skal være CVRactorIdType


persistentUniqueKeySkal 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

Database model

Citizen Content

Database design

Datamodellen består af en tabel der hedder 'citizen_consent' og den har følgende kolonner:

kolonneTypebeskrivelse
idINT(11)Tabellens primære nøgle (ikke relevant for scenarierne).
uuid
Unik ID for rækken
patient_idVARCHAR(64)Patientens cpr nummer
patient_id_sourceVARCHAR(64)Typen af patient_id. Dvs. kun 'CPR' lige nu
created_dateDATETIME(3)Tidspunktet hvor rækken oprettes i databasen. Bemærk at for dette tidstempel er præcisionen millisekunder.
citizen_signing_dateDATEDatoen borgeren har angivet på blanketten (tom hvis den ikke kommer fra en blanket)
valid_fromDATEDatoen 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.
statusVARCHAR(20)Nuværende status for borgerens fravalg ('ACTIVE', 'INACTIVE', 'ENTERED-IN-ERROR')
actor_roleVARCHAR(20)Angiver hvem der har foretaget registreringen. Mulige værdier: 'CITIZEN' eller 'ADM' (Borger eller Administrativ medarb. vha. blanket)
actor_idVARCHAR(64)Angiver id for den der har foretaget registreringen. Dvs. enten et cpr nummer eller en SOR kode
actor_id_sourceVARCHAR(64)Typen af actor_id. Dvs. enten 'CPR' eller 'SOR'

Scenarier

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.

NrScenarieuuidpatient_idpatient_id_sourcecreated_datecitizen_signing_datevalid_fromstatusactor_roleactor_idactor_id_source
Registrering
1Borger over 60år opretter selv registreringdab09aa6fec0101611234

'CPR'

09/08/2023 12:00:00.000NULL15/08/2023

'ACTIVE'

'CITIZEN'0101611234'CPR'












2Borger under 60år opretter selv registreringOprettes ikke





















3Adm opretter registrering for borger over 60 årb5636bd8d16c0101611234'CPR'09/08/2023 12:00:00.00001/08/202315/08/2023'ACTIVE''ADM'275421000016009'SOR'












4Borger over 60år opretter selv registrering55e8864cb06d0101611234

'CPR'

09/08/2023 12:00:00.000NULL15/08/2023

'ACTIVE'

'CITIZEN'0101611234'CPR'

Borger sletter registreringenf265453da1240101611234

'CPR'

07/09/2023 12:00:00.000NULL07/09/2023

'INACTIVE'

'CITIZEN'0101611234'CPR'
Sletning
5Adm opretter registrering for borger over 60 år03c2aed5b8560101611234'CPR'09/08/2023 12:00:00.00001/08/202315/08/2023'ACTIVE''ADM'275421000016009'SOR'

Adm sletter registreringen8b3eed7ed6c80101611234'CPR'07/09/2023 12:00:00.00027/08/202307/09/2023'INACTIVE''ADM'275421000016009'SOR'












6Adm opretter registrering for borger over 60 år12a97d33c3610101611234'CPR'09/08/2023 12:00:00.00001/08/202315/08/2023'ACTIVE''ADM'275421000016009'SOR'

Adm sletter registreringen der markere som fejlregistrering40215a3ef2c90101611234'CPR'07/09/2023 12:00:00.000
NULL'ENTERED-IN-ERROR''ADM'275421000016009'SOR'












7Adm opretter registrering for borger over 60 årb893fa943e450101611234'CPR'09/08/2023 12:00:00.00001/08/202315/08/2023'ACTIVE''ADM'275421000016009'SOR'

Adm sletter registreringen17b18c1720be0101611234'CPR'07/09/2023 12:00:00.00027/08/202307/09/2023'INACTIVE''ADM'275421000016009'SOR'

Adm sletter registreringen der markere som fejlregistrering8c20aaef3f080101611234'CPR'08/09/2023 12:00:00.000
NULL'ENTERED-IN-ERROR''ADM'275421000016009'SOR'
Opdatering
8Adm opretter registrering for borger over 60 år817db31e97d30101611234'CPR'09/08/2023 12:00:00.00001/08/202315/08/2023'ACTIVE''ADM'275421000016009'SOR'

Adm sletter registreringen der markere som fejlregistreringba8c620ba79d0101611234'CPR'09/08/2023 13:00:00.000
NULL'ENTERED-IN-ERROR''ADM'275421000016009'SOR'

Adm opretter registrering for borger over 60 årcd2dcc3c1b540101611234'CPR'09/08/2023 13:05:00.54604/08/202315/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

Digital post har følgende tabeller

Letter:

kolonneTypebeskrivelse
idBIGINT(20)Tabellens primære nøgle
uuidVARCHAR(128)Unik ID for rækken
patient_idVARCHAR(64)Patientens cpr nummer
patient_id_sourceVARCHAR(64)Typen af patient_id. 
digital_template_idVARCHAR(256)Template ID for digitalt brev
physical_template_idVARCHAR(256)template ID for fysisk brev
periodVARCHAR(64)perioden mellem hver afsendelse af brevet
send_atDATETIME(3)tidspunkt for næste afsendelse af brevet
last_errorDATETIME(3)tidspunkt for sidste fejl
error_counterINTantal fejl
send_statusVARCHAR(64)status på forsendelsen: imens letter behandles sættes værdien til IN_PROGRESS, ellers er den null
created_dateDATETIME(3)Tidspunktet hvor rækken oprettes i databasen.


substitution_values:

kolonneTypebeskrivelse
idBIGINT(20)Tabellens primære nøgle
letter_idBIGINT(20)Fremmednøgle til letter tabellen
substitution_keyVARCHAR(256)Nøgle til brevskabelon
substitution_valueVARCHAR(512)Værdi til brevskabelon
created_dateDATETIME(3)Tidspunktet hvor rækken oprettes i databasen.


Integrationer

MinLog

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.

NAS

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.

Beskedformat

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>

Person Information Service.

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.

Trifork Digital Post Komponent

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.

Slettejob

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,
om en person er afdød

anvender "nu" som grænse til at afgøre, 
om en person er afdød

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


Digital Post baggrundsjob til afsendelse

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.

Beslutninger ift. arkitektur og jura

Følgende tabel er beslutninger, som har indvirkning på arkitekturen bag FGVHR

DatoEmneProblem, beskrivelse og beslutningAfklaret med
16.06.2025Logning 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.2025Skrivning 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.2023Optimistisk 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.

At indføre optimistisk låsning på nuværende tidspunkt, kræver en ændring til læse- og registreringssnitfladen, da der skal indføres en ekstra kolonne i databasen, eksempelvis "replaces_uuid" som fortæller hvilken række som erstattes. Derved kan registeret se om der er kommet ny data ind i mellemtiden for borgeren inden der skrives.
Problemstillingen er at snitfladerne er udsendt (pr. 1/7-2023) og en ændring af snitfladen på nuværende tidspunkt kan resultere i en samlet forsinkelse af projektet. Risikoen for at der skrives data bag om ryggen på enten borgeren eller den administrative medarbejder er så lille at vi ikke skal indføre ændringen ift. optimistisk låsning for borgerens registrering af fravalg.

Beslutning: Der indføres ikke optimistisk låsning ved skrivning ift nuværende snitflade

NSP
14.08.2023Historik 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.

Det betyder at for en borger som har registreret fravalg, og senere trækker registreringen tilbage, vil man kunne se i registeret hvornår disse transaktioner er foretaget.
Det er muligt at se alle historiske registreringer via den administrative brugergrænsefladen (NADM)

Årsagen til at historik bør være tilgængelig i FGVHR er oplysningernes følsomhed, således der aldrig kan dannes tvivl om hvad borgerens registrering har været på et hvilket som helst tidspunkt.
Et scenarie som skal tænkes ind er borgere som registrerer et fravalg, fortryder registreringen, for derefter at registrere sig igen o.s.v. Der vil det være vigtigt at kunne dokumentere at disse handlinger er foretaget.

Beslutning: Juridisk afdeling godkender at historikken opbevares omkring fravalg af genoplivningsforsøg. De mener derfor, at der ikke er et problem med hjemlen til opbevaring af disse data. Der har tidligere været henvendelser på VAR og Organdonor omkring dette, hvor de også kom frem til, at fravalg og tilvalg er vigtig historisk. Særligt ift. klagesager hos STPK - hvis fx en pårørende påstår, at deres familiemedlem ikke var registeret på tidspunktet, fordi de havde overbevist dem, om ikke lade sig registrere og bede om genoplivningsforsøg ved hjertestop, men så har familiemedlemmet ændret valget igen lige op til dødsfaldet.

Om data skal vises for borgeren er ikke givet. Derfor skal historik udelukkende udstilles til den administrative brugergrænseflade for nuværende.

SDS's Juridiske afdeling
25.05.2023Version 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

Der er nogle mindre forskelle, bl.a. på kardinaliteter og på datatyper og konstantværdier, så spørgsmålet er om SDS vil understøtte Release 4 af modellen, eller den Release 5?

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.
Eneste argument for at blive på R4 ville være, hvis vi allerede havde noget andet, der anvendte/refererede til Consent i R4, ifølge NSP er det dem ikke bekendt.

Beslutning: Snitfladen opdateres til FHIR release version 5

NSP
27.03.2023Skrivning til Minlog

Problem: I hvilke situationer skal FGVHR skrive til Minlog?

Beslutning:

  1. Der skrives til borgerens Minlog når registrereringen oprettes/slettes - uanset om det er borgeren selv der ændrer via sundhed.dk, eller om det er en administrativ medarbejder som behandler en papirblanket.
  2. Der skrives til borgerens Minlog når en administrativ medarbejder henter oplysninger om en borgers registrering i FGVHR
  3. Der skrives ikke til Minlog når registreringen læses af borgeren selv.
  4. Der skrives ikke til Minlog når status hentes via Fælles Stamkort grænsefladen

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.2023Sundhedsfaglig 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