# Funzioni per la gestione dei PSC (nuova versione post 20241031 fine migrazione)
# DEV:
# per distinguere le funzioni da versioni ante migrazioni ora hanno suffisso "_psc_migrati"
#' Carica dati di base per PSC
#'
#' Carica dati di base per PSC
#'
#' @param bimestre Bimestre di riferimento
#' @param versione_psc Versione di riferimento dei dati (sono possibili più versioni per lo stesso bimestre)
#' @return Dataframe
load_progetti_psc_migrati <- function(bimestre, versione_psc) {
progetti_psc <- read_csv2(file.path(DRIVE, "DATI", "PSC", "psc", paste0("dati_psc_", bimestre, "_", versione_psc, ".csv")))
return(progetti_psc)
}
#' Dati FSC per elaborazioni PSC
#'
#' Crea il file con operazioni FSC compatibile con PSC
#'
#' @param bimestre Bimestre di riferimento, nella versione specifica per i dati PSC (es. 20211231.01 oppure 20211231), che viene ricondotto automaticamente al bimestre OC
#' @param versione_psc Versione di riferimento dei dati (sono possibili più versioni per lo stesso bimestre)
#' @param operazioni Dataset progetti da load_operazioni(visualizzati = FALSE)
#' @param progetti Dataset progetti da load_progetti(visualizzati = FALSE, light = FALSE)
#' @param chk_today Parametro da passare a get_stato_attuazione(), con formato "2021-02-28"
#' @param export Vuoi esportare i dati nel repository PSC in DATI?
#' @return File "dati_psc_BIMESTRE_VERSIONE.csv" in OUTPUT
#' @note ...
prep_dati_psc_migrati_bimestre <- function(bimestre, versione_psc, operazioni, progetti, chk_today, export=TRUE) {
# DEBUG:
# chk_today = "2023-08-31"
PSC <- file.path(DRIVE, "DATI", "PSC")
bimestre_oc <- str_sub(bimestre, 1, 8) #
DATA <- file.path(dirname(DATA), bimestre_oc)
# ------------------ load dati ------------------ #
if (is.null(progetti)) {
progetti <- load_progetti(bimestre, visualizzati = FALSE, light = FALSE)
}
if (is.null(operazioni)) {
operazioni <- load_operazioni(bimestre, visualizzati = FALSE)
}
# ------------------ elab ------------------ #
# Filtra PSC e unisce info
appo0 <- operazioni %>%
inner_join(octk::info_psc, by = "OC_CODICE_PROGRAMMA")
# TODO: qui probabilmente ancora qualcosa va ripescato
# chk temi multipli
chk <- appo0 %>%
select(COD_LOCALE_PROGETTO,
ID_PSC,
x_COD_LIVELLO_1,
x_COD_LIVELLO_2,
COE) %>%
filter(grepl(":::", x_COD_LIVELLO_1) | grepl(":::", x_COD_LIVELLO_2)) %>%
arrange(ID_PSC)
write.xlsx(chk, file.path(TEMP, "chk_temi_multipli.xlsx"))
# clean temi
appo1 <- appo0 %>%
# DEBUG:
# select(COD_LOCALE_PROGETTO,
# ID_PSC,
# x_COD_LIVELLO_1,
# x_COD_LIVELLO_2,
# COE) %>%
# fix per anomalie con 2 temi per 1 settore
mutate(x_COD_LIVELLO_1 = case_when(nchar(x_COD_LIVELLO_2) == 2 & nchar(x_COD_LIVELLO_1) > 2 ~ str_sub(x_COD_LIVELLO_1, 1, 2),
TRUE ~ x_COD_LIVELLO_1)) %>%
# DEV: qui andrebbero separate le righe
# codifica temi con fix per temi e settori multipli
mutate(COD_AREA_TEMATICA = case_when(nchar(x_COD_LIVELLO_1) > 2 & ID_PSC == "PSC_MIC" ~ "06",
nchar(x_COD_LIVELLO_1) > 2 & COD_LOCALE_PROGETTO == "9CA23034CP000000001" ~ "07",
nchar(x_COD_LIVELLO_1) > 2 & COD_LOCALE_PROGETTO == "1MISE24" ~ "06",
nchar(x_COD_LIVELLO_1) > 2 ~ NA_character_,
TRUE ~ x_COD_LIVELLO_1),
COD_SETTORE_INTERVENTO = case_when(nchar(x_COD_LIVELLO_2) > 2 & ID_PSC == "PSC_MIC" ~ "01",
nchar(x_COD_LIVELLO_2) > 2 & COD_LOCALE_PROGETTO == "9CA23034CP000000001" ~ "05",
nchar(x_COD_LIVELLO_2) > 2 & COD_LOCALE_PROGETTO == "1MISE24" ~ "01",
nchar(x_COD_LIVELLO_2) > 2 ~ NA_character_,
TRUE ~ x_COD_LIVELLO_2)) %>%
left_join(octk::info_psc_matrix_temi %>%
select(COD_AREA_TEMATICA, COD_SETTORE_INTERVENTO, AREA_TEMATICA, SETTORE_INTERVENTO),
by = c("COD_AREA_TEMATICA", "COD_SETTORE_INTERVENTO"))
appo1 %>% filter(is.na(COD_AREA_TEMATICA))
appo1 %>% filter(is.na(COD_SETTORE_INTERVENTO))
appo1 %>% count(AREA_TEMATICA)
# chk sezione
chk <- appo1 %>%
select(COD_LOCALE_PROGETTO,
ID_PSC,
x_COD_LIVELLO_0,
COE) %>%
count(ID_PSC, x_COD_LIVELLO_0) %>%
filter(!x_COD_LIVELLO_0 %in% c("SO", "SS_1", "SS_2")) %>%
arrange(ID_PSC)
write.xlsx(chk, file.path(TEMP, "chk_sezioni.xlsx"))
# clean sezione
appo2 <- appo1 %>%
mutate(SEZIONE = case_when(x_COD_LIVELLO_0 == "SO" ~ "ORD",
# x_COD_LIVELLO_0 == "SO:::" ~ "ORD",
# x_COD_LIVELLO_0 == "SO:::SOCIS_RC" ~ "ORD",
x_COD_LIVELLO_0 == "SOCIS" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_CO" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_NA" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_PAL" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_RC" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_SA" ~ "CIS",
x_COD_LIVELLO_0 == "SOCIS_VENT" ~ "CIS",
x_COD_LIVELLO_0 == "SOCISTA" ~ "CIS",
x_COD_LIVELLO_0 == "SS_1" ~ "SS_1",
x_COD_LIVELLO_0 == "SS_2" ~ "SS_2",
x_COD_LIVELLO_0 == "SS_2:" ~ "SS_2",
is.na(x_COD_LIVELLO_0) ~ "CHK",
x_COD_LIVELLO_0 == "" ~ "CHK",
TRUE ~ "CHK"))
appo2 %>%
count(ID_PSC, SEZIONE) %>%
filter(!SEZIONE %in% c("SO", "SS_1", "SS_2"))
# dati finanziari da progetti
appo3 <- appo2 %>%
left_join(progetti %>%
select(COD_LOCALE_PROGETTO, COSTO_REALIZZATO,
FINANZ_STATO_FSC, OC_FINANZ_STATO_FSC_NETTO,
FINANZ_TOTALE_PUBBLICO, FINANZ_PRIVATO, FINANZ_DA_REPERIRE, ECONOMIE_TOTALI,
OC_FINANZ_TOT_PUB_NETTO, DB),
by = "COD_LOCALE_PROGETTO") %>%
mutate_if(is.numeric, replace_na, replace = 0) %>%
mutate(FINANZ_TOT = FINANZ_TOTALE_PUBBLICO + FINANZ_PRIVATO + FINANZ_DA_REPERIRE - ECONOMIE_TOTALI,
x = COE/FINANZ_TOT,
COE_CR = COSTO_REALIZZATO * x,
COE_ECO = FINANZ_STATO_FSC - OC_FINANZ_STATO_FSC_NETTO,
CP = OC_FINANZ_TOT_PUB_NETTO,
CPP = FINANZ_TOTALE_PUBBLICO + FINANZ_PRIVATO)
# stato procedurale
appo_stato <- progetti %>% # OLD: progetti_pub %>%
semi_join(appo3, by = "COD_LOCALE_PROGETTO") %>%
get_stato_attuazione(., chk_today = chk_today) %>%
select(COD_LOCALE_PROGETTO, OC_STATO_PROCEDURALE = STATO_PROCED)
# message("Se ci sono 12 waring su clean_data va bene perché è il numero delle variabili e il warning indica date NA in input")
appo4 <- appo3 %>%
rename(OC_STATO_PROCEDURALE_OLD = OC_STATO_PROCEDURALE) %>%
left_join(appo_stato, by = "COD_LOCALE_PROGETTO")
# DEV: parti da verificare e reintegrare se serve
# # fix CIS Taranto in PRA Puglia
# appo3 <- fix_ciclo_cis_taranto_pra_puglia(progetti_psc = appo2)
#
# # fix visualizzati PRA Campania
# appo4 <- fix_visualizzati_pra_campania(progetti_psc = appo3)
#
# # fix assegnazioni di legge PRA Campania
# appo4bis <- fix_assegnazioni_legge_pra_campania(progetti_psc = appo4, progetti = progetti)
#
# # fix visualizzati APQ MARI Marche
# appo5 <- fix_visualizzati_apq_mari_marche(progetti_psc = appo4bis)
#
# # fix macroarea
# appo8 <- fix_macroarea_progetti_psc(progetti_psc = appo7)
# clean per export
out <- appo4 %>%
select(COD_LOCALE_PROGETTO,
CUP,
OC_TITOLO_PROGETTO,
x_CICLO,
x_PROGRAMMA,
OC_CODICE_PROGRAMMA,
x_MACROAREA,
SEZIONE,
AREA_TEMATICA,
SETTORE_INTERVENTO,
OC_STATO_PROCEDURALE,
COE,
COE_IMP,
COE_CR,
COE_PAG,
COE_ECO,
CP,
CPP,
ID_PSC,
OC_FLAG_VISUALIZZAZIONE,
DB)
# export
write.csv2(out, file.path(OUTPUT, paste0("dati_psc_", bimestre, "_", versione_psc, ".csv")), row.names = FALSE)
if (export == TRUE) {
write.csv2(out, file.path(PSC, "psc", paste0("dati_psc_", bimestre, "_", versione_psc, ".csv")), row.names = FALSE)
}
}
#' Verifica variazioni dati FSC per elaborazioni PSC
#'
#' Verifica variazioni dati FSC per elaborazioni PSC rispetto a un bimestre e versione precedente
#'
#' @param bimestre Bimestre di riferimento
#' @param versione_psc Versione di riferimento dei dati (sono possibili più versioni per lo stesso bimestre)
#' @param bimestre_old Bimestre di confronto
#' @param versione_psc_old Versione di confronto dei dati (sono possibili più versioni per lo stesso bimestre)
#' @return File "dati_psc_BIMESTRE_VERSIONE.csv" in OUTPUT
#' @note ...
chk_delta_psc_migrati_bimestre <- function(bimestre, versione_psc, bimestre_old, versione_psc_old) {
# loads
progetti_psc <- load_progetti_psc_migrati(bimestre, versione = versione_psc)
progetti_psc_old <- load_progetti_psc_migrati(bimestre_old, versione = versione_psc_old)
# elab psc
chk <- progetti_psc %>%
group_by(ID_PSC) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)) %>%
full_join(progetti_psc_old %>%
group_by(ID_PSC) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)),
by = "ID_PSC", suffix = c(".new", ".old")) %>%
mutate(DELTA_N = N.new - N.old,
DELTA_COE = COE.new - COE.old)
file_name <- paste0("chk_delta_psc_", bimestre, "-", versione_psc, "_", bimestre_old, "-", versione_psc_old,".xlsx")
write.xlsx(chk, file.path(TEMP, file_name))
# elab psc e ciclo
CHK_CICLO <- progetti_psc %>%
group_by(ID_PSC, x_CICLO) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)) %>%
full_join(progetti_psc_old %>%
group_by(ID_PSC, x_CICLO) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)),
by = c("ID_PSC", "x_CICLO"), suffix = c(".new", ".old")) %>%
mutate_if(is.numeric, replace_na, replace = 0) %>%
mutate(DELTA_N = N.new - N.old,
DELTA_COE = COE.new - COE.old)
file_name <- paste0("chk_delta_psc_", bimestre, "-", versione_psc, "_", bimestre_old, "-", versione_psc_old,"_ciclo.xlsx")
write.xlsx(CHK_CICLO, file.path(TEMP, file_name))
chk_flag <- progetti_psc %>%
group_by(ID_PSC, x_CICLO, OC_FLAG_VISUALIZZAZIONE) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)) %>%
full_join(progetti_psc_old %>%
group_by(ID_PSC, x_CICLO, OC_FLAG_VISUALIZZAZIONE) %>%
summarise(N = n(),
COE = sum(COE, na.rm = TRUE)),
by = c("ID_PSC", "x_CICLO", "OC_FLAG_VISUALIZZAZIONE"), suffix = c(".new", ".old")) %>%
mutate_if(is.numeric, replace_na, replace = 0) %>%
mutate(DELTA_N = N.new - N.old,
DELTA_COE = COE.new - COE.old)
file_name <- paste0("chk_delta_psc_", bimestre, "-", versione_psc, "_", bimestre_old, "-", versione_psc_old,"_flag.xlsx")
write.xlsx(chk_flag, file.path(TEMP, file_name))
out <- chk %>%
filter(abs(DELTA_COE) > 10000000)
print(out)
}
#' Report PSC per temi
#'
#' Crea report di confronto programmazione attuazione per PSC e tema
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param programmazione Dati di programmazione DBCOE di tipo "fsc_matrice_po_psc.xlsx"
#' @param visualizzati Logico. Vuoi solo i progetti visualizzati sul portale OC?
#' @param usa_meuro Logico. Vuoi dati in Meuro?
#' @param show_cp Logico. Vuoi calcolare anche il costo pubblico (CP)?
#' @param export Vuoi salvare il file csv in TEMP?
#' @param export_xls Vuoi salvare i file xlsx per ciclo e ambito in OUTPUT?
#' @return Report di confronto programmazione attuazione per PSC e PO in essi confluiti. I nuovi
#' @note ...
make_report_temi_psc_migrati <- function(progetti_psc, programmazione=NULL, visualizzati=TRUE, usa_meuro=FALSE, show_cp=FALSE, export=FALSE, export_xls=FALSE) {
# DEBUG:
# programmazione = NULL
# visualizzati = TRUE
# show_cp = FALSE
# usa_meuro = TRUE
# isola sezione ordinaria
progetti_psc <- progetti_psc %>%
filter(SEZIONE != "SS_1" & SEZIONE != "SS_2") %>%
mutate(x_CICLO = "2014-2020",
SEZIONE = "ORD+CIS") #MEMO: valore forzato
# NEW:
if (is.null(programmazione)) {
programmazione <- load_db_psc(DB, use_flt=TRUE) %>%
rename(TIPOLOGIA_AMMINISTRAZIONE = TIPO_AR,
x_CICLO = CICLO_PROGRAMMAZIONE) %>%
mutate(x_CICLO = "2014-2020",
SEZIONE = "ORD+CIS") #MEMO: valore forzato
}
if (visualizzati == TRUE){
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE == 0)
} else {
# appo1 <- progetti_psc
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE != 4 &
OC_FLAG_VISUALIZZAZIONE != 5)
# MEMO: così scarto solo casi anomali PSC, rilevante per debiti e opcm campania
}
if (show_cp == TRUE) {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO, x_CICLO) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n(),
CP = sum(CP, na.rm = TRUE)) %>%
select(ID_PSC, OC_CODICE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
COE, COE_IMP, COE_CR, COE_PAG, N, CP)
} else {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO, x_CICLO) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n()) %>%
select(ID_PSC, OC_CODICE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
COE, COE_IMP, COE_CR, COE_PAG, N)
}
# confronto programmazione e attuazione
report <- programmazione %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE, RISORSE,
SEZIONE,
AREA_TEMATICA,
SETTORE_INTERVENTO) %>%
group_by(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE,
SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO) %>%
summarise(RISORSE = sum(RISORSE, na.rm = TRUE)) %>%
# MEMO: qui serve full join perché ci possono essere progetti monitorati associati a temi assenti in programmazione
full_join(appo2,
by = c("ID_PSC", "x_CICLO", "OC_CODICE_PROGRAMMA", "SEZIONE", "AREA_TEMATICA", "SETTORE_INTERVENTO")) %>%
mutate_if(is.numeric, replace_na, replace=0)
# fix label vuoti da full_join
report <- report %>%
left_join(programmazione %>%
distinct(ID_PSC, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE),
by = "ID_PSC") %>%
mutate(DESCRIZIONE_PROGRAMMA = if_else(is.na(DESCRIZIONE_PROGRAMMA.x), DESCRIZIONE_PROGRAMMA.y, DESCRIZIONE_PROGRAMMA.x),
TIPOLOGIA_AMMINISTRAZIONE= if_else(is.na(TIPOLOGIA_AMMINISTRAZIONE.x), TIPOLOGIA_AMMINISTRAZIONE.y, TIPOLOGIA_AMMINISTRAZIONE.x)) %>%
select(-DESCRIZIONE_PROGRAMMA.y, -DESCRIZIONE_PROGRAMMA.x, -TIPOLOGIA_AMMINISTRAZIONE.y, -TIPOLOGIA_AMMINISTRAZIONE.x)
if (show_cp == TRUE) {
report <- report %>%
# clean
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N, CP) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO)
} else {
report <- report %>%
# clean
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO)
}
if (usa_meuro == TRUE) {
if (show_cp == TRUE) {
report <- report %>%
mutate(RISORSE = RISORSE/1000000,
COE = COE/1000000,
COE_IMP = COE_IMP/1000000,
COE_CR = COE_CR/1000000,
COE_PAG = COE_PAG/1000000,
CP = CP/1000000)
} else {
report <- report %>%
mutate(RISORSE = RISORSE/1000000,
COE = COE/1000000,
COE_IMP = COE_IMP/1000000,
COE_CR = COE_CR/1000000,
COE_PAG = COE_PAG/1000000)
}
}
if (visualizzati == TRUE){
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_temi_psc_nodupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_temi_psc_nodupli.xlsx"))
}
} else {
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_temi_psc_dupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_temi_psc_dupli.xlsx"))
}
}
return(report)
}
#' Report PSC per temi con sezioni speciali
#'
#' Crea report di confronto programmazione attuazione per PSC e tema su sezione speciale 1
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param programmazione Dati di programmazione DBCOE di tipo "fsc_matrice_po_psc.xlsx"
#' @param visualizzati Logico. Vuoi solo i progetti visualizzati sul portale OC?
#' @param usa_meuro Logico. Vuoi dati in Meuro?
#' @param show_cp Logico. Vuoi calcolare anche il costo pubblico (CP)?
#' @param export Vuoi salvare il file csv in TEMP?
#' @param export_xls Vuoi salvare i file xlsx per ciclo e ambito in OUTPUT?
#' @return Report di confronto programmazione attuazione per PSC e PO in essi confluiti. I nuovi
#' @note ...
make_report_sezioni_psc_migrati <- function(progetti_psc, programmazione=NULL, visualizzati=TRUE, usa_meuro=FALSE, show_cp=FALSE, export=FALSE, export_xls=FALSE) {
# isola sezione ordinaria
progetti_psc <- progetti_psc %>%
filter(SEZIONE == "SS_1" | SEZIONE == "SS_2") %>%
mutate(SEZIONE = case_when(SEZIONE == "SS_1" ~ "SEZ_SPEC_1_COVID",
SEZIONE == "SS_2" ~ "SEZ_SPEC_2_FS")) %>%
mutate(x_CICLO = "2014-2020")
matrix_psc <- data.frame(
ID_PSC = c("PSC_ABRUZZO", "PSC_BARI", "PSC_BASILICATA", "PSC_BOLOGNA", "PSC_CAGLIARI", "PSC_CALABRIA",
"PSC_CAMPANIA", "PSC_CATANIA", "PSC_EMILIA-ROMA", "PSC_FIRENZE", "PSC_FRIULI-VENE",
"PSC_GENOVA", "PSC_LAZIO", "PSC_LIGURIA", "PSC_LOMBARDIA", "PSC_MARCHE", "PSC_MATTM",
"PSC_MESSINA", "PSC_MI", "PSC_MIC", "PSC_MILANO", "PSC_MIPAAF", "PSC_MISALUTE", "PSC_MISE",
"PSC_MIT", "PSC_MOLISE", "PSC_MTUR", "PSC_MUR", "PSC_NAPOLI", "PSC_PA_BOLZANO",
"PSC_PA_TRENTO", "PSC_PALERMO", "PSC_PCM-SPORT", "PSC_PIEMONTE", "PSC_PUGLIA",
"PSC_REGGIO_CALA", "PSC_SARDEGNA", "PSC_SICILIA", "PSC_TOSCANA", "PSC_UMBRIA",
"PSC_VALLE_D_AOS", "PSC_VENETO", "PSC_VENEZIA"),
OC_CODICE_PROGRAMMA = c("PSCABRUZZO", "PSCCITMETBARI", "PSCBASILICATA", "PSCCIMETBOLOGNA",
"PSCCIMTCAGLIARI", "PSCCALABRIA", "PSCCAMPANIA", "PSCCIMETCATANIA",
"PSCEMILROMAGNA", "PSCCIMETFIRENZE", "PSCFRIULI", "PSCCIMETGENOVA",
"PSCLAZIO", "PSCLIGURIA", "PSCLOMBARDIA", "PSCMARCHE", "PSCTRANSECOLOG",
"PSCCIMETMESSINA", "PSCISTRUZIONE", "PSCCULTURA", "PSCCITMETMILANO",
"PSCAGRICOLTURA", "PSCSALUTE", "PSCSVILECONOM", "PSCINFRASTRUT", "PSCMOLISE",
"PSCTURISMO", "PSCUNIVRICERCA", "PSCCITMETNAPOLI", "PSCBOLZANO", "PSCTRENTO",
"PSCCIMETPALERMO", "PSCPCMSPORT", "PSCPIEMONTE", "PSCPUGLIA", "PSCCITMETREGCAL",
"PSCSARDEGNA", "PSCSICILIA", "PSCTOSCANA", "PSCUMBRIA", "PSCVALLEAOSTA",
"PSCVENETO", "PSCCIMETVENEZIA"))
if (is.null(programmazione)) {
programmazione <- init_programmazione_dati(DB=DB) %>%
filter(TIPOLOGIA_PROGRAMMA == "PSC") %>%
rename(SEZIONE = DESCR_LIVELLO_1) %>%
filter(SEZIONE == "SEZ_SPEC_1_COVID" | SEZIONE == "SEZ_SPEC_2_FS") %>%
left_join(matrix_psc, by = "OC_CODICE_PROGRAMMA")
}
if (visualizzati == TRUE){
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE == 0)
} else {
# appo1 <- progetti_psc
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE != 4 &
OC_FLAG_VISUALIZZAZIONE != 5)
# MEMO: così scarto solo casi anomali PSC, rilevante per debiti e opcm campania
}
if (show_cp == TRUE) {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, AREA_TEMATICA, SETTORE_INTERVENTO, SEZIONE, x_CICLO) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n(),
CP = sum(CP, na.rm = TRUE)) %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
COE, COE_IMP, COE_CR, COE_PAG, N, CP)
} else {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, AREA_TEMATICA, SETTORE_INTERVENTO, SEZIONE, x_CICLO) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n()) %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
COE, COE_IMP, COE_CR, COE_PAG, N)
}
# NEW:
# confronto programmazione e attuazione
report <- programmazione %>%
# filter(TIPOLOGIA_PROGRAMMA != "COVID", # considero solo sezione ordinaria
# TIPOLOGIA_PROGRAMMA != "CSR") %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE, RISORSE = FINANZ_TOTALE,
SEZIONE,
AREA_TEMATICA = DESCR_AREA_TEMATICA_PSC,
SETTORE_INTERVENTO = DESCR_SETTORE_INTERVENTO_PSC) %>%
# toglie NA da settore di intervento
mutate(SETTORE_INTERVENTO = case_when(is.na(SETTORE_INTERVENTO) ~ "",
TRUE ~ SETTORE_INTERVENTO)) %>%
group_by(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE,
SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO) %>%
summarise(RISORSE = sum(RISORSE, na.rm = TRUE)) %>%
# MEMO: qui serve full join perché ci possono essere progetti monitorati associati a temi assenti in programmazione
full_join(appo2,
by = c("ID_PSC", "x_CICLO", "OC_CODICE_PROGRAMMA", "SEZIONE", "AREA_TEMATICA", "SETTORE_INTERVENTO")) %>%
mutate_if(is.numeric, list(~replace_na(., 0)))
# fix label vuoti da full_join
report <- report %>%
left_join(programmazione %>%
distinct(ID_PSC, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE),
by = "ID_PSC") %>%
mutate(DESCRIZIONE_PROGRAMMA = if_else(is.na(DESCRIZIONE_PROGRAMMA.x), DESCRIZIONE_PROGRAMMA.y, DESCRIZIONE_PROGRAMMA.x),
TIPOLOGIA_AMMINISTRAZIONE= if_else(is.na(TIPOLOGIA_AMMINISTRAZIONE.x), TIPOLOGIA_AMMINISTRAZIONE.y, TIPOLOGIA_AMMINISTRAZIONE.x)) %>%
select(-DESCRIZIONE_PROGRAMMA.y, -DESCRIZIONE_PROGRAMMA.x, -TIPOLOGIA_AMMINISTRAZIONE.y, -TIPOLOGIA_AMMINISTRAZIONE.x)
if (show_cp == TRUE) {
report <- report %>%
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N, CP) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO)
} else {
report <- report %>%
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO)
}
report <- report %>%
mutate(SEZIONE = case_when(SEZIONE == "SEZ_ORD" ~ "Sez. ordinaria",
SEZIONE == "SEZ_SPEC_1_COVID" ~ "Sez. speciale 1-Covid",
SEZIONE == "SEZ_SPEC_2_FS" ~ "Sez. speciale 2-FS",
SEZIONE == "CSR" ~ "Da programmare",
TRUE ~ "CHK"))
if (usa_meuro == TRUE) {
if (show_cp == TRUE) {
report <- report %>%
mutate(RISORSE = RISORSE/1000000,
COE = COE/1000000,
COE_IMP = COE_IMP/1000000,
COE_CR = COE_CR/1000000,
COE_PAG = COE_PAG/1000000,
CP = CP/1000000)
} else {
report <- report %>%
mutate(RISORSE = RISORSE/1000000,
COE = COE/1000000,
COE_IMP = COE_IMP/1000000,
COE_CR = COE_CR/1000000,
COE_PAG = COE_PAG/1000000)
}
}
if (visualizzati == TRUE){
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_sezioni_speciali_psc_nodupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_sezioni_speciali_psc_nodupli.xlsx"))
}
} else {
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_sezioni_speciali_psc_dupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_sezioni_speciali_psc_dupli.xlsx"))
}
}
return(report)
}
#' Report PSC e PO d'origine
#'
#' Crea report di confronto programmazione attuazione per PSC e PO d'origine
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param programmazione Dati di programmazione DBCOE di tipo "fsc_matrice_po_psc.xlsx"
#' @param visualizzati Logico. Vuoi solo i progetti visualizzati sul portale OC?
#' @param usa_meuro Logico. Vuoi dati in Meuro?
#' @param export Vuoi salvare il file csv in TEMP?
#' @param export_xls Vuoi salvare i file xlsx per ciclo e ambito in OUTPUT?
#' @return Report di confronto programmazione attuazione per PSC e PO d'origine. Le risorse delle sezioni speciali, nuove o da riprogrammazione, sono in righe separate.
#' @note Contiene patch per incorporare patti città metro anche se non sono PSC in DBCOE
make_report_cicli_psc_migrati <- function(progetti_psc, programmazione=NULL, visualizzati=TRUE, usa_meuro=FALSE, export=FALSE, export_xls=FALSE) {
# isola sezione ordinaria
progetti_psc <- progetti_psc %>%
filter(SEZIONE != "SS_1" & SEZIONE != "SS_2" | is.na(SEZIONE))
# NEW:
if (is.null(programmazione)) {
programmazione <- load_db_psc(DB, use_flt=TRUE) %>%
rename(TIPOLOGIA_AMMINISTRAZIONE = TIPO_AR,
x_CICLO = CICLO_PROGRAMMAZIONE)
}
if (visualizzati == TRUE){
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE == 0)
} else {
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE != 4 &
OC_FLAG_VISUALIZZAZIONE != 5)
}
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, x_CICLO) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
N = n())
# confronto programmazione e attuazione
report <- programmazione %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE, RISORSE) %>%
group_by(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE) %>%
summarise(RISORSE = sum(RISORSE, na.rm = TRUE)) %>%
full_join(appo2 %>%
select(ID_PSC, x_CICLO, OC_CODICE_PROGRAMMA, COE, COE_IMP, COE_CR, COE_PAG, N),
by = c("ID_PSC", "x_CICLO", "OC_CODICE_PROGRAMMA")) %>%
mutate_if(is.numeric, list(~replace_na(., 0)))
# fix label vuoti da full_join
report <- report %>%
left_join(programmazione %>%
distinct(ID_PSC, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE),
by = "ID_PSC") %>%
mutate(DESCRIZIONE_PROGRAMMA = if_else(is.na(DESCRIZIONE_PROGRAMMA.x), DESCRIZIONE_PROGRAMMA.y, DESCRIZIONE_PROGRAMMA.x),
TIPOLOGIA_AMMINISTRAZIONE= if_else(is.na(TIPOLOGIA_AMMINISTRAZIONE.x), TIPOLOGIA_AMMINISTRAZIONE.y, TIPOLOGIA_AMMINISTRAZIONE.x)) %>%
select(-DESCRIZIONE_PROGRAMMA.y, -DESCRIZIONE_PROGRAMMA.x, -TIPOLOGIA_AMMINISTRAZIONE.y, -TIPOLOGIA_AMMINISTRAZIONE.x) %>%
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N)
if (usa_meuro == TRUE) {
report <- report %>%
mutate(RISORSE = RISORSE/1000000,
COE = COE/1000000,
COE_IMP = COE_IMP/1000000,
COE_CR = COE_CR/1000000,
COE_PAG = COE_PAG/1000000)
}
if (visualizzati == TRUE){
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_cicli_psc_nodupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_cicli_psc_nodupli.xlsx"))
}
} else {
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_cicli_psc_dupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_cicli_psc_dupli.xlsx"))
}
}
return(report)
}
#' Report PSC per temi con macroarea
#'
#' Crea report di confronto programmazione attuazione per temi con apertura per macroarea
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param operazioni Dataset da load_operazioni()
#' @param programmazione Dati di programmazione DBCOE di tipo "fsc_matrice_po_psc.xlsx"
#' @param visualizzati Logico. Vuoi solo i progetti visualizzati sul portale OC?
#' @param usa_meuro Logico. Vuoi dati in Meuro?
#' @param show_cp Logico. Vuoi calcolare anche il costo pubblico (CP)?
#' @param export Vuoi salvare il file csv in TEMP?
#' @param export_xls Vuoi salvare i file xlsx per ciclo e ambito in OUTPUT?
#' @return Report di confronto programmazione attuazione per PSC e PO in essi confluiti.
#' @note ...
make_report_temi_macroaree_psc_migrati <- function(progetti_psc, operazioni=NULL, programmazione=NULL, visualizzati=TRUE, usa_meuro=FALSE, show_cp=FALSE, export=FALSE, export_xls=FALSE, DB) {
# Isola sezione ordinaria
progetti_psc <- progetti_psc %>%
filter(SEZIONE != "SS_1" & SEZIONE != "SS_2" | is.na(SEZIONE)) %>%
mutate(SEZIONE = "ORD+CIS") %>%
mutate(x_CICLO = "2014-2020") %>%
mutate(COE_CR = 0) # Forzo a 0 per coerenza con macroarea
if (is.null(operazioni)) {
operazioni <- load_operazioni(bimestre, visualizzati = FALSE)
}
# Gestione macroaree con setup specifico
progetti_psc_migrati <- setup_macroaree_psc_migrati(progetti_psc, operazioni)
# sum(progetti_psc$COE, na.rm = TRUE)
# sum(progetti_psc_migrati$COE, na.rm = TRUE)
appo <- progetti_psc %>%
anti_join(progetti_psc_migrati,
by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_CICLO")) %>%
bind_rows(progetti_psc_migrati)
progetti_psc <- appo
if (is.null(programmazione)) {
programmazione <- load_db_psc(DB, use_flt=TRUE) %>%
filter(SEZIONE != "SEZ_SPEC_1_COVID", SEZIONE != "SEZ_SPEC_2_FS") %>%
mutate(SEZIONE = "ORD+CIS") %>%
mutate(x_CICLO = "2014-2020") %>%
rename(TIPOLOGIA_AMMINISTRAZIONE = TIPO_AR)
}
if (visualizzati == TRUE) {
appo1 <- progetti_psc %>% filter(OC_FLAG_VISUALIZZAZIONE == 0)
} else {
appo1 <- progetti_psc %>% filter(!OC_FLAG_VISUALIZZAZIONE %in% c(4, 5))
}
if (show_cp == TRUE) {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, AREA_TEMATICA, SETTORE_INTERVENTO, SEZIONE, x_CICLO, x_MACROAREA) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n(),
CP = sum(CP, na.rm = TRUE))
} else {
appo2 <- appo1 %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, AREA_TEMATICA, SETTORE_INTERVENTO, SEZIONE, x_CICLO, x_MACROAREA) %>%
summarise(COE = sum(COE, na.rm = TRUE),
COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_CR = sum(COE_CR, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
N = n())
}
# converte in formato long
programmazione2 <- programmazione %>%
group_by(ID_PSC, OC_CODICE_PROGRAMMA, x_CICLO, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE,
SEZIONE, AREA_TEMATICA, SETTORE_INTERVENTO) %>%
summarise(RISORSE_SUD = sum(RISORSE_SUD, na.rm = TRUE),
RISORSE_CN = sum(RISORSE_CN, na.rm = TRUE)) %>%
pivot_longer(cols = c("RISORSE_SUD", "RISORSE_CN"),
names_to = "x_MACROAREA", values_to = "RISORSE") %>%
mutate(x_MACROAREA = case_when(x_MACROAREA == "RISORSE_SUD" ~ "Mezzogiorno",
x_MACROAREA == "RISORSE_CN" ~ "Centro-Nord",
TRUE ~ "CHK"))
# chk
sum(programmazione$RISORSE_CN, na.rm = TRUE) + sum(programmazione$RISORSE_SUD, na.rm = TRUE) - sum(programmazione2$RISORSE, na.rm = TRUE)
# crea report
report <- programmazione2 %>%
full_join(appo2, by = c("ID_PSC", "OC_CODICE_PROGRAMMA", "x_CICLO", "SEZIONE", "AREA_TEMATICA", "SETTORE_INTERVENTO", "x_MACROAREA")) %>%
mutate_if(is.numeric, replace_na, 0) %>%
# elimina righe vuote
filter(!(RISORSE == 0 & COE == 0))
# fix label vuoti da full_join
report <- report %>%
left_join(programmazione %>%
distinct(ID_PSC, DESCRIZIONE_PROGRAMMA, TIPOLOGIA_AMMINISTRAZIONE),
by = "ID_PSC") %>%
mutate(DESCRIZIONE_PROGRAMMA = if_else(is.na(DESCRIZIONE_PROGRAMMA.x), DESCRIZIONE_PROGRAMMA.y, DESCRIZIONE_PROGRAMMA.x),
TIPOLOGIA_AMMINISTRAZIONE= if_else(is.na(TIPOLOGIA_AMMINISTRAZIONE.x), TIPOLOGIA_AMMINISTRAZIONE.y, TIPOLOGIA_AMMINISTRAZIONE.x)) %>%
select(-DESCRIZIONE_PROGRAMMA.y, -DESCRIZIONE_PROGRAMMA.x, -TIPOLOGIA_AMMINISTRAZIONE.y, -TIPOLOGIA_AMMINISTRAZIONE.x)
if (show_cp == TRUE) {
report <- report %>%
# clean
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE,
AREA_TEMATICA, SETTORE_INTERVENTO, x_MACROAREA,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N, CP) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, x_CICLO)
} else {
report <- report %>%
# clean
select(ID_PSC, TIPOLOGIA_AMMINISTRAZIONE, OC_CODICE_PROGRAMMA, DESCRIZIONE_PROGRAMMA, x_CICLO, SEZIONE,
AREA_TEMATICA, SETTORE_INTERVENTO, x_MACROAREA,
RISORSE, COE, COE_IMP, COE_CR, COE_PAG, N) %>%
arrange(TIPOLOGIA_AMMINISTRAZIONE, ID_PSC, x_CICLO)
}
if (usa_meuro == TRUE) {
if (show_cp == TRUE) {
report <- report %>% mutate(across(c(RISORSE, COE, COE_IMP, COE_CR, COE_PAG, CP), ~./1e6))
} else {
report <- report %>% mutate(across(c(RISORSE, COE, COE_IMP, COE_CR, COE_PAG), ~./1e6))
}
}
if (visualizzati == TRUE) {
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_temi_macroaree_psc_nodupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_temi_macroaree_psc_nodupli.xlsx"))
}
} else {
if (export == TRUE) {
write_csv2(report, file.path(TEMP, "report_temi_macroaree_psc_dupli.csv"))
}
if (export_xls == TRUE) {
write.xlsx(report, file.path(OUTPUT, "report_temi_macroaree_psc_dupli.xlsx"))
}
}
return(report)
}
#' Crea file di base per macroaree
#'
#' Crea file di base per macroaree, da operazioni, per psc migrati.
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param operazioni Dataset da load_operazioni(), con visualizzati=FALSE
#' @param export vuoi salvare il file?
#' @return Dataset macroaree per il report make_report_temi_macroaree_psc_migrati
setup_macroaree_psc_migrati <- function(progetti_psc, operazioni, export=FALSE) {
# MEMO:
# progetti_psc non contiene x_GRUPPO e variabili COE_SUD, COE_IMP_SUD, ecc., che devo riprendere da operazioni
# vengono trattati solo i progetti monitorati nei PSC migrati
# WARNING: c'è un progetto 4VAPSC0010209XX00001INV in PSCVALLEAOSTA con OC_FLAG_VISUALIZZAZIONE == 1
progetti_psc <- progetti_psc %>%
filter(str_starts(OC_CODICE_PROGRAMMA, "PSC"))
if (is.null(operazioni)) {
operazioni_1420_raw <- load_operazioni(bimestre, visualizzati=FALSE) %>%
# filter(x_GRUPPO == "PSC") %>%
filter(str_starts(OC_CODICE_PROGRAMMA, "PSC")) %>%
# elimina sezione speciale se assente in progetti (serve per controlli dopo)
semi_join(progetti_psc,
by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_CICLO"))
} else {
operazioni_1420_raw <- operazioni %>%
# filter(x_GRUPPO == "PSC") %>%
filter(str_starts(OC_CODICE_PROGRAMMA, "PSC")) %>%
# elimina sezione speciale se assente in progetti (serve per controlli dopo)
semi_join(progetti_psc,
by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_CICLO"))
}
#
# %>%
# filter(SEZIONE != "SS_1" & SEZIONE != "SS_2" | is.na(SEZIONE)) %>%
# select(-SEZIONE)
nrow(operazioni_1420_raw) - nrow(progetti_psc)
# CHK:
# -1
# chk
# progetti_psc %>%
# count(COD_LOCALE_PROGETTO, OC_CODICE_PROGRAMMA, x_CICLO) %>%
# filter(n>1)
#
# chk <- progetti_psc %>%
# anti_join(operazioni_1420_raw,
# by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_CICLO"))
# fix temporaneo su imp e pag
appo <- operazioni_1420_raw %>%
mutate(QUOTA_SUD = COE_SUD/COE) %>%
mutate(COE_IMP_SUD = QUOTA_SUD * COE_IMP,
COE_IMP_CN = COE_IMP - COE_IMP_SUD,
COE_PAG_SUD = QUOTA_SUD * COE_PAG,
COE_PAG_CN = COE_PAG - COE_PAG_SUD)
# chk fix
appo %>%
summarise(COE_IMP = sum(COE_IMP, na.rm = TRUE),
COE_PAG = sum(COE_PAG, na.rm = TRUE),
COE_IMP_SUD = sum(COE_IMP_SUD, na.rm = TRUE),
COE_IMP_CN = sum(COE_IMP_CN, na.rm = TRUE),
COE_PAG_SUD = sum(COE_PAG_SUD, na.rm = TRUE),
COE_PAG_CN = sum(COE_PAG_CN, na.rm = TRUE)) %>%
mutate(CHK_IMP = COE_IMP - COE_IMP_SUD - COE_IMP_CN,
CHK_PAG = COE_PAG - COE_PAG_SUD - COE_PAG_CN)
# COE_IMP COE_PAG COE_IMP_SUD COE_IMP_CN COE_PAG_SUD COE_PAG_CN CHK_IMP CHK_PAG
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 13720805269. 4075468994. 9318101036. 4402704233. 2421109661. 1654359333. 0.000000954 -0.000000238
# chk quota fix
appo %>% filter(QUOTA_SUD > 1)
# 0
# integra variabili finanziarie per macroaree
operazioni_1420 <- progetti_psc %>%
mutate(x_AMBITO = "FSC") %>%
left_join(appo %>%
select(COD_LOCALE_PROGETTO, OC_CODICE_PROGRAMMA, x_CICLO,
COE_SUD, COE_CN, COE_IMP_SUD, COE_IMP_CN, COE_PAG_SUD, COE_PAG_CN),
by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_CICLO"))
pivo <- workflow_pivot_macroaree(operazioni_1420)
out <- pivo %>%
# select(-QUOTA_SUD) %>%
left_join(operazioni_1420 %>%
select(-COE, -COE_IMP, -COE_PAG, -x_MACROAREA),
by = c("COD_LOCALE_PROGETTO", "OC_CODICE_PROGRAMMA", "x_AMBITO"))
nrow(pivo) - nrow(out)
sum(pivo$COE, na.rm = TRUE) - sum(out$COE, na.rm = TRUE)
sum(operazioni_1420$COE, na.rm = TRUE) - sum(out$COE, na.rm = TRUE)
sum(operazioni_1420_raw$COE, na.rm = TRUE) - sum(out$COE, na.rm = TRUE)
# CHK:
# 0
# pulisce dupli per macroaree vuote
out <- out %>%
filter(COE != 0)
# MEMO: vanno escluse per non duplicare le altre variabili
if (export == TRUE) {
write_csv2(out, file.path(TEMP, "progetti_psc_macroaree.csv"))
}
return(out)
}
#' Verifica coerenza tra file dati FSC e file interventi PSC
#'
#' Verifica coerenza tra file dati FSC e file interventi PSC
#'
#' @param bimestre Bimestre di riferimento
#' @param versione_psc Versione di riferimento dei dati (sono possibili più versioni per lo stesso bimestre)
#' @return Dataframe
chk_dati_dbcoe_psc_migrati <- function() {
programmazione <- load_db_psc(DB, use_flt=TRUE)
po_fsc <- load_db("2014-2020", "FSC", simplify_loc = TRUE, use_articolaz = TRUE) %>%
filter(TIPOLOGIA_PROGRAMMA == "PSC" &
COD_LIVELLO_1 %in% c("SEZ_CIS", "SEZ_ORD"))
chk <- programmazione %>%
group_by(OC_CODICE_PROGRAMMA) %>%
summarise(RISORSE = sum(RISORSE, na.rm = TRUE)) %>%
full_join(po_fsc %>%
group_by(OC_CODICE_PROGRAMMA) %>%
summarise(RISORSE = sum(FINANZ_TOTALE, na.rm = TRUE)),
by = "OC_CODICE_PROGRAMMA", suffix = c(".int", ".dati")) %>%
mutate(CHK = RISORSE.int - RISORSE.dati)
if (export == TRUE) {
write.xlsx(chk, file.path(TEMP, "chk_psc_dati_vs_interventi.xlsx"))
}
return(chk)
}
#' Integra CLP da attuazione in DB interventi programmati nei PSC
#'
#' Integra CLP da attuazione in DB interventi programmati nei PSC.
#' Integra CLP per match su CLP al netto di codice SIL e poi per CUP univoci.
#' Sostituisce CUP vuoti con CUP da attuazione.
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param interventi_psc Dataset da DBCOE per programmazione interventi PSC (ATTENZIONE: use_flt=FALSE altrimenti si perdono righe)
#' @param debug Vuoi esportare in TEMP le variazioni dei CLP?
#' @param export Vuoi esportare nel file interventi del DBCOE?
#' @return Dataframe
update_clp_interventi_psc <- function(progetti_psc, interventi_psc, debug=TRUE, export=FALSE) {
# DEBUG:
# debug=TRUE
# join by clp
clean_clp <- function(x, sil) {
for (l in sil$sil) {
# DEBUG:
# x <- "1MISE10067"
# l <- "1MISE"
r_l <- paste0("^", l)
# print(r_l)
x <- str_replace_all(x, r_l, "")
}
return(x)
}
appo_int <- interventi_psc %>%
anti_join(progetti_psc, by = "COD_LOCALE_PROGETTO") %>%
mutate(COD_LOCALE_PROGETTO_OGV = COD_LOCALE_PROGETTO,
CUP_OGV = CUP) %>%
mutate(TEMP_CLP = clean_clp(COD_LOCALE_PROGETTO, octk::sil))
appo_pro <- progetti_psc %>%
anti_join(interventi_psc, by = "COD_LOCALE_PROGETTO") %>%
mutate(TEMP_CLP = clean_clp(COD_LOCALE_PROGETTO, octk::sil)) %>%
select(TEMP_CLP, ID_PSC, COD_LOCALE_PROGETTO, CUP)
appo <- appo_int %>%
inner_join(appo_pro,
by = c("TEMP_CLP", "ID_PSC"))
if (debug == TRUE) {
chk <- appo %>%
select(TEMP_CLP, ID_PSC, COD_LOCALE_PROGETTO.x, COD_LOCALE_PROGETTO.y, CUP.x, CUP.y)
write.xlsx(chk, file.path(TEMP, "chk_match_interventi_by_clp.xlsx"))
message("Correzioni da match su CLP senza codice SIL per ", dim(chk)[1], " interventi")
}
appo1 <- appo %>%
mutate(CUP = if_else(is.na(CUP.x), CUP.y, CUP.x), #MEMO: integra solo CUP vuoti lato programmazione, non modifica CUP diversi con attuazione (che si controllano in data quality)
COD_LOCALE_PROGETTO = COD_LOCALE_PROGETTO.y)
interventi_psc_2 <- appo1 %>%
select(-TEMP_CLP, -COD_LOCALE_PROGETTO.x, -COD_LOCALE_PROGETTO.y, -CUP.x, -CUP.y) %>%
bind_rows(interventi_psc %>%
anti_join(appo1 %>%
select(COD_LOCALE_PROGETTO = COD_LOCALE_PROGETTO.x), # MEMO: il join va fatto sul codice originale!
by = "COD_LOCALE_PROGETTO") %>%
mutate(COD_LOCALE_PROGETTO_OGV = COD_LOCALE_PROGETTO)) %>%
select(names(interventi_psc))
dim(interventi_psc_2)[1] == dim(interventi_psc)[1]
# join by cup
n_cup_int <- interventi_psc_2 %>%
filter(!is.na(CUP)) %>%
filter(CUP != "no") %>%
filter(CUP != "-") %>%
filter(nchar(CUP) == 15) %>%
# count(CUP) %>%
count(CUP, ID_PSC) %>%
filter(n == 1)
n_cup_pro <- progetti_psc %>%
# count(CUP) %>%
count(CUP, ID_PSC) %>%
filter(n == 1)
appo_int_2 <- interventi_psc_2 %>%
semi_join(n_cup_int, by = "CUP")
appo_pro_2 <- progetti_psc %>%
semi_join(n_cup_pro, by = "CUP") %>%
anti_join(interventi_psc_2, by = "COD_LOCALE_PROGETTO") %>%
select(ID_PSC, CUP, COD_LOCALE_PROGETTO)
appo2 <- appo_int_2 %>%
inner_join(appo_pro_2,
by = c("CUP", "ID_PSC"))
if (debug == TRUE) {
chk1 <- appo2 %>%
select(ID_PSC, CUP, COD_LOCALE_PROGETTO.x, COD_LOCALE_PROGETTO.y)
write.xlsx(chk1, file.path(TEMP, "chk_match_interventi_by_cup.xlsx"))
message("Correzioni da match su CUP per ", dim(chk1)[1], " interventi")
# chk su cup duplicati
n_cup_int_dupli <- interventi_psc_2 %>%
filter(!is.na(CUP)) %>%
filter(CUP != "no") %>%
filter(CUP != "-") %>%
filter(nchar(CUP) == 15) %>%
count(CUP) %>%
filter(n > 1)
n_cup_pro_dupli <- progetti_psc %>%
count(CUP) %>%
filter(n > 1)
appo_int_2_dupli <- interventi_psc_2 %>%
semi_join(n_cup_int_dupli, by = "CUP")
appo_pro_2_dupli <- progetti_psc %>%
semi_join(n_cup_pro_dupli, by = "CUP") %>%
anti_join(interventi_psc_2, by = "COD_LOCALE_PROGETTO") %>%
select(ID_PSC, CUP, COD_LOCALE_PROGETTO, TITOLO_PROGETTO=OC_TITOLO_PROGETTO)
appo2_dupli <- appo_int_2_dupli %>%
inner_join(appo_pro_2_dupli,
by = c("CUP", "ID_PSC"))
chk2 <- appo2_dupli %>%
select(ID_PSC, CUP, COD_LOCALE_PROGETTO.x, TITOLO_PROGETTO.x, COD_LOCALE_PROGETTO.y, TITOLO_PROGETTO.y)
write.xlsx(chk2, file.path(TEMP, "chk_match_interventi_by_cup_duplicati.xlsx"))
message("Duplicati da match su CUP per ", dim(chk2)[1], " intervenit/progetti. Analizza il file chk_match_interventi_by_cup_duplicati.xlsx e correggi a mano nel DBCOE")
}
appo3 <- appo2 %>%
mutate(COD_LOCALE_PROGETTO = COD_LOCALE_PROGETTO.y)
interventi_psc_3 <- appo3 %>%
select(-COD_LOCALE_PROGETTO.x, -COD_LOCALE_PROGETTO.y) %>%
bind_rows(interventi_psc_2 %>%
anti_join(appo3 %>%
select(COD_LOCALE_PROGETTO = COD_LOCALE_PROGETTO.x), # MEMO: il join va fatto sul codice originale!
by = "COD_LOCALE_PROGETTO") %>%
mutate(COD_LOCALE_PROGETTO_OGV = COD_LOCALE_PROGETTO)) %>%
select(names(interventi_psc))
dim(interventi_psc_3)[1] == dim(interventi_psc_2)[1]
if (export == TRUE) {
write.xlsx(interventi_psc_3, file.path(DB, "Interventi_DBCOE_PSC.xlsx"))
}
return(interventi_psc_3)
}
#' Analisi qualità dati PSC
#'
#' Analisi qualità dati PSC
#'
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param interventi_psc Dataset da DBCOE per programmazione interventi PSC
#' @param progetti Dataset progetti da load_progetti(visualizzati = FALSE, light = TRUE)
#' @param export Vuoi esportare il file in OUTPUT?
#' @return Dataframe
analisi_data_quality_psc <- function(progetti_psc, interventi_psc, progetti, export=FALSE) {
'%!in%' <- function(x,y)!('%in%'(x,y))
PSC <- file.path(DRIVE, "DATI", "PSC")
# ---- programmazione ----
interventi_psc_2 <- interventi_psc %>%
rename(CICLO = CICLO_PROGRAMMAZIONE,
PROGRAMMA = DESCRIZIONE_PROGRAMMA)
# ---- attuazione ----
progetti_psc_2 <- progetti_psc %>%
filter(SEZIONE %in% c("ORD", "CIS")) %>%
left_join(progetti %>%
select(COD_LOCALE_PROGETTO, IMPEGNI, CUP_DESCR_NATURA),
by = "COD_LOCALE_PROGETTO") %>%
rename(TITOLO_PROGETTO = OC_TITOLO_PROGETTO,
CICLO = x_CICLO,
PROGRAMMA = x_PROGRAMMA)
# ---- join ----
appo <- progetti_psc_2 %>%
full_join(interventi_psc_2,
by = c("COD_LOCALE_PROGETTO", "ID_PSC")) %>%
mutate(
CUP = if_else(is.na(CUP.y), CUP.x, CUP.y),
TITOLO_PROGETTO = if_else(is.na(TITOLO_PROGETTO.y), TITOLO_PROGETTO.x, TITOLO_PROGETTO.y),
# CICLO = if_else(is.na(CICLO.y), CICLO.x, CICLO.y),
PROGRAMMA = if_else(is.na(PROGRAMMA.y), PROGRAMMA.x, PROGRAMMA.y),
OC_CODICE_PROGRAMMA = if_else(is.na(OC_CODICE_PROGRAMMA.y), OC_CODICE_PROGRAMMA.x, OC_CODICE_PROGRAMMA.y),
SEZIONE = if_else(is.na(SEZIONE.y), SEZIONE.x, SEZIONE.y),
# AREA_TEMATICA = if_else(is.na(AREA_TEMATICA.y), AREA_TEMATICA.x, AREA_TEMATICA.y),
# SETTORE_INTERVENTO = if_else(is.na(SETTORE_INTERVENTO.y), SETTORE_INTERVENTO.x, SETTORE_INTERVENTO.y)
AREA_TEMATICA = AREA_TEMATICA.y,
AREA_TEMATICA_MONIT = AREA_TEMATICA.x,
SETTORE_INTERVENTO = SETTORE_INTERVENTO.y,
SETTORE_INTERVENTO_MONIT = SETTORE_INTERVENTO.x) %>%
rename() %>%
# TODO: scegliere i casi da mostrare nel dossier e commentare per lasciare differenze in chiaro
# fix varibili vuote ma di cui va occupata posizione
mutate(MACROAREA = "ND",
RISORSE_COE = RISORSE,
RISORSE_ECO = 0) %>%
select(ID,
COD_LOCALE_PROGETTO,
CUP,
TITOLO_PROGETTO,
CICLO_ATTUAZIONE = CICLO.x,
CICLO_PROGRAMMAZIONE = CICLO.y,
ID_PSC,
PROGRAMMA,
OC_CODICE_PROGRAMMA,
MACROAREA,
SEZIONE,
AREA_TEMATICA,
SETTORE_INTERVENTO,
AREA_TEMATICA_MONIT,
SETTORE_INTERVENTO_MONIT,
CUP_DESCR_NATURA,
CASI_OGV,
RISORSE,
RISORSE_COE,
RISORSE_ECO,
COE,
COE_IMP,
COE_CR,
COE_PAG,
COE_ECO,
CP,
CPP,
IMPEGNI,
OC_STATO_PROCEDURALE,
OC_FLAG_VISUALIZZAZIONE,
DB) %>%
# fix flag
mutate(OC_FLAG_VISUALIZZAZIONE = if_else(is.na(OC_FLAG_VISUALIZZAZIONE), 0, OC_FLAG_VISUALIZZAZIONE)) %>%
# variabili per analisi match
mutate(CHK_LISTE = case_when(is.na(CASI_OGV) ~ "no psc",
CASI_OGV == "economie programmazione" ~ "economie",
CASI_OGV == "solo economie" ~ "economie",
is.na(COE) ~ "no monit",
TRUE ~ "match")) %>%
mutate(DELTA = RISORSE - COE) %>%
# mutate(DELTA = RISORSE_COE - COE) %>%
mutate(CHK_RISORSE = case_when(# DELTA > 0 ~ "da monitorare",
# DELTA == 0 ~ "invariati",
# DELTA < 0 ~ "overbooking",
DELTA > 1 ~ "da monitorare", #MEMO: introduco tolleranza di un euro
DELTA >= -1 & DELTA < 1 ~ "invariati",
DELTA < -1 ~ "overbooking",
# is.na(RISORSE_COE) ~ "overbooking",
is.na(RISORSE) ~ "overbooking",
is.na(COE) ~ "da monitorare",
TRUE ~ "chk")) %>%
mutate(COE_FIX = case_when(CHK_LISTE == "no monit" ~ RISORSE,
CHK_LISTE == "economie" ~ RISORSE,
CHK_LISTE == "match" ~ RISORSE,
TRUE ~ COE)) %>% # variabile ibrida per controlli
mutate(OGV = case_when(CASI_OGV == "dichiarazione ogv da acquisire" ~ "OGV",
CASI_OGV == "economie programmazione" ~ "OGV",
CASI_OGV == "esoneri" ~ "OGV",
CASI_OGV == "ogv conseguita dic22" ~ "OGV",
CASI_OGV == "ogv conseguita giu22" ~ "OGV",
CASI_OGV == "ogv conseguita per dichiarazioni" ~ "OGV",
CASI_OGV == "ogv conseguita su salvaguardia 200M" ~ "OGV",
CASI_OGV == "ogv conseguita su salvaguardia 25M" ~ "OGV",
CASI_OGV == "ogv non conseguita" ~ "NO OGV",
CASI_OGV == "ogv non conseguita con art. 53" ~ "NO OGV",
CASI_OGV == "ogv non conseguita per verifica desk" ~ "NO OGV",
CASI_OGV == "ogv non conseguita su salvaguardia 200M" ~ "NO OGV",
CASI_OGV == "ogv non conseguita su salvaguardia 25M" ~ "NO OGV",
CASI_OGV == "salvaguardia CIS" ~ "OGV",
CASI_OGV == "salvaguardia COMM" ~ "OGV",
CASI_OGV == "salvaguardia pnrr" ~ "OGV",
TRUE ~ "ND"))
analisi <- appo %>%
mutate(VERIFICA_PROCEDURALE = case_when(OC_STATO_PROCEDURALE == "In esecuzione" ~ "IN ESECUZIONE",
OC_STATO_PROCEDURALE == "Eseguito" ~ "IN ESECUZIONE",
is.na(OC_STATO_PROCEDURALE) ~ "NON DEFINIBILE",
TRUE ~ "NON IN ESECUZIONE")) %>%
mutate(IMPEGNI = ifelse(is.na(IMPEGNI), 0, IMPEGNI))%>%
mutate(VERIFICA_IMPEGNI = case_when (is.na(CP) ~ "NON DEFINIBILE",
# IMPEGNI/CP < 0.6 ~ "IMPEGNI INFERIORI AL 60%",
COE_IMP/COE < 0.6 ~ "IMPEGNI INFERIORI AL 60%",
TRUE ~ "IMPEGNI OK"))%>%
mutate(CHK_CICLO = case_when(CICLO_PROGRAMMAZIONE == CICLO_ATTUAZIONE ~ "CICLO CORRETTO",
CICLO_PROGRAMMAZIONE != CICLO_ATTUAZIONE ~ "CICLO NON COERENTE",
is.na(CICLO_PROGRAMMAZIONE) ~ "PROGETTO NON NEL PSC",
is.na(CICLO_ATTUAZIONE) ~ "PROGETTO NON MONITORATO")) %>%
mutate(CHK_LISTE_2 = case_when(CHK_LISTE == "match" & CHK_RISORSE %in% c("da monitorare", "overbooking") ~ "psc ma variati",
CHK_LISTE == "match" & CHK_RISORSE %in% c("invariati") ~ "psc ok",
TRUE ~ CHK_LISTE)) %>%
mutate(CHK_TEMI = case_when(AREA_TEMATICA == AREA_TEMATICA_MONIT ~ "tema ok",
is.na(AREA_TEMATICA) ~ "PROGETTO NON NEL PSC",
is.na(AREA_TEMATICA_MONIT) ~ "PROGETTO NON MONITORATO",
TRUE ~ "tema no")) %>%
mutate(CHK_SETTORI = case_when(SETTORE_INTERVENTO == SETTORE_INTERVENTO_MONIT ~ "settore ok",
is.na(SETTORE_INTERVENTO) ~ "PROGETTO NON NEL PSC",
is.na(SETTORE_INTERVENTO_MONIT) ~ "PROGETTO NON MONITORATO",
TRUE ~ "settore no"))
# ---- chk clp dupli ----
check_dupli <- analisi%>%
filter(!is.na(COD_LOCALE_PROGETTO))%>%
filter(COD_LOCALE_PROGETTO %!in% c("ND", "Residuo_Ducato Estense", "XXX12", "XXX3_3", "XXX5", "XXX8"))%>%
group_by(COD_LOCALE_PROGETTO, ID_PSC)%>%
summarise(N= sum(n()))%>%
filter(N>1)
if ((dim(check_dupli)[1]==0) == FALSE){
print("ATTENZIONE!!!! SONO PRESENTI PROGETTI DUPLICATI")
} else {
print("OK! NESSUN PROGETTO DUPLICATO")
}
if (export == TRUE) {
metadati <- read_xlsx(file.path(INPUT, "metadati_psc.xlsx"))
wb <- createWorkbook()
addWorksheet(wb, sheetName="dati")
addWorksheet(wb, sheetName="metadati")
writeData(wb, sheet = "dati", x = appo, colNames = TRUE)
writeData(wb, sheet = "metadati", x = metadati, colNames = TRUE)
saveWorkbook(wb, file = file.path(OUTPUT, paste0("interventi_data_quality_psc_", bimestre, ".xlsx")), overwrite = TRUE)
}
return(analisi)
}
#' Dossier qualità dati PSC
#'
#' Dossier qualità dati PSC
#'
#' @param analisi Dataset di analisi qualità dati da analisi_data_quality_psc()
#' @return Nessuno, salva file in Drive
dossier_data_quality_psc <- function(analisi) {
'%!in%' <- function(x,y)!('%in%'(x,y))
PSC <- file.path(DRIVE, "DATI", "PSC")
# ---- liste dossier ----
#aggiungere in analisi programmazione altri campi di interesse (Verifica CUP, ritardi, salvaguardie)
#Progetti non presenti nel monitoraggio
no_monit <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 == "no monit") %>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti da eliminare dal monitoraggio (al netto di NO OGV)
no_lista <- analisi %>%
filter(OGV == "ND") %>% #MEMO: questi progetti sono privi di CASI_OGV per definizione
filter(CHK_LISTE_2 =="no psc") %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti da eliminare dal monitoraggio perché NO OGV
no_ogv <- analisi %>%
filter(OGV == "NO OGV") %>%
# filter(CHK_LISTE_2 =="no psc") %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti con COE diverso
CHK_coe <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 =="psc ma variati")%>%
filter(RISORSE > 0) %>%
filter(DELTA != 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
# Progetti con IMPEGNI Inferiori al 60%
CHK_impegni <- analisi %>%
filter(OGV == "OGV") %>%
filter(VERIFICA_IMPEGNI =="IMPEGNI INFERIORI AL 60%") %>%
filter(CASI_OGV %in% c("ogv conseguita per dichiarazioni",
"ogv conseguita dic22",
"ogv conseguita giu22",
"ogv conseguita su salvaguardia 25M",
"ogv conseguita su salvaguardia 200M")) %>%
filter(CUP_DESCR_NATURA %in% c("ACQUISTO DI BENI",
"ACQUISTO O REALIZZAZIONE DI SERVIZI",
"REALIZZAZIONE DI LAVORI PUBBLICI (OPERE ED IMPIANTISTICA)")) %>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
# Progetti con PROCEDURALE non eseguito
CHK_iter <- analisi %>%
filter(OGV == "OGV") %>%
filter(VERIFICA_PROCEDURALE =="NON IN ESECUZIONE") %>%
filter(CASI_OGV %in% c("ogv conseguita per dichiarazioni",
"ogv conseguita dic22",
"ogv conseguita giu22",
"ogv conseguita su salvaguardia 25M",
"ogv conseguita su salvaguardia 200M")) %>%
filter(CUP_DESCR_NATURA %in% c("ACQUISTO DI BENI",
"ACQUISTO O REALIZZAZIONE DI SERVIZI",
"REALIZZAZIONE DI LAVORI PUBBLICI (OPERE ED IMPIANTISTICA)")) %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti da migrare
# da_migrare <- analisi %>%
# filter(OGV == "OGV") %>%
# mutate(da_migrare = case_when(DB !="PUC" ~ "da migrare",
# DB =="PUC" & !grepl("^PSC", OC_CODICE_PROGRAMMA) ~ "da migrare",
# TRUE ~ "ok"))%>%
# mutate(PROGRAMMA = ifelse(DB =="SGP" & grepl("^PSC", OC_CODICE_PROGRAMMA), paste0(PROGRAMMA, " (da validare)"), PROGRAMMA))%>%
# filter(da_migrare =="da migrare")%>%
# filter(RISORSE > 0) %>%
# select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX , -da_migrare, -CHK_LISTE_2, -OGV)
#Progetti con ciclo non coerente
CHK_ciclo <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_CICLO =="CICLO NON COERENTE")%>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti con tema non coerente
CHK_tema <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_TEMI =="tema no")%>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
#Progetti con settore non coerente
CHK_settore <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_SETTORI =="settore no")%>%
filter(RISORSE > 0) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -CHK_LISTE_2, -OGV)
# ---- export dossier ----
# stili
# style_number <<- createStyle(numFmt = "#,##0.0", border = c("top", "bottom", "left", "right"), fontColour = "#000000")
# style_number3 <<- createStyle(numFmt = "#,##0", halign = "center", border = c("top", "bottom", "left", "right"), fontColour = "#000000")
# style_number4 <<- createStyle(numFmt = "#,##0", halign = "center", fontColour = "#000000")
# style_date <<- createStyle(numFmt = "DATE", border = c("top", "bottom", "left", "right"))
# style_date2 <<- createStyle(numFmt = "DATE")
# style_centered <<- createStyle(halign = "center", border = c("top", "bottom", "left", "right"))
# style_centered2 <<- createStyle(halign = "center")
# style_border <<- createStyle(border = c("top", "bottom", "left", "right"))
# style_bold_centered <<- createStyle(textDecoration = "bold", halign = "center", border = c("top", "bottom", "left", "right"))
# style_bold_number <<- createStyle(textDecoration = "bold", numFmt = "#,##0.00", border = c("top", "bottom", "left", "right"))
# style_bold <<- createStyle(textDecoration = "bold", border = c("top", "bottom", "left", "right"))
# style_number2 <<- createStyle(numFmt = "#,##0.00", halign = "right", fontColour = "#000000")
# style_none <<- createStyle(border = NULL)
# style_white <<- createStyle(border = NULL, fontColour = "#FFFFFF")
# style_percentage <<- createStyle(numFmt = "PERCENTAGE", border = c("top", "bottom", "left", "right"), fontColour = "#000000")
#
psc_all <- analisi%>%
distinct(ID_PSC)
psc <- analisi%>%
distinct(ID_PSC) %>% .$ID_PSC
for (i in psc) {
print(i)
# DEBUG:
# i <- "PSC_MARCHE"
data_riferimento <- data.frame(bimestre)%>%
mutate(anno = substr(bimestre, start = 1, stop= 4))%>%
mutate(mese = substr(bimestre, start = 5, stop= 6))%>%
mutate(giorno = substr(bimestre, start = 7, stop= 8))%>%
mutate(data = paste0(giorno, "/", mese, "/", anno))%>%
mutate(as.Date(data))%>%
select(data)
lista <- analisi %>%
filter(OGV == "OGV") %>%
filter(ID_PSC == i) %>%
select(-OC_FLAG_VISUALIZZAZIONE, -COE_FIX, -OGV)
no_monit_psc <- no_monit %>%
filter(ID_PSC == i)
no_lista_psc <- no_lista %>%
filter(ID_PSC == i)
no_ogv_psc <- no_ogv %>%
filter(ID_PSC == i)
CHK_impegni_psc <- CHK_impegni %>%
filter(ID_PSC == i)
CHK_coe_psc <- CHK_coe %>%
filter(ID_PSC == i)
CHK_iter_psc <- CHK_iter %>%
filter(ID_PSC == i)
# da_migrare_psc <- da_migrare %>%
# filter(ID_PSC == i)
CHK_ciclo_psc <- CHK_ciclo %>%
filter(ID_PSC == i)
CHK_tema_psc <- CHK_tema %>%
filter(ID_PSC == i)
CHK_settore_psc <- CHK_settore %>%
filter(ID_PSC == i)
nessun_dato <- "NESSUN DATO"
# filename per export
temp_file <- paste0("Dossier ",i, "_verifica_monitoraggio dati al ", bimestre, ".xlsx")
# load
wb <- loadWorkbook(file.path(INPUT, "template_quality.xlsx"))
# scrive dati
writeData(wb, sheet = "Copertina", x = i, startCol = 10, startRow = 25, colNames = FALSE)
writeData(wb, sheet = "Copertina", x = data_riferimento, startCol = 10, startRow = 26, colNames = FALSE)
addStyle(wb, sheet = "Copertina", style_date2, rows = 26:26, cols = 10 , gridExpand = TRUE, stack = TRUE)
writeData(wb, sheet = "lista_dati", x = lista, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "lista_dati", style_border, rows = 1:nrow(lista)+1, cols = 1:39 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "lista_dati", style_number, rows = 1:nrow(lista)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "lista_dati", style_number, rows = 1:nrow(lista)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "lista_dati", cols = 1:39, widths = 15)
if ((dim(no_monit_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_no_monit", x = no_monit_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_no_monit", style_border, rows = 1:nrow(no_monit_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_monit", style_number, rows = 1:nrow(no_monit_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_monit", style_number, rows = 1:nrow(no_monit_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_no_monit", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_no_monit", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(no_lista_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_no_psc", x = no_lista_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_no_psc", style_border, rows = 1:nrow(no_lista_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_psc", style_number, rows = 1:nrow(no_lista_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_psc", style_number, rows = 1:nrow(no_lista_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_no_psc", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_no_psc", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(no_ogv_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_no_ogv", x = no_ogv_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_no_ogv", style_border, rows = 1:nrow(no_ogv_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_ogv", style_number, rows = 1:nrow(no_ogv_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_no_ogv", style_number, rows = 1:nrow(no_ogv_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_no_ogv", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_no_ogv", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(CHK_coe_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_variazione_costo", x = CHK_coe_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_variazione_costo", style_border, rows = 1:nrow(CHK_coe_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_variazione_costo", style_number, rows = 1:nrow(CHK_coe_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_variazione_costo", style_number, rows = 1:nrow(CHK_coe_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_variazione_costo", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_variazione_costo", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(CHK_impegni_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_anomalie_impegni", x = CHK_impegni_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_anomalie_impegni", style_border, rows = 1:nrow(CHK_impegni_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_impegni", style_number, rows = 1:nrow(CHK_impegni_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_impegni", style_number, rows = 1:nrow(CHK_impegni_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_anomalie_impegni", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_anomalie_impegni", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(CHK_iter_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_anomalie_procedurale", x = CHK_iter_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_anomalie_procedurale", style_border, rows = 1:nrow(CHK_iter_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_procedurale", style_number, rows = 1:nrow(CHK_iter_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_procedurale", style_number, rows = 1:nrow(CHK_iter_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_anomalie_procedurale", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_anomalie_procedurale", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
# if ( (dim(da_migrare_psc)[1]==0) == FALSE)
# {
# writeData(wb, sheet = "progetti_da_migrare", x = da_migrare_psc, startCol = 1, startRow = 2, colNames = FALSE)
# addStyle(wb, sheet = "progetti_da_migrare", style_border, rows = 1:nrow(da_migrare_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
# addStyle(wb, sheet = "progetti_da_migrare", style_number, rows = 1:nrow(da_migrare_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
# addStyle(wb, sheet = "progetti_da_migrare", style_number, rows = 1:nrow(da_migrare_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
# setColWidths(wb, "progetti_da_migrare", cols = 1:38, widths = 15)
# } else
# {
# writeData(wb, sheet = "progetti_da_migrare", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
# }
if ( (dim(CHK_ciclo_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_anomalie_ciclo", x = CHK_ciclo_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_anomalie_ciclo", style_border, rows = 1:nrow(CHK_ciclo_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_ciclo", style_number, rows = 1:nrow(CHK_ciclo_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_ciclo", style_number, rows = 1:nrow(CHK_ciclo_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_anomalie_ciclo", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_anomalie_ciclo", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(CHK_tema_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_anomalie_tema", x = CHK_tema_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_anomalie_tema", style_border, rows = 1:nrow(CHK_tema_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_tema", style_number, rows = 1:nrow(CHK_tema_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_tema", style_number, rows = 1:nrow(CHK_tema_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_anomalie_tema", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_anomalie_tema", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
if ( (dim(CHK_settore_psc)[1]==0) == FALSE)
{
writeData(wb, sheet = "progetti_anomalie_settore", x = CHK_settore_psc, startCol = 1, startRow = 2, colNames = FALSE)
addStyle(wb, sheet = "progetti_anomalie_settore", style_border, rows = 1:nrow(CHK_settore_psc)+1, cols = 1:38 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_settore", style_number, rows = 1:nrow(CHK_settore_psc)+1, cols = 17:27 , gridExpand = TRUE, stack = TRUE)
addStyle(wb, sheet = "progetti_anomalie_settore", style_number, rows = 1:nrow(CHK_settore_psc)+1, cols = 31:31 , gridExpand = TRUE, stack = TRUE)
setColWidths(wb, "progetti_anomalie_settore", cols = 1:38, widths = 15)
} else
{
writeData(wb, sheet = "progetti_anomalie_settore", x = nessun_dato, startCol = 1, startRow = 2, colNames = FALSE)
}
# salva
saveWorkbook(wb, file = file.path(OUTPUT, "Dossier", temp_file), overwrite = TRUE)
}
}
#' Report qualità dati PSC
#'
#' Report qualità dati PSC
#'
#' @param analisi Dataset di analisi qualità dati da analisi_data_quality_psc()
#' @param progetti_psc Dataset da load_progetti_psc_migrati()
#' @param export Vuoi esportare il file in OUTPUT?
#' @return Dataframe
report_data_quality_psc <- function(analisi, progetti_psc, export=TRUE) {
# TODO:
# rivedere metadati
# carica metadati
metadati <- read_xlsx(file.path(INPUT, "metadati_quality.xlsx"))
# ---- liste report ----
# Tutti gli interventi
lista <- analisi %>%
filter(OGV == "OGV") %>%
filter(RISORSE > 0) %>%
filter(CASI_OGV != "economie programmazione") %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "TOTALE")
# Base con risorse di riferimento
risorse <- lista %>%
select(ID_PSC, RISORSE)
# Economie
economie <- analisi %>%
filter(OGV == "OGV") %>%
filter(RISORSE > 0) %>%
filter(CASI_OGV == "economie programmazione") %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "ECONOMIE")
# No OGV da disattivare
no_ogv <- analisi %>%
filter(OGV == "NO OGV") %>%
# filter(RISORSE > 0) %>%
filter(COE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
# RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
RISORSE = sum(COE, na.rm=TRUE)) %>%
mutate(KPI = "NO OGV")
# Interventi presenti nel monitoraggio
monit_ok <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 == "psc ok") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "MONIT OK")
# Interventi non presenti nel monitoraggio
no_monit <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 == "no monit") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO MONIT")
# Progetti da eliminare dal monitoraggio (altri casi)
no_lista <- analisi %>%
filter(OGV == "ND") %>%
filter(CHK_LISTE_2 =="no psc") %>% #MEMO: i due filtri corrispondono
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(COE, na.rm=TRUE)) %>%
mutate(KPI = "NO PSC")
# Interventi con COE diverso
CHK_coe <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 =="psc ma variati") %>%
filter(RISORSE > 0) %>%
filter(DELTA != 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(DELTA, na.rm=TRUE)) %>%
mutate(KPI = "DELTA COE")
# Progetti con IMPEGNI Inferiori al 60%
CHK_impegni <- analisi %>%
filter(OGV == "OGV") %>%
filter(VERIFICA_IMPEGNI =="IMPEGNI INFERIORI AL 60%") %>%
filter(CASI_OGV %in% c("ogv conseguita per dichiarazioni",
"ogv conseguita dic22",
"ogv conseguita giu22",
"ogv conseguita su salvaguardia 25M",
"ogv conseguita su salvaguardia 200M")) %>%
filter(CUP_DESCR_NATURA %in% c("ACQUISTO DI BENI",
"ACQUISTO O REALIZZAZIONE DI SERVIZI",
"REALIZZAZIONE DI LAVORI PUBBLICI (OPERE ED IMPIANTISTICA)")) %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO IMPEGNI")
# Progetti con PROCEDURALE non almeno in esecuzione
CHK_iter <- analisi %>%
filter(OGV == "OGV") %>%
filter(VERIFICA_PROCEDURALE =="NON IN ESECUZIONE") %>%
filter(CASI_OGV %in% c("ogv conseguita per dichiarazioni",
"ogv conseguita dic22",
"ogv conseguita giu22",
"ogv conseguita su salvaguardia 25M",
"ogv conseguita su salvaguardia 200M")) %>%
filter(CUP_DESCR_NATURA %in% c("ACQUISTO DI BENI",
"ACQUISTO O REALIZZAZIONE DI SERVIZI",
"REALIZZAZIONE DI LAVORI PUBBLICI (OPERE ED IMPIANTISTICA)"))%>%
filter(CHK_LISTE_2 != "no monit") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO ITER")
# Progetti con ciclo non coerente
CHK_ciclo <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_CICLO == "CICLO NON COERENTE") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO CICLO")
# Progetti con tema non coerente
CHK_tema <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_TEMI == "tema no") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO TEMA")
# Progetti con settore non coerente
CHK_settore <- analisi %>%
filter(OGV == "OGV") %>%
filter(CHK_LISTE_2 !="no monit") %>%
filter(CHK_SETTORI == "settore no") %>%
filter(RISORSE > 0) %>%
group_by(ID_PSC) %>%
summarise(N = n(),
RISORSE = sum(RISORSE, na.rm=TRUE)) %>%
mutate(KPI = "NO SETTORE")
# unione delle liste
temp <- lista %>%
bind_rows(economie) %>%
bind_rows(no_ogv) %>%
bind_rows(monit_ok) %>%
bind_rows(no_monit) %>%
bind_rows(no_lista) %>%
bind_rows(CHK_coe) %>%
bind_rows(CHK_impegni) %>%
bind_rows(CHK_iter) %>%
bind_rows(CHK_ciclo) %>%
bind_rows(CHK_tema) %>%
bind_rows(CHK_settore) %>%
rename(RISORSE_MONIT = RISORSE)
# integra risorse e calcola peso
appo <- risorse %>%
left_join(temp, by = "ID_PSC") %>%
mutate(PESO = round(RISORSE_MONIT / RISORSE, 2))
# integra descrizione kpi
appo1 <- appo %>%
mutate(KPI_DESCR = case_when(KPI == "TOTALE" ~ "Tutti gli interventi programmati",
KPI == "ECONOMIE" ~ "Economie di programmazione",
KPI == "NO OGV" ~ "Interventi privi di OGV in programmazione per memoria",
KPI == "MONIT OK" ~ "Interventi programmati e monitorati con importo identico",
KPI == "NO MONIT" ~ "Interventi programmati non monitorati",
KPI == "NO PSC" ~ "Progetti monitorati non previsti tra interventi programmati",
KPI == "DELTA COE" ~ "Interventi programmati monitorati con importo diverso",
KPI == "NO IMPEGNI" ~ "Interventi programmati monitorati con impegni non coerenti con OGV",
KPI == "NO ITER" ~ "Interventi programmati monitorati con iter procedurale non coerente con OGV",
KPI == "NO CICLO" ~ "Interventi programmati monitorati con ciclo diverso",
KPI == "NO TEMA" ~ "Interventi programmati monitorati con tema diverso",
KPI == "NO SETTORE" ~ "Interventi programmati monitorati con settore diverso",
TRUE ~ "CHK"))
# editing
report <- appo1 %>%
left_join(octk::info_psc %>%
select(ID_PSC, TIPO_AR),
by = "ID_PSC") %>%
select(ID_PSC, TIPO_AR, KPI, KPI_DESCR, N, RISORSE, RISORSE_MONIT, PESO)
if (export == TRUE) {
# OLD:
# write.xlsx(report, file.path(OUTPUT, "report_data_quality_psc.xlsx"))
wb <- createWorkbook()
addWorksheet(wb, sheetName="report")
addWorksheet(wb, sheetName="metadati")
writeData(wb, sheet = "report", x = report, colNames = TRUE)
writeData(wb, sheet = "metadati", x = metadati, colNames = TRUE)
saveWorkbook(wb, file = file.path(OUTPUT, paste0("report_data_quality_psc_", bimestre, ".xlsx")), overwrite = TRUE)
}
return(report)
}
#' Ranking qualità dati PSC
#'
#' Ranking qualità dati PSC
#'
#' @param report Report di analisi qualità dati da report_data_quality_psc()
#' @param export Vuoi esportare il file in OUTPUT?
#' @return Dataframe
ranking_data_quality_psc <- function(report, export=TRUE) {
# TODO:
# rivedere metadati
# carica metadati
metadati <- read_xlsx(file.path(INPUT, "metadati_quality.xlsx"))
temp <- report %>%
pivot_wider(id_cols = c("ID_PSC", "TIPO_AR"), names_from = "KPI", values_from = "PESO", values_fill = 0)
appo0 <- report %>%
filter(KPI == "TOTALE") %>%
select(ID_PSC, RISORSE) %>%
left_join(temp, by = "ID_PSC")
# fix colonne mancanti
if (!("NO PSC" %in% names(appo0))) {
appo0 <- appo0 %>%
mutate(`NO PSC` = 0)
}
appo1 <- appo0 %>%
mutate(x_match = `MONIT OK`,
x_nolista = 1-`NO PSC`,
x_imp = 1-`NO IMPEGNI`,
x_iter = 1-`NO ITER`,
x_ciclo = 1-`NO CICLO`,
x_tema = 1-`NO TEMA`) %>%
mutate(quality_index = 0.70*x_match + 0.20*x_nolista + 0.025*x_imp + 0.025*x_iter + 0.025*x_ciclo + 0.025*x_tema) %>%
select(ID_PSC, TIPO_AR, RISORSE, x_match, x_nolista, x_imp, x_iter, x_ciclo, x_tema, quality_index) %>%
arrange(desc(quality_index))
ranking <- appo1
# export
if (export == TRUE) {
wb <- createWorkbook()
addWorksheet(wb, sheetName="report")
addWorksheet(wb, sheetName="metadati")
writeData(wb, sheet = "report", x = ranking, colNames = TRUE)
writeData(wb, sheet = "metadati", x = metadati, colNames = TRUE)
saveWorkbook(wb, file = file.path(OUTPUT, paste0("ranking_data_quality_psc_", bimestre, ".xlsx")), overwrite = TRUE)
}
return(ranking)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.