Koppeltaal 2.0 Implementation Guide (Full Documentation)
0.16.2 - ci-build
NL
Koppeltaal 2.0 Implementation Guide (Full Documentation) - Local Development build (v0.16.2) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions
| Page standards status: Draft |
| Versie | Datum | Wijziging |
|---|---|---|
| 0.0.1 | 2026-04-20 | Initiële versie |
| 0.0.2 | 2026-04-21 | Feedback verwerkt: centraal overzicht benadrukt, scope-notitie behandelaar, FHIR workflow-aansluiting, COW IG referentie |
| 0.0.3 | 2026-04-21 | Impact op ECD en patiëntportaal toegevoegd |
| Datum | 2026-04-20 |
| Status | Concept |
| Auteur | Roland Groen |
In Koppeltaal wordt een digitale interventie (module) als geheel toegewezen aan een cliënt. De behandelaar zegt in feite: "Patiënt X gaat werken met module Y." De module is daarbij een ondeelbaar geheel — het EPD weet niet welke individuele taken er binnen de module bestaan, en de patiënt ziet de module als één activiteit.
In KoppelMij is deze granulariteit onvoldoende. Het Persoonlijke Gezondheidsomgeving (PGO) fungeert als het portaal van de cliënt — vergelijkbaar met het patiëntportaal in Koppeltaal. Cliënten en behandelaars willen de individuele taken binnen een module zichtbaar hebben:
Dit betekent dat het proces van taakaanmaak fundamenteel anders werkt dan in Koppeltaal.
In Koppeltaal is het proces eenvoudig en lineair:
De behandelaar heeft geen zicht op wat er binnen de module gebeurt. De module is een black box.
In KoppelMij wordt het proces uitgebreider en collaboratief:
Het wezenlijke verschil: de module is niet langer een black box, maar een samenwerkingspartner die taken aandraagt binnen een door de behandelaar geïnitieerde opdracht.
Een ActivityDefinition (AD) beschrijft wat een module kan doen — het is het sjabloon op basis waarvan taken worden aangemaakt. Elke module-aanbieder registreert één of meer ADs in de Koppeltaalvoorziening.
In de huidige Koppeltaal-specificatie is het veld ActivityDefinition.kind niet gevuld. Impliciet geldt kind = Task: het aanmaken van een instantie van deze AD leidt tot precies één taak.
Door het veld ActivityDefinition.kind expliciet te vullen, kan de module-aanbieder aangeven welk type flow de module ondersteunt:
AD.kind |
Betekenis | Flow |
|---|---|---|
Task (of leeg) |
Module werkt op taakniveau | EPD maakt één taak aan per toewijzing. Huidige Koppeltaal-werkwijze. |
ServiceRequest |
Module werkt op opdrachtniveau | EPD maakt een ServiceRequest aan. De module luistert op nieuwe ServiceRequests en vult deze aan met taken voor de cliënt. |
Dit is een hybride model: beide typen kunnen naast elkaar bestaan. Een module-aanbieder kan zowel ADs van type Task als van type ServiceRequest aanbieden. KoppelMij geeft aan dat AD.kind = ServiceRequest noodzakelijk is voor de gewenste cliëntbeleving in het PGO.
Het gekozen patroon sluit aan op de FHIR Workflow specificatie:
requested, accepted, in-progress, completed)Het aansluiten op internationale standaarden is één van onze uitgangspunten. Door nu het patroon (Service)Request → Task te hanteren, leggen we een fundament dat in lijn is met de FHIR Workflow en voorbereid is op toekomstige uitbreidingen:
De HL7 Clinical Order Workflow (COW) IG beschrijft patronen voor het coördineren van orders tussen een Placer (besteller) en Filler (uitvoerder), waaronder het gebruik van een Coordination Task om de onderhandeling over wie een ServiceRequest gaat invullen te faciliteren. In onze context gaan we ervan uit dat deze onderhandeling reeds heeft plaatsgevonden: de module-aanbieder is bekend en de toewijzing is overeengekomen. We sluiten aan bij het COW-patroon in zoverre dat we starten met een overeengekomen ServiceRequest met Task.basedOn als verbinding naar de taken. De Coordination Task — bedoeld voor het onderhandelingsproces tussen Placer en Filler — valt buiten onze scope.
AD.kind = Task: geen verandering. De module ontvangt taken zoals nu.AD.kind = ServiceRequest:
kind = ServiceRequest en zich abonneren op nieuwe ServiceRequests die naar deze AD verwijzenAD.kind = ServiceRequest moet het ECD een ServiceRequest aanmaken in plaats van (of naast) een Task| Resource | Rol |
|---|---|
ActivityDefinition |
Sjabloon van de module; kind bepaalt de flow |
ServiceRequest |
Overkoepelende opdracht van behandelaar aan module |
Task |
Individuele taak voor de cliënt, gebonden aan de ServiceRequest |
Patient |
De cliënt |
Practitioner |
De behandelaar |
Subscription |
Mechanisme waarmee de module nieuwe ServiceRequests detecteert |
instantiatesIn Koppeltaal wordt op de Task een custom extensie instantiates gebruikt om te verwijzen naar de ActivityDefinition. Deze extensie is destijds geïntroduceerd omdat het standaard FHIR-element Task.instantiatesCanonical niet bruikbaar bleek als zoekcriterium. Er is een bijbehorende SearchParameter gedefinieerd die zoeken op deze extensie mogelijk maakt.
Het voorstel is om dezelfde instantiates extensie symmetrisch op de ServiceRequest toe te passen. Hiermee:
De module-aanbieder moet genotificeerd worden over nieuwe ServiceRequests die betrekking hebben op haar ActivityDefinition(s). Dit kan via een FHIR Subscription op basis van de instantiates extensie:
{
"resourceType": "Subscription",
"status": "active",
"reason": "Notificatie bij nieuwe ServiceRequests voor module X",
"criteria": "ServiceRequest?instantiates=ActivityDefinition/module-x",
"channel": {
"type": "rest-hook",
"endpoint": "https://module-x.example.com/notifications/servicerequest",
"payload": "application/fhir+json"
}
}
Opmerking: dit vereist een nieuwe SearchParameter voor de instantiates extensie op ServiceRequest, analoog aan de bestaande task-instantiates SearchParameter.
Wanneer de module taken aanmaakt binnen een ServiceRequest, is de vraag wie de Task.requester wordt:
Task.requester wordt overgenomen van ServiceRequest.requester. Dit lijkt het meest consistent: de behandelaar is en blijft de opdrachtgever, ook voor de individuele takenHet huidige voorstel gaat uit van één module-aanbieder per ServiceRequest. Maar het is denkbaar dat een behandelprogramma taken bevat die door verschillende modules worden aangeboden:
In dat geval zou de ServiceRequest een samengestelde opdracht worden, met taken van meerdere module-aanbieders. Dit heeft consequenties voor:
completed? Als alle taken van alle modules zijn afgerond?Dit scenario verhoogt de complexiteit aanzienlijk en vereist nadere uitwerking.
De bestaande Koppeltaal Task lifecycle (requested → accepted → in-progress → completed) blijft van toepassing op de individuele taken. Maar de ServiceRequest introduceert een bovenliggende lifecycle:
active: er kunnen nog taken worden toegevoegdcompleted: alle taken zijn afgerond, geen nieuwe taken meerrevoked: de opdracht is ingetrokkenDe relatie tussen de Task-lifecycles en de ServiceRequest-lifecycle moet eenduidig worden gedefinieerd.