Dette dokument dækker følgende komponenter på NSP:
Din Digitale Tandlægevælger (DDTV)
Komponenten dækker 3 services som følger
Type: IDWS SOAP Webservice
Filnavn: ddtv-citizen-service.war
Url: <serverurl>/ddtv-citizen-service/2025/05/01
Status-url: <serverurl>/ddtv-citizen-service/status
Type: DGWS SOAP Webservice
Filnavn: ddtv-dentist-service.war
Url: <serverurl>/ddtv-dentist-service/2025/05/01
Status-url: <serverurl>/ddtv-dentist-service/status
Status-url: <serverurl>/ddtv-batch-service/status
Alarm-url: <serverurl>/ddtv-batch-service/alarm
Grundlæggende konfiguration af alle services foregår ved redigering i filen application.properties. For den enkelte service placeres filen i følgende WildFly modul:
/pack/wildfly8/modules/dk/nsp/ddtv/main/
Moduldefinition, som kan anvendes for alle services, findes i kildekoden under:
/etc/wildfly/modules/dk/nsp/ddtv/main/module.xml
I application.properties for DDTV-Citizen servicen kan følgende properties defineres:
Property | Beskrivelse | Påkrævet | Default værdi |
|---|---|---|---|
| datasource.ddtv.jndi-name | Navn på jboss datasource (defineret i ddtv-ds.xml) | Ja | java:jboss/datasources/ddtv-ds |
| dcc.endpoint | Angiver det endpoint, som DCC'en skal kalde. Dette kommer til at fremgå af den XML, der returneres i /dksconfig. | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/ddtv-citizen-service/2025/05/01/ |
| service.contract.endpoint | Endpoint, som WSDL og XSD-schemas er udstillet på. Anvendes til substitution af relative stier til XSD-schemas ved hent af WSDL | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/ddtv-citizen-service/service-contract |
| sores.url | URL til SORES servicen | Ja | http://test1.ekstern-test.nspop.dk:8080/sores/ |
| sores.connectTimeout | Connection timeout i millisekunder for SORES integrationen | Ja | 10000 |
| personinformation.url | URL til PersonInformation servicen | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-personinformation/v1 |
| personinformation.connectionTimeout | Connection timeout i millisekunder for PersonInformation integrationen | Ja | 10000 |
| personinformation.errorcount.duration | Specificering af hvor lang tid tilbage der skal tælles fejl fra PersonInformation servicen (ifm /status endpointet). Angives som duration i ISO-8601 formattet. | Ja | PT10M (10 minutter) |
| personinformation.cprstatuscodes | Kommasepareret liste af statuskoder i CPR stamdata, der anses som ACTIVE | Ja | 1,3,70 |
| httpclient.pooling.totalconnections | Totale antal HttpClients forbindelser der kan åbnes | Nej | 200 |
| httpclient.pooling.maxconnections.pr.route | Antal HttpClients forbindelser der kan åbnes pr. rute | Nej | 20 |
| ddtv.audience | Audience for IDWS kald | Ja | https://audience.nspop.dk/ddtv |
| ddtv.powerOfAttorney.read | Fuldmagt læserettighed | Ja | minlog |
| ddtv.powerOfAttorney.write | Fuldmagt skriverettighed | Ja | minlog |
I application.properties for DDTV-Dentist servicen kan følgende properties defineres:
Property | Beskrivelse | Påkrævet | Default værdi |
|---|---|---|---|
| datasource.ddtv.jndi-name | Navn på jboss datasource (defineret i ddtv-ds.xml) | Ja | java:jboss/datasources/ddtv-ds |
| dcc.endpoint | Angiver det endpoint, som DCC'en skal kalde. Dette kommer til at fremgå af den XML, der returneres i /dksconfig. | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/ddtv-dentist-service/2025/05/01/ |
| service.contract.endpoint | Endpoint, som WSDL og XSD-schemas er udstillet på. Anvendes til substitution af relative stier til XSD-schemas ved hent af WSDL | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/ddtv-dentist-service/service-contract |
| personinformation.url | URL til PersonInformation servicen | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-personinformation/v1 |
| personinformation.connectionTimeout | Connection timeout i millisekunder for PersonInformation integrationen | Ja | 10000 |
| personinformation.errorcount.duration | Specificering af hvor lang tid tilbage der skal tælles fejl fra PersonInformation servicen (ifm /status endpointet). Angives som duration i ISO-8601 formattet. | Ja | PT10M (10 minutter) |
| personinformation.cprstatuscodes | Kommasepareret liste af statuskoder i CPR stamdata, der anses som ACTIVE | Ja | 1,3,70 |
I application.properties for DDTV-Batch servicen kan følgende properties defineres:
Property | Beskrivelse | Påkrævet | Default værdi |
|---|---|---|---|
| datasource.ddtv.jndi-name | Navn på jboss datasource (defineret i ddtv-ds.xml) | Ja | java:jboss/datasources/ddtv-ds |
| sores.url | URL til SORES servicen | Ja | http://test1.ekstern-test.nspop.dk:8080/sores/ |
| sores.connectTimeout | Connection timeout i millisekunder for SORES integrationen | Ja | 10000 |
| personinformation.url | URL til PersonInformation servicen | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/stamdata-personinformation/v1 |
| personinformation.connectionTimeout | Connection timeout i millisekunder for PersonInformation integrationen | Ja | 10000 |
| personinformation.errorcount.duration | Specificering af hvor lang tid tilbage der skal tælles fejl fra PersonInformation servicen (ifm /status endpointet). Angives som duration i ISO-8601 formattet. | Ja | PT10M (10 minutter) |
| personinformation.cprstatuscodes | Kommasepareret liste af statuskoder i CPR stamdata, der anses som ACTIVE | Ja | 1,3,70 |
| httpclient.pooling.totalconnections | Totale antal HttpClients forbindelser der kan åbnes | Nej | 200 |
| httpclient.pooling.maxconnections.pr.route | Antal HttpClients forbindelser der kan åbnes pr. rute | Nej | 20 |
| scan.citizens.target.age | Alder i år for automatisk tilmelding af borgere | Ja | 22 |
| scan.citizens.days.before | Antal dage før fødselsdag for automatisk tilmelding af borgere | Ja | 7 |
| scan.citizens.execution.duration | Hvor længe skal scan citizens jobbet køre | Ja | PT10S (10 sekunder) |
| remind.citizens.batchsize | Hvor mange personer skal påmindelsesjobbet maksimalt fremsøge fra databasen ad gangen | Ja | 10 |
| remind.citizens.delay.duration | Hvor lang tid skal der gå fra første digital post eller sidste påmindelse til en ny påmindelse sendes | Ja | P10D (10 dage) |
| remind.citizens.execution.duration | Hvor længe skal påmindelsesjobbet køre | Ja | PT10S (10 sekunder) |
| remind.citizens.reminder.limit | Hvor mange reminders må der sendes til samme borger | Ja | 1 |
| digital.post.batchsize | Hvor mange personer skal digital post jobbet maksimalt fremsøge fra databasen ad gangen | Ja | 10 |
| digital.post.execution.duration | Hvor længe skal digital post jobbet køre | Ja | PT10S (10 sekunder) |
| digital.post.endpoint | URL til Digital Post Adapter send servicen | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/digitalpost/2024/05/29/send |
| digital.post.template.informationsbrev | Skabelon-navn for brev der udsendes når borgeren skal informeres om at der skal vælges tandlæge | Ja | DDTV/20250910/informationsbrev |
| digital.post.template.bekraeftelsesbrev | Skabelon-navn for brev der udsendes når tandlægen har bekræftet borgerens valg | Ja | DDTV/20250910/bekraeftelsesbrev |
| digital.post.template.paamindelsesbrev | Skabelon-navn for brev der udsendes når borgeren ikke har foretaget et valg længe nok | Ja | DDTV/20250910/paamindelsesbrev |
| digital.post.template.afvistbrev | Skabelon-navn for brev der udsendes når tandlægen har afvist borgerens valg | Ja | DDTV/20250910/afvisningsbrev_t1 |
| digital.post.template.timeoutbrev | Skabelon-navn for brev der udsendes når tandlægen har været for længe om at svare på borgerens valg | Ja | DDTV/20250910/afvisningsbrev_t2 |
| digital.post.template.kommunikationsfejlbrev | Skabelon-navn for brev der udsendes når EDI-portalen giver fejl | Ja | DDTV/20250910/afvisningsbrev_t3 |
| edi.message.batchsize | Hvor mange personer skal EDI jobbet maksimalt fremsøge fra databasen ad gangen | Ja | 10 |
| edi.message.execution.duration | Hvor længe skal EDI jobbet køre | Ja | PT10S (10 sekunder) |
| edi.message.tokenuri | URL til EDI-portalens JWT token service | Ja | https://tst-identity.nasure.dk/auth/realms/Nasure/protocol/openid-connect/token |
| edi.message.apiuri | URL til EDI-portalens dentist API | Ja | https://tst-api.ediportalen.dk/api/ddtvRequestDentist |
| edi.message.clientid | ID på klient, dvs. på DDTV | Ja | sds-ddtv |
| edi.message.clientsecret | Client secret til udstedelse af JWT token | Ja | (skjult) |
| cleanup.batchsize | Hvor mange borgere skal oprydningsjobbet maksimalt rydde op ad gangen | Ja | 20 |
| cleanup.deceased.retention.period | Hvor lang tid skal der gå før data for en afdød person fjernes fra databasen | Ja | P1Y (1 år) |
| cleanup.unresponsive.retention.period | Hvor lang tid skal der gå før data for en person, der har modtaget digital post uden at reagere på det, fjernes fra databasen | Ja | P2Y (2 år) |
| cleanup.edi.status.retention.period | Hvor gamle må EDIStatus records blive, før de automatisk slettes. | Ja | P1M (1 måned) |
| cleanup.execution.duration | Hvor længe skal cleanup jobbet køre | Ja | PT10S (10 sekunder) |
| sts.endpoint | Endpoint for STS'en. Anvendes i forbindelse med DGWS kald til Digital Post Adapteren | Ja | http://test1-cnsp.ekstern-test.nspop.dk:8080/sts/services/NewSecurityTokenService |
| sts.keystore | Keystore med certifikat til DGWS kald | Ja | NSP_Test_Service_Consumer_sds.p12 |
| sts.keystore.password | Password til keystore med certifikat til DGWS kald | Ja | Test1234 |
| idcard.subject.name | Organisation som certifikat er udstedt til | Ja | Sundhedsdatastyrelsen |
| idcard.subject.id | CVR-nummer på organisation, som certifikat er udstedt til | Ja | 33257872 |
| idcard.system.name | Navn på system som foretager DGWS kald ti Digital Post Adapteren | Ja | DDTV |
Log4j konfiguration for alle services findes i samme bibliotek som servicekonfigurationen
Se yderligere opsætning i installationsvejledningen.
Der foretages whitelisting ved check mod databasen. En ny whitelisting kan tilføjes med følgende SQL insert:
INSERT INTO WHITELIST (cvr, comment)
VALUES ('some-cvr-here', 'some-reason-for-whitelisting-here'); |
Alle DDTV services udstiller en overvågningsside, som findes i listen af komponenter.
Overvågningssiderne returnerer enten:
Hvert servicekald medfører en ny indgang i auditloggen, som kan være udfyldt med følgende komponenter, afhængig af konteksten:
Komponent | Kontekst | Nøgle | Information |
|---|---|---|---|
| DDTV-Citizen | applyForNewDentist disregardApplicationForNewDentist noMoreReminders newDentistFullStop optOut checkStatus | personID personIDClass actorID actorIDType actorRole | Id på borgeren Typen af id i form af OID, f.eks. "OID:1.2.208.176.1.6.1.1" for CPR Id på actor (borger eller fuldmægtig) Typen af id i form af OID, f.eks. "OID:1.2.208.176.1.6.1.1" for CPR "Borger" |
| DDTV-Dentist | dentistAccept dentistReject | requestID actorID actorIDType actorRole | Unikt ID genereret for EDI meddelelse til tandlæge' ID på actor Typen af actor "System" |
{
"time": "2025-09-19T09:04:46.985764854Z",
"category": "dk.sds.nsp.audit.log",
"audit": {
"timestamp": "2025-09-19T11:04:44.736968533+02:00",
"components": [{
"component": "DDTV",
"contexts": [{
"context": "applyForNewDentist",
"information": [{
"key": "patient-id",
"type": "RPI",
"value": "1811804807"
}, {
"key": "patient-id-source",
"type": "RPI",
"value": "OID:1.2.208.176.1.6.1.1"
}, {
"key": "actor-role",
"type": "NPI",
"value": "CITIZEN"
}, {
"key": "actor-id",
"type": "NPI",
"value": "1811804807"
}, {
"key": "actor-id-source",
"type": "NPI",
"value": "CPR"
}
]
}
]
}
]
},
"access": {
"code": 200,
"duration": 2247,
"httpHeaders": {
"Content-Type": "text/xml;charset=UTF-8",
"SOAPAction": "http://sundhedsdatastyrelsen.dk/ddtv/2025/05/01/#ddtvApplyForNewDentist"
},
"httpHost": "localhost",
"idCardAttributes": {
"X509Subject": "CN=NSP Test Service Consumer,SERIALNUMBER=UI:DK-O:G:8d3fa047-c77e-47e4-bdd2-e91488610ce6,O=Sundhedsdatastyrelsen,2.5.4.97=NTRDK-33257872,C=DK",
"dk:gov:saml:attribute:AssuranceLevel": "3",
"dk:gov:saml:attribute:CprNumberIdentifier": "1811804807",
"dk:gov:saml:attribute:SpecVer": "DK-SAML-2.0"
},
"method": "POST",
"path": "/ddtv-citizen-service/2025/05/01/",
"query": "",
"port": 8080,
"protocol": "http",
"reqSize": 12564,
"resSize": 6493,
"soapHeaders": {
"Audience": "https://fsk",
"Issuer": "TEST1-NSP-STS",
"NameID": "dk:gov:saml:attribute:CprNumberIdentifier:1811804807",
"w3Action": "http://sundhedsdatastyrelsen.dk/ddtv/2025/05/01/#ddtvApplyForNewDentist",
"w3MessageID": "ae528b36-4715-470b-a603-bc4b150a028b"
},
"threadId": "default task-1",
"time": "2025-09-19T11:04:44.736899022+02:00",
"stats": {
"handlerDuration": 42,
"RequestContentDuration": 3,
"ResponseContentDuration": 0,
"SecurityProtocolRequestDuration": 17,
"SecurityProtocolResponseDuration": 20,
"bufferAllocated": false,
"usedBuffers": 2,
"activeBuffersInPool": 2,
"idleBuffersInPool": 0
},
"reqUUID": "f6567a23-dc35-46f2-8ad9-01314fa47750"
}
}
|
Der findes et status og et alarm-endpoint for hver baggrundsjob. De har følgende url'er:
De to status-endpoints kan svare følgende
De to alarm-endpoints er som udgangspunkt tomme og returnerer 200, men kan give en alarm-besked og status 500, hvis jobbet er i problemer.
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/scan-citizens-job/start
Jobbets overordnede virkemåde er, at der hentes en liste med borgere med en relevant fødselsdato fra PersonInformation. For hver identificeret borger oprettes en record for borgeren i databasen med status NO_DENTIST (hvis ikke der allerede findes data for borgeren) samt dpStatus READY,som signalerer klar til afsendelse af digital post.
Særligt omkring dette job gælder dog, at da PersonInformation-metoden personsByBirthday kun tager én bestemt dato som parameter, er det vigtigt at jobbet ved hvor langt det er kommet, så der er mulighed for at indhente det forsømte ved at afvikle jobbet for en række datoer. Dette kunne f.eks. være relevant, hvis jobbet skulle have været sat på pause i en periode. Til dette formål benyttes en BATCH_JOB_STATUS tabel i databasen, som indeholder hvilken dato jobbet næste gang skal tage udgangspunkt i.
I praksis gennemfører jobbet følgende trin:
Bemærk: Såfremt det besluttes at starte jobbet fra en fortidig dato når servicen startes første gang, er dette muligt ved på forhånd at indsætte en dato i BATCH_JOB_STATUS tabellen. Eksempel: Såfremt der ønskes initialiseret med dem, der er fyldt 22 indenfor den sidste måned, så kan der oprettes en record med JOB_NAME=ScanCitizens og NEXT_DATE=dags dato - 1 måned.
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/digital-post-job/start
Digital Post sendes via NSP-komponenten Digital Post Adapter.
I praksis gennemfører jobbet følgende trin:
Det brev der sendes kan være flere typer, afhængigt af DentistChoice status:
| Status | Digital Post |
|---|---|
| NO_DENTIST | Indledende brev til borger med information om ordning og link til Sundhed.dk |
| DENTIST_ACCEPTED | Brev til borger med bekræftelse om, at valgt tandlæge har accepteret |
| DENTIST_REJECTED | Brev til borger med information om, at valgt tandlæge har afvist henvendelsen. |
| TIMED_OUT | Brev til borger med information om, at tandlæge ikke har besvaret henvendelsen inden for en givet tidsperiode |
| COMMUNICATION_FAILURE | Brev til borger med information om, at der er opstået en teknisk fejl ved forsøg på at kontakte tandlægen. |
Dette job er beregnet til at sende påmindelsesbreve til borgere, der ikke har reageret på tidligere brev indenfor en vis periode (konfigurerbart).
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/remind-citizens-job/start
Jobbet fremsøger DentistChoice records fra i databasen, hvor følgende gælder
For disse sendes ny Digital Post i form af et påmindelsesbrev. Digital Post sendes i praksis via NSP-komponenten Digital Post Adapter, på samme måde som Digital Post jobbet gør det.
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/edi-job/start
Jobbet fremsøger records fra i databasen, hvor følgende gælder
For disse sendes en EDI-besked om, at en borger har valgt en specifik tandlæge. I kaldet indgår en RequestID, som genereres i forbindelse med at EDI-beskeden sendes, og lagres i databasen. Når der senere bekræftes eller afvises via DGWS-servicen til tandlæger, vi denne RequestID blive anvendt til at slå op hvem borgeren var.
EDI-beskeder sendes i praksis via EDI-portalen med en snitflade til formålet udviklet af Nasure.
I praksis gennemfører jobbet følende trin:
EDI-beskeder sendes i praksis via EDI-portalen, med en snitflade til formålet udviklet af Nasure.
Bemærk:
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/ignore-previous-edi-job/start
Jobbet fremsøger records fra EDIStatus-tabellen databasen, som indeholder data om "udestående" EDI-beskeder. For hver afgøres om en af følgende gælder.
For disse sendes en EDI-besked om, at en borger har valgt om, og at der skal ses bort fra tidligere EDI. I kaldet indgår den RequestID, som blev sendt i forbindelse med den oprindelige EDI-besked.
EDI-beskeder sendes i praksis via EDI-portalen med en snitflade til formålet udviklet af Nasure.
Oprydningsjobbet startes via et HTTP GET kald til <serverurl>/batch-service/cleanup-job/start
Jobbet kaldes for at påbegynde en oprydning af følgende: