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());