diff --git a/.gitbook/assets/ANWSequence_V3.puml b/.gitbook/assets/ANWSequence_V3.puml new file mode 100644 index 0000000..76ac9b0 --- /dev/null +++ b/.gitbook/assets/ANWSequence_V3.puml @@ -0,0 +1,44 @@ +@startuml +'https://plantuml.com/sequence-diagram + +title Sequentie voor autorisatie en notificatie aan ANW-medewerker + +autonumber +actor ZMWANW as "Medewerker \nANW-regisseur"<> +participant ANWSystem as "Applicatie \nANW-Regisseur" +actor ANWEmpl as "medewerker \nANW-zorgverlener"<> +control nNodeB as "Nuts-Node \nANW-Zorgverlener" +participant VVTA as "ECD \nANW-zorgverlener" +participant VVTB as "ECD \nANW-Bronhouder" + +ref over ZMWANW:Ophalen benodige\ndata voor regisseur +-> ZMWANW ++: Melding +ZMWANW -> ZMWANW: Triage +ZMWANW -> ANWEmpl ++: Belt medewerker +return Akkoord +ZMWANW -> ANWSystem++: Koppelt medewerker\naan patiënt +ZMWANW -- +ANWSystem -> ANWSystem : Maakt een Task \nmet status "requested" \nmet bijbehorende credentials +ANWSystem -> VVTB++: Notificeert dat er een nieuwe Task is aangemaakt voor Client +VVTB --> ANWSystem: Accepted +VVTB -> ANWSystem ++: Haalt Task op +ANWSystem --> VVTB: Task +ANWSystem -- +VVTB -> VVTB: Creëert benodige credentials \nvoor ANW-Zorgverlener uit Task +VVTB --> ANWSystem --: Update de Task met VC-ID en status "ready" +ANWSystem -> VVTA ++: Notificatie dat er een Task klaar staat voor zorgverlener +VVTA --> ANWSystem: Accepted +VVTA -> ANWSystem ++: Haalt Task op +ANWSystem --> VVTA: Task +ANWSystem -- +ANWSystem -- +VVTA -> ANWEmpl ++: Notificatie van nieuwe zorgtoewijzing + +ANWEmpl -> VVTA: Opent ANW-dossier +VVTA -> nNodeB: Zoekt VC met VC-ID uit Task +nNodeB --> VVTA: VC +VVTA -> VVTB ++: Haalt dossier op +return dossier volgens ANW-specificiaties +VVTA --> ANWEmpl: Toont ANW-dossier + +@enduml \ No newline at end of file diff --git a/.gitbook/assets/ANW_Regisseur_sequence.puml b/.gitbook/assets/ANW_Regisseur_sequence.puml new file mode 100644 index 0000000..9d11e73 --- /dev/null +++ b/.gitbook/assets/ANW_Regisseur_sequence.puml @@ -0,0 +1,26 @@ +@startuml +'https://plantuml.com/sequence-diagram + +title Sequentie voor het ophalen van de benodigde gegevens voor de regisseursfunctie + +autonumber +actor ANWEmpl as "medewerker\nANW-Regisseur" +participant ANWSystem as "Applicatie \nANW-Regisseur" +control nNodeA as "Nutsnode \nANW-Regisseur" +collections VVTB as "ECDs \n- ANW-Bronhouder\n- ANW-Zorgverlener" + +ANWEmpl -> ANWSystem ++: Authenticeert zichzelf in ANW-systeem +ANWSystem -> nNodeA ++: Verkrijgen credentials in ANW-regio +return +loop per credential van organisatie +par parallel +ANWSystem -> VVTB ++: ophalen ANW-medewerkers +return +else parallel +ANWSystem -> VVTB ++: ophalen ANW-cliënten +return +end par +end loop +return Geeft "koppel medewerker\naan patiënt" mogelijkheid + +@enduml \ No newline at end of file diff --git a/.gitbook/assets/ANW_koppel_sequence.png b/.gitbook/assets/ANW_koppel_sequence.png new file mode 100644 index 0000000..b6cd8fd Binary files /dev/null and b/.gitbook/assets/ANW_koppel_sequence.png differ diff --git a/.gitbook/assets/ANW_regisseur_sequence.png b/.gitbook/assets/ANW_regisseur_sequence.png new file mode 100644 index 0000000..f3b28c3 Binary files /dev/null and b/.gitbook/assets/ANW_regisseur_sequence.png differ diff --git a/anw/TD-ANWv2024.1.md b/anw/TD-ANWv2024.1.md new file mode 100644 index 0000000..dc1ed51 --- /dev/null +++ b/anw/TD-ANWv2024.1.md @@ -0,0 +1,746 @@ +# ANW + +# Inhoudsopgave + + +* [ANW](#anw) +* [Inhoudsopgave](#inhoudsopgave) + * [Uitgeschreven proces flow](#uitgeschreven-proces-flow) + * [Uitgangspunten](#uitgangspunten) + * [Woordenlijst](#woordenlijst) + * [NUTS-adresboek](#nuts-adresboek) + * [Regisseur vraagt de cliënt / medewerker gegevens op in alle ECD’s](#regisseur-vraagt-de-cliënt--medewerker-gegevens-op-in-alle-ecds) + * [Omschrijving](#omschrijving) + * [Endpoints voor data regisseur](#endpoints-voor-data-regisseur) + * [Sequentie diagram](#sequentie-diagram) + * [Voorbeeld verifiable credential Regisseur (om cliënten/medewerkers op te halen)](#voorbeeld-verifiable-credential-regisseur-om-cliëntenmedewerkers-op-te-halen) + * [Onderstaande credential geeft het inzagesysteem uit.](#onderstaande-credential-geeft-het-inzagesysteem-uit) + * [Regisseur kent medewerker toe aan cliënt](#regisseur-kent-medewerker-toe-aan-cliënt) + * [Omschrijving](#omschrijving-1) + * [Medewerker haalt gegevens op bij het bronsysteem](#medewerker-haalt-gegevens-op-bij-het-bronsysteem) + * [Voorbeeld task](#voorbeeld-task) + * [Voorbeeld update task](#voorbeeld-update-task) + * [Voorbeeld verifiable credential Regisseur (get/put op task)](#voorbeeld-verifiable-credential-regisseur-getput-op-task) + * [Bronhouder](#bronhouder) + * [Zorgverlener](#zorgverlener) + * [Voorbeeld verifiable credential bronhouder (informatie opvragen)](#voorbeeld-verifiable-credential-bronhouder-informatie-opvragen) + * [Endpoints voor data overdracht](#endpoints-voor-data-overdracht) + * [Sequentie diagram](#sequentie-diagram-1) + * [Toelichting per stap](#toelichting-per-stap) + * [Logging](#logging) + * [Nuts register](#nuts-register) + * [ANW-Regisseur](#anw-regisseur) + * [ANW-Bronhouder](#anw-bronhouder) + * [ANW-Zorgverlener](#anw-zorgverlener) + * [TODO](#todo) + + +## Uitgeschreven proces flow + +### Uitgangspunten + +* De regisseur is bekend van de medewerker planning. Dit kan door middel van Excel lijsten die wekelijks gedeeld worden. + Dit is zoals het nu al gebeurd. De implementatie die in dit document beschreven wordt, houdt geen rekening met het + ontsluiten van de planning. +* Er is een samenwerkingsverband tussen de regisseur en de zorgaanbieders. +* Wij maken gebruik van directe aanroepen en niet van compositions. Hiervoor is gekozen omdat er “live” data + nodig is voor de ANW-usecase. + +### Woordenlijst + +* **Regisseur**: De partij die de koppeling tussen de cliënten en ANW-zorgmedewerker maakt. +* **Bronsysteem**: Het systeem/zorgaanbieder waar de cliënt in bekend is. +* **Ontvanger**: Het systeem/zorgaanbieder waar de ANW zorgmedewerker werkt. +* **ANW-Bronhouder**: is het bronsysteem +* **ANW-Zorgverlener**: is de ontvanger +* **ANW-regisseur**: is de regisseur +* **VC**: Verifiable credential +* **VP**: Verifiable presentation + +### NUTS-adresboek + +De regisseur heeft toegang tot het NUTS-adresboek, hierin kunnen de leveranciers voor elke organisatie die onderdeel uit +zal maken het ANW-netwerk aanduiden dat de betreffende organisatie gebruik maakt van de usecase “ANW-Zorgverlener” +en “ANW-Bronhouder”. De regisseur is zelf ook te vinden in het adresboek voor de bronhouder en zorgverlener om toegang +te geven tot deze regisseur met als service “ANW-Regisseur”. + +### Regisseur vraagt de cliënt / medewerker gegevens op in alle ECD’s + +#### Omschrijving + +De regisseur heeft een functionaliteit tot zijn beschikking waarmee hij eenvoudig cliënten en medewerkers met elkaar kan +koppelen. Dit kan zowel zijn eigen ECD zijn als een applicatie van derden, zie onderstaande afbeelding. + +![][image1] +Het uitgangspunt is dat de regisseur een eigen NUTS-node heeft draaien. Deze node wordt “getrust” door de NUTS-nodes van +de verschillende leveranciers. De regisseur kan met behulp van zijn eigen node een JWT-token opvragen om hiermee de +cliënt- en medewerkergegevens van de verschillende zorgaanbieders op te vragen. + +Deze zorgaanbieders vinden de regisseur door binnen het NUTS-adresboek op de usecase “ANW-Bronhouder” en +“ANW-Zorgverlener” te filteren. Hiervan krijgt hij de endpoints terug die gebruikt kunnen worden om de informatie mee op +te vragen. + +Binnen dit JWT-token wordt gespecificeerd wie de bevraging uitvoert. Wanneer er een samenwerkingsverband is, is het niet +nodig vertrouwensniveau substantieel te gebruiken. Het bevragen van de cliënt en medewerker gegevens wordt door de +regisseur geïnitialiseerd. Dit kan op eender welk moment plaatsvinden met een door de regisseur te bepalen frequentie. +De frequentie is hierbij een redelijk aantal requests per dag. + +Op basis van het ontvangen JWT-token kan de zorgaanbieder bepalen tot welke endpoints de regisseur toegang heeft. Dit +zal voor deze usecase volgende twee: [Endpoints voor data regisseur](#endpoints-voor-data-regisseur) + +Als query wordt er een op voorhand afgesproken term “ANW-zorg” meegegeven. Hiermee kan de zorgaanbieder bepalen welke +cliënten/medewerkers teruggestuurd moeten worden. + +Elke leverancier zal zelf in het ECD voorzien dat medewerkers en cliënten als "ANW" cliënt gekenmerkt worden. Afspraak +is dat alleen “In zorg” zijnde cliënten teruggegeven worden voor de ANW-usecase en ook alleen “In dienst (actief +contract)” zijnde medewerkers teruggegeven worden voor de ANW-usecase. + +Via de bovengenoemde endpoints is het vervolgens alleen mogelijk ANW-medewerkers / cliënten op te vragen als de tag +“ANW-zorg” meegegeven wordt. Elk ECD logt zelf wie deze gegevens heeft opgevraagd als bewijsvoering. + +Alle gekenmerkte cliënten worden teruggeven, onafhankelijk of er een BSN staat geregistreerd of niet. Het is de +verantwoordelijkheid van de regisseur applicatie om cliënten die niet aan de door hun gestelde voorwaarden voldoen, niet +te tonen. + +De zorgaanbieder retourneert de lijst met cliënten en medewerkers aan de regisseur. Deze kan vervolgens de lijsten +gebruiken om zelf te filteren op de gewenste cliënten / medewerkers. + +#### Endpoints voor data regisseur + +| ZIB | Endpoint | Profiel | +|:---------------|:------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Patient | /fhir/Patient?\_query=ANW-zorg | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954638](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954638) | +| Zorgmedewerker | /fhir/Practitioner?\_query=ANW-zorg | [https://simplifier.net/nictizstu3-zib2017/nl-core-practitioner](https://simplifier.net/nictizstu3-zib2017/nl-core-practitioner) | + +#### Sequentie diagram +![](../.gitbook/assets/ANW_regisseur_sequence.png) + +#### Voorbeeld verifiable credential Regisseur (om cliënten/medewerkers op te halen) + +Onderstaande credential wordt uitgegeven door het bronsysteem. + +```json +{ + "verifiableCredential": { + "atContext": [ + "https://nuts.nl/credentials/v1", + "https://www.w3.org/2018/credentials/v1", + "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" + ], + "type": [ + "NutsAuthorizationCredential", + "VerifiableCredential" + ], + "credentialSubject": { + "id": "did:nuts:{Did van regisseur}", + "purposeOfUse": "ANW-Bronhouder-RegisseurToegang", + "resources": [ + { + "operations": [ + "search" + ], + "path": "/Patient?_query=ANW-zorg", + "userContext": true, + // see note at bottom of document + "assuranceLevel": null + }, + { + "operations": [ + "create" + ], + "path": "/notification", + "userContext": false, + "assuranceLevel": null + } + ] + }, + "proof": { + "created": "2024-01-18T16:27:52.939738279+01:00", + "jws": "eyJhbGciOiJFU......", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:nuts:Eb1U3ap94wcziQhUfZSW........" + } + } +} +``` + +Onderstaand is een voorbeeld van een POST voor het aanmaken van deze credential: + +```json +{ + "issuer": "did:nuts:{DID van de bronhouder}", + "type": "NutsAuthorizationCredential", + "credentialSubject": { + "id": "did:nuts:{Did van de regiseur}", + "purposeOfUse": "ANW-Bronhouder-RegisseurToegang", + "resources": [ + { + "operations": [ + "search" + ], + "path": "/Patient?_query=ANW-zorg", + "userContext": true, + // see note at bottom of document + "assuranceLevel": null + }, + { + "operations": [ + "create" + ], + "path": "/notification", + "userContext": false, + "assuranceLevel": null + } + ] + }, + "visibility": "private" +} +``` + +### Onderstaande credential geeft het inzagesysteem uit. + +```json +{ + "verifiableCredential": { + "atContext": [ + "https://nuts.nl/credentials/v1", + "https://www.w3.org/2018/credentials/v1", + "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" + ], + "type": [ + "NutsAuthorizationCredential", + "VerifiableCredential" + ], + "credentialSubject": { + "id": "did:nuts:{Did van regisseur}", + "purposeOfUse": "ANW-Zorgverlener-RegisseurToegang", + "resources": [ + { + "operations": [ + "search" + ], + "path": "/Practitioner?_query=ANW-zorg", + "userContext": true, + // see note at bottom of document + "assuranceLevel": null + }, + { + "operations": [ + "create" + ], + "path": "/notification", + "userContext": false, + "assuranceLevel": null + } + ] + }, + "proof": { + "created": "2024-01-18T16:27:52.939738279+01:00", + "jws": "eyJhbGciOiJFU......", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:nuts:Eb1U3ap94wcziQhUfZSW........" + } + } +} +``` + +Onderstaand is een voorbeeld van een POST voor het aanmaken van deze credential: + +```json +{ + "issuer": "did:nuts:{Did van de zorgverlener organisatie}", + "type": "NutsAuthorizationCredential", + "credentialSubject": { + "id": "did:nuts:{did van de regisseur}", + "purposeOfUse": "ANW-Zorgverlener-RegisseurToegang", + "resources": [ + { + "operations": [ + "search" + ], + "path": "/Practitioner?_query=ANW-zorg", + "userContext": true, + // see note at bottom of document + "assuranceLevel": null + }, + { + "operations": [ + "create" + ], + "path": "/notification", + "userContext": false, + "assuranceLevel": null + } + ] + }, + "visibility": "private" +} +``` + +Voor het aanmaken van deze credentials moet door de leverancier een functionaliteit ontwikkeld worden waar voor de twee +usecases rechten wordt verleend aan een regissuer. + +### Regisseur kent medewerker toe aan cliënt + +#### Omschrijving + +Wanneer de regisseur een medewerker en cliënt aan elkaar gekoppeld heeft, zal deze een “Task” aanmaken. Deze “Task” +omschrijft dat er een “Verifiable credential” aangemaakt moet worden in het bronsysteem. Die task heeft als +status “[Requested](https://www.hl7.org/fhir/STU3/valueset-task-status.html)”. Binnen de “Task” staat gedefinieerd voor +wie en wat de credential uitgegeven moet worden. + +De task houdt volgende in: + +| Veld | Beschrijving | Nuts | Data type | +|:---------------|:-----------------------------------------------------------------------------------|:------------------------------------------------|:----------| +| Requester | Wie de autorisatie will aanmaken(ANW regisseur app) | Organization DID Regisseur App | DID | +| Authorizer | Bron systeem van wie de data(patient) is | Organization DID bronsysteem | DID | +| Accessor | Systeem wat de data gaat bevragen en tonen in een weergave (eigenaar Practitioner) | Organization DID partij met toegang tot de data | DID | +| PractitionerId | MedewerkerId die toegang heeft tot het systeem | | ID | +| PatientId | Patiënt waar toegang voor verleend moet worden | | ID | + +Vervolgens maakt de regisseur een verifiable credential aan voor de Task waarmee aan het bronsysteem en het ontvangende +systeem lees- en schrijfrechten worden gegeven. Aansluitend stuurt de regisseur een notificatie richting het bronsysteem +waarmee de Task daar kenbaar gemaakt wordt. + +Het bronsysteem maakt een verifiable credential aan met de gegevens in de task voor de medewerker-cliëntcombinatie. Die +credentials hebben een geldigheidsduur van 48 uur. Deze geldigheidsduur staat beschreven in zowel de Task als de +Nuts-autorisatiecredential. + +In dit credential is gedefinieerd welke profielen bevraagd mogen worden. De profiel-URL’s die opgenomen zijn kunnen in +het volgende hoofdstuk teruggelezen worden: [Endpoints voor data regisseur](#endpoints-voor-data-regisseur) + +Zodra de credential gemaakt is, wordt deze automatisch (in de huidige opzet) binnen het NUTS netwerk kenbaar gemaakt. +Het bronsysteem zet hierbij de status van de ontvangen “Task” +op “[Ready](https://www.hl7.org/fhir/STU3/valueset-task-status.html)” bij de regisseur. Ook stuurt het bronsysteem het +id van de uitgegeven verifiable credential mee in de PUT van de task. Deze id kan door de zorgverlener gebruikt worden +om het juiste VC te zoeken en mee te sturen naar het bronsysteem. Hiermee wordt voorkomen dat meerdere VC’s door de +zorgverlener worden verstuurd indien aan één cliënt meerdere medewerkers worden toegekend. + +Zodra de task de status “Ready” krijgt, stuurt de regisseur een “Notify” naar de ontvanger. Binnen deze “Notify” is de +task-id gedefinieerd waaronder het credential is aangemaakt. De notify specificeert richting de ontvanger dat medewerker +X de gegevens van cliënt Y kan gaan opvragen in het bronsysteem. + +### Medewerker haalt gegevens op bij het bronsysteem + +Zodra de medewerker de gegevens wil inzien, zoekt het ECD of er een verifiable credential is uitgegeven. Nadat dit +gevonden is authenticeert de medewerker zich via het niveau dat het bronsysteem heeft gespecificeerd bij de op te halen +endpoints. Op het moment van schrijven zal altijd het niveau “Low” aangehouden worden. Eens geautoriseerd wordt er een +JWT-Accesstoken opgehaald waarmee de individuele endpoints bevraagd kunnen worden om de cliënt gegevens te krijgen. Het +is de verantwoordelijkheid van de ontvanger dat alleen de medewerker uit de task de informatie in het bronsysteem +ophaalt. + +De endpoints die bevraagd worden zijn bepaald door de ECD-applicatie en niet door de endpoints in het “verifiable +credential”. Voor nu houden wij hier de eerder gespecificeerde endpoints voor +aan: [Endpoints voor data regisseur](#ANW-Regisseur) + +Zodra het token opgehaald is, kan de ontvanger bij het bronsysteem de gegevens ophalen. Het bronsysteem gaat kijken of +de ontvanger gemachtigd is via het credential om de gegevens op te halen. Dit gebeurt via de profielen in het +credential. Indien de ontvanger niet gemachtigd is voor een endpoint krijgt hij hierop een “403 forbidden” terug. + +Ervan uitgaande dat de ontvanger rechten heeft tot alle gegevens vastgesteld voor de ANW-usecase, worden de opgevraagde +gegevens teruggestuurd naar de ontvanger. De ontvanger kan vervolgens de gegevens op een door hem gekozen manier tonen +in zijn eigen ECD. + +Voor nu is het bijwerken van de Task naar "Voltooid" buiten scope gelaten omdat het functionele gevolg hiervan nog niet +helder is. + +#### Voorbeeld task + +```json +{ + "resourceType": "Task", + "id": "af10c4c8-bc4d-40c7-a335-fb63fe7158d3", + "meta": { + "profile": [ + "https://nuts.nl/fhir/StructureDefinition/nl-core-authorization-request" + ] + }, + "intent": "order", + "code": { + "coding": [ + { + "code": "ANW-autorisatie-verzoek" + } + ] + }, + "for": { + "reference": "Patient/{patientId}", + "display": "patient display name" + }, + "authoredOn": "2024-01-23T13:23:42.1885689+00:00", + "requester": { + "agent": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID regiseur}" + }, + "display": "Regiseur A" + }, + "onBehalfOf": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID authorizing party}" + }, + "display": "Authorizing party C (data owner)" + } + }, + "owner": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID accessing party}" + }, + "display": "Accessing party B (data accessor)" + }, + "reason": { + "text": "{optional user input of the regisseur}" + }, + "restriction": { + "period": { + "start": "2024-01-23T14:23:42.2264869+01:00", + "end": "2024-01-26T13:23:42.2295674+00:00" + }, + "recipient": [ + { + "reference": "Practitioner/{practitioner with access Id}", + "display": "anw practitioner display name" + } + ] + } +} +``` + +#### Voorbeeld update task + +```json +{ + "resourceType": "Task", + "id": "af10c4c8-bc4d-40c7-a335-fb63fe7158d3", + "meta": { + "profile": [ + "https://nuts.nl/fhir/StructureDefinition/nl-core-authorization-request" + ] + }, + "intent": "order", + "code": { + "coding": [ + { + "code": "ANW-autorisatie-verzoek" + } + ] + }, + "for": { + "reference": "Patient/{patientId}", + "display": "patient display name" + }, + "authoredOn": "2024-01-23T13:23:42.1885689+00:00", + "requester": { + "agent": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID regiseur}" + }, + "display": "Regiseur A" + }, + "onBehalfOf": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID authorizing party}" + }, + "display": "Authorizing party C (data owner)" + } + }, + "owner": { + "identifier": { + "system": "http://nuts.nl", + "value": "{DID accessing party}" + }, + "display": "Accessing party B (data accessor)" + }, + "reason": { + "text": "{optional user input of the regisseur}" + }, + "restriction": { + "period": { + "start": "2024-01-23T14:23:42.2264869+01:00", + "end": "2024-01-26T13:23:42.2295674+00:00" + }, + "recipient": [ + { + "reference": "Practitioner/{practitioner with access Id}", + "display": "anw practitioner display name" + } + ] + }, + "output": [ + { + "type": { + "coding": [ + { + "system": "http://nuts.nl", + "code": "vc-id" + } + ] + }, + "valueString": "did:nuts:EwVMYK2ugaMvRHUbGFBhuyF423JuNQbtpes35eHhkQic#b53bda82-712a-4d20-b673-e67efaf60acc" + } + ] +} +``` + +Het bronsysteem stuurt in de update het ID van het aangemaakt VC mee, waarmee het bevragende systeem het juiste VC kan +vinden voor het ophalen van de data. + +#### Voorbeeld verifiable credential Regisseur (get/put op task) + +Deze wordt uitgegeven door de regisseur, hiermee kan de ontvanger en bronsysteem de task die de regisseur klaarzet +bijwerken. Hiervoor heb je er één voor de Bronhouder en één voor de Zorgverlener: + +##### Bronhouder + +```json +{ + "verifiableCredential": { + "@context": [ + "https://nuts.nl/credentials/v1", + "https://www.w3.org/2018/credentials/v1", + "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" + ], + "credentialSubject": { + "id": "did:nuts:{DID van bronhouder}", + "purposeOfUse": "ANW-Regisseur-Autorisatieverzoek", + "resources": [ + { + "operations": [ + "read", + "update" + ], + "path": "/Task/3b63dc7f-b4d2-49bf-b8ca-a91cdafdc464", + "userContext": false + } + ] + }, + "id": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKeb#f25de109-16bc-4323-bfda-dd36974777e1", + "issuanceDate": "2023-09-26T08:05:52.83885377Z", + "issuer": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKeb", + "proof": { + "created": "2023-09-26T08:05:52.839289486Z", + "jws": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il0sImtpZCI6ImRpZDpudXRzOkFWb1hoNUxzNmtnRmtFTkZxdTZhZzhqS2dSVkI5ZXB2VW9DdUNUU3FNS2ViI0N1alVqQWlSdU1MSHQ3RV9KcTlueUJfc0tMRjQxc1paRklMSklpVFZxeFEifQ..e01dnQNAJ00L_iPj-TsAZvqWZrEEkZV3IRB9pSdTJd-kCzk450qMrf1l-k7iJ-T3zp4zOr1MuqUR0XnUf3cdKg", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKebCujUjAiRuMLHt7E_Jq9nyB_sKLF41sZZFILJIiTVqxQ" + }, + "type": [ + "NutsAuthorizationCredential", + "VerifiableCredential" + ] + } +} +``` + +##### Zorgverlener + +```json +{ + "verifiableCredential": { + "@context": [ + "https://nuts.nl/credentials/v1", + "https://www.w3.org/2018/credentials/v1", + "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" + ], + "credentialSubject": { + "id": "did:nuts:{Did van zorgverlener}", + "purposeOfUse": "ANW-Regisseur-Inzageverzoek", + "resources": [ + { + "operations": [ + "read", + "update" + ], + "path": "/Task/3b63dc7f-b4d2-49bf-b8ca-a91cdafdc464", + "userContext": false + } + ] + }, + "id": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKeb#f25de109-16bc-4323-bfda-dd36974777e1", + "issuanceDate": "2023-09-26T08:05:52.83885377Z", + "issuer": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKeb", + "proof": { + "created": "2023-09-26T08:05:52.839289486Z", + "jws": "eyJhbGciOiJFUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il0sImtpZCI6ImRpZDpudXRzOkFWb1hoNUxzNmtnRmtFTkZxdTZhZzhqS2dSVkI5ZXB2VW9DdUNUU3FNS2ViI0N1alVqQWlSdU1MSHQ3RV9KcTlueUJfc0tMRjQxc1paRklMSklpVFZxeFEifQ..e01dnQNAJ00L_iPj-TsAZvqWZrEEkZV3IRB9pSdTJd-kCzk450qMrf1l-k7iJ-T3zp4zOr1MuqUR0XnUf3cdKg", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:nuts:AVoXh5Ls6kgFkENFqu6ag8jKgRVB9epvUoCuCTSqMKeb#CujUjAiRuMLHt7E_Jq9nyB_sKLF41sZZFILJIiTVqxQ" + }, + "type": [ + "NutsAuthorizationCredential", + "VerifiableCredential" + ] + } +} +``` + +#### Voorbeeld verifiable credential bronhouder (informatie opvragen) + +Deze wordt uitgegeven door de bronhouder. Hiermee kan de ontvanger het cliëntdossier opvragen. + +```json +{ + "verifiableCredential": { + "atContext": [ + "https://nuts.nl/credentials/v1", + "https://www.w3.org/2018/credentials/v1", + "https://w3c-ccg.github.io/lds-jws2020/contexts/lds-jws2020-v1.json" + ], + "type": [ + "NutsAuthorizationCredential", + "VerifiableCredential" + ], + "credentialSubject": { + "id": "did:nuts:SjkuVHVqZndMVVJwcnUzbjhuZklhODB1M1M0LW9LcWY0WUs5S2", + "purposeOfUse": "ANW-Bronhouder-Gegevensinzage", + "resources": [ + { + "operations": [ + "read" + ], + "path": "/Patient/{patientId}", + "userContext": true, + "assuranceLevel": "low" + }, + { + "path": "/Observation?patient={patientId}&code=http://loinc.org|8310-5&date=gt{received-date-minus-3-days}", + "operations": [ + "search" + ], + "userContext": true, + "assuranceLevel": "low" + }, + { + "path": "/Observation?patient={patientId}&code=http://loinc.org|85354-9", + "operations": [ + "search" + ], + "userContext": true, + "assuranceLevel": "low" + }, + { + "path": "/Observation?patient={patientId}&code=http://loinc.org|8893-0", + "operations": [ + "search" + ], + "userContext": true, + "assuranceLevel": "low" + }, + { + "path": "/Flag?patient={patientId}}&_profile=http://nictiz.nl/fhir/StructureDefinition/zib-Alert", + "operations": [ + "search" + ], + "userContext": true, + "assuranceLevel": "low" + }, + { + "etc": "etc" + } + ] + }, + "proof": { + "created": "2024-01-18T16:27:52.939738279+01:00", + "jws": "eyJhbGciOiJFU......", + "proofPurpose": "assertionMethod", + "type": "JsonWebSignature2020", + "verificationMethod": "did:nuts:Eb1U3ap94wcziQhUfZSW........" + } + } +} +``` + +#### Endpoints voor data overdracht + +Hieronder staan de endpoints die beschikbaar gesteld moeten worden door de partijen die toegang tot het ophalen en +wegschrijven van data aan partijen die ANW-zorg verlenen. Ter verheldering zijn de colommen Sort en Count toegevoegd om +aan te tonen hoeveel resultaten er geretourneerd worden en op welke manier deze worden gesorteerd. + +| ZIB | Method | Sort | Count | Endpoint | Profiel | +|:--------------------------------------------------------------|--------|-----------|-------|:---------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Patiënt, Contactpersoon, Behandelaar(huisarts), Zorgaanbieder | GET | | | /fhir/Patient?\_id={patientId}&\_include=Patient:general-practitioner&\_include:iterate=PractitionerRole:organization | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954638](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954638) | +| Bloeddruk | GET | Date DESC | 5 | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-PulseRate&\_sort=-date&\_count=5 | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954945](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954945) | +| Lichaamstemperatuur | GET | Date DESC | 5 | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-BodyTemperature&\_sort=-date&\_count=5 | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954748](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954748) | +| Lichaamslengte | GET | Date DESC | 5 | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-BodyHeight&\_sort=-date&\_count=5 | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954746](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954746) | +| Lichaamsgewicht | GET | Date DESC | 5 | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-BodyWeight&\_sort=-date&\_count=5 | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954750](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954750) | +| Respiration | GET | Date DESC | 5 | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-Respiration&\_sort=-date&\_count=5 | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954947](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954947) | +| Rapportage | GET | Date DESC | 10 | /fhir/Observation?patient={patientId}&\_profile=https://nuts.nl/fhir/StructureDefinition/nl-core-nursingreport&\_sort=-date&\_count=10 | [https://simplifier.net/anw/nl-core-nursi ngreport](https://simplifier.net/anw/nl-core-nursingreport) | +| Rapportage (aanmaken) | POST | | | /fhir/Observation | [https://simplifier.net/anw/nl-core-nursingreport](https://simplifier.net/anw/nl-core-nursingreport) | +| Woonsituatie | GET | | | /fhir/Observation?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-LivingSituation | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954848](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954848) | +| Alerts | GET | | | /fhir/Flag?patient={patientId}}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-Alert | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954733](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954733) | +| Wilsverklaring | GET | | | /fhir/Consent?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-AdvanceDirective | [https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954726](https://simplifier.net/packages/nictiz.fhir.nl.stu3.zib2017/2.2.10/files/1954726) | +| Allergie | GET | | | /fhir/AllergyIntolerance?patient={patientId}&\_profile=http://nictiz.nl/fhir/StructureDefinition/zib-AllergyIntolerance | [http://nictiz.nl/fhir/StructureDefinition/zib-AllergyIntolerance](http://nictiz.nl/fhir/StructureDefinition/zib-AllergyIntolerance) | + +#### Sequentie diagram + +![](../.gitbook/assets/ANW_koppel_sequence.png) + +##### Toelichting per stap + +| Stapnr. | Toelichting | +|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 7 | Gebruikt hierbij het notificatie-endpoint dat gevonden is met de service "ANW-Bronhouder". In het AccessToken gebruik je de purposeOfUse "ANW-Bronhouder-RegisseurToegang" | +| 8 | Gebruikt hierbij het fhir-endpoint dat gevonden is met de service "ANW-Regisseur". In het AccessToken gebruik je de purposeOfUse "ANW-Regisseur-Autorisatieverzoek" | +| 10 | Gebruikt hierbij het fhir-endpoint dat gevonden is met de service "ANW-Regisseur". In het AccessToken gebruik je de purposeOfUse "ANW-Regisseur-Autorisatieverzoek" | +| 11 | Gebruikt hierbij het notificatie-endpoint dat gevonden is met de service "ANW-Zorgverlener". In het AccessToken gebruik je de purposeOfUse "ANW-Zorgverlener-RegisseurToegang" | +| 12 | Gebruikt hierbij het fhir-endpoint dat gevonden is met de service "ANW-Regisseur". In het AccessToken gebruik je de purposeOfUse "ANW-Regisseur-Autorisatieverzoek" | +| 15 | Het VC-ID dat in de uit stap 12 opgehaalde task kan gebruikt worden om de bijbehorende Verifiable credential te vinden. | +| 17 | Zie de [GET endpoints](#Endpoints-voor-data-overdracht). Afhankelijk van de implementatie per leverancier wanneer de GET requests worden uitgevoerd voor het opbouwen van het "ANW-Dossier" | + +## Logging + +Voor logging gaan we er vanuit dat implementeerders voldoen aan de huidige wet en regelgeving omtrent het inzien van +medische gegevens. + +## Nuts register + +Hier staan de verschillende nutsservices die de verschillende partijen moeten registreren met daarbij de endpoints die +ze beschikbaar moeten stellen. + +### ANW-Regisseur + +| Endpoint | Beschrijving | +|:---------|:--------------------------------------------------------------------| +| fhir | Base fhir endpoint waar de Task opgehaald en geüpdatet kan worden. | +| oauth | Url van de n2n/auth/v1/accesstoken van de nutsnode van de regisseur | + +### ANW-Bronhouder + +| Endpoint | Beschrijving | +|:-------------|:----------------------------------------------------------------------------------------------------------------------------------------| +| fhir | Base fhir endpoint waar de patienten ontsloten worden voor de regisseur en waar de data opgehaald kan worden voor de “ANW-Zorgverlener” | +| oauth | Url van de n2n/auth/v1/accesstoken van de nutsnode van de bronhouder van de data | +| notification | Endpoint waar de notificatie naar toe gestuurd kan worden voor het verzoek om een autorisatie aan te maken voor een “ANW-Zorgverlener” | + +### ANW-Zorgverlener + +| Endpoint | Beschrijving | +|:-------------|:------------------------------------------------------------------------------------------------------------------------------------------| +| fhir | Base fhir endpoint waar de Practitioners ontsloten worden waarop geautoriseerd kan worden | +| oauth | Url van de n2n/auth/v1/accesstoken van de nutsnode van de inzage applicatie | +| notification | Endpoint waar de notificatie naar toe gestuurd kan worden om mee te delen dat er een authorisatie door een “ANW-Bronhouder” is aangemaakt | + + +### TODO +* Alle purposes of use in een tabelletje. +* Beschrijven alle parameters meesturen en niet meer dan afgesproken en in het vc staan. +* `userContext` voor het opvragen van de lijst van Patient/Practitioner voor ANW-zorg moet duidelijk gemaakt worden: + `true` of `false`? Mogelijk moet dit om data protection redenen op `true` (immers grote lijst van namen). Voordat dit + duidelijk werd is bij een eerder technisch overleg overeengekomen voorlopig te gaan voor `false`, om (pre-)caching + makkelijker te maken. Bij moment van schrijven op 24 juli 2024 worden de VCs bij alle partijen nog aangemaakt voor + `false`, en vanuit Nedap worden de requests alvast altijd uitgevoerd met een aanwezige user context (in andere + woorden, Nuts-elevatie is verplicht alvorens het regisseursscherm geopend kan worden) en gecached per user. + +[image1]: + +[image2]: + +[image3]: \ No newline at end of file diff --git a/anw/v2024.1.md b/anw/v2024.1.md index de9ec44..06d48a0 100644 --- a/anw/v2024.1.md +++ b/anw/v2024.1.md @@ -22,7 +22,7 @@ Dit document is primair bedoeld voor softwareleveranciers die willen bijdragen a - **Bronhouder** — De zorginstelling waar de cliënt in zorg is en de organisatie die verantwoordelijk is voor het dossier van de cliënt. Vanuit het perspectief van de ANW-zorg is dit dus de organisatie waar de cliënt in zorg is en die ANW-zorg nodig heeft. - **Bronsysteem** — Het systeem/zorgaanbieder waar de cliënt in bekend is. - **Regisseur** – De zorginstelling of entiteit die verantwoordelijk is voor het plannen van de ANW-zorgprofessionals. Het is de partij die de koppeling tussen de cliënten en ANW zorgmedewerker maakt. -- **Ontvanger** — Het systeem/zorgaanbieder waar de ANW zorgmedewerker werkt. +- **Ontvanger** — Het systeem/zorgaanbieder waar de ANW-zorgmedewerker werkt. - **Doelsysteem** — Het softwaresysteem dat de gegevens van de opvragende partij beheert - **ANW-Bronhouder** — is het bronsysteem - **ANW-Zorgverlener** — is de ontvanger @@ -61,7 +61,7 @@ De volgende functionaliteiten worden onder fase 1 geschaard: ## 3.3 Buiten scope fase 1 -De volgende onderdelen zijn voor nu geparkeerd maar zijn zeker in een volgende fase relevant: +De volgende onderdelen zijn voor nu geparkeerd, maar zijn zeker in een volgende fase relevant: - Het uitzetten en opvolgen van een taak: de ANW-medewerker wil dat de volgende dag een actie moet worden uitgevoerd door de reguliere zorg en wil hiervoor een actie uitzetten.  - Het bieden van een oplossing voor declaratievraagstukken. @@ -83,15 +83,15 @@ Met deze specificatie ondersteunen we het proces van de ANW-zorg. Hierbij wordt We onderscheiden in dit proces de volgende stadia: - Een cliënt die zorg nodig heeft in de ANW-uren presenteert zich bij de zorgorganisatie van dienst (regisseur), gepland danwel ongepland -- De regisseur beoordeelt het verzoek (triage) en zet de zorgvraag door/zoekt een passende zorgprofessional die de benodigde zorg kan leveren +- De regisseur beoordeelt het verzoek (triage) en zet de zorgvraag door of zoekt een passende zorgprofessional die de benodigde zorg kan leveren - De betrokken zorgprofessional krijgt toegang tot de juiste dossierinformatie en kan de zorg leveren en het dossier verrijken met nieuwe informatie Een belangrijke basis voor het ANW-proces is dat het gaat om leveren van zorg over organisaties heen. Dat wil zeggen dat de zorgmedewerker niet in dienst is/hoeft te zijn van de organisatie waar de cliënt zorg ontvangt. Ook de beoordeling van de zorgvraag of de planning van de zorgmedewerkers kan door een andere organisatie verzorgd worden. Belangrijke uitgangspunten bij de uitwerking van het proces, zijn: -- De ANW-medewerker blijft in het eigen ECD werken. Dit betekent dat hij/zij de informatie getoond krijgt vanuit het bronsysteem van de cliënt. +- De ANW-medewerker blijft in het eigen ECD werken. Dit betekent dat hij of zij de informatie getoond krijgt vanuit het bronsysteem van de cliënt. - De ANW-medewerker krijgt alleen toegang tot de informatie die noodzakelijk is om in de ANW-uren de benodigde zorg te kunnen leveren. -- Informatie is direct toegankelijk voor de ANW-medewerker. Hij/zij ziet realtime dat er een cliënt is toegevoegd en kan zich ook direct ‘inlezen’ in de vraag en achtergrond van de cliënt. +- Informatie is direct toegankelijk voor de ANW-medewerker. Hij of zij ziet realtime dat er een cliënt is toegevoegd en kan zich ook direct ‘inlezen’ in de vraag en achtergrond van de cliënt. ### **4.1 De cliënt presenteert zich: verzoek tot zorg** @@ -130,7 +130,7 @@ Voor de functionaliteit om informatie van de ANW-cliënt in te zien, zijn de vol - Patient - Contactpersoon > type is ‘eerste contactpersoon’ - Zorgaanbieder van patient -- Behandelaar > huisartst +- Behandelaar > huisarts - Alerts > alles opnemen - Wilsverklaring > alles opnemen - Tekst rapportage (observation) > laatste 3 dagen @@ -144,7 +144,7 @@ Voor de functionaliteit om informatie van de ANW-cliënt in te zien, zijn de vol - (Bloedsuiker is gewenst, maar hier is geen zib voor) - Allergieën > alles -Daarnaast kan de toelcihting ingezien worden die de regisseur bij het toegang geven **optioneel** heeft ingevuld. +Daarnaast kan de toelichting ingezien worden die de regisseur bij het toegang geven **optioneel** heeft ingevuld. ## 5.2 Wegschrijven van informatie @@ -153,11 +153,11 @@ Alleen rapportages worden weggeschreven (en geen metingen of taken/opvolging). O Op basis van een [observation]() wordt een nieuw profiel uitgewerkt die we nursingreport noemen. -Om deze observatie te onderscheiden van bijvoorbeeld bloedruk, lichaamslengte, etc die ook de observatie gebruiken, wordt de snomed code voor “Patient encounter report” (11591000146107, ) gebruikt.  +Om deze observatie te onderscheiden van bijvoorbeeld bloeddruk, lichaamslengte, etc. die ook de observatie gebruiken, wordt de snomed code voor “Patient encounter report” (11591000146107, ) gebruikt.  Er is bewust niet gekozen voor de composition zoals die al bestaan voor ContactVerslag en SOEPVerslag omdat deze beide uitgaan van de SOEP structuur en dit niet altijd wordt toegepast bij een verpleegkundige rapportage.  -De technische specificaties zijn hier te vinden (let op: dit is een voorstel om een beeld te geven, die hoeft niet perse onder gebracht te worden bij een “houder”): +De technische specificaties zijn hier te vinden (let op: dit is een voorstel om een beeld te geven, die hoeft niet per se onder gebracht te worden bij een “houder”): [nl-core-nursingreport](https://simplifier.net/anw/nl-core-nursingreport) @@ -181,7 +181,7 @@ De regisseur dient een (digitale) match te maken tussen de ANW-medewerker en de ## 5.4 Technische specificaties -De technische uitwerking is [hier](https://docs.google.com/document/d/1HBYkx3ViSmC8M63SM4nB8DYhdLg_qMj4vASLTefi4Uk/edit?usp=sharing) te vinden. +De technische uitwerking is [hier](TD-ANWv2024.1.md) te vinden. # DPIA