@tekkare/romulus 0.1.250 → 0.1.252

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/BarChart.vue +1 -0
  3. package/dist/runtime/components/ChoroplethMap.vue +4 -1
  4. package/dist/runtime/internal/geo/fr-regions.json +1 -1
  5. package/dist/runtime/utils/chart.d.ts +6 -3
  6. package/dist/runtime/utils/chart.js +15 -2
  7. package/layer/app/app.config.ts +6 -0
  8. package/layer/app/components/OipPubmedSummary.vue +223 -0
  9. package/layer/app/components/OipResourceDrawer.vue +331 -0
  10. package/layer/app/components/OipResourceDrawerLink.vue +40 -0
  11. package/layer/app/components/OipResourceField.vue +41 -0
  12. package/layer/app/components/OipResourceGenericCard.vue +54 -0
  13. package/layer/app/components/OipResourceSource.vue +50 -0
  14. package/layer/app/components/OipResourceTags.vue +65 -0
  15. package/layer/app/components/OipResourceView.vue +107 -0
  16. package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
  17. package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
  18. package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
  19. package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
  20. package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
  21. package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
  22. package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
  23. package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
  24. package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
  25. package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
  26. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
  27. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
  28. package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
  29. package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
  30. package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
  31. package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
  32. package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
  33. package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
  34. package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
  35. package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
  36. package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
  37. package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
  38. package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
  39. package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
  40. package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
  41. package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
  42. package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
  43. package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
  44. package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
  45. package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
  46. package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
  47. package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
  48. package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
  49. package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
  50. package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
  51. package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
  52. package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
  53. package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
  54. package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
  55. package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
  56. package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
  57. package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
  58. package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
  59. package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
  60. package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
  61. package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
  62. package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
  63. package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
  64. package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
  65. package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
  66. package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
  67. package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
  68. package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
  69. package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
  70. package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
  71. package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
  72. package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
  73. package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
  74. package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
  75. package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
  76. package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
  77. package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
  78. package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
  79. package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
  80. package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
  81. package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
  82. package/layer/app/components/oip-science/common/Form.vue +73 -0
  83. package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
  84. package/layer/app/components/oip-science/common/NoData.vue +16 -0
  85. package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
  86. package/layer/app/components/oip-science/common/Source.vue +31 -0
  87. package/layer/app/components/oip-science/common/TableTags.vue +279 -0
  88. package/layer/app/components/oip-science/common/Timeline.vue +104 -0
  89. package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
  90. package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
  91. package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
  92. package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
  93. package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
  94. package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
  95. package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
  96. package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
  97. package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
  98. package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
  99. package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
  100. package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
  101. package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
  102. package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
  103. package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
  104. package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
  105. package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
  106. package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
  107. package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
  108. package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
  109. package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
  110. package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
  111. package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
  112. package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
  113. package/layer/app/components/oip-science/euct/Locations.vue +102 -0
  114. package/layer/app/components/oip-science/euct/Products.vue +101 -0
  115. package/layer/app/components/oip-science/euct/Publications.vue +89 -0
  116. package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
  117. package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
  118. package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
  119. package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
  120. package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
  121. package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
  122. package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
  123. package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
  124. package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
  125. package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
  126. package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
  127. package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
  128. package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
  129. package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
  130. package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
  131. package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
  132. package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
  133. package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
  134. package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
  135. package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
  136. package/layer/app/composables/useOipChapterScroll.ts +43 -0
  137. package/layer/app/composables/useOipResourceHooks.ts +27 -0
  138. package/layer/app/composables/useOipResourceNav.ts +66 -0
  139. package/layer/app/composables/useOipResourceViews.ts +117 -0
  140. package/layer/app/composables/useOipResources.ts +83 -0
  141. package/layer/app/oip-drugs/PORTING.md +120 -0
  142. package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
  143. package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
  144. package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
  145. package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
  146. package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
  147. package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
  148. package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
  149. package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
  150. package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
  151. package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
  152. package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
  153. package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
  154. package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
  155. package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
  156. package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
  157. package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
  158. package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
  159. package/layer/app/oip-drugs/drugs.css +500 -0
  160. package/layer/app/oip-drugs/esIndices.ts +322 -0
  161. package/layer/app/oip-drugs/kinds.ts +264 -0
  162. package/layer/app/oip-drugs/locales/en.json +1571 -0
  163. package/layer/app/oip-drugs/locales/fr.json +1571 -0
  164. package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
  165. package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
  166. package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
  167. package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
  168. package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
  169. package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
  170. package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
  171. package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
  172. package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
  173. package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
  174. package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
  175. package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
  176. package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
  177. package/layer/app/oip-drugs/types/elastic.ts +113 -0
  178. package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
  179. package/layer/app/oip-drugs/types/es/directory.ts +54 -0
  180. package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
  181. package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
  182. package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
  183. package/layer/app/oip-drugs/types/es/portal.ts +130 -0
  184. package/layer/app/oip-drugs/types/es/retail.ts +107 -0
  185. package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
  186. package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
  187. package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
  188. package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
  189. package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
  190. package/layer/app/oip-drugs/utils/contributions.ts +36 -0
  191. package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
  192. package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
  193. package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
  194. package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
  195. package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
  196. package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
  197. package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
  198. package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
  199. package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
  200. package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
  201. package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
  202. package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
  203. package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
  204. package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
  205. package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
  206. package/layer/app/oip-science/PORTING.md +93 -0
  207. package/layer/app/oip-science/assets/smartSelection.json +428 -0
  208. package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
  209. package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
  210. package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
  211. package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
  212. package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
  213. package/layer/app/oip-science/composables/useEuct.ts +418 -0
  214. package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
  215. package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
  216. package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
  217. package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
  218. package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
  219. package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
  220. package/layer/app/oip-science/composables/usePubmed.ts +487 -0
  221. package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
  222. package/layer/app/oip-science/indexConfig.json +794 -0
  223. package/layer/app/oip-science/locales/en.json +483 -0
  224. package/layer/app/oip-science/locales/fr.json +483 -0
  225. package/layer/app/oip-science/science.css +1182 -0
  226. package/layer/app/oip-science/utils/a-openCard.ts +23 -0
  227. package/layer/app/oip-science/utils/b-openCard.ts +35 -0
  228. package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
  229. package/layer/app/oip-science/utils/f-types.ts +241 -0
  230. package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
  231. package/layer/app/oip-science/utils/matchMethod.ts +53 -0
  232. package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
  233. package/layer/app/oip-science/utils/sources.ts +15 -0
  234. package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
  235. package/layer/app/oip-science/utils/toPresets.ts +7 -0
  236. package/layer/app/oip-science/utils/valueTable.ts +126 -0
  237. package/layer/app/plugins/oip-science-i18n.ts +17 -0
  238. package/layer/app/utils/oipFicheRoutes.ts +118 -0
  239. package/layer/app/utils/oipResources.ts +440 -0
  240. package/layer/nuxt.config.ts +22 -2
  241. package/layer/public/reports/blincyto-has.html +292 -0
  242. package/layer/public/reports/blincyto-has.pdf +0 -0
  243. package/layer/public/reports/darzalex-has.html +279 -0
  244. package/layer/public/reports/darzalex-has.pdf +0 -0
  245. package/layer/public/reports/dupixent-has.html +217 -0
  246. package/layer/public/reports/dupixent-has.pdf +0 -0
  247. package/layer/public/reports/enhertu-has.html +283 -0
  248. package/layer/public/reports/enhertu-has.pdf +0 -0
  249. package/layer/public/reports/has-sein-2023.html +1639 -0
  250. package/layer/public/reports/ibrance-has.html +280 -0
  251. package/layer/public/reports/ibrance-has.pdf +0 -0
  252. package/layer/public/reports/imfinzi-has.html +297 -0
  253. package/layer/public/reports/imfinzi-has.pdf +0 -0
  254. package/layer/public/reports/keytruda-has.html +337 -0
  255. package/layer/public/reports/keytruda-has.pdf +0 -0
  256. package/layer/public/reports/kisqali-has.html +202 -0
  257. package/layer/public/reports/kisqali-has.pdf +0 -0
  258. package/layer/public/reports/opdivo-has.html +232 -0
  259. package/layer/public/reports/opdivo-has.pdf +0 -0
  260. package/layer/public/reports/ozempic-has.html +188 -0
  261. package/layer/public/reports/ozempic-has.pdf +0 -0
  262. package/layer/public/reports/tecentriq-has.html +315 -0
  263. package/layer/public/reports/tecentriq-has.pdf +0 -0
  264. package/layer/public/reports/yescarta-has.html +275 -0
  265. package/layer/public/reports/yescarta-has.pdf +0 -0
  266. package/layer/server/api/oip/es.post.ts +99 -0
  267. package/layer/server/api/oip/pdf.get.ts +70 -0
  268. package/layer/server/api/oip/reports.get.ts +98 -0
  269. package/layer/server/api/oip/resource-types.get.ts +22 -0
  270. package/package.json +1 -1
@@ -0,0 +1,322 @@
1
+ /**
2
+ * Catalogue des index Elasticsearch de l'app.
3
+ *
4
+ * Chaque index est designe par l'id de sa ligne dans la collection Directus
5
+ * `ElasticIndices` : il ne change jamais, alors que le nom physique suit les
6
+ * versions (`_v2`), les alias et la bascule staging. Le proxy /api/es resout
7
+ * l'id au moment d'interroger le cluster (layer Romulus, resolveOipEsIndex).
8
+ * Le nom figure en commentaire, pour la lecture. Un index absent de Directus
9
+ * reste ecrit en clair : le proxy le laisse passer tel quel (c'est le cas des
10
+ * designations orphelines, qui n'existent pas encore dans le cluster).
11
+ *
12
+ * Un index ne s'ecrit qu'ici. Les pages passent une cle du catalogue, pas une
13
+ * chaine : une faute de frappe devient une erreur de compilation au lieu
14
+ * d'un `hits: []` silencieux a l'ecran. Les familles ou l'index depend d'un
15
+ * niveau choisi par l'utilisateur (ATC, marque, CIP13...) exposent en plus une
16
+ * table `*_BY_LEVEL`, qui remplace la construction par template string.
17
+ */
18
+
19
+ export const ES_INDEX = {
20
+ // Repertoires et dictionnaires
21
+ BRAND_DIRECTORY: "ffd7c620-6064-4b31-ad99-8e614055ddd0", // ope_block402_fr__drugs__brand_directory
22
+ DRUG_DIRECTORY: "7adfeb55-6f51-4c72-a540-420ffabbf034", // ope_block402_fr__drugs__drug_directory
23
+ AGE_DICTIONARY: "1dd78e1b-2648-4aa8-b19d-93ca43252dfc", // ope_block402_fr__drugs__age_dictionary
24
+ GENDER_DICTIONARY: "0667a0a0-9d20-4376-a12c-3ddf44eb6588", // ope_block402_fr__drugs__gender_dictionary
25
+ REGION_DICTIONARY: "76383534-d6c6-4d2e-a863-ffa307e9eb16", // ope_block402_fr__drugs__region_dictionary
26
+ SPECIALTY_DICTIONARY: "298e321f-924b-43fe-8480-a8183518bddf", // ope_block402_fr__drugs__specialty_dictionary
27
+
28
+ // Dictionnaire des cancers de global_oncology_app (CIM-10) : suggestions de
29
+ // maladie de l'assistant de creation de projet.
30
+ ONCOLOGY_DICTIONARY: "8b505318-be8a-4a2a-8296-0b9b4fe53717", // ope__ww__oncology_dictionary__tekkare
31
+
32
+ // Ville, Medic'AM (mensuel et glissant)
33
+ RETAIL_MONTHLY_ATC1: "f541e8cc-6344-4b6c-8c3e-1b0b91c52539", // ope_block402_fr__drugs__retail_monthly__atc1__medicam
34
+ RETAIL_MONTHLY_ATC2: "29a84ea8-4cb8-464b-bd5e-32c918f27101", // ope_block402_fr__drugs__retail_monthly__atc2__medicam
35
+ RETAIL_MONTHLY_ATC3: "72650651-200b-4525-bf0f-be9ae5be5678", // ope_block402_fr__drugs__retail_monthly__atc3__medicam
36
+ RETAIL_MONTHLY_ATC4: "dce9b30a-2b6c-498e-92b4-229aae411f2e", // ope_block402_fr__drugs__retail_monthly__atc4__medicam
37
+ RETAIL_MONTHLY_ATC5: "97b28d4e-2ad7-4ee7-8c88-bfe58f038e53", // ope_block402_fr__drugs__retail_monthly__atc5__medicam
38
+ RETAIL_MONTHLY_BRAND: "68c47aa9-d101-4217-b399-1ca108e610b3", // ope_block402_fr__drugs__retail_monthly__brand__medicam
39
+ RETAIL_MONTHLY_CIP13: "0387bf4a-b191-4910-bfc7-0fa307b3b4be", // ope_block402_fr__drugs__retail_monthly__cip13__medicam
40
+ RETAIL_MONTHLY_COMPANY: "a63a7cf0-e843-4edb-85a0-5b2a6e4cd419", // ope_block402_fr__drugs__retail_monthly__company__medicam
41
+ RETAIL_ROLLING_ATC1: "7c3bc78e-6977-4670-8d39-53021c8dd332", // ope_block402_fr__drugs__retail_rolling__atc1__medicam
42
+ RETAIL_ROLLING_ATC2: "0295c9b1-3544-4a49-8e88-55b5aa4da570", // ope_block402_fr__drugs__retail_rolling__atc2__medicam
43
+ RETAIL_ROLLING_ATC3: "2c698e07-e7c8-471e-a4cf-4bc09d657b23", // ope_block402_fr__drugs__retail_rolling__atc3__medicam
44
+ RETAIL_ROLLING_ATC4: "fe4f3351-f3f9-499d-a913-966aca4ea4e8", // ope_block402_fr__drugs__retail_rolling__atc4__medicam
45
+ RETAIL_ROLLING_ATC5: "65e43287-e8b1-473d-ae6a-f85f972947b9", // ope_block402_fr__drugs__retail_rolling__atc5__medicam
46
+ RETAIL_ROLLING_BRAND: "0908a02c-0b78-4eb6-b8b9-bfa3ea54cc7d", // ope_block402_fr__drugs__retail_rolling__brand__medicam
47
+ RETAIL_ROLLING_CIP13: "2704d81c-6288-4e96-bb8a-109655390378", // ope_block402_fr__drugs__retail_rolling__cip13__medicam
48
+ RETAIL_ROLLING_COMPANY: "c33e8131-d818-4077-a801-721d3594493a", // ope_block402_fr__drugs__retail_rolling__company__medicam
49
+
50
+ // Ville, previsions Medic'AM (Holt-Winters et ETS)
51
+ HW_FORECAST_ATC1: "9a096a2a-2d08-459d-9a29-e5783ae37670", // ope_block402_fr__drugs__hw_forecast__atc1__medicam
52
+ HW_FORECAST_ATC2: "d2d9bc09-a989-4519-8efc-88f29ec83c42", // ope_block402_fr__drugs__hw_forecast__atc2__medicam
53
+ HW_FORECAST_ATC3: "2d12c45a-1ca8-4ad2-b18e-868ed6cc6532", // ope_block402_fr__drugs__hw_forecast__atc3__medicam
54
+ HW_FORECAST_ATC4: "219fdc79-190f-478b-b9fd-2906e7ce3087", // ope_block402_fr__drugs__hw_forecast__atc4__medicam
55
+ HW_FORECAST_ATC5: "16598a09-90f8-44ac-a983-710a5b74dba5", // ope_block402_fr__drugs__hw_forecast__atc5__medicam
56
+ HW_FORECAST_BRAND: "8f1420b0-6e6a-4bca-9cdf-bc2668b3e33c", // ope_block402_fr__drugs__hw_forecast__brand__medicam
57
+ HW_FORECAST_CIP13: "f70bb5b0-bd9c-4288-aeb3-99a1ea5db13c", // ope_block402_fr__drugs__hw_forecast__cip13__medicam
58
+ HW_FORECAST_COMPANY: "c14215d9-6731-40dc-8d29-21dc637fdfb0", // ope_block402_fr__drugs__hw_forecast__company__medicam
59
+ ETS_FORECAST_ATC1: "d65c9b2e-a2b5-4f13-b74b-00069d74384b", // ope_block402_fr__drugs__ets_forecast__atc1__medicam
60
+ ETS_FORECAST_ATC2: "fab5bb3d-4c00-44c9-b9bb-9fddf8aebc3c", // ope_block402_fr__drugs__ets_forecast__atc2__medicam
61
+ ETS_FORECAST_ATC3: "e69c3f7e-0ba2-4f08-ae32-48dd7f0393c5", // ope_block402_fr__drugs__ets_forecast__atc3__medicam
62
+ ETS_FORECAST_ATC4: "cb2d5335-35ab-41d1-8a32-64e8c0d22180", // ope_block402_fr__drugs__ets_forecast__atc4__medicam
63
+ ETS_FORECAST_ATC5: "382f482b-28e3-44b3-9b59-18333135857c", // ope_block402_fr__drugs__ets_forecast__atc5__medicam
64
+ ETS_FORECAST_BRAND: "d0eae7e3-edb8-48c8-819a-5ca34a9bf3c0", // ope_block402_fr__drugs__ets_forecast__brand__medicam
65
+ ETS_FORECAST_CIP13: "9155ab95-a54c-4a4c-80e9-9087039cb5fd", // ope_block402_fr__drugs__ets_forecast__cip13__medicam
66
+ ETS_FORECAST_COMPANY: "4e9974c0-6042-4471-92ed-3c1823123129", // ope_block402_fr__drugs__ets_forecast__company__medicam
67
+
68
+ // Ville, Open Medic (annuel, par croisement)
69
+ RETAIL_ANNUAL_UNSPECIFIED: "c744d7ad-e799-431d-844a-294bef8dd875", // ope_block402_fr__drugs__retail_annual__unspecified__openmedic
70
+ RETAIL_ANNUAL_AGE: "09bd021d-2085-43ac-9d58-d8d0cc742a75", // ope_block402_fr__drugs__retail_annual__age__openmedic
71
+ RETAIL_ANNUAL_GENDER: "f658247a-b691-432e-9440-ace7e9a09d1d", // ope_block402_fr__drugs__retail_annual__gender__openmedic
72
+ RETAIL_ANNUAL_REGION: "956d3650-fc80-4f73-9197-e3e43370a423", // ope_block402_fr__drugs__retail_annual__region__openmedic
73
+ RETAIL_ANNUAL_SPECIALTY: "cb9a8608-3e78-4a4d-a489-9ba75daf51b2", // ope_block402_fr__drugs__retail_annual__specialty__openmedic
74
+ RETAIL_ANNUAL_AGE_GENDER: "fa289392-a473-4e11-b70d-c01d4a2ca357", // ope_block402_fr__drugs__retail_annual__age_gender__openmedic
75
+ RETAIL_ANNUAL_AGE_REGION: "c6df806e-c186-4e6c-83a4-9758d8ce5ebf", // ope_block402_fr__drugs__retail_annual__age_region__openmedic
76
+ RETAIL_ANNUAL_AGE_SPECIALTY: "6f7d99c9-10e0-4274-9edf-1cd278d98c2a", // ope_block402_fr__drugs__retail_annual__age_specialty__openmedic
77
+ RETAIL_ANNUAL_AGE_GENDER_REGION: "4f24fa3d-0ef8-472c-b9e2-8173acf9c1d1", // ope_block402_fr__drugs__retail_annual__age_gender_region__openmedic
78
+ RETAIL_ANNUAL_GENDER_REGION: "ce25faea-c170-4d6f-8bf1-ce0517cb771b", // ope_block402_fr__drugs__retail_annual__gender_region__openmedic
79
+ RETAIL_ANNUAL_GENDER_SPECIALTY: "b58fc503-845d-4c5b-96a6-a530dc3215d2", // ope_block402_fr__drugs__retail_annual__gender_specialty__openmedic
80
+ RETAIL_ANNUAL_REGION_SPECIALTY: "b045cf6b-d7b6-45aa-bbb2-2ab8c7d99e76", // ope_block402_fr__drugs__retail_annual__region_specialty__openmedic
81
+
82
+ // Retrocession et retrocession hospitaliere en ville (SNIIRAM)
83
+ OUTPATIENT_ATC1: "01c15baa-7bb8-417c-9dc5-a8861741c718", // ope_block402_fr__drugs__outpatient__atc1__sniiram
84
+ OUTPATIENT_ATC2: "c4a21f46-7638-4f29-95ab-2a14b614daab", // ope_block402_fr__drugs__outpatient__atc2__sniiram
85
+ OUTPATIENT_ATC3: "7a6dfcbc-5a07-4dd0-98c0-5059dbba59a0", // ope_block402_fr__drugs__outpatient__atc3__sniiram
86
+ OUTPATIENT_ATC4: "07e89676-ca6c-470e-8808-3b46447a9fa7", // ope_block402_fr__drugs__outpatient__atc4__sniiram
87
+ OUTPATIENT_ATC5: "933db198-4826-4500-a6e4-98602803e1c9", // ope_block402_fr__drugs__outpatient__atc5__sniiram
88
+ OUTPATIENT_BRAND: "490126e3-edd2-48f5-81e4-b73a7db34d5a", // ope_block402_fr__drugs__outpatient__brand__sniiram
89
+ OUTPATIENT_CIP13: "b478b739-72f3-44ea-9475-be659c0f0a62", // ope_block402_fr__drugs__outpatient__cip13__sniiram
90
+ OUTPATIENT_OWNER: "f48bb777-c84f-4438-8e87-b09ac0e4e2dd", // ope_block402_fr__drugs__outpatient__owner__sniiram
91
+ OUTPATIENT_HOSPITAL: "070f131a-6398-436b-b5fb-a355c8b8e515", // ope_block402_fr__drugs__outpatient__hospital__sniiram
92
+ OUTPATIENT_GHT: "c7c23a08-4a69-4970-a540-18d3744c18e9", // ope_block402_fr__drugs__outpatient__ght__sniiram
93
+
94
+ // Hopital (annuel)
95
+ HOSPITAL_ANNUAL_SUS: "144caaf4-dbca-4a01-bd24-87d9550de043", // ope_block402_fr__drugs__hospital_annual__sus__atih
96
+ HOSPITAL_ANNUAL_RETROCESSION: "1e15bfd9-b69e-4827-b360-1f8472ed07b4", // ope_block402_fr__drugs__hospital_annual__retrocession__cnam
97
+
98
+ // Statistiques agregees
99
+ STATISTICS_COMPANY: "77b1fb1f-20f9-4ce9-b1dc-bec5ca62fda3", // ope_block402_fr__drug_statistics__company
100
+ STATISTICS_PORTFOLIO: "3238dccc-4411-4bc7-adac-cd0ca669ec00", // ope_block402_fr__drug_statistics__portfolio
101
+ STATISTICS_RETAIL_MONTHLY: "88abb03d-32ba-4d4d-a5df-63f73efe28a1", // ope_block402_fr__drug_statistics__retail_monthly__medicam
102
+ STATISTICS_RETAIL_ROLLING: "6170d618-7d73-4bb3-aa78-7539ca3eaee5", // ope_block402_fr__drug_statistics__retail_rolling__medicam
103
+
104
+ // Agences et avis (ANSM, HAS, BDPM)
105
+ CIS_ANSM: "aeb4414a-839c-4e79-bb0b-d4c912b88b5c", // ope_block402_fr__drugs__cis__ansm
106
+ MITM_BDPM: "ebff5db7-b4e4-46f3-9a79-2264e12e0849", // ope_block402_fr__drugs__mitm__bdpm
107
+ BRAND_HAS: "d736c6f0-0dc6-4bb6-94c4-644a7ad231e7", // ope_block402_fr__drugs__brand__has
108
+ // Une appreciation SMR ou ASMR par document (Dossier Playbook, retours d'experience).
109
+ SMR_ASMR_HAS: "a1218b4b-fc62-42a0-bc39-2ecc2e5b421d", // ope_block402_fr__drugs__smr_asmr__has
110
+ PUT_HAS: "79a2fd26-82a1-44d3-b9f8-d79a0e7352c3", // ope_block402_fr__drugs__put__has
111
+ INDICATION_SEARCH_HAS: "988a17af-b7a2-40af-941b-24116496c68e", // ope_block402_fr__drugs__indication__search__has
112
+
113
+ // Associations de patients. Sept index d'une meme famille, relies par
114
+ // `association_label_regroup` ; deux ne le portent pas et se rejoignent par
115
+ // `session_url` d'un cote, `has_code` + `transcription_url` de l'autre. Le
116
+ // dernier porte un compte rendu de commission de l'Assemblee nationale par
117
+ // document, avec les associations citees en tableau.
118
+ ASSOCIATION_DIRECTORY: "fr__association_directory",
119
+ ASSOCIATION_SESSION_ATTENDEE_ANSM: "fr__association_session_attendee__ansm",
120
+ ASSOCIATION_SESSION_ANSM: "fr__association_session__ansm",
121
+ ASSOCIATION_CONTRIBUTION_HAS: "fr__association_contribution__has",
122
+ ASSOCIATION_TRANSCRIPTION_HAS: "fr__association_transcription__has",
123
+ ASSOCIATION_TRANSCRIPTION_BLOCK_HAS: "fr__association_transcription_block__has",
124
+ ASSOCIATION_COMMISSION_SESSION_NATIONAL_ASSEMBLY:
125
+ "fr__association_commission_session__national_assembly",
126
+
127
+ // Portail (prix, approbations, sources)
128
+ DRUG_CARDS: "aa862a6e-0eb2-453a-b020-46756088e102", // ope_block303_drug_cards
129
+ DRUG_CARDS_PRICE_JO: "d26920da-c420-446b-b039-91dd6b7d52d2", // ope_block303_drug_cards__price__jo
130
+ CURRENCY_RATE: "355437fb-4ec8-4e17-82ab-d0fe76fe6e5f", // ope_block325_currency_rate
131
+ DRUG_APPROVALS: "6fc9e86a-6bac-4937-ab65-a3c17991dee0", // ope__drug_approvals__tekkare
132
+ EU_EMA_JCA_DRUG_APPROVALS: "623c9deb-96f3-4d0b-ac42-17a51094b5d4", // ope__eu_ema_jca_drug_approvals__tekkare
133
+ ORPHAN_DESIGNATION_EMA: "ope__orphan_designation_ema", // absent du cluster et de Directus ElasticIndices
134
+ ORPHAN_DESIGNATION_FDA: "ope__orphan_designation_fda", // absent du cluster et de Directus ElasticIndices
135
+ WW_PRICE_TRACKER: "fe806bee-7e4e-4714-a329-f25879ce1497", // ope__ww_price_tracker__tekkare
136
+
137
+ // Registres d'autorisation etrangers, lus par l'onglet « Regard
138
+ // international » de la fiche produit. Un index par agence.
139
+ APPROVAL_IT_AIFA: "it__drug_opinion__aifa",
140
+ APPROVAL_ES_AEMPS: "es__drug_opinion__aemps",
141
+ APPROVAL_DE_GBA: "67c772ab-0b4d-4dde-9f82-3cd3dc7a2672", // ope__de_gba_benefit_assessment_drug_approvals__tekkare
142
+ APPROVAL_UK_MHRA: "0cb3a88c-9139-48e1-bef2-9f6b9e0d1867", // ope__uk__mhra_drug_approval__tekkare
143
+ APPROVAL_EU_EMA: "eeb2ea64-e896-4586-a654-76e511ffe057", // oip-discovery-ema
144
+ APPROVAL_US_FDA: "3d1fa751-0e83-4007-a314-a86ea25853c6", // ope__us__fda_drug_approval__tekkare
145
+ PROVIDER: "1c3560fc-1ef7-49d3-92b6-1e083a7035a8", // ope_provider_tekkare
146
+ PNDS: "50ca5ef0-6892-4792-9a01-a2f135787609", // ope_block402_fr__drugs__pathology_protocol__pnds
147
+ TRIAL_NCT: "9ec0c673-7da4-4ead-8359-2d23b7b1318a", // oip_datamart_clinicaltrials_prod
148
+ TRIAL_EUCT: "c332f362-2311-4025-b5de-327f81913f7d", // ope_block374_clinical_trials_euct
149
+
150
+ // Dossier Playbook : referentiels des agences (HAS en V1), une entree par
151
+ // version de document, et leurs sections.
152
+ REG_DOCUMENTS: "9eacda12-43e5-4f43-8e10-382dae96491d", // ope__ww_reg_documents_tekkare
153
+ REG_PASSAGES: "271f482d-2290-496f-9498-ef54a02a1754", // ope__ww_reg_passages_tekkare
154
+ // Items structures (exigences, definitions, erreurs frequentes) des
155
+ // documents sans texte suivi, comme la checklist de validation EMA.
156
+ // Absent du registre Directus (ElasticIndices) : nom en clair.
157
+ REG_ITEMS: "ope__ww_reg_items_tekkare",
158
+
159
+ // Dispositifs medicaux, venus de fr_hospitals_app (cle esAuthMedicalDevices)
160
+ MD_SELECTION: "4ef4d490-f76b-4529-8978-2eaa52477be3", // ope__fr__medical_devices__selection__tekkare
161
+ MD_PRIMARY_CARE: "179bde5e-c915-4fca-97fd-0cd059b365d2", // ope__fr__medical_devices__primary_care__tekkare
162
+ } as const;
163
+
164
+ export type EsIndexKey = keyof typeof ES_INDEX;
165
+ export type EsIndexName = (typeof ES_INDEX)[EsIndexKey];
166
+
167
+ /** Niveaux d'analyse proposes sur les ecrans ville Medic'AM. */
168
+ export type MedicamLevel =
169
+ "atc1" | "atc2" | "atc3" | "atc4" | "atc5" | "brand" | "cip13" | "company";
170
+ /** Niveaux d'analyse proposes sur les ecrans retrocession (SNIIRAM). */
171
+ export type OutpatientLevel =
172
+ "atc1" | "atc2" | "atc3" | "atc4" | "atc5" | "brand" | "cip13" | "owner";
173
+ /** Croisements disponibles sur les index annuels Open Medic. */
174
+ export type OpenmedicCrossing =
175
+ | "unspecified"
176
+ | "age"
177
+ | "gender"
178
+ | "region"
179
+ | "specialty"
180
+ | "age_gender"
181
+ | "age_region"
182
+ | "age_specialty"
183
+ | "age_gender_region"
184
+ | "gender_region"
185
+ | "gender_specialty"
186
+ | "region_specialty";
187
+
188
+ export const RETAIL_MONTHLY_INDEX_BY_LEVEL = {
189
+ atc1: ES_INDEX.RETAIL_MONTHLY_ATC1,
190
+ atc2: ES_INDEX.RETAIL_MONTHLY_ATC2,
191
+ atc3: ES_INDEX.RETAIL_MONTHLY_ATC3,
192
+ atc4: ES_INDEX.RETAIL_MONTHLY_ATC4,
193
+ atc5: ES_INDEX.RETAIL_MONTHLY_ATC5,
194
+ brand: ES_INDEX.RETAIL_MONTHLY_BRAND,
195
+ cip13: ES_INDEX.RETAIL_MONTHLY_CIP13,
196
+ company: ES_INDEX.RETAIL_MONTHLY_COMPANY,
197
+ } as const;
198
+
199
+ export const RETAIL_ROLLING_INDEX_BY_LEVEL = {
200
+ atc1: ES_INDEX.RETAIL_ROLLING_ATC1,
201
+ atc2: ES_INDEX.RETAIL_ROLLING_ATC2,
202
+ atc3: ES_INDEX.RETAIL_ROLLING_ATC3,
203
+ atc4: ES_INDEX.RETAIL_ROLLING_ATC4,
204
+ atc5: ES_INDEX.RETAIL_ROLLING_ATC5,
205
+ brand: ES_INDEX.RETAIL_ROLLING_BRAND,
206
+ cip13: ES_INDEX.RETAIL_ROLLING_CIP13,
207
+ company: ES_INDEX.RETAIL_ROLLING_COMPANY,
208
+ } as const;
209
+
210
+ export const HW_FORECAST_INDEX_BY_LEVEL = {
211
+ atc1: ES_INDEX.HW_FORECAST_ATC1,
212
+ atc2: ES_INDEX.HW_FORECAST_ATC2,
213
+ atc3: ES_INDEX.HW_FORECAST_ATC3,
214
+ atc4: ES_INDEX.HW_FORECAST_ATC4,
215
+ atc5: ES_INDEX.HW_FORECAST_ATC5,
216
+ brand: ES_INDEX.HW_FORECAST_BRAND,
217
+ cip13: ES_INDEX.HW_FORECAST_CIP13,
218
+ company: ES_INDEX.HW_FORECAST_COMPANY,
219
+ } as const;
220
+
221
+ export const ETS_FORECAST_INDEX_BY_LEVEL = {
222
+ atc1: ES_INDEX.ETS_FORECAST_ATC1,
223
+ atc2: ES_INDEX.ETS_FORECAST_ATC2,
224
+ atc3: ES_INDEX.ETS_FORECAST_ATC3,
225
+ atc4: ES_INDEX.ETS_FORECAST_ATC4,
226
+ atc5: ES_INDEX.ETS_FORECAST_ATC5,
227
+ brand: ES_INDEX.ETS_FORECAST_BRAND,
228
+ cip13: ES_INDEX.ETS_FORECAST_CIP13,
229
+ company: ES_INDEX.ETS_FORECAST_COMPANY,
230
+ } as const;
231
+
232
+ export const OUTPATIENT_INDEX_BY_LEVEL = {
233
+ atc1: ES_INDEX.OUTPATIENT_ATC1,
234
+ atc2: ES_INDEX.OUTPATIENT_ATC2,
235
+ atc3: ES_INDEX.OUTPATIENT_ATC3,
236
+ atc4: ES_INDEX.OUTPATIENT_ATC4,
237
+ atc5: ES_INDEX.OUTPATIENT_ATC5,
238
+ brand: ES_INDEX.OUTPATIENT_BRAND,
239
+ cip13: ES_INDEX.OUTPATIENT_CIP13,
240
+ owner: ES_INDEX.OUTPATIENT_OWNER,
241
+ } as const;
242
+
243
+ export const RETAIL_ANNUAL_INDEX_BY_CROSSING = {
244
+ unspecified: ES_INDEX.RETAIL_ANNUAL_UNSPECIFIED,
245
+ age: ES_INDEX.RETAIL_ANNUAL_AGE,
246
+ gender: ES_INDEX.RETAIL_ANNUAL_GENDER,
247
+ region: ES_INDEX.RETAIL_ANNUAL_REGION,
248
+ specialty: ES_INDEX.RETAIL_ANNUAL_SPECIALTY,
249
+ age_gender: ES_INDEX.RETAIL_ANNUAL_AGE_GENDER,
250
+ age_region: ES_INDEX.RETAIL_ANNUAL_AGE_REGION,
251
+ age_specialty: ES_INDEX.RETAIL_ANNUAL_AGE_SPECIALTY,
252
+ age_gender_region: ES_INDEX.RETAIL_ANNUAL_AGE_GENDER_REGION,
253
+ gender_region: ES_INDEX.RETAIL_ANNUAL_GENDER_REGION,
254
+ gender_specialty: ES_INDEX.RETAIL_ANNUAL_GENDER_SPECIALTY,
255
+ region_specialty: ES_INDEX.RETAIL_ANNUAL_REGION_SPECIALTY,
256
+ } as const;
257
+
258
+ /**
259
+ * Unions par famille. Un composant dont l'index change avec le niveau
260
+ * choisi declare la famille, pas `EsIndexName` : ses documents gardent alors
261
+ * un type utilisable, tous les niveaux d'une famille partageant le meme
262
+ * schema.
263
+ */
264
+ export type RetailMonthlyIndexName =
265
+ (typeof RETAIL_MONTHLY_INDEX_BY_LEVEL)[MedicamLevel];
266
+ export type RetailRollingIndexName =
267
+ (typeof RETAIL_ROLLING_INDEX_BY_LEVEL)[MedicamLevel];
268
+ export type MedicamRetailIndexName =
269
+ RetailMonthlyIndexName | RetailRollingIndexName;
270
+ export type ForecastIndexName =
271
+ | (typeof HW_FORECAST_INDEX_BY_LEVEL)[MedicamLevel]
272
+ | (typeof ETS_FORECAST_INDEX_BY_LEVEL)[MedicamLevel];
273
+ export type OpenmedicIndexName =
274
+ (typeof RETAIL_ANNUAL_INDEX_BY_CROSSING)[OpenmedicCrossing];
275
+ export type OutpatientIndexName =
276
+ | (typeof OUTPATIENT_INDEX_BY_LEVEL)[OutpatientLevel]
277
+ | typeof ES_INDEX.OUTPATIENT_HOSPITAL
278
+ | typeof ES_INDEX.OUTPATIENT_GHT;
279
+ export type HospitalAnnualIndexName =
280
+ | typeof ES_INDEX.HOSPITAL_ANNUAL_SUS
281
+ | typeof ES_INDEX.HOSPITAL_ANNUAL_RETROCESSION;
282
+ export type DirectoryIndexName =
283
+ typeof ES_INDEX.BRAND_DIRECTORY | typeof ES_INDEX.DRUG_DIRECTORY;
284
+ export type StatisticsIndexName =
285
+ | HospitalAnnualIndexName
286
+ | typeof ES_INDEX.STATISTICS_COMPANY
287
+ | typeof ES_INDEX.STATISTICS_PORTFOLIO
288
+ | typeof ES_INDEX.STATISTICS_RETAIL_MONTHLY
289
+ | typeof ES_INDEX.STATISTICS_RETAIL_ROLLING;
290
+ export type DictionaryIndexName =
291
+ | typeof ES_INDEX.AGE_DICTIONARY
292
+ | typeof ES_INDEX.GENDER_DICTIONARY
293
+ | typeof ES_INDEX.REGION_DICTIONARY
294
+ | typeof ES_INDEX.SPECIALTY_DICTIONARY;
295
+
296
+ /**
297
+ * Index pilote par l'environnement.
298
+ *
299
+ * Quelques index du portail sont surchargeables par variable d'environnement
300
+ * (`HAS_INDEX`, `PUT_INDEX`...). La configuration les rend en `string` : ce
301
+ * passage rappelle le defaut du catalogue quand la variable manque, et rend
302
+ * la valeur au type du catalogue.
303
+ */
304
+ export function esIndexFromConfig(
305
+ value: unknown,
306
+ fallback: EsIndexName,
307
+ ): EsIndexName {
308
+ return typeof value === "string" && value ? (value as EsIndexName) : fallback;
309
+ }
310
+
311
+ /**
312
+ * Plusieurs index dans une meme requete.
313
+ *
314
+ * Le serveur transmet le parametre `index` tel quel, et Elasticsearch accepte
315
+ * une liste separee par des virgules (les essais cliniques interrogent les
316
+ * deux registres d'un coup). Le resultat reste typé comme un index : c'est ce
317
+ * que les composables attendent, et la liste est construite a partir du
318
+ * catalogue.
319
+ */
320
+ export function esIndexList(...names: EsIndexName[]): EsIndexName {
321
+ return names.join(",") as EsIndexName;
322
+ }
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Les familles que fr_drugs_app range dans un projet, decrites pour tout le
3
+ * portail (cf. useHubrResourceKinds de fr_drugs_app) : index, titre,
4
+ * sous-titre et chemin de la fiche dans fr_drugs_app. Repris de la copie que
5
+ * France Augmented Science tenait (useDrugProjectKinds), index designes par
6
+ * le catalogue de fr_drugs_app (ids Directus).
7
+ *
8
+ * Les ventes s'ancrent sur la derniere periode de la marque et se relisent par
9
+ * elle (R-01 des projets Virtual Lab) : `titleFromId` titre la ligne meme
10
+ * quand l'ancre a quitte l'index.
11
+ *
12
+ * Importe aussi par le serveur : pas d'import propre a Vue ou a Nuxt ici.
13
+ */
14
+
15
+ import type { RmProjectKind } from "@tekkare/romulus/utils/projects";
16
+ import { ES_INDEX } from "./esIndices";
17
+
18
+ type Lang = "fr" | "en";
19
+
20
+ /** La fiche HAS d'un groupe de marque, dans fr_drugs_app. */
21
+ export function drugsBrandPath(brand: unknown) {
22
+ const value = String(brand ?? "").trim();
23
+ return value ? `/hubr/heart/details/${encodeURIComponent(value)}` : "";
24
+ }
25
+
26
+ /** La fiche d'une association de patients, par son nom regroupe. */
27
+ export function drugsAssociationPath(label: unknown) {
28
+ const value = String(label ?? "").trim();
29
+ return value ? `/hubr/heart/associations/${encodeURIComponent(value)}` : "";
30
+ }
31
+
32
+ /** Valeur du champ selon la langue, avec repli sur le francais. */
33
+ function loc(source: any, base: string, lang: Lang): string {
34
+ const value = lang === "en" ? source?.[`${base}_en`] : source?.[`${base}_fr`];
35
+ const out = value ?? source?.[`${base}_fr`] ?? source?.[base];
36
+ return Array.isArray(out) ? out.filter(Boolean).join(", ") : String(out ?? "");
37
+ }
38
+
39
+ /** La derniere publication au JO (date, prix public), avec le nombre total. */
40
+ function joSubtitle(jo: unknown, lang: Lang): string {
41
+ if (!Array.isArray(jo) || !jo.length) return "";
42
+ const en = lang === "en";
43
+ const last = [...jo].sort((a, b) => String(b?.announce_date ?? "").localeCompare(String(a?.announce_date ?? "")))[0];
44
+ const date = new Date(last?.announce_date ?? "");
45
+ return [
46
+ Number.isNaN(date.getTime()) ? "" : `${en ? "Published on" : "Publié le"} ${date.toLocaleDateString(en ? "en-GB" : "fr-FR")}`,
47
+ typeof last?.public_price === "number"
48
+ ? `${en ? "Public price" : "Prix public"} : ${last.public_price.toLocaleString(en ? "en-GB" : "fr-FR", { style: "currency", currency: "EUR" })}`
49
+ : "",
50
+ jo.length > 1 ? `${jo.length} publications` : "",
51
+ ]
52
+ .filter(Boolean)
53
+ .join(" · ");
54
+ }
55
+
56
+ const list = (value: unknown) => (Array.isArray(value) ? value.join(", ") : String(value ?? ""));
57
+
58
+ const HAS = { fr: "HAS", en: "HAS" };
59
+ const PRICES = { fr: "Prix", en: "Prices" };
60
+ const ASSOCIATIONS = { fr: "Associations de patients", en: "Patient associations" };
61
+ const HOSPITAL = { fr: "Hôpital", en: "Hospital" };
62
+
63
+ export const DRUG_PROJECT_KINDS: RmProjectKind[] = [
64
+ {
65
+ type: "FrHasBrand",
66
+ index: ES_INDEX.BRAND_HAS,
67
+ label: { fr: "Avis HAS", en: "HAS opinions" },
68
+ section: HAS,
69
+ icon: "Certificate",
70
+ // Molecule et ATC5 vivent dans chaque avis : le cadrage du projet les lit.
71
+ source: ["brand_group", "last_opinion_date", "brand_history.molecule", "brand_history.atc5_code"],
72
+ title: (s) => s?.brand_group ?? "",
73
+ subtitle: (s, l) => (s?.last_opinion_date ? `${l === "en" ? "Latest opinion" : "Dernier avis"} : ${s.last_opinion_date}` : ""),
74
+ path: (s) => drugsBrandPath(s?.brand_group),
75
+ },
76
+ {
77
+ type: "FrHasIndication",
78
+ index: ES_INDEX.INDICATION_SEARCH_HAS,
79
+ label: { fr: "Indications (LES / APAC)", en: "Indications (LES / APAC)" },
80
+ section: HAS,
81
+ icon: "ListChecks",
82
+ source: ["brand", "indication", "indication_fr", "indication_en", "indication_label_fr", "french_label", "card_id"],
83
+ title: (s, l) => loc(s, "indication", l) || s?.indication_label_fr || s?.french_label || "",
84
+ subtitle: (s) => list(s?.brand),
85
+ path: (s) => {
86
+ const code = Array.isArray(s?.indication) ? s.indication.find(Boolean) : s?.indication;
87
+ return code ? `/hubr/heart/indication/${code}` : "";
88
+ },
89
+ },
90
+ {
91
+ type: "FrHasPut",
92
+ index: ES_INDEX.PUT_HAS,
93
+ label: { fr: "P.U.T", en: "P.U.T" },
94
+ section: HAS,
95
+ icon: "ClipboardText",
96
+ source: ["brand", "dci", "aap_type_fr", "aap_type_en", "authorization_date"],
97
+ title: (s) => list(s?.brand),
98
+ subtitle: (s, l) => loc(s, "aap_type", l),
99
+ path: (_s, id) => `/hubr/heart/put/${id}`,
100
+ },
101
+ {
102
+ type: "FrMitm",
103
+ index: ES_INDEX.MITM_BDPM,
104
+ label: { fr: "MITM", en: "MITM" },
105
+ section: HAS,
106
+ icon: "FirstAid",
107
+ source: ["brand", "cis_label", "cis_code", "atc5_french_code_label", "atc5_english_code_label", "owner_regroup"],
108
+ title: (s) => s?.cis_label ?? s?.brand ?? "",
109
+ subtitle: (s, l) =>
110
+ [l === "en" ? s?.atc5_english_code_label : s?.atc5_french_code_label, s?.owner_regroup].filter(Boolean).join(" · "),
111
+ path: (s) => (s?.cis_code ? `/hubr/heart/mitm/${s.cis_code}` : ""),
112
+ },
113
+ {
114
+ type: "FrPnds",
115
+ index: ES_INDEX.PNDS,
116
+ label: { fr: "PNDS", en: "PNDS" },
117
+ section: HAS,
118
+ icon: "FileText",
119
+ source: ["pathology_fr", "pathology_en", "protocol_id", "protocol_date"],
120
+ title: (s, l) => loc(s, "pathology", l),
121
+ subtitle: (s) => s?.protocol_id ?? "",
122
+ path: (_s, id) => `/hubr/heart/pnds/${id}`,
123
+ },
124
+ {
125
+ type: "FrDrugPrice",
126
+ index: ES_INDEX.DRUG_CARDS,
127
+ label: { fr: "Prix", en: "Prices" },
128
+ section: PRICES,
129
+ icon: "CurrencyEur",
130
+ source: ["brand", "label", "local_drug_id", "last_price_update"],
131
+ title: (s) => s?.label ?? s?.brand ?? "",
132
+ subtitle: (s, l) => (s?.last_price_update ? `${l === "en" ? "Latest price" : "Dernier prix"} : ${s.last_price_update}` : ""),
133
+ path: (s) => (s?.local_drug_id ? `/hubr/heart/prices/details/${s.local_drug_id}` : ""),
134
+ },
135
+ {
136
+ type: "FrDrugPriceJo",
137
+ index: ES_INDEX.DRUG_CARDS_PRICE_JO,
138
+ label: { fr: "Publications JO", en: "Official journal" },
139
+ section: PRICES,
140
+ icon: "Newspaper",
141
+ source: ["brand", "label", "local_drug_id", "jo", "update_date"],
142
+ title: (s) => s?.label ?? s?.brand ?? "",
143
+ subtitle: (s, l) => joSubtitle(s?.jo, l),
144
+ path: (s) => (s?.local_drug_id ? `/hubr/heart/prices/jo/${s.local_drug_id}` : ""),
145
+ },
146
+ {
147
+ type: "FrAnsmProduct",
148
+ index: ES_INDEX.CIS_ANSM,
149
+ label: { fr: "Autorisations ANSM", en: "ANSM authorizations" },
150
+ section: { fr: "ANSM", en: "ANSM" },
151
+ icon: "Pill",
152
+ source: ["brand", "cis_label", "cis_code", "amm_status", "owner_regroup"],
153
+ title: (s) => s?.cis_label ?? s?.brand ?? "",
154
+ subtitle: (s) => s?.owner_regroup ?? "",
155
+ path: (_s, id) => `/hubr/heart/ansm/details/${id}`,
156
+ },
157
+ {
158
+ type: "FrPatientAssociation",
159
+ index: ES_INDEX.ASSOCIATION_DIRECTORY,
160
+ label: { fr: "Associations de patients", en: "Patient associations" },
161
+ section: ASSOCIATIONS,
162
+ icon: "UsersThree",
163
+ source: ["association_label_regroup", "association_label", "has_contribution_count"],
164
+ title: (s) => s?.association_label_regroup ?? "",
165
+ // Les appellations brutes sont collees par des « ; » : la premiere suffit.
166
+ subtitle: (s) => String(s?.association_label ?? "").split(";")[0]?.trim() ?? "",
167
+ // L'`_id` du document EST le nom regroupe.
168
+ path: (_s, id) => drugsAssociationPath(id),
169
+ },
170
+ {
171
+ type: "FrPatientContribution",
172
+ index: ES_INDEX.ASSOCIATION_CONTRIBUTION_HAS,
173
+ label: { fr: "Contributions patients", en: "Patient contributions" },
174
+ section: ASSOCIATIONS,
175
+ icon: "ChatsCircle",
176
+ source: ["association_label_regroup", "has_code", "request_nature", "contribution_date", "contribution_url"],
177
+ // `brand_group` vient de l'index HAS (cf. withContributionBrands).
178
+ title: (s, l) => {
179
+ const association = s?.association_label_regroup ?? "";
180
+ if (l === "en") return s?.brand_group ? `${s.brand_group}, contribution by ${association}` : `Contribution by ${association}`;
181
+ return s?.brand_group ? `${s.brand_group}, contribution de ${association}` : `Contribution de ${association}`;
182
+ },
183
+ subtitle: (s, l) => {
184
+ const date = new Date(s?.contribution_date ?? "");
185
+ return [s?.request_nature, Number.isNaN(date.getTime()) ? "" : date.toLocaleDateString(l === "en" ? "en-GB" : "fr-FR"), s?.has_code]
186
+ .filter((v) => v && v !== "None")
187
+ .join(" · ");
188
+ },
189
+ path: (s) => drugsAssociationPath(s?.association_label_regroup),
190
+ },
191
+ {
192
+ type: "FrNationalAssemblySession",
193
+ index: ES_INDEX.ASSOCIATION_COMMISSION_SESSION_NATIONAL_ASSEMBLY,
194
+ label: { fr: "Assemblée nationale", en: "National Assembly" },
195
+ section: ASSOCIATIONS,
196
+ icon: "Bank",
197
+ source: ["agenda", "parliamentary_session", "session_date"],
198
+ title: (s) => s?.agenda ?? "",
199
+ subtitle: (s) => s?.parliamentary_session ?? "",
200
+ path: () => "/hubr/heart/associations/national-assembly",
201
+ },
202
+ {
203
+ type: "FrMedicamBrand",
204
+ index: ES_INDEX.RETAIL_MONTHLY_BRAND,
205
+ label: { fr: "Medic'AM (marques)", en: "Medic'AM (brands)" },
206
+ section: { fr: "Médicaments", en: "Drugs" },
207
+ icon: "ChartLine",
208
+ source: ["code", "period"],
209
+ title: (s) => s?.code ?? "",
210
+ subtitle: (s, l) => {
211
+ const last = s?.period ? `, ${l === "en" ? "latest month" : "dernier mois"} : ${s.period}` : "";
212
+ return l === "en" ? `Retail sales of the brand${last}` : `Ventes en ville de la marque${last}`;
213
+ },
214
+ path: () => "/medicam/market",
215
+ titleFromId: (id) => id.replace(/_\d{4}-\d{2}_\d+$/, ""),
216
+ },
217
+ {
218
+ type: "FrOutpatientBrand",
219
+ index: ES_INDEX.OUTPATIENT_BRAND,
220
+ label: { fr: "Outpatient (marques)", en: "Outpatient (brands)" },
221
+ section: { fr: "Outpatient (PHMEV)", en: "Outpatient (PHMEV)" },
222
+ icon: "Hospital",
223
+ source: ["code", "max_period"],
224
+ title: (s) => s?.code ?? "",
225
+ subtitle: (s, l) => {
226
+ const until = s?.max_period ? `, ${l === "en" ? "latest year" : "dernière année"} : ${s.max_period}` : "";
227
+ return l === "en"
228
+ ? `Hospital prescriptions of the brand filled in town${until}`
229
+ : `Prescriptions hospitalières de la marque délivrées en ville${until}`;
230
+ },
231
+ path: () => "/outpatient",
232
+ titleFromId: (id) => id.replace(/_TOTAL$/, ""),
233
+ },
234
+ {
235
+ type: "FrSusBrand",
236
+ index: ES_INDEX.HOSPITAL_ANNUAL_SUS,
237
+ label: { fr: "Liste en sus (marques)", en: "Inpatient list (brands)" },
238
+ section: HOSPITAL,
239
+ icon: "Bed",
240
+ source: ["code", "period"],
241
+ title: (s) => s?.code ?? "",
242
+ subtitle: (s, l) => {
243
+ const last = s?.period ? `, ${l === "en" ? "latest year" : "dernière année"} : ${s.period}` : "";
244
+ return l === "en" ? `Hospital billing on top of the GHS${last}` : `Facturation en sus des GHS${last}`;
245
+ },
246
+ path: () => "/hospital/sus",
247
+ titleFromId: (id) => id.replace(/_brand_\d{4}_TOTAL_TOTAL_\d+$/, ""),
248
+ },
249
+ {
250
+ type: "FrRetrocessionBrand",
251
+ index: ES_INDEX.HOSPITAL_ANNUAL_RETROCESSION,
252
+ label: { fr: "Rétrocession (marques)", en: "Retrocession (brands)" },
253
+ section: HOSPITAL,
254
+ icon: "FirstAid",
255
+ source: ["code", "period"],
256
+ title: (s) => s?.code ?? "",
257
+ subtitle: (s, l) => {
258
+ const last = s?.period ? `, ${l === "en" ? "latest year" : "dernière année"} : ${s.period}` : "";
259
+ return l === "en" ? `Hospital retrocession of the brand${last}` : `Rétrocession hospitalière de la marque${last}`;
260
+ },
261
+ path: () => "/hospital/retrocession",
262
+ titleFromId: (id) => id.replace(/_brand_\d{4}$/, ""),
263
+ },
264
+ ];