use of it.cnr.jada.comp.ComponentException in project sigla-main by consiglionazionaledellericerche.
the class SaldoComponent method getMessaggioSfondamentoPianoEconomico.
// Controllo che restituisce errore.
// Se la variazione passa a definitivo controllo che gli importi inseriti in variazione non superino la disponibilità residua.
// Se la variazione passa ad approvato controllo solo che il piano economico non sia sfondato sul voci del piano economico movimentate dalla variazione
private String getMessaggioSfondamentoPianoEconomico(UserContext userContext, OggettoBulk variazione, boolean locked) throws ComponentException {
StringJoiner messaggio = new StringJoiner("\n\n");
boolean isVariazioneCompetenza = Optional.ofNullable(variazione).map(Pdg_variazioneBulk.class::isInstance).orElse(Boolean.FALSE);
boolean isVariazioneResidua = Optional.ofNullable(variazione).map(Var_stanz_resBulk.class::isInstance).orElse(Boolean.FALSE);
if (!isVariazioneCompetenza && !isVariazioneResidua)
throw new ApplicationException("Errore nella call del metodo getMessaggioSfondamentoPianoEconomico. Contattare il CED.");
try {
Configurazione_cnrComponentSession configSession = (Configurazione_cnrComponentSession) Utility.createConfigurazioneCnrComponentSession();
String cdNaturaReimpiego = configSession.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);
Integer esercizioVariazione = Optional.ofNullable(isVariazioneCompetenza ? Optional.of(variazione).map(Pdg_variazioneBulk.class::cast).map(Pdg_variazioneBulk::getEsercizio).orElse(null) : Optional.of(variazione).map(Var_stanz_resBulk.class::cast).map(Var_stanz_resBulk::getEsercizio_residuo).orElse(null)).orElseThrow(() -> new ApplicationException("Esercizio Variazione non individuata."));
if (Optional.ofNullable(annoFrom).map(BigDecimal::intValue).filter(el -> el.compareTo(esercizioVariazione) <= 0).isPresent()) {
List<CtrlDispPianoEco> listCtrlDispPianoEcoEtr = new ArrayList<CtrlDispPianoEco>();
Pdg_variazioneHome detHome = (Pdg_variazioneHome) getHome(userContext, Pdg_variazioneBulk.class);
Var_stanz_resHome varResHome = (Var_stanz_resHome) getHome(userContext, Var_stanz_resBulk.class);
Progetto_piano_economicoHome ppeHome = (Progetto_piano_economicoHome) getHome(userContext, Progetto_piano_economicoBulk.class);
Optional<Progetto_rimodulazioneBulk> optProgettoRimodulazioneVariazione = isVariazioneCompetenza ? Optional.of(variazione).map(Pdg_variazioneBulk.class::cast).map(Pdg_variazioneBulk::getProgettoRimodulazione) : Optional.of(variazione).map(Var_stanz_resBulk.class::cast).map(Var_stanz_resBulk::getProgettoRimodulazione);
ProgettoBulk progettoRimodulato = null;
if (optProgettoRimodulazioneVariazione.isPresent()) {
Progetto_rimodulazioneHome prgHome = (Progetto_rimodulazioneHome) getHome(userContext, Progetto_rimodulazioneBulk.class);
Progetto_rimodulazioneBulk rimodulazione = prgHome.rebuildRimodulazione(userContext, optProgettoRimodulazioneVariazione.get());
progettoRimodulato = (ProgettoBulk) prgHome.getProgettoRimodulato(rimodulazione).clone();
}
if (isVariazioneCompetenza) {
for (java.util.Iterator dett = detHome.findDettagliEntrataVariazioneGestionale((Pdg_variazioneBulk) variazione).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 (Optional.ofNullable(progettoRimodulato).filter(prgRim -> !prgRim.getPg_progetto().equals(progetto.getPg_progetto())).isPresent())
messaggio.add("Progetto " + progetto.getCd_progetto() + ": " + "movimentazione non possibile in quanto la variazione è di tipo rimodulazione di altro progetto (" + progettoRimodulato.getCd_progetto() + ").");
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;
List<Progetto_piano_economicoBulk> pianoEconomicoList = null;
if (Optional.ofNullable(progettoRimodulato).isPresent())
pianoEconomicoList = progettoRimodulato.getAllDetailsProgettoPianoEconomico();
else
pianoEconomicoList = (List<Progetto_piano_economicoBulk>) ppeHome.findProgettoPianoEconomicoList(progetto.getPg_progetto());
// Il controllo puntuale sul piano economico deve partire se:
// 1) sul progetto esiste un piano economico per l'anno della variazione.
// 2) l'anno della variazione è gestita (<=annoFrom)
// 3) l'anno della variazione rientra nel periodo di validità del progetto, ovvero esiste almeno un dettaglio per l'anno della variazione stessa
// In caso contrario viene controllato solo l'importo complessivo del progetto
boolean ctrlFinanziamentoAnnuale = progetto.isPianoEconomicoRequired() && (Optional.ofNullable(progetto).flatMap(prg -> Optional.ofNullable(prg.getOtherField())).filter(of -> of.getAnnoInizio() <= esercizioVariazione).filter(of -> of.getAnnoFine() >= esercizioVariazione).isPresent() || Optional.ofNullable(pianoEconomicoList).orElse(new ArrayList<>()).stream().filter(el -> el.getEsercizio_piano().equals(esercizioVariazione)).findAny().isPresent());
if (ctrlFinanziamentoAnnuale) {
totFinanziato = pianoEconomicoList.stream().filter(el -> el.getEsercizio_piano().equals(esercizioVariazione)).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 = this.getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_ENTRATE, (ctrlFinanziamentoAnnuale ? esercizioVariazione : null), null, null);
if (totFinanziato.compareTo(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato())) < 0)
messaggio.add("Progetto " + progetto.getCd_progetto() + ": " + (ctrlFinanziamentoAnnuale ? "per l'esercizio " + esercizioVariazione + " " : "") + "l'assestato entrate " + (ctrlFinanziamentoAnnuale ? "" : "totale ") + "(" + new it.cnr.contab.util.EuroFormat().format(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato())) + ") non può essere superiore alla quota finanziata (" + new it.cnr.contab.util.EuroFormat().format(totFinanziato) + ").");
if (progetto.getOtherField().getTipoFinanziamento().getFlAssociaContratto() && !progetto.getOtherField().getFlControlliDisabled()) {
// Recupero la lista dei contratti attivi collegati al progetto
ProgettoHome progettoHome = (ProgettoHome) getHome(userContext, ProgettoBulk.class);
java.util.Collection<ContrattoBulk> contrattiAssociati = progettoHome.findContratti(progetto.getPg_progetto());
BigDecimal impContrattiAttivi = contrattiAssociati.stream().filter(el -> el.isAttivo() || el.isAttivo_e_Passivo()).filter(el -> !el.getDt_stipula().after(((Pdg_variazioneBulk) variazione).getDt_chiusura())).map(ContrattoBulk::getIm_contratto_attivo).reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
if (impContrattiAttivi.compareTo(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato())) < 0)
messaggio.add("Progetto " + progetto.getCd_progetto() + ": " + (ctrlFinanziamentoAnnuale ? "per l'esercizio " + esercizioVariazione + " " : "") + "l'assestato entrate " + (ctrlFinanziamentoAnnuale ? "" : "totale ") + "(" + new it.cnr.contab.util.EuroFormat().format(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato())) + ") non può essere superiore alla somma dei contratti associati al progetto (" + new it.cnr.contab.util.EuroFormat().format(impContrattiAttivi) + ") stipulati in data precedente rispetto alla data di chiusura della variazione (" + new java.text.SimpleDateFormat("dd/MM/yyyy").format(((Pdg_variazioneBulk) variazione).getDt_chiusura()) + ").");
}
}
}
List<CtrlDispPianoEco> listCtrlDispPianoEco = new ArrayList<CtrlDispPianoEco>();
if (isVariazioneCompetenza) {
for (java.util.Iterator dett = detHome.findDettagliSpesaVariazioneGestionale((Pdg_variazioneBulk) variazione).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 (Optional.ofNullable(progettoRimodulato).filter(prgRim -> !prgRim.getPg_progetto().equals(progetto.getPg_progetto())).isPresent())
messaggio.add("Progetto " + progetto.getCd_progetto() + ": " + "movimentazione non possibile in quanto la variazione è di tipo rimodulazione di altro progetto (" + progettoRimodulato.getCd_progetto() + ").");
// la variazione non è di tipo Maggiori Entrate/Spese nell'ambito del CDS
if (Optional.ofNullable(progetto.getOtherField().getAnnoFine()).filter(annoFine -> annoFine.compareTo(esercizioVariazione) >= 0).isPresent() || !Tipo_variazioneBulk.VARIAZIONE_POSITIVA_STESSO_ISTITUTO.equals(((Pdg_variazioneBulk) variazione).getTipologia())) {
boolean isNaturaReimpiego = Optional.ofNullable(cdNaturaReimpiego).map(el -> el.equals(latt.getCd_natura())).orElse(Boolean.FALSE);
BigDecimal imSpeseInterne = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_int()).compareTo(BigDecimal.ZERO) != 0 ? rigaVar.getIm_spese_gest_decentrata_int() : Utility.nvl(rigaVar.getIm_spese_gest_accentrata_int());
BigDecimal imSpeseEsterne = Utility.nvl(rigaVar.getIm_spese_gest_decentrata_est()).compareTo(BigDecimal.ZERO) != 0 ? rigaVar.getIm_spese_gest_decentrata_est() : Utility.nvl(rigaVar.getIm_spese_gest_accentrata_est());
BigDecimal imVariazioneFin = BigDecimal.ZERO;
BigDecimal imVariazioneCofin = imSpeseInterne;
if (isNaturaReimpiego)
imVariazioneCofin = imVariazioneCofin.add(imSpeseEsterne);
else
imVariazioneFin = imSpeseEsterne;
List<Progetto_piano_economicoBulk> pianoEconomicoList = null;
if (Optional.ofNullable(progettoRimodulato).isPresent())
pianoEconomicoList = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppe -> {
return ppe.getVociBilancioAssociate().stream().filter(ppeVoc -> ppeVoc.getEsercizio_voce().equals(rigaVar.getElemento_voce().getEsercizio())).filter(ppeVoc -> ppeVoc.getTi_appartenenza().equals(rigaVar.getElemento_voce().getTi_appartenenza())).filter(ppeVoc -> ppeVoc.getTi_gestione().equals(rigaVar.getElemento_voce().getTi_gestione())).filter(ppeVoc -> ppeVoc.getCd_elemento_voce().equals(rigaVar.getElemento_voce().getCd_elemento_voce())).findFirst().isPresent();
}).collect(Collectors.toList());
else
pianoEconomicoList = (List<Progetto_piano_economicoBulk>) ppeHome.findProgettoPianoEconomicoList(esercizioVariazione, progetto.getPg_progetto(), rigaVar.getElemento_voce());
// Il controllo puntuale sul piano economico deve partire se:
// 1) sul progetto esiste un piano economico per l'anno della variazione.
// 2) l'anno della variazione è gestita (<=annoFrom)
// 3) l'anno della variazione rientra nel periodo di validità del progetto, ovvero esiste almeno un dettaglio per l'anno della variazione stessa
// In caso contrario viene controllato solo l'importo complessivo del progetto
boolean ctrlFinanziamentoAnnuale = progetto.isPianoEconomicoRequired() && (Optional.ofNullable(progetto).flatMap(prg -> Optional.ofNullable(prg.getOtherField())).filter(of -> of.getAnnoInizio() <= esercizioVariazione).filter(of -> of.getAnnoFine() >= esercizioVariazione).isPresent() || Optional.ofNullable(pianoEconomicoList).orElse(new ArrayList<>()).stream().filter(el -> el.getEsercizio_piano().equals(esercizioVariazione)).findAny().isPresent());
if (ctrlFinanziamentoAnnuale) {
if (pianoEconomicoList == null || pianoEconomicoList.isEmpty()) {
// messaggio che non esce per rimodulazione progetto in quanto controllo effettuato in fase di approvaziomne ultima variazione
if (!Optional.ofNullable(progettoRimodulato).isPresent())
messaggio.add("Non risulta essere stato imputato alcun valore nel piano economico del progetto " + progetto.getCd_progetto() + " per la Voce " + rigaVar.getCd_elemento_voce() + ".");
} else if (pianoEconomicoList.size() > 1)
messaggio.add("La Voce " + rigaVar.getCd_elemento_voce() + " risulta associata a più voci di piano economico del progetto " + progetto.getCd_progetto() + ".");
else {
Progetto_piano_economicoBulk progettoPianoEconomico = pianoEconomicoList.get(0);
if (progettoPianoEconomico.getFl_ctrl_disp() && (progettoPianoEconomico.getEsercizio_piano().equals(0) || progettoPianoEconomico.getEsercizio_piano().equals(rigaVar.getEsercizio()))) {
// 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 -> el.getProgettoPianoEconomico().getPg_progetto().equals(progetto.getPg_progetto())).filter(el -> el.getProgettoPianoEconomico().getCd_unita_organizzativa().equals(progettoPianoEconomico.getCd_unita_organizzativa())).filter(el -> el.getProgettoPianoEconomico().getCd_voce_piano().equals(progettoPianoEconomico.getCd_voce_piano())).findFirst().orElse(new CtrlDispPianoEco(progetto, progettoPianoEconomico));
dispPianoEco.setImpFinanziato(dispPianoEco.getImpFinanziato().add(imVariazioneFin));
dispPianoEco.setImpCofinanziato(dispPianoEco.getImpCofinanziato().add(imVariazioneCofin));
if (!listCtrlDispPianoEco.contains(dispPianoEco))
listCtrlDispPianoEco.add(dispPianoEco);
}
}
} else {
// 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);
}
}
}
} else {
for (java.util.Iterator dett = varResHome.findAllVariazioniRiga((Var_stanz_resBulk) variazione).iterator(); dett.hasNext(); ) {
Var_stanz_res_rigaBulk rigaVar = (Var_stanz_res_rigaBulk) dett.next();
WorkpackageBulk latt = ((WorkpackageHome) getHome(userContext, WorkpackageBulk.class)).searchGAECompleta(userContext, CNRUserContext.getEsercizio(userContext), rigaVar.getLinea_di_attivita().getCd_centro_responsabilita(), rigaVar.getLinea_di_attivita().getCd_linea_attivita());
ProgettoBulk progetto = latt.getProgetto();
if (Optional.ofNullable(progettoRimodulato).filter(prgRim -> !prgRim.getPg_progetto().equals(progetto.getPg_progetto())).isPresent())
messaggio.add("Progetto " + progetto.getCd_progetto() + ": " + "movimentazione non possibile in quanto la variazione è di tipo rimodulazione di altro progetto (" + progettoRimodulato.getCd_progetto() + ").");
boolean isNaturaReimpiego = Optional.ofNullable(cdNaturaReimpiego).map(el -> el.equals(latt.getCd_natura())).orElse(Boolean.FALSE);
BigDecimal imVariazioneFin = BigDecimal.ZERO;
BigDecimal imVariazioneCofin = BigDecimal.ZERO;
if (Optional.ofNullable(latt.getNatura()).map(NaturaBulk::isFonteInterna).orElse(Boolean.FALSE) || isNaturaReimpiego)
imVariazioneCofin = Utility.nvl(rigaVar.getIm_variazione());
else if (Optional.ofNullable(latt.getNatura()).map(NaturaBulk::isFonteEsterna).orElse(Boolean.FALSE))
imVariazioneFin = Utility.nvl(rigaVar.getIm_variazione());
List<Progetto_piano_economicoBulk> pianoEconomicoList = null;
if (Optional.ofNullable(progettoRimodulato).isPresent())
pianoEconomicoList = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppe -> {
return ppe.getVociBilancioAssociate().stream().filter(ppeVoc -> ppeVoc.getEsercizio_voce().equals(rigaVar.getEsercizio_res())).filter(ppeVoc -> ppeVoc.getTi_appartenenza().equals(rigaVar.getElemento_voce().getTi_appartenenza())).filter(ppeVoc -> ppeVoc.getTi_gestione().equals(rigaVar.getElemento_voce().getTi_gestione())).filter(ppeVoc -> ppeVoc.getCd_elemento_voce().equals(rigaVar.getElemento_voce().getCd_elemento_voce())).findFirst().isPresent();
}).collect(Collectors.toList());
else
pianoEconomicoList = (List<Progetto_piano_economicoBulk>) ppeHome.findProgettoPianoEconomicoList(esercizioVariazione, progetto.getPg_progetto(), rigaVar.getElemento_voce());
// Il controllo puntuale sul piano economico deve partire se:
// 1) sul progetto esiste un piano economico per l'anno della variazione.
// 2) l'anno della variazione è gestita (<=annoFrom)
// 3) l'anno della variazione rientra nel periodo di validità del progetto, ovvero esiste almeno un dettaglio per l'anno della variazione stessa
// In caso contrario viene controllato solo l'importo complessivo del progetto
boolean ctrlFinanziamentoAnnuale = progetto.isPianoEconomicoRequired() && (Optional.ofNullable(progetto).flatMap(prg -> Optional.ofNullable(prg.getOtherField())).filter(of -> of.getAnnoInizio() <= esercizioVariazione).filter(of -> of.getAnnoFine() >= esercizioVariazione).isPresent() || Optional.ofNullable(pianoEconomicoList).orElse(new ArrayList<>()).stream().filter(el -> el.getEsercizio_piano().equals(esercizioVariazione)).findAny().isPresent());
if (ctrlFinanziamentoAnnuale) {
if (pianoEconomicoList == null || pianoEconomicoList.isEmpty()) {
// messaggio che non esce per rimodulazione progetto in quanto controllo effettuato in fase di approvaziomne ultima variazione
if (!Optional.ofNullable(progettoRimodulato).isPresent())
messaggio.add("Non risulta essere stato imputato alcun valore nel piano economico del progetto " + progetto.getCd_progetto() + " per la Voce " + rigaVar.getCd_elemento_voce() + ".");
} else if (pianoEconomicoList.size() > 1)
messaggio.add("La Voce " + rigaVar.getCd_elemento_voce() + " risulta associata a più voci di piano economico del progetto " + progetto.getCd_progetto() + ".");
else {
Progetto_piano_economicoBulk progettoPianoEconomico = pianoEconomicoList.get(0);
if (progettoPianoEconomico.getFl_ctrl_disp() && (progettoPianoEconomico.getEsercizio_piano().equals(0) || progettoPianoEconomico.getEsercizio_piano().equals(esercizioVariazione))) {
// 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 -> el.getProgettoPianoEconomico().getPg_progetto().equals(progetto.getPg_progetto())).filter(el -> el.getProgettoPianoEconomico().getCd_unita_organizzativa().equals(progettoPianoEconomico.getCd_unita_organizzativa())).filter(el -> el.getProgettoPianoEconomico().getCd_voce_piano().equals(progettoPianoEconomico.getCd_voce_piano())).findFirst().orElse(new CtrlDispPianoEco(progetto, progettoPianoEconomico));
dispPianoEco.setImpFinanziato(dispPianoEco.getImpFinanziato().add(imVariazioneFin));
dispPianoEco.setImpCofinanziato(dispPianoEco.getImpCofinanziato().add(imVariazioneCofin));
if (!listCtrlDispPianoEco.contains(dispPianoEco))
listCtrlDispPianoEco.add(dispPianoEco);
}
}
} else {
// 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);
}
}
}
for (CtrlDispPianoEco ctrlDispPianoEco : listCtrlDispPianoEco) {
Progetto_piano_economicoBulk ppe = ctrlDispPianoEco.getProgettoPianoEconomico();
if (Optional.ofNullable(ppe).isPresent()) {
try {
if (locked) {
Progetto_piano_economicoBulk bulkToFind = new Progetto_piano_economicoBulk();
bulkToFind.setVoce_piano_economico(ppe.getVoce_piano_economico());
bulkToFind.setPg_progetto(ppe.getPg_progetto());
bulkToFind.setEsercizio_piano(ppe.getEsercizio_piano());
try {
bulkToFind = (Progetto_piano_economicoBulk) ppeHome.findAndLock(bulkToFind);
} catch (ObjectNotFoundException ex) {
}
}
if (Optional.ofNullable(progettoRimodulato).isPresent()) {
// Controllo quota FINANZIATA
BigDecimal imRimodulatoFin = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppeRim -> ppeRim.getEsercizio_piano().equals(ppe.getEsercizio_piano())).filter(ppeRim -> ppeRim.getCd_voce_piano().equals(ppe.getCd_voce_piano())).filter(ppeRim -> ppeRim.getCd_unita_organizzativa().equals(ppe.getCd_unita_organizzativa())).map(Progetto_piano_economicoBulk::getIm_spesa_finanziato).reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
BigDecimal imStanziatoFin = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppeRim -> ppeRim.getEsercizio_piano().equals(ppe.getEsercizio_piano())).filter(ppeRim -> ppeRim.getCd_voce_piano().equals(ppe.getCd_voce_piano())).filter(ppeRim -> ppeRim.getCd_unita_organizzativa().equals(ppe.getCd_unita_organizzativa())).filter(ppeRim -> Optional.ofNullable(ppeRim.getVociBilancioAssociate()).isPresent()).flatMap(ppeRim -> ppeRim.getVociBilancioAssociate().stream()).filter(ppeRim -> Optional.ofNullable(ppeRim.getSaldoSpesa()).isPresent()).map(Ass_progetto_piaeco_voceBulk::getSaldoSpesa).map(el -> el.getAssestatoFinanziamento()).reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
// lo stanziato a quadrare con il rimodulato
if (imStanziatoFin.compareTo(imRimodulatoFin) > 0) {
if (ctrlDispPianoEco.getImpFinanziato().compareTo(BigDecimal.ZERO) > 0)
messaggio.add("La variazione della quota finanziata stanziata del piano economico " + ppe.getCd_voce_piano() + " (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpFinanziato()) + ") risulta essere positiva laddove la variazione richiesta dalla rimodulazione del progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + " deve essere solo negativa.");
// Es. se imRimodulato=1000 e imStanziato=2000 la variazione negativa non deve essere superiore a -1000
if (imRimodulatoFin.subtract(imStanziatoFin).subtract(ctrlDispPianoEco.getImpFinanziato()).compareTo(BigDecimal.ZERO) > 0)
messaggio.add("La variazione della quota finanziata stanziata del piano economico " + ppe.getCd_voce_piano() + " (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpFinanziato()) + ") risulta essere superiore alla variazione richiesta dalla rimodulazione del progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + " (" + new it.cnr.contab.util.EuroFormat().format(imRimodulatoFin.subtract(imStanziatoFin)) + ").");
} else {
// La variazione non deve superare la disponibilità residua data dalla differenza tra imRimodulato e imStanziato
if (imRimodulatoFin.subtract(imStanziatoFin).subtract(ctrlDispPianoEco.getImpFinanziato()).compareTo(BigDecimal.ZERO) < 0)
messaggio.add("La disponibilità rimodulata della quota finanziata del piano economico " + ppe.getCd_voce_piano() + " associato al progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + (ppe.getEsercizio_piano().equals(0) ? "" : " per l'esercizio " + ppe.getEsercizio_piano()) + " (" + new it.cnr.contab.util.EuroFormat().format(imRimodulatoFin.subtract(imStanziatoFin)) + ")" + " non è sufficiente a coprire la variazione (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpFinanziato()) + ").");
}
// Controllo quota COFINANZIATA
BigDecimal imRimodulatoCofin = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppeRim -> ppeRim.getEsercizio_piano().equals(ppe.getEsercizio_piano())).filter(ppeRim -> ppeRim.getCd_voce_piano().equals(ppe.getCd_voce_piano())).filter(ppeRim -> ppeRim.getCd_unita_organizzativa().equals(ppe.getCd_unita_organizzativa())).map(Progetto_piano_economicoBulk::getIm_spesa_cofinanziato).reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
BigDecimal imStanziatoCofin = progettoRimodulato.getAllDetailsProgettoPianoEconomico().stream().filter(ppeRim -> ppeRim.getEsercizio_piano().equals(ppe.getEsercizio_piano())).filter(ppeRim -> ppeRim.getCd_voce_piano().equals(ppe.getCd_voce_piano())).filter(ppeRim -> ppeRim.getCd_unita_organizzativa().equals(ppe.getCd_unita_organizzativa())).filter(ppeRim -> Optional.ofNullable(ppeRim.getVociBilancioAssociate()).isPresent()).flatMap(ppeRim -> ppeRim.getVociBilancioAssociate().stream()).filter(ppeRim -> Optional.ofNullable(ppeRim.getSaldoSpesa()).isPresent()).map(Ass_progetto_piaeco_voceBulk::getSaldoSpesa).map(el -> el.getAssestatoCofinanziamento()).reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
// Se l'importo stanziato è superiore a quello rimodulato, l'importo della variazione deve essere negativa al fine di riportare lo stanziato a quadrare con il rimodulato
if (imStanziatoCofin.compareTo(imRimodulatoCofin) > 0) {
if (ctrlDispPianoEco.getImpCofinanziato().compareTo(BigDecimal.ZERO) > 0)
messaggio.add("La variazione della quota cofinanziata stanziata del piano economico " + ppe.getCd_voce_piano() + " (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpCofinanziato()) + ") risulta essere positiva laddove la variazione richiesta dalla rimodulazione del progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + " deve essere solo negativa.");
// Es. se imRimodulato=1000 e imStanziato=2000 la variazione negativa non deve essere superiore a -1000
if (imRimodulatoCofin.subtract(imStanziatoCofin).subtract(ctrlDispPianoEco.getImpCofinanziato()).compareTo(BigDecimal.ZERO) > 0)
messaggio.add("La variazione della quota cofinanziata stanziata del piano economico " + ppe.getCd_voce_piano() + " (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpCofinanziato()) + ") risulta essere superiore alla variazione richiesta dalla rimodulazione del progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + " (" + new it.cnr.contab.util.EuroFormat().format(imRimodulatoCofin.subtract(imStanziatoCofin)) + ").");
} else {
// La variazione non deve superare la disponibilità residua data dalla differenza tra imRimodulato e imStanzato
if (imRimodulatoCofin.subtract(imStanziatoCofin).subtract(ctrlDispPianoEco.getImpCofinanziato()).compareTo(BigDecimal.ZERO) < 0)
messaggio.add("La disponibilità rimodulata della quota cofinanziata del piano economico " + ppe.getCd_voce_piano() + " associato al progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + (ppe.getEsercizio_piano().equals(0) ? "" : " per l'esercizio " + ppe.getEsercizio_piano()) + " (" + new it.cnr.contab.util.EuroFormat().format(imRimodulatoCofin.subtract(imStanziatoCofin)) + ")" + " non è sufficiente a coprire la variazione (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpCofinanziato()) + ").");
}
} else {
V_saldi_piano_econom_progettoBulk saldo = ((V_saldi_piano_econom_progettoHome) getHome(userContext, V_saldi_piano_econom_progettoBulk.class)).cercaSaldoPianoEconomico(ppe, "S");
BigDecimal dispResiduaFin = Optional.ofNullable(saldo).map(V_saldi_piano_econom_progettoBulk::getDispResiduaFinanziamento).orElse(BigDecimal.ZERO).subtract(ctrlDispPianoEco.getImpFinanziato());
if (dispResiduaFin.compareTo(BigDecimal.ZERO) < 0)
messaggio.add("La disponibilità quota finanziata del piano economico " + ppe.getCd_voce_piano() + " associato al progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + (ppe.getEsercizio_piano().equals(0) ? "" : " per l'esercizio " + ppe.getEsercizio_piano()) + " (" + new it.cnr.contab.util.EuroFormat().format(Optional.ofNullable(saldo).map(V_saldi_piano_econom_progettoBulk::getDispResiduaFinanziamento).orElse(BigDecimal.ZERO)) + ")" + " non è sufficiente a coprire la variazione (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpFinanziato()) + ").");
BigDecimal dispResiduaCofin = Optional.ofNullable(saldo).map(V_saldi_piano_econom_progettoBulk::getDispResiduaCofinanziamento).orElse(BigDecimal.ZERO).subtract(ctrlDispPianoEco.getImpCofinanziato());
if (dispResiduaCofin.compareTo(BigDecimal.ZERO) < 0)
messaggio.add("La disponibilità quota cofinanziata del piano economico " + ppe.getCd_voce_piano() + " associato al progetto " + ctrlDispPianoEco.getProgetto().getCd_progetto() + (ppe.getEsercizio_piano().equals(0) ? "" : " per l'esercizio " + ppe.getEsercizio_piano()) + " (" + new it.cnr.contab.util.EuroFormat().format(saldo.getDispResiduaCofinanziamento()) + ")" + " non è sufficiente a coprire la variazione (" + new it.cnr.contab.util.EuroFormat().format(ctrlDispPianoEco.getImpCofinanziato()) + ").");
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
} else {
ProgettoBulk prg = ctrlDispPianoEco.getProgetto();
{
BigDecimal totFinanziato = BigDecimal.ZERO;
if (Optional.ofNullable(progettoRimodulato).isPresent())
totFinanziato = progettoRimodulato.getImFinanziato();
else
totFinanziato = prg.getImFinanziato();
BigDecimal assestatoSpePrgFes = this.getStanziamentoAssestatoProgetto(userContext, prg, Elemento_voceHome.GESTIONE_SPESE, null, null, Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO);
if (totFinanziato.compareTo(assestatoSpePrgFes.add(ctrlDispPianoEco.getImpFinanziato())) < 0)
messaggio.add("Progetto " + prg.getCd_progetto() + ": l'assestato totale spese 'fonti esterne' (" + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgFes.add(ctrlDispPianoEco.getImpFinanziato())) + ") non può essere superiore alla quota finanziata (" + new it.cnr.contab.util.EuroFormat().format(totFinanziato) + ").");
}
{
BigDecimal totCofinanziato = BigDecimal.ZERO;
if (Optional.ofNullable(progettoRimodulato).isPresent())
totCofinanziato = progettoRimodulato.getImCofinanziato();
else
totCofinanziato = prg.getImCofinanziato();
BigDecimal assestatoSpePrgReimpiego = this.getStanziamentoAssestatoProgetto(userContext, prg, Elemento_voceHome.GESTIONE_SPESE, null, null, Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO);
if (totCofinanziato.compareTo(assestatoSpePrgReimpiego.add(ctrlDispPianoEco.getImpCofinanziato())) < 0)
messaggio.add("Progetto " + prg.getCd_progetto() + ": l'assestato totale spese 'fonti interne' e 'natura reimpiego' (" + new it.cnr.contab.util.EuroFormat().format(assestatoSpePrgReimpiego.add(ctrlDispPianoEco.getImpCofinanziato())) + ") non può essere superiore alla quota cofinanziata (" + new it.cnr.contab.util.EuroFormat().format(totCofinanziato) + ").");
}
}
}
}
} catch (PersistencyException e) {
throw new ComponentException(e);
} catch (RemoteException e) {
throw new ComponentException(e);
} catch (EJBException e) {
throw new ComponentException(e);
}
return messaggio.toString();
}
use of it.cnr.jada.comp.ComponentException in project sigla-main by consiglionazionaledellericerche.
the class SaldoComponent method checkPdgPianoEconomico.
public void checkPdgPianoEconomico(UserContext userContext, Pdg_variazioneBulk variazione) throws ComponentException {
try {
if (Utility.createParametriEnteComponentSession().isProgettoPianoEconomicoEnabled(userContext, CNRUserContext.getEsercizio(userContext))) {
Unita_organizzativaBulk uoScrivania = (Unita_organizzativaBulk) getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(CNRUserContext.getCd_unita_organizzativa(userContext)));
/*
* non effettuo alcun controllo se è collegata la UO Ente e la variazione è fatta dalla UO Ente
* oppure
* la variazione è generata automaticamente (es. in fase di emissione obbligazione)
*/
if (variazione.getCentro_responsabilita().getUnita_padre().isUoEnte() && (uoScrivania.isUoEnte() || Pdg_variazioneBulk.MOTIVAZIONE_VARIAZIONE_AUTOMATICA.equals(variazione.getTiMotivazioneVariazione())))
return;
/*
* non effettuo alcun controllo se si tratta di variazione IVA
*/
PersistentHome homeLiqVar = getHome(userContext, Liquidazione_iva_variazioniBulk.class);
SQLBuilder sqlLiqVar = homeLiqVar.createSQLBuilder();
sqlLiqVar.addClause(FindClause.AND, "esercizio_variazione_comp", SQLBuilder.EQUALS, variazione.getEsercizio());
sqlLiqVar.addClause(FindClause.AND, "pg_variazione_comp", SQLBuilder.EQUALS, variazione.getPg_variazione_pdg());
if (sqlLiqVar.executeCountQuery(getConnection(userContext)) > 0)
return;
it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession configSession = Utility.createConfigurazioneCnrComponentSession();
List<CtrlPianoEco> listCtrlPianoEco = new ArrayList<CtrlPianoEco>();
String cdNaturaReimpiego = configSession.getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO);
String cdVoceSpeciale = configSession.getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_ELEMENTO_VOCE_SPECIALE, Configurazione_cnrBulk.SK_TEMPO_IND_SU_PROGETTI_FINANZIATI);
String cdrPersonale = Optional.ofNullable(((Configurazione_cnrHome) getHome(userContext, Configurazione_cnrBulk.class)).getCdrPersonale(CNRUserContext.getEsercizio(userContext))).orElseThrow(() -> new ComponentException("Non è possibile individuare il codice CDR del Personale."));
CdrBulk cdrPersonaleBulk = (CdrBulk) getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(cdrPersonale));
String uoRagioneria = ((Configurazione_cnrHome) getHome(userContext, Configurazione_cnrBulk.class)).getUoRagioneria(CNRUserContext.getEsercizio(userContext));
Ass_pdg_variazione_cdrHome ass_cdrHome = (Ass_pdg_variazione_cdrHome) getHome(userContext, Ass_pdg_variazione_cdrBulk.class);
java.util.Collection<Pdg_variazione_riga_gestBulk> dettagliVariazione = ass_cdrHome.findDettagli(variazione);
for (Pdg_variazione_riga_gestBulk varStanzRiga : dettagliVariazione) {
// verifico se si tratta di area
CdrBulk cdrBulk = (CdrBulk) getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(varStanzRiga.getCd_cdr_assegnatario()));
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 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()));
boolean isDettPersonale = classif.getFl_accentrato() && cdrPersonale.equals(classif.getCdr_accentratore());
boolean isUoRagioneria = uoBulk.getCd_unita_organizzativa().equals(uoRagioneria);
// recupero la GAE
WorkpackageBulk linea = ((WorkpackageHome) getHome(userContext, WorkpackageBulk.class)).searchGAECompleta(userContext, varStanzRiga.getEsercizio(), varStanzRiga.getCd_cdr_assegnatario(), varStanzRiga.getCd_linea_attivita());
Optional.ofNullable(linea).orElseThrow(() -> new ApplicationException("Errore in fase di ricerca linea_attivita " + varStanzRiga.getEsercizio() + "/" + varStanzRiga.getCd_centro_responsabilita() + "/" + varStanzRiga.getCd_linea_attivita() + "."));
ProgettoBulk progetto = linea.getProgetto();
// effettuo controlli sulla validità del progetto
Optional.of(progetto.getOtherField()).filter(el -> el.isStatoApprovato() || el.isStatoChiuso()).orElseThrow(() -> new ApplicationException("Attenzione! Il progetto " + progetto.getCd_progetto() + " non risulta in stato approvato o chiuso. Variazione non consentita!"));
if (progetto.getOtherField().isDatePianoEconomicoRequired()) {
Optional.ofNullable(progetto.getOtherField().getDtInizio()).orElseThrow(() -> new ApplicationException("Attenzione! GAE " + linea.getCd_linea_attivita() + " non selezionabile. " + "La data inizio del progetto non risulta impostata."));
Optional.ofNullable(progetto.getOtherField().getDtFine()).orElseThrow(() -> new ApplicationException("Attenzione! GAE " + linea.getCd_linea_attivita() + " non selezionabile. " + "La data fine del progetto non risulta impostata."));
// Nelle variazioni controllare la più piccola data tra data inizio progetto e data stipula contratto definitivo
// Recupero la lista dei contratti attivi collegati al progetto
ProgettoHome progettoHome = (ProgettoHome) getHome(userContext, ProgettoBulk.class);
java.util.Collection<ContrattoBulk> contrattiAssociati = progettoHome.findContratti(progetto.getPg_progetto());
Optional<ContrattoBulk> optContratto = contrattiAssociati.stream().filter(el -> el.isAttivo() || el.isAttivo_e_Passivo()).min((p1, p2) -> p1.getDt_stipula().compareTo(p2.getDt_stipula())).filter(el -> el.getDt_stipula().before(progetto.getOtherField().getDtInizio()));
if (optContratto.isPresent())
optContratto.filter(ctr -> ctr.getDt_stipula().after(variazione.getDt_chiusura())).ifPresent(ctr -> {
throw new ApplicationRuntimeException("Attenzione! GAE " + linea.getCd_linea_attivita() + " non selezionabile. " + "La data stipula (" + new java.text.SimpleDateFormat("dd/MM/yyyy").format(ctr.getDt_stipula()) + ") del primo contratto " + ctr.getEsercizio() + "/" + ctr.getStato() + "/" + ctr.getPg_contratto() + " associato al progetto " + progetto.getCd_progetto() + " è successiva " + "rispetto alla data di chiusura della variazione (" + new java.text.SimpleDateFormat("dd/MM/yyyy").format(variazione.getDt_chiusura()) + ").");
});
else
Optional.of(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()) + ")."));
}
// recupero il record se presente altrimenti ne creo uno nuovo
CtrlPianoEco pianoEco = listCtrlPianoEco.stream().filter(el -> el.getProgetto().getPg_progetto().equals(progetto.getPg_progetto())).findFirst().orElse(new CtrlPianoEco(progetto));
if (variazione.isVariazioneRimodulazioneProgetto()) {
if (variazione.getProgettoRimodulazione().getPg_progetto().compareTo(progetto.getPg_progetto()) != 0)
throw new ApplicationException("Attenzione! Nella variazione " + variazione.getEsercizio() + "/" + variazione.getPg_variazione_pdg() + " risulta movimentato un progetto differente rispetto a quello della " + "rimodulazione associata. Operazione non possibile!");
pianoEco.setRimodulazione(variazione.getProgettoRimodulazione());
}
// creo il dettaglio
CtrlPianoEcoDett dett = new CtrlPianoEcoDett();
dett.setTipoDett(varStanzRiga.getTi_gestione());
dett.setImporto(varStanzRiga.getIm_variazione());
dett.setCdrPersonale(isDettPersonale);
dett.setUoArea(isUoArea);
dett.setUoRagioneria(isUoRagioneria);
dett.setElementoVoce(varStanzRiga.getElemento_voce());
if (Optional.ofNullable(cdNaturaReimpiego).map(el -> el.equals(linea.getNatura().getCd_natura())).orElse(Boolean.FALSE)) {
dett.setTipoNatura(CtrlPianoEcoDett.TIPO_REIMPIEGO);
if (!variazione.getTipo_variazione().isStorno())
throw new ApplicationException("Attenzione! Risultano movimentazioni sulla GAE " + linea.getCd_linea_attivita() + " con natura 6 - 'Reimpiego di risorse' " + " consentito solo per operazioni di storno. Operazione non possibile.");
} else if (linea.getNatura().isFonteEsterna())
dett.setTipoNatura(CtrlPianoEcoDett.TIPO_FONTE_ESTERNA);
else
dett.setTipoNatura(CtrlPianoEcoDett.TIPO_FONTE_INTERNA);
dett.setVoceSpeciale(Optional.ofNullable(cdVoceSpeciale).map(el -> el.equals(varStanzRiga.getCd_elemento_voce())).orElse(Boolean.FALSE));
pianoEco.getDett().add(dett);
if (!listCtrlPianoEco.contains(pianoEco))
listCtrlPianoEco.add(pianoEco);
}
controllaPdgPianoEconomico(userContext, variazione, listCtrlPianoEco, cdVoceSpeciale, cdrPersonaleBulk);
}
} catch (DetailedRuntimeException _ex) {
throw new ApplicationException(_ex.getMessage());
} catch (PersistencyException | RemoteException | IntrospectionException | SQLException e) {
throw new ComponentException(e);
}
}
use of it.cnr.jada.comp.ComponentException in project sigla-main by consiglionazionaledellericerche.
the class SaldoComponent method checkDispPianoEconomicoProgetto.
/**
* Metodo che verifica la congruenza delle disponibilità sul piano economico del progetto
*
* @param userContext
* @param moduloCosti
* @param isFromChangeStato indica che la modifica è stata richiesta in fase di cambio stato progetto
* @throws ComponentException
*/
public void checkDispPianoEconomicoProgetto(UserContext userContext, Pdg_modulo_costiBulk moduloCosti, boolean isFromChangeStato) throws ComponentException {
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(moduloCosti.getEsercizio()) <= 0).isPresent()) {
Progetto_piano_economicoHome ppeHome = (Progetto_piano_economicoHome) getHome(userContext, Progetto_piano_economicoBulk.class);
List<Progetto_piano_economicoBulk> pianoEconomicoList = (List<Progetto_piano_economicoBulk>) ppeHome.findProgettoPianoEconomicoList(moduloCosti.getPg_progetto());
List<Pdg_modulo_speseBulk> speseList = (List<Pdg_modulo_speseBulk>) moduloCosti.getDettagliSpese();
pianoEconomicoList.stream().filter(e -> e.getFl_ctrl_disp() && (e.getEsercizio_piano().equals(0) || e.getEsercizio_piano().equals(moduloCosti.getEsercizio()))).forEach(e -> {
try {
Progetto_piano_economicoBulk bulk = null;
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 {
bulk = (Progetto_piano_economicoBulk) getHome(userContext, Progetto_piano_economicoBulk.class).findAndLock(bulkToFind);
} catch (ObjectNotFoundException ex) {
}
if (bulk != null && bulk.getFl_ctrl_disp()) {
V_saldi_piano_econom_progettoBulk saldo = ((V_saldi_piano_econom_progettoHome) getHome(userContext, V_saldi_piano_econom_progettoBulk.class)).cercaSaldoPianoEconomico(bulk, "S");
BigDecimal dispResiduaFin = saldo.getDispResiduaFinanziamento();
if (!isFromChangeStato)
dispResiduaFin = dispResiduaFin.subtract(speseList.stream().filter(x -> Optional.ofNullable(x.getVoce_piano_economico()).isPresent()).filter(x -> x.getVoce_piano_economico().equalsByPrimaryKey(e.getVoce_piano_economico())).map(el -> Utility.nvl(el.getIm_spese_gest_decentrata_est())).collect(Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));
if (dispResiduaFin.compareTo(BigDecimal.ZERO) < 0)
throw new ApplicationException("Impossibile effettuare l'operazione !\n" + "L'importo indicato in previsione per le fonti decentrate esterne supera di " + new it.cnr.contab.util.EuroFormat().format(dispResiduaFin.abs()) + " l'importo finanziato indicato sul piano economico " + e.getCd_voce_piano() + " del progetto " + (e.getEsercizio_piano().equals(0) ? "" : "per l'esercizio " + e.getEsercizio_piano()) + ".");
if (isFromChangeStato && Optional.ofNullable(moduloCosti).flatMap(el -> Optional.ofNullable(el.getPdg_modulo())).flatMap(el -> Optional.ofNullable(el.getProgetto())).flatMap(el -> Optional.ofNullable(el.getOtherField())).flatMap(el -> Optional.ofNullable(el.getTipoFinanziamento())).map(TipoFinanziamentoBulk::getFlAllPrevFin).orElse(Boolean.TRUE) && dispResiduaFin.compareTo(BigDecimal.ZERO) != 0) {
Voce_piano_economico_prgBulk vocePianoEconomico = (Voce_piano_economico_prgBulk) ((Voce_piano_economico_prgHome) getHome(userContext, Voce_piano_economico_prgBulk.class)).findByPrimaryKey(e.getVoce_piano_economico());
if (Optional.ofNullable(vocePianoEconomico).map(Voce_piano_economico_prgBulk::getFlAllPrevFin).orElse(Boolean.TRUE))
throw new ApplicationException("Impossibile effettuare l'operazione !\n" + "L'importo totale indicato in previsione per le fonti decentrate esterne non corrisponde " + " all'importo finanziato indicato sul piano economico " + e.getCd_voce_piano() + " del progetto " + (e.getEsercizio_piano().equals(0) ? "" : "per l'esercizio " + e.getEsercizio_piano()) + "(diff: " + new it.cnr.contab.util.EuroFormat().format(dispResiduaFin) + ").");
}
BigDecimal dispResiduaCofin = saldo.getDispResiduaCofinanziamento();
if (!isFromChangeStato)
dispResiduaCofin = dispResiduaCofin.subtract(speseList.stream().filter(x -> Optional.ofNullable(x.getVoce_piano_economico()).isPresent()).filter(x -> x.getVoce_piano_economico().equalsByPrimaryKey(e.getVoce_piano_economico())).map(el -> Utility.nvl(el.getIm_spese_gest_decentrata_int())).collect(Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)));
if (dispResiduaCofin.compareTo(BigDecimal.ZERO) < 0)
throw new ApplicationException("Impossibile effettuare l'operazione !\n" + "L'importo indicato in previsione per le fonti decentrate interne supera di " + new it.cnr.contab.util.EuroFormat().format(dispResiduaCofin.abs()) + " l'importo cofinanziato indicato sul piano economico " + e.getCd_voce_piano() + " del progetto " + (e.getEsercizio_piano().equals(0) ? "" : "per l'esercizio " + e.getEsercizio_piano()) + ".");
}
} catch (Exception ex) {
throw new RuntimeException(ex);
}
});
}
} catch (Exception e) {
if (e instanceof RuntimeException)
throw handleException(e.getCause());
throw handleException(e);
}
}
use of it.cnr.jada.comp.ComponentException in project sigla-main by consiglionazionaledellericerche.
the class ObbligazioneComponent method verificaCoperturaContratto.
public void verificaCoperturaContratto(UserContext aUC, ObbligazioneBulk obbligazione, int flag) throws ComponentException {
// Controllo che l'obbligazione non abbia sfondato il contratto
if (obbligazione.isCheckDisponibilitaContrattoEseguito())
return;
if (obbligazione.getContratto() != null && obbligazione.getContratto().getPg_contratto() != null) {
try {
ContrattoHome contrattoHome = (ContrattoHome) getHome(aUC, ContrattoBulk.class);
SQLBuilder sql = contrattoHome.calcolaTotObbligazioni(aUC, obbligazione.getContratto());
BigDecimal totale = null;
try {
java.sql.ResultSet rs = null;
LoggableStatement ps = null;
try {
ps = sql.prepareStatement(getConnection(aUC));
try {
rs = ps.executeQuery();
if (rs.next())
totale = rs.getBigDecimal(1);
} catch (java.sql.SQLException e) {
throw handleSQLException(e);
} finally {
if (rs != null)
try {
rs.close();
} catch (java.sql.SQLException e) {
}
;
}
} finally {
if (ps != null)
try {
ps.close();
} catch (java.sql.SQLException e) {
}
;
}
} catch (java.sql.SQLException ex) {
throw handleException(ex);
}
if (flag == INSERIMENTO)
totale = totale.add(obbligazione.getIm_obbligazione());
if (totale != null) {
if (totale.compareTo(obbligazione.getContratto().getIm_contratto_passivo()) > 0) {
throw handleException(new CheckDisponibilitaContrattoFailed("La somma degli impegni associati supera l'importo definito nel contratto."));
}
}
} catch (IntrospectionException e1) {
throw new it.cnr.jada.comp.ComponentException(e1);
} catch (PersistencyException e1) {
throw new it.cnr.jada.comp.ComponentException(e1);
}
}
}
use of it.cnr.jada.comp.ComponentException in project sigla-main by consiglionazionaledellericerche.
the class ObbligazioneComponent method modificaConBulk.
/**
* Tutti i controlli superati - contesto non transazionale
* PreCondition:
* Una richiesta di modifica di un'obbligazione e' stata generata
* L'obbligazione ha superato i controlli eseguiti dal metodo 'verificaObbligazione'
* L'obbligazione ha superato i controlli sulla disponibilità di cassa delle voci del piano eseguiti dal metodo 'aggiornaCapitoloSaldoObbligazione'
* L'obbligazione non e' stata modificata in un contesto transazionale
* PostCondition:
* L'obbligazione viene aggiornata
* I dettagli di tutte le scadenze vengono aggiornati (metodo generaDettagliScadenzaObbligazione)
* I saldi dei capitoli dei dettagli delle scadenze vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione)
* Lo stato COFI/COGE degli eventuali doc. amministrativi associati all'obbligazione e' stato aggiornato
* Tutti i controlli superati - contesto transazionale
* PreCondition:
* Una richiesta di modifica di un'obbligazione e' stata generata
* L'obbligazione ha superato i controlli eseguiti dal metodo 'verificaObbligazione'
* L'obbligazione ha superato i controlli sulla disponibilità di cassa delle voci del piano eseguiti dal metodo 'aggiornaCapitoloSaldoObbligazione'
* L'obbligazione e' stata modificata in un contesto transazionale
* PostCondition:
* L'obbligazione viene aggiornata e i dettagli di tutte le scadenze vengono aggiornati (metodo generaDettagliScadenzaObbligazione)
* Errore di verifica obbligazione
* PreCondition:
* Una richiesta di modifica di un'obbligazione e' stata generata e l'obbligazione non ha superato i
* controlli eseguiti dal metodo 'verificaObbligazione'
* PostCondition:
* Viene generata un'ApplicationException che descrive all'utente l'errore che si e' verificato
* Errore di disponibilità di cassa
* PreCondition:
* Una richiesta di modifica di un'obbligazione e' stata generata e l'obbligazione non ha superato i
* controlli di disponibilità di cassa eseguiti dal metodo 'aggiornaCapitoloSaldoObbligazione'
* PostCondition:
* Viene generata un'ApplicationException che descrive all'utente l'errore che si e' verificato
* Errore di disponibilità di cassa - forzatura
* PreCondition:
* Una richiesta di modifica di un'obbligazione e' stata generata e l'obbligazione non ha superato i
* controlli di disponibilità di cassa eseguiti dal metodo 'aggiornaCapitoloSaldoObbligazione'
* e l'utente ha scelto di forzare l'emissione dell'obbligazione
* PostCondition:
* L'obbligazione viene modificata, i dettagli di tutte le scadenze vengono modificati (metodo generaDettagliScadenzaObbligazione) e i saldi
* dei capitoli dei dettagli delle scadenze vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione)
*
* @param aUC lo user context
* @param bulk l'istanza di <code>ObbligazioneBulk</code> da modificare
* @return l'istanza di <code>ObbligazioneBulk</code> modificata
*/
public OggettoBulk modificaConBulk(UserContext aUC, OggettoBulk bulk) throws ComponentException {
try {
Obbligazione_scadenzarioBulk scadenza;
ObbligazioneBulk obbligazione = (ObbligazioneBulk) bulk;
validaCampi(aUC, obbligazione);
/* simona 23.10.2002 : invertito l'ordine della verifica e della generzione dettagli x problema 344 */
// genera eventualmente i dettagli che non erano ancora stati generati
generaDettagliScadenzaObbligazione(aUC, obbligazione, null);
// verifica la correttezza dell'obbligazione
verificaObbligazione(aUC, obbligazione);
// verifica la correttezza dell'imputazione finanziaria
validaImputazioneFinanziaria(aUC, obbligazione);
// aggiorna il db:
updateBulk(aUC, obbligazione);
makeBulkListPersistent(aUC, obbligazione.getObbligazione_scadenzarioColl());
// esegue il check di disponibilita di cassa
controllaDisponibilitaCassaPerVoce(aUC, obbligazione, MODIFICA);
verificaCoperturaContratto(aUC, obbligazione);
verificaCoerenzaGaeContratto(aUC, obbligazione);
verificaCoperturaIncaricoRepertorio(aUC, obbligazione);
if (!aUC.isTransactional()) {
// aggiorna il capitolo saldo
aggiornaCapitoloSaldoObbligazione(aUC, obbligazione, MODIFICA);
aggiornaStatoCOAN_COGEDocAmm(aUC, obbligazione);
}
// Se utente non è supervisore e la voce va azzerata non è possibile aumentare l'importo dell'impegno residuo
if (obbligazione.isObbligazioneResiduo())
if (verificaVoceResidua(aUC, obbligazione))
if (obbligazione.getIm_iniziale_obbligazione().compareTo(obbligazione.getIm_obbligazione()) < 0)
throw new ApplicationException("Aggiornamento non consentito! L'impegno residuo non può essere aumentato");
obbligazione.setIm_iniziale_obbligazione(obbligazione.getIm_obbligazione());
obbligazione.setCd_iniziale_elemento_voce(obbligazione.getCd_elemento_voce());
if (obbligazione.isObbligazioneResiduo()) {
if (((ObbligazioneResBulk) obbligazione).isSaldiDaAggiornare()) {
// aggiorniamo i saldi legati alle modifiche agli impegni residui
aggiornaSaldiImpegniResiduiPropri(aUC, obbligazione);
// aggiorniamo il progressivo in definitivo
Obbligazione_modificaBulk obbMod = ((ObbligazioneResBulk) obbligazione).getObbligazione_modifica();
if (obbMod != null && obbMod.isTemporaneo()) {
aggiornaObbligazioneModificaTemporanea(aUC, obbMod);
}
}
}
verificaStatoEsercizio(aUC, ((CNRUserContext) aUC).getEsercizio(), obbligazione.getCd_cds());
validaCreaModificaOrigineFonti(aUC, obbligazione);
obbligazione = validaCreaModificaElementoVoceNext(aUC, obbligazione);
return obbligazione;
} catch (Exception e) {
throw handleException(e);
}
}
Aggregations