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/ |
| 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 |
|---|---|---|---|
| idsas.datasource.jndi | 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/ |
| whitelisted.cvrs | Kommasepareret liste af whitelistede CVR-numre. Såfremt listen er blank er der ingen CVR-begrænsning. | Nej | 33257872 |
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.days | Hvor mange dage skal en person være afdød før data fjernes fra databasen | Ja | 365 |
| cleanup.unresponsive.retention.days | Hvor mange dage der gå før data slettes for en person, der har modtaget digital post, uden at reagere på det | Ja | 730 |
| cleanup.edi.status.retention.days | Hvor gamle EDIStatus records må blive (i dage), før de automatisk slettes | Ja | 30 |
| 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
Jobbet foretager et kald til PersonInformation, som returnerer borgere med den relevante fødselsdato. For hver identificeret borger oprettes en record bor borgeen 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.
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/digital-post-job/start
Jobbet fremsøger records fra i databasen med dpStatus = READY. Der afsendes forskellige digital post breve afhængigt af 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 information om, at valgt tandlæge har accepteret |
| DENTIST_REJECTED | Brev til borger med information om, at valgt tandlæge har afvist, samt evt. årsag |
Digital Post sendes i praksis via NSP-komponenten Digital Post Adapter
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/remind-citizens-job/start
Jobbet fremsøger 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.
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.
Jobbet startes via et HTTP GET kald til <serverurl>/batch-service/ignore-previous-edi-job/start
Jobbet fremsøger records fra EDIStatus-tabellen databasen. 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: