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
Exemple REST avec Bruno :
- authentification P12 : https://bitbucket.org/devbox-sante/dbx-examples-bruno/src/master/dbx/dmp/6.x/authentification/p12InHeader/TD2.1%20-%20p12InHeader.bru
- authentification CPS : https://bitbucket.org/devbox-sante/dbx-examples-bruno/src/master/dbx/dmp/6.x/authentification/cps/TD2-1%20-%20cps.bru
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.