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.

1055 lines
38KB

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