You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1069 lines
38KB

  1. ---
  2. title: Bilan de clôture
  3. runtime: shiny
  4. output:
  5. html_document:
  6. toc: true
  7. toc_float: true
  8. ---
  9. ```{r init, echo = F, message = F, warning = F}
  10. library(tidyverse)
  11. library(DT)
  12. library(knitr)
  13. library(stringr)
  14. library(plotly)
  15. library(lubridate)
  16. library(RMySQL)
  17. source("functionsOvalide.R")
  18. opts_chunk$set(echo = F,
  19. message = F,
  20. warning = F,
  21. fig.width = 10,
  22. fig.height = 6)
  23. options(DT.options = list(paging = F,
  24. searching = F,
  25. info = F,
  26. dom = "Bfrtip",
  27. buttons = c("copy", "excel")))
  28. ```
  29. # {.tabset}
  30. ## Chargement des données
  31. Le fichier d'exhaustivité doit être fourni au format CSV avec les paramètres suivants :
  32. * séparateur de champs = ,
  33. * guillemets = "
  34. * encodage = UTF-8
  35. * séparateur de décimales = ,
  36. et doit être issu de la [requête suivante](https://livenne.chu-nancy.fr/shiny_files/cloture/exhaustivite.wid), exécutée le jour de la cloture.
  37. ```{r data}
  38. if (!dir.exists("/var/www/html/shiny_files/cloture"))
  39. dir.create("/var/www/html/shiny_files/cloture")
  40. file.copy("exhaustivite.wid", "/var/www/html/shiny_files/cloture", overwrite = T) -> null
  41. inputPanel(
  42. numericInput("annee", "Année", Sys.Date() %>% year),
  43. numericInput("mois", "Mois", Sys.Date() %>% month - 1)
  44. )
  45. inputPanel(
  46. textInput("CHUuser", "Utilisateur CHU"),
  47. passwordInput("CHUpass", "Mot de passe CHU")
  48. )
  49. inputPanel(
  50. textInput("ATIHuser", "Utilisateur ePMSI"),
  51. passwordInput("ATIHpass", "Mot de passe ePMSI"),
  52. actionButton("goATIH", "Ok")
  53. )
  54. inputPanel(
  55. textInput("user", "Utilisateur mysql livenne"),
  56. passwordInput("password", "Mot de passe mysql livenne"),
  57. actionButton("goLivenne", "Ok")
  58. )
  59. inputPanel(
  60. fileInput("exhau_pims", "Fichier d'exhaustivité", accept = "text/csv"),
  61. downloadButton("report", "Télécharger le rapport")
  62. )
  63. # Récupération des fichiers ePMSI ----
  64. connected <- eventReactive(input$goATIH, {
  65. req(input$CHUuser, input$CHUpass, input$ATIHuser, input$ATIHpass, input$annee, input$mois)
  66. withProgress(min = 0, max = 3, message = "Téléchargement des fichiers ePMSI",
  67. {
  68. incProgress(1, detail = "Connexion à ePMSI")
  69. connectOvalide(input$CHUuser, input$CHUpass, input$ATIHuser, input$ATIHpass)
  70. incProgress(1, detail = str_c("Téléchargement du tableau de", input$mois, input$annee, sep = " "))
  71. getOvalide(input$CHUuser, input$CHUpass, input$annee, input$mois)
  72. incProgress(1, detail = str_c("Téléchargement du tableau de", input$mois, input$annee - 1, sep = " "))
  73. getOvalide(input$CHUuser, input$CHUpass, input$annee - 1, input$mois)
  74. })
  75. T
  76. })
  77. # Extraction des données des fichiers ePMSI ----
  78. Ovalide <- reactive({
  79. req(connected())
  80. liste <- read.csv2("listOvalide.csv")
  81. withProgress(min = 0, max = nrow(liste), message = "Extraction des tableaux ePMSI année courante",
  82. {
  83. liste %>%
  84. apply(1, . %>%
  85. {
  86. incProgress(1, detail = str_c("Tableau", .["table"], "-", .["subtable"], sep = " "))
  87. extractOvalide(input$annee, input$mois, .["table"], .["subtable"]) %>%
  88. setNames(LETTERS[seq_along(.)])
  89. }) %>%
  90. setNames(liste$name)
  91. })
  92. })
  93. OvalideP <- reactive({
  94. req(connected())
  95. liste <- read.csv2("listOvalide.csv")
  96. withProgress(min = 0, max = nrow(liste), message = "Extraction des tableaux ePMSI année précédente",
  97. {
  98. liste %>%
  99. apply(1, . %>%
  100. {
  101. incProgress(1, detail = str_c("Tableau", .["table"], "-", .["subtable"], sep = " "))
  102. extractOvalide(input$annee - 1, input$mois, .["table"], .["subtable"]) %>%
  103. setNames(LETTERS[seq_along(.)])
  104. }) %>%
  105. setNames(liste$name)
  106. })
  107. })
  108. # Nettoyage des fichiers extraits. Les archives sont conservées. ----
  109. observe({
  110. req(Ovalide())
  111. unlink(str_c("OVALIDE T2A.MCO.DGF", input$annee, input$mois, "html", sep = "."))
  112. })
  113. observe({
  114. req(OvalideP())
  115. unlink(str_c("OVALIDE T2A.MCO.DGF", input$annee - 1, input$mois, "html", sep = "."))
  116. })
  117. # RSS depuis RDS
  118. rss <- eventReactive(input$goLivenne,
  119. {
  120. req(input$user, input$password, input$annee)
  121. withProgress(min = 0, max = 2, message = "Extraction des RSSs", detail = "rdsR01",
  122. {
  123. src_mysql("pmsi_dim", "localhost", user = input$user, password = input$password) %>%
  124. tbl("rdsR01") %>%
  125. filter(ANS_SORTIE > input$annee - 3) %>%
  126. select(finess, idrss, CMD, DUREE_RSS, ANS_SORTIE, MOIS_SORTIE) %>%
  127. collect(n = Inf) -> rdsR01
  128. incProgress(1, detail = "rdsR02")
  129. src_mysql("pmsi_dim", "localhost", user = input$user, password = input$password) %>%
  130. tbl("rdsR02") %>%
  131. filter(ANS_SORTIE > input$annee - 3) %>%
  132. select(finess, idrss, CMD, DUREE_RSS, ANS_SORTIE, MOIS_SORTIE) %>%
  133. collect(n = Inf) -> rdsR02
  134. incProgress(1, detail = "Fusion R01+R02")
  135. rdsR01 %>% bind_rows(rdsR02) %>%
  136. rename(annee_sortie = ANS_SORTIE,
  137. mois_sortie = MOIS_SORTIE,
  138. cmd = CMD,
  139. duree_rss = DUREE_RSS)
  140. })
  141. })
  142. # RUM
  143. rum <- reactive({
  144. req(rss())
  145. withProgress(min = 0, max = 4, message = "Extraction des RUMs", detail = "fix116",
  146. {
  147. src_mysql("pmsi_dim", "localhost", user = input$user, password = input$password) %>%
  148. tbl("fix116") %>%
  149. select(finess, idrss, um) %>%
  150. collect(n = Inf) -> fix116
  151. incProgress(1, detail = "fix117")
  152. src_mysql("pmsi_dim", "localhost", user = input$user, password = input$password) %>%
  153. tbl("fix117") %>%
  154. select(finess, idrss, um) %>%
  155. collect(n = Inf) -> fix117
  156. incProgress(1, detail = "Fusion fix116+fix117")
  157. fix116 %>% bind_rows(fix117) -> fix
  158. incProgress(1, detail = "structure")
  159. src_mysql("pmsi_dim_nom", "localhost", user = input$user, password = input$password) %>%
  160. tbl("structure") %>%
  161. filter(um != "") %>%
  162. select(uf_date_ferm, um, pole_libelle) %>%
  163. arrange(um, uf_date_ferm) %>%
  164. distinct %>%
  165. collect(n = Inf) %>%
  166. tibble::rownames_to_column(var = "dummy") %>% # Dédoublonnage : 1 um -> 1 couple libellés
  167. group_by(um) %>%
  168. filter(dummy == last(dummy)) %>%
  169. select(-dummy, -uf_date_ferm) %>%
  170. ungroup -> struct
  171. incProgress(1, detail = "Fusion RSS-RUM-Structure")
  172. rss() %>%
  173. left_join(fix) %>%
  174. left_join(struct) %>%
  175. mutate(pole_libelle = ifelse(pole_libelle == "CLOS14 HEMATOLOGIE", "SPECIALITES MEDICALES", pole_libelle))
  176. })
  177. })
  178. # Exhaustivité ----
  179. exhau_pims <- reactive({
  180. req(input$exhau_pims)
  181. withProgress(min = 0, max = 1, message = "Exhaustivité - Lecture fichier",
  182. {
  183. read_csv(input$exhau_pims$datapath) %>%
  184. setNames(c("Pole", "Service", "RUM", "DP", "Erreur", "Sortie", "Duree", "RSS")) %>%
  185. mutate(Sortie = Sortie %>% as.Date) %>%
  186. filter(month(Sortie) <= input$mois)
  187. })
  188. })
  189. db_updated <- reactive({
  190. req(exhau_pims(), input$user, input$password, input$annee, input$mois)
  191. withProgress(min = 0, max = 1, message = "Enregistrement historique exhaustivité",
  192. {
  193. try({
  194. dbConnect(MySQL(), host = "localhost", dbname = "pmsi_dim", user = input$user, password = input$password) %>%
  195. dbWriteTable("exhaustivite", data.frame(annee = input$annee,
  196. mois = input$mois,
  197. nb_rss_tot = exhau_pims() %>%
  198. distinct(RSS, .keep_all = T) %>%
  199. nrow,
  200. nb_rss_manq = exhau_pims() %>%
  201. filter(is.na(DP)) %>%
  202. distinct(RSS) %>%
  203. nrow),
  204. row.names = F,
  205. append = T)
  206. })
  207. })
  208. T
  209. })
  210. exhau <- reactive({
  211. req(input$user, input$password, db_updated(), input$annee)
  212. withProgress(min = 0, max = 1, message = "Lecture historique exhaustivité",
  213. {
  214. src_mysql("pmsi_dim", "localhost", user = input$user, password = input$password) %>%
  215. tbl("exhaustivite") %>%
  216. collect(n = Inf) %>%
  217. filter(annee == input$annee) %>%
  218. full_join(data.frame(mois = 1:12), by = "mois") %>%
  219. select(annee, mois, rss = nb_rss_tot, manq = nb_rss_manq)
  220. })
  221. })
  222. output$report <- downloadHandler(filename = "bilan.html",
  223. content = function(file)
  224. {
  225. rmarkdown::render("cloture.Rmd",
  226. output_file = file,
  227. params = list(annee = input$annee,
  228. mois = input$mois,
  229. rum = rum(),
  230. rss = rss(),
  231. exhau = exhau(),
  232. exhau_pims = exhau_pims(),
  233. Ovalide = tibble::data_frame(nom = names(Ovalide()), tab = Ovalide()),
  234. OvalideP = tibble::data_frame(nom = names(OvalideP()), tab = OvalideP())))
  235. })
  236. mois_label <- c("Janvier",
  237. "Février",
  238. "Mars",
  239. "Avril",
  240. "Mai",
  241. "Juin",
  242. "Juillet",
  243. "Août",
  244. "Septembre",
  245. "Octobre",
  246. "Novembre",
  247. "Décembre")
  248. previous <- reactive({
  249. req(input$mois, input$annee)
  250. str_c("M", sprintf("%02.f", input$mois), "-", input$annee - 1)
  251. })
  252. current <- reactive({
  253. req(input$mois, input$annee)
  254. str_c("M", sprintf("%02.f", input$mois), "-", input$annee)
  255. })
  256. periode <- reactive({
  257. req(previous(), current())
  258. str_c(previous(), " et de ", current())
  259. })
  260. ```
  261. ## Rapport
  262. ### Production
  263. #### Nombre total de RUM et de RSS transmis
  264. ```{r tab1}
  265. DT::renderDataTable({
  266. req(input$annee, rum(), rss())
  267. rum() %>%
  268. filter(annee_sortie == input$annee) %>%
  269. tally %>%
  270. bind_rows(rss() %>%
  271. filter(annee_sortie == input$annee) %>%
  272. tally) %>%
  273. datatable(rownames = c("RUM", "RSS"),
  274. extensions = "Buttons",
  275. colnames = c("Type de résumé", "Nombre transmis"))
  276. })
  277. ```
  278. #### Nombre de RUM transmis par mois pour les 3 dernières années
  279. ```{r tab2a}
  280. DT::renderDataTable({
  281. req(rum(), input$mois, input$annee)
  282. rum() %>%
  283. count(annee_sortie, mois_sortie) %>%
  284. spread(annee_sortie, n) %>%
  285. bind_rows(filter(., mois_sortie <= input$mois) %>%
  286. select(-mois_sortie) %>%
  287. summarise_each(funs(sum))) %>%
  288. bind_rows(filter(., mois_sortie <= 12) %>%
  289. select(-mois_sortie) %>%
  290. summarise_each(funs(sum))) %>%
  291. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  292. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  293. select(-mois_sortie) %>%
  294. datatable(rownames = c(mois_label, "Total clôture", "Total M12"),
  295. extensions = "Buttons") %>%
  296. formatPercentage(c(4,5), digits = 2)
  297. })
  298. ```
  299. ```{r fig2a}
  300. renderPlotly({
  301. req(rum())
  302. rum() %>%
  303. count(annee_sortie, mois_sortie) %>%
  304. ungroup %>%
  305. mutate(annee_sortie = annee_sortie %>% factor) %>%
  306. ggplot(
  307. aes(x = mois_sortie,
  308. y = n,
  309. color = annee_sortie,
  310. shape = annee_sortie)) +
  311. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  312. geom_line() +
  313. geom_point() +
  314. labs(x = NULL,
  315. y = NULL,
  316. title = "RUM") +
  317. theme_bw() +
  318. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  319. legend.title = element_blank(),
  320. plot.title = element_text(hjust = 0)) -> p
  321. ggplotly(p, tooltip = c("x", "y", "colour"))
  322. })
  323. ```
  324. #### Nombre de RSS transmis par mois pour les 3 dernières années
  325. ```{r tab2b}
  326. DT::renderDataTable({
  327. req(rss(), input$mois, input$annee)
  328. rss() %>%
  329. count(annee_sortie, mois_sortie) %>%
  330. spread(annee_sortie, n) %>%
  331. bind_rows(filter(., mois_sortie <= input$mois) %>%
  332. select(-mois_sortie) %>%
  333. summarise_each(funs(sum))) %>%
  334. bind_rows(filter(., mois_sortie <= 12) %>%
  335. select(-mois_sortie) %>%
  336. summarise_each(funs(sum))) %>%
  337. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  338. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  339. select(-mois_sortie) %>%
  340. datatable(rownames = c(mois_label, "Total clôture", "Total M12"),
  341. extensions = "Buttons") %>%
  342. formatPercentage(c(4,5), digits = 2)
  343. })
  344. ```
  345. ```{r fig2b}
  346. renderPlotly({
  347. req(rss())
  348. rss() %>%
  349. count(annee_sortie, mois_sortie) %>%
  350. ungroup %>%
  351. mutate(annee_sortie = annee_sortie %>% factor) %>%
  352. ggplot(
  353. aes(x = mois_sortie,
  354. y = n,
  355. color = annee_sortie,
  356. shape = annee_sortie)) +
  357. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  358. geom_line() +
  359. geom_point() +
  360. labs(x = NULL,
  361. y = NULL,
  362. title = "RSS") +
  363. theme_bw() +
  364. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  365. legend.title = element_blank(),
  366. plot.title = element_text(hjust = 0)) -> p
  367. ggplotly(p, tooltip = c("x", "y", "colour"))
  368. })
  369. ```
  370. ##### Nombre de RSS de 1 jour et plus transmis par mois pour les 3 dernières années
  371. ```{r tab3a}
  372. DT::renderDataTable({
  373. req(rss(), input$mois, input$annee)
  374. rss() %>%
  375. filter(duree_rss >= 1) %>%
  376. count(annee_sortie, mois_sortie) %>%
  377. spread(annee_sortie, n) %>%
  378. bind_rows(filter(., mois_sortie <= input$mois) %>%
  379. select(-mois_sortie) %>%
  380. summarise_each(funs(sum))) %>%
  381. bind_rows(filter(., mois_sortie <= 12) %>%
  382. select(-mois_sortie) %>%
  383. summarise_each(funs(sum))) %>%
  384. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  385. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  386. select(-mois_sortie) %>%
  387. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  388. formatPercentage(c(4,5), digits = 2)
  389. })
  390. ```
  391. ```{r fig3a}
  392. renderPlotly({
  393. req(rss())
  394. rss() %>%
  395. filter(duree_rss >= 1) %>%
  396. count(annee_sortie, mois_sortie) %>%
  397. ungroup %>%
  398. mutate(annee_sortie = annee_sortie %>% factor) %>%
  399. ggplot(
  400. aes(x = mois_sortie,
  401. y = n,
  402. color = annee_sortie,
  403. shape = annee_sortie)) +
  404. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  405. geom_line() +
  406. geom_point() +
  407. labs(x = NULL,
  408. y = NULL,
  409. title = "RSS de 1 jour et +") +
  410. theme_bw() +
  411. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  412. legend.title = element_blank(),
  413. plot.title = element_text(hjust = 0)) -> p
  414. ggplotly(p, tooltip = c("x", "y", "colour"))
  415. })
  416. ```
  417. ##### Nombre de RSS de 0 jour (hors séances) transmis par mois pour les 3 dernières années
  418. ```{r tab3b}
  419. DT::renderDataTable({
  420. req(rss(), input$mois, input$annee)
  421. rss() %>%
  422. filter(duree_rss == 0, cmd != 28) %>%
  423. count(annee_sortie, mois_sortie) %>%
  424. spread(annee_sortie, n) %>%
  425. bind_rows(filter(., mois_sortie <= input$mois) %>%
  426. select(-mois_sortie) %>%
  427. summarise_each(funs(sum))
  428. ) %>%
  429. bind_rows(filter(., mois_sortie <= 12) %>%
  430. select(-mois_sortie) %>%
  431. summarise_each(funs(sum))
  432. ) %>%
  433. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  434. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  435. select(-mois_sortie) %>%
  436. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  437. formatPercentage(c(4,5), digits = 2)
  438. })
  439. ```
  440. ```{r fig3b}
  441. renderPlotly({
  442. req(rss())
  443. rss() %>%
  444. filter(duree_rss == 0, cmd != 28) %>%
  445. count(annee_sortie, mois_sortie) %>%
  446. ungroup %>%
  447. mutate(annee_sortie = annee_sortie %>% factor) %>%
  448. ggplot(
  449. aes(x = mois_sortie,
  450. y = n,
  451. color = annee_sortie,
  452. shape = annee_sortie)) +
  453. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  454. geom_line() +
  455. geom_point() +
  456. labs(x = NULL,
  457. y = NULL,
  458. title = "RSS de 0 jour, hors séances") +
  459. theme_bw() +
  460. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  461. legend.title = element_blank(),
  462. plot.title = element_text(hjust = 0)) -> p
  463. ggplotly(p, tooltip = c("x", "y", "colour"))
  464. })
  465. ```
  466. ##### Nombre de RSS de séance transmis par mois pour les 3 dernières années
  467. ```{r tab3c}
  468. DT::renderDataTable({
  469. req(rss(), input$mois, input$annee)
  470. rss() %>%
  471. filter(duree_rss == 0, cmd == 28) %>%
  472. count(annee_sortie, mois_sortie) %>%
  473. spread(annee_sortie, n) %>%
  474. bind_rows(filter(., mois_sortie <= input$mois) %>%
  475. select(-mois_sortie) %>%
  476. summarise_each(funs(sum))) %>%
  477. bind_rows(filter(., mois_sortie <= 12) %>%
  478. select(-mois_sortie) %>%
  479. summarise_each(funs(sum))) %>%
  480. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  481. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  482. select(-mois_sortie) %>%
  483. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  484. formatPercentage(c(4,5), digits = 2)
  485. })
  486. ```
  487. ```{r fig3c}
  488. renderPlotly({
  489. req(rss())
  490. rss() %>%
  491. filter(duree_rss == 0, cmd == 28) %>%
  492. count(annee_sortie, mois_sortie) %>%
  493. ungroup %>%
  494. mutate(annee_sortie = annee_sortie %>% factor) %>%
  495. ggplot(
  496. aes(x = mois_sortie,
  497. y = n,
  498. color = annee_sortie,
  499. shape = annee_sortie)) +
  500. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  501. geom_line() +
  502. geom_point() +
  503. labs(x = NULL,
  504. y = NULL,
  505. title = "RSS de séances") +
  506. theme_bw() +
  507. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  508. legend.title = element_blank(),
  509. plot.title = element_text(hjust = 0)) -> p
  510. ggplotly(p, tooltip = c("x", "y", "colour"))
  511. })
  512. ```
  513. #### Nombre de RUM transmis par pôle pour les 3 dernières années
  514. ```{r tab4}
  515. DT::renderDataTable({
  516. req(rum(), input$mois, input$annee)
  517. rum() %>%
  518. filter(mois_sortie <= input$mois) %>%
  519. filter(! is.na(pole_libelle)) %>%
  520. count(pole_libelle, annee_sortie) %>%
  521. ungroup %>%
  522. mutate(pole_libelle = pole_libelle %>% str_replace("\xc9", "É")) %>%
  523. spread(annee_sortie, n) %>%
  524. bind_rows(select(., -pole_libelle) %>%
  525. summarise_each(funs(sum(., na.rm = T))) %>%
  526. mutate(pole_libelle = "TOTAL")) %>%
  527. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  528. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  529. datatable(extensions = "Buttons", colnames = c("Pôle" = 1), rownames = F) %>%
  530. formatPercentage(c(5,6), digits = 2)
  531. })
  532. ```
  533. ```{r fig4}
  534. renderPlotly({
  535. req(rum(), input$mois, input$annee)
  536. rum() %>%
  537. filter(mois_sortie <= input$mois) %>%
  538. filter(! is.na(pole_libelle)) %>%
  539. count(pole_libelle, annee_sortie) %>%
  540. ungroup %>%
  541. mutate(pole_libelle = pole_libelle %>% str_replace("\xc9", "É")) %>%
  542. ggplot(
  543. aes(x = annee_sortie,
  544. y = n,
  545. color = pole_libelle)) +
  546. scale_x_continuous(breaks = (input$annee - 2):input$annee) +
  547. facet_wrap(~ pole_libelle, scales = "free") +
  548. geom_point() +
  549. geom_line() +
  550. labs(x = NULL,
  551. y = NULL,
  552. title = "RUM par pôle") +
  553. theme_bw() +
  554. theme(legend.position = "none",
  555. plot.title = element_text(hjust = 0))
  556. })
  557. ```
  558. ### Exhaustivité
  559. #### Exhaustivité des RSS en fonction du mois et de l'année de clôture
  560. ##### Nombre de RSS produits et transmis, et taux d'exhaustivité : historique des clôtures de l'année
  561. ```{r tab5}
  562. DT::renderDataTable({
  563. req(exhau())
  564. exhau() %>%
  565. mutate(rss_trans = rss - manq,
  566. exh = rss_trans / rss) %>%
  567. select(rss, rss_trans, exh) %>%
  568. datatable(colnames = c("Clôture", "Total RSS produits", "Nombre de RSS transmis", "Taux d'exhaustivité RSS (%)"),
  569. extensions = "Buttons",
  570. rownames = mois_label) %>%
  571. formatPercentage(3, digits = 2)
  572. })
  573. ```
  574. ##### Taux d'exhaustivité selon le mois clôturé de l'année courante
  575. ```{r fig5a}
  576. renderPlotly({
  577. req(exhau())
  578. exhau() %>%
  579. mutate(rss_trans = rss - manq,
  580. exh = 100 * rss_trans / rss) %>%
  581. ggplot(
  582. aes(x = mois,
  583. y = exh)) +
  584. geom_point() +
  585. geom_line() +
  586. labs(x = NULL,
  587. y = NULL,
  588. title = NULL) +
  589. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  590. theme_bw() +
  591. theme(axis.text.x = element_text(angle = 45, hjust = 1)) -> p
  592. ggplotly(p)
  593. })
  594. ```
  595. #### Exhaustivité mensuelle de la clôture
  596. ##### Taux d'exhaustivité des RSS pour la clôture actuelle selon le mois de sortie du RSS
  597. ```{r fig7}
  598. renderPlotly({
  599. req(exhau_pims())
  600. exhau_pims() %>%
  601. mutate(mois_sortie = month(Sortie)) %>%
  602. filter(is.na(DP)) %>%
  603. distinct(RSS, .keep_all = T) %>%
  604. count(mois_sortie) %>%
  605. full_join(exhau_pims() %>%
  606. mutate(mois_sortie = month(Sortie)) %>%
  607. distinct(RSS, .keep_all = T) %>%
  608. count(mois_sortie),
  609. by = "mois_sortie") %>%
  610. mutate(n = 100 * (n.y - n.x) / n.y) %>%
  611. complete(mois_sortie = 1:input$mois, fill = list(n = 100)) %>%
  612. ggplot(
  613. aes(x = mois_sortie,
  614. y = n)) +
  615. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  616. geom_line() +
  617. geom_point() +
  618. labs(x = NULL,
  619. y = NULL,
  620. title = NULL) +
  621. theme_bw() +
  622. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  623. legend.title = element_blank(),
  624. plot.title = element_text(hjust = 0)) -> p
  625. ggplotly(p)
  626. })
  627. ```
  628. ##### Nombre de RSS manquants pour la clôture actuelle selon le mois de sortie du RSS
  629. ```{r fig8}
  630. renderPlotly({
  631. req(exhau_pims())
  632. exhau_pims() %>%
  633. mutate(mois_sortie = month(Sortie)) %>%
  634. filter(is.na(DP)) %>%
  635. distinct(RSS, .keep_all = T) %>%
  636. count(mois_sortie) %>%
  637. complete(mois_sortie = 1:input$mois, fill = list(n = 0)) %>%
  638. ggplot(
  639. aes(x = mois_sortie,
  640. y = n)) +
  641. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  642. geom_line() +
  643. geom_point() +
  644. labs(x = NULL,
  645. y = NULL,
  646. title = NULL) +
  647. theme_bw() +
  648. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  649. legend.title = element_blank(),
  650. plot.title = element_text(hjust = 0)) -> p
  651. ggplotly(p)
  652. })
  653. ```
  654. #### Exhaustivité par pôle et par service
  655. ```{r tab9}
  656. DT::renderDataTable({
  657. req(exhau_pims())
  658. exhau_pims() %>%
  659. group_by(Pole, Service) %>%
  660. summarise(Prod = n()) %>%
  661. full_join(exhau_pims() %>%
  662. filter(is.na(DP)) %>%
  663. group_by(Pole, Service) %>%
  664. summarise(Manquants = n())) %>%
  665. full_join(exhau_pims() %>%
  666. filter(Erreur == 4) %>%
  667. group_by(Pole, Service) %>%
  668. summarise(Rumrss = n())) %>%
  669. bind_rows(exhau_pims() %>%
  670. group_by(Pole) %>%
  671. summarise(Prod = n()) %>%
  672. full_join(exhau_pims() %>%
  673. filter(is.na(DP)) %>%
  674. group_by(Pole) %>%
  675. summarise(Manquants = n())) %>%
  676. full_join(exhau_pims() %>%
  677. filter(Erreur == 4) %>%
  678. group_by(Pole) %>%
  679. summarise(Rumrss = n()))) %>%
  680. bind_rows(exhau_pims() %>%
  681. summarise(Prod = n()) %>%
  682. bind_cols(exhau_pims() %>%
  683. filter(is.na(DP)) %>%
  684. summarise(Manquants = n())) %>%
  685. bind_cols(exhau_pims() %>%
  686. filter(Erreur == 4) %>%
  687. summarise(Rumrss = n()))) %>%
  688. ungroup %>%
  689. arrange(Pole, Service) %>%
  690. select(Pole, Service, Manquants, Rumrss, Prod) %>%
  691. mutate(Service = ifelse(is.na(Service), "TOTAL", Service),
  692. Exh_rum = (Prod - Manquants) / Prod,
  693. Exh_rumrss = (Prod - Rumrss) / Prod,
  694. Exh_rum = ifelse(is.na(Exh_rum), 1, Exh_rum),
  695. Pole = Pole %>% factor,
  696. Exh_rumrss = ifelse(is.na(Exh_rumrss), 1, Exh_rumrss)) %>%
  697. datatable(colnames = c("Pôle", "Service", "RUM manquants", "RUM dans RSS manquant", "Production RUM", "Exhaustivité RUM", "Exhaustivité RUM-RSS"),
  698. extensions = "Buttons",
  699. rownames = F,
  700. filter = "top",
  701. options = list(searching = T,
  702. paging = T)) %>%
  703. formatPercentage(c(6,7), digits = 2)
  704. })
  705. ```
  706. ### Valorisation
  707. #### Nombre et valorisation des RSA transmis, traités et valorisés
  708. ```{r tab10}
  709. DT::renderDataTable({
  710. req(OvalideP(), Ovalide())
  711. OvalideP()$SVA %>%
  712. full_join(Ovalide()$SVA, by = "A") %>%
  713. mutate(D = C.y - C.x,
  714. E = (C.y - C.x) / C.x) %>%
  715. datatable(rownames = F,
  716. extensions = "Buttons",
  717. escape = F,
  718. container = htmltools::withTags(table(class = 'display',
  719. thead(tr(th(rowspan = 2, "RSA"),
  720. th(colspan = 2, previous()),
  721. th(colspan = 2, current()),
  722. th(colspan = 2, "Évolution")),
  723. tr(th("Effectif"),
  724. th("Montant BR"),
  725. th("Effectif"),
  726. th("Montant BR"),
  727. th("€"),
  728. th("%"))
  729. )
  730. ))) %>%
  731. formatCurrency(c(3,5,6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  732. formatPercentage(7, digits = 2)
  733. })
  734. ```
  735. *Données issues des tableaux OVALIDE [1.V.1.SV] A de `r renderText(periode())`*
  736. #### Valorisation des RSA non pris en charge par l'Assurance Maladie
  737. ```{r tab11}
  738. DT::renderDataTable({
  739. req(Ovalide(), OvalideP())
  740. OvalideP()$VSS %>% select(1:3) %>%
  741. full_join(Ovalide()$VSS %>% select(1:3), by = "A") %>%
  742. mutate(D = C.y - C.x,
  743. E = (C.y - C.x) / C.x) %>%
  744. datatable(rownames = F,
  745. extensions = "Buttons",
  746. container = htmltools::withTags(table(class = 'display',
  747. thead(tr(th(rowspan = 2, "Composante"),
  748. th(colspan = 2, previous()),
  749. th(colspan = 2, current()),
  750. th(colspan = 2, "Évolution")),
  751. tr(th("Effectif"),
  752. th("Montant BR"),
  753. th("Effectif"),
  754. th("Montant BR"),
  755. th("€"),
  756. th("%"))
  757. )
  758. )
  759. )) %>%
  760. formatCurrency(c(3,5,6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  761. formatPercentage(7, digits = 2)
  762. })
  763. ```
  764. *Données issues des tableaux [1.V.1.VSS] A de `r renderText(periode())`*
  765. #### Taux de remboursement des RSA pris en charge par l'Assurance Maladie
  766. ```{r tab12}
  767. DT::renderDataTable({
  768. req(Ovalide(), OvalideP())
  769. OvalideP()$TXR %>%
  770. full_join(Ovalide()$TXR, by = c("A", "B")) %>%
  771. datatable(rownames = F,
  772. extensions = "Buttons",
  773. container = htmltools::withTags(table(class = 'display',
  774. thead(tr(th(rowspan = 2, "Taux de remboursement"),
  775. th(rowspan = 2, "Type"),
  776. th(colspan = 2, previous()),
  777. th(colspan = 2, current())),
  778. tr(th("Effectif"),
  779. th("%"),
  780. th("Effectif"),
  781. th("%"))
  782. )
  783. )
  784. )) %>%
  785. formatCurrency(c(4, 6), digits = 2, currency = "", dec.mark = ",")
  786. })
  787. ```
  788. *Données issues des tableaux OVALIDE [1.V.1.TXR] C de `r renderText(periode())`*
  789. _\* Séjours de NN, radiothérape ou PO_
  790. #### Valorisation des RSA pris en charge par l'Assurance Maladie
  791. ```{r tab13}
  792. DT::renderDataTable({
  793. req(Ovalide(), OvalideP())
  794. OvalideP()$RAV[-(1:2), c(1,4,6)] %>%
  795. full_join(Ovalide()$RAV[-(1:2), c(1,4,6)], by = "A") %>%
  796. mutate(D.z = (D.y - D.x) / D.x,
  797. F.z = (F.y - F.x) / F.x) %>%
  798. .[names(.) %>% sort] %>%
  799. datatable(rownames = F,
  800. extensions = "Buttons",
  801. escape = F,
  802. container = htmltools::withTags(table(class = 'display',
  803. thead(tr(th(rowspan = 2, "Composante"),
  804. th(colspan = 2, "Montant BR¹"),
  805. th(rowspan = 2, "Evol. montant BR¹"),
  806. th(colspan = 2, "Montant remboursé AM²"),
  807. th(rowspan = 2, "Evol. montant remboursé AM²")),
  808. tr(rep(c(previous(), current()), 2) %>%
  809. lapply(th))
  810. )
  811. )
  812. )) %>%
  813. formatPercentage(c(4, 7), digits = 2) %>%
  814. formatCurrency(c(2, 3, 5, 6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  815. })
  816. ```
  817. *Données issues des tableaux OVALIDE [1.V.1.RAV] C de `r renderText(periode())`*
  818. <sup>1</sup> Montant Brut
  819. <sup>2</sup> Montant Remboursé par l'Assurance Maladie
  820. #### Valorisation des IVG, ATU, SE, actes et consultations
  821. ```{r tab14}
  822. DT::renderDataTable({
  823. req(Ovalide(), OvalideP())
  824. data_frame(A = c(OvalideP()$VATU[is.na(OvalideP()$VATU$A), 3:5] %>% unlist,
  825. OvalideP()$VSE[OvalideP()$VSE$A == "", 3:5] %>% unlist,
  826. OvalideP()$VCCAM[OvalideP()$VCCAM$A == "", 2:4] %>% unlist,
  827. OvalideP()$VNGAP[OvalideP()$VNGAP$A == "", 3:5] %>% unlist),
  828. B = c(Ovalide()$VATU[is.na(Ovalide()$VATU$A), 3:5] %>% unlist,
  829. Ovalide()$VSE[Ovalide()$VSE$A == "", 3:5] %>% unlist,
  830. Ovalide()$VCCAM[Ovalide()$VCCAM$A == "", 2:4] %>% unlist,
  831. Ovalide()$VNGAP[Ovalide()$VNGAP$A == "", 3:5] %>% unlist)) %>%
  832. mutate(C = B - A,
  833. D = (B - A) / A) %>%
  834. datatable(rownames = str_c(rep(c("Nombre de prestations",
  835. "Valorisation brute",
  836. "Valorisation AM"),4),
  837. rep(c("ATU<sup>1</sup>",
  838. "SE<sup>2</sup>",
  839. "CCAM<sup>3</sup>",
  840. "NGAP<sup>4</sup>"), each = 3), sep = " "),
  841. colnames = c(previous(), current(), "Évolution (n ou &euro;)", "Évolution"),
  842. extensions = "Buttons",
  843. escape = F) %>%
  844. formatCurrency(1:3, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  845. formatPercentage(4, digits = 2)
  846. })
  847. ```
  848. <sup>1</sup>*Données issues des tableaux OVALIDE [2.V.VATU] de `r renderText(periode())`*
  849. <sup>2</sup>*Données issues des tableaux OVALIDE [2.V.VSE] de `r renderText(periode())`*
  850. <sup>3</sup>*Données issues des tableaux OVALIDE [2.V.VCCAM] de `r renderText(periode())`*
  851. <sup>4</sup>*Données issues des tableaux OVALIDE [2.V.VNGAP] de `r renderText(periode())`*
  852. #### Nombre de Suppléments valorisés, Performance et Valorisation des séjours non envoyés
  853. ```{r tab15}
  854. DT::renderDataTable({
  855. req(Ovalide(), OvalideP())
  856. OvalideP()$UMAS %>%
  857. full_join(Ovalide()$UMAS, by = "A") %>%
  858. mutate(C = B.y - B.x,
  859. D = (B.y - B.x) / B.x) %>%
  860. datatable(rownames = F,
  861. extensions = "Buttons",
  862. colnames = c(previous(), current(), "Évolution (n)", "Évolution")) %>%
  863. formatCurrency(2:4, currency = "", interval = 3, mark = "&nbsp;", digits = 0) %>%
  864. formatPercentage(5, digits = 2)
  865. })
  866. ```
  867. *Données issues des tableaux OVALIDE [1.V.1.UMAS] E de `r renderText(periode())`*
  868. #### Prix Moyen du Cas Traité\* de l'année en cours et de l'année précédente
  869. ```{r tab16}
  870. DT::renderDataTable({
  871. req(Ovalide(), OvalideP())
  872. OvalideP()$SVB %>%
  873. mutate(B = C/B) %>%
  874. select(-C) %>%
  875. full_join(Ovalide()$SVB %>%
  876. mutate(B = C/B) %>%
  877. select(-C),
  878. by = "A") %>%
  879. mutate(C = B.y - B.x,
  880. D = (B.y - B.x) / (B.x)) %>%
  881. datatable(escape = F,
  882. extensions = "Buttons",
  883. rownames = F,
  884. colnames = c("Type de séjours", previous(), current(), "Évolution (&euro;)", "Évolution")) %>%
  885. formatPercentage(5, digits = 2) %>%
  886. formatCurrency(2:4, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  887. })
  888. ```
  889. *Données issues des tableaux OVALIDE [1.V.1.SV] B de `r renderText(periode())`*
  890. _\* Prix Moyen du Cas Traité = Total valorisation / nombre de RSA valorisés_
  891. #### Estimation de la valorisation des séjours non transmis de l'année en cours
  892. ```{r tab17}
  893. DT::renderDataTable({
  894. req(exhau_pims(), Ovalide(), OvalideP())
  895. exhau_pims() %>% filter(is.na(DP), Duree == 0) %>% distinct(RSS) %>% nrow -> zero
  896. exhau_pims() %>% filter(is.na(DP), Duree > 0) %>% distinct(RSS) %>% nrow -> plus
  897. data.frame(zero = c(zero, Ovalide()$SVB$C[3]/Ovalide()$SVB$B[3], zero * Ovalide()$SVB$C[3]/Ovalide()$SVB$B[3]),
  898. plus = c(plus, Ovalide()$SVB$C[2]/Ovalide()$SVB$B[2], plus * Ovalide()$SVB$C[2]/Ovalide()$SVB$B[2])) %>%
  899. datatable(escape = F,
  900. extensions = "Buttons",
  901. rownames = c("Nombre", "PMCT*", "Valorisation"),
  902. colnames = c("Indicateur", "0 jour", "Plus de 0 jour")) %>%
  903. formatCurrency(1:2, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  904. })
  905. ```
  906. *Données issues de la requête BO «`r renderText(current())`» et des tableaux OVALIDE [1.V.1.SV] B de `r renderText(periode())`*
  907. _\* Prix Moyen du Cas Traité = Total valorisation / nombre de RSA valorisés_
  908. #### Indice de performance de la durée moyenne de séjours (IP-DMS) de l'année en cours et de l'année précédente
  909. ```{r tab18}
  910. DT::renderDataTable({
  911. req(Ovalide(), OvalideP())
  912. if (nrow(Ovalide()$EDMS) == 6)
  913. {
  914. IP_current <- (Ovalide()$EDMS[[1, 2]] + Ovalide()$EDMS[[4, 2]]) / (Ovalide()$EDMS[[2, 2]] + Ovalide()$EDMS[[5, 2]])
  915. IP_previous <- (OvalideP()$EDMS[[1, 2]] + OvalideP()$EDMS[[4, 2]]) / (OvalideP()$EDMS[[2, 2]] + OvalideP()$EDMS[[5, 2]])
  916. } else {
  917. IP_current <- Ovalide()$EDMS[[1, 2]] / Ovalide()$EDMS[[2, 2]]
  918. IP_previous <- OvalideP()$EDMS[[1, 2]] / OvalideP()$EDMS[[2, 2]]
  919. }
  920. data_frame(IP_previous, IP_current) %>%
  921. datatable(rownames = "Indice de performance",
  922. extensions = "Buttons",
  923. colnames = c(previous(), current())) %>%
  924. formatCurrency(1:2, currency = "", digits = 3, dec.mark = ",")
  925. })
  926. ```
  927. *Données issues des tableaux OVALIDE [1.D2.EDMS] de `r renderText(periode())`*
  928. _\* Nb de journées / Nb de journées standardisées sur la DMS théorique_