Indledning

Nærværende dokument udgør driftsvejledningen for Prøvebestillingsindlæseren, også kaldet Batchmotoren. Prøvebestillingsindlæseren er en indlæser som modtager et excel ark med kontrol data og cpr numre, beriger disse med data fra Personer og Sikrede og sender information til hhv. Synlab, for rekvisitioner, og Strålfors, for brevudsendelse, med henblik på at indkalde personer til Covid-19 prøver..

Prøvebestillingsindlæseren er en webapplikation der deployer på en Wildfly applikationsserver.

Distributionen af Prøvebestillingsindlæseren foregår som et Docker image der er bygget på NSP platform Docker imaget (registry.nspop.dk/platform/nsp)

Monitoreringssnitflader

Alle indlæsere overvåges via en simpel statusservice. (Se evt. https://www.nspop.dk/display/public/web/Husregler+for+udvikling+til+NSP#HusreglerforudviklingtilNSP-Snitfladetilmonitorering(gl4.4)).

Statusservicen kan tilgås på URL http://<host>:<port>/proevebestillingsindlaeser/status hvor <host> og <port> peger på den aktuelle installation.

Denne statusservice bliver overvåget ved at den bliver kaldt hver 10. sekund. Denne returnerer en HTTP status kode, som enten er 200 (ok) eller 500 (internal server error). Ved 500 er det tegn på, at en NSP driftleverandøren skal i gang med at undersøge problemet.

Statusservicen giver udslag i følgende situationer, som vil sætte support i gang:

De mulige svar fra statusservicen er:

OK status

Ved normal drift vil statusservicen returnere http 200 med denne information

Her vises detaljer om det kørende byg samt, hvilke skabeloner der er kendte.

Ikke OK status

Opstår som følge af HTTP 500 status kode og kræver NSP driftleverandørens umiddelbare opmærksomhed. De mulige situationer, hvor HTTP 500 status kode leveres er beskrevet herunder.

Ikke færdiggjorte CPR batches

Hvis der mod forventning ligger CPR batches, som ikke er færdiggjorte pga. manglende kvitteringer fra Synlab vil følgende status vises:

Der er her behov for at NSP driftleverandøren tager fat i Synlab og eftersøger de(n) manglende kvittering(er).

Manglende adgang eksterne systemer

Status siden giver besked hvis der mangler adgang til et eller flere eksterne systemer.

SFTP

Hvis der ikke er adgang til en eller flere SFTP servere vil status vises som

Der er her behov for at NSP driftleverandøren tager fat i leverandøren af den SFTP server, hvortil der ikke kan opnås forbindelse.

Databaser

Hvis der ikke er adgang til en af de anvendte databaser vil status vises som

eller 

Der er her behov for at NSP driftleverandøren tager fat i NSP leverandøren for at udrede, hvorfor der mangler adgang til en eller flere databaser.

Generelle overvågningssnitflader

Ingen - ud over den beskrevne statusservice.

Service snitflader

Ingen.

Hvordan agerer Prøvebestillingsindlæseren

Prøvebestillingsindlæseren aflæser en eller flere SFTP servere for nye filer af typen .xlsx (et CPR batch), og når der dukker en fil op, hentes den ind til Prøvebestillingsindlæseren og slettes fra SFTP serveren. Den modtagne fil tjekkes for format og konsistens og derefter påbegyndes behandlingen af de data der findes i den modtagne fil. Hvis valideringen fejler, leveres der en .fejl fil tilbage i den SFTP folder hvorfra filen blev hentet.

Prøvebestillingsindlæseren er designet til at gøre opmærksom på, hvis en modtagen CPR fil indeholder fejl der umuliggør behandling af filen. Hvis der detekteres fejl lægges der en fil tilbage i SFTP folderen der hedder det samme som den modtagne fil men med endelsen .fejl.

F.eks. hvis der leveres en fejlbehæftet fil med navnet SSI_Indberetning_20200601.xlsx vil der efter behandling af filen ligge i fil med navnet SSI_Indberetning_20200601.fejl i SFTP folderen som indeholde en beskrivelse af den detekterede fejl. De fejlsituationer der håndteres er:

Der er tidligere modtaget en CPR fil med samme navn

Hvis der modtages en CPR fil med samme navn som en tidligere behandlet fil, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning_20200601.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: En CPR liste med filnavnet SSI_Indberetning_20200601.xlsx er behandlet tidligere.
Når fejlen er rettet kan filen forsøges behandlet igen.

CPR filen anvender en ukendt brevskabelon

Informationen på 1. faneblad skal udpege de brevskabeloner der skal anvendes til udsendelse af breve til de angivne CPR numre.

Hvis de angivne skabelon navne ikke matcher en kendt brevskabelon og der derfor ikke kan sendes de korrekte oplysninger til Strålfors, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning_20200601.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Der eksisterer ikke nogen brev-skabelon der matcher ønskede skabeloner XXXX og/eller YYYY i filen SSI_Indberetning_20200601.xlsx.
Når fejlen er rettet kan filen forsøges behandlet igen.

CPR filen indeholder ikke nogen valide CPR numre

Hvis der ikke kan fremfindes nogen CPR numre i filen, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Filen SSI_Indberetning.xlsx
- indeholder ikke nogen valide CPR numre.

CPR filen er korrupt

Hvis CPR filen er beskadiget og derfor ikke kan indlæses, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning_20200601.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Filen SSI_Indberetning_20200601.xlsx kan ikke indlæses som et Excel regneark.
Når fejlen er rettet kan filen forsøges behandlet igen.

CPR filen mangler kontrol data

Informationen på 1. faneblad skal styre behandlingen af rekvisitioner og breve. Hvis ikke alle oplysningerne er udfyldt kan det betragtes som en fejl.

Hvis der mangler kontrol data i filen, vil fejl filen indeholde følgende beskrivelse (afhængig af hvilke kontrol data der mangler):

CPR filen SSI_Indberetning.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Filen SSI_Indberetning.xlsx
- indeholder ikke en angivelse af "Batch ID"
- indeholder ikke en angivelse af "Prøvetype"
- indeholder ikke en angivelse af "Send breve"
- indeholder ikke en angivelse af "Send breve til gr2+"
- indeholder ikke en angivelse af "Rekvisition til gr2+"

Når fejlen er rettet kan filen forsøges behandlet igen.

eller

CPR filen SSI_Indberetning.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Filen SSI_Indberetning.xlsx
- indeholder ikke en angivelse af "Prøvetype"
- indeholder ikke en angivelse af "Rekvisition til gr2+"
- indeholder ikke en angivelse af "Brevskabelon til gr2+"

Når fejlen er rettet kan filen forsøges behandlet igen.

CPR filen mangler type angivelse

Informationen på det skjulte 1. faneblad skal styre behandlingen af den modtagne fil. Hvis der ikke er angivet en type eller typen er ukendt betragtes det som en fejl.

Hvis der mangler type angivelse i filen, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Der er ikke angivet en type i filen SSI_Indberetning.xlsx.

Når fejlen er rettet kan filen forsøges behandlet igen.

Hvis der der er en ukendt type angivelse i filen, vil fejl filen indeholde følgende beskrivelse:

CPR filen SSI_Indberetning.xlsx er fejlet og der er IKKE oprettet rekvisitioner eller afsendt breve på baggrund af denne fil.
Årsagen til fejlen er: Den angivne type XXX i filen SSI_Indberetning.xlsx matcher ikke de supporterede typer TESTCENTER_DANMARK eller REGIONAL.

Når fejlen er rettet kan filen forsøges behandlet igen.


Det efterfølgende flow

Alt afhængig af de kontrol data der er angivet i den modtagne excel fil, leveres der 

Hvis der er leveret en fil til Synlab, afventer Prøvebestillingsindlæseren en kvitteringsfil fra Synlab før den videre håndtering, herunder en evt. levering af en fil til Strålfors, foretages.

For hver fil der modtages opsamles der statistik over kontroldata samt de indeholdte personers fordeling på kommune/region, sygesikringsgrupper og cpr-status. Hver nat opdateres en samlet statistik med opsamlede data fra den foregående dag og den opdaterede statistik leveres til en SFTP folder.

Leveringen til Strålfors indeholder de brevskabeloner der skal anvendes, og Prøvebestillingsindlæseren poller en skabelon SFTP folder for filer af typen .docx, og når en sådan fil ankommer lægges den  i den interne skabelon folder og kan derefter refereres fra et CPR batch og anvendes ved levering til Strålfors. Prøvebestillingsindlæseren viser på statussiden de kendte skabeloner.

Håndtering af fejlsituationer

Når statusservicen svarer med en HTTP 500 status kode skal der straks igangsættes arbejde fra NSP driftleverandøren side til hhv.

En detaljeret oversigt over de mulige fejlsituationer, f.eks. hvor i flowet en fejlende SFTP server vil give problemer, er beskrevet her.

Beskrivelse af logs

Prøvebestillingsindlæseren skriver til 4 forskellige log filer, der alle er placeret lokalt i Docker containeren i Wildfly standard log folderen: /pack/wildfly8/standalone/log 

NSP SLA log

Denne log ligger i filen nsputil-sla.log og indeholder NSP SLA logninger på formen

12-07-2020 11:39:24,970 [Camel (camel-1) thread #4 - sftp://ssi@proevebestillingsftp:22/ssi/batch] INFO  dk.sdsd.nsp.slalogdata - LogPoint="LoggerBean" LogPointUniqId="LoggerBean" StartTime="2020-07-12 11:39:24.970" EndTime="2020-07-12 11:39:24.970" Duration="24 microseconds" MessageId="2a779b79-8682-45cf-aa38-fe879c1d9f62" RequestSize=0 ReplySize=0 Result=OK ClientIP="<empty>" SOAPOperation="DataSet fetched" SOAPEndpoint="<empty>" SOAPAction="<empty>" TargetSOAPOperation="<empty>" TargetSOAPEndpoint="<empty>" GenericCallParms(1)= { ("Input","SSI_Indberetning2.xlsx") }
12-07-2020 11:39:25,308 [Camel (camel-1) thread #5 - file:///tmp/proevebestilling/ssi/batch] INFO  dk.sdsd.nsp.slalogdata - LogPoint="LoggerBean" LogPointUniqId="LoggerBean" StartTime="2020-07-12 11:39:24.970" EndTime="2020-07-12 11:39:24.970" Duration="24 microseconds" MessageId="a5cb9287-a861-4aa5-bbc6-a373dba79c13" RequestSize=0 ReplySize=0 Result=OK ClientIP="<empty>" SOAPOperation="DataSet received" SOAPEndpoint="<empty>" SOAPAction="<empty>" TargetSOAPOperation="<empty>" TargetSOAPEndpoint="<empty>" GenericCallParms(1)= { ("Input","SSI_Indberetning2.xlsx") }
12-07-2020 11:39:54,030 [Camel (camel-1) thread #2 - sftp://synlab@proevebestillingsftp:22/synlab] INFO  dk.sdsd.nsp.slalogdata - LogPoint="LoggerBean" LogPointUniqId="LoggerBean" StartTime="2020-07-12 11:39:54.030" EndTime="2020-07-12 11:39:54.030" Duration="16 microseconds" MessageId="5235f7f4-f1a8-48ff-b0b1-9fac54e75e16" RequestSize=0 ReplySize=0 Result=OK ClientIP="<empty>" SOAPOperation="DataSet fetched" SOAPEndpoint="<empty>" SOAPAction="<empty>" TargetSOAPOperation="<empty>" TargetSOAPEndpoint="<empty>" GenericCallParms(1)= { ("Input","a5cb9287-a861-4aa5-bbc6-a373dba79c13_rekvisitioner.kvit") }
12-07-2020 11:40:42,441 [Camel (camel-1) thread #1 - sftp://stralfors@proevebestillingsftp:22/stralfors] INFO  dk.sdsd.nsp.slalogdata - LogPoint="LoggerBean" LogPointUniqId="LoggerBean" StartTime="2020-07-12 11:40:42.441" EndTime="2020-07-12 11:40:42.441" Duration="23 microseconds" MessageId="8798507e-c9b2-45f3-9805-5dd2c28c598a" RequestSize=0 ReplySize=0 Result=OK ClientIP="<empty>" SOAPOperation="DataSet fetched" SOAPEndpoint="<empty>" SOAPAction="<empty>" TargetSOAPOperation="<empty>" TargetSOAPEndpoint="<empty>" GenericCallParms(1)= { ("Input","SSI_COVID19_SKRX_200712_113954_02_Rapport.csv") }
12-07-2020 11:40:42,804 [Camel (camel-1) thread #7 - file:///tmp/proevebestilling/straalfors] INFO  dk.sdsd.nsp.slalogdata - LogPoint="LoggerBean" LogPointUniqId="LoggerBean" StartTime="2020-07-12 11:40:42.441" EndTime="2020-07-12 11:40:42.804" Duration="362860 microseconds" MessageId="8798507e-c9b2-45f3-9805-5dd2c28c598a" RequestSize=0 ReplySize=0 Result=OK ClientIP="<empty>" SOAPOperation="DataSet completed" SOAPEndpoint="<empty>" SOAPAction="<empty>" TargetSOAPOperation="<empty>" TargetSOAPEndpoint="<empty>" GenericCallParms(1)= { ("Input","SSI_COVID19_SKRX_200712_113954_02_Rapport.csv")


Audit log

Denne log ligger i filen proevebestillingAudit.log og indeholder overordnet logning af Yderindlæserens aktivitet

timestamp="2020-07-13 09:44:00,373" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been validated"
timestamp="2020-07-13 09:44:00,998" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been parsed"
timestamp="2020-07-13 09:44:01,403" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been enriched for Synlab"
timestamp="2020-07-13 09:44:03,351" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file 7ff22650-b2fa-461d-8192-dfd75ffa11b9_rekvisitioner.csv has been distributed to Synlab"
timestamp="2020-07-13 09:44:14,794" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Synlab receipt 7ff22650-b2fa-461d-8192-dfd75ffa11b9_rekvisitioner.kvit has been received"
timestamp="2020-07-13 09:44:15,122" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been enriched for Strålfors"
timestamp="2020-07-13 09:44:17,054" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_COVID19_SKRX_200713_094415_01.zip has been packed and distributed to Strålfors"
timestamp="2020-07-13 09:44:33,376" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Strålfors receipt SSI_COVID19_SKRX_200713_094415_01_AfviklingsRapport.csv has been received"
timestamp="2020-07-13 09:44:33,420" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been completed with status Completed"
timestamp="2020-07-13 09:44:33,606" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Strålfors receipt SSI_COVID19_SKRX_200713_094415_01_Rapport.csv has been received - but is ignored as another Strålfors receipt has already been processed"


Application log

Denne log ligger i filen proevebestillingApplication.log og indeholder detaljeret logning af Yderindlæserens aktivitet

timestamp="2020-07-13 09:43:59,958" priority="DEBUG" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="The file SSI_Indberetning.xlsx has been fetched"
timestamp="2020-07-13 09:44:00,322" priority="DEBUG" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been received"
timestamp="2020-07-13 09:44:00,373" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been validated"
timestamp="2020-07-13 09:44:00,998" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been parsed"
timestamp="2020-07-13 09:44:01,403" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been enriched for Synlab"
timestamp="2020-07-13 09:44:03,351" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file 7ff22650-b2fa-461d-8192-dfd75ffa11b9_rekvisitioner.csv has been distributed to Synlab"
timestamp="2020-07-13 09:44:14,424" priority="DEBUG" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="The file 7ff22650-b2fa-461d-8192-dfd75ffa11b9_rekvisitioner.kvit has been fetched"
timestamp="2020-07-13 09:44:14,794" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Synlab receipt 7ff22650-b2fa-461d-8192-dfd75ffa11b9_rekvisitioner.kvit has been received"
timestamp="2020-07-13 09:44:15,122" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been enriched for Strålfors"
timestamp="2020-07-13 09:44:17,054" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_COVID19_SKRX_200713_094415_01.zip has been packed and distributed to Strålfors"
timestamp="2020-07-13 09:44:32,869" priority="DEBUG" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="The file SSI_COVID19_SKRX_200713_094415_01_Rapport.csv has been fetched"
timestamp="2020-07-13 09:44:32,880" priority="DEBUG" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="The file SSI_COVID19_SKRX_200713_094415_01_AfviklingsRapport.csv has been fetched"
timestamp="2020-07-13 09:44:33,376" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Strålfors receipt SSI_COVID19_SKRX_200713_094415_01_AfviklingsRapport.csv has been received"
timestamp="2020-07-13 09:44:33,420" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The file SSI_Indberetning.xlsx has been completed with status Completed"
timestamp="2020-07-13 09:44:33,606" priority="INFO" class="dk.nsi.sdm.proevebestilling.bean.LoggerBean" message="(CPR Batch SSI_Indberetning.xlsx) The Strålfors receipt SSI_COVID19_SKRX_200713_094415_01_Rapport.csv has been received - but is ignored as another Strålfors receipt has already been processed"

Stat log

Denne log ligger i filen proevebestillingStat.log og indeholder statistik logning af Yderindlæserens aktivitet

{"Time to parse":"PT0.601S","Time to Enrich Strålfors":"PT0.304S","Time to pack zip":"PT0.034S","Time to validate":"PT0.014S","Time to Synlab kvittering":"PT0.013S","Application":"Prøvebestillingsindlæser","Timestamp":"2020-07-13 09:44:33,434","Time to Enrich Synlab":"PT0.384S","Time to Strålfors kvittering":"PT0.01S","ExchangeId":"7ff22650-b2fa-461d-8192-dfd75ffa11b9"}