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 :

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.