it.cnr.contab.doccont00.comp.SaldoComponent Maven / Gradle / Ivy
/*
* Copyright (C) 2019 Consiglio Nazionale delle Ricerche
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package it.cnr.contab.doccont00.comp;
import java.io.Serializable;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.StringJoiner;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.ejb.EJBException;
import it.cnr.contab.config00.bulk.*;
import it.cnr.contab.config00.contratto.bulk.ContrattoBulk;
import it.cnr.contab.config00.contratto.bulk.ContrattoHome;
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;
import it.cnr.contab.config00.latt.bulk.WorkpackageBulk;
import it.cnr.contab.config00.latt.bulk.WorkpackageHome;
import it.cnr.contab.config00.pdcfin.bulk.Ass_evold_evnewBulk;
import it.cnr.contab.config00.pdcfin.bulk.Ass_evold_evnewHome;
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.pdcfin.cla.bulk.Classificazione_vociBulk;
import it.cnr.contab.config00.sto.bulk.CdrBulk;
import it.cnr.contab.config00.sto.bulk.CdrHome;
import it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.doccont00.core.bulk.Numerazione_doc_contBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneHome;
import it.cnr.contab.gestiva00.core.bulk.Liquidazione_iva_variazioniBulk;
import it.cnr.contab.pdg00.bulk.Pdg_variazioneBulk;
import it.cnr.contab.pdg00.bulk.Pdg_variazioneHome;
import it.cnr.contab.pdg00.cdip.bulk.Ass_pdg_variazione_cdrBulk;
import it.cnr.contab.pdg00.cdip.bulk.Ass_pdg_variazione_cdrHome;
import it.cnr.contab.pdg01.bulk.Pdg_variazione_riga_gestBulk;
import it.cnr.contab.pdg01.bulk.Pdg_variazione_riga_gestHome;
import it.cnr.contab.pdg01.bulk.Tipo_variazioneBulk;
import it.cnr.contab.prevent00.bulk.Pdg_vincoloBulk;
import it.cnr.contab.prevent00.bulk.Pdg_vincoloHome;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaHome;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cmpBulk;
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.*;
import it.cnr.contab.progettiric00.tabrif.bulk.Voce_piano_economico_prgBulk;
import it.cnr.contab.progettiric00.tabrif.bulk.Voce_piano_economico_prgHome;
import it.cnr.contab.utenze00.bp.CNRUserContext;
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.contab.varstanz00.bulk.Var_stanz_res_rigaHome;
import it.cnr.jada.DetailedRuntimeException;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ApplicationRuntimeException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.ObjectNotFoundException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.FindClause;
import it.cnr.jada.persistency.sql.PersistentHome;
import it.cnr.jada.persistency.sql.SQLBuilder;
public class SaldoComponent extends it.cnr.jada.comp.GenericComponent implements ISaldoMgr,Cloneable,Serializable
{
private class CtrlDispPianoEco {
public CtrlDispPianoEco(ProgettoBulk progetto, Progetto_piano_economicoBulk progettoPianoEconomico) {
super();
this.progetto = progetto;
this.progettoPianoEconomico = progettoPianoEconomico;
this.impFinanziato = BigDecimal.ZERO;
this.impCofinanziato = BigDecimal.ZERO;
}
private ProgettoBulk progetto;
private Progetto_piano_economicoBulk progettoPianoEconomico;
private BigDecimal impFinanziato;
private BigDecimal impCofinanziato;
public ProgettoBulk getProgetto() {
return progetto;
}
public void setProgetto(ProgettoBulk progetto) {
this.progetto = progetto;
}
public Progetto_piano_economicoBulk getProgettoPianoEconomico() {
return progettoPianoEconomico;
}
public void setProgettoPianoEconomico(Progetto_piano_economicoBulk progettoPianoEconomico) {
this.progettoPianoEconomico = progettoPianoEconomico;
}
public BigDecimal getImpFinanziato() {
return impFinanziato;
}
public void setImpFinanziato(BigDecimal impFinanziato) {
this.impFinanziato = impFinanziato;
}
public BigDecimal getImpCofinanziato() {
return impCofinanziato;
}
public void setImpCofinanziato(BigDecimal impCofinanziato) {
this.impCofinanziato = impCofinanziato;
}
}
private class CtrlPianoEcoDett {
private String tipoNatura;
private boolean isUoArea;
private boolean isCdrPersonale;
private boolean isUoRagioneria;
private boolean isVoceSpeciale;
private Elemento_voceBulk elementoVoce;
private String tipoDett;
private BigDecimal importo = BigDecimal.ZERO;
private final static String TIPO_REIMPIEGO = "RIM";
private final static String TIPO_FONTE_INTERNA = "FIN";
private final static String TIPO_FONTE_ESTERNA = "FES";
public String getTipoNatura() {
return tipoNatura;
}
public void setTipoNatura(String tipoNatura) {
this.tipoNatura = tipoNatura;
}
public boolean isUoArea() {
return isUoArea;
}
public void setUoArea(boolean isUoArea) {
this.isUoArea = isUoArea;
}
public boolean isCdrPersonale() {
return isCdrPersonale;
}
public void setCdrPersonale(boolean isCdrPersonale) {
this.isCdrPersonale = isCdrPersonale;
}
public boolean isUoRagioneria() { return isUoRagioneria; }
public void setUoRagioneria(boolean isUoRagioneria) { this.isUoRagioneria = isUoRagioneria; }
public boolean isVoceSpeciale() {
return isVoceSpeciale;
}
public void setVoceSpeciale(boolean isVoceSpeciale) {
this.isVoceSpeciale = isVoceSpeciale;
}
public Elemento_voceBulk getElementoVoce() {
return elementoVoce;
}
public void setElementoVoce(Elemento_voceBulk elementoVoce) {
this.elementoVoce = elementoVoce;
}
public String getTipoDett() {
return tipoDett;
}
public void setTipoDett(String tipoDett) {
this.tipoDett = tipoDett;
}
public BigDecimal getImporto() {
return importo;
}
public void setImporto(BigDecimal importo) {
this.importo = importo;
}
public boolean isNaturaReimpiego(){
return TIPO_REIMPIEGO.equals(getTipoNatura());
}
public boolean isNaturaFonteEsterna(){
return TIPO_FONTE_ESTERNA.equals(getTipoNatura());
}
public boolean isNaturaFonteInterna(){
return TIPO_FONTE_INTERNA.equals(getTipoNatura());
}
public boolean isTipoEntrata(){
return Elemento_voceHome.GESTIONE_ENTRATE.equals(getTipoDett());
}
public boolean isTipoSpesa(){
return Elemento_voceHome.GESTIONE_SPESE.equals(getTipoDett());
}
}
private class CtrlPianoEco {
public CtrlPianoEco(ProgettoBulk progetto) {
super();
this.progetto = progetto;
}
private ProgettoBulk progetto;
private List dett = new ArrayList();
public ProgettoBulk getProgetto() {
return progetto;
}
public void setProgetto(ProgettoBulk progetto) {
this.progetto = progetto;
}
public List getDett() {
return dett;
}
public void setDett(List dett) {
this.dett = dett;
}
public BigDecimal getImpSpesaPositivi() {
return this.getImpSpesaPositivi(dett.stream());
}
public BigDecimal getImpSpesaNegativi() {
return this.getImpSpesaNegativi(dett.stream());
}
public BigDecimal getImpSpesaPositiviArea() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isUoArea));
}
public BigDecimal getImpSpesaNegativiArea() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isUoArea));
}
public BigDecimal getImpSpesaPositiviAreaNaturaReimpiego() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isUoArea).filter(CtrlPianoEcoDett::isNaturaReimpiego));
}
public BigDecimal getImpSpesaNegativiAreaNaturaReimpiego() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isUoArea).filter(CtrlPianoEcoDett::isNaturaReimpiego));
}
public BigDecimal getImpSpesaPositiviRagioneria() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isUoRagioneria));
}
public BigDecimal getImpSpesaNegativiRagioneria() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isUoRagioneria));
}
public BigDecimal getImpSpesaPositiviCdrPersonale() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isCdrPersonale));
}
public BigDecimal getImpSpesaNegativiCdrPersonale() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isCdrPersonale));
}
public BigDecimal getImpSpesaPositiviNaturaReimpiego() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isNaturaReimpiego));
}
public BigDecimal getImpSpesaNegativiNaturaReimpiego() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isNaturaReimpiego));
}
public BigDecimal getImpSpesaPositiviVoceSpeciale() {
return this.getImpSpesaPositivi(dett.stream().filter(CtrlPianoEcoDett::isVoceSpeciale));
}
public BigDecimal getImpSpesaNegativiVoceSpeciale() {
return this.getImpSpesaNegativi(dett.stream().filter(CtrlPianoEcoDett::isVoceSpeciale));
}
public BigDecimal getImpEntrataPositivi(){
return dett.stream().filter(CtrlPianoEcoDett::isTipoEntrata).filter(el->el.getImporto().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEcoDett::getImporto).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
}
public BigDecimal getImpEntrataNegativi(){
return dett.stream().filter(CtrlPianoEcoDett::isTipoEntrata).filter(el->el.getImporto().compareTo(BigDecimal.ZERO)<0)
.map(CtrlPianoEcoDett::getImporto).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO).abs();
}
public Timestamp getDtScadenza() {
return Optional.ofNullable(
Optional.ofNullable(progetto.getOtherField().getDtProroga()).orElse(progetto.getOtherField().getDtFine()))
.orElse(null);
}
public boolean isScaduto(Timestamp dataRiferimento) {
return Optional.ofNullable(this.getDtScadenza()).map(dt->dt.before(dataRiferimento)).orElse(Boolean.FALSE);
}
private BigDecimal getImpSpesaPositivi(Stream stream){
return stream.filter(CtrlPianoEcoDett::isTipoSpesa).filter(el->el.getImporto().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEcoDett::getImporto).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
}
private BigDecimal getImpSpesaNegativi(Stream stream){
return stream.filter(CtrlPianoEcoDett::isTipoSpesa).filter(el->el.getImporto().compareTo(BigDecimal.ZERO)<0)
.map(CtrlPianoEcoDett::getImporto).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO).abs();
}
/**
* Ritorna l'importo positivo della spesa al netto degli importi di Natura Reimpiego, Area e Cdr Personale
* Calcolo:
* Totale Importi Positivi
* - Totale Importi Positivi di Natura Reimpiego
* - Totale Importi Positivi di Area al netto della Natura Reimpiego (il cui valore è ricompreso al punto precedente)
* - Totale Importi Positivi di CDR Personale
* - Totale Importi Positivi Voce Speciale 11048 al netto della quota compresa in Aree o Personale (il cui valore è ricompreso nei punti precedente)
*/
public BigDecimal getImpSpesaPositiviNetti() {
return this.getImpSpesaPositivi().subtract(this.getImpSpesaPositiviNaturaReimpiego())
.subtract(this.getImpSpesaPositiviArea().subtract(this.getImpSpesaPositiviAreaNaturaReimpiego()))
.subtract(this.getImpSpesaPositiviCdrPersonale())
.subtract(this.getImpSpesaPositivi(dett.stream()
.filter(CtrlPianoEcoDett::isVoceSpeciale)
.filter(el->!el.isCdrPersonale())
.filter(el->!el.isUoArea())));
}
/**
* Ritorna l'importo negativo della spesa al netto degli importi di Natura Reimpiego, Area e Cdr Personale
* Calcolo:
* Totale Importi Negativi
* - Totale Importi Negativi di Natura Reimpiego
* - Totale Importi Negativi di Area al netto della Natura Reimpiego (il cui valore è ricompreso al punto precedente)
* - Totale Importi Negativi di CDR Personale
* - Totale Importi Negativi Voce Speciale 11048 al netto della quota compresa in Aree o Personale (il cui valore è ricompreso nei punti precedente)
*/
public BigDecimal getImpSpesaNegativiNetti() {
return this.getImpSpesaNegativi().subtract(this.getImpSpesaNegativiNaturaReimpiego())
.subtract(this.getImpSpesaNegativiArea().subtract(this.getImpSpesaNegativiAreaNaturaReimpiego()))
.subtract(this.getImpSpesaNegativiCdrPersonale())
.subtract(this.getImpSpesaNegativi(dett.stream()
.filter(CtrlPianoEcoDett::isVoceSpeciale)
.filter(el->!el.isCdrPersonale())
.filter(el->!el.isUoArea())));
}
}
/**
* aggiornamento importo relativo a mandati e reversali
* PreCondition:
* E' stata cancellato un mandato o creata/cancellata una reversale
* PostCondition:
* Viene aggiornato l'importo associato a mandati e reversali della voce del piano (di competenza o residuo) interessata dal mandato o
* dalla reversale senza eseguire il controllo di disponibilità di cassa
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param cd_cds il codice del Cds per cui aggiornare i saldi
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) da aggiornare
*/
public Voce_f_saldi_cmpBulk aggiornaMandatiReversali(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo ) throws ComponentException
{
return aggiornaMandatiReversali( userContext, voce, cd_cds, importo, ti_competenza_residuo, false );
}
/**
* creazione mandato
* PreCondition:
* E' stata creato un nuovo mandato e viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaMandati)
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dal mandato
* creazione mandato - errore
* PreCondition:
* E' stata creato un nuovo mandato e non viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaMandati)
* PostCondition:
* Viene segnalato con un errore l'impossibilità di emettere il mandato
* annullamento mandato
* PreCondition:
* E' stata annullato un mandato
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dal mandato
* creazione/annullamento reversale
* PreCondition:
* E' stata creata una nuova reversale o e' stata annullata una reversale già emessa
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dalla reversale
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param cd_cds il codice del Cds per cui aggiornare i saldi
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) da aggiornare
* @param checkDisponibilitaCassa valore booleano che indica se eseguire la verifica della disponibilità di cassa sulla
* voce del piano
*/
public Voce_f_saldi_cmpBulk aggiornaMandatiReversali(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo, boolean checkDisponibilitaCassa ) throws ComponentException
{
try
{
Voce_f_saldi_cmpBulk saldo;
if ( checkDisponibilitaCassa)
saldo = checkDisponabilitaCassaMandati( userContext, voce, cd_cds, importo,ti_competenza_residuo );
else
saldo = findAndLock( userContext, cd_cds, voce, ti_competenza_residuo );
if (saldo != null){
saldo.setIm_mandati_reversali( saldo.getIm_mandati_reversali().add( importo.setScale(2, importo.ROUND_HALF_UP) ));
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
updateBulk( userContext, saldo );
}
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* aggiornamento importo relativo a obbligazioni/accertamento
* PreCondition:
* E' stata creato/modificato importo/cancellato un accertamento oppure e' stata
* cancellata un'obbligazione o e' stato diminuito l'importo del dettaglio di una scadenza dell'obbligazione
* PostCondition:
* Viene aggiornato l'importo associato a obbligazioni/accertamenti della voce del piano (di competenza o residuo)
* interessata dall'accertamento o dai dettagli delle scadenze dell'obbligazione
* senza eseguire il controllo di disponibilità di cassa
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param cd_cds il codice del Cds per cui aggiornare i saldi
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) da aggiornare
*/
public Voce_f_saldi_cmpBulk aggiornaObbligazioniAccertamenti(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo ) throws ComponentException
{
return aggiornaObbligazioniAccertamenti( userContext, voce, cd_cds, importo, ti_competenza_residuo, false );
}
/**
* creazione obbligazione/modifica importo obbligazione
* PreCondition:
* E' stato creato un nuovo dettaglio di scadenza di obbligazione o ne e' stato incrementato l'importo
* e viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaObbligazione)
* PostCondition:
* Viene aggiornato per il cds di appartenenza dell'obbligazione l'importo associato a obbligazione e accertamenti
* della voce del piano (di competenza o residuo) interessata dal dettaglio della scadenza di obbligazione
* creazione obbligazione/modifica importo obbligazione - errore
* PreCondition:
* E' stato creato un nuovo dettaglio di scadenza di obbligazione o ne e' stato incrementato l'importo
* e non viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaObbligazione)
* PostCondition:
* Viene segnalato con un errore l'impossibilità di creare/aggiornare l'obbligazione
* eliminazione obbligazione
* PreCondition:
* E' stata eliminato un dettaglio di scadenza di obbligazione
* PostCondition:
* Viene aggiornato per il cds di appartenenza dell'obbligazione l'importo associato a obbligazione e accertamenti
* della voce del piano (di competenza o residuo) interessata dal dettaglio della scadenza di obbligazione
* creazione/modifica/eliminazione accertamento
* PreCondition:
* E' stata creato un nuovo accertamento oppure e' stato modificato l'importo di un accertamento oppure e' stato
* cancellato un accertamento
* PostCondition:
* Viene aggiornato per il cds di appartenenza dell'accertamento l'importo associato a obbligazione e accertamenti
* della voce del piano (di competenza o residuo) interessata dall'accertamento
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param cd_cds il codice del Cds per cui aggiornare i saldi
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) da aggiornare
* @param checkDisponibilitaCassa valore booleano che indica se eseguire la verifica della disponibilità di cassa sulla
* voce del piano
*
*/
public Voce_f_saldi_cmpBulk aggiornaObbligazioniAccertamenti(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo, boolean checkDisponibilitaCassa ) throws ComponentException
{
try
{
Voce_f_saldi_cmpBulk saldo;
if ( checkDisponibilitaCassa )
saldo = checkDisponabilitaCassaObbligazioni( userContext, voce, cd_cds, importo, ti_competenza_residuo );
else
saldo = findAndLock( userContext, cd_cds, voce, ti_competenza_residuo );
if (saldo != null){
importo = importo.setScale(2, importo.ROUND_HALF_UP);
saldo.setIm_obblig_imp_acr( saldo.getIm_obblig_imp_acr().add( importo) );
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
//se si tratta di un residuo devo aggiornare anche le variazioni più o meno
if ( ti_competenza_residuo.equals( saldo.TIPO_RESIDUO ))
if ( importo.compareTo( new BigDecimal(0)) > 0 )
saldo.setVariazioni_piu( saldo.getVariazioni_piu().add( importo));
else
saldo.setVariazioni_meno( saldo.getVariazioni_meno().subtract( importo));
updateBulk( userContext, saldo );
}
importo = importo.setScale(2, importo.ROUND_HALF_UP);
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* riscontro mandato
* PreCondition:
* E' stata riscontrato un mandato
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dal mandato
* riscontro reversale
* PreCondition:
* E' stata riscontrata una reversale
* PostCondition:
* Viene aggiornato per il cds di appartenenza della reversale l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dalla reversale
* annullamento riscontro mandato
* PreCondition:
* E' stata annullato il riscontro di un mandato
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dal mandato
* annullamento riscontro reversale
* PreCondition:
* E' stato annullato il riscontro di una reversale
* PostCondition:
* Viene aggiornato per il cds di appartenenza della reversale l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dalla reversale
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param cd_cds il codice del Cds per cui aggiornare i saldi
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) da aggiornare
*/
public Voce_f_saldi_cmpBulk aggiornaPagamentiIncassi(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo ) throws ComponentException
{
try
{
Voce_f_saldi_cmpBulk saldo = findAndLock( userContext, cd_cds, voce, ti_competenza_residuo );
if (saldo != null){
saldo.setIm_pagamenti_incassi( saldo.getIm_pagamenti_incassi().add(importo.setScale(2, importo.ROUND_HALF_UP) ));
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
updateBulk( userContext, saldo );
}
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* verifica disponibilità di cassa - errore
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza o residuo + variazioni in positivo
* - variazione in negativo - importo
* dei mandati già emessi e' inferiore all'importo del mandato che l'utente vuole emettere
* PostCondition:
* Una segnalazione di errore comunica il problema all'utente e non consente il salvataggio del mandato
* verifica disponibilità di cassa - ok
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza o residuo + variazioni in positivo
* - variazione in negativo - importo
* dei mandati già emessi e' superiore o uguale all'importo del mandato che l'utente vuole emettere
* PostCondition:
* Il mandato supera la validazione di Cassa ed e' pertanto possibile proseguire con il suo salvataggio
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui effettuare la verifica di disponibilità di cassa
* @param cd_cds il codice del Cds per cui effettuare la verifica di disponibilità di cassa
* @param importo l'importo (positivo o negativo) per cui effettuare la verifica di disponibilità di cassa
* @param ti_competenza_residuo identifica il tipo di voce (di competenza o residuo) per cui effettuare la verifica di disponibilità di cassa
*/
public Voce_f_saldi_cmpBulk checkDisponabilitaCassaMandati(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo ) throws ComponentException
{
try
{
Voce_f_saldi_cmpBulk saldo = findAndLock( userContext, cd_cds, voce, ti_competenza_residuo );
/*if (saldo != null){
// check per capitoli di competenza
if ( saldo.getTi_competenza_residuo().equals( MandatoBulk.TIPO_COMPETENZA ))
{
if ( saldo.getIm_stanz_iniziale_a1().add(
saldo.getVariazioni_piu()).subtract(
saldo.getVariazioni_meno()).subtract(
saldo.getIm_mandati_reversali()).subtract( importo ).compareTo( new BigDecimal(0)) < 0 )
throw handleException( new ApplicationException("La disponibilità di cassa relativa all'assunzione di mandati è stata superata per CDS: " + cd_cds + " voce: " + voce.getCd_voce() + " - Competenza"));
}
else
// check per capitoli a residuo
{
if ( saldo.getIm_obblig_imp_acr().subtract(
saldo.getIm_mandati_reversali()).subtract( importo ).compareTo( new BigDecimal(0)) < 0 )
throw handleException( new ApplicationException("La disponibilità di cassa relativa all'assunzione di mandati è stata superata per CDS: " + cd_cds + " voce: " + voce.getCd_voce() + " - Residuo" ));
}
}*/
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* verifica disponibilità di cassa - errore
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza + variazioni in positivo
* - variazione in negativo - importo
* delle obbligazioni già emesse e' inferiore all'importo dell'obbligazione che l'utente vuole emettere
* PostCondition:
* Una segnalazione di errore comunica il problema all'utente, lasciondogli comunque la possibilità di forzare questo
* controllo e di salvare l'obbligazione
* verifica disponibilità di cassa - ok
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza + variazioni in positivo
* - variazione in negativo - importo
* delle obbligazioni già emesse e' superiore o uguale all'importo dell'obbligazione che l'utente vuole emettere
* PostCondition:
* L'obbligazione supera la validazione di Cassa ed e' pertanto possibile proseguire con il suo salvataggio
*
* @param userContext lo UserContext che ha generato la richiesta
* @param voce Voce_fBulk la voce del piano per cui effettuare la verifica di disponibilità di cassa
* @param cd_cds il codice del Cds per cui effettuare la verifica di disponibilità di cassa
* @param importo l'importo (positivo o negativo) per cui effettuare la verifica di disponibilità di cassa
*
*/
public Voce_f_saldi_cmpBulk checkDisponabilitaCassaObbligazioni(UserContext userContext, Voce_fBulk voce, String cd_cds, BigDecimal importo, String ti_competenza_residuo ) throws ComponentException
{
try
{
Voce_f_saldi_cmpBulk saldo = find( userContext, cd_cds, voce, ti_competenza_residuo );
/**
* @author mspasiano
* @since 03.01.2006
* @see remmato controllo di cassa
*/
/*if ( saldo.getIm_stanz_iniziale_a1().add(
saldo.getVariazioni_piu()).subtract(
saldo.getVariazioni_meno()).subtract(
saldo.getIm_obblig_imp_acr()).subtract( importo ).compareTo( new BigDecimal(0)) < 0 )
throw handleException( new CheckDisponibilitaCassaFailed("L'importo dei dettagli inseriti supera la disponiblità di cassa relativa al capitolo e al CdS."));
*/
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* ricerca e inserisce un lock
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti per un cds
* PostCondition:
* La voce del piano dei conti di tipo competenza o residuo per il cds specificato
* viene ricercata e viene inserito un lock
* errore - non trovato
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti ma questa voce non e'
* presente nella tabella dei saldi
* PostCondition:
* Una segnalazione di errore comunica all'utente che la voce non e' presente nei saldi
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cds il codice del Cds per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui effettuare la ricerca del saldo
* @param ti_competenza_residuo identifica il tipo di saldo (di competenza o residuo) per cui effettuare la ricerca
*
*/
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cmpBulk find(UserContext userContext, String cd_cds, Voce_fBulk voce, String ti_competenza_residuo ) throws PersistencyException, ComponentException
{
try
{
return (Voce_f_saldi_cmpBulk) getHome( userContext,Voce_f_saldi_cmpBulk.class ).findByPrimaryKey( new Voce_f_saldi_cmpBulk( cd_cds, voce.getCd_voce(), voce.getEsercizio(), voce.getTi_appartenenza(), ti_competenza_residuo, voce.getTi_gestione()));
}
catch ( it.cnr.jada.persistency.ObjectNotFoundException e )
{
if (!((Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(CNRUserContext.getEsercizio(userContext)))).getFl_regolamento_2006().booleanValue())
throw handleException( new ApplicationException("Non e' presente il saldo per Esercizio: " + voce.getEsercizio() +
" CDS: " + cd_cds + " Voce: " + voce.getCd_voce() ));
else
return null;
}
catch ( Exception e )
{
throw handleException( e );
}
}
/**
* ricerca e inserisce un lock
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti per un cds
* PostCondition:
* La voce del piano dei conti di tipo competenza o residuo per il cds specificato
* viene ricercata e viene inserito un lock
* errore - non trovato
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti ma questa voce non e'
* presente nella tabella dei saldi
* PostCondition:
* Una segnalazione di errore comunica all'utente che la voce non e' presente nei saldi
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cds il codice del Cds per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui effettuare la ricerca del saldo
* @param ti_competenza_residuo identifica il tipo di saldo (di competenza o residuo) per cui effettuare la ricerca
*/
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cmpBulk findAndLock(UserContext userContext, String cd_cds, Voce_fBulk voce, String ti_competenza_residuo ) throws PersistencyException, ComponentException
{
try
{
return (Voce_f_saldi_cmpBulk) getHome( userContext,Voce_f_saldi_cmpBulk.class ).findAndLock( new Voce_f_saldi_cmpBulk( cd_cds, voce.getCd_voce(), voce.getEsercizio(), voce.getTi_appartenenza(), ti_competenza_residuo, voce.getTi_gestione()));
}
catch ( it.cnr.jada.persistency.ObjectNotFoundException e )
{
if (!((Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(CNRUserContext.getEsercizio(userContext)))).getFl_regolamento_2006().booleanValue())
throw handleException( new ApplicationException("Non e' presente il saldo per Esercizio: " + voce.getEsercizio() +
" CDS: " + cd_cds + " Voce: " + voce.getCd_voce() ));
else
return null;
}
catch ( Exception e )
{
throw handleException( e );
}
}
/**
* ricerca
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti per un cdr/linea
* PostCondition:
* La voce del piano dei conti di tipo competenza o residuo per il cdr/linea specificato
* viene ricercata e viene inserito un lock
* errore - non trovato
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti ma questa voce non e'
* presente nella tabella dei saldi
* PostCondition:
* Una segnalazione di errore comunica all'utente che la voce non e' presente nei saldi
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui effettuare la ricerca del saldo
* @param esercizio_res esercizio residuo per cui ricercare il saldo
*
*/
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk find(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res) throws ComponentException
{
try
{
return (Voce_f_saldi_cdr_lineaBulk) getHome( userContext,Voce_f_saldi_cdr_lineaBulk.class ).findByPrimaryKey( new Voce_f_saldi_cdr_lineaBulk( voce.getEsercizio(), esercizio_res, cd_cdr, cd_linea_attivita, voce.getTi_appartenenza(), voce.getTi_gestione(),voce.getCd_voce()));
}
catch ( it.cnr.jada.persistency.ObjectNotFoundException e )
{
return null;
}
catch ( Exception e )
{
throw handleException( e );
}
}
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk find(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce) throws ComponentException
{
return find(userContext,cd_cdr,cd_linea_attivita,voce,voce.getEsercizio());
}
/**
* ricerca e inserisce un lock
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti per un cdr/linea
* PostCondition:
* La voce del piano dei conti di tipo competenza o residuo per il cdr/linea specificato
* viene ricercata e viene inserito un lock
* errore - non trovato
* PreCondition:
* E' necessario apportare delle modifiche ai saldi di una voce del piano dei conti ma questa voce non e'
* presente nella tabella dei saldi
* PostCondition:
* Una segnalazione di errore comunica all'utente che la voce non e' presente nei saldi
*
* @param userContext lo UserContext che ha generato la richiesta
* @param esercizio esercizio per cui effettuare la ricerca del saldo
* @param esercizio_res esercizio residuo per cui effettuare la ricerca del saldo
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui effettuare la ricerca del saldo
*
*/
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk findAndLock(UserContext userContext, Integer esercizio, Integer esercizio_res, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce) throws ComponentException{
try
{
return (Voce_f_saldi_cdr_lineaBulk) getHome( userContext,Voce_f_saldi_cdr_lineaBulk.class ).findAndLock( new Voce_f_saldi_cdr_lineaBulk( esercizio, esercizio_res, cd_cdr, cd_linea_attivita, voce.getTi_appartenenza(), voce.getTi_gestione(),voce.getCd_voce()));
}
catch ( it.cnr.jada.persistency.ObjectNotFoundException e )
{
return null;
}
catch ( Exception e )
{
throw handleException( e );
}
}
private it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk findAndLock(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce) throws ComponentException
{
return findAndLock(userContext,voce.getEsercizio(),voce.getEsercizio(), cd_cdr,cd_linea_attivita,voce);
}
/**
* aggiornamento importo relativo a mandati e reversali
* PreCondition:
* E' stata cancellato un mandato o creata/cancellata una reversale
* PostCondition:
* Viene aggiornato l'importo associato a mandati e reversali della voce del piano di competenza o residuo interessata dal mandato o
* dalla reversale senza eseguire il controllo di disponibilità di cassa
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param esercizio_res l'anno del residuo
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param tipo_residuo il tipo di residuo (proprio o improprio)
*
*/
public Voce_f_saldi_cdr_lineaBulk aggiornaMandatiReversali(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo, String tipo_residuo) throws ComponentException
{
return aggiornaMandatiReversali( userContext, cd_cdr, cd_linea_attivita, voce, esercizio_res, importo, tipo_residuo, false );
}
/**
* creazione mandato
* PreCondition:
* E' stata creato un nuovo mandato e viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaMandati)
* PostCondition:
* Viene aggiornato per cdr/linea di appartenenza del mandato l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dal mandato
* creazione mandato - errore
* PreCondition:
* E' stata creato un nuovo mandato e non viene superato il controllo di
* di disponibilità di cassa (metodo checkDisponabilitaCassaMandati)
* PostCondition:
* Viene segnalato con un errore l'impossibilità di emettere il mandato
* annullamento mandato
* PreCondition:
* E' stata annullato un mandato
* PostCondition:
* Viene aggiornato per la coppia cdr/linea di appartenenza delle righe del mandato l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dal mandato
*
* creazione/annullamento reversale
* PreCondition:
* E' stata creata una nuova reversale o e' stata annullata una reversale già emessa
* PostCondition:
* Viene aggiornato per la coppia cdr/linea di appartenenza delle righe della reversale l'importo associato a mandati e reversali
* della voce del piano (di competenza o residuo) interessata dalla reversale
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param esercizio_res l'anno del residuo
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param tipo_residuo il tipo di residuo (proprio o improprio)
* @param checkDisponibilitaCassa valore booleano che indica se eseguire la verifica della disponibilità di cassa sulla
* voce del piano
*/
public Voce_f_saldi_cdr_lineaBulk aggiornaMandatiReversali(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo, String tipo_residuo, boolean checkDisponibilitaCassa ) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo, saldoCassa;
if ( checkDisponibilitaCassa)
//Eseguo il controllo sempre sulla competenza
saldoCassa = checkDisponabilitaCassaMandati( userContext, cd_cdr, cd_linea_attivita, voce, importo );
if (voce.getEsercizio().compareTo(esercizio_res) != 0)
saldo = findAndLock( userContext, voce.getEsercizio(), esercizio_res, cd_cdr, cd_linea_attivita, voce);
else
saldo = findAndLock( userContext, cd_cdr, cd_linea_attivita, voce);
if (saldo == null &&
((Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(CNRUserContext.getEsercizio(userContext)))).getFl_regolamento_2006().booleanValue()) {
throw handleException( new ApplicationException("Non e' presente il saldo per Esercizio: " + voce.getEsercizio() +
" CDR: " + cd_cdr + " GAE: " + cd_linea_attivita + " Voce: " + voce.getCd_voce() ));
}
if (saldo != null){
if (tipo_residuo.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO))
saldo.setIm_mandati_reversali_imp( saldo.getIm_mandati_reversali_imp().add( importo.setScale(2, importo.ROUND_HALF_UP) ));
else if (tipo_residuo.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_PROPRIO)||tipo_residuo.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_COMPETENZA))
saldo.setIm_mandati_reversali_pro( saldo.getIm_mandati_reversali_pro().add( importo.setScale(2, importo.ROUND_HALF_UP) ));
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
updateBulk( userContext, saldo );
}
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* verifica disponibilità di cassa - errore
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza o residuo + variazioni in positivo
* - variazione in negativo - importo
* dei mandati già emessi e' inferiore all'importo del mandato che l'utente vuole emettere
* PostCondition:
* Una segnalazione di errore comunica il problema all'utente e non consente il salvataggio del mandato
* verifica disponibilità di cassa - ok
* PreCondition:
* La somma dello stanziamento iniziale della voce del piano di competenza o residuo + variazioni in positivo
* - variazione in negativo - importo
* dei mandati già emessi e' superiore o uguale all'importo del mandato che l'utente vuole emettere
* PostCondition:
* Il mandato supera la validazione di Cassa ed e' pertanto possibile proseguire con il suo salvataggio
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui effettuare la verifica di disponibilità di cassa
* @param importo l'importo (positivo o negativo) per cui effettuare la verifica di disponibilità di cassa
*/
public Voce_f_saldi_cdr_lineaBulk checkDisponabilitaCassaMandati(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, BigDecimal importo ) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo = findAndLock( userContext,cd_cdr,cd_linea_attivita, voce );
/*if (saldo != null) { //Se la riga non viene recuperata non viene effettuato alcun aggiornamento
// check per capitoli di competenza
if ( saldo.getIm_stanz_iniziale_cassa().add(
saldo.getVariazioni_piu_cassa()).subtract(
saldo.getVariazioni_meno_cassa()).subtract(
saldo.getIm_mandati_reversali_pro()).subtract( importo ).compareTo( new BigDecimal(0)) < 0 )
throw handleException( new ApplicationException("La disponibilità di cassa relativa all'assunzione di mandati è stata superata per CDR: " + cd_cdr + " GAE: " + cd_linea_attivita +" voce: " + voce.getCd_voce() + " - Competenza"));
}*/
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
public String checkDispObbligazioniAccertamenti(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, String tipo_imp, String tipo_messaggio) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo;
String messaggio = null;
String aCapo = tipo_messaggio.equals(Parametri_cdsBulk.BLOCCO_IMPEGNI_ERROR)?"\n":"
";
saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res,cd_cdr,cd_linea_attivita, voce);
BigDecimal diff = Utility.ZERO;
if (saldo != null) {
if (tipo_imp.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_COMPETENZA)){
diff = saldo.getAssestato().subtract(saldo.getIm_obbl_acc_comp());
}else if (tipo_imp.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO)){
diff = saldo.getDispAdImpResiduoImproprio();
}
if(diff != null && diff.compareTo(Utility.ZERO) == -1){
messaggio = "L'importo relativo al CDR "+cd_cdr+" G.A.E. "+cd_linea_attivita+" Voce "+voce.getCd_voce()+ aCapo +
"supera la disponibilità di " + new it.cnr.contab.util.EuroFormat().format(diff.abs())+".";
}
//aggiungo i vincoli
Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(userContext, Pdg_vincoloBulk.class);
List listVincoli = home.cercaDettagliVincolati(saldo);
BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impVincolo.compareTo(BigDecimal.ZERO)!=0 && diff.subtract(impVincolo).compareTo(BigDecimal.ZERO)==-1)
messaggio = "L'importo relativo al CDR "+cd_cdr+" G.A.E. "+cd_linea_attivita+" Voce "+voce.getCd_voce()+ aCapo +
"supera la disponibilità di " + new it.cnr.contab.util.EuroFormat().format(diff.subtract(impVincolo).abs())+" in conseguenza della presenza "
+ "di vincoli di spesa per un importo di " + new it.cnr.contab.util.EuroFormat().format(impVincolo.abs())+".";
}
return messaggio;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* aggiornamento importo relativo a obbligazioni/accertamento
* PreCondition:
* E' stata creato/modificato importo/cancellato un accertamento oppure e' stata
* cancellata un'obbligazione o e' stato diminuito l'importo del dettaglio di una scadenza dell'obbligazione
* PostCondition:
* Viene aggiornato l'importo associato a obbligazioni/accertamenti della voce del piano (di competenza o residuo)
* interessata dall'accertamento o dai dettagli delle scadenze dell'obbligazione
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param esercizio_res l'anno del residuo
* @param tipo_residuo il tipo di residuo (proprio o improprio)
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
* @param tipo_doc_cont il tipo di documento contabile
*/
public Voce_f_saldi_cdr_lineaBulk aggiornaObbligazioniAccertamenti(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, String tipo_residuo, BigDecimal importo, String tipo_doc_cont) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo;
saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
if (saldo == null){
Parametri_cnrBulk parametriCnr = (Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(voce.getEsercizio()));
if (parametriCnr==null || !parametriCnr.getFl_nuovo_pdg())
voce = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(
new Voce_fBulk(voce.getCd_voce(),voce.getEsercizio(),voce.getTi_appartenenza(),voce.getTi_gestione())
);
Elemento_voceBulk elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(voce.getCd_elemento_voce(),voce.getEsercizio(),voce.getTi_appartenenza(),voce.getTi_gestione())
);
if (elemento_voce == null)
throw new ApplicationException("Elemento voce non trovato per la Voce: "+ voce.getCd_voce());
WorkpackageBulk workpackage = (WorkpackageBulk)getHome(userContext,WorkpackageBulk.class).findByPrimaryKey(
new WorkpackageBulk(cd_cdr,cd_linea_attivita)
);
if ((voce.getTi_gestione().equals(CostantiTi_gestione.TI_GESTIONE_SPESE) &&
tipo_residuo.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_PROPRIO)||
(elemento_voce.getFl_limite_ass_obblig()!= null && !elemento_voce.getFl_limite_ass_obblig().booleanValue()&&
workpackage.getFl_limite_ass_obblig() != null && !workpackage.getFl_limite_ass_obblig().booleanValue()))
|| voce.getTi_gestione().equals(CostantiTi_gestione.TI_GESTIONE_ENTRATE)){
saldo = new Voce_f_saldi_cdr_lineaBulk( voce.getEsercizio(), esercizio_res, cd_cdr, cd_linea_attivita, voce.getTi_appartenenza(), voce.getTi_gestione(),voce.getCd_voce());
saldo.setCd_elemento_voce(elemento_voce.getCd_elemento_voce());
saldo.inizializzaSommeAZero();
saldo.setToBeCreated();
insertBulk(userContext, saldo);
}
if (saldo == null) {
throw handleException( new ApplicationException("Disponibilità inesistente per Esercizio: " + voce.getEsercizio() +
" CDR: " + cd_cdr + " G.A.E.: " + cd_linea_attivita + " Voce: " + voce.getCd_voce() ));
}
}
if (saldo != null) {
importo = importo.setScale(2, importo.ROUND_HALF_UP);
if (voce.getEsercizio().compareTo(esercizio_res) == 0){
saldo.setIm_obbl_acc_comp( saldo.getIm_obbl_acc_comp().add( importo) );
}else{
if (tipo_residuo.equals(Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO)){
saldo.setIm_obbl_res_imp( saldo.getIm_obbl_res_imp().add( importo) );
}else{
saldo.setIm_obbl_res_pro( saldo.getIm_obbl_res_pro().add( importo) );
}
}
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
updateBulk( userContext, saldo );
}
/**
* @author mspasiano
* Aggiorno i saldi negli anni successivi aperti
*/
if ((voce.getTi_gestione().equals(CostantiTi_gestione.TI_GESTIONE_SPESE)) &&
!(tipo_doc_cont.equalsIgnoreCase(Numerazione_doc_contBulk.TIPO_IMP) ||
tipo_doc_cont.equalsIgnoreCase(Numerazione_doc_contBulk.TIPO_IMP_RES)))
aggiornaSaldiAnniSuccessivi(userContext, cd_cdr, cd_linea_attivita, voce, esercizio_res, importo, saldo);
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
public Voce_f_saldi_cdr_lineaBulk aggiornaVariazioneStanziamento(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, String tipo_residuo, BigDecimal importo) throws ComponentException
{
return aggiornaVariazioneStanziamento(userContext, cd_cdr, cd_linea_attivita, voce, esercizio_res, tipo_residuo, importo, false);
}
public Voce_f_saldi_cdr_lineaBulk aggiornaVariazioneStanziamento(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, String tipo_residuo, BigDecimal importo, Boolean sottraiImportoDaVariazioneEsistente) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo;
saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
if (saldo == null){
Parametri_cnrBulk parametriCnr = (Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(voce.getEsercizio()));
if (parametriCnr==null || !parametriCnr.getFl_nuovo_pdg())
voce = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(
new Voce_fBulk(voce.getCd_voce(),voce.getEsercizio(),voce.getTi_appartenenza(),voce.getTi_gestione())
);
Elemento_voceBulk elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(voce.getCd_elemento_voce(),voce.getEsercizio(),voce.getTi_appartenenza(),voce.getTi_gestione())
);
if (elemento_voce == null)
throw new ApplicationException("Elemento voce non trovato per la Voce: "+ voce.getCd_voce());
saldo = new Voce_f_saldi_cdr_lineaBulk( voce.getEsercizio(), esercizio_res, cd_cdr, cd_linea_attivita, voce.getTi_appartenenza(), voce.getTi_gestione(),voce.getCd_voce());
saldo.setCd_elemento_voce(elemento_voce.getCd_elemento_voce());
saldo.inizializzaSommeAZero();
saldo.setToBeCreated();
insertBulk(userContext, saldo);
}
importo = importo.setScale(2, importo.ROUND_HALF_UP);
if (sottraiImportoDaVariazioneEsistente){
if(importo.compareTo(Utility.ZERO)==1)
saldo.setVariazioni_meno(saldo.getVariazioni_meno().subtract(importo.abs()));
else
saldo.setVariazioni_piu(saldo.getVariazioni_piu().subtract(importo));
} else {
if(importo.compareTo(Utility.ZERO)==1)
saldo.setVariazioni_piu(saldo.getVariazioni_piu().add(importo));
else
saldo.setVariazioni_meno(saldo.getVariazioni_meno().add(importo.abs()));
}
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
updateBulk( userContext, saldo );
/**
* @author mspasiano
* Aggiorno i saldi negli anni successivi aperti
*/
if ((voce.getTi_gestione().equals(CostantiTi_gestione.TI_GESTIONE_SPESE)))
aggiornaSaldiAnniSuccessivi(userContext, cd_cdr, cd_linea_attivita, voce, esercizio_res, importo.negate(), saldo);
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
public String getMessaggioSfondamentoDisponibilita(UserContext userContext, Voce_f_saldi_cdr_lineaBulk saldo) throws ComponentException
{
try {
//Voce_f_saldi_cdr_lineaBulk saldoNew = findAndLock( userContext,saldo.getEsercizio(),saldo.getEsercizio_res(), saldo.getCd_centro_responsabilita(),saldo.getCd_linea_attivita(), saldo.getVoce());
Voce_f_saldi_cdr_lineaBulk saldoNew = (Voce_f_saldi_cdr_lineaBulk) getHome( userContext,Voce_f_saldi_cdr_lineaBulk.class ).findAndLock( saldo);
if (saldoNew == null)
return "";
//Voce_fBulk voce = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(new Voce_fBulk(saldoNew.getCd_voce(), saldoNew.getEsercizio(), saldoNew.getTi_appartenenza(), saldoNew.getTi_gestione()));
Elemento_voceBulk elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(saldoNew.getCd_elemento_voce(),saldo.getEsercizio(),saldo.getTi_appartenenza(),saldo.getTi_gestione()));
WorkpackageBulk workpackage = (WorkpackageBulk)getHome(userContext,WorkpackageBulk.class).findByPrimaryKey(
new WorkpackageBulk(saldo.getCd_centro_responsabilita(),saldo.getCd_linea_attivita()));
getHomeCache(userContext).fetchAll(userContext);
if (!((elemento_voce.getFl_partita_giro() != null &&
elemento_voce.getFl_partita_giro().booleanValue()) ||
(elemento_voce.getFl_limite_ass_obblig()!= null && !elemento_voce.getFl_limite_ass_obblig().booleanValue() &&
workpackage.getFl_limite_ass_obblig()!= null && !workpackage.getFl_limite_ass_obblig().booleanValue()))) {
if (saldoNew.getEsercizio().compareTo(saldoNew.getEsercizio_res())!=0 &&
saldoNew.getDispAdImpResiduoImproprio().compareTo(Utility.ZERO) < 0)
return "Impossibile effettuare l'operazione !\n"+
"Nell'esercizio "+saldo.getEsercizio()+
" e per il CdR "+saldo.getCd_centro_responsabilita()+", "+
" Voce "+saldoNew.getCd_voce()+
" e GAE "+saldo.getCd_linea_attivita()+" lo stanziamento Residuo Improprio "+
" diventerebbe negativo ("+new it.cnr.contab.util.EuroFormat().format(saldoNew.getDispAdImpResiduoImproprio().abs())+")";
if (saldoNew.getEsercizio().compareTo(saldoNew.getEsercizio_res())==0 &&
saldoNew.getDispAdImpCompetenza().compareTo(Utility.ZERO) < 0)
return "Impossibile effettuare l'operazione !\n"+
"Nell'esercizio "+saldo.getEsercizio()+
" e per il CdR "+saldo.getCd_centro_responsabilita()+", "+
" Voce "+saldoNew.getCd_voce()+
" e GAE "+saldo.getCd_linea_attivita()+" lo stanziamento di Competenza "+
" diventerebbe negativo ("+new it.cnr.contab.util.EuroFormat().format(saldoNew.getDispAdImpCompetenza().abs())+")";
}
return "";
} catch ( it.cnr.jada.persistency.ObjectNotFoundException e ) {
return "Impossibile effettuare l'operazione! Non è stata trovata la riga di saldo da aggiornare!";
} catch (PersistencyException e) {
throw new ComponentException(e);
} catch ( Exception e ) {
throw handleException( e );
}
}
public void aggiornaSaldiAnniSuccessivi(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo, Voce_f_saldi_cdr_lineaBulk saldoOld) throws ComponentException
{
Voce_f_saldi_cdr_lineaBulk saldoNew;
try {
Ass_evold_evnewHome ass_evold_evnewHome = (Ass_evold_evnewHome) getHome( userContext, Ass_evold_evnewBulk.class);
CdrHome cdrHome = (CdrHome)getHome(userContext,CdrBulk.class);
CdrBulk cdr = (CdrBulk)cdrHome.findByPrimaryKey(new CdrBulk(cd_cdr));
getHomeCache(userContext).fetchAll(userContext,cdrHome);
if (((Parametri_cdsHome)getHome(userContext,Parametri_cdsBulk.class)).isRibaltato(userContext,cdr.getCd_cds())){
//RECUPERO L'ELEMENTO DELL'ANNO IN CORSO
for (Iterator esercizi = ((EsercizioHome)getHome(userContext,EsercizioBulk.class)).findEserciziSuccessivi(new EsercizioBulk(CNRUserContext.getCd_cds(userContext),CNRUserContext.getEsercizio(userContext))).iterator();esercizi.hasNext();){
EsercizioBulk esercizio = (EsercizioBulk)esercizi.next();
String codiceVoce = voce.getCd_voce(), codiceVoceForSaldoNew = null;
//recupero la voce di ribaltamento
Elemento_voceBulk elemento_voce = null;
if (voce instanceof Voce_fBulk) {
if (!((Parametri_cnrHome)getHome(userContext, Parametri_cnrBulk.class)).isNuovoPdg(esercizio.getEsercizio())) {
voce = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(
new Voce_fBulk(voce.getCd_voce(),esercizio.getEsercizio(),saldoOld.getTi_appartenenza(),saldoOld.getTi_gestione())
);
getHomeCache(userContext).fetchAll(userContext);
if (voce == null)
throw new ApplicationException("La voce: "+ codiceVoce +" non è presente nell'esercizio: "+esercizio.getEsercizio());
saldoNew = findAndLock( userContext,esercizio.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
codiceVoceForSaldoNew = voce.getCd_voce();
elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(voce.getCd_elemento_voce(),esercizio.getEsercizio(),voce.getTi_appartenenza(),voce.getTi_gestione())
);
} else {
//recupero la voce di ribaltamento
// Voce_fBulk voceOld = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(
// new Voce_fBulk(voce.getCd_voce(),CNRUserContext.getEsercizio(userContext),saldoOld.getTi_appartenenza(),saldoOld.getTi_gestione())
// );
//
// getHomeCache(userContext).fetchAll(userContext);
//
// if (voceOld == null)
// throw new ApplicationException("La voce: "+ voce.getCd_voce() +" non è presente nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
Elemento_voceBulk elementoVoceOld = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(saldoOld.getCd_voce(),CNRUserContext.getEsercizio(userContext),saldoOld.getTi_appartenenza(),saldoOld.getTi_gestione())
);
if (elementoVoceOld == null)
throw new ApplicationException("Elemento voce non trovato per la Voce: "+ saldoOld.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
//cerco la voce del nuovo anno
List listVociNew = ass_evold_evnewHome.findAssElementoVoceNewList(elementoVoceOld);
if (!listVociNew.isEmpty()) {
if (listVociNew.size()>1)
throw new ApplicationException("Trovate nella tabella di associazione Vecchie/Nuove Voci più elementi voce nel nuovo anno per la Voce: "+ elementoVoceOld.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
elemento_voce = (Elemento_voceBulk)listVociNew.get(0);
} else {
elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(elementoVoceOld.getCd_elemento_voce(),esercizio.getEsercizio(),elementoVoceOld.getTi_appartenenza(),elementoVoceOld.getTi_gestione())
);
}
if (elemento_voce == null || elemento_voce.getEsercizio().compareTo(esercizio.getEsercizio())!=0)
throw new ApplicationException("Elemento voce non trovato o associato ad una voce di anno differente rispetto a quello di ribaltamento per la Voce: "+ saldoOld.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
saldoNew = findAndLock( userContext,esercizio.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, elemento_voce);
codiceVoceForSaldoNew = elemento_voce.getCd_voce();
}
} else {
//recupero la voce di ribaltamento
Elemento_voceBulk elementoVoceOld = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(voce.getCd_elemento_voce(),CNRUserContext.getEsercizio(userContext),voce.getTi_appartenenza(),voce.getTi_gestione())
);
if (elementoVoceOld == null)
throw new ApplicationException("Elemento voce non trovato per la Voce: "+ voce.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
getHomeCache(userContext).fetchAll(userContext);
//cerco la voce del nuovo anno
List listVociNew = ass_evold_evnewHome.findAssElementoVoceNewList(elementoVoceOld);
if (!listVociNew.isEmpty()) {
if (listVociNew.size()>1)
throw new ApplicationException("Trovate nella tabella di associazione Vecchie/Nuove Voci più elementi voce nel nuovo anno per la Voce: "+ elementoVoceOld.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
elemento_voce = (Elemento_voceBulk)listVociNew.get(0);
} else {
elemento_voce = (Elemento_voceBulk)getHome(userContext,Elemento_voceBulk.class).findByPrimaryKey(
new Elemento_voceBulk(elementoVoceOld.getCd_elemento_voce(),esercizio.getEsercizio(),elementoVoceOld.getTi_appartenenza(),elementoVoceOld.getTi_gestione())
);
}
if (elemento_voce == null || elemento_voce.getEsercizio().compareTo(esercizio.getEsercizio())!=0)
throw new ApplicationException("Elemento voce non trovato o associato ad una voce di anno differente rispetto a quello di ribaltamento per la Voce: "+ elementoVoceOld.getCd_voce() +" nell'esercizio: "+CNRUserContext.getEsercizio(userContext));
saldoNew = findAndLock( userContext,esercizio.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, elemento_voce);
codiceVoceForSaldoNew = elemento_voce.getCd_voce();
}
getHomeCache(userContext).fetchAll(userContext);
WorkpackageBulk workpackage = (WorkpackageBulk)getHome(userContext,WorkpackageBulk.class).findByPrimaryKey(
new WorkpackageBulk(cd_cdr,cd_linea_attivita)
);
// Obbligatorio cofog sulle GAE
Parametri_cnrBulk par = (Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey( new Parametri_cnrBulk(esercizio.getEsercizio()));
if (par != null && par.getLivello_pdg_cofog()!=0)
if( (workpackage.getTi_gestione().compareTo(CostantiTi_gestione.TI_GESTIONE_SPESE)==0) && workpackage.getCd_cofog()==null)
throw new ApplicationException("Non è possibile utilizzare GAE di spesa in cui non è indicata la classificazione Cofog.");
getHomeCache(userContext).fetchAll(userContext);
if (saldoNew == null){
if (elemento_voce == null)
throw new ApplicationException("Elemento voce non trovato per la Voce: "+ voce.getCd_voce() +" nell'esercizio: "+esercizio.getEsercizio());
saldoNew = new Voce_f_saldi_cdr_lineaBulk( esercizio.getEsercizio(), esercizio_res, cd_cdr, cd_linea_attivita, voce.getTi_appartenenza(), voce.getTi_gestione(),codiceVoceForSaldoNew);
saldoNew.setCd_elemento_voce(elemento_voce.getCd_elemento_voce());
saldoNew.inizializzaSommeAZero();
saldoNew.setToBeCreated();
insertBulk(userContext, saldoNew);
}
if (saldoNew != null){
saldoNew.setIm_stanz_res_improprio(saldoNew.getIm_stanz_res_improprio().subtract(importo));
//calcolo i vincoli
Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(userContext, Pdg_vincoloBulk.class);
List listVincoli = home.cercaDettagliVincolati(saldoNew);
BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
BigDecimal diff = saldoNew.getDispAdImpResiduoImproprio().subtract(impVincolo);
if (diff.compareTo(Utility.ZERO) < 0){
if (voce.getTi_gestione().equalsIgnoreCase(Voce_f_saldi_cdr_lineaBulk.TIPO_GESTIONE_SPESA)){
if (!((elemento_voce.getFl_partita_giro() != null &&
elemento_voce.getFl_partita_giro().booleanValue()) ||
(elemento_voce.getFl_limite_ass_obblig()!= null && !elemento_voce.getFl_limite_ass_obblig().booleanValue() &&
workpackage.getFl_limite_ass_obblig()!= null && !workpackage.getFl_limite_ass_obblig().booleanValue()))){
StringBuilder messaggio = new StringBuilder("Impossibile effettuare l'operazione !\n"+
"Nell'esercizio "+esercizio.getEsercizio()+
" e per il CdR "+cd_cdr+", "+
" Voce "+voce.getCd_voce()+
" e GAE "+cd_linea_attivita+" lo stanziamento Residuo Improprio "+
" diventerebbe negativo ("+new it.cnr.contab.util.EuroFormat().format(diff.abs())+")");
if (impVincolo.compareTo(BigDecimal.ZERO)>0)
messaggio.append(" in conseguenza della presenza di vincoli di spesa per un importo di " +
new it.cnr.contab.util.EuroFormat().format(impVincolo.abs()));
throw new ApplicationException(messaggio.toString());
}
}
}
saldoNew.setToBeUpdated();
updateBulk( userContext, saldoNew );
}
}
}
} catch (PersistencyException e) {
throw new ComponentException(e);
} catch (IntrospectionException e) {
throw new ComponentException(e);
}
}
/**
* riscontro mandato
* PreCondition:
* E' stata riscontrato un mandato
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dal mandato
* riscontro reversale
* PreCondition:
* E' stata riscontrata una reversale
* PostCondition:
* Viene aggiornato per il cds di appartenenza della reversale l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dalla reversale
* annullamento riscontro mandato
* PreCondition:
* E' stata annullato il riscontro di un mandato
* PostCondition:
* Viene aggiornato per il cds di appartenenza del mandato l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dal mandato
* annullamento riscontro reversale
* PreCondition:
* E' stato annullato il riscontro di una reversale
* PostCondition:
* Viene aggiornato per il cds di appartenenza della reversale l'importo associato a pagamenti/incassi
* della voce del piano (di competenza o residuo) interessata dalla reversale
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo
* @param voce Voce_fBulk la voce del piano per cui aggiornare i saldi
* @param esercizio_res l'anno del residuo
* @param importo l'importo (positivo o negativo) della modifica da apportare al saldo
*/
public Voce_f_saldi_cdr_lineaBulk aggiornaPagamentiIncassi(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo ) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
if (saldo == null &&
((Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(CNRUserContext.getEsercizio(userContext)))).getFl_regolamento_2006().booleanValue()) {
throw handleException( new ApplicationException("Non e' presente il saldo per Esercizio: " + voce.getEsercizio() +
" CDR: " + cd_cdr + " GAE: " + cd_linea_attivita + " Voce: " + voce.getCd_voce() ));
}
if (saldo != null) {
saldo.setIm_pagamenti_incassi( saldo.getIm_pagamenti_incassi().add(importo.setScale(2, importo.ROUND_HALF_UP) ));
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
updateBulk( userContext, saldo );
}
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* calcola il saldo (disponibilità ad impegnare) per creare residui propri o impropri
* come sommatoria dei saldi di tutti gli anni residui presenti
*
* @param userContext lo UserContext che ha generato la richiesta
* @param cd_cdr il codice del CDR per cui effettuare la ricerca del saldo dei residui
* @param cd_linea_attivita il codice del Workpackage per cui effettuare la ricerca del saldo dei residui
* @param voce la voce del piano per cui ricercare il saldo dei residui
*/
public java.math.BigDecimal getTotaleSaldoResidui(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce) throws ComponentException
{
try
{
Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(userContext, Pdg_vincoloBulk.class);
java.math.BigDecimal saldoResiduo = new java.math.BigDecimal(0);
Voce_f_saldi_cdr_lineaBulk comp = find( userContext, cd_cdr, cd_linea_attivita, voce);
if (comp != null) {
List residui = ((Voce_f_saldi_cdr_lineaHome)getHome( userContext,Voce_f_saldi_cdr_lineaBulk.class )).cercaDettagliResidui( comp );
for (Iterator i = residui.iterator(); i.hasNext();) {
Voce_f_saldi_cdr_lineaBulk residuo = (Voce_f_saldi_cdr_lineaBulk)i.next();
saldoResiduo = saldoResiduo.add(residuo.getDispAdImpResiduoImproprio());
//calcolo i vincoli e li sottraggo in quanto quota riservata
List listVincoli = home.cercaDettagliVincolati(residuo);
BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
saldoResiduo = saldoResiduo.subtract(impVincolo);
}
}
return saldoResiduo;
}
catch (Exception e )
{
throw handleException( e );
}
}
public Voce_f_saldi_cdr_lineaBulk aggiornaImpegniResiduiPropri(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo;
saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
if (saldo == null){
throw new ApplicationException("Saldo non trovato per la Voce/CdR/GAE: "+ voce.getCd_voce()+"/"+cd_cdr+"/"+cd_linea_attivita);
}
//calcolo i vincoli
Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(userContext, Pdg_vincoloBulk.class);
List listVincoli = home.cercaDettagliVincolati(saldo);
BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
importo = importo.setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal diff = saldo.getAssestatoResiduoImproprio().subtract(saldo.getIm_obbl_res_imp()).subtract(importo).subtract(impVincolo);
if (diff.compareTo(Utility.ZERO)<0) {
StringBuilder messaggio = new StringBuilder("Impossibile effettuare l'operazione !\n"+
"Nell'esercizio "+saldo.getEsercizio()+
" e per il CdR "+saldo.getCd_centro_responsabilita()+", "+
" Voce "+voce.getCd_voce()+
" e GAE "+saldo.getCd_linea_attivita()+" lo stanziamento Residuo Improprio "+
" diventerebbe negativo ("+new it.cnr.contab.util.EuroFormat().format(diff.abs())+")");
if (impVincolo.compareTo(BigDecimal.ZERO)>0)
messaggio.append(" in conseguenza della presenza di vincoli di spesa per un importo di " +
new it.cnr.contab.util.EuroFormat().format(impVincolo.abs()));
throw new ApplicationException(messaggio.toString());
}
if (importo.compareTo(Utility.ZERO)>0)
saldo.setVar_piu_obbl_res_pro( saldo.getVar_piu_obbl_res_pro().add( importo.abs()) );
else
saldo.setVar_meno_obbl_res_pro( saldo.getVar_meno_obbl_res_pro().add( importo.abs()) );
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
aggiornaSaldiAnniSuccessivi(userContext,
cd_cdr,
cd_linea_attivita,
voce,
esercizio_res,
importo,
saldo);
updateBulk( userContext, saldo );
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
public Voce_f_saldi_cdr_lineaBulk aggiornaAccertamentiResiduiPropri(UserContext userContext, String cd_cdr, String cd_linea_attivita, IVoceBilancioBulk voce, Integer esercizio_res, BigDecimal importo) throws ComponentException
{
try
{
Voce_f_saldi_cdr_lineaBulk saldo;
saldo = findAndLock( userContext,voce.getEsercizio(), esercizio_res, cd_cdr,cd_linea_attivita, voce);
if (saldo == null){
throw new ApplicationException("Saldo non trovato per la Voce/CdR/GAE: "+ voce.getCd_voce()+"/"+cd_cdr+"/"+cd_linea_attivita);
}
importo = importo.setScale(2, importo.ROUND_HALF_UP);
if (importo.compareTo(Utility.ZERO)>0)
saldo.setVar_piu_obbl_res_pro( saldo.getVar_piu_obbl_res_pro().add( importo.abs()) );
else
saldo.setVar_meno_obbl_res_pro( saldo.getVar_meno_obbl_res_pro().add( importo.abs()) );
saldo.setUser( ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getUser());
saldo.setToBeUpdated();
updateBulk( userContext, saldo );
return saldo;
}
catch (Exception e )
{
throw handleException( e );
}
}
/**
* 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 pianoEconomicoList = (List)ppeHome.findProgettoPianoEconomicoList(moduloCosti.getPg_progetto());
List speseList = (List)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 );
}
}
//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
public void checkDispPianoEconomicoProgetto(UserContext userContext, Pdg_variazioneBulk pdgVariazione) throws ComponentException
{
String message = getMessaggioSfondamentoPianoEconomico(userContext, pdgVariazione, true);
if (message!=null && message.length()>0)
throw new ApplicationException(
"Impossibile effettuare l'operazione !\n"+message);
}
//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, Pdg_variazioneBulk pdgVariazione, boolean locked) throws ComponentException{
StringJoiner messaggio = new StringJoiner("
");
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);
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);
Progetto_piano_economicoHome ppeHome = (Progetto_piano_economicoHome)getHome(userContext,Progetto_piano_economicoBulk.class);
ProgettoBulk progettoRimodulato = null;
Progetto_rimodulazioneBulk rimodulazione = null;
if (Optional.ofNullable(pdgVariazione.getProgettoRimodulazione()).isPresent()) {
Progetto_rimodulazioneHome prgHome = (Progetto_rimodulazioneHome)getHome(userContext, Progetto_rimodulazioneBulk.class);
rimodulazione = prgHome.rebuildRimodulazione(userContext, pdgVariazione.getProgettoRimodulazione());
progettoRimodulato = (ProgettoBulk)prgHome.getProgettoRimodulato(rimodulazione).clone();
}
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 (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;
boolean ctrlFinanziamentoAnnuale = progetto.isPianoEconomicoRequired() && !progetto.isProgettoScaduto();
if (ctrlFinanziamentoAnnuale) {
List pianoEconomicoList = null;
if (Optional.ofNullable(progettoRimodulato).isPresent())
pianoEconomicoList = progettoRimodulato.getAllDetailsProgettoPianoEconomico();
else
pianoEconomicoList = (List)ppeHome.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 = this.getStanziamentoAssestatoProgetto(userContext, progetto, Elemento_voceHome.GESTIONE_ENTRATE,
(ctrlFinanziamentoAnnuale?pdgVariazione.getEsercizio():null), null, null);
if (totFinanziato.compareTo(assestatoEtrPrg.add(ctrlDispPianoEco.getImpFinanziato()))<0)
messaggio.add("Progetto " + progetto.getCd_progetto() + ": "+
(ctrlFinanziamentoAnnuale?"per l'esercizio "+pdgVariazione.getEsercizio()+" ":"")+
"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 contrattiAssociati = progettoHome.findContratti(progetto.getPg_progetto());
BigDecimal impContrattiAttivi = contrattiAssociati.stream()
.filter(el->el.isAttivo()||el.isAttivo_e_Passivo())
.filter(el->!el.getDt_stipula().after(pdgVariazione.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 "+pdgVariazione.getEsercizio()+" ":"")+
"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(pdgVariazione.getDt_chiusura())+").");
}
}
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();
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()+").");
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;
boolean ctrlFinanziamentoAnnuale = progetto.isPianoEconomicoRequired() && !progetto.isProgettoScaduto();
if (ctrlFinanziamentoAnnuale) {
List 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)ppeHome.findProgettoPianoEconomicoList(pdgVariazione.getEsercizio(), progetto.getPg_progetto(), rigaVar.getElemento_voce());
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);
}
}
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);
//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 (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.");
//La variazione negativa non deve essere superiore a quanto richiesto dalla rimodulazione
//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.");
//La variazione negativa non deve essere superiore a quanto richiesto dalla rimodulazione
//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();
}
public void checkPdgPianoEconomico(UserContext userContext, Var_stanz_resBulk 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
*/
if (uoScrivania.isUoEnte() && variazione.getCentroDiResponsabilita().getUnita_padre().isUoEnte())
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_res", SQLBuilder.EQUALS, variazione.getEsercizio());
sqlLiqVar.addClause(FindClause.AND, "pg_variazione_res", SQLBuilder.EQUALS, variazione.getPg_variazione());
if (sqlLiqVar.executeCountQuery(getConnection(userContext)) > 0)
return;
List listCtrlPianoEco = new ArrayList();
it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession configSession = Utility.createConfigurazioneCnrComponentSession();
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 per l'esercizio "+CNRUserContext.getEsercizio(userContext)+"."));
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_var_stanz_res_cdrHome ass_cdrHome = (Ass_var_stanz_res_cdrHome)getHome(userContext,Ass_var_stanz_res_cdrBulk.class);
java.util.Collection dettagliSpesa = ass_cdrHome.findDettagliSpesa(variazione);
for (Var_stanz_res_rigaBulk varStanzResRiga : dettagliSpesa) {
//verifico se si tratta di area
CdrBulk cdrBulk = (CdrBulk)getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(varStanzResRiga.getCd_cdr()));
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(varStanzResRiga.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,
varStanzResRiga.getEsercizio(), varStanzResRiga.getCd_cdr(), varStanzResRiga.getCd_linea_attivita());
Optional.ofNullable(linea)
.orElseThrow(()->new ApplicationException("Errore in fase di ricerca linea_attivita "+varStanzResRiga.getEsercizio()+"/"+varStanzResRiga.getCd_cdr()+"/"+varStanzResRiga.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
ProgettoHome progettoHome = (ProgettoHome)getHome(userContext, ProgettoBulk.class);
java.util.Collection contratti = progettoHome.findContratti(progetto.getPg_progetto());
Optional optContratto =
contratti.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));
//creo il dettaglio
CtrlPianoEcoDett dett = new CtrlPianoEcoDett();
dett.setTipoDett(varStanzResRiga.getTi_gestione());
dett.setImporto(varStanzResRiga.getIm_variazione());
dett.setCdrPersonale(isDettPersonale);
dett.setUoArea(isUoArea);
dett.setUoRagioneria(isUoRagioneria);
dett.setElementoVoce(varStanzResRiga.getElemento_voce());
if (Optional.ofNullable(cdNaturaReimpiego).map(el->el.equals(linea.getNatura().getCd_natura())).orElse(Boolean.FALSE))
dett.setTipoNatura(CtrlPianoEcoDett.TIPO_REIMPIEGO);
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(varStanzResRiga.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);
}
}
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
*/
if (uoScrivania.isUoEnte() && variazione.getCentro_responsabilita().getUnita_padre().isUoEnte())
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 listCtrlPianoEco = new ArrayList();
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 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 contrattiAssociati = progettoHome.findContratti(progetto.getPg_progetto());
Optional 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));
//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);
}
}
private void controllaPdgPianoEconomico(UserContext userContext, OggettoBulk variazione, List listCtrlPianoEco, String cdVoceSpeciale, CdrBulk cdrPersonaleBulk) throws ComponentException{
try {
boolean isAttivaGestioneTrasferimenti = Utility.createParametriEnteComponentSession().getParametriEnte(userContext).getFl_variazioni_trasferimento();
boolean isVariazionePersonale = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::isMotivazioneVariazionePersonale)
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::isMotivazioneVariazionePersonale)
.orElse(Boolean.FALSE);
boolean isVariazioneArea = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::isMotivazioneTrasferimentoArea)
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::isMotivazioneTrasferimentoArea)
.orElse(Boolean.FALSE);
boolean isVariazioneRagioneria = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::isMotivazioneTrasferimentoRagioneria)
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::isMotivazioneTrasferimentoRagioneria)
.orElse(Boolean.FALSE);
boolean isCDRAreaVariazione = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getCentro_responsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::isUoArea)
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::getCentroDiResponsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::isUoArea)
.orElse(Boolean.FALSE);
String uoRagioneria = ((Configurazione_cnrHome)getHome(userContext,Configurazione_cnrBulk.class)).getUoRagioneria(CNRUserContext.getEsercizio(userContext));
boolean isCDRUoRagioneria = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getCentro_responsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::getCd_unita_organizzativa)
.map(uo->uo.equals(uoRagioneria))
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::getCentroDiResponsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::getCd_unita_organizzativa)
.map(uo->uo.equals(uoRagioneria))
.orElse(Boolean.FALSE);
boolean isCDRPersonaleVariazione = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getCentro_responsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::getCd_unita_organizzativa)
.map(cdUo -> cdUo.equals(cdrPersonaleBulk.getCd_unita_organizzativa()))
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::getCentroDiResponsabilita)
.map(CdrBulk::getUnita_padre)
.map(Unita_organizzativaBulk::getCd_unita_organizzativa)
.map(cdUo -> cdUo.equals(cdrPersonaleBulk.getCd_unita_organizzativa()))
.orElse(Boolean.FALSE);
if (isAttivaGestioneTrasferimenti) {
//se non è una variazione di personale non possono essere movimentate voci del personale
if (isVariazionePersonale) {
if (isCDRPersonaleVariazione) {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviCdrPersonale().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di restituzione di 'Trasferimenti per personale' "
+ "non è possibile assegnare fondi a voci accentrate del personale.");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiCdrPersonale().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di restituzione di 'Trasferimenti per personale' "
+ "è necessario sottrarre fondi a voci accentrate del personale."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativi().subtract(el.getImpSpesaNegativiCdrPersonale()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di restituzione 'Trasferimenti per personale' "
+ "non è possibile sottrarre fondi a CDR non qualificati come CDR Personale.");
});
} else {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviCdrPersonale().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti per personale' è necessario "
+ "assegnare fondi ad almeno una voce accentrata del personale."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiCdrPersonale().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti per personale' non è possibile "
+ "sottrarre fondi a voci accentrate del personale.");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositivi().subtract(el.getImpSpesaPositiviCdrPersonale()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti per personale' non è possibile "
+ "assegnare fondi a voci non accentrate del personale.");
});
}
} else if (!isCDRPersonaleVariazione) {
//Il controllo non vale se la variazione viene fatta dal CDR Personale in quanto per essa le voci sono qualificate come accentrate
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviCdrPersonale().compareTo(BigDecimal.ZERO)!=0 ||
el.getImpSpesaNegativiCdrPersonale().compareTo(BigDecimal.ZERO)!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile movimentare voci accentrate del personale "
+ "in una variazione non effettuata per 'Trasferimenti per personale'.");
});
}
if (isVariazioneArea) {
if (isCDRAreaVariazione) {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviArea().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti da Aree di Ricerca' non è possibile "
+ "assegnare fondi ad una Area di Ricerca.");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiArea().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti da Aree di Ricerca' è necessario "
+ "sottrarre fondi ad Aree di Ricerca."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativi().subtract(el.getImpSpesaNegativiArea()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti da Aree di Ricerca' non è possibile "
+ "sottrarre fondi a CDR non qualificati come Aree di Ricerca.");
});
} else {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviArea().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti ad Aree di Ricerca' è necessario "
+ "assegnare fondi ad almeno una Area di Ricerca."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiArea().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti ad Aree di Ricerca' non è possibile "
+ "sottrarre fondi ad Aree di Ricerca.");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositivi().subtract(el.getImpSpesaPositiviArea()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti ad Aree di Ricerca' non è possibile "
+ "assegnare fondi a CDR non qualificati come Aree di Ricerca.");
});
}
} else if (!isCDRAreaVariazione) {
//Il controllo non vale se la variazione viene fatta dal CDR Area
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviArea().compareTo(BigDecimal.ZERO)!=0 ||
el.getImpSpesaNegativiArea().compareTo(BigDecimal.ZERO)!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile movimentare voci su Aree di Ricerca "
+ "in una variazione non effettuata per 'Trasferimenti ad Aree di Ricerca'.");
});
}
if (isVariazioneRagioneria) {
if (isCDRUoRagioneria) {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviRagioneria().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti dalla Ragioneria' non è possibile "
+ "assegnare fondi alla Ragioneria (UO: "+uoRagioneria+").");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiRagioneria().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti dalla Ragioneria' è necessario "
+ "sottrarre fondi alla Ragioneria (UO: "+uoRagioneria+")."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativi().subtract(el.getImpSpesaNegativiRagioneria()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti dalla Ragioneria' non è possibile "
+ "sottrarre fondi a CDR non qualificati come Ragioneria.");
});
} else {
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviRagioneria().compareTo(BigDecimal.ZERO)>0)
.findFirst().orElseThrow(()->
new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti alla Ragioneria' è necessario "
+ "assegnare fondi alla Ragioneria (UO: "+uoRagioneria+")."));
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiRagioneria().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti alla Ragioneria' non è possibile "
+ "sottrarre fondi alla Ragioneria (UO: "+uoRagioneria+").");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositivi().subtract(el.getImpSpesaPositiviRagioneria()).compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! In una variazione di tipo 'Trasferimenti alla Ragioneria' non è possibile "
+ "assegnare fondi a CDR non qualificati come Ragioneria.");
});
}
}
} else if (!isCDRUoRagioneria) {
//Il controllo non vale se la variazione viene fatta dal CDR Ragioneria
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviRagioneria().compareTo(BigDecimal.ZERO)!=0 ||
el.getImpSpesaNegativiRagioneria().compareTo(BigDecimal.ZERO)!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile movimentare voci sulla Ragioneria (Uo: "+uoRagioneria+") "
+ "in una variazione non effettuata per 'Trasferimenti alla Ragioneria'.");
});
}
//se è una variazione di competenza per maggiori entrate/spese controllo solo che non siano stati sottratti erroneamente fondi a progetti
boolean isVariazioneCompetenzaMaggioreEntrateSpese = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getTipo_variazione)
.map(Tipo_variazioneBulk::isVariazioneMaggioriEntrateSpese)
.orElse(Boolean.FALSE);
//se è una variazione di competenza per minori entrate/spese controllo solo che non siano stati assegnati erroneamente fondi a progetti
boolean isVariazioneCompetenzaMinoriEntrateSpese = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getTipo_variazione)
.map(Tipo_variazioneBulk::isVariazioneMinoriEntrateSpese)
.orElse(Boolean.FALSE);
//se è una variazione di competenza per minori entrate/spese controllo solo che non siano stati assegnati erroneamente fondi a progetti
boolean isVariazioneStornoSpese = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getTipo_variazione)
.map(Tipo_variazioneBulk::isStornoSpesa)
.orElse(Boolean.FALSE) ||
Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::isVariazioneStorno)
.orElse(Boolean.FALSE);
BigDecimal impSpesaPositiviVoceSpeciale = listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviVoceSpeciale().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEco::getImpSpesaPositiviVoceSpeciale)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
BigDecimal impSpesaPositiviNaturaReimpiego = listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviNaturaReimpiego().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEco::getImpSpesaPositiviNaturaReimpiego)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
BigDecimal impSpesaNegativiNaturaReimpiego = listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiNaturaReimpiego().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEco::getImpSpesaNegativiNaturaReimpiego)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (isVariazioneCompetenzaMaggioreEntrateSpese || isVariazioneCompetenzaMinoriEntrateSpese) {
CdrBulk cdrVariazioneBulk = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getCentro_responsabilita)
.orElseGet(()->Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::getCentroDiResponsabilita)
.orElseThrow(()->new DetailedRuntimeException("Attenzione! Operazione non possibile in "
+ "quanto non è stato possibile individuare il CDR della variazione|")));
Unita_organizzativaBulk uoVariazioneBulk = (Unita_organizzativaBulk)getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cdrVariazioneBulk.getCd_unita_organizzativa()));
//verifico se si tratta di cdr Personale
boolean isCDRVariazionePersonale = uoVariazioneBulk.getCd_unita_organizzativa().equals(this.getCDRPersonale(userContext).getCd_unita_organizzativa());
//se è una variazione per maggiori/minori entrate/spese non è possibile movimentare voci accentrate del personale
if (!isCDRVariazionePersonale)
listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaPositiviCdrPersonale().compareTo(BigDecimal.ZERO)!=0 ||
el.getImpSpesaNegativiCdrPersonale().compareTo(BigDecimal.ZERO)!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile movimentare voci accentrate del personale "
+ "in una variazione per maggiori/minori spese.");
});
listCtrlPianoEco.stream()
.filter(el->el.getImpEntrataPositivi().subtract(el.getImpEntrataNegativi())
.compareTo(el.getImpSpesaPositivi().subtract(el.getImpSpesaNegativi()))!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Il saldo entrata ("
+ new it.cnr.contab.util.EuroFormat().format(el.getImpEntrataPositivi().subtract(el.getImpEntrataNegativi()))
+ ") non corrisponde al saldo spesa ("
+ new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositivi().subtract(el.getImpSpesaNegativi()))
+ ") per il progetto "+el.getProgetto().getCd_progetto()+".");
});
if (isVariazioneCompetenzaMaggioreEntrateSpese) {
listCtrlPianoEco.stream()
.filter(el->el.getImpEntrataNegativi().compareTo(BigDecimal.ZERO)>0 ||
el.getImpSpesaNegativi().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile sottrarre fondi al progetto "+
el.getProgetto().getCd_progetto()+" in quanto la variazione è di tipo 'Maggiori Entrate/Spese'.");
});
if (impSpesaPositiviNaturaReimpiego.compareTo(BigDecimal.ZERO)>0 || impSpesaNegativiNaturaReimpiego.compareTo(BigDecimal.ZERO)>0)
throw new ApplicationException("Attenzione! Risultano movimenti su GAE di natura 6 - 'Reimpiego di risorse' "
+ " non consentiti in quanto la variazione è di tipo 'Maggiori Entrate/Spese'.");
} else {
listCtrlPianoEco.stream()
.filter(el->el.getImpEntrataPositivi().compareTo(BigDecimal.ZERO)>0 ||
el.getImpSpesaPositivi().compareTo(BigDecimal.ZERO)>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Non è possibile attribuire fondi al progetto "+
el.getProgetto().getCd_progetto()+" in quanto la variazione è di tipo 'Minori Entrate/Spese'.");
});
}
} else if (isVariazioneStornoSpese){
/**
* 1. non è possibile attribuire fondi alla voce speciale (11048)
*/
if (impSpesaPositiviVoceSpeciale.compareTo(BigDecimal.ZERO)>0)
throw new ApplicationException("Attenzione! Non è possibile attribuire fondi alla voce "
+ cdVoceSpeciale + " ("
+ new it.cnr.contab.util.EuroFormat().format(impSpesaPositiviVoceSpeciale)+") "
+ "in quanto la variazione non è di tipo 'Maggiori Entrate/Spese'.");
//Controlli su tutte le altre tipologie di variazioni
Timestamp dataChiusura = Optional.of(variazione)
.filter(Pdg_variazioneBulk.class::isInstance)
.map(Pdg_variazioneBulk.class::cast)
.map(Pdg_variazioneBulk::getDt_chiusura)
.orElseGet(()->Optional.of(variazione)
.filter(Var_stanz_resBulk.class::isInstance)
.map(Var_stanz_resBulk.class::cast)
.map(Var_stanz_resBulk::getDt_chiusura)
.orElseThrow(()->new DetailedRuntimeException("Attenzione! Operazione non possibile in "
+ "quanto non risulta ancora impostata la data chiusura della variazione.")));
//CONTROLLI SU SINGOLO PROGETTO
//Controlli non attivi per variazioni maggiori entrate/spese che non possono avere importi negativi essendo già stato fatto
//questo controllo prima
/**
* 10. se un progetto è scaduto non è possibile attribuire fondi
*/
listCtrlPianoEco.stream()
.filter(el->el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaPositivi().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(dataChiusura)+").");});
/**
* 20. se un progetto è attivo è possibile sottrarre fondi a GAE di natura 6 solo prelevandoli dallo stesso progetto
* da GAE di natura 6 (regola non valida per progetti di Aree)
*/
if (!isVariazioneArea)
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativiNaturaReimpiego().compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaNegativiNaturaReimpiego().compareTo(el.getImpSpesaPositiviNaturaReimpiego())!=0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Sono stati sottratti fondi dal progetto "+
el.getProgetto().getCd_progetto()+"(" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaNegativiNaturaReimpiego()) +
") da GAE di natura 6 - 'Reimpiego di risorse' non compensati da un'equivalente " +
"assegnazione nell'ambito dello stesso progetto e della stessa natura ("+
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositiviNaturaReimpiego()) + ")");});
/**
* 30. se un progetto è aperto è possibile attribuire somme su GAE non di natura 6 solo se stornate dallo stesso progetto
* (regola non valida per progetti di Aree, CdrPersonale e Ragioneria)
*/
if (!isVariazioneArea && !isVariazioneRagioneria && !(isVariazionePersonale && variazione instanceof Var_stanz_resBulk)) {
boolean addSpesePersonale = !isAttivaGestioneTrasferimenti||isVariazionePersonale;
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaPositiviNetti()
.add(addSpesePersonale?el.getImpSpesaPositiviCdrPersonale():BigDecimal.ZERO)
.compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaPositiviNetti()
.add(addSpesePersonale?el.getImpSpesaPositiviCdrPersonale():BigDecimal.ZERO)
.compareTo(el.getImpSpesaNegativiNetti()
.add(addSpesePersonale?el.getImpSpesaNegativiCdrPersonale():BigDecimal.ZERO))>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.getImpSpesaPositiviNetti()
.add(addSpesePersonale?el.getImpSpesaPositiviCdrPersonale():BigDecimal.ZERO)) +
") non compensati da un equivalente prelievo nell'ambito dello stesso progetto ("+
new it.cnr.contab.util.EuroFormat().format(
el.getImpSpesaNegativiNetti()
.add(addSpesePersonale?el.getImpSpesaNegativiCdrPersonale():BigDecimal.ZERO)) + ")");});
/**
* 31. se un progetto è aperto è possibile sottrarre somme su GAE non di natura 6 solo se assegnate allo stesso progetto
* (regola non valida per progetti di Aree e CdrPersonale)
*
* N.B.: la sottrazione dalla voce speciale è consentita purchè sia compensata da trasferimenti a GAE di natura 6
* controllo effettuato al punto 90
*/
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativiNetti()
.add(addSpesePersonale?el.getImpSpesaNegativiCdrPersonale():BigDecimal.ZERO)
.compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaNegativiNetti()
.add(addSpesePersonale?el.getImpSpesaNegativiCdrPersonale():BigDecimal.ZERO)
.compareTo(el.getImpSpesaPositiviNetti()
.add(addSpesePersonale?el.getImpSpesaPositiviCdrPersonale():BigDecimal.ZERO))>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Sono stati sottratti fondi al progetto "+
el.getProgetto().getCd_progetto()+" (" +
new it.cnr.contab.util.EuroFormat().format(
el.getImpSpesaNegativiNetti()
.add(addSpesePersonale?el.getImpSpesaNegativiCdrPersonale():BigDecimal.ZERO)) +
") non compensati da un equivalente assegnazione nell'ambito dello stesso progetto ("+
new it.cnr.contab.util.EuroFormat().format(
el.getImpSpesaPositiviNetti()
.add(addSpesePersonale?el.getImpSpesaPositiviCdrPersonale():BigDecimal.ZERO)) + ")");});
}
/**
* 40. se un progetto è aperto e vengono sottratte somme ad un'area queste devono essere riassegnate
* allo stesso progetto e alla stessa area
*/
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativiArea().compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaNegativiArea().compareTo(el.getImpSpesaPositiviArea())>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Sono stati prelevati dall'area fondi dal progetto "+
el.getProgetto().getCd_progetto()+" (" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaNegativiArea()) +
") non compensati da un equivalente assegnazione nell'ambito dello stesso progetto e della stessa area ("+
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositiviArea()) + ")");});
/**
* 50. se un progetto è aperto e vengono sottratte somme al CDR Personale queste devono essere riassegnate
* allo stesso progetto e alla stesso CDR
*/
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativiCdrPersonale().compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaNegativiCdrPersonale().compareTo(el.getImpSpesaPositiviCdrPersonale())>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Sono stati prelevati dal CDR Personale fondi dal progetto "+
el.getProgetto().getCd_progetto()+" (" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaNegativiCdrPersonale()) +
") non compensati da un equivalente assegnazione nell'ambito dello stesso progetto e della stessa area ("+
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositiviCdrPersonale()) + ")");});
/**
* 50.1 se un progetto è aperto e vengono sottratte somme al CDR Ragioneria queste devono essere riassegnate
* allo stesso progetto e alla stesso CDR
*/
listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativiRagioneria().compareTo(BigDecimal.ZERO)>0)
.filter(el->el.getImpSpesaNegativiRagioneria().compareTo(el.getImpSpesaPositiviRagioneria())>0)
.findFirst().ifPresent(el->{
throw new DetailedRuntimeException("Attenzione! Sono stati prelevati dal CDR Ragioneria fondi dal progetto "+
el.getProgetto().getCd_progetto()+" (" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaNegativiRagioneria()) +
") non compensati da un equivalente assegnazione nell'ambito dello stesso progetto e della stessa area ("+
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositiviRagioneria()) + ")");});
//CONTROLLI SUL TOTALE PROGETTI
BigDecimal impNegativiPrgScaduti = listCtrlPianoEco.stream()
.filter(el->el.isScaduto(dataChiusura))
.filter(el->el.getImpSpesaNegativi().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEco::getImpSpesaNegativi)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
{
/**
* 60. se un progetto è scaduto se vengono sottratti importi devono essere girati a GaeNatura6 o al CDRPersonale
*/
BigDecimal impPositiviCashFund = listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->el.isNaturaReimpiego()||el.isCdrPersonale())
.filter(el->el.getImporto().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
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 coperti da variazioni a favore"
+ " di GAE di natura 6 - 'Reimpiego di risorse' o del CDR Personale ("
+ new it.cnr.contab.util.EuroFormat().format(impPositiviCashFund)+").");
}
{
/**
* 70. se un progetto è attivo se vengono sottratti importi su GAE natura 6 queste devono essere girate ad Aree di uguale Natura
*/
BigDecimal impSaldoPrgAttiviNaturaReimpiego = listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->!el.isUoArea())
.filter(el->!el.isCdrPersonale())
.filter(el->el.isNaturaReimpiego())
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoPrgAttiviNaturaReimpiego.compareTo(BigDecimal.ZERO)<0) {
//Vuol dire che ho ridotto progetti attivi sulla natura 6 per cui deve essere bilanciato solo con Aree
BigDecimal impSaldoPrgAttiviAreeNaturaReimpiego = listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->el.isUoArea())
.filter(el->el.isNaturaReimpiego())
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoPrgAttiviAreeNaturaReimpiego.compareTo(BigDecimal.ZERO)<0 ||
impSaldoPrgAttiviAreeNaturaReimpiego.abs().compareTo(impSaldoPrgAttiviNaturaReimpiego.abs())!=0)
throw new ApplicationException("Attenzione! Risultano prelievi da progetti attivi"
+ " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impSaldoPrgAttiviNaturaReimpiego.abs())
+ " su GAE di natura 6 che non risultano totalmente coperti da variazioni a favore"
+ " di Aree su GAE di natura 6 ("
+ new it.cnr.contab.util.EuroFormat().format(impSaldoPrgAttiviAreeNaturaReimpiego.abs())+").");
}
}
{
/**
* 80. se un progetto è attivo se vengono sottratti importi su GAE natura FES queste devono essere girate ad Aree di uguale Natura o
* al CDR Personale
*/
BigDecimal impSaldoPrgAttiviFonteEsterna = listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->!el.isUoArea())
.filter(el->!el.isCdrPersonale())
.filter(el->!el.isVoceSpeciale())
.filter(el->el.isNaturaFonteEsterna())
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoPrgAttiviFonteEsterna.compareTo(BigDecimal.ZERO)<0) {
//Vuol dire che ho ridotto progetti attivi sulle fonti esterne per cui deve essere bilanciato solo con Aree di uguale natura o
// con CDR Personale
BigDecimal impSaldoPrgAttiviCashFund = listCtrlPianoEco.stream()
.filter(el->!el.isScaduto(dataChiusura))
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->el.isUoArea()||el.isCdrPersonale())
.filter(el->el.isUoArea()?el.isNaturaFonteEsterna():Boolean.TRUE)
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoPrgAttiviCashFund.compareTo(BigDecimal.ZERO)<0 ||
impSaldoPrgAttiviCashFund.abs().compareTo(impSaldoPrgAttiviFonteEsterna.abs())!=0)
throw new ApplicationException("Attenzione! Risultano prelievi da progetti attivi"
+ " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impSaldoPrgAttiviFonteEsterna.abs())
+ " su GAE Fonte Esterna che non risultano totalmente coperti da variazioni a favore"
+ " di Aree su GAE Fonte Esterna o CDR Personale ("
+ new it.cnr.contab.util.EuroFormat().format(impSaldoPrgAttiviCashFund.abs())+").");
}
}
{
if (!isVariazioneArea) {
/**
* 90. è 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)
* c. da una GAE di natura 6 sullo stesso progetto
* (regola non valida per trasferimenti ad Aree)
*/
listCtrlPianoEco.stream()
.filter(el -> !el.isScaduto(dataChiusura))
.filter(el -> el.getImpSpesaNegativiNaturaReimpiego().compareTo(BigDecimal.ZERO) > 0)
.filter(el -> el.getImpSpesaNegativiNaturaReimpiego().compareTo(el.getImpSpesaPositiviNaturaReimpiego()) != 0)
.findFirst().ifPresent(el -> {
throw new DetailedRuntimeException("Attenzione! Sono stati prelevati fondi dal progetto " +
el.getProgetto().getCd_progetto() + "(" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaNegativiNaturaReimpiego()) +
") da GAE di natura 6 - 'Reimpiego di risorse' non compensati da un'equivalente " +
"assegnazione nell'ambito dello stesso progetto e della stessa natura (" +
new it.cnr.contab.util.EuroFormat().format(el.getImpSpesaPositiviNaturaReimpiego()) + ")");
});
BigDecimal saldoPositivoNaturaReimpiego = listCtrlPianoEco.stream()
.filter(el -> el.getImpSpesaPositiviNaturaReimpiego().subtract(el.getImpSpesaNegativiNaturaReimpiego()).compareTo(BigDecimal.ZERO) > 0)
.map(el -> el.getImpSpesaPositiviNaturaReimpiego().subtract(el.getImpSpesaNegativiNaturaReimpiego()))
.reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
if (saldoPositivoNaturaReimpiego.compareTo(BigDecimal.ZERO) > 0) {
BigDecimal impNegativiVoceSpecialePrgInCorso = listCtrlPianoEco.stream()
.filter(el -> !el.isScaduto(dataChiusura))
.filter(el -> el.getImpSpesaNegativiVoceSpeciale().compareTo(BigDecimal.ZERO) > 0)
.map(CtrlPianoEco::getImpSpesaNegativiVoceSpeciale)
.reduce((x, y) -> x.add(y)).orElse(BigDecimal.ZERO);
if (saldoPositivoNaturaReimpiego.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(saldoPositivoNaturaReimpiego)
+ " che non corrisponde all'importo prelevato da progetti scaduti e/o dalla voce " + cdVoceSpeciale
+ " (" + new it.cnr.contab.util.EuroFormat().format(impNegativiPrgScaduti) + ").");
}
} else {
/**
* 90. in una variazione di area se vengono sottratti importi su GAE natura 6 queste devono essere girate ad Aree di uguale Natura
*/
BigDecimal impSaldoNaturaReimpiego = listCtrlPianoEco.stream()
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->!el.isUoArea())
.filter(el->el.isNaturaReimpiego())
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoNaturaReimpiego.compareTo(BigDecimal.ZERO)<0) {
//Vuol dire che ho ridotto su GAE Natura 6 per cui deve essere bilanciato solo con Aree di uguale natura
BigDecimal impSaldoNaturaReimpiegoArea = listCtrlPianoEco.stream()
.map(CtrlPianoEco::getDett)
.flatMap(List::stream)
.filter(el->el.isUoArea())
.filter(el->el.isNaturaReimpiego())
.map(CtrlPianoEcoDett::getImporto)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impSaldoNaturaReimpiegoArea.compareTo(BigDecimal.ZERO)<0 ||
impSaldoNaturaReimpiegoArea.abs().compareTo(impSaldoNaturaReimpiego.abs())!=0)
throw new ApplicationException("Attenzione! Risultano prelievi"
+ " per un importo di " + new it.cnr.contab.util.EuroFormat().format(impSaldoNaturaReimpiego.abs())
+ " su GAE di natura 6 - 'Reimpiego di risorse' che non risultano totalmente coperti da variazioni a favore"
+ " di Aree su GAE di natura 6 - 'Reimpiego di risorse' ("
+ new it.cnr.contab.util.EuroFormat().format(impSaldoNaturaReimpiegoArea.abs())+").");
}
}
}
{
/**
* 100. se vengono spostate somme dalla voce speciale (11048) devono essere girate a GaeNatura6
*/
BigDecimal impNegativiVoceSpeciale = listCtrlPianoEco.stream()
.filter(el->el.getImpSpesaNegativiVoceSpeciale().compareTo(BigDecimal.ZERO)>0)
.map(CtrlPianoEco::getImpSpesaNegativiVoceSpeciale)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (impNegativiVoceSpeciale.compareTo(BigDecimal.ZERO)>0 && impNegativiVoceSpeciale.compareTo(impSpesaPositiviNaturaReimpiego)>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 coperti da variazioni a favore"
+ " di GAE di natura 6 - 'Reimpiego di risorse' ("
+ new it.cnr.contab.util.EuroFormat().format(impSpesaPositiviNaturaReimpiego)+").");
}
}
} catch (RemoteException|PersistencyException e) {
throw new ComponentException(e);
}
}
public BigDecimal getStanziamentoAssestatoProgetto(UserContext userContext, ProgettoBulk progetto, String tiGestione, Integer pEsercizio, Timestamp pDataLimite, String tiImporto) throws ComponentException{
try{
Voce_f_saldi_cdr_lineaHome saldiHome = (Voce_f_saldi_cdr_lineaHome)getHome(userContext, Voce_f_saldi_cdr_lineaBulk.class);
Integer annoDtLimite = Optional.ofNullable(pDataLimite)
.map(el->{
Calendar calDtLimite = Calendar.getInstance();
calDtLimite.setTime(new Date(pDataLimite.getTime()));
return calDtLimite.get(Calendar.YEAR)-1;
})
.orElse(null);
BigDecimal result = BigDecimal.ZERO;
if (Elemento_voceHome.GESTIONE_ENTRATE.equals(tiGestione)) {
SQLBuilder saldiEtrSQL = saldiHome.createSQLBuilder();
saldiEtrSQL.addSQLClause(FindClause.AND, "VOCE_F_SALDI_CDR_LINEA.TI_GESTIONE", SQLBuilder.EQUALS, Elemento_voceHome.GESTIONE_ENTRATE);
saldiEtrSQL.addTableToHeader("V_LINEA_ATTIVITA_VALIDA");
saldiEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO", "VOCE_F_SALDI_CDR_LINEA.ESERCIZIO");
saldiEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", "VOCE_F_SALDI_CDR_LINEA.CD_CENTRO_RESPONSABILITA");
saldiEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", "VOCE_F_SALDI_CDR_LINEA.CD_LINEA_ATTIVITA");
saldiEtrSQL.addSQLClause(FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO", SQLBuilder.EQUALS, progetto.getPg_progetto());
List saldiList = new it.cnr.jada.bulk.BulkList(saldiHome.fetchAll(saldiEtrSQL));
result = saldiList.stream()
.filter(el->Optional.ofNullable(pEsercizio).map(ese->ese.equals(el.getEsercizio_res())).orElse(Boolean.TRUE))
.filter(el->el.getEsercizio().equals(el.getEsercizio_res()))
.filter(el->Optional.ofNullable(annoDtLimite).map(aaDt->aaDt.compareTo(el.getEsercizio())>=0).orElse(Boolean.TRUE))
.map(el->{
//Prendo sempre lo stanziamento di tutti gli anni
BigDecimal assestato = el.getIm_stanz_iniziale_a1();
//e tutte le variazioni, tranne quelle dell'anno della data limite se presente,
//che calcolo puntualmente dopo
if (Optional.ofNullable(annoDtLimite)
.map(annoLimite->el.getEsercizio().compareTo(annoLimite)<0)
.orElse(Boolean.TRUE))
assestato = assestato.add(el.getVariazioni_piu()).subtract(el.getVariazioni_meno());
return assestato;
})
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (Optional.ofNullable(pDataLimite).isPresent()) {
//sommo le variazioni dell'anno della data limite
Pdg_variazione_riga_gestHome varHome = (Pdg_variazione_riga_gestHome)getHome(userContext, Pdg_variazione_riga_gestBulk.class);
SQLBuilder varEtrSQL = varHome.createSQLBuilder();
varEtrSQL.addSQLClause(FindClause.AND, "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO", SQLBuilder.EQUALS, annoDtLimite);
varEtrSQL.addSQLClause(FindClause.AND, "PDG_VARIAZIONE_RIGA_GEST.TI_GESTIONE", SQLBuilder.EQUALS, Elemento_voceHome.GESTIONE_ENTRATE);
varEtrSQL.addTableToHeader("PDG_VARIAZIONE");
varEtrSQL.addSQLJoin("PDG_VARIAZIONE.ESERCIZIO", "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO");
varEtrSQL.addSQLJoin("PDG_VARIAZIONE.PG_VARIAZIONE_PDG", "PDG_VARIAZIONE_RIGA_GEST.PG_VARIAZIONE_PDG");
varEtrSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.DT_CHIUSURA", SQLBuilder.GREATER_EQUALS, pDataLimite);
varEtrSQL.openParenthesis(FindClause.AND);
varEtrSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_APPROVATA);
varEtrSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_APPROVAZIONE_FORMALE);
varEtrSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_PROPOSTA_DEFINITIVA);
varEtrSQL.closeParenthesis();
varEtrSQL.addTableToHeader("V_LINEA_ATTIVITA_VALIDA");
varEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO", "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO");
varEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", "PDG_VARIAZIONE_RIGA_GEST.CD_CENTRO_RESPONSABILITA");
varEtrSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", "PDG_VARIAZIONE_RIGA_GEST.CD_LINEA_ATTIVITA");
varEtrSQL.addSQLClause(FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO", SQLBuilder.EQUALS, progetto.getPg_progetto());
List varList = new it.cnr.jada.bulk.BulkList(varHome.fetchAll(varEtrSQL));
BigDecimal variazioni = varList.stream()
.map(Pdg_variazione_riga_gestBulk::getIm_entrata)
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
result = result.add(variazioni);
}
} else if (Elemento_voceHome.GESTIONE_SPESE.equals(tiGestione)) {
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);
String cdNaturaReimpiego = configSession.getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO);
SQLBuilder saldiSpeSQL = saldiHome.createSQLBuilder();
saldiSpeSQL.addSQLClause(FindClause.AND, "VOCE_F_SALDI_CDR_LINEA.TI_GESTIONE", SQLBuilder.EQUALS, Elemento_voceHome.GESTIONE_SPESE);
saldiSpeSQL.addTableToHeader("V_LINEA_ATTIVITA_VALIDA");
saldiSpeSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO", "VOCE_F_SALDI_CDR_LINEA.ESERCIZIO");
saldiSpeSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", "VOCE_F_SALDI_CDR_LINEA.CD_CENTRO_RESPONSABILITA");
saldiSpeSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", "VOCE_F_SALDI_CDR_LINEA.CD_LINEA_ATTIVITA");
saldiSpeSQL.addSQLClause(FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO", SQLBuilder.EQUALS, progetto.getPg_progetto());
saldiSpeSQL.addTableToHeader("NATURA");
saldiSpeSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA", "NATURA.CD_NATURA");
if (Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO.equals(tiImporto)) {
saldiSpeSQL.addSQLClause(FindClause.AND, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_ESTERNE);
saldiSpeSQL.addSQLClause(FindClause.AND, "NATURA.CD_NATURA", SQLBuilder.NOT_EQUALS, cdNaturaReimpiego);
} else if (Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO.equals(tiImporto)) {
saldiSpeSQL.openParenthesis(FindClause.AND);
saldiSpeSQL.addSQLClause(FindClause.OR, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_INTERNE);
saldiSpeSQL.addSQLClause(FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.CD_NATURA", SQLBuilder.EQUALS, cdNaturaReimpiego);
saldiSpeSQL.closeParenthesis();
}
List saldiList = new it.cnr.jada.bulk.BulkList(saldiHome.fetchAll(saldiSpeSQL));
result = saldiList.stream()
.filter(el->Optional.ofNullable(pEsercizio).map(ese->ese.equals(el.getEsercizio_res())).orElse(Boolean.TRUE))
.filter(el->Optional.ofNullable(annoDtLimite).map(aaDt->aaDt.compareTo(el.getEsercizio())>=0).orElse(Boolean.TRUE))
.map(el->{
BigDecimal assestato = BigDecimal.ZERO;
//Prendo sempre lo stanziamento di tutti gli anni
if (el.getEsercizio().equals(el.getEsercizio_res()))
assestato = el.getIm_stanz_iniziale_a1();
//e tutte le variazioni, tranne quelle dell'anno della data limite se presente,
//che devo calcolare puntualmente
if (Optional.ofNullable(annoDtLimite)
.map(annoLimite->el.getEsercizio().compareTo(annoLimite)<0)
.orElse(Boolean.TRUE)){
if (el.getEsercizio().equals(el.getEsercizio_res()))
assestato = assestato.add(el.getVariazioni_piu()).subtract(el.getVariazioni_meno());
else
assestato = assestato.add(el.getVar_piu_stanz_res_imp()).subtract(el.getVar_meno_stanz_res_imp());
}
return assestato;
})
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
if (Optional.ofNullable(pDataLimite).isPresent()) {
if (Optional.ofNullable(pEsercizio).map(ese->ese.equals(annoDtLimite)).orElse(Boolean.TRUE)) {
//sommo le variazioni di competenza dell'anno della data limite
Pdg_variazione_riga_gestHome varHome = (Pdg_variazione_riga_gestHome)getHome(userContext, Pdg_variazione_riga_gestBulk.class);
SQLBuilder varSpeCompSQL = varHome.createSQLBuilder();
varSpeCompSQL.addSQLClause(FindClause.AND, "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO", SQLBuilder.EQUALS, annoDtLimite);
varSpeCompSQL.addSQLClause(FindClause.AND, "PDG_VARIAZIONE_RIGA_GEST.TI_GESTIONE", SQLBuilder.EQUALS, Elemento_voceHome.GESTIONE_SPESE);
varSpeCompSQL.addTableToHeader("PDG_VARIAZIONE");
varSpeCompSQL.addSQLJoin("PDG_VARIAZIONE.ESERCIZIO", "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO");
varSpeCompSQL.addSQLJoin("PDG_VARIAZIONE.PG_VARIAZIONE_PDG", "PDG_VARIAZIONE_RIGA_GEST.PG_VARIAZIONE_PDG");
varSpeCompSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.DT_CHIUSURA", SQLBuilder.GREATER_EQUALS, pDataLimite);
varSpeCompSQL.openParenthesis(FindClause.AND);
varSpeCompSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_APPROVATA);
varSpeCompSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_APPROVAZIONE_FORMALE);
varSpeCompSQL.addSQLClause(FindClause.OR, "PDG_VARIAZIONE.STATO", SQLBuilder.EQUALS, Pdg_variazioneBulk.STATO_PROPOSTA_DEFINITIVA);
varSpeCompSQL.closeParenthesis();
varSpeCompSQL.openParenthesis(FindClause.AND);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE.TI_MOTIVAZIONE_VARIAZIONE",SQLBuilder.ISNULL,null);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE.TI_MOTIVAZIONE_VARIAZIONE",SQLBuilder.NOT_EQUALS,Pdg_variazioneBulk.MOTIVAZIONE_TRASFERIMENTO_AREA);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE_RIGA_GEST.IM_SPESE_GEST_DECENTRATA_INT",SQLBuilder.GREATER,BigDecimal.ZERO);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE_RIGA_GEST.IM_SPESE_GEST_ACCENTRATA_INT",SQLBuilder.GREATER,BigDecimal.ZERO);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE_RIGA_GEST.IM_SPESE_GEST_DECENTRATA_EST",SQLBuilder.GREATER,BigDecimal.ZERO);
varSpeCompSQL.addSQLClause(FindClause.OR,"PDG_VARIAZIONE_RIGA_GEST.IM_SPESE_GEST_DECENTRATA_EST",SQLBuilder.GREATER,BigDecimal.ZERO);
varSpeCompSQL.closeParenthesis();
varSpeCompSQL.addTableToHeader("V_LINEA_ATTIVITA_VALIDA");
varSpeCompSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO", "PDG_VARIAZIONE_RIGA_GEST.ESERCIZIO");
varSpeCompSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", "PDG_VARIAZIONE_RIGA_GEST.CD_CENTRO_RESPONSABILITA");
varSpeCompSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", "PDG_VARIAZIONE_RIGA_GEST.CD_LINEA_ATTIVITA");
varSpeCompSQL.addSQLClause(FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO", SQLBuilder.EQUALS, progetto.getPg_progetto());
varSpeCompSQL.addTableToHeader("NATURA");
varSpeCompSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA", "NATURA.CD_NATURA");
if (Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO.equals(tiImporto)) {
varSpeCompSQL.addSQLClause(FindClause.AND, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_ESTERNE);
varSpeCompSQL.addSQLClause(FindClause.AND, "NATURA.CD_NATURA", SQLBuilder.NOT_EQUALS, cdNaturaReimpiego);
} else if (Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO.equals(tiImporto)) {
varSpeCompSQL.openParenthesis(FindClause.AND);
varSpeCompSQL.addSQLClause(FindClause.OR, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_INTERNE);
varSpeCompSQL.addSQLClause(FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.CD_NATURA", SQLBuilder.EQUALS, cdNaturaReimpiego);
varSpeCompSQL.closeParenthesis();
}
List varSpeCompList = new it.cnr.jada.bulk.BulkList(varHome.fetchAll(varSpeCompSQL));
BigDecimal variazioniCompetenza = varSpeCompList.stream()
.map(el->{
BigDecimal resultEst = BigDecimal.ZERO;
if (Utility.nvl(el.getIm_spese_gest_decentrata_est()).compareTo(BigDecimal.ZERO)!=0)
resultEst = Utility.nvl(el.getIm_spese_gest_decentrata_est());
else if (Utility.nvl(el.getIm_spese_gest_accentrata_est()).compareTo(BigDecimal.ZERO)!=0 &&
(el.getCd_cdr_assegnatario_clgs()!=null || el.isDettaglioScaricato()))
resultEst = Utility.nvl(el.getIm_spese_gest_accentrata_est());
if (Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO.equals(tiImporto))
return resultEst;
else if (Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO.equals(tiImporto)) {
BigDecimal resultInt = BigDecimal.ZERO;
if (Utility.nvl(el.getIm_spese_gest_decentrata_int()).compareTo(BigDecimal.ZERO)!=0)
resultInt = Utility.nvl(el.getIm_spese_gest_decentrata_int());
else if (Utility.nvl(el.getIm_spese_gest_accentrata_int()).compareTo(BigDecimal.ZERO)!=0 &&
(el.getCd_cdr_assegnatario_clgs()!=null || el.isDettaglioScaricato()))
resultInt = Utility.nvl(el.getIm_spese_gest_accentrata_int());
return resultEst.add(resultInt);
}
return BigDecimal.ZERO;
})
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
result = result.add(variazioniCompetenza);
}
if (Optional.ofNullable(pEsercizio).map(ese->!ese.equals(annoDtLimite)).orElse(Boolean.TRUE)) {
//sommo le variazioni di residuo dell'anno della data limite
Var_stanz_res_rigaHome varHome = (Var_stanz_res_rigaHome)getHome(userContext, Var_stanz_res_rigaBulk.class);
SQLBuilder varSpeResSQL = varHome.createSQLBuilder();
varSpeResSQL.addSQLClause(FindClause.AND, "VAR_STANZ_RES_RIGA.ESERCIZIO", SQLBuilder.EQUALS, annoDtLimite);
varSpeResSQL.addSQLClause(FindClause.AND, "VAR_STANZ_RES_RIGA.TI_GESTIONE", SQLBuilder.EQUALS, Elemento_voceHome.GESTIONE_SPESE);
if (Optional.ofNullable(pEsercizio).isPresent())
varSpeResSQL.addSQLClause(FindClause.AND, "VAR_STANZ_RES_RIGA.ESERCIZIO_RES", SQLBuilder.EQUALS, pEsercizio);
varSpeResSQL.addTableToHeader("VAR_STANZ_RES");
varSpeResSQL.addSQLJoin("VAR_STANZ_RES.ESERCIZIO", "VAR_STANZ_RES_RIGA.ESERCIZIO");
varSpeResSQL.addSQLJoin("VAR_STANZ_RES.PG_VARIAZIONE", "VAR_STANZ_RES_RIGA.PG_VARIAZIONE");
varSpeResSQL.addSQLClause(FindClause.OR, "VAR_STANZ_RES.DT_CHIUSURA", SQLBuilder.GREATER_EQUALS, pDataLimite);
varSpeResSQL.openParenthesis(FindClause.AND);
varSpeResSQL.addSQLClause(FindClause.OR, "VAR_STANZ_RES.STATO", SQLBuilder.EQUALS, Var_stanz_resBulk.STATO_APPROVATA);
varSpeResSQL.addSQLClause(FindClause.OR, "VAR_STANZ_RES.STATO", SQLBuilder.EQUALS, Var_stanz_resBulk.STATO_PROPOSTA_DEFINITIVA);
varSpeResSQL.closeParenthesis();
varSpeResSQL.openParenthesis(FindClause.AND);
varSpeResSQL.addSQLClause(FindClause.OR,"VAR_STANZ_RES.TI_MOTIVAZIONE_VARIAZIONE",SQLBuilder.ISNULL,null);
varSpeResSQL.addSQLClause(FindClause.OR,"VAR_STANZ_RES.TI_MOTIVAZIONE_VARIAZIONE",SQLBuilder.NOT_EQUALS,Pdg_variazioneBulk.MOTIVAZIONE_TRASFERIMENTO_AREA);
varSpeResSQL.addSQLClause(FindClause.OR,"VAR_STANZ_RES_RIGA.IM_VARIAZIONE",SQLBuilder.GREATER,BigDecimal.ZERO);
varSpeResSQL.closeParenthesis();
varSpeResSQL.addTableToHeader("V_LINEA_ATTIVITA_VALIDA");
varSpeResSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO", "VAR_STANZ_RES_RIGA.ESERCIZIO");
varSpeResSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", "VAR_STANZ_RES_RIGA.CD_CENTRO_RESPONSABILITA");
varSpeResSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA", "VAR_STANZ_RES_RIGA.CD_LINEA_ATTIVITA");
varSpeResSQL.addSQLClause(FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO", SQLBuilder.EQUALS, progetto.getPg_progetto());
varSpeResSQL.addTableToHeader("NATURA");
varSpeResSQL.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA", "NATURA.CD_NATURA");
if (Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO.equals(tiImporto)) {
varSpeResSQL.addSQLClause(FindClause.AND, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_ESTERNE);
varSpeResSQL.addSQLClause(FindClause.AND, "NATURA.CD_NATURA", SQLBuilder.NOT_EQUALS, cdNaturaReimpiego);
} else if (Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO.equals(tiImporto)) {
varSpeResSQL.openParenthesis(FindClause.AND);
varSpeResSQL.addSQLClause(FindClause.OR, "NATURA.TIPO", SQLBuilder.EQUALS, NaturaBulk.TIPO_NATURA_FONTI_INTERNE);
varSpeResSQL.addSQLClause(FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.CD_NATURA", SQLBuilder.EQUALS, cdNaturaReimpiego);
varSpeResSQL.closeParenthesis();
}
List varSpeResList = new it.cnr.jada.bulk.BulkList(varHome.fetchAll(varSpeResSQL));
BigDecimal variazioniResiduo = varSpeResList.stream()
.map(el->{
BigDecimal resultEst = BigDecimal.ZERO;
if (el.getVar_stanz_res().getTipologia_fin().equals(NaturaBulk.TIPO_NATURA_FONTI_ESTERNE))
resultEst = Utility.nvl(el.getIm_variazione());
if (Progetto_other_fieldHome.TI_IMPORTO_FINANZIATO.equals(tiImporto))
return resultEst;
else if (Progetto_other_fieldHome.TI_IMPORTO_COFINANZIATO.equals(tiImporto)) {
BigDecimal resultInt = BigDecimal.ZERO;
if (el.getVar_stanz_res().getTipologia_fin().equals(NaturaBulk.TIPO_NATURA_FONTI_INTERNE))
resultInt = Utility.nvl(el.getIm_variazione());
return resultEst.add(resultInt);
}
return BigDecimal.ZERO;
})
.reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
result = result.add(variazioniResiduo);
}
}
}
return result;
} catch(Throwable e) {
throw handleException(e);
}
}
private CdrBulk getCDRPersonale(UserContext userContext) throws ComponentException{
try {
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."));
return (CdrBulk)getHome(userContext, CdrBulk.class).findByPrimaryKey(new CdrBulk(cdrPersonale));
} catch(Throwable e) {
throw handleException(e);
}
}
} © 2015 - 2025 Weber Informatics LLC | Privacy Policy