diff --git a/sigla-backend/src/main/resources/csv/configurazione_cnr_abi_banca_italia.csv b/sigla-backend/src/main/resources/csv/configurazione_cnr_abi_banca_italia.csv index 5e01d88cf5..34e762bc06 100644 --- a/sigla-backend/src/main/resources/csv/configurazione_cnr_abi_banca_italia.csv +++ b/sigla-backend/src/main/resources/csv/configurazione_cnr_abi_banca_italia.csv @@ -1,2 +1,2 @@ "esercizio","cd_unita_funzionale","cd_chiave_primaria","cd_chiave_secondaria","val01","val02","val03","val04","im01","im02","dt01","dt02","dacr","utcr","duva","utuv","pg_ver_rec" -"0","*","BANCAITALIA","ABI","01000","null","null","null","2019","null","null","null","2019-01-11","CED","2019-01-11","CED","1" \ No newline at end of file +"0","*","CONTO_CORRENTE_SPECIALE","BANCA_ITALIA","01000","null","null","null","null","null","null","null","2019-01-11","CED","2019-01-11","CED","1" \ No newline at end of file diff --git a/sigla-backend/src/main/resources/csv/configurazione_cnr_piano_economico.csv b/sigla-backend/src/main/resources/csv/configurazione_cnr_piano_economico.csv index e4ad9b90a3..dde740c37f 100644 --- a/sigla-backend/src/main/resources/csv/configurazione_cnr_piano_economico.csv +++ b/sigla-backend/src/main/resources/csv/configurazione_cnr_piano_economico.csv @@ -1,3 +1,3 @@ "esercizio","cd_unita_funzionale","cd_chiave_primaria","cd_chiave_secondaria","val01","val02","val03","val04","im01","im02","dt01","dt02","dacr","utcr","duva","utuv","pg_ver_rec" -"0","*","PROGETTI","NATURA_REIMPIEGO","6","null","null","null","2019","null","null","null","2019-01-11","CED","2019-01-11","CED","1" -"0","*","ELEMENTO_VOCE_SPECIALE","TEMPO_IND_SU_PROGETTI_FINANZIATI","11048","null","null","null","2019","null","null","null","2019-01-11","CED","2019-01-11","CED","1" \ No newline at end of file +"0","*","PROGETTI","NATURA_REIMPIEGO","6","null","null","null","null","null","null","null","2019-01-11","CED","2019-01-11","CED","1" +"0","*","ELEMENTO_VOCE_SPECIALE","TEMPO_IND_SU_PROGETTI_FINANZIATI","11048","null","null","null","null","null","null","null","2019-01-11","CED","2019-01-11","CED","1" \ No newline at end of file diff --git a/sigla-backend/src/main/resources/expsigladb/View/V_SALDI_PIANO_ECONOM_PROGETTO.sql b/sigla-backend/src/main/resources/expsigladb/View/V_SALDI_PIANO_ECONOM_PROGETTO.sql index 02bb66174c..aa5c6abf81 100644 --- a/sigla-backend/src/main/resources/expsigladb/View/V_SALDI_PIANO_ECONOM_PROGETTO.sql +++ b/sigla-backend/src/main/resources/expsigladb/View/V_SALDI_PIANO_ECONOM_PROGETTO.sql @@ -16,15 +16,6 @@ SUM (x.impacc) impacc, SUM (x.manris) manris FROM (SELECT a.pg_progetto, a.esercizio_piano esercizio, - a.cd_unita_organizzativa cd_unita_piano, a.cd_voce_piano, - 'E' ti_gestione, NVL(a.im_entrata, 0) importo_fin, - 0 stanziamento_fin, 0 variapiu_fin, 0 variameno_fin, - 0 importo_cofin, - 0 stanziamento_cofin, 0 variapiu_cofin, 0 variameno_cofin, - 0 impacc, 0 manris - FROM progetto_piano_economico a - UNION ALL - SELECT a.pg_progetto, a.esercizio_piano esercizio, a.cd_unita_organizzativa cd_unita_piano, a.cd_voce_piano, 'S' ti_gestione, NVL(a.im_spesa_finanziato, 0) importo_fin, 0 stanziamento_fin, 0 variapiu_fin, 0 variameno_fin, @@ -33,18 +24,7 @@ 0 impacc, 0 manris FROM progetto_piano_economico a UNION ALL - --IMPORTI PER ANNO 0 - SELECT a.pg_progetto, b.esercizio_piano, a.cd_unita_piano, - a.cd_voce_piano, 'E' ti_gestione, - 0 importo_fin, NVL (a.im_entrata, 0) stanziamento_fin, - 0 variapiu_fin, 0 variameno_fin, - 0 importo_cofin, 0 stanziamento_cofin, - 0 variapiu_cofin, 0 variameno_cofin, 0 impacc, 0 manris - FROM pdg_modulo_entrate a, progetto_piano_economico b - WHERE a.pg_progetto = b.pg_progetto - AND b.esercizio_piano = 0 - UNION ALL - SELECT a.pg_progetto, b.esercizio_piano, a.cd_unita_piano, + SELECT a.pg_progetto, a.esercizio, a.cd_unita_piano, a.cd_voce_piano, 'S' ti_gestione, 0 importo_fin, NVL(a.im_spese_gest_decentrata_est, 0) stanziamento_fin, @@ -52,67 +32,43 @@ 0 importo_cofin, NVL (a.im_spese_gest_decentrata_int, 0) stanziamento_cofin, 0 variapiu_cofin, 0 variameno_cofin, 0 impacc, 0 manris - FROM pdg_modulo_spese a, progetto_piano_economico b - WHERE a.pg_progetto = b.pg_progetto - AND b.esercizio_piano = 0 + FROM pdg_modulo_spese a + WHERE a.cd_unita_piano is not null + AND a.cd_voce_piano is not null UNION ALL - SELECT c.pg_progetto, 0 esercizio, d.cd_unita_organizzativa, - d.cd_voce_piano, b.ti_gestione, + SELECT c.pg_progetto, a.esercizio, d.cd_unita_organizzativa, + d.cd_voce_piano, b.ti_gestione, 0 importo_fin, 0 stanziamento_fin, CASE - WHEN b.ti_gestione = 'E' - THEN CASE - WHEN NVL(b.im_entrata, 0) > 0 - THEN NVL(b.im_entrata, 0) - ELSE 0 - END - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_est, 0) > 0 - THEN NVL(b.im_spese_gest_decentrata_est, 0) - ELSE 0 - END + WHEN NVL(b.im_spese_gest_decentrata_est, 0) > 0 + THEN NVL(b.im_spese_gest_decentrata_est, 0) + ELSE 0 END variapiu_fin, CASE - WHEN b.ti_gestione = 'E' - THEN CASE - WHEN NVL(b.im_entrata, 0) < 0 - THEN NVL(b.im_entrata, 0) - ELSE 0 - END - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_est, 0) < 0 - THEN ABS(NVL(b.im_spese_gest_decentrata_est, 0)) - ELSE CASE - WHEN NVL (b.im_spese_gest_accentrata_est, 0) > 0 - THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, - NVL(b.im_spese_gest_accentrata_est, 0), 0) - ELSE 0 - END - END + WHEN NVL(b.im_spese_gest_decentrata_est, 0) < 0 + THEN ABS(NVL(b.im_spese_gest_decentrata_est, 0)) + ELSE CASE + WHEN NVL (b.im_spese_gest_accentrata_est, 0) > 0 + THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, + NVL(b.im_spese_gest_accentrata_est, 0), 0) + ELSE 0 + END END variameno_fin, 0 importo_cofin, 0 stanziamento_cofin, CASE - WHEN b.ti_gestione = 'E' - THEN 0 - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_int, 0) > 0 - THEN NVL(b.im_spese_gest_decentrata_int, 0) - ELSE 0 - END + WHEN NVL(b.im_spese_gest_decentrata_int, 0) > 0 + THEN NVL(b.im_spese_gest_decentrata_int, 0) + ELSE 0 END variapiu_cofin, CASE - WHEN b.ti_gestione = 'E' - THEN 0 - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_int, 0) < 0 - THEN ABS(NVL(b.im_spese_gest_decentrata_int, 0)) - ELSE CASE - WHEN NVL (b.im_spese_gest_accentrata_int, 0) > 0 - THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, - NVL(b.im_spese_gest_accentrata_int, 0), 0) - ELSE 0 - END - END + WHEN NVL(b.im_spese_gest_decentrata_int, 0) < 0 + THEN ABS(NVL(b.im_spese_gest_decentrata_int, 0)) + ELSE CASE + WHEN NVL (b.im_spese_gest_accentrata_int, 0) > 0 + THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, + NVL(b.im_spese_gest_accentrata_int, 0), 0) + ELSE 0 + END END variameno_cofin, 0 impacc, 0 manris FROM pdg_variazione a, @@ -122,177 +78,59 @@ WHERE a.esercizio = b.esercizio AND a.pg_variazione_pdg = b.pg_variazione_pdg AND a.stato IN ('APP', 'APF') + AND a.ti_gestione = 'S' AND b.esercizio = c.esercizio AND b.cd_cdr_assegnatario = c.cd_centro_responsabilita AND b.cd_linea_attivita = c.cd_linea_attivita AND c.pg_progetto = d.pg_progetto - AND d.esercizio_piano = 0 + AND d.esercizio_piano = b.esercizio AND d.esercizio_voce = b.esercizio AND d.ti_appartenenza = b.ti_appartenenza AND d.ti_gestione = b.ti_gestione AND d.cd_elemento_voce = b.cd_elemento_voce + AND c.cd_natura not in (select val01 from configurazione_cnr e + where e.esercizio = a.esercizio + and e.cd_unita_funzionale = '*' + and e.cd_chiave_primaria = 'ELEMENTO_VOCE_SPECIALE' + and e.cd_chiave_secondaria = 'TEMPO_IND_SU_PROGETTI_FINANZIATI') UNION ALL - SELECT c.pg_progetto, 0 esercizio_res, d.cd_unita_organizzativa, - d.cd_voce_piano, b.ti_gestione, + SELECT c.pg_progetto, a.esercizio, d.cd_unita_organizzativa, + d.cd_voce_piano, b.ti_gestione, 0 importo_fin, 0 stanziamento_fin, - CASE - WHEN a.tipologia_fin='FES' - THEN CASE - WHEN NVL(b.im_variazione, 0) > 0 - THEN NVL(b.im_variazione, 0) - ELSE 0 - END - END variapiu_fin, - CASE - WHEN a.tipologia_fin='FES' - THEN CASE - WHEN NVL(b.im_variazione, 0) < 0 - THEN ABS(NVL (b.im_variazione, 0)) - ELSE 0 - END - END variameno_fin, + 0 variapiu_fin, + 0 variameno_fin, 0 importo_cofin, 0 stanziamento_cofin, CASE - WHEN a.tipologia_fin='FIN' - THEN CASE - WHEN NVL(b.im_variazione, 0) > 0 - THEN NVL(b.im_variazione, 0) - ELSE 0 - END + WHEN NVL(b.im_spese_gest_decentrata_est, 0) > 0 + THEN NVL(b.im_spese_gest_decentrata_est, 0) + ELSE 0 + END + + + CASE + WHEN NVL(b.im_spese_gest_decentrata_int, 0) > 0 + THEN NVL(b.im_spese_gest_decentrata_int, 0) + ELSE 0 END variapiu_cofin, CASE - WHEN a.tipologia_fin='FIN' - THEN CASE - WHEN NVL(b.im_variazione, 0) < 0 - THEN ABS(NVL (b.im_variazione, 0)) + WHEN NVL(b.im_spese_gest_decentrata_est, 0) < 0 + THEN ABS(NVL(b.im_spese_gest_decentrata_est, 0)) + ELSE CASE + WHEN NVL (b.im_spese_gest_accentrata_est, 0) > 0 + THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, + NVL(b.im_spese_gest_accentrata_est, 0), 0) ELSE 0 END - END variameno_cofin, - 0 impacc, 0 manris - FROM var_stanz_res a, - var_stanz_res_riga b, - v_linea_attivita_valida c, - ass_progetto_piaeco_voce d - WHERE a.esercizio = b.esercizio - AND a.pg_variazione = b.pg_variazione - AND a.stato IN ('APP', 'APF') - AND b.esercizio = c.esercizio - AND b.cd_cdr = c.cd_centro_responsabilita - AND b.cd_linea_attivita = c.cd_linea_attivita - AND c.pg_progetto = d.pg_progetto - AND d.esercizio_piano = 0 - AND d.esercizio_voce = b.esercizio_res - AND d.ti_appartenenza = b.ti_appartenenza - AND d.ti_gestione = b.ti_gestione - AND d.cd_elemento_voce = b.cd_elemento_voce - UNION ALL - SELECT b.pg_progetto, 0 esercizio_res, c.cd_unita_organizzativa, - c.cd_voce_piano, a.ti_gestione, - 0 importo_fin, 0 stanziamento_fin, - 0 variapiu_fin, 0 variameno_fin, - 0 importo_cofin, 0 stanziamento_cofin, - 0 variapiu_cofin, 0 variameno_cofin, + END + + CASE - WHEN a.ESERCIZIO = a.ESERCIZIO_RES - THEN NVL(a.IM_OBBL_ACC_COMP, 0) - ELSE NVL(a.IM_OBBL_RES_IMP, 0) + - NVL(a.VAR_PIU_OBBL_RES_IMP, 0) - NVL(a.VAR_MENO_OBBL_RES_IMP, 0) + - NVL(a.VAR_PIU_OBBL_RES_PRO, 0) - NVL(a.VAR_MENO_OBBL_RES_PRO, 0) - END impacc, - NVL(a.IM_MANDATI_REVERSALI_PRO, 0) + NVL(a.IM_MANDATI_REVERSALI_IMP, 0) manris - FROM voce_f_saldi_cdr_linea a, - v_linea_attivita_valida b, - ass_progetto_piaeco_voce c - WHERE a.esercizio = b.esercizio - AND a.cd_centro_responsabilita = b.cd_centro_responsabilita - AND a.cd_linea_attivita = b.cd_linea_attivita - AND b.pg_progetto = c.pg_progetto - AND c.esercizio_piano = 0 - AND c.esercizio_voce = a.esercizio_res - AND c.ti_appartenenza = a.ti_appartenenza - AND c.ti_gestione = a.ti_gestione - AND c.cd_elemento_voce = a.cd_elemento_voce - UNION ALL - --IMPORTI PER ANNO != 0 - SELECT a.pg_progetto, a.esercizio, a.cd_unita_piano, - a.cd_voce_piano, 'E' ti_gestione, - 0 importo_fin, NVL (a.im_entrata, 0) stanziamento_fin, - 0 variapiu_fin, 0 variameno_fin, - 0 importo_cofin, 0 stanziamento_cofin, - 0 variapiu_cofin, 0 variameno_cofin, 0 impacc, 0 manris - FROM pdg_modulo_entrate a - WHERE a.cd_unita_piano is not null - AND a.cd_voce_piano is not null - UNION ALL - SELECT a.pg_progetto, a.esercizio, a.cd_unita_piano, - a.cd_voce_piano, 'S' ti_gestione, - 0 importo_fin, - NVL(a.im_spese_gest_decentrata_est, 0) stanziamento_fin, - 0 variapiu_fin, 0 variameno_fin, - 0 importo_cofin, - NVL (a.im_spese_gest_decentrata_int, 0) stanziamento_cofin, - 0 variapiu_cofin, 0 variameno_cofin, 0 impacc, 0 manris - FROM pdg_modulo_spese a - WHERE a.cd_unita_piano is not null - AND a.cd_voce_piano is not null - UNION ALL - SELECT c.pg_progetto, a.esercizio, d.cd_unita_organizzativa, - d.cd_voce_piano, b.ti_gestione, - 0 importo_fin, 0 stanziamento_fin, - CASE - WHEN b.ti_gestione = 'E' - THEN CASE - WHEN NVL(b.im_entrata, 0) > 0 - THEN NVL(b.im_entrata, 0) - ELSE 0 - END - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_est, 0) > 0 - THEN NVL(b.im_spese_gest_decentrata_est, 0) - ELSE 0 - END - END variapiu_fin, - CASE - WHEN b.ti_gestione = 'E' - THEN CASE - WHEN NVL(b.im_entrata, 0) < 0 - THEN NVL(b.im_entrata, 0) - ELSE 0 - END - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_est, 0) < 0 - THEN ABS(NVL(b.im_spese_gest_decentrata_est, 0)) - ELSE CASE - WHEN NVL (b.im_spese_gest_accentrata_est, 0) > 0 - THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, - NVL(b.im_spese_gest_accentrata_est, 0), 0) - ELSE 0 - END - END - END variameno_fin, - 0 importo_cofin, 0 stanziamento_cofin, - CASE - WHEN b.ti_gestione = 'E' - THEN 0 - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_int, 0) > 0 - THEN NVL(b.im_spese_gest_decentrata_int, 0) - ELSE 0 - END - END variapiu_cofin, - CASE - WHEN b.ti_gestione = 'E' - THEN 0 - ELSE CASE - WHEN NVL(b.im_spese_gest_decentrata_int, 0) < 0 - THEN ABS(NVL(b.im_spese_gest_decentrata_int, 0)) - ELSE CASE - WHEN NVL (b.im_spese_gest_accentrata_int, 0) > 0 - THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, - NVL(b.im_spese_gest_accentrata_int, 0), 0) - ELSE 0 - END - END + WHEN NVL(b.im_spese_gest_decentrata_int, 0) < 0 + THEN ABS(NVL(b.im_spese_gest_decentrata_int, 0)) + ELSE CASE + WHEN NVL (b.im_spese_gest_accentrata_int, 0) > 0 + THEN DECODE (b.cd_cdr_assegnatario_clgs, NULL, + NVL(b.im_spese_gest_accentrata_int, 0), 0) + ELSE 0 + END END variameno_cofin, 0 impacc, 0 manris FROM pdg_variazione a, @@ -302,6 +140,7 @@ WHERE a.esercizio = b.esercizio AND a.pg_variazione_pdg = b.pg_variazione_pdg AND a.stato IN ('APP', 'APF') + AND a.ti_gestione = 'S' AND b.esercizio = c.esercizio AND b.cd_cdr_assegnatario = c.cd_centro_responsabilita AND b.cd_linea_attivita = c.cd_linea_attivita @@ -311,6 +150,11 @@ AND d.ti_appartenenza = b.ti_appartenenza AND d.ti_gestione = b.ti_gestione AND d.cd_elemento_voce = b.cd_elemento_voce + AND c.cd_natura in (select val01 from configurazione_cnr e + where e.esercizio = a.esercizio + and e.cd_unita_funzionale = '*' + and e.cd_chiave_primaria = 'ELEMENTO_VOCE_SPECIALE' + and e.cd_chiave_secondaria = 'TEMPO_IND_SU_PROGETTI_FINANZIATI') UNION ALL SELECT c.pg_progetto, a.esercizio_res, d.cd_unita_organizzativa, d.cd_voce_piano, b.ti_gestione, @@ -356,6 +200,47 @@ WHERE a.esercizio = b.esercizio AND a.pg_variazione = b.pg_variazione AND a.stato IN ('APP', 'APF') + AND b.ti_gestione = 'S' + AND b.esercizio = c.esercizio + AND b.cd_cdr = c.cd_centro_responsabilita + AND b.cd_linea_attivita = c.cd_linea_attivita + AND c.pg_progetto = d.pg_progetto + AND d.esercizio_piano = b.esercizio_res + AND d.esercizio_voce = b.esercizio_res + AND d.ti_appartenenza = b.ti_appartenenza + AND d.ti_gestione = b.ti_gestione + AND d.cd_elemento_voce = b.cd_elemento_voce + AND c.cd_natura not in (select val01 from configurazione_cnr e + where e.esercizio = a.esercizio + and e.cd_unita_funzionale = '*' + and e.cd_chiave_primaria = 'ELEMENTO_VOCE_SPECIALE' + and e.cd_chiave_secondaria = 'TEMPO_IND_SU_PROGETTI_FINANZIATI') + UNION ALL + SELECT c.pg_progetto, a.esercizio_res, d.cd_unita_organizzativa, + d.cd_voce_piano, b.ti_gestione, + 0 importo_fin, 0 stanziamento_fin, + 0 variapiu_fin, + 0 variameno_fin, + 0 importo_cofin, 0 stanziamento_cofin, + CASE + WHEN NVL(b.im_variazione, 0) > 0 + THEN NVL(b.im_variazione, 0) + ELSE 0 + END variapiu_cofin, + CASE + WHEN NVL(b.im_variazione, 0) < 0 + THEN ABS(NVL (b.im_variazione, 0)) + ELSE 0 + END variameno_cofin, + 0 impacc, 0 manris + FROM var_stanz_res a, + var_stanz_res_riga b, + v_linea_attivita_valida c, + ass_progetto_piaeco_voce d + WHERE a.esercizio = b.esercizio + AND a.pg_variazione = b.pg_variazione + AND a.stato IN ('APP', 'APF') + AND b.ti_gestione = 'S' AND b.esercizio = c.esercizio AND b.cd_cdr = c.cd_centro_responsabilita AND b.cd_linea_attivita = c.cd_linea_attivita @@ -365,6 +250,11 @@ AND d.ti_appartenenza = b.ti_appartenenza AND d.ti_gestione = b.ti_gestione AND d.cd_elemento_voce = b.cd_elemento_voce + AND c.cd_natura in (select val01 from configurazione_cnr e + where e.esercizio = a.esercizio + and e.cd_unita_funzionale = '*' + and e.cd_chiave_primaria = 'ELEMENTO_VOCE_SPECIALE' + and e.cd_chiave_secondaria = 'TEMPO_IND_SU_PROGETTI_FINANZIATI') UNION ALL SELECT b.pg_progetto, a.esercizio_res, c.cd_unita_organizzativa, c.cd_voce_piano, a.ti_gestione, diff --git a/sigla-ejb/src/main/java/it/cnr/contab/config00/bulk/Configurazione_cnrBulk.java b/sigla-ejb/src/main/java/it/cnr/contab/config00/bulk/Configurazione_cnrBulk.java index fc746daba3..87168355dd 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/config00/bulk/Configurazione_cnrBulk.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/config00/bulk/Configurazione_cnrBulk.java @@ -33,6 +33,7 @@ public class Configurazione_cnrBulk extends Configurazione_cnrBase { public final static String PK_ELEMENTO_VOCE_SPECIALE = "ELEMENTO_VOCE_SPECIALE"; public final static String SK_VOCE_IVA_FATTURA_ESTERA = "VOCE_IVA_FATTURA_ESTERA"; + public final static String SK_TEMPO_IND_SU_PROGETTI_FINANZIATI = "TEMPO_IND_SU_PROGETTI_FINANZIATI"; public final static String PK_CONTO_CORRENTE_SPECIALE = "CONTO_CORRENTE_SPECIALE"; public final static String SK_ENTE = "ENTE"; @@ -98,6 +99,7 @@ public class Configurazione_cnrBulk extends Configurazione_cnrBase { public final static String PK_GESTIONE_PROGETTI = "PROGETTI"; public final static String SK_PROGETTO_PIANO_ECONOMICO = "PIANO_ECONOMICO"; + public final static String SK_NATURA_REIMPIEGO = "NATURA_REIMPIEGO"; public final static String PK_FLUSSO_ORDINATIVI = "FLUSSO_ORDINATIVI"; public final static String SK_CODICE_ABI_BT = "CODICE_ABI_BT"; diff --git a/sigla-ejb/src/main/java/it/cnr/contab/config00/pdcfin/bulk/NaturaBulk.java b/sigla-ejb/src/main/java/it/cnr/contab/config00/pdcfin/bulk/NaturaBulk.java index 563cc31402..e1050ddaa6 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/config00/pdcfin/bulk/NaturaBulk.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/config00/pdcfin/bulk/NaturaBulk.java @@ -1,6 +1,7 @@ package it.cnr.contab.config00.pdcfin.bulk; import java.util.Dictionary; +import java.util.Optional; import it.cnr.jada.bulk.*; import it.cnr.jada.persistency.*; @@ -36,12 +37,18 @@ public boolean equals(Object obj) { } return super.equals(obj); } -/** - * Restituisce il valore della proprietà 'cd_ds_natura' - * - * @return Il valore della proprietà 'cd_ds_natura' - */ -public String getCd_ds_natura() { - return getCd_natura() + " - " + getDs_natura(); -} -} + /** + * Restituisce il valore della proprietà 'cd_ds_natura' + * + * @return Il valore della proprietà 'cd_ds_natura' + */ + public String getCd_ds_natura() { + return getCd_natura() + " - " + getDs_natura(); + } + public boolean isFonteInterna() { + return NaturaBulk.TIPO_NATURA_FONTI_INTERNE.equals(this.getTipo()); + } + public boolean isFonteEsterna() { + return NaturaBulk.TIPO_NATURA_FONTI_ESTERNE.equals(this.getTipo()); + } +} \ No newline at end of file diff --git a/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/ObbligazioneComponent.java b/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/ObbligazioneComponent.java index 3848ccf850..693c82a5e4 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/ObbligazioneComponent.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/ObbligazioneComponent.java @@ -86,6 +86,7 @@ import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk; import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cmpBulk; import it.cnr.contab.progettiric00.core.bulk.ProgettoBulk; +import it.cnr.contab.progettiric00.core.bulk.ProgettoHome; import it.cnr.contab.progettiric00.core.bulk.Progetto_other_fieldBulk; import it.cnr.contab.utenze00.bp.CNRUserContext; import it.cnr.contab.utenze00.bulk.UtenteBulk; @@ -1672,38 +1673,25 @@ private void validaCdrLineaVoce(UserContext userContext, ObbligazioneBulk obblig if (list.size()>1) throw new ApplicationException("Errore in fase di ricerca linea_attivita."); WorkpackageBulk linea = list.get(0); - ProgettoBulk progetto = (ProgettoBulk)getHome(userContext, ProgettoBulk.class).findByPrimaryKey(userContext, linea.getProgetto()); - Progetto_other_fieldBulk other = (Progetto_other_fieldBulk)getHome(userContext, Progetto_other_fieldBulk.class).findByPrimaryKey(new Progetto_other_fieldBulk(linea.getPg_progetto())); - if (Optional.ofNullable(other).isPresent()) { - if (Optional.ofNullable(other.getDtInizio()) - .map(el->{ - Calendar gc = GregorianCalendar.getInstance(); - gc.setTime(el); - return gc; - }) - .map(el->el.get(Calendar.YEAR)>CNRUserContext.getEsercizio(userContext)) - .orElse(Boolean.FALSE)) { - throw new ApplicationException("Attenzione! GAE "+latt+" non selezionabile. " - + "La data inizio ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(other.getDtInizio()) - + ") del progetto "+progetto.getCd_progetto()+" associato è successiva " - + "rispetto all'anno contabile di scrivania."); - } - if (Optional.ofNullable( - Optional.ofNullable(other.getDtProroga()).orElse(other.getDtFine())) - .map(el->{ - Calendar gc = GregorianCalendar.getInstance(); - gc.setTime(el); - return gc; - }) - .map(el->el.get(Calendar.YEAR)!dt.after(obbligazione.getDt_registrazione())) + .orElseThrow(()->new ApplicationException("Attenzione! GAE "+linea.getCd_linea_attivita()+" non selezionabile. " + + "La data inizio ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(progetto.getOtherField().getDtInizio()) + + ") del progetto "+progetto.getCd_progetto()+" associato è successiva " + + "rispetto alla data di registrazione dell'impegno ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(obbligazione.getDt_registrazione())+").")); + + Optional.ofNullable( + Optional.ofNullable(progetto.getOtherField().getDtProroga()).orElse(progetto.getOtherField().getDtFine())) + .filter(dt->!dt.before(obbligazione.getDt_registrazione())) + .orElseThrow(()->new ApplicationException("Attenzione! GAE "+linea.getCd_linea_attivita()+" non selezionabile. " + + "La data fine/proroga ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(Optional.ofNullable(progetto.getOtherField().getDtProroga()).orElse(progetto.getOtherField().getDtFine())) + ") del progetto "+progetto.getCd_progetto()+" associato è precedente " - + "rispetto all'anno contabile di scrivania."); - } + + "rispetto alla data di registrazione dell'impegno ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(obbligazione.getDt_registrazione())+").")); } } } diff --git a/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/SaldoComponent.java b/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/SaldoComponent.java index d68cce7812..2b52ac2b71 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/SaldoComponent.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/doccont00/comp/SaldoComponent.java @@ -14,6 +14,7 @@ import it.cnr.contab.config00.bulk.Parametri_cdsHome; import it.cnr.contab.config00.bulk.Parametri_cnrBulk; import it.cnr.contab.config00.bulk.Parametri_cnrHome; +import it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession; import it.cnr.contab.config00.esercizio.bulk.EsercizioBulk; import it.cnr.contab.config00.esercizio.bulk.EsercizioHome; import it.cnr.contab.config00.latt.bulk.CostantiTi_gestione; @@ -23,6 +24,7 @@ import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk; import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome; import it.cnr.contab.config00.pdcfin.bulk.IVoceBilancioBulk; +import it.cnr.contab.config00.pdcfin.bulk.NaturaBulk; import it.cnr.contab.config00.pdcfin.bulk.Voce_fBulk; import it.cnr.contab.config00.sto.bulk.CdrBulk; import it.cnr.contab.config00.sto.bulk.CdrHome; @@ -38,6 +40,8 @@ import it.cnr.contab.prevent01.bulk.Pdg_modulo_costiBulk; import it.cnr.contab.prevent01.bulk.Pdg_modulo_costiHome; import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseBulk; +import it.cnr.contab.progettiric00.core.bulk.ProgettoBulk; +import it.cnr.contab.progettiric00.core.bulk.ProgettoHome; import it.cnr.contab.progettiric00.core.bulk.Progetto_piano_economicoBulk; import it.cnr.contab.progettiric00.core.bulk.Progetto_piano_economicoHome; import it.cnr.contab.progettiric00.core.bulk.TipoFinanziamentoBulk; @@ -1372,77 +1376,91 @@ public void checkDispPianoEconomicoProgetto(UserContext userContext, Pdg_variazi private String getMessaggioSfondamentoPianoEconomico(UserContext userContext, Pdg_variazioneBulk pdgVariazione, boolean locked) throws ComponentException{ String messaggio = ""; try { - it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession configSession = (it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Configurazione_cnrComponentSession", it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession.class); - BigDecimal annoFrom = configSession.getIm01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_PROGETTO_PIANO_ECONOMICO); - if (Optional.ofNullable(annoFrom).map(BigDecimal::intValue).filter(el->el.compareTo(pdgVariazione.getEsercizio())<=0).isPresent()) { + Configurazione_cnrComponentSession configSession = (Configurazione_cnrComponentSession)Utility.createConfigurazioneCnrComponentSession(); + String cdNaturaReimpiego = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO); + BigDecimal annoFrom = configSession.getIm01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_PROGETTO_PIANO_ECONOMICO); + + if (Optional.ofNullable(annoFrom).map(BigDecimal::intValue).filter(el->el.compareTo(pdgVariazione.getEsercizio())<=0).isPresent()) { Pdg_variazioneHome detHome = (Pdg_variazioneHome)getHome(userContext,Pdg_variazioneBulk.class); - for (java.util.Iterator dett = detHome.findDettagliVariazioneGestionale(pdgVariazione).iterator();dett.hasNext();){ + for (java.util.Iterator dett = detHome.findDettagliSpesaVariazioneGestionale(pdgVariazione).iterator();dett.hasNext();){ Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)dett.next(); WorkpackageBulk linea_attivita = (WorkpackageBulk)((it.cnr.contab.config00.ejb.Linea_attivitaComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB( "CNRCONFIG00_EJB_Linea_attivitaComponentSession", it.cnr.contab.config00.ejb.Linea_attivitaComponentSession.class) ).inizializzaBulkPerModifica(userContext, rigaVar.getLinea_attivita()); - - List pianoEconomicoList = (List)((Progetto_piano_economicoHome)getHome(userContext,Progetto_piano_economicoBulk.class)).findProgettoPianoEconomicoList(pdgVariazione.getEsercizio(), linea_attivita.getProgetto2016().getPg_progetto(), rigaVar.getElemento_voce()); - for (Progetto_piano_economicoBulk e : pianoEconomicoList) { - if (e.getFl_ctrl_disp() && - (e.getEsercizio_piano().equals(0) || e.getEsercizio_piano().equals(rigaVar.getEsercizio()))) { - try { - if (locked) { - Progetto_piano_economicoBulk bulkToFind = new Progetto_piano_economicoBulk(); - bulkToFind.setVoce_piano_economico(e.getVoce_piano_economico()); - bulkToFind.setPg_progetto(e.getPg_progetto()); - bulkToFind.setEsercizio_piano(e.getEsercizio_piano()); - try { - bulkToFind = (Progetto_piano_economicoBulk) getHome( userContext,Progetto_piano_economicoBulk.class ).findAndLock(bulkToFind); - } catch (ObjectNotFoundException ex) { - } - } - - V_saldi_piano_econom_progettoBulk saldo = ((V_saldi_piano_econom_progettoHome)getHome( userContext,V_saldi_piano_econom_progettoBulk.class )). - cercaSaldoPianoEconomico(e, "S"); - - BigDecimal imVariazioneFin = BigDecimal.ZERO; - if (rigaVar.getTi_gestione()!=null && rigaVar.getTi_gestione().equals(Elemento_voceHome.GESTIONE_ENTRATE)) - imVariazioneFin = rigaVar.getIm_entrata(); - else if (rigaVar.getTi_gestione()!=null && rigaVar.getTi_gestione().equals(Elemento_voceHome.GESTIONE_SPESE)) - imVariazioneFin = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_est()); - - BigDecimal dispResiduaFin = saldo.getDispResiduaFinanziamento().subtract(imVariazioneFin); - if (dispResiduaFin.compareTo(BigDecimal.ZERO)<0) { - if (messaggio!=null && messaggio.length()>0) - messaggio = messaggio+ "\n"; - messaggio = messaggio + - "La disponibilità quota finanziata del piano economico "+e.getCd_voce_piano()+ - " associato al progetto"+(e.getEsercizio_piano().equals(0)?"":" per l'esercizio "+e.getEsercizio_piano())+ - " per la Voce " + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + - " non è sufficiente a coprire la variazione che risulta di " + - new it.cnr.contab.util.EuroFormat().format(imVariazioneFin) + ".\n"; - } - - BigDecimal imVariazioneCofin = BigDecimal.ZERO; - if (rigaVar.getTi_gestione()!=null && rigaVar.getTi_gestione().equals(Elemento_voceHome.GESTIONE_SPESE)) - imVariazioneCofin = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_int()); - - BigDecimal dispResiduaCofin = saldo.getDispResiduaCofinanziamento().subtract(imVariazioneCofin); - if (dispResiduaCofin.compareTo(BigDecimal.ZERO)<0) { - if (messaggio!=null && messaggio.length()>0) - messaggio = messaggio+ "\n"; - messaggio = messaggio + - "La disponibilità quota cofinanziata del piano economico "+e.getCd_voce_piano()+ - " associato al progetto"+(e.getEsercizio_piano().equals(0)?"":" per l'esercizio "+e.getEsercizio_piano())+ - " per la Voce " + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + - " non è sufficiente a coprire la variazione che risulta di " + - new it.cnr.contab.util.EuroFormat().format(imVariazioneCofin) + ".\n"; - } - } - catch (Exception ex ) - { - throw new RuntimeException( ex ); - } - } - } + + boolean isNaturaReimpiego = Optional.ofNullable(cdNaturaReimpiego).map(el->el.equals(linea_attivita.getNatura().getCd_natura())) + .orElse(Boolean.FALSE); + + //recupero il progetto per verificare se è scaduto + ProgettoHome home = (ProgettoHome)getHome(userContext, ProgettoBulk.class); + home.setFetchPolicy("it.cnr.contab.progettiric00.comp.ProgettoRicercaComponent.find"); + ProgettoBulk progetto = (ProgettoBulk)home.findByPrimaryKey(linea_attivita.getProgetto2016()); + getHomeCache(userContext).fetchAll(userContext); + + if (progetto.isPianoEconomicoRequired()) { + List pianoEconomicoList = (List)((Progetto_piano_economicoHome)getHome(userContext,Progetto_piano_economicoBulk.class)).findProgettoPianoEconomicoList(pdgVariazione.getEsercizio(), linea_attivita.getProgetto2016().getPg_progetto(), rigaVar.getElemento_voce()); + if (pianoEconomicoList==null || pianoEconomicoList.isEmpty()) + messaggio = messaggio + + "Non risulta essere stato imputato alcun valore nel piano economico del progetto per la Voce " + + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + ".\n"; + + for (Progetto_piano_economicoBulk e : pianoEconomicoList) { + if (e.getFl_ctrl_disp() && + (e.getEsercizio_piano().equals(0) || e.getEsercizio_piano().equals(rigaVar.getEsercizio()))) { + try { + if (locked) { + Progetto_piano_economicoBulk bulkToFind = new Progetto_piano_economicoBulk(); + bulkToFind.setVoce_piano_economico(e.getVoce_piano_economico()); + bulkToFind.setPg_progetto(e.getPg_progetto()); + bulkToFind.setEsercizio_piano(e.getEsercizio_piano()); + try { + bulkToFind = (Progetto_piano_economicoBulk) getHome( userContext,Progetto_piano_economicoBulk.class ).findAndLock(bulkToFind); + } catch (ObjectNotFoundException ex) { + } + } + + V_saldi_piano_econom_progettoBulk saldo = ((V_saldi_piano_econom_progettoHome)getHome( userContext,V_saldi_piano_econom_progettoBulk.class )). + cercaSaldoPianoEconomico(e, "S"); + + if (!isNaturaReimpiego) { + BigDecimal imVariazioneFin = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_est()); + BigDecimal dispResiduaFin = saldo.getDispResiduaFinanziamento().subtract(imVariazioneFin); + if (dispResiduaFin.compareTo(BigDecimal.ZERO)<0) { + if (messaggio!=null && messaggio.length()>0) + messaggio = messaggio+ "\n"; + messaggio = messaggio + + "La disponibilità quota finanziata del piano economico "+e.getCd_voce_piano()+ + " associato al progetto"+(e.getEsercizio_piano().equals(0)?"":" per l'esercizio "+e.getEsercizio_piano())+ + " per la Voce " + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + + " non è sufficiente a coprire la variazione che risulta di " + + new it.cnr.contab.util.EuroFormat().format(imVariazioneFin) + ".\n"; + } + } + + BigDecimal imVariazioneCofin = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_int()); + if (isNaturaReimpiego) + imVariazioneCofin = imVariazioneCofin.add(Utility.nvl(rigaVar.getIm_spese_gest_decentrata_est())); + BigDecimal dispResiduaCofin = saldo.getDispResiduaCofinanziamento().subtract(imVariazioneCofin); + if (dispResiduaCofin.compareTo(BigDecimal.ZERO)<0) { + if (messaggio!=null && messaggio.length()>0) + messaggio = messaggio+ "\n"; + messaggio = messaggio + + "La disponibilità quota cofinanziata del piano economico "+e.getCd_voce_piano()+ + " associato al progetto"+(e.getEsercizio_piano().equals(0)?"":" per l'esercizio "+e.getEsercizio_piano())+ + " per la Voce " + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + + " non è sufficiente a coprire la variazione che risulta di " + + new it.cnr.contab.util.EuroFormat().format(imVariazioneCofin) + ".\n"; + } + } + catch (Exception ex ) + { + throw new RuntimeException( ex ); + } + } + } + } } } }catch (PersistencyException e) { diff --git a/sigla-ejb/src/main/java/it/cnr/contab/pdg01/comp/CRUDPdgVariazioneGestionaleComponent.java b/sigla-ejb/src/main/java/it/cnr/contab/pdg01/comp/CRUDPdgVariazioneGestionaleComponent.java index a6524d425b..cc21719a10 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/pdg01/comp/CRUDPdgVariazioneGestionaleComponent.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/pdg01/comp/CRUDPdgVariazioneGestionaleComponent.java @@ -9,8 +9,13 @@ import java.math.BigDecimal; import java.rmi.RemoteException; import java.sql.SQLException; +import java.sql.Timestamp; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; import java.util.Iterator; +import java.util.List; import java.util.Optional; import javax.ejb.EJBException; @@ -50,6 +55,9 @@ import it.cnr.contab.prevent00.bulk.V_assestatoHome; import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk; import it.cnr.contab.prevent01.bulk.Pdg_esercizioBulk; +import it.cnr.contab.progettiric00.core.bulk.ProgettoBulk; +import it.cnr.contab.progettiric00.core.bulk.ProgettoHome; +import it.cnr.contab.progettiric00.core.bulk.Progetto_other_fieldBulk; import it.cnr.contab.utenze00.bp.CNRUserContext; import it.cnr.contab.utenze00.bulk.UtenteBulk; import it.cnr.contab.utenze00.bulk.UtenteHome; @@ -57,9 +65,14 @@ import it.cnr.contab.utenze00.bulk.Utente_indirizzi_mailHome; import it.cnr.contab.util.ICancellatoLogicamente; import it.cnr.contab.util.Utility; +import it.cnr.contab.varstanz00.bulk.Ass_var_stanz_res_cdrBulk; +import it.cnr.contab.varstanz00.bulk.Ass_var_stanz_res_cdrHome; +import it.cnr.contab.varstanz00.bulk.Var_stanz_resBulk; +import it.cnr.contab.varstanz00.bulk.Var_stanz_res_rigaBulk; import it.cnr.jada.DetailedRuntimeException; import it.cnr.jada.UserContext; import it.cnr.jada.action.BusinessProcessException; +import it.cnr.jada.bulk.BulkHome; import it.cnr.jada.bulk.OggettoBulk; import it.cnr.jada.comp.ApplicationException; import it.cnr.jada.comp.ComponentException; @@ -68,6 +81,7 @@ import it.cnr.jada.persistency.IntrospectionException; import it.cnr.jada.persistency.PersistencyException; import it.cnr.jada.persistency.sql.CompoundFindClause; +import it.cnr.jada.persistency.sql.FindClause; import it.cnr.jada.persistency.sql.LoggableStatement; import it.cnr.jada.persistency.sql.SQLBuilder; import it.cnr.jada.persistency.sql.SQLExceptionHandler; @@ -77,6 +91,78 @@ import it.cnr.jada.util.ejb.EJBCommonServices; public class CRUDPdgVariazioneGestionaleComponent extends PdGVariazioniComponent { + private class CtrlPianoEco { + public CtrlPianoEco(ProgettoBulk progetto, Timestamp dtScadenza, boolean cashFund) { + super(); + this.progetto = progetto; + this.dtScadenza = dtScadenza; + this.cashFund = cashFund; + } + private ProgettoBulk progetto; + private Timestamp dtScadenza; + private boolean cashFund; + private BigDecimal impPositivi = BigDecimal.ZERO; + private BigDecimal impNegativi = BigDecimal.ZERO; + private BigDecimal impPositiviNaturaReimpiego = BigDecimal.ZERO; + private BigDecimal impNegativiNaturaReimpiego = BigDecimal.ZERO; + private BigDecimal impPositiviVoceSpeciale = BigDecimal.ZERO; + private BigDecimal impNegativiVoceSpeciale = BigDecimal.ZERO; + public ProgettoBulk getProgetto() { + return progetto; + } + public void setProgetto(ProgettoBulk progetto) { + this.progetto = progetto; + } + public Timestamp getDtScadenza() { + return dtScadenza; + } + public void setDtScadenza(Timestamp dtScadenza) { + this.dtScadenza = dtScadenza; + } + public boolean isCashFund() { + return cashFund; + } + public void setCashFund(boolean cashFund) { + this.cashFund = cashFund; + } + public BigDecimal getImpPositivi() { + return impPositivi; + } + public void setImpPositivi(BigDecimal impPositivi) { + this.impPositivi = impPositivi; + } + public BigDecimal getImpNegativi() { + return impNegativi; + } + public void setImpNegativi(BigDecimal impNegativi) { + this.impNegativi = impNegativi; + } + public BigDecimal getImpPositiviNaturaReimpiego() { + return impPositiviNaturaReimpiego; + } + public void setImpPositiviNaturaReimpiego(BigDecimal impPositiviNaturaReimpiego) { + this.impPositiviNaturaReimpiego = impPositiviNaturaReimpiego; + } + public BigDecimal getImpNegativiNaturaReimpiego() { + return impNegativiNaturaReimpiego; + } + public void setImpNegativiNaturaReimpiego(BigDecimal impNegativiNaturaReimpiego) { + this.impNegativiNaturaReimpiego = impNegativiNaturaReimpiego; + } + public BigDecimal getImpPositiviVoceSpeciale() { + return impPositiviVoceSpeciale; + } + public void setImpPositiviVoceSpeciale(BigDecimal impPositiviVoceSpeciale) { + this.impPositiviVoceSpeciale = impPositiviVoceSpeciale; + } + public BigDecimal getImpNegativiVoceSpeciale() { + return impNegativiVoceSpeciale; + } + public void setImpNegativiVoceSpeciale(BigDecimal impNegativiVoceSpeciale) { + this.impNegativiVoceSpeciale = impNegativiVoceSpeciale; + } + } + private static final java.math.BigDecimal ZERO = new java.math.BigDecimal(0); public CRUDPdgVariazioneGestionaleComponent() @@ -128,6 +214,7 @@ public Pdg_variazioneBulk salvaDefinitivo(UserContext userContext, Pdg_variazion if (!pdg.isStorno() && !pdg.getTipo_variazione().isMovimentoSuFondi()) controllaQuadraturaImportiAree(userContext, pdg); + controllaPdgPianoEconomico(userContext, pdg); aggiornaLimiteSpesa(userContext, pdg); /* * Verifico che l'assestato di tutte le combinazioni scelte sia positivo in modo da avvertire @@ -1305,4 +1392,213 @@ public it.cnr.jada.bulk.OggettoBulk statoPrecedente( aggiornaLimiteSpesa(userContext, var); return var; } + private void controllaPdgPianoEconomico(UserContext userContext, Pdg_variazioneBulk variazione) throws ComponentException{ + try { + if (Utility.createParametriEnteComponentSession().isProgettoPianoEconomicoEnabled(userContext, CNRUserContext.getEsercizio(userContext))) { + List listCtrlPianoEco = new ArrayList(); + + String cdNaturaReimpiego = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO); + String cdVoceSpeciale = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_ELEMENTO_VOCE_SPECIALE, Configurazione_cnrBulk.SK_TEMPO_IND_SU_PROGETTI_FINANZIATI); + + String cdrPersonale = Optional.ofNullable(((ObbligazioneHome)getHome(userContext, ObbligazioneBulk.class)).recupero_cdr_speciale_stipendi()) + .orElseThrow(() -> new ComponentException("Non è possibile individuare il codice CDR del Personale.")); + CdrBulk cdrPersonaleBulk = (CdrBulk)getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(cdrPersonale)); + + Ass_pdg_variazione_cdrHome ass_cdrHome = (Ass_pdg_variazione_cdrHome)getHome(userContext,Ass_pdg_variazione_cdrBulk.class); + java.util.Collection dettagliSpesa = ass_cdrHome.findDettagliSpesa(variazione); + + for (Pdg_variazione_riga_gestBulk varStanzRiga : dettagliSpesa) { + //verifico se si tratta di area + CdrBulk cdrBulk = (CdrBulk)getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(varStanzRiga.getCd_centro_responsabilita())); + Unita_organizzativaBulk uoBulk = (Unita_organizzativaBulk)getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cdrBulk.getCd_unita_organizzativa())); + boolean isUoArea = uoBulk.getCd_tipo_unita().equals(Tipo_unita_organizzativaHome.TIPO_UO_AREA); + + //verifico se si tratta di cdr Personale + boolean isDettPersonale = uoBulk.getCd_unita_organizzativa().equals(cdrPersonaleBulk.getCd_unita_organizzativa()); + if (!isDettPersonale) { + //verifico se si tratta di voce accentrata verso il personale + Elemento_voceBulk voce = (Elemento_voceBulk)getHome(userContext, Elemento_voceBulk.class).findByPrimaryKey(varStanzRiga.getElemento_voce()); + Classificazione_vociBulk classif = (Classificazione_vociBulk)getHome(userContext, Classificazione_vociBulk.class).findByPrimaryKey(new Classificazione_vociBulk(voce.getId_classificazione())); + isDettPersonale = classif.getFl_accentrato()&&cdrPersonale.equals(classif.getCdr_accentratore()); + } + + //recupero la GAE + BulkHome lattHome = getHome(userContext, WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA"); + SQLBuilder sql = lattHome.createSQLBuilder(); + + sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,varStanzRiga.getEsercizio()); + sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,varStanzRiga.getCd_centro_responsabilita()); + sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA",SQLBuilder.EQUALS,varStanzRiga.getCd_linea_attivita()); + + List listGAE = lattHome.fetchAll(sql); + + if (listGAE.isEmpty() || listGAE.size()>1) + throw new ApplicationException("Errore in fase di ricerca linea_attivita "+varStanzRiga.getEsercizio()+"/"+varStanzRiga.getCd_centro_responsabilita()+"/"+varStanzRiga.getCd_linea_attivita()+"."); + + WorkpackageBulk linea = listGAE.get(0); + + //recupero il progetto per verificare se è scaduto + ProgettoHome home = (ProgettoHome)getHome(userContext, ProgettoBulk.class); + home.setFetchPolicy("it.cnr.contab.progettiric00.comp.ProgettoRicercaComponent.find"); + ProgettoBulk progetto = (ProgettoBulk)home.findByPrimaryKey(linea.getProgetto()); + getHomeCache(userContext).fetchAll(userContext); + + //effettuo controlli sulla validità del progetto + Optional.ofNullable(progetto.getOtherField()).filter(Progetto_other_fieldBulk::isStatoApprovato) + .orElseThrow(()->new ApplicationException("Attenzione! Il progetto "+progetto.getCd_progetto() + + " non risulta in stato approvato. Variazione non consentita!")); + + Optional.ofNullable(progetto.getOtherField().getDtInizio()) + .filter(dt->!dt.after(variazione.getDt_chiusura())) + .orElseThrow(()->new ApplicationException("Attenzione! GAE "+linea.getCd_linea_attivita()+" non selezionabile. " + + "La data inizio ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(progetto.getOtherField().getDtInizio()) + + ") del progetto "+progetto.getCd_progetto()+" associato è successiva " + + "rispetto alla data di chiusura della variazione ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(variazione.getDt_chiusura())+").")); + + Timestamp dtScadenza = Optional.ofNullable( + Optional.ofNullable(progetto.getOtherField().getDtProroga()).orElse(progetto.getOtherField().getDtFine())) + .orElse(null); + + boolean isNaturaReimpiego = Optional.ofNullable(cdNaturaReimpiego).map(el->el.equals(linea.getNatura().getCd_natura())) + .orElse(Boolean.FALSE); + boolean isVoceSpeciale = Optional.ofNullable(cdVoceSpeciale).map(el->el.equals(linea.getNatura().getCd_natura())) + .orElse(Boolean.FALSE); + + boolean isCashFund = isNaturaReimpiego||isDettPersonale||isUoArea; + + //recupero il record se presente altrimenti ne creo uno nuovo + CtrlPianoEco pianoEco = listCtrlPianoEco.stream() + .filter(el->el.getProgetto().getPg_progetto().equals(progetto.getPg_progetto())) + .filter(el->isCashFund?el.isCashFund():!el.isCashFund()) + .findFirst() + .orElse(new CtrlPianoEco(progetto, dtScadenza, isCashFund)); + + if (varStanzRiga.getIm_variazione().compareTo(BigDecimal.ZERO)>0) { + pianoEco.setImpPositivi(pianoEco.getImpPositivi().add(varStanzRiga.getIm_variazione().abs())); + if (isNaturaReimpiego) + pianoEco.setImpPositiviNaturaReimpiego(pianoEco.getImpPositiviNaturaReimpiego().add(varStanzRiga.getIm_variazione().abs())); + if (isVoceSpeciale) + pianoEco.setImpPositiviVoceSpeciale(pianoEco.getImpPositiviVoceSpeciale().add(varStanzRiga.getIm_variazione().abs())); + } else { + pianoEco.setImpNegativi(pianoEco.getImpNegativi().add(varStanzRiga.getIm_variazione().abs())); + if (isNaturaReimpiego) + pianoEco.setImpNegativiNaturaReimpiego(pianoEco.getImpNegativiNaturaReimpiego().add(varStanzRiga.getIm_variazione().abs())); + if (isVoceSpeciale) + pianoEco.setImpNegativiVoceSpeciale(pianoEco.getImpNegativiVoceSpeciale().add(varStanzRiga.getIm_variazione().abs())); + } + + listCtrlPianoEco.add(pianoEco); + } + + /** + * 1. non è possibile attribuire fondi ad un progetto scaduto + */ + listCtrlPianoEco.stream() + .filter(el->Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpPositivi().compareTo(BigDecimal.ZERO)>0) + .findFirst().ifPresent(el->{ + throw new DetailedRuntimeException("Attenzione! Non è possibile attribuire fondi al progetto "+ + el.getProgetto().getCd_progetto()+ + " in quanto scaduto ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(el.getDtScadenza()) + + ") rispetto alla data di chiusura della variazione ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(variazione.getDt_chiusura())+").");}); + + BigDecimal impNegativiPrgScaduti = listCtrlPianoEco.stream() + .filter(el->Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpNegativi().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpNegativi) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + BigDecimal impPositiviCashFund = listCtrlPianoEco.stream() + .filter(CtrlPianoEco::isCashFund) + .map(CtrlPianoEco::getImpPositivi) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + BigDecimal impPositiviNaturaReimpiego = listCtrlPianoEco.stream() + .filter(CtrlPianoEco::isCashFund) + .filter(el->el.getImpPositiviNaturaReimpiego().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpPositiviNaturaReimpiego) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + /** + * 2. è possibile attribuire fondi ad un progetto di natura 6 solo se ne vengono sottratti equivalenti da: + * a. un progetto scaduto + * b. dalla voce speciale (11048) + */ + if (impPositiviNaturaReimpiego.compareTo(BigDecimal.ZERO)>0) { + BigDecimal impNegativiVoceSpecialePrgInCorso = listCtrlPianoEco.stream() + .filter(el->!Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpNegativiVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpNegativiVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + boolean existsPrgScaduti = impNegativiPrgScaduti.compareTo(BigDecimal.ZERO)>0; + boolean existsVoceSpeciale = impNegativiVoceSpecialePrgInCorso.compareTo(BigDecimal.ZERO)>0; + if (impPositiviNaturaReimpiego.compareTo(impNegativiPrgScaduti.add(impNegativiVoceSpecialePrgInCorso))!=0) + throw new ApplicationException("Attenzione! Risultano trasferimenti a GAE di natura 6 - 'Reimpiego di risorse' " + + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impPositiviNaturaReimpiego) + + " che non corrisponde all'importo prelevato da" + + (existsPrgScaduti?" progetti scaduti ":"") + + (existsPrgScaduti&&existsVoceSpeciale?"e da":"") + + (existsVoceSpeciale?"lla Voce "+cdVoceSpeciale:"") + +" (" + + new it.cnr.contab.util.EuroFormat().format(impNegativiPrgScaduti)+")."); + } + + /** + * 3. se vengono sottratti importi ad un progetto scaduto devono essere girati a GaeNatura6 o al CDRPersonale o alle Aree + */ + if (impNegativiPrgScaduti.compareTo(BigDecimal.ZERO)>0 && impNegativiPrgScaduti.compareTo(impPositiviCashFund)>0) + throw new ApplicationException("Attenzione! Risultano prelievi da progetti scaduti" + + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impNegativiPrgScaduti) + + " che non risultano totalmente coperto da variazioni a favore" + + " di GAE di natura 6 - 'Reimpiego di risorse' o del CDR Personale o di Aree (" + + new it.cnr.contab.util.EuroFormat().format(impPositiviCashFund)+")."); + + /** + * 4. se un progetto non è scaduto è possibile attribuire somme solo se stornate dallo stesso progetto + */ + listCtrlPianoEco.stream() + .filter(el->!Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpPositivi().compareTo(BigDecimal.ZERO)>0) + .filter(el->el.getImpPositivi().compareTo(el.getImpNegativi())!=0) + .findFirst().ifPresent(el->{ + throw new DetailedRuntimeException("Attenzione! Sono stati attribuiti fondi al progetto "+ + el.getProgetto().getCd_progetto()+"(" + + new it.cnr.contab.util.EuroFormat().format(el.getImpPositivi()) + + ") non compensati da un equivalente prelievo nell'ambito dello stesso progetto ("+ + new it.cnr.contab.util.EuroFormat().format(el.getImpNegativi()) + ")");}); + + /** + * 5. non è possibile attribuire fondi alla voce speciale (11048) + */ + BigDecimal impPositiviVoceSpeciale = listCtrlPianoEco.stream() + .filter(el->el.getImpPositiviVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpPositiviVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + if (impPositiviVoceSpeciale.compareTo(BigDecimal.ZERO)>0) + throw new ApplicationException("Attenzione! Non è possibile attribuire fondi alla voce " + + cdVoceSpeciale + " (" + + new it.cnr.contab.util.EuroFormat().format(impPositiviVoceSpeciale)+")."); + + /** + * 6. se vengono spostate somme dalla voce speciale (11048) devono essere girate a GaeNatura6 + */ + BigDecimal impNegativiVoceSpeciale = listCtrlPianoEco.stream() + .filter(el->el.getImpNegativiVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpNegativiVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + if (impNegativiVoceSpeciale.compareTo(BigDecimal.ZERO)>0 && impNegativiVoceSpeciale.compareTo(impPositiviNaturaReimpiego)>0) + throw new ApplicationException("Attenzione! Risultano prelievi dalla voce " + cdVoceSpeciale + + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impNegativiVoceSpeciale) + + " che non risultano totalmente coperto da variazioni a favore" + + " di GAE di natura 6 - 'Reimpiego di risorse' (" + + new it.cnr.contab.util.EuroFormat().format(impPositiviNaturaReimpiego)+")."); + } + } catch (DetailedRuntimeException _ex) { + throw new ApplicationException(_ex.getMessage()); + } catch (PersistencyException|RemoteException|IntrospectionException e) { + throw new ComponentException(e); + } + } } diff --git a/sigla-ejb/src/main/java/it/cnr/contab/varstanz00/comp/VariazioniStanziamentoResiduoComponent.java b/sigla-ejb/src/main/java/it/cnr/contab/varstanz00/comp/VariazioniStanziamentoResiduoComponent.java index 8e4ae33c9e..82bcc484e9 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/varstanz00/comp/VariazioniStanziamentoResiduoComponent.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/varstanz00/comp/VariazioniStanziamentoResiduoComponent.java @@ -125,8 +125,10 @@ public CtrlPianoEco(ProgettoBulk progetto, Timestamp dtScadenza, boolean cashFun private boolean cashFund; private BigDecimal impPositivi = BigDecimal.ZERO; private BigDecimal impNegativi = BigDecimal.ZERO; - private BigDecimal impPositiviNatura6 = BigDecimal.ZERO; - private BigDecimal impNegativiNatura6 = BigDecimal.ZERO; + private BigDecimal impPositiviNaturaReimpiego = BigDecimal.ZERO; + private BigDecimal impNegativiNaturaReimpiego = BigDecimal.ZERO; + private BigDecimal impPositiviVoceSpeciale = BigDecimal.ZERO; + private BigDecimal impNegativiVoceSpeciale = BigDecimal.ZERO; public ProgettoBulk getProgetto() { return progetto; } @@ -157,17 +159,29 @@ public BigDecimal getImpNegativi() { public void setImpNegativi(BigDecimal impNegativi) { this.impNegativi = impNegativi; } - public BigDecimal getImpPositiviNatura6() { - return impPositiviNatura6; + public BigDecimal getImpPositiviNaturaReimpiego() { + return impPositiviNaturaReimpiego; } - public void setImpPositiviNatura6(BigDecimal impPositiviNatura6) { - this.impPositiviNatura6 = impPositiviNatura6; + public void setImpPositiviNaturaReimpiego(BigDecimal impPositiviNaturaReimpiego) { + this.impPositiviNaturaReimpiego = impPositiviNaturaReimpiego; } - public BigDecimal getImpNegativiNatura6() { - return impNegativiNatura6; + public BigDecimal getImpNegativiNaturaReimpiego() { + return impNegativiNaturaReimpiego; } - public void setImpNegativiNatura6(BigDecimal impNegativiNatura6) { - this.impNegativiNatura6 = impNegativiNatura6; + public void setImpNegativiNaturaReimpiego(BigDecimal impNegativiNaturaReimpiego) { + this.impNegativiNaturaReimpiego = impNegativiNaturaReimpiego; + } + public BigDecimal getImpPositiviVoceSpeciale() { + return impPositiviVoceSpeciale; + } + public void setImpPositiviVoceSpeciale(BigDecimal impPositiviVoceSpeciale) { + this.impPositiviVoceSpeciale = impPositiviVoceSpeciale; + } + public BigDecimal getImpNegativiVoceSpeciale() { + return impNegativiVoceSpeciale; + } + public void setImpNegativiVoceSpeciale(BigDecimal impNegativiVoceSpeciale) { + this.impNegativiVoceSpeciale = impNegativiVoceSpeciale; } } /** @@ -1544,6 +1558,9 @@ private void controllaPdgPianoEconomico(UserContext userContext, Var_stanz_resBu if (Utility.createParametriEnteComponentSession().isProgettoPianoEconomicoEnabled(userContext, CNRUserContext.getEsercizio(userContext))) { List listCtrlPianoEco = new ArrayList(); + String cdNaturaReimpiego = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO); + String cdVoceSpeciale = Utility.createConfigurazioneCnrComponentSession().getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_ELEMENTO_VOCE_SPECIALE, Configurazione_cnrBulk.SK_TEMPO_IND_SU_PROGETTI_FINANZIATI); + String cdrPersonale = Optional.ofNullable(((ObbligazioneHome)getHome(userContext, ObbligazioneBulk.class)).recupero_cdr_speciale_stipendi()) .orElseThrow(() -> new ComponentException("Non è possibile individuare il codice CDR del Personale.")); CdrBulk cdrPersonaleBulk = (CdrBulk)getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(cdrPersonale)); @@ -1582,31 +1599,33 @@ private void controllaPdgPianoEconomico(UserContext userContext, Var_stanz_resBu WorkpackageBulk linea = listGAE.get(0); //recupero il progetto per verificare se è scaduto - ProgettoBulk progetto = (ProgettoBulk)getHome(userContext, ProgettoBulk.class).findByPrimaryKey(userContext, linea.getProgetto()); - Progetto_other_fieldBulk other = (Progetto_other_fieldBulk)getHome(userContext, Progetto_other_fieldBulk.class).findByPrimaryKey(new Progetto_other_fieldBulk(linea.getPg_progetto())); + ProgettoHome home = (ProgettoHome)getHome(userContext, ProgettoBulk.class); + home.setFetchPolicy("it.cnr.contab.progettiric00.comp.ProgettoRicercaComponent.find"); + ProgettoBulk progetto = (ProgettoBulk)home.findByPrimaryKey(linea.getProgetto()); + getHomeCache(userContext).fetchAll(userContext); //effettuo controlli sulla validità del progetto - Optional.ofNullable(other).filter(Progetto_other_fieldBulk::isStatoApprovato) + Optional.ofNullable(progetto.getOtherField()).filter(Progetto_other_fieldBulk::isStatoApprovato) .orElseThrow(()->new ApplicationException("Attenzione! Il progetto "+progetto.getCd_progetto() + " non risulta in stato approvato. Variazione non consentita!")); - Optional.ofNullable(other.getDtInizio()) - .map(el->{ - Calendar gc = GregorianCalendar.getInstance(); - gc.setTime(el); - return gc; - }) - .filter(el->el.get(Calendar.YEAR)<=CNRUserContext.getEsercizio(userContext)) + Optional.ofNullable(progetto.getOtherField().getDtInizio()) + .filter(dt->!dt.after(variazione.getDt_chiusura())) .orElseThrow(()->new ApplicationException("Attenzione! GAE "+linea.getCd_linea_attivita()+" non selezionabile. " - + "La data inizio ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(other.getDtInizio()) + + "La data inizio ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(progetto.getOtherField().getDtInizio()) + ") del progetto "+progetto.getCd_progetto()+" associato è successiva " - + "rispetto all'anno contabile di scrivania.")); + + "rispetto alla data di chiusura della variazione ("+new java.text.SimpleDateFormat("dd/MM/yyyy").format(variazione.getDt_chiusura())+").")); Timestamp dtScadenza = Optional.ofNullable( - Optional.ofNullable(other.getDtProroga()).orElse(other.getDtFine())) + Optional.ofNullable(progetto.getOtherField().getDtProroga()).orElse(progetto.getOtherField().getDtFine())) .orElse(null); - boolean isCashFund = linea.getNatura().getCd_natura().equals("6")||isDettPersonale||isUoArea; + boolean isNaturaReimpiego = Optional.ofNullable(cdNaturaReimpiego).map(el->el.equals(linea.getNatura().getCd_natura())) + .orElse(Boolean.FALSE); + boolean isVoceSpeciale = Optional.ofNullable(cdVoceSpeciale).map(el->el.equals(linea.getNatura().getCd_natura())) + .orElse(Boolean.FALSE); + + boolean isCashFund = isNaturaReimpiego||isDettPersonale||isUoArea; //recupero il record se presente altrimenti ne creo uno nuovo CtrlPianoEco pianoEco = listCtrlPianoEco.stream() @@ -1617,12 +1636,16 @@ private void controllaPdgPianoEconomico(UserContext userContext, Var_stanz_resBu if (varStanzResRiga.getIm_variazione().compareTo(BigDecimal.ZERO)>0) { pianoEco.setImpPositivi(pianoEco.getImpPositivi().add(varStanzResRiga.getIm_variazione().abs())); - if (linea.getNatura().getCd_natura().equals("6")) - pianoEco.setImpPositiviNatura6(pianoEco.getImpPositiviNatura6().add(varStanzResRiga.getIm_variazione().abs())); + if (isNaturaReimpiego) + pianoEco.setImpPositiviNaturaReimpiego(pianoEco.getImpPositiviNaturaReimpiego().add(varStanzResRiga.getIm_variazione().abs())); + if (isVoceSpeciale) + pianoEco.setImpPositiviVoceSpeciale(pianoEco.getImpPositiviVoceSpeciale().add(varStanzResRiga.getIm_variazione().abs())); } else { pianoEco.setImpNegativi(pianoEco.getImpNegativi().add(varStanzResRiga.getIm_variazione().abs())); - if (linea.getNatura().getCd_natura().equals("6")) - pianoEco.setImpNegativiNatura6(pianoEco.getImpNegativiNatura6().add(varStanzResRiga.getIm_variazione().abs())); + if (isNaturaReimpiego) + pianoEco.setImpNegativiNaturaReimpiego(pianoEco.getImpNegativiNaturaReimpiego().add(varStanzResRiga.getIm_variazione().abs())); + if (isVoceSpeciale) + pianoEco.setImpNegativiVoceSpeciale(pianoEco.getImpNegativiVoceSpeciale().add(varStanzResRiga.getIm_variazione().abs())); } listCtrlPianoEco.add(pianoEco); @@ -1651,20 +1674,35 @@ private void controllaPdgPianoEconomico(UserContext userContext, Var_stanz_resBu .map(CtrlPianoEco::getImpPositivi) .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); - BigDecimal impPositiviNatura6 = listCtrlPianoEco.stream() + BigDecimal impPositiviNaturaReimpiego = listCtrlPianoEco.stream() .filter(CtrlPianoEco::isCashFund) - .filter(el->el.getImpPositiviNatura6().compareTo(BigDecimal.ZERO)>0) - .map(CtrlPianoEco::getImpPositiviNatura6) + .filter(el->el.getImpPositiviNaturaReimpiego().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpPositiviNaturaReimpiego) .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); /** - * 2. è possibile attribuire fondi ad un progetto di natura 6 solo se ne vengono sottratti equivalenti da un progetto scaduto + * 2. è possibile attribuire fondi ad un progetto di natura 6 solo se ne vengono sottratti equivalenti da: + * a. un progetto scaduto + * b. dalla voce speciale (11048) */ - if (impPositiviNatura6.compareTo(BigDecimal.ZERO)>0 && impPositiviNatura6.compareTo(impNegativiPrgScaduti)!=0) - throw new ApplicationException("Attenzione! Risultano trasferimenti a GAE di natura 6 - 'Reimpiego di risorse' " - + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impPositiviCashFund) - + " che non corrisponde all'importo prelevato da progetti scaduti pari a " - + new it.cnr.contab.util.EuroFormat().format(impNegativiPrgScaduti)); + if (impPositiviNaturaReimpiego.compareTo(BigDecimal.ZERO)>0) { + BigDecimal impNegativiVoceSpecialePrgInCorso = listCtrlPianoEco.stream() + .filter(el->!Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpNegativiVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpNegativiVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + boolean existsPrgScaduti = impNegativiPrgScaduti.compareTo(BigDecimal.ZERO)>0; + boolean existsVoceSpeciale = impNegativiVoceSpecialePrgInCorso.compareTo(BigDecimal.ZERO)>0; + if (impPositiviNaturaReimpiego.compareTo(impNegativiPrgScaduti.add(impNegativiVoceSpecialePrgInCorso))!=0) + throw new ApplicationException("Attenzione! Risultano trasferimenti a GAE di natura 6 - 'Reimpiego di risorse' " + + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impPositiviNaturaReimpiego) + + " che non corrisponde all'importo prelevato da" + + (existsPrgScaduti?" progetti scaduti ":"") + + (existsPrgScaduti&&existsVoceSpeciale?"e da":"") + + (existsVoceSpeciale?"lla Voce "+cdVoceSpeciale:"") + +" (" + + new it.cnr.contab.util.EuroFormat().format(impNegativiPrgScaduti)+")."); + } /** * 3. se vengono sottratti importi ad un progetto scaduto devono essere girati a GaeNatura6 o al CDRPersonale o alle Aree @@ -1675,6 +1713,48 @@ private void controllaPdgPianoEconomico(UserContext userContext, Var_stanz_resBu + " che non risultano totalmente coperto da variazioni a favore" + " di GAE di natura 6 - 'Reimpiego di risorse' o del CDR Personale o di Aree (" + new it.cnr.contab.util.EuroFormat().format(impPositiviCashFund)+")."); + + /** + * 4. se un progetto non è scaduto è possibile attribuire somme solo se stornate dallo stesso progetto + */ + listCtrlPianoEco.stream() + .filter(el->!Optional.ofNullable(el.getDtScadenza()).map(dt->dt.before(variazione.getDt_chiusura())).orElse(Boolean.FALSE)) + .filter(el->el.getImpPositivi().compareTo(BigDecimal.ZERO)>0) + .filter(el->el.getImpPositivi().compareTo(el.getImpNegativi())!=0) + .findFirst().ifPresent(el->{ + throw new DetailedRuntimeException("Attenzione! Sono stati attribuiti fondi al progetto "+ + el.getProgetto().getCd_progetto()+"(" + + new it.cnr.contab.util.EuroFormat().format(el.getImpPositivi()) + + ") non compensati da un equivalente prelievo nell'ambito dello stesso progetto ("+ + new it.cnr.contab.util.EuroFormat().format(el.getImpNegativi()) + ")");}); + + /** + * 5. non è possibile attribuire fondi alla voce speciale (11048) + */ + BigDecimal impPositiviVoceSpeciale = listCtrlPianoEco.stream() + .filter(el->el.getImpPositiviVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpPositiviVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + if (impPositiviVoceSpeciale.compareTo(BigDecimal.ZERO)>0) + throw new ApplicationException("Attenzione! Non è possibile attribuire fondi alla voce " + + cdVoceSpeciale + " (" + + new it.cnr.contab.util.EuroFormat().format(impPositiviVoceSpeciale)+")."); + + /** + * 6. se vengono spostate somme dalla voce speciale (11048) devono essere girate a GaeNatura6 + */ + BigDecimal impNegativiVoceSpeciale = listCtrlPianoEco.stream() + .filter(el->el.getImpNegativiVoceSpeciale().compareTo(BigDecimal.ZERO)>0) + .map(CtrlPianoEco::getImpNegativiVoceSpeciale) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + + if (impNegativiVoceSpeciale.compareTo(BigDecimal.ZERO)>0 && impNegativiVoceSpeciale.compareTo(impPositiviNaturaReimpiego)>0) + throw new ApplicationException("Attenzione! Risultano prelievi dalla voce " + cdVoceSpeciale + + " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impNegativiVoceSpeciale) + + " che non risultano totalmente coperto da variazioni a favore" + + " di GAE di natura 6 - 'Reimpiego di risorse' (" + + new it.cnr.contab.util.EuroFormat().format(impPositiviNaturaReimpiego)+")."); } } catch (DetailedRuntimeException _ex) { throw new ApplicationException(_ex.getMessage());