Transactions supportées

Contient un exemple d’utilisation de l’API java et curl des différentes transactions supportées.

Attention :

Suivre cette documentation ne vous dispense pas de lire attentivement le guide d’intégration “Service DMP intégré aux LPS” (SEL-MP-037) dans la version du package cible. Ce document est disponible sur l’espace industriel de Sesam-Vitale : https://industriels.sesam-vitale.fr/group/dmp-compatibilite

Toutes transactions vers le DMP se fait en précisant un DMPCContext et une requête spécifique en argument d’une méthode du DMPCClient.

Le DMPCContext contient les informations permettant de définir :

  • L’auteur de la transaction,
  • Le code de confidentialité de la transaction (connexion secrète, invisible aux représentants légaux du patient)

À ce DMPCContext est associé un autre argument dépendant de la transaction réalisée.

Mode d’authentification

Directe (depus version 3.1)

En authentification directe, l’utilisateur personnel de santé est authentifié par sa carte CPS/CPE, ces informations sont récupérées lors de la lecture de la carte CPS.

Indirecte (depuis version 1.0)

En authentification indirecte, seule la structure de santé (par son certificat serveur) est authentifiée.

L’auteur de la requête, c’est à dire le personnel de santé utilisateur (DMPCPersonnelSante), doit donc être authentifié localement. Le système de la structure de santé doit être en mesure d’authentifié ses utilisateurs. Cet identifiant local au système doit être spécifié dans DMPCPersonnelSante.internalId même si le rpps est connu.

Exemple Java :

DMPCContext context = new DMPCContext();
DMPCPersonnelSante ps = new DMPCPersonnelSante();
ps.setInternalId("1234567890");
ps.setNom("Forêt");
ps.setPrenom("Laurent");
ps.setRole("10"); // Médecin  dans la nomenclature DMPCCode.JeuxValeursDMP.SUBJECT_ROLE      
ps.setSpecialite("G15_10/SM30"); // G15_10/SM30 Néphrologie  dans la nomenclature DMPCCode.JeuxValeursDMP.AUTHOR_SPECIALITY
ps.setSecteurActivite("SA01");  // Etablissement public de santé dans la nomenclature DMPCCode.JeuxValeursDMP.HEALTH_CARE_FACILITY_TYPE_CODE
ps.getStructureSante().setNom("DEVCOOP Bureau de Léognan");
context.setAuthor(ps);

Exemple curl :

curl --request POST '/dmp/tdxxxx' \
--data-raw '{
    "context": {
        "author": {
            "internalId": "123456",
            "nom": "Durand",
            "prenom": "Pierre",
            "role": "10",
            "secteurActivite": "SA43",
            "specialite": "G15_10/SM28",
            "structureSante": {
                "nom": "Devcoop Bureau de Léognan"
            }
        },
        "modeAcces": {
            "acces": "NORMAL"
        }
    },
    "request": {
        ...
    }
}'

Récupération des différents paramètres du DMP

getParametres() (depuis version 3.0)

Afin de pouvoir récupérer le paramètrage du DMP qui permet de répondre à un certain nombre d’exigences notamment les fonctions-gestion-mineurs (EX_GEN-1550). Il faut accéder à la méthode getParametres

Exemple :

  DMPCParametres parametres = dmpcClient.getParametres();

  if (parametres.isFonctionsGestionMineurs() && agePatient < parametres.getAgeMajorite()) {
    // Attention EX_GEN-1550
  } 
  if (parametres.isProduction()) {
    // Attention l'environnement est celui de production, 
  }
   
  if (!parametres.isCumulInvisiblePatientMasquePs()) {
   // Attention EX_2.1-1050
  }

Exemple curl :

curl -X GET "/dmp/parametres" 

getCodesFor() (depuis version 1.0)

Méthode permettant d’accéder aux différents jeux de valeurs imposés par le Guide d’intégration.

notamment :

public enum JeuxValeursDMP {

        QUALITE_REPRESENTANT_LEGAL,
        AUTHOR_SPECIALITY,
        CLASS_CODE,
        CONFIDENTIALITY_CODE,
        CONTENT_TYPE_CODE,
        FORMAT_CODE,
        HEALTH_CARE_FACILITY_TYPE_CODE,
        PRACTICE_SETTING_CODE,
        SUBJECT_ROLE,
        TYPE_CODE,
        RESTRICTION_AUDIENCE_VIHF
    }

Exemple Java :

    List<DMPCCode> allPersonnelDeSanteSpecialities = client.getCodesFor(DMPCCode.JeuxValeursDMP.AUTHOR_SPECIALITY);
    List<DMPCCode> allPossibleFormatCodesForADocument = client.getCodesFor(DMPCCode.JeuxValeursDMP.FORMAT_CODE);

Exemple curl :

curl -X GET "/dmp/nomenclatures?jeuxValeurs=AUTHOR_SPECIALTY"
curl -X GET "/dmp/nomenclatures?jeuxValeurs=FORMAT_CODE"

getTypesIndexedByClassCode() (depuis version 4.5)

Méthode permettant d’indexer tous les types par leur classCodes.

Exemple Java :

   Map<String, List<DMPCCode>>  allTypesIndexedByClassCode = client.getTypesIndexedByClassCode();
   String compteRenduClassCode = "10";
   List<DMPCCode> allCompteRenduTypes = allTypesIndexedByClassCode.get(compteRenduClassCode);

Exemple curl :

curl -X GET "/dmp/nomenclatures/typesByClassCode"

Transactions d’identification du patient

TD0.2 : test d’existence du DMP d’un patient et vérification de l’autorisation d’accès (depuis version 1.0)

Cette transaction permet de tester l’existence d’un DMP et de vérifier les autorisations d’accès ainsi que de récupérer les informations concernant la création du compte patient.

De là peut en découler des actions de créations de DMP, de création de compte internet, ou bien encore de connaître la raison d’une interdiction d’accès

Exemple Java :

TD02Response response = client.td02Exist(context, TD02Request.builder()
                        .matriculeINS(Identifiant.builder()
                            .valeur("277076322082910")
                            .identifiantSysteme(Oids.ANS_1_2_250_1_213._1_4_10_INS_NIR_TEST.val())
                            .build())
                        .build()
                    );
if (response.getAutorisation().equals(EXPIRE)) {
    // prévoir une client.td03AddAuthorization()
} else if (response.getAutorisation().equals(INTERDIT)) {
    // le PS ne peut accéder au DMP
    final String raison = response.getRaison();
} else if (response.getAutorisation().equals(NON_EXISTE)) {
    // prévoir une client.td03AddAuthorization()
} else if (response.getAutorisation().equals(VALIDE)) {
    if (!response.getCompteInternetOuvert()) {
        // prévour une client.td15aCreerAccesInternetPatient()
    }
    // contient les informations patient stockées dans leDMP
    final DMPCPatient dmpPatient = response.getPatient();
    if (response.getRole().equals(DMPCRole.MEDECIN_TRAITANT)) {
        // le PS author est le médecint traitant
    } 
}

Exemple curl :

curl  --request POST '/dmp/td02Exist' \
--data-raw '{
    "context": {...},
    "request": {
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        }
    }
}'

TD0.3 : modifier l’autorisation d’accès et/ou le statut médecin traitant DMP ou passer en mode d’accès « bris de glace » (depuis version 2.0)

Le LPS permet à l’utilisateur les actions suivantes.

  • Ajouter une autorisation d’accès au DMP du patient ou passer en mode d’accès « bris de glace ». Cf. DMP_0.3a.
  • Supprimer une autorisation d’accès au DMP du patient. Cf. DMP_0.3b.
  • Modifier le statut médecin traitant DMP. Cf. DMP_0.3c.

Exemple :

client.td03AddAuthorization(context, new TD03Request(patient.getMatriculeINS(), DMPCRole.STANDARD));
client.td03RemoveAuthorization(context, new TD03Request(patient.getMatriculeINS(), DMPCRole.STANDARD));

Exemple curl :

curl  --request PUT '/dmp/td03AddAuthorization' \
--data-raw '{
  "context": {...  },
  "request": {
    "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
    "role": "STANDARD"
  }
}'

url --request PUT '/dmp/td03RemoveAuthorization' \
--data-raw '{
  "context": {...},
  "request": {
    "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
    "role": "STANDARD"
  }
}'

TD0.4 : lister les DMP autorisés (depuis version 5.0)

Les deux usages sont les suivants :

  1. Elle permet de récupérer la liste des nouveaux DMP autorisés pour l’acteur de santé (avec les INS de patient et les traits d’identités). Outre les habituelles informations d’authentification, il est possible de paramétrer en entrée une date à partir de laquelle la recherche est effectuée. Par exemple : (date du jour - 3 jours) ou (date du jour - 1 semaine). L’éditeur peut mettre en oeuvre dans le LPS un appel planifié régulièrement à cette transaction (par exemple tous les 3 jours ou toutes les semaines). Exemple : Cette transaction peut être utile dans le cas d’un logiciel du SIH ne recueillant pas directement l’autorisation du patient. NB : l’autorisation d’accès est facultative pour alimenter le DMP avec des documents et pour supprimer des documents si le LPS implémente le profil Alimentation.

  2. Cette transaction permet de récupérer la liste des patients pour lesquels un nouveau document a été ajouté dans son DMP depuis une date donnée. Le retour est le même, seul le paramétrage en entrée est différent.

Exemple Java : 

// cas 1
var response = client.td04ListDMPActifs(context, TD04Request.builder()
                        .from(clock.getLocal().minusYears(1))
                        .searchType(TD04Request.PatientSearchType.LAST_AUTORIZATION)
                        .build()
                    );
// cas 2 
var response = client.td04ListDMPActifs(context, TD04Request.builder()
                        .from(clock.getLocal().minusYears(1))
                        .searchType(TD04Request.PatientSearchType.LAST_DOC)
                        .build()
                );

Exemple curl :

// cas 2

curl --location --request PUT 'http://localhost:8080/dmp/td04ListDMPActifs' \
--header 'Content-Type: application/json' \
--data-raw '{
    "context": {
        "author": {},
        "modeAcces": {
            "acces": "NORMAL"
        }
    },
    "request": {
        "from": "2021-08-12T15:16:10Z",
        "searchType": "LAST_DOC"
    }
}'

TD0.5

Non requis pour le DMP

Alimentation

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=",
                    "creationTime": "20200928120000",
                    "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",
                    "serviceStartTime": "20200928080000",
                    "serviceStopTime": "20200928080000",
                    "title": "Titre du document",
                    "type": "11488-4"
                }
            ]
        }
    }
}

TD3.1 : (depuis version 3.2)

Il est possible de faire des recherches de document ainsi que des recherches des documentation

GetDocuments

Permet la recherche par identifiant :

Exemple de Requête en Java :

 TD31Response td31Response = client.td31Find(context, TD31Request.GetDocuments.builder()
                .matriculeINS(patient.getMatriculeINS())
                .documentEntryUniqueId(uniqueId)
                .build());

En Rest

curl --location 'http://localhost:9999/dmp/td31Find' \
--header 'Content-Type: application/json' \
--data '{
    "context": {
    },
    "request": {
        "query": "GetDocuments",
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
        "statuses": [
            "APPROVED"
        ],
        "documentEntryUniqueId": "2.25.120152820330539744963703480707082727589.2401081046.1.1.1"
    }
}'

FindDocuments

Permet la recherce de documents sur l’ensemble des critères possibles en XDS, et ceux demandés par les différents test CNDA

Exemple de Requête en Java :

final TD31Request.FindDocuments request = new TD31Request.FindDocuments();
request.setMatriculeINS(patient.getMatriculeINS());
request.setConfidentialityCode(Arrays.asList("N"));
request.setTypeCode(List.of("11488-4", "15507-7"));
request.setStatuses(Collections.singletonList(AvailabilityStatus.APPROVED));
final TD31Response response = client.td31Find(context, request);

En Rest

curl --location 'http://localhost:9999/dmp/td31Find' \
--header 'Content-Type: application/json' \
--data '{
    "context": {
    },
    "request": {
        "query": "FindDocuments",
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
        "statuses": [
            "APPROVED"
        ],
        "typeCode": ["11488-4", "15507-7"]
    }
}'

FindSubmissionSetsAndGetContents

Cette transaction permet de faire la recherche par date de soumission demandé dans le guide d’intégration du DMP :

Recherche de document soumis dans un intervalle temporel par rapport à une date de soumission Dans XDS, il n’existe pas de requête « Stored Query » pour rechercher les documents soumis au Repository du système DMP dans un intervalle temporel donné. Plusieurs approches permettent néanmoins de le faire, en combinant plusieurs requêtes.

  1. Combinaison de FindSubmissionSet et de GetSubmissionSetAndContents (soit N+1 appels de fonctions, en fonction du nombre N de lots retournés).

    a. Utilisation de la requête FindSubmissionSets pour rechercher les lots de soumission en spécifiant un intervalle temporel de soumission (date de soumission dans le DMP, critères $XDSSubmissionSetSubmissionTimeFrom et $XDSSubmissionSetSubmissionTimeTo) : retourne les lots de soumission.

    b. Pour chaque lot retourné, faire un GetSubmissionSetAndContents qui retourne le lot et ses documents.

  2. Combinaison de FindSubmissionSet, de GetAssociations et de GetDocuments (soit 3 appels de fonctions).

    a. Utilisation de la requête FindSubmissionSets pour rechercher les lots de soumission en spécifiant un intervalle temporel de soumission (date de soumission dans le DMP, critère °$XDSSubmissionSetSubmissionTimeFromet$XDSSubmissionSetSubmissionTimeTo`) : retourne les lots de soumission.

    b. Récupérer l’ensemble des entryUUID des lots retournés.

    c. Passer cette liste d’entryUUID à la fonction GetAssociations.

    d. Filtrer les retours sur les Associations de type HasMember, et récupérer la liste des targetObject (documents du lot).

    e. Appel de GetDocuments avec la liste des entryUUID des documents.

Rem : les deux implémentations ont été réalisées dans la DevBox-Santé. La deuxième est positionnée par défaut pour des raisons de performances.

Exemple en Java :

TD31Request.FindSubmissionSetsAndGetContents request = new TD31Request.FindSubmissionSetsAndGetContents();
request.setMatriculeINS(patient.getMatriculeINS());
request.setSubmissionTimeFrom("20200925033000");
request.setStatuses(List.of(AvailabilityStatus.APPROVED));
client.td31Find(context, request);

Exemple en REST 

curl --location 'http://localhost:9999/dmp/td31Find' \
--header 'Content-Type: application/json' \
--data '{
    "context": {
        
    },
    "request": {
        "query": "FindSubmissionSetsAndGetContents",
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
        "statuses": [
            "APPROVED"
        ],
        "submissionTimeFrom": "20200925033000"
    }
}'

FindAndRetrieveContent (depuis version 5.1)

Cette recherche pour des documents spécifiques comme l’Historique de remboursement et l’historique de vaccinations permet de récupérer directement le contenu du document.

Exemple en Java :

var request = TD31Request.FindHistoriqueVaccinations.builder().matriculeINS(patient.getMatriculeINS()).build();
var historiqueVaccinations = (DMPCHistoriqueVaccinations) client.td31_32findAndRetrieve(context, request).getDocument();

var request = TD31Request.FindHistoriqueRemboursements
                .builder().matriculeINS(patient.getMatriculeINS())
                .serviceStartTimeFrom("20200801")
                .serviceStopTimeTo("20210731")
                .build();
var historiqueRemboursements = client.td31_32findAndRetrieve(context, request).getDocument();

en Rest :

curl --location 'http://localhost:9999/dmp/td31_32FindAndRetrieveContent' \
--header 'Content-Type: application/json' \
--data '{
    "context": {
        "modeAcces": {
            "acces": "NORMAL"
        }
    },
    "request": {
        "query": "FindHistoriqueVaccinations",
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        }
    }
}'

TD3.1b : rechercher l’identifiant technique d’un document (depuis version 3.0)

Cette fonctionnalité permet, aux LPS qui n’implémentent pas DMP_3.1a, de rechercher l’identifiant technique d’un document (dans le système DMP) à partir de l’identifiant local au LPS de ce document. Le LPS peut ensuite supprimer (DMP_3.3c), archiver (DMP_3.3d) ou remplacer un document dans le DMP du patient (DMP_2.1/2.2b).

En java :

String previousDocumentUniqueId = ...; // uniqueId d'un document envoyé précédemment dans le DMP 
TD31bRequest td31bRequest = new TD31bRequest();
td31bRequest.setDocumentUniqueId(previousDocumentUniqueId());
td31bRequest.setIns(patient.getIns());
TD31bResponse response = client.td31bGetDocumentEntry(context, td31bRequest);

// uuid du document courant stocké dans le DMP
String documentCurrentUuid = response.getDocumentUuid();
// permet le remplacement de document avec une td21submit document ou encore une td33cUnpublished.

En REST :

curl --location --request POST 'http://localhost:9999/dmp/td31bGetDocumentEntry' \
--data-raw '{
    "context": {
        ...
    },
    "request": {
        "matriculeINS": {
            "valeur": "279035121518989",
            "identifiantSysteme": "1.2.250.1.213.1.4.10"
        },
        "documentUniqueId": "1.2.250.1.287.1.1669713300686.1.16709290066422"
    }
}'

La réponse est : 

{
    "documentUuid": "ff38b3da-3ded-4b90-b30e-744a4dc907d8"
}

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"
                }
            ]
        }
    }
}

TD33c : Supprimer un document (depuis version 1.0)

Cette fonctionnalité permet à l’utilisateur de supprimer un document dans le DMP d’un patient. La cinématique générale est la suivante :

  • L’utilisateur indique qu’il souhaite supprimer le document sélectionné.
  • L’utilisateur confirme l’action demandée.
  • Le LPS envoie une requête de mise à jour des attributs d’un document au système DMP

Exemple :

TD33CRequest td33cRequest = new TD33CRequest();
td33cRequest.setDocumentUuid(uniqueIdDuDocumentASupprimer);
td33cRequest.setIns(patient.getIns()); 
td33cRequest.setContentType(contentTypeDuDocumentASupprimer); // le contentType est le même que pour une soumission de document.
client.td33cUnpublished(context, td33cRequest);

Gestion du Bris de Glace

Lorsque l’utilisateur a besoin de consulter le DMP d’un patient en cas d’urgence, sans avoir la possibilité de lui demander son autorisation, au lieu de se déclarer autorisé à accéder au dossier par le patient, il dispose de la possibilité d’accéder au dossier en mode « bris de glace ».

Dans l’api cela se traduit par une modification du Contexte :

En Java :

DMPCContext context = ...
DMPCModeAcces modeAcces = new DMPCModeAcces();
modeAcces.setAcces(DMPCModeAcces.ModeAcces.BRIS_DE_GLACE);
modeAcces.setRaison("Accès en urgence");
context.setModeAcces(modeAcces);

En REST :

{
    "context": {
        "author": {
            ...
        },
        "modeAcces": {
            "acces": "BRIS_DE_GLACE",
            "raison": "Accès en urgence"
        }
    },
    "request": {
        ...
    }
}

Gestion de la connexion secrète

L’exigence EX_0.1-1100 :

Le LPS doit permettre à l’utilisateur de mettre en oeuvre une connexion secrète pour les mineurs, en concertation avec son patient. Cf. donnée confidentiality-code dans le VIHF. Les modalités de mise en oeuvre : détermination de l’âge (cf. exigence EX_GEN-1550 au § 3.1.3) et proposition systématique, choix utilisateur,… devront être précisées par l’éditeur lors de son passage en homologation.

La décision de la mise en place de la connexion secrète est laissée à l’intégrateur. Dans le càs où, l’application veut déclarer la connexion secrète, il suffit d’ajouter le code de confidentialité INVISIBLE_REPRESENTANTS_LEGAUX dans le contexte :

EN java :

DMPCContext context = ...
DMPCCode code = client.getCodesFor((DMPCCode.JeuxValeursDMP.RESTRICTION_AUDIENCE_VIHF)
    .stream()
    .filter(dmpcCode -> dmpcCode.getCode().equals("INVISIBLE_REPRESENTANTS_LEGAUX"))
    .findFirst().get();
context.setConfidentialityCode(code);

En REST :

{
    "context": {
        "author": {
            ...
        },
        "confidentialityCode": {
            "valeur": "INVISIBLE_REPRESENTANTS_LEGAUX",
            "identifiantNomenclature": "1.2.250.1.213.1.1.4.13",
            "libelle": "Non visible par les représentants légaux du patient"
        }
    },
    "request": {
        ...
    }
}

ATTENTION : Ne pas confondre la connexion secrète et la soumission de documents à visibilité réduite comme INVISIBLE_REPRESENTANTS_LEGAUX, INVISIBLE_PATIENT, ou encore MASQUE_PS. Il s’agit dans ce cas de spécifier un code de confidentialité spécifique au document. Ces codes sont disponibles dans la nomenclature DMPCCode.JeuxValeursDMP.CONFIDENTIALITY_CODE