From a7bd7e5b1a4b78c2d183b5ca87fd155c7947e753 Mon Sep 17 00:00:00 2001 From: "raffaele.pagano" Date: Tue, 5 Feb 2019 18:18:32 +0100 Subject: [PATCH] Piano Economico: riattivazione controllo assestato entrate su progetti approvati non scaduti --- .../contab/doccont00/comp/SaldoComponent.java | 112 +++++++++++++++++- .../comp/ProgettoRicercaComponent.java | 34 +++++- .../progettiric00/core/bulk/ProgettoBulk.java | 15 +++ 3 files changed, 159 insertions(+), 2 deletions(-) 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 761c2e534b..30f8deebd0 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 @@ -56,6 +56,7 @@ 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_other_fieldBulk; import it.cnr.contab.progettiric00.core.bulk.Progetto_other_fieldHome; import it.cnr.contab.progettiric00.core.bulk.Progetto_piano_economicoBulk; import it.cnr.contab.progettiric00.core.bulk.Progetto_piano_economicoHome; @@ -1600,8 +1601,66 @@ private String getMessaggioSfondamentoPianoEconomico(UserContext userContext, Pd 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()) { + List listCtrlDispPianoEcoEtr = new ArrayList(); + Pdg_variazioneHome detHome = (Pdg_variazioneHome)getHome(userContext,Pdg_variazioneBulk.class); - List listCtrlDispPianoEco = new ArrayList(); + + for (java.util.Iterator dett = detHome.findDettagliEntrataVariazioneGestionale(pdgVariazione).iterator();dett.hasNext();){ + Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)dett.next(); + + WorkpackageBulk latt = ((WorkpackageHome)getHome(userContext, WorkpackageBulk.class)).searchGAECompleta(userContext,CNRUserContext.getEsercizio(userContext), + rigaVar.getLinea_attivita().getCd_centro_responsabilita(), rigaVar.getLinea_attivita().getCd_linea_attivita()); + ProgettoBulk progetto = latt.getProgetto(); + + if (!progetto.isCtrlDispSpento()) { + BigDecimal imVariazioneFin = Utility.nvl(rigaVar.getIm_entrata()); + + //recupero il record se presente altrimenti ne creo uno nuovo + CtrlDispPianoEco dispPianoEco = listCtrlDispPianoEcoEtr.stream() + .filter(el->el.getProgetto().getPg_progetto().equals(progetto.getPg_progetto())) + .findFirst() + .orElse(new CtrlDispPianoEco(progetto, null)); + + dispPianoEco.setImpFinanziato(dispPianoEco.getImpFinanziato().add(imVariazioneFin)); + + if (!listCtrlDispPianoEcoEtr.contains(dispPianoEco)) + listCtrlDispPianoEcoEtr.add(dispPianoEco); + } + } + + for (CtrlDispPianoEco ctrlDispPianoEco : listCtrlDispPianoEcoEtr) { + ProgettoBulk progetto = ctrlDispPianoEco.getProgetto(); + BigDecimal totFinanziato = BigDecimal.ZERO; + if (progetto.isPianoEconomicoRequired()) { + List pianoEconomicoList = (List)((Progetto_piano_economicoHome)getHome(userContext,Progetto_piano_economicoBulk.class)).findProgettoPianoEconomicoList(progetto.getPg_progetto()); + totFinanziato = pianoEconomicoList.stream() + .filter(el->el.getEsercizio_piano().equals(pdgVariazione.getEsercizio())) + .map(Progetto_piano_economicoBulk::getIm_spesa_finanziato) + .reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); + } else { + totFinanziato = Optional.ofNullable(progetto.getOtherField()) + .map(Progetto_other_fieldBulk::getImFinanziato).orElse(BigDecimal.ZERO); + } + + //Controllo che la quota finanziata sia almeno pari alle entrate del progetto + BigDecimal assestatoEtrPrg = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_ENTRATE, null); + + if (totFinanziato.compareTo(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato()))<0) { + if (messaggio!=null && messaggio.length()>0) + messaggio = messaggio+ "\n"; + messaggio = messaggio + + "L'assestato entrate ("+ + new it.cnr.contab.util.EuroFormat().format(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato())) + + ") del progetto " + progetto.getCd_progetto() + + " risulterebbe superiore alla quota finanziata dello stesso " + + (progetto.isPianoEconomicoRequired()?"per l'anno "+pdgVariazione.getEsercizio():"")+ + " che risulta di " + + new it.cnr.contab.util.EuroFormat().format(totFinanziato) + ".\n"; + } + } + + List listCtrlDispPianoEco = new ArrayList(); for (java.util.Iterator dett = detHome.findDettagliSpesaVariazioneGestionale(pdgVariazione).iterator();dett.hasNext();){ Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)dett.next(); @@ -1654,6 +1713,21 @@ else if (pianoEconomicoList.size()>1) listCtrlDispPianoEco.add(dispPianoEco); } } + } else { + if (!progetto.isCtrlDispSpento()) { + //recupero il record se presente altrimenti ne creo uno nuovo + CtrlDispPianoEco dispPianoEco = listCtrlDispPianoEco.stream() + .filter(el->el.getProgetto().getPg_progetto().equals(progetto.getPg_progetto())) + .filter(el->!Optional.ofNullable(el.getProgettoPianoEconomico()).isPresent()) + .findFirst() + .orElse(new CtrlDispPianoEco(progetto, null)); + + dispPianoEco.setImpFinanziato(dispPianoEco.getImpFinanziato().add(imVariazioneFin)); + dispPianoEco.setImpCofinanziato(dispPianoEco.getImpCofinanziato().add(imVariazioneCofin)); + + if (!listCtrlDispPianoEco.contains(dispPianoEco)) + listCtrlDispPianoEco.add(dispPianoEco); + } } } @@ -1701,6 +1775,42 @@ else if (pianoEconomicoList.size()>1) catch (Exception ex ){ throw new RuntimeException( ex ); } + } else { + ProgettoBulk prg = ctrlDispPianoEco.getProgetto(); + { + BigDecimal totFinanziato = Optional.ofNullable(prg.getOtherField()) + .map(Progetto_other_fieldBulk::getImFinanziato).orElse(BigDecimal.ZERO); + BigDecimal assestatoSpePrgFes = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, prg, Elemento_voceHome.GESTIONE_SPESE, Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO); + + if (totFinanziato.compareTo(assestatoSpePrgFes.add(ctrlDispPianoEco.getImpFinanziato()))<0) { + if (messaggio!=null && messaggio.length()>0) + messaggio = messaggio+ "\n"; + messaggio = messaggio + + "L'assestato spese fonte esterne ("+ + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgFes.add(ctrlDispPianoEco.getImpFinanziato())) + + ") del progetto " +prg.getCd_progetto()+ + " risulterebbe superiore alla quota finanziata dello stesso che risulta di " + + new it.cnr.contab.util.EuroFormat().format(totFinanziato) + ".\n"; + } + } + { + BigDecimal totCofinanziato = Optional.ofNullable(prg.getOtherField()) + .map(Progetto_other_fieldBulk::getImCofinanziato).orElse(BigDecimal.ZERO); + BigDecimal assestatoSpePrgReimpiego = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, prg, Elemento_voceHome.GESTIONE_SPESE, Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO); + + if (totCofinanziato.compareTo(assestatoSpePrgReimpiego.add(ctrlDispPianoEco.getImpCofinanziato()))<0) { + if (messaggio!=null && messaggio.length()>0) + messaggio = messaggio+ "\n"; + messaggio = messaggio + + "L'assestato spese fonti interne e natura reimpiego ("+ + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgReimpiego.add(ctrlDispPianoEco.getImpCofinanziato())) + + ") del progetto " +prg.getCd_progetto()+ + " risulterebbe superiore alla quota cofinanziata dello stesso che risulta di " + + new it.cnr.contab.util.EuroFormat().format(totCofinanziato) + ".\n"; + } + } } } } diff --git a/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/comp/ProgettoRicercaComponent.java b/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/comp/ProgettoRicercaComponent.java index 0973a6ed94..df379e46f6 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/comp/ProgettoRicercaComponent.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/comp/ProgettoRicercaComponent.java @@ -1690,7 +1690,39 @@ private void validaVociPianoEconomicoGestionale(UserContext userContext, Progett private void validaSaldiPianoEconomico(UserContext userContext, ProgettoBulk progetto, Integer annoFrom) throws ComponentException { try{ - if (progetto.isPianoEconomicoRequired()) { + if (!progetto.isPianoEconomicoRequired()) { + if (!progetto.isCtrlDispSpento()) { + BigDecimal assestatoEtrPrg = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_ENTRATE, null); + + if (Optional.ofNullable(progetto.getImFinanziato()).orElse(BigDecimal.ZERO).compareTo(assestatoEtrPrg)<0) + throw new ApplicationRuntimeException("Attenzione: la quota finanziata ("+ + new it.cnr.contab.util.EuroFormat().format(progetto.getImFinanziato()) + + ") del progetto " + progetto.getCd_progetto() + + " risulterebbe inferiore all'assestato entrate dello stesso (" + + new it.cnr.contab.util.EuroFormat().format(assestatoEtrPrg) + "). Operazione non consentita!"); + + BigDecimal assestatoSpePrgFes = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_SPESE, Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO); + + if (Optional.ofNullable(progetto.getImFinanziato()).orElse(BigDecimal.ZERO).compareTo(assestatoSpePrgFes)<0) + throw new ApplicationRuntimeException("Attenzione: la quota finanziata ("+ + new it.cnr.contab.util.EuroFormat().format(progetto.getImFinanziato()) + + ") del progetto " + progetto.getCd_progetto() + + " risulterebbe inferiore all'assestato spese fonte esterne dello stesso (" + + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgFes) + "). Operazione non consentita!"); + + BigDecimal assestatoSpePrgReimpiego = Utility.createSaldoComponentSession() + .getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_SPESE, Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO); + + if (Optional.ofNullable(progetto.getImCofinanziato()).orElse(BigDecimal.ZERO).compareTo(assestatoSpePrgReimpiego)<0) + throw new ApplicationRuntimeException("Attenzione: la quota cofinanziata ("+ + new it.cnr.contab.util.EuroFormat().format(progetto.getImFinanziato()) + + ") del progetto " + progetto.getCd_progetto() + + " risulterebbe inferiore all'assestato spese fonti interne e natura reimpiego dello stesso (" + + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgReimpiego) + "). Operazione non consentita!"); + } + } else { progetto.getAllDetailsProgettoPianoEconomico().stream() .filter(el->el.getEsercizio_piano().compareTo(annoFrom)>=0).forEach(ppe->{ V_saldi_piano_econom_progettoBulk saldo; diff --git a/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/core/bulk/ProgettoBulk.java b/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/core/bulk/ProgettoBulk.java index 0c85cb0a12..e7951c82f4 100644 --- a/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/core/bulk/ProgettoBulk.java +++ b/sigla-ejb/src/main/java/it/cnr/contab/progettiric00/core/bulk/ProgettoBulk.java @@ -1188,4 +1188,19 @@ public String getStatoPrg() { return ProgettoBulk.STATO_CHIUSURA; return optPrg.map(el->el.getStato()).orElse(null); } + + /** + * Metodo che ci dice se il controllo di disponibilità su un progetto è spento + * @return boolean + */ + public boolean isCtrlDispSpento() { + return this.getOtherField().isStatoChiuso() || + (this.getOtherField().isStatoApprovato() && + Optional.ofNullable( + Optional.ofNullable(this.getOtherField().getDtProroga()) + .orElse(Optional.ofNullable(this.getOtherField().getDtFine()) + .orElse(null))) + .map(dtScadenza->dtScadenza.before(it.cnr.jada.util.ejb.EJBCommonServices.getServerTimestamp())) + .orElse(Boolean.FALSE)); + } } \ No newline at end of file