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.

1070 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. output$report <- downloadHandler(filename = "bilan.html",
  224. content = function(file)
  225. {
  226. rmarkdown::render("cloture.Rmd",
  227. output_file = file,
  228. params = list(annee = input$annee,
  229. mois = input$mois,
  230. rum = rum(),
  231. rss = rss(),
  232. exhau = exhau(),
  233. exhau_pims = exhau_pims(),
  234. Ovalide = tibble::data_frame(nom = names(Ovalide()), tab = Ovalide()),
  235. OvalideP = tibble::data_frame(nom = names(OvalideP()), tab = OvalideP())))
  236. })
  237. mois_label <- c("Janvier",
  238. "Février",
  239. "Mars",
  240. "Avril",
  241. "Mai",
  242. "Juin",
  243. "Juillet",
  244. "Août",
  245. "Septembre",
  246. "Octobre",
  247. "Novembre",
  248. "Décembre")
  249. previous <- reactive({
  250. req(input$mois, input$annee)
  251. str_c("M", sprintf("%02.f", input$mois), "-", input$annee - 1)
  252. })
  253. current <- reactive({
  254. req(input$mois, input$annee)
  255. str_c("M", sprintf("%02.f", input$mois), "-", input$annee)
  256. })
  257. periode <- reactive({
  258. req(previous(), current())
  259. str_c(previous(), " et de ", current())
  260. })
  261. ```
  262. ## Rapport
  263. ### Production
  264. #### Nombre total de RUM et de RSS transmis
  265. ```{r tab1}
  266. DT::renderDataTable({
  267. req(input$annee, rum(), rss())
  268. rum() %>%
  269. filter(annee_sortie == input$annee) %>%
  270. tally %>%
  271. bind_rows(rss() %>%
  272. filter(annee_sortie == input$annee) %>%
  273. tally) %>%
  274. datatable(rownames = c("RUM", "RSS"),
  275. extensions = "Buttons",
  276. colnames = c("Type de résumé", "Nombre transmis"))
  277. })
  278. ```
  279. #### Nombre de RUM transmis par mois pour les 3 dernières années
  280. ```{r tab2a}
  281. DT::renderDataTable({
  282. req(rum(), input$mois, input$annee)
  283. rum() %>%
  284. count(annee_sortie, mois_sortie) %>%
  285. spread(annee_sortie, n) %>%
  286. bind_rows(filter(., mois_sortie <= input$mois) %>%
  287. select(-mois_sortie) %>%
  288. summarise_each(funs(sum))) %>%
  289. bind_rows(filter(., mois_sortie <= 12) %>%
  290. select(-mois_sortie) %>%
  291. summarise_each(funs(sum))) %>%
  292. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  293. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  294. select(-mois_sortie) %>%
  295. datatable(rownames = c(mois_label, "Total clôture", "Total M12"),
  296. extensions = "Buttons") %>%
  297. formatPercentage(c(4,5), digits = 2)
  298. })
  299. ```
  300. ```{r fig2a}
  301. renderPlotly({
  302. req(rum())
  303. rum() %>%
  304. count(annee_sortie, mois_sortie) %>%
  305. ungroup %>%
  306. mutate(annee_sortie = annee_sortie %>% factor) %>%
  307. ggplot(
  308. aes(x = mois_sortie,
  309. y = n,
  310. color = annee_sortie,
  311. shape = annee_sortie)) +
  312. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  313. geom_line() +
  314. geom_point() +
  315. labs(x = NULL,
  316. y = NULL,
  317. title = "RUM") +
  318. theme_bw() +
  319. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  320. legend.title = element_blank(),
  321. plot.title = element_text(hjust = 0)) -> p
  322. ggplotly(p, tooltip = c("x", "y", "colour"))
  323. })
  324. ```
  325. #### Nombre de RSS transmis par mois pour les 3 dernières années
  326. ```{r tab2b}
  327. DT::renderDataTable({
  328. req(rss(), input$mois, input$annee)
  329. rss() %>%
  330. count(annee_sortie, mois_sortie) %>%
  331. spread(annee_sortie, n) %>%
  332. bind_rows(filter(., mois_sortie <= input$mois) %>%
  333. select(-mois_sortie) %>%
  334. summarise_each(funs(sum))) %>%
  335. bind_rows(filter(., mois_sortie <= 12) %>%
  336. select(-mois_sortie) %>%
  337. summarise_each(funs(sum))) %>%
  338. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  339. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  340. select(-mois_sortie) %>%
  341. datatable(rownames = c(mois_label, "Total clôture", "Total M12"),
  342. extensions = "Buttons") %>%
  343. formatPercentage(c(4,5), digits = 2)
  344. })
  345. ```
  346. ```{r fig2b}
  347. renderPlotly({
  348. req(rss())
  349. rss() %>%
  350. count(annee_sortie, mois_sortie) %>%
  351. ungroup %>%
  352. mutate(annee_sortie = annee_sortie %>% factor) %>%
  353. ggplot(
  354. aes(x = mois_sortie,
  355. y = n,
  356. color = annee_sortie,
  357. shape = annee_sortie)) +
  358. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  359. geom_line() +
  360. geom_point() +
  361. labs(x = NULL,
  362. y = NULL,
  363. title = "RSS") +
  364. theme_bw() +
  365. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  366. legend.title = element_blank(),
  367. plot.title = element_text(hjust = 0)) -> p
  368. ggplotly(p, tooltip = c("x", "y", "colour"))
  369. })
  370. ```
  371. ##### Nombre de RSS de 1 jour et plus transmis par mois pour les 3 dernières années
  372. ```{r tab3a}
  373. DT::renderDataTable({
  374. req(rss(), input$mois, input$annee)
  375. rss() %>%
  376. filter(duree_rss >= 1) %>%
  377. count(annee_sortie, mois_sortie) %>%
  378. spread(annee_sortie, n) %>%
  379. bind_rows(filter(., mois_sortie <= input$mois) %>%
  380. select(-mois_sortie) %>%
  381. summarise_each(funs(sum))) %>%
  382. bind_rows(filter(., mois_sortie <= 12) %>%
  383. select(-mois_sortie) %>%
  384. summarise_each(funs(sum))) %>%
  385. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  386. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  387. select(-mois_sortie) %>%
  388. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  389. formatPercentage(c(4,5), digits = 2)
  390. })
  391. ```
  392. ```{r fig3a}
  393. renderPlotly({
  394. req(rss())
  395. rss() %>%
  396. filter(duree_rss >= 1) %>%
  397. count(annee_sortie, mois_sortie) %>%
  398. ungroup %>%
  399. mutate(annee_sortie = annee_sortie %>% factor) %>%
  400. ggplot(
  401. aes(x = mois_sortie,
  402. y = n,
  403. color = annee_sortie,
  404. shape = annee_sortie)) +
  405. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  406. geom_line() +
  407. geom_point() +
  408. labs(x = NULL,
  409. y = NULL,
  410. title = "RSS de 1 jour et +") +
  411. theme_bw() +
  412. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  413. legend.title = element_blank(),
  414. plot.title = element_text(hjust = 0)) -> p
  415. ggplotly(p, tooltip = c("x", "y", "colour"))
  416. })
  417. ```
  418. ##### Nombre de RSS de 0 jour (hors séances) transmis par mois pour les 3 dernières années
  419. ```{r tab3b}
  420. DT::renderDataTable({
  421. req(rss(), input$mois, input$annee)
  422. rss() %>%
  423. filter(duree_rss == 0, cmd != 28) %>%
  424. count(annee_sortie, mois_sortie) %>%
  425. spread(annee_sortie, n) %>%
  426. bind_rows(filter(., mois_sortie <= input$mois) %>%
  427. select(-mois_sortie) %>%
  428. summarise_each(funs(sum))
  429. ) %>%
  430. bind_rows(filter(., mois_sortie <= 12) %>%
  431. select(-mois_sortie) %>%
  432. summarise_each(funs(sum))
  433. ) %>%
  434. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  435. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  436. select(-mois_sortie) %>%
  437. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  438. formatPercentage(c(4,5), digits = 2)
  439. })
  440. ```
  441. ```{r fig3b}
  442. renderPlotly({
  443. req(rss())
  444. rss() %>%
  445. filter(duree_rss == 0, cmd != 28) %>%
  446. count(annee_sortie, mois_sortie) %>%
  447. ungroup %>%
  448. mutate(annee_sortie = annee_sortie %>% factor) %>%
  449. ggplot(
  450. aes(x = mois_sortie,
  451. y = n,
  452. color = annee_sortie,
  453. shape = annee_sortie)) +
  454. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  455. geom_line() +
  456. geom_point() +
  457. labs(x = NULL,
  458. y = NULL,
  459. title = "RSS de 0 jour, hors séances") +
  460. theme_bw() +
  461. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  462. legend.title = element_blank(),
  463. plot.title = element_text(hjust = 0)) -> p
  464. ggplotly(p, tooltip = c("x", "y", "colour"))
  465. })
  466. ```
  467. ##### Nombre de RSS de séance transmis par mois pour les 3 dernières années
  468. ```{r tab3c}
  469. DT::renderDataTable({
  470. req(rss(), input$mois, input$annee)
  471. rss() %>%
  472. filter(duree_rss == 0, cmd == 28) %>%
  473. count(annee_sortie, mois_sortie) %>%
  474. spread(annee_sortie, n) %>%
  475. bind_rows(filter(., mois_sortie <= input$mois) %>%
  476. select(-mois_sortie) %>%
  477. summarise_each(funs(sum))) %>%
  478. bind_rows(filter(., mois_sortie <= 12) %>%
  479. select(-mois_sortie) %>%
  480. summarise_each(funs(sum))) %>%
  481. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  482. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  483. select(-mois_sortie) %>%
  484. datatable(extensions = "Buttons", rownames = c(mois_label, "Total clôture", "Total M12")) %>%
  485. formatPercentage(c(4,5), digits = 2)
  486. })
  487. ```
  488. ```{r fig3c}
  489. renderPlotly({
  490. req(rss())
  491. rss() %>%
  492. filter(duree_rss == 0, cmd == 28) %>%
  493. count(annee_sortie, mois_sortie) %>%
  494. ungroup %>%
  495. mutate(annee_sortie = annee_sortie %>% factor) %>%
  496. ggplot(
  497. aes(x = mois_sortie,
  498. y = n,
  499. color = annee_sortie,
  500. shape = annee_sortie)) +
  501. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  502. geom_line() +
  503. geom_point() +
  504. labs(x = NULL,
  505. y = NULL,
  506. title = "RSS de séances") +
  507. theme_bw() +
  508. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  509. legend.title = element_blank(),
  510. plot.title = element_text(hjust = 0)) -> p
  511. ggplotly(p, tooltip = c("x", "y", "colour"))
  512. })
  513. ```
  514. #### Nombre de RUM transmis par pôle pour les 3 dernières années
  515. ```{r tab4}
  516. DT::renderDataTable({
  517. req(rum(), input$mois, input$annee)
  518. rum() %>%
  519. filter(mois_sortie <= input$mois) %>%
  520. filter(! is.na(pole_libelle)) %>%
  521. count(pole_libelle, annee_sortie) %>%
  522. ungroup %>%
  523. mutate(pole_libelle = pole_libelle %>% str_replace("\xc9", "É")) %>%
  524. spread(annee_sortie, n) %>%
  525. bind_rows(select(., -pole_libelle) %>%
  526. summarise_each(funs(sum(., na.rm = T))) %>%
  527. mutate(pole_libelle = "TOTAL")) %>%
  528. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 2,"`)/`", input$annee - 2,"`"), str_c(input$annee, "-", input$annee - 2))) %>%
  529. mutate_(.dots = setNames(str_c("(`",input$annee,"`-`", input$annee - 1,"`)/`", input$annee - 1,"`"), str_c(input$annee, "-", input$annee - 1))) %>%
  530. datatable(extensions = "Buttons", colnames = c("Pôle" = 1), rownames = F) %>%
  531. formatPercentage(c(5,6), digits = 2)
  532. })
  533. ```
  534. ```{r fig4}
  535. renderPlotly({
  536. req(rum(), input$mois, input$annee)
  537. rum() %>%
  538. filter(mois_sortie <= input$mois) %>%
  539. filter(! is.na(pole_libelle)) %>%
  540. count(pole_libelle, annee_sortie) %>%
  541. ungroup %>%
  542. mutate(pole_libelle = pole_libelle %>% str_replace("\xc9", "É")) %>%
  543. ggplot(
  544. aes(x = annee_sortie,
  545. y = n,
  546. color = pole_libelle)) +
  547. scale_x_continuous(breaks = (input$annee - 2):input$annee) +
  548. facet_wrap(~ pole_libelle, scales = "free") +
  549. geom_point() +
  550. geom_line() +
  551. labs(x = NULL,
  552. y = NULL,
  553. title = "RUM par pôle") +
  554. theme_bw() +
  555. theme(legend.position = "none",
  556. plot.title = element_text(hjust = 0))
  557. })
  558. ```
  559. ### Exhaustivité
  560. #### Exhaustivité des RSS en fonction du mois et de l'année de clôture
  561. ##### Nombre de RSS produits et transmis, et taux d'exhaustivité : historique des clôtures de l'année
  562. ```{r tab5}
  563. DT::renderDataTable({
  564. req(exhau())
  565. exhau() %>%
  566. mutate(rss_trans = rss - manq,
  567. exh = rss_trans / rss) %>%
  568. select(rss, rss_trans, exh) %>%
  569. datatable(colnames = c("Clôture", "Total RSS produits", "Nombre de RSS transmis", "Taux d'exhaustivité RSS (%)"),
  570. extensions = "Buttons",
  571. rownames = mois_label) %>%
  572. formatPercentage(3, digits = 2)
  573. })
  574. ```
  575. ##### Taux d'exhaustivité selon le mois clôturé de l'année courante
  576. ```{r fig5a}
  577. renderPlotly({
  578. req(exhau())
  579. exhau() %>%
  580. mutate(rss_trans = rss - manq,
  581. exh = 100 * rss_trans / rss) %>%
  582. ggplot(
  583. aes(x = mois,
  584. y = exh)) +
  585. geom_point() +
  586. geom_line() +
  587. labs(x = NULL,
  588. y = NULL,
  589. title = NULL) +
  590. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  591. theme_bw() +
  592. theme(axis.text.x = element_text(angle = 45, hjust = 1)) -> p
  593. ggplotly(p)
  594. })
  595. ```
  596. #### Exhaustivité mensuelle de la clôture
  597. ##### Taux d'exhaustivité des RSS pour la clôture actuelle selon le mois de sortie du RSS
  598. ```{r fig7}
  599. renderPlotly({
  600. req(exhau_pims())
  601. exhau_pims() %>%
  602. mutate(mois_sortie = month(Sortie)) %>%
  603. filter(is.na(DP)) %>%
  604. distinct(RSS, .keep_all = T) %>%
  605. count(mois_sortie) %>%
  606. full_join(exhau_pims() %>%
  607. mutate(mois_sortie = month(Sortie)) %>%
  608. distinct(RSS, .keep_all = T) %>%
  609. count(mois_sortie),
  610. by = "mois_sortie") %>%
  611. mutate(n = 100 * (n.y - n.x) / n.y) %>%
  612. complete(mois_sortie = 1:input$mois, fill = list(n = 100)) %>%
  613. ggplot(
  614. aes(x = mois_sortie,
  615. y = n)) +
  616. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  617. geom_line() +
  618. geom_point() +
  619. labs(x = NULL,
  620. y = NULL,
  621. title = NULL) +
  622. theme_bw() +
  623. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  624. legend.title = element_blank(),
  625. plot.title = element_text(hjust = 0)) -> p
  626. ggplotly(p)
  627. })
  628. ```
  629. ##### Nombre de RSS manquants pour la clôture actuelle selon le mois de sortie du RSS
  630. ```{r fig8}
  631. renderPlotly({
  632. req(exhau_pims())
  633. exhau_pims() %>%
  634. mutate(mois_sortie = month(Sortie)) %>%
  635. filter(is.na(DP)) %>%
  636. distinct(RSS, .keep_all = T) %>%
  637. count(mois_sortie) %>%
  638. complete(mois_sortie = 1:input$mois, fill = list(n = 0)) %>%
  639. ggplot(
  640. aes(x = mois_sortie,
  641. y = n)) +
  642. scale_x_discrete(limits = mois_label, expand = c(.05, 0)) +
  643. geom_line() +
  644. geom_point() +
  645. labs(x = NULL,
  646. y = NULL,
  647. title = NULL) +
  648. theme_bw() +
  649. theme(axis.text.x = element_text(angle = 45, hjust = 1),
  650. legend.title = element_blank(),
  651. plot.title = element_text(hjust = 0)) -> p
  652. ggplotly(p)
  653. })
  654. ```
  655. #### Exhaustivité par pôle et par service
  656. ```{r tab9}
  657. DT::renderDataTable({
  658. req(exhau_pims())
  659. exhau_pims() %>%
  660. group_by(Pole, Service) %>%
  661. summarise(Prod = n()) %>%
  662. full_join(exhau_pims() %>%
  663. filter(is.na(DP)) %>%
  664. group_by(Pole, Service) %>%
  665. summarise(Manquants = n())) %>%
  666. full_join(exhau_pims() %>%
  667. filter(Erreur == 4) %>%
  668. group_by(Pole, Service) %>%
  669. summarise(Rumrss = n())) %>%
  670. bind_rows(exhau_pims() %>%
  671. group_by(Pole) %>%
  672. summarise(Prod = n()) %>%
  673. full_join(exhau_pims() %>%
  674. filter(is.na(DP)) %>%
  675. group_by(Pole) %>%
  676. summarise(Manquants = n())) %>%
  677. full_join(exhau_pims() %>%
  678. filter(Erreur == 4) %>%
  679. group_by(Pole) %>%
  680. summarise(Rumrss = n()))) %>%
  681. bind_rows(exhau_pims() %>%
  682. summarise(Prod = n()) %>%
  683. bind_cols(exhau_pims() %>%
  684. filter(is.na(DP)) %>%
  685. summarise(Manquants = n())) %>%
  686. bind_cols(exhau_pims() %>%
  687. filter(Erreur == 4) %>%
  688. summarise(Rumrss = n()))) %>%
  689. ungroup %>%
  690. arrange(Pole, Service) %>%
  691. select(Pole, Service, Manquants, Rumrss, Prod) %>%
  692. mutate(Service = ifelse(is.na(Service), "TOTAL", Service),
  693. Exh_rum = (Prod - Manquants) / Prod,
  694. Exh_rumrss = (Prod - Rumrss) / Prod,
  695. Exh_rum = ifelse(is.na(Exh_rum), 1, Exh_rum),
  696. Pole = Pole %>% factor,
  697. Exh_rumrss = ifelse(is.na(Exh_rumrss), 1, Exh_rumrss)) %>%
  698. datatable(colnames = c("Pôle", "Service", "RUM manquants", "RUM dans RSS manquant", "Production RUM", "Exhaustivité RUM", "Exhaustivité RUM-RSS"),
  699. extensions = "Buttons",
  700. rownames = F,
  701. filter = "top",
  702. options = list(searching = T,
  703. paging = T)) %>%
  704. formatPercentage(c(6,7), digits = 2)
  705. })
  706. ```
  707. ### Valorisation
  708. #### Nombre et valorisation des RSA transmis, traités et valorisés
  709. ```{r tab10}
  710. DT::renderDataTable({
  711. req(OvalideP(), Ovalide())
  712. OvalideP()$SVA %>%
  713. full_join(Ovalide()$SVA, by = "A") %>%
  714. mutate(D = C.y - C.x,
  715. E = (C.y - C.x) / C.x) %>%
  716. datatable(rownames = F,
  717. extensions = "Buttons",
  718. escape = F,
  719. container = htmltools::withTags(table(class = 'display',
  720. thead(tr(th(rowspan = 2, "RSA"),
  721. th(colspan = 2, previous()),
  722. th(colspan = 2, current()),
  723. th(colspan = 2, "Évolution")),
  724. tr(th("Effectif"),
  725. th("Montant BR"),
  726. th("Effectif"),
  727. th("Montant BR"),
  728. th("€"),
  729. th("%"))
  730. )
  731. ))) %>%
  732. formatCurrency(c(3,5,6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  733. formatPercentage(7, digits = 2)
  734. })
  735. ```
  736. *Données issues des tableaux OVALIDE [1.V.1.SV] A de `r renderText(periode())`*
  737. #### Valorisation des RSA non pris en charge par l'Assurance Maladie
  738. ```{r tab11}
  739. DT::renderDataTable({
  740. req(Ovalide(), OvalideP())
  741. OvalideP()$VSS %>% select(1:3) %>%
  742. full_join(Ovalide()$VSS %>% select(1:3), by = "A") %>%
  743. mutate(D = C.y - C.x,
  744. E = (C.y - C.x) / C.x) %>%
  745. datatable(rownames = F,
  746. extensions = "Buttons",
  747. container = htmltools::withTags(table(class = 'display',
  748. thead(tr(th(rowspan = 2, "Composante"),
  749. th(colspan = 2, previous()),
  750. th(colspan = 2, current()),
  751. th(colspan = 2, "Évolution")),
  752. tr(th("Effectif"),
  753. th("Montant BR"),
  754. th("Effectif"),
  755. th("Montant BR"),
  756. th("€"),
  757. th("%"))
  758. )
  759. )
  760. )) %>%
  761. formatCurrency(c(3,5,6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  762. formatPercentage(7, digits = 2)
  763. })
  764. ```
  765. *Données issues des tableaux [1.V.1.VSS] A de `r renderText(periode())`*
  766. #### Taux de remboursement des RSA pris en charge par l'Assurance Maladie
  767. ```{r tab12}
  768. DT::renderDataTable({
  769. req(Ovalide(), OvalideP())
  770. OvalideP()$TXR %>%
  771. full_join(Ovalide()$TXR, by = c("A", "B")) %>%
  772. datatable(rownames = F,
  773. extensions = "Buttons",
  774. container = htmltools::withTags(table(class = 'display',
  775. thead(tr(th(rowspan = 2, "Taux de remboursement"),
  776. th(rowspan = 2, "Type"),
  777. th(colspan = 2, previous()),
  778. th(colspan = 2, current())),
  779. tr(th("Effectif"),
  780. th("%"),
  781. th("Effectif"),
  782. th("%"))
  783. )
  784. )
  785. )) %>%
  786. formatCurrency(c(4, 6), digits = 2, currency = "", dec.mark = ",")
  787. })
  788. ```
  789. *Données issues des tableaux OVALIDE [1.V.1.TXR] C de `r renderText(periode())`*
  790. _\* Séjours de NN, radiothérape ou PO_
  791. #### Valorisation des RSA pris en charge par l'Assurance Maladie
  792. ```{r tab13}
  793. DT::renderDataTable({
  794. req(Ovalide(), OvalideP())
  795. OvalideP()$RAV[-(1:2), c(1,4,6)] %>%
  796. full_join(Ovalide()$RAV[-(1:2), c(1,4,6)], by = "A") %>%
  797. mutate(D.z = (D.y - D.x) / D.x,
  798. F.z = (F.y - F.x) / F.x) %>%
  799. .[names(.) %>% sort] %>%
  800. datatable(rownames = F,
  801. extensions = "Buttons",
  802. escape = F,
  803. container = htmltools::withTags(table(class = 'display',
  804. thead(tr(th(rowspan = 2, "Composante"),
  805. th(colspan = 2, "Montant BR¹"),
  806. th(rowspan = 2, "Evol. montant BR¹"),
  807. th(colspan = 2, "Montant remboursé AM²"),
  808. th(rowspan = 2, "Evol. montant remboursé AM²")),
  809. tr(rep(c(previous(), current()), 2) %>%
  810. lapply(th))
  811. )
  812. )
  813. )) %>%
  814. formatPercentage(c(4, 7), digits = 2) %>%
  815. formatCurrency(c(2, 3, 5, 6), currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  816. })
  817. ```
  818. *Données issues des tableaux OVALIDE [1.V.1.RAV] C de `r renderText(periode())`*
  819. <sup>1</sup> Montant Brut
  820. <sup>2</sup> Montant Remboursé par l'Assurance Maladie
  821. #### Valorisation des IVG, ATU, SE, actes et consultations
  822. ```{r tab14}
  823. DT::renderDataTable({
  824. req(Ovalide(), OvalideP())
  825. data_frame(A = c(OvalideP()$VATU[is.na(OvalideP()$VATU$A), 3:5] %>% unlist,
  826. OvalideP()$VSE[OvalideP()$VSE$A == "", 3:5] %>% unlist,
  827. OvalideP()$VCCAM[OvalideP()$VCCAM$A == "", 2:4] %>% unlist,
  828. OvalideP()$VNGAP[OvalideP()$VNGAP$A == "", 3:5] %>% unlist),
  829. B = c(Ovalide()$VATU[is.na(Ovalide()$VATU$A), 3:5] %>% unlist,
  830. Ovalide()$VSE[Ovalide()$VSE$A == "", 3:5] %>% unlist,
  831. Ovalide()$VCCAM[Ovalide()$VCCAM$A == "", 2:4] %>% unlist,
  832. Ovalide()$VNGAP[Ovalide()$VNGAP$A == "", 3:5] %>% unlist)) %>%
  833. mutate(C = B - A,
  834. D = (B - A) / A) %>%
  835. datatable(rownames = str_c(rep(c("Nombre de prestations",
  836. "Valorisation brute",
  837. "Valorisation AM"),4),
  838. rep(c("ATU<sup>1</sup>",
  839. "SE<sup>2</sup>",
  840. "CCAM<sup>3</sup>",
  841. "NGAP<sup>4</sup>"), each = 3), sep = " "),
  842. colnames = c(previous(), current(), "Évolution (n ou &euro;)", "Évolution"),
  843. extensions = "Buttons",
  844. escape = F) %>%
  845. formatCurrency(1:3, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",") %>%
  846. formatPercentage(4, digits = 2)
  847. })
  848. ```
  849. <sup>1</sup>*Données issues des tableaux OVALIDE [2.V.VATU] de `r renderText(periode())`*
  850. <sup>2</sup>*Données issues des tableaux OVALIDE [2.V.VSE] de `r renderText(periode())`*
  851. <sup>3</sup>*Données issues des tableaux OVALIDE [2.V.VCCAM] de `r renderText(periode())`*
  852. <sup>4</sup>*Données issues des tableaux OVALIDE [2.V.VNGAP] de `r renderText(periode())`*
  853. #### Nombre de Suppléments valorisés, Performance et Valorisation des séjours non envoyés
  854. ```{r tab15}
  855. DT::renderDataTable({
  856. req(Ovalide(), OvalideP())
  857. OvalideP()$UMAS %>%
  858. full_join(Ovalide()$UMAS, by = "A") %>%
  859. mutate(C = B.y - B.x,
  860. D = (B.y - B.x) / B.x) %>%
  861. datatable(rownames = F,
  862. extensions = "Buttons",
  863. colnames = c(previous(), current(), "Évolution (n)", "Évolution")) %>%
  864. formatCurrency(2:4, currency = "", interval = 3, mark = "&nbsp;", digits = 0) %>%
  865. formatPercentage(5, digits = 2)
  866. })
  867. ```
  868. *Données issues des tableaux OVALIDE [1.V.1.UMAS] E de `r renderText(periode())`*
  869. #### Prix Moyen du Cas Traité\* de l'année en cours et de l'année précédente
  870. ```{r tab16}
  871. DT::renderDataTable({
  872. req(Ovalide(), OvalideP())
  873. OvalideP()$SVB %>%
  874. mutate(B = C/B) %>%
  875. select(-C) %>%
  876. full_join(Ovalide()$SVB %>%
  877. mutate(B = C/B) %>%
  878. select(-C),
  879. by = "A") %>%
  880. mutate(C = B.y - B.x,
  881. D = (B.y - B.x) / (B.x)) %>%
  882. datatable(escape = F,
  883. extensions = "Buttons",
  884. rownames = F,
  885. colnames = c("Type de séjours", previous(), current(), "Évolution (&euro;)", "Évolution")) %>%
  886. formatPercentage(5, digits = 2) %>%
  887. formatCurrency(2:4, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  888. })
  889. ```
  890. *Données issues des tableaux OVALIDE [1.V.1.SV] B de `r renderText(periode())`*
  891. _\* Prix Moyen du Cas Traité = Total valorisation / nombre de RSA valorisés_
  892. #### Estimation de la valorisation des séjours non transmis de l'année en cours
  893. ```{r tab17}
  894. DT::renderDataTable({
  895. req(exhau_pims(), Ovalide(), OvalideP())
  896. exhau_pims() %>% filter(is.na(DP), Duree == 0) %>% distinct(RSS) %>% nrow -> zero
  897. exhau_pims() %>% filter(is.na(DP), Duree > 0) %>% distinct(RSS) %>% nrow -> plus
  898. data.frame(zero = c(zero, Ovalide()$SVB$C[3]/Ovalide()$SVB$B[3], zero * Ovalide()$SVB$C[3]/Ovalide()$SVB$B[3]),
  899. plus = c(plus, Ovalide()$SVB$C[2]/Ovalide()$SVB$B[2], plus * Ovalide()$SVB$C[2]/Ovalide()$SVB$B[2])) %>%
  900. datatable(escape = F,
  901. extensions = "Buttons",
  902. rownames = c("Nombre", "PMCT*", "Valorisation"),
  903. colnames = c("Indicateur", "0 jour", "Plus de 0 jour")) %>%
  904. formatCurrency(1:2, currency = "", interval = 3, mark = "&nbsp;", digits = 2, dec.mark = ",")
  905. })
  906. ```
  907. *Données issues de la requête BO «`r renderText(current())`» et des tableaux OVALIDE [1.V.1.SV] B de `r renderText(periode())`*
  908. _\* Prix Moyen du Cas Traité = Total valorisation / nombre de RSA valorisés_
  909. #### 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
  910. ```{r tab18}
  911. DT::renderDataTable({
  912. req(Ovalide(), OvalideP())
  913. if (nrow(Ovalide()$EDMS) == 6)
  914. {
  915. IP_current <- (Ovalide()$EDMS[[1, 2]] + Ovalide()$EDMS[[4, 2]]) / (Ovalide()$EDMS[[2, 2]] + Ovalide()$EDMS[[5, 2]])
  916. IP_previous <- (OvalideP()$EDMS[[1, 2]] + OvalideP()$EDMS[[4, 2]]) / (OvalideP()$EDMS[[2, 2]] + OvalideP()$EDMS[[5, 2]])
  917. } else {
  918. IP_current <- Ovalide()$EDMS[[1, 2]] / Ovalide()$EDMS[[2, 2]]
  919. IP_previous <- OvalideP()$EDMS[[1, 2]] / OvalideP()$EDMS[[2, 2]]
  920. }
  921. data_frame(IP_previous, IP_current) %>%
  922. datatable(rownames = "Indice de performance",
  923. extensions = "Buttons",
  924. colnames = c(previous(), current())) %>%
  925. formatCurrency(1:2, currency = "", digits = 3, dec.mark = ",")
  926. })
  927. ```
  928. *Données issues des tableaux OVALIDE [1.D2.EDMS] de `r renderText(periode())`*
  929. _\* Nb de journées / Nb de journées standardisées sur la DMS théorique_