Cas d'utilisation

Extraction des acteurs des couloirs du Ségur du Numérique en Santé

Le Ségur du Numérique en Santé s’articule autour de 6 types de d’acteurs appelés couloirs.


Le Ségur du numérique vise à développer le partage des données de santé entre les différents acteurs de la prise en charge et les patients, par le financement d’une mise à jour logicielle prise en charge par l’Etat pour favoriser l’augmentation des usages numériques dans les établissements.

Les établissements de santé peuvent être accompagnés par les acteurs régionaux (ARS, GRADeS) dans leur déploiement, le pilotage de services socles nationaux et leur mise en conformité réglementaire.

Nous allons vous détailler ci-dessous comment interroger l’API pour identifier les acteurs présents dans chaque couloir : segurnumerique.sante-idf.fr.

1. Le couloir Médico-Social

En tant que client de l’API, je souhaite rechercher l’ensemble des établissements médico-sociaux. Pour cela, il faut interroger la ressource Organization en fonction des deux critères suivants:

  • l’identifier doit contenir le code système https://finess.esante.gouv.fr
  • l’établissement doit appartenir aux catégories d’établissements suivantes : 159, 165, 166, 172, 175, 176, 177, 178, 180, 182, 183, 186, 188, 189, 190, 192, 194, 195, 196, 197, 198, 202, 207, 209, 213, 221, 236, 238, 241, 246, 247, 249, 252, 253, 255, 286, 295, 344, 354, 370, 377, 378, 379, 381, 382, 390, 395, 396, 402, 411, 418, 427, 437, 440, 441, 445, 446, 448, 449, 453, 460, 462, 500, 501, 502, 608
GET [base]/Organization?identifier=https%3A%2F%2Ffiness.esante.gouv.fr%7C&type=159,165,166,172,175,176,177,178,180,182,183,186,188,189,190,192,194,195,196,197,198,202,207,209,213,221,236,238,241,246,247,249,252,253,255,286,295,344,354,370,377,378,379,381,382,390,395,396,402,411,418,427,437,440,441,445,446,448,449,453,460,462,500,501,502,608
# récupère les organisations qui ont un code système finess.esante.gouv.fr et qui appartiennent aux différents catégories d'établissements de la requête (159,165,166, etc.)

Pour information, ces codes font partie de la TRE TRE-R66-CategorieEtablissement.

curl -H "ESANTE-API-KEY: d5aa2278-61af-43c1-8167-feb7c695d1e1" -X POST "https://gateway.api.esante.gouv.fr/fhir/v2/Organization/_search" -d type=https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R66-CategorieEtablissement%2FFHIR%2FTRE-R66-CategorieEtablissement%7C159%2C165%2C166%2C172%2C175%2C176%2C177%2C178%2C180%2C182%2C183%2C186%2C188%2C189%2C190%2C192%2C194%2C195%2C196%2C197%2C198%2C202%2C207%2C209%2C213%2C221%2C236%2C238%2C241%2C246%2C247%2C249%2C252%2C253%2C255%2C286%2C295%2C344%2C354%2C370%2C377%2C378%2C379%2C381%2C382%2C390%2C395%2C396%2C402%2C411%2C418%2C427%2C437%2C440%2C441%2C445%2C446%2C448%2C449%2C453%2C460%2C462%2C500%2C501%2C502%2C608&identifier=https%3A%2F%2Ffiness.esante.gouv.fr%7C'

curl -H "ESANTE-API-KEY: d5aa2278-61af-43c1-8167-feb7c695d1e1" -X POST https://gateway.api.esante.gouv.fr/fhir/v2/Organization/_search -d 'type=https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R66-CategorieEtablissement%2FFHIR%2FTRE-R66-CategorieEtablissement%7C159%2Chttps%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R66-CategorieEtablissement%2FFHIR%2FTRE-R66-CategorieEtablissement%7C159%2C165%2C166%2C172%2C175%2C176%2C178%2C180%2C182%2C183%2C186%2C188%2C189%2C190%2C192%2C194%2C195%2C196%2C197%2C198%2C202%2C207%2C209%2C213&identifier=https%3A%2F%2Ffiness.esante.gouv.fr%7C'
      
// Créer un client FHIR
var clientFhir = createClient();

// Construire la clause de recherche pour les catégories d'établissements
var codesCategories = Arrays.asList("159", "165", "166", "172", "175", "176", "177", "178", "180", "182", "183", "186", "188", "189", "190", "192", "194", "195", "196", "197", "198", "202", "207", "209", "213", "221", "236", "238", "241", "246", "247", "249", "252", "253", "255", "286", "295", "344", "354", "370", "377", "378", "379", "381", "382", "390", "395", "396", "402", "411", "418", "427", "437", "440", "441", "445", "446", "448", "449", "453", "460", "462", "500", "501", "502", "608");
var clauseActivite = Organization.TYPE.exactly()
        .systemAndValues("https://mos.esante.gouv.fr/NOS/TRE_R66-CategorieEtablissement/FHIR/TRE-R66-CategorieEtablissement", codesCategories);

// Construire la clause de recherche pour les identifiants
var clauseIdentifiant = Organization.IDENTIFIER.hasSystemWithAnyCode("https://finess.esante.gouv.fr");

// Créer et exécuter la requête
var bundle = clientFhir
        .search()
        .forResource(Organization.class)
        .where(clauseActivite)
        .and(clauseIdentifiant)
        .returnBundle(Bundle.class)
        .execute();

var aPageSuivante = true;
var organisationsFiness = new LinkedList<>();

// Pour chaque page
do {
    logger.info("Nombre total de résultats {}", bundle.getTotal());

    // Extraire les données du bundle
    organisationsFiness.addAll(bundle.getEntry());

    if (bundle.getLink("next") != null) {
        // Obtenir la page suivante
        bundle = clientFhir
                .loadPage()
                .byUrl(bundle.getLink("next").getUrl())
                .andReturnBundle(Bundle.class)
                .execute();
    } else {
        aPageSuivante = false;
    }
} while (aPageSuivante);

Vous trouverez ainsi des réponses JSON de ce type avec le système https://finess.esante.gouv.fr et le coding avec la catégorie d’établissement (dans l’exemple ci-dessous le code catégorie d’établissement est 182) :

                "identifier": [
                    {
                        "use": "official",
                        "type": {
                            "coding": [
                                {
                                    "system": "https://hl7.fr/ig/fhir/core/CodeSystem/fr-core-cs-v2-0203",
                                    "code": "IDNST"
                                }
                            ]
                        },
                        "system": "urn:oid:1.2.250.1.71.4.2.2",
                        "value": "1770816478"
                    },
                    {
                        "use": "official",
                        "type": {
                            "coding": [
                                {
                                    "system": "https://hl7.fr/ig/fhir/core/CodeSystem/fr-core-cs-v2-0203",
                                    "code": "FINEG"
                                }
                            ]
                        },
                        "system": "https://finess.esante.gouv.fr",
                        "value": "770816478"
                    }
                ],
                "active": true,
                "type": [
                    {
                        "extension": [
                            {
                                "url": "https://interop.esante.gouv.fr/ig/fhir/annuaire/StructureDefinition/as-ext-organization-types",
                                "valueCode": "organizationType"
                            }
                        ],
                        "coding": [
                            {
                                "system": "https://hl7.fr/ig/fhir/core/CodeSystem/fr-core-cs-v2-3307",
                                "code": "GEOGRAPHICAL-ENTITY"
                            }
                        ]
                    },
                    {
                        "extension": [
                            {
                                "url": "https://interop.esante.gouv.fr/ig/fhir/annuaire/StructureDefinition/as-ext-organization-types",
                                "valueCode": "secteurActiviteRASS"
                            }
                        ],
                        "coding": [
                            {
                                "system": "https://mos.esante.gouv.fr/NOS/TRE_R02-SecteurActivite/FHIR/TRE-R02-SecteurActivite",
                                "code": "SA16"
                            }
                        ]
                    },
                    {
                        "coding": [
                            {
                                "system": "https://mos.esante.gouv.fr/NOS/TRE_R66-CategorieEtablissement/FHIR/TRE-R66-CategorieEtablissement",
                                "code": "182"
                            }
                        ]
                    },


2. Le couloir Hôpital

En tant que client de l’API, je souhaite rechercher l’ensemble des établissements sanitaires. Pour s’assurer que l’établissement ne correspond pas à un établissement médico-social:

  • l’appel doit être réalisé en filtrant sur le code système de la TRE-R02-SecteurActivite
  • Vérifier que chaque structure ne FASSE PAS PARTIE des catégories d’établissements “médico-sociaux” (voir la liste des catégories d’établisssements dans le cas d’utilisation précédent).
  • l’appel doit être réalisé sur les secteurs d’activités :
Code Libellé Secteur d’activité
SA01 Etablissement public de santé
SA02 Hôpital militaire du Service de santé des armées
SA03 Etablissement privé PSPH
SA04 Etablissement privé non PSPH
SA30 Autre établissement sanitaire
SA34 Centre de dialyse
SA36 Centre anti-cancer

Requêtes :

GET [base]/Organization?identifier=https%3A%2F%2Ffiness.esante.gouv.fr%7C&type=SA01,SA02,SA03,SA04,SA30,SA34,SA36&type:not=159,165,166,172,175,176,177,178,180,182,183,186,188,189,190,192,194,195,196,197,198,202,207,209,213,221,236,238,241,246,247,249,252,253,255,286,295,344,354,370,377,378,379,381,382,390,395,396,402,411,418,427,437,440,441,445,446,448,449,453,460,462,500,501,502,608
# Récupère toutes les organisations provenant du SI FINESS, qui sont dans les secteurs d'activités suivants : SA01, SA02, SA03, SA04, SA30, SA34, SA36 et qui n'appartiennent pas aux catégories d'établissement du secteur médico-social


3. Le couloir Officine

En tant que client de l’API, je souhaite rechercher l’ensemble des structures appartenant au couloir Officine. Il faut interroger la ressource Organization :

  • l’appel doit être réalisé en filtrant sur le code système de la TRE-R02-SecteurActivite
  • l’appel doit être réalisé sur les secteurs d’activités :
Code Libellé Secteur d’activité
SA33 Pharmacie d’officine
SA38 Pharmacie minière
SA39 Pharmacie mutualiste
SA65 Antenne de pharmacie


GET [base]/Organization?type=https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA33,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA38,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA39,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA65
# récupère les organisations appartenant aux secteurs d'activités du couloir Officine en filtrant sur le code système des secteurs d'activités

GET [base]/Organization?type=SA33,SA38,SA39,SA65
# récupère les organisations appartenant aux secteurs d'activités du couloir Officine.
curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?type=https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA33,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA38,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA39,https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R02-SecteurActivite%2FFHIR%2FTRE-R02-SecteurActivite%7CSA65"
var client = createClient();
var hasNext = true;
Bundle orgBundle = null;
var totalElements = 0;
var treated = 0;
var goodElements = new ArrayList<>();

// construct radiology facility request
try {
    var pharmacyCodesList = Arrays.asList("SA33", "SA38", "SA39", "SA65");
    orgBundle = client.search().forResource(Organization.class)
            .where(Organization.TYPE.exactly().systemAndValues("https://mos.esante.gouv.fr/NOS/TRE_R02-SecteurActivite/FHIR/TRE-R02-SecteurActivite", pharmacyCodesList))
            .returnBundle(Bundle.class).execute();

    totalElements = orgBundle.getTotal();
} catch (Exception e) {
    e.printStackTrace();
    hasNext = false;
}

logger.info("Total results - {}", totalElements);

do {
    var bundleContent = orgBundle.getEntry();

    for (var e : bundleContent) {
        // store the organization inside a map
        if(e.getResource() instanceof Organization) {
            var org = (Organization) e.getResource();
            goodElements.add(org);
            treated++;
        }
    }

    // check if result has a next page
    if (orgBundle.getLink("next")!=null) {
        try {
            orgBundle = client.loadPage().byUrl(orgBundle.getLink("next").getUrl()).andReturnBundle(Bundle.class).execute();
        } catch (Exception e) {
            logger.error("Error getting next page");
            e.printStackTrace();
            hasNext = false;
        }
    } else {
        hasNext = false;
    }

    logger.info("Progress treated - {} / {}", treated, totalElements);
} while (hasNext);

logger.info("Total organization - {}", goodElements.size());