Koppelmij Implementation Guide
0.1.0 - ci-build

Koppelmij Implementation Guide - Local Development build (v0.1.0) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Gegevensdienst Verzamelen Aanbiedertaken

Changelog

Versie Datum Wijziging
0.0.1 2026-04-30 Initiële versie
0.0.2 2026-05-01 Verwijzing naar SMART Task-based Launch toegevoegd
0.0.3 2026-05-01 Twee rollen van ServiceRequest (basedOn vs focus) uitgewerkt
0.0.4 2026-05-01 Scope herdefinieerd: focus op gegevensafspraken PGO-DVA en Module-DVA; workflow/orkestratie buiten scope
0.0.5 2026-05-01 Aligned met Jelmer's Technical Design: PATCH ipv PUT, owner ipv patient, ServiceRequest.code.text als groepslabel, Organization toegevoegd
0.0.6 2026-05-07 Aligned met Confluence 3.8 (06-05-2026): token revocation (RFC 7009) verwijderd; DVA als bron van waarheid voor Task.status bij terugkeer expliciet gemaakt

Inleiding

In KoppelMij fungeert het PGO als het centrale overzicht voor de cliënt. De cliënt wil in één oogopslag alle taken van verschillende zorgaanbieders zien — zonder eerst in afzonderlijke modules te moeten kijken. Dit vereist dat individuele taken binnen een module zichtbaar en launchbaar zijn vanuit het PGO.

Deze pagina beschrijft de FHIR-gegevensdienst Verzamelen Aanbiedertaken: welke FHIR-resources beschikbaar zijn bij de DVA, en wat de gegevensafspraken zijn tussen de betrokken partijen. De gegevensdienst is de eerste MedMij-gegevensdienst die uitvoerbare (launchbare) data bevat.

Scope

De gegevensdienst definieert twee gegevensafspraken:

  1. PGO - DVA: welke data het PGO ophaalt bij de DVA (taken, opdrachten, moduledefinities, endpoints).
  2. Module - DVA: welke data de module leest en schrijft in de context van een SMART on FHIR launch (taakcontext, statusupdates).
GegevensafspraakPGO - DVAGegevensafspraakModule - DVA(SMART on FHIR context)PGODVA(FHIR Server)ModuleXIS / ECD(buiten scope)Catalogusbeheer AD(buiten scope)FHIR Workflow /Zorgplanning(buiten scope)GET Task, SR,AD, EndpointPUT Task (status),GET context   

Buiten scope van deze gegevensdienst

De gegevensdienst legt vast wat er uitgewisseld wordt, niet hoe de data tot stand komt. De volgende onderwerpen vallen buiten scope:

  • Catalogusbeheer van ActivityDefinitions — hoe de zorgaanbieder (niet noodzakelijk de DVA) de catalogus van moduledefinities opbouwt en uitwisselt met module-aanbieders.
  • FHIR Workflow / Zorgplanning — hoe in een zorginformatiesysteem (XIS/ECD) het proces verloopt waarmee een behandelaar tot een Task of ServiceRequest komt.
  • Subscription-mechanisme — hoe de module-aanbieder genotificeerd wordt over nieuwe ServiceRequests (orkestratie tussen module en CKT/zorgaanbieder).
  • ActivityDefinition.kind als discriminator — de keuze tussen Task- en ServiceRequest-flow is een workflow-beslissing, geen onderdeel van de gegevensuitwisseling. Zie Harmonisatie met Koppeltaal voor context.

Betrokken partijen

Partij Rol
PGO Toont taken uit DVA's van zorgaanbieders aan de cliënt. PGO's zijn "lege hulsen" die met deze gegevensdienst voor het eerst uitvoerbare (launchbare) data ontvangen.
DVA Dienstverlener Aanbieder — ontsluit data namens de zorgaanbieder. De DVA biedt de FHIR-server waarop PGO en module hun gegevensafspraken uitvoeren.
Module-aanbieder Biedt (online) behandelingen of andere diensten aan via de DVA van de zorgaanbieder. De module leest en schrijft taakdata in de context van een SMART on FHIR launch.

FHIR Resources

Resource Rol in de gegevensdienst
Task Individuele taak voor de cliënt — het centrale object dat het PGO toont en de module bijwerkt
ServiceRequest Overkoepelende opdracht of concrete instructie waaraan taken gebonden zijn
ActivityDefinition Sjabloon van de module; beschrijft wat gelauncht kan worden en via welk endpoint
Endpoint Technisch launch-adres van de module
Patient De cliënt voor wie de taken bedoeld zijn
Practitioner / PractitionerRole De behandelaar die de opdracht heeft geïnitieerd
Organization De zorgaanbieder-organisatie (via PractitionerRole.organization)

Resource-relaties

ActivityDefinitionServiceRequest B(groepering)subject = Patientrequester = PractitionerPatientPractitionerTask B1Task B2Task B3ext:instantiatessubjectrequesterbasedOnbasedOnbasedOnext:instantiatesext:instantiatesext:instantiates

De kern van het model:

  • De ActivityDefinition verwijst via de extensie endpoint naar het Endpoint met het launch-adres.
  • De Task verwijst via de extensie instantiates naar de ActivityDefinition die beschrijft welke module gelauncht wordt.
  • Elke Task heeft twee referentiepaden naar ServiceRequest, elk met een eigen semantiek:

Twee rollen van ServiceRequest

Een Task verwijst naar twee verschillende ServiceRequest-instances:

Referentie Rol Voorbeeld
Task.basedOn Groepering — de overkoepelende interventie waarbinnen de taak valt. Alle taken van dezelfde interventie delen dezelfde basedOn ServiceRequest. "Behandelprogramma COPD"
Task.focus Instructie — de concrete, eventueel herhalende opdracht voor de patiënt waaraan deze taak invulling geeft. "Wekelijks vragenlijst Kwaliteit van Leven invullen" of "Dagelijks bloeddruk meten"

Dit onderscheid is nodig omdat een individuele taak ("vul vandaag de vragenlijst in", "doe nu een meting") een eigen lifecycle heeft (requested → in-progress → completed), maar gebonden kan zijn aan een bredere en/of herhalende instructie. De basedOn ServiceRequest groepeert alle taken van een interventie; de focus ServiceRequest legt de specifieke opdracht vast die tot deze taak heeft geleid.

Beide zijn altijd verschillende resource-instances: de groeperings-SR opereert op interventieniveau, de instructie-SR op opdrachtniveau.

ServiceRequest B(groepering)Behandelprogramma COPDServiceRequest B.1(instructie)""Wekelijks vragenlijstKwaliteit van Leven""ServiceRequest B.2(instructie)Dagelijks bloeddruk metenTask B1.1status = completedTask B1.2status = requestedTask B2.1status = in-progressTask B2.2status = requestedbasedOnbasedOnbasedOnbasedOnfocusfocusfocusfocus

Gegevensafspraak PGO - DVA

Het PGO haalt taken op via de DVA FHIR-server. De zoekvraag is:

GET /Task?owner=Patient/{patient-id}

Het PGO groepeert de ontvangen taken op basis van Task.basedOn (verwijzing naar de groeperings-ServiceRequest). De display-naam van de groep komt uit ServiceRequest.code.text van de betreffende DigitalGroupPlan. Zo kan het PGO per interventie een overzicht tonen van individuele taken, met status per taak.

Het PGO resolvet het launch-adres via de keten Task → ActivityDefinition → Endpoint.address (zie Technical Walkthrough: Uitvoeren launch als PGO).

DVA is leidend voor Task.status. Na terugkeer van een module-launch MOET het PGO de taak opnieuw ophalen bij de DVA en uitsluitend de daar verzamelde status overnemen. Eventuele status- of error-query-parameters op de return_url zijn slechts een UX-hint waarmee het PGO direct een gebruikersvriendelijke melding kan tonen, zonder te wachten op de her-synchronisatie.

Gegevensafspraak Module - DVA (SMART on FHIR context)

De module ontvangt bij de SMART on FHIR launch de taakcontext (patient, task-id, fhirUser) en communiceert via het access_token met de DVA FHIR-server.

Lezen:

  • GET /Task/{id} — opvragen van de taak waarvoor de module is gelauncht, inclusief de referenties naar basedOn en focus ServiceRequests.

Schrijven:

De volledige SMART on FHIR launch-flow (van launch-voorbereiding tot terugkeer naar PGO) is beschreven in de Technical Walkthroughs.

In Koppeltaal wordt op de Task een custom extensie instantiates gebruikt om te verwijzen naar de ActivityDefinition. Het voorstel is om dezelfde extensie symmetrisch op de ServiceRequest toe te passen:

  • De verwijzing van ServiceRequest naar ActivityDefinition wordt op dezelfde manier geïmplementeerd als bij Task.
  • Een vergelijkbare SearchParameter kan worden gedefinieerd voor ServiceRequest.
  • Het zoek- en Subscription-criterium wordt gebaseerd op een bewezen mechanisme.

Harmonisatie met Koppeltaal (informatief)

De gegevensdienst is ontworpen in samenhang met Koppeltaal. Een belangrijk harmonisatiepunt is het gebruik van ActivityDefinition.kind als discriminator voor het type workflow:

AD.kind Betekenis Flow
Task (of leeg) Module werkt op taakniveau Huidige Koppeltaal-werkwijze: één taak per toewijzing, module als black box.
ServiceRequest Module werkt op opdrachtniveau KoppelMij-werkwijze: module maakt individuele taken aan binnen een ServiceRequest.

Dit is een workflow-beslissing die buiten de gegevensdienst zelf valt — de DVA bevat het resultaat (de Tasks en ServiceRequests), ongeacht welk patroon tot hun creatie heeft geleid. Het PGO en de module hoeven het onderscheid niet te kennen; zij werken altijd met dezelfde FHIR-resources.

BehandelaarCentrale KoppeltaalModule-CliëntBehandelaar(EPD)Behandelaar(EPD)Centrale Koppeltaal(CKT) voorzieningCentrale Koppeltaal(CKT) voorzieningModule-aanbiederModule-aanbiederCliënt(PGO)Cliënt(PGO)Configuratie (eenmalig)POST ActivityDefinition(kind=ServiceRequest)POST Subscription(criteria: ServiceRequest?instantiates=AD-X)ToewijzingPOST ServiceRequest B(ext:instantiates=AD-X,subject=Patient,requester=Practitioner)Subscription notification(nieuwe ServiceRequest B)GET ServiceRequest BTaakcreatie door modulePOST Task B1(basedOn=ServiceRequest B,for=Patient)POST Task B2(basedOn=ServiceRequest B,for=Patient)Optioneel: handmatige taak door behandelaarPOST Task B3(basedOn=ServiceRequest B,for=Patient)UitvoeringGET Task?basedOn=ServiceRequest-B(toont alle taken)Launch taak B1(SMART on FHIR / KoppelMij launch)PUT Task B1(status=completed)

Ter vergelijking de huidige Koppeltaal-flow:

BehandelaarKoppeltaal-ModulePatiëntBehandelaar(EPD)Behandelaar(EPD)Koppeltaal-voorzieningKoppeltaal-voorzieningModuleModulePatiënt(Portaal)Patiënt(Portaal)POST Task(instantiatesCanonical=AD-X,for=Patient)Launch module(SMART on FHIR)PUT Task(status=completed)

Zie de Memo: ServiceRequest als orkestratiemiddel voor de volledige analyse en de SMART Task-based Launch overwegingen voor vergelijking met het experimentele SMART Task-based Launch mechanisme.

Open vragen

Wie wordt de requester van de taken?

Wanneer de module taken aanmaakt binnen een ServiceRequest:

  • De behandelaar — logisch vanuit zorgperspectief, maar de module kent de behandelaar mogelijk niet direct.
  • Overgenomen van de ServiceRequestTask.requester = ServiceRequest.requester. Dit lijkt het meest consistent: de behandelaar is en blijft de opdrachtgever.

Kan een ServiceRequest taken van meerdere module-aanbieders bevatten?

Het huidige voorstel gaat uit van één module-aanbieder per ServiceRequest. Een samengestelde opdracht (meerdere modules) verhoogt de complexiteit aanzienlijk en vereist nadere uitwerking.

Lifecycle-relatie ServiceRequest en Tasks

De bestaande Task lifecycle (requested → accepted → in-progress → completed) blijft van toepassing op individuele taken. De ServiceRequest introduceert een bovenliggende lifecycle:

  • active: er kunnen nog taken worden toegevoegd.
  • completed: alle taken zijn afgerond.
  • revoked: de opdracht is ingetrokken.

De relatie tussen de Task-lifecycles en de ServiceRequest-lifecycle moet eenduidig worden gedefinieerd.

Referenties