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.

1079 lines
39KB

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