TD2.1 Alimentation (depuis version 1.0)
Le profil alimentation du DMP se fait au travers de transaction XDS (https://wiki.ihe.net/index.php/Cross-Enterprise_Document_Sharing) supportée par le serveur DMP ainsi que par la DevBox-Santé DMP.
Les transactions XDS permettent de soumettre des documents au format CDA (https://www.hl7.org/implement/standards/product_brief.cfm?product_id=7) supporté également par le DMP et la DevBox-Santé DMP.
La DevBox-Santé DMP présente un modèle simplifé des informations demandées et s’occupe de la cohérence des métadonnées des transactions XDS d’avec les métadonnées des documents CDA )
TD2.1 : alimenter le DMP d’un patient avec des documents (depuis version 1.0)
Cette fonctionnalité permet d’alimenter le DMP d’un patient avec un ou plusieurs nouveaux documents :
- décrits sous la forme de documents CDA et de métadonnées XDS,
- et transmis au système DMP sous la forme d’un lot de soumission XDS signé (XAdES).
La cinématique générale est la suivante. Le PS constitue le ou les document(s) dans le LPS . Le LPS :
- construit le ou les document(s)
- construit le document au format CDA ==> action réalisée par la DevBox-Santé DMP
- alimente les métadonnées XDS ==> action réalisée par la DevBox-Santé DMP
- constitue un lot de soumission XDS et signe ce lot (XAdES) ==> action réalisée par la DevBox-Santé DMP
- soumet le lot de documents au système DMP ==> action réalisée par la DevBox-Santé DMP
Le LPS intégrateur de la DevBox-Santé DMP doit seulement fournir les valeurs des différentes métadonnées liées aux documents et à la soumission par l’intermédiaire d’un modèle simplifié :
En java :
final ZonedDateTime maintenant = timeManager.getLocal();
// création du document
InputStream input = this.getClass().getClassLoader().getResourceAsStream("1.pdf");
byte[] content = new byte[input.available()];
ByteStreams.readFully(input, content);
DMPCDocument document = DMPCDocument.builder()
.patient(patient)
.classCodeCode(client.getCodesFor(DMPCCode.JeuxValeursDMP.CLASS_CODE).get(0))
.confidentialityCodes(List.of(findCode(DMPCCode.JeuxValeursDMP.CONFIDENTIALITY_CODE, "N")))
.comments("Commentaire du Document")
.events(List.of(new DMPCCode("B18", "2.16.840.1.113883.6.3", "Hépatite virale chronique")))
.practiceSettingCode(findCode(DMPCCode.JeuxValeursDMP.PRACTICE_SETTING_CODE, "AMBULATOIRE"))
.serviceStartDateTime(maintenant.minusHours(3))
.serviceStopDateTime(maintenant.minusHours(2))
.title("Titre du Document")
.typeCode(findCode(DMPCCode.JeuxValeursDMP.TYPE_CODE, "11488-4"))
.creationDateTime(maintenant)
.formatCode(findCode(DMPCCode.JeuxValeursDMP.FORMAT_CODE, "urn:ihe:iti:xds-sd:pdf:2008"))
.content(content).build();
// création de la soumission
DMPCSoumission<DMPCDocument> soumission = DMPCSoumission.builder()
.documents(List.of(document))
.title("Soumission du document")
.comments("Commentaire de la soumission")
.patient(patient)
.contentType("04").build();
// envoi de la soumission
TD21Response td21Response = client.td21SubmitDocuments(context, new TD21Request(soumission));
System.out.println("Soumission enregistré avec l'uuid :" + td21Response.getSoumission().getUuid());
td21Response.getSoumission().getDocuments().forEach(submitted -> {
DMPCDocument submittedDocument = (DMPCDocument) submitted;
System.out.println(String.format("Contenant le document ayant pour uniqueId : %s et uuid : %s",
submittedDocument.getUniqueId(), submittedDocument.getEntryUuid()));
});
Pour une soumission de plusieurs documents, il suffit d’ajouter les documents à la soumission :
submission.addDocument(document1);
submission.addDocument(document2);
En REST :
curl --location --request POST 'http://localhost:9999/dmp/td21SubmitDocuments' \
--data-raw '{
"context": {
...
},
"request": {
"submission": {
"title": "Titre de la soumission",
"comments": "Soumission via Postman",
"contentType": "04",
"patient": {
"matriculeINS": {
"valeur": "279035121518989",
"identifiantSysteme": "1.2.250.1.213.1.4.10"
},
"internalId": "67890",
"prenom": "DOMINIQUE",
"nomUsuel": "pat-trois",
"dateDeNaissance": "19790328",
"ordreDeNaissance": 0,
"sexe": "F"
},
"documents": [
{
"auteurs": [],
"classCode": "11",
"comments": "Document soumis via Postman",
"confidentialities": [
"N"
],
"content": "UmFwcGVsIGNsaW5pcXVlIDogSWwgcydhZ2l0IGQndW4gaG9tbWUgZGUgNTMgYW5zLCAKcHLDqXNlbnRhbnQgdW4gbmFldnVzIGRlIGxhIGZhY2UgaW50ZXJuZSBkZSBsYSBjdWlzc2UgZ2F1Y2hlIGRlIDcgbW0gZGUgZ3JhbmQgYXhlIGVudmlyb24uIApEw6ljaXNpb24gZCdleMOpcsOoc2Ugc291cyBhbmVzdGjDqXNpZSBsb2NhbGUuIAoKSW50ZXJ2ZW50aW9uIDogRVhFUkVTRSBEJ1VOIE5BRVZVUyBERSBMQSBDVUlTU0UgR0FVQ0hFIApTb3VzIGFuZXN0aMOpc2llIGxvY2FsZSDDoCBsYSBYeWxvY2HDr25lIMOgIDEgJSBub24gYWRyw6luYWxpbsOpZS4gCgpJbmNpc2lvbiBjZW50csOpZSBzdXIgbGEgbMOpc2lvbiBwZXJtZXR0YW50IGwnZXjDqXLDqHNlIGR1IG5hZXZ1cyBkYW5zIHNhIHRvdGFsaXTDqS4gCkZlcm1ldHVyZSBjdXRhbsOpZSBlbiB1biBwbGFuIGRlIEZsZXhvY3JpbiAzLzAuICAKCkVYQU1FTiBISVNUT0xPR0lPVUUgVW5lIGzDqXNpb24gcG9seXBvw69kZSBkZSAxIHggMCw3IGNtIGEgw6l0w6kgY29tbXVuaXF1w6llLiAKT24gcmV0cm91dmUgYXUgcGxhbiBoaXN0b2xvZ2lxdWUgdW5lIGzDqXNpb24gdW4gcGV1IHZlcnJ1cXVldXNlLCAKY29tcG9ydGFudCB1bmUgcHJvbGlmw6lyYXRpb24gY2VsbHVsYWlyZSBuYWV2aXF1ZSDDqXBhcmduYW50IGwnw6lwaWTDqW1pZSwgCnNvdXMgZm9ybWUgZGUgdGjDqHF1ZXMgZW4gc3VyZmFjZSwgYXZlYyBxdWVscXVlcyBkw6lww7R0cyBkZSBtw6lsYW5pbmUsIAphc3NvY2nDqWUgw6AgdW4gZ3JhZGllbnQgZGUgbWF0dXJhdGlvbiB0csOocyBuZXQgdmVycyBsYSBwcm9mb25kZXVyLiAKCk9uIG5lIHJldHJvdXZlIHBhcyBkJ2F0eXBpZSBudWNsw6lvY3l0b3BsYXNtaXF1ZS4gCgpDT05DTFVTSU9OIE5BRVZVUyBERVJNSVFVRSBERVZFTE9QUEUgU1VSIFVOIE1PREUgRVhPUEhZVElRVUUgLiAKTEVTIExJTUlURVMgRCdFWEVSRVNFIFNPTlQgU0FJTkVTLiA=",
"creationDateTime": "2023-04-05T17:46:00+02:00",
"events": [
{
"code": "H33",
"codingScheme": "2.16.840.1.113883.6.3",
"displayName": "Décollement et déchirement de la rétine"
}
],
"format": "urn:ihe:iti:xds-sd:text:2008",
"legalAuthenticator": {
"internalId": "123456",
"nom": "MED-CS RPPS0029614",
"prenom": "ANNE",
"role": "10",
"secteurActivite": "SA05",
"specialite": "G15_10/SM26",
"structureSante": {
"nom": "CENTRE DE SANTE RPPS15683",
"idNational": "10B0156832"
}
},
"patient": {
"matriculeINS": {
"valeur": "279035121518989",
"identifiantSysteme": "1.2.250.1.213.1.4.10"
},
"prenom": "DOMINIQUE",
"nomUsuel": "pat-trois",
"internalId": "67890",
"dateDeNaissance": "19790328",
"ordreDeNaissance": 0,
"sexe": "F"
},
"practiceSetting": "AMBULATOIRE",
"serviceStartDateTime": "2023-04-05T16:42:00+02:00",
"serviceStopDateTime": "2023-04-05T17:42:00+02:00",
"title": "Titre du document",
"type": "11488-4"
}
]
}
}
}
Remplacement
Le remplacement est possible suite à la recherche TD3.1b. Il suffit de préciser l’entryUUID
et le uniqueId
du document à remplacer.
Exemple de remplacement de document après recherche dans le DMP :
En java :
// récupération du uuid du document courant dans le DMP
TD31bRequest td31bRequest = new TD31bRequest();
td31bRequest.setDocumentUniqueId(uniqueIdDuDocumentAremplacer);
td31bRequest.setIns(patient.getIns());
TD31bResponse td31bresponse = client.td31bGetDocumentEntry(context, td31bRequest);
// création de la soummission pour le remplacement
DMPCSubmission submissionRemplace = ...;
DMPCDocument documentRemplace = ...;
// ajout des informations de remplacement dans le document qui remplace
documentRemplace.setReplacementOf(td31bresponse.getDocumentUuid());
documentRemplace.setReplacementOfUniqueId(documentE.getUniqueId());
documentRemplace.setVersionNumber(documentE.getVersionNumber()+1);
submissionRemplace.setTitle("remplacement du document E");
// envoie de la soummission
client.td21SubmitDocuments(context, new TD21Request(submissionRemplaceE));
En REST
il suffit de renseigner les champs replacementOf, et replacementOfUniqueId dans le document qui remplace :
curl --location --request POST 'http://localhost:9999/dmp/td21SubmitDocuments' \
--data-raw '{
"context": {
...
},
"request": {
"submission": {
...
"documents": [
{
...
"versionNumber": 2,
"replacementOf": "ff38b3da-3ded-4b90-b30e-744a4dc907d8",
"replacementOfUniqueId": "1.2.250.1.287.1.1669713300686.1.16709290066422"
}
]
}
}
}
TD2.2
Cette transaction est identique techniquement que la TD2.1 mais avec une carte CPE. Il faudra veiller à préciser le legalAuthenticator
du document avec le Professionnel de Santé validant le document.