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.

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