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 FGVHR ServiceActor | ||
| SecurityContext | Ticket | Audience | Matche audience som findes som konfiguration i FGVHR(?) | |
| Validity | Er valid | |||
| Message | Verificeres ikke - må gerne være der | |||
| ActingUser | UserType | Skal være Citizen | Brugertypen: Borger | |
| IdentifierFormat | Skal være CPR | |||
| Identifier | Skal være sat | userPersonIdentifier | ||
| 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 FGVHR ServiceActor | ||
| 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 | Brugertypen: Administrativ | |
| IdentifierFormat | Skal være CPR | userPersonIdentifier | ||
| Identifier | Skal være sat | |||
| 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 | |||
| Client | Verificeres ikke - må gerne være der | |||
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 | |
| replaces_uuid | uuid for rækken den erstatter. Inden for et givent CprNr har alle række udfyldt denne værdi på nær den første række (der ikke erstatter nogen række) | |
| 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_created_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 tidsstemplet, 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 | replaces_uuid | patient_id | patient_id_source | created_date | citizen_created_date | valid_from | status | actor_role | actor_id | actor_id_source |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Registrering | ||||||||||||
| 1 | Borger over 60år opretter selv registrering | dab09aa6fec | NULL | 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 | NULL | 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 | NULL | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | NULL | 15/08/2023 | 'ACTIVE' | 'CITIZEN' | 0101611234 | 'CPR' |
| Borger sletter registreringen | f265453da124 | 55e8864cb06d | 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 | NULL | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen | 8b3eed7ed6c8 | 03c2aed5b856 | 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 | NULL | 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 | 12a97d33c361 | 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 | NULL | 0101611234 | 'CPR' | 09/08/2023 12:00:00.000 | 01/08/2023 | 15/08/2023 | 'ACTIVE' | 'ADM' | 275421000016009 | 'SOR' |
| Adm sletter registreringen | 17b18c1720be | b893fa943e45 | 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 | 17b18c1720be | 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 | NULL | 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 | 817db31e97d3 | 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 | ba8c620ba79d | 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.