TD2.1 Alimentation (depuis version 1.0)

Alimentation d’un DMP d’un patient

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 :

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.