All Downloads are FREE. Search and download functionalities are using the official Maven repository.

it.cnr.contab.varstanz00.comp.VariazioniStanziamentoResiduoComponent 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 .
 */

/*
 * Created on Feb 16, 2006
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package it.cnr.contab.varstanz00.comp;

import java.io.Serializable;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.ejb.EJBException;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import it.cnr.contab.anagraf00.core.bulk.TerzoBulk;
import it.cnr.contab.anagraf00.core.bulk.TerzoHome;
import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Configurazione_cnrHome;
import it.cnr.contab.config00.bulk.Parametri_cdsBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrHome;
import it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession;
import it.cnr.contab.config00.ejb.Parametri_cnrComponentSession;
import it.cnr.contab.config00.esercizio.bulk.Esercizio_baseBulk;
import it.cnr.contab.config00.esercizio.bulk.Esercizio_baseHome;
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.Elemento_voceBulk;
import it.cnr.contab.config00.pdcfin.bulk.NaturaBulk;
import it.cnr.contab.config00.pdcfin.bulk.NaturaHome;
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.CdrKey;
import it.cnr.contab.config00.sto.bulk.CdsBulk;
import it.cnr.contab.config00.sto.bulk.CdsHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativa_enteBulk;
import it.cnr.contab.config00.sto.bulk.V_struttura_organizzativaBulk;
import it.cnr.contab.doccont00.core.bulk.Accertamento_mod_voceBulk;
import it.cnr.contab.doccont00.core.bulk.Accertamento_modificaBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneHome;
import it.cnr.contab.messaggio00.bulk.MessaggioBulk;
import it.cnr.contab.messaggio00.bulk.MessaggioHome;
import it.cnr.contab.pdg00.bulk.Pdg_variazioneBulk;
import it.cnr.contab.prevent00.bulk.Pdg_vincoloBulk;
import it.cnr.contab.prevent00.bulk.Pdg_vincoloHome;
import it.cnr.contab.prevent00.bulk.V_assestato_residuoBulk;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_linea_resBulk;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_linea_resHome;
import it.cnr.contab.preventvar00.bulk.Var_bilancioBulk;
import it.cnr.contab.preventvar00.bulk.Var_bilancioHome;
import it.cnr.contab.progettiric00.core.bulk.*;
import it.cnr.contab.progettiric00.enumeration.StatoProgettoRimodulazione;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.contab.utenze00.bulk.UtenteBulk;
import it.cnr.contab.utenze00.bulk.UtenteHome;
import it.cnr.contab.utenze00.bulk.Utente_indirizzi_mailBulk;
import it.cnr.contab.utenze00.bulk.Utente_indirizzi_mailHome;
import it.cnr.contab.util.ICancellatoLogicamente;
import it.cnr.contab.util.Utility;
import it.cnr.contab.varstanz00.bulk.Ass_var_stanz_res_cdrBulk;
import it.cnr.contab.varstanz00.bulk.Ass_var_stanz_res_cdrHome;
import it.cnr.contab.varstanz00.bulk.Var_stanz_resBulk;
import it.cnr.contab.varstanz00.bulk.Var_stanz_resHome;
import it.cnr.contab.varstanz00.bulk.Var_stanz_res_rigaBulk;
import it.cnr.jada.DetailedRuntimeException;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BulkList;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.ValidationException;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ApplicationRuntimeException;
import it.cnr.jada.comp.CRUDComponent;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.persistency.Broker;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.persistency.sql.FindClause;
import it.cnr.jada.persistency.sql.LoggableStatement;
import it.cnr.jada.persistency.sql.PersistentHome;
import it.cnr.jada.persistency.sql.Query;
import it.cnr.jada.persistency.sql.SQLBuilder;
import it.cnr.jada.persistency.sql.SQLExceptionHandler;
import it.cnr.jada.util.Config;
import it.cnr.jada.util.DateUtils;
import it.cnr.jada.util.SendMail;
import it.cnr.jada.util.ejb.EJBCommonServices;

/**
 * @author mspasiano
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class VariazioniStanziamentoResiduoComponent extends CRUDComponent implements Cloneable, Serializable{
	private class CtrlVarPianoEco {
		public CtrlVarPianoEco(ProgettoBulk progetto) {
			super();
			this.progetto = progetto;
			this.imSpeseInterne = BigDecimal.ZERO;
			this.imSpeseEsterne = BigDecimal.ZERO;
		}
		private ProgettoBulk progetto;
		private BigDecimal imSpeseInterne;
		private BigDecimal imSpeseEsterne;
		public ProgettoBulk getProgetto() {
			return progetto;
		}
		public void setProgetto(ProgettoBulk progetto) {
			this.progetto = progetto;
		}
		public BigDecimal getImSpeseInterne() {
			return imSpeseInterne;
		}
		public void setImSpeseInterne(BigDecimal imSpeseInterne) {
			this.imSpeseInterne = imSpeseInterne;
		}
		public BigDecimal getImSpeseEsterne() {
			return imSpeseEsterne;
		}
		public void setImSpeseEsterne(BigDecimal imSpeseEsterne) {
			this.imSpeseEsterne = imSpeseEsterne;
		}
	}

	public VariazioniStanziamentoResiduoComponent() {
		super();
	}
	public OggettoBulk inizializzaBulkPerInserimento(UserContext usercontext,OggettoBulk oggettobulk)throws ComponentException {
		try {
			Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)super.inizializzaBulkPerInserimento(usercontext, oggettobulk);
			var_stanz_res.setEsercizio(CNRUserContext.getEsercizio(usercontext));
			var_stanz_res.setCentroDiSpesa((CdsBulk)getHome(usercontext, CdsBulk.class).findByPrimaryKey(new CdsBulk(CNRUserContext.getCd_cds(usercontext))));
			var_stanz_res.setCentroDiResponsabilita(Utility.createCdrComponentSession().cdrFromUserContext(usercontext));
			var_stanz_res.setStato(Var_stanz_resBulk.STATO_PROPOSTA_PROVVISORIA);
			
			
			java.sql.Timestamp tsOdierno = EJBCommonServices.getServerDate();
			GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) GregorianCalendar.getInstance();
	       	tsOdiernoGregorian.setTime(tsOdierno);
	        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");		
	        	        
	        if(tsOdiernoGregorian.get(GregorianCalendar.YEAR) > CNRUserContext.getEsercizio(usercontext).intValue())
				try {
					var_stanz_res.setDt_apertura(new java.sql.Timestamp(sdf.parse("31/12/"+var_stanz_res.getEsercizio().intValue()).getTime()));
				} catch (ParseException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			else {
				var_stanz_res.setDt_apertura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(usercontext)));
				
	        }
	        
	        
//			var_stanz_res.setDt_apertura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(usercontext)));
			inizializzaSommeAZero(var_stanz_res);
			return var_stanz_res;
		} catch (DetailedRuntimeException e) {
			throw new ComponentException(e);
		}catch (RemoteException e) {
			throw new ComponentException(e);
		} catch (EJBException e) {
			throw new ComponentException(e);
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}		
	}
	public ProgettoBulk getProgettoLineaAttivita(UserContext usercontext, Var_stanz_res_rigaBulk varRiga) throws ComponentException{
		try {
			PersistentHome laHome = getHome(usercontext, WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA");
			SQLBuilder sql = laHome.createSQLBuilder();
			sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,varRiga.getEsercizio());
			sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,varRiga.getCd_cdr());
			sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA",SQLBuilder.EQUALS,varRiga.getCd_linea_attivita());
			List list = laHome.fetchAll(sql);
			if (list.size()==1)
				return ((WorkpackageBulk)list.get(0)).getProgetto();
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
		return null;
	}
	public OggettoBulk inizializzaBulkPerModifica(UserContext usercontext,OggettoBulk oggettobulk)throws ComponentException {
		try {
			CdrBulk cdr = ((Var_stanz_resBulk)oggettobulk).getCdr();
			Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)super.inizializzaBulkPerModifica(usercontext,oggettobulk);
			var_stanz_res.setCdr(cdr);
			var_stanz_res.setCdsAbilitatoAdApprovare(isCdsAbilitatoAdApprovare(usercontext,var_stanz_res.getCentroDiResponsabilita().getCd_cds(),var_stanz_res));	
			var_stanz_res.setEnteAbilitatoAdApprovare(isEnteAbilitatoAdApprovare(usercontext,var_stanz_res));
			Var_stanz_resHome testataHome = (Var_stanz_resHome)getHome(usercontext, Var_stanz_resBulk.class);
			var_stanz_res.setAssociazioneCDR(new it.cnr.jada.bulk.BulkList(testataHome.findAssociazioneCDR(var_stanz_res)));
			var_stanz_res.setRigaVariazione(new it.cnr.jada.bulk.BulkList(testataHome.findVariazioniRiga(var_stanz_res)));
            inizializzaSommeCDR(usercontext,var_stanz_res);
			var_stanz_res.setTotale_righe_variazione(Utility.ZERO);
			PersistentHome laHome = getHome(usercontext, WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA");
			for (Iterator righeVar=var_stanz_res.getRigaVariazione().iterator();righeVar.hasNext();){
				Var_stanz_res_rigaBulk varRiga = (Var_stanz_res_rigaBulk)righeVar.next();
				var_stanz_res.setTotale_righe_variazione(Utility.nvl(var_stanz_res.getTotale_righe_variazione()).add(Utility.nvl(varRiga.getIm_variazione())));
				varRiga.setDisponibilita_stanz_res(calcolaDisponibilita_stanz_res(usercontext,varRiga));
				varRiga.setProgetto(getProgettoLineaAttivita(usercontext, varRiga));
			}					
			if (var_stanz_res.getStato().equalsIgnoreCase(Var_stanz_resBulk.STATO_APPROVATA)){
				var_stanz_res.setVar_bilancio(((Var_bilancioHome)getHome(usercontext, Var_bilancioBulk.class)).findByVar_stanz_res(var_stanz_res));
			}
			getHomeCache(usercontext).fetchAll(usercontext,testataHome);
			return var_stanz_res;
		} catch (IntrospectionException e) {
			throw new ComponentException(e);
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
	}
	public BigDecimal calcolaDisponibilita_stanz_res(UserContext usercontext,Var_stanz_res_rigaBulk varRiga) throws ComponentException{
		BigDecimal totale = Utility.ZERO;
		try {
			Voce_f_saldi_cdr_lineaBulk saldi = new Voce_f_saldi_cdr_lineaBulk(varRiga.getEsercizio(), 
			                                                                  varRiga.getEsercizio_res(), 
			                                                                  varRiga.getCd_cdr(), 
			                                                                  varRiga.getCd_linea_attivita(), 
			                                                                  varRiga.getElemento_voce().getTi_appartenenza(), 
			                                                                  varRiga.getElemento_voce().getTi_gestione(), 
			                                                                  varRiga.getCd_voce()!=null?varRiga.getCd_voce():varRiga.getCd_elemento_voce());
			saldi = (Voce_f_saldi_cdr_lineaBulk) getHome(usercontext, Voce_f_saldi_cdr_lineaBulk.class).findByPrimaryKey(saldi);
			if (saldi != null) {
				//calcolo i vincoli
				Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(usercontext, Pdg_vincoloBulk.class);
				List listVincoli = home.cercaDettagliVincolati(saldi);
				BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO);
	
				totale = saldi.getDispAdImpResiduoImproprio().subtract(impVincolo);
			}			
		} catch (Exception e) {
			throw new ComponentException(e);
		}
		return totale; 
	}
	/**
	  * Viene richiesta l'eliminazione dell'oggetto selezionato
	  *
	  * Pre-post-conditions:
	  *
	  * @param	userContext	lo UserContext che ha generato la richiesta
	  * @param	bulk l'OggettoBulk da eliminare
	  * @return	void
	  *
	**/
	public void eliminaConBulk(UserContext userContext, OggettoBulk bulk) throws ComponentException{
		try {		
			String stato_prec=null;
			Var_stanz_resBulk var = (Var_stanz_resBulk) bulk;
			if (var.getStato().compareTo(Var_stanz_resBulk.STATO_PROPOSTA_DEFINITIVA)==0)
				stato_prec=Var_stanz_resBulk.STATO_PROPOSTA_DEFINITIVA;
			
			if (bulk instanceof ICancellatoLogicamente){
				((ICancellatoLogicamente)bulk).cancellaLogicamente();
				updateBulk(userContext, bulk);
				if(stato_prec!=null)		
					aggiornaLimiteSpesa(userContext, var);
			}else{
				super.eliminaConBulk(userContext, bulk);				
			}
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
	}
	/**
	 * 
	 * @param userContext
	 * @param ass_cdr
	 * @param cdr
	 * @param clause
	 * @return
	 * @throws ComponentException
	 * @throws PersistencyException
	 */
	public SQLBuilder selectCentro_di_responsabilitaByClause (UserContext userContext, Ass_var_stanz_res_cdrBulk ass_cdr, CdrBulk cdr, CompoundFindClause clause)	throws ComponentException, PersistencyException{
		SQLBuilder sql = getHome(userContext, CdrBulk.class,"V_CDR_VALIDO").createSQLBuilder();
		sql.addSQLClause("AND","ESERCIZIO",SQLBuilder.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
		if (ass_cdr.getVar_stanz_res().getTipologia() == null)
			throw new ApplicationException("Selezionare la tipologia della Variazione.");
		if(ass_cdr.getVar_stanz_res().getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_STO_INT) ||
		   ass_cdr.getVar_stanz_res().getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_ECO)){
		   	 sql.addTableToHeader("UNITA_ORGANIZZATIVA");
		   	 sql.addSQLJoin("V_CDR_VALIDO.CD_UNITA_ORGANIZZATIVA","UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA");
			 sql.addSQLClause("AND","UNITA_ORGANIZZATIVA.CD_UNITA_PADRE",SQLBuilder.EQUALS,ass_cdr.getVar_stanz_res().getCentroDiSpesa().getCd_unita_organizzativa());
		   }
		if(clause != null)
		  sql.addClause(clause);
		sql.addOrderBy("CD_CENTRO_RESPONSABILITA");
		return sql; 
	}	
	
	public SQLBuilder selectCentroDiSpesaByClause (UserContext userContext,Var_stanz_resBulk var_stanz_res, it.cnr.contab.config00.sto.bulk.CdsBulk cds, CompoundFindClause clause) throws ComponentException, PersistencyException{	
		SQLBuilder sql = ((CdsHome)getHome(userContext, cds.getClass(), "V_CDS_VALIDO")).createSQLBuilderIncludeEnte();
		sql.addClause( clause );
		sql.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio());
		return sql;
	}
	public SQLBuilder selectLinea_di_attivitaByClause (UserContext userContext,Var_stanz_res_rigaBulk var_stanz_res_riga, WorkpackageBulk linea_di_attivita, CompoundFindClause clause) throws ComponentException, PersistencyException{	
		SQLBuilder sql = getHome(userContext, WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();
		sql.addClause( clause );
		sql.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio());
		sql.addSQLClause("AND", "TI_GESTIONE", SQLBuilder.EQUALS, CostantiTi_gestione.TI_GESTIONE_SPESE);		
		sql.addSQLClause("AND", "CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, var_stanz_res_riga.getCentroTestata().getCd_centro_responsabilita());
		sql.addTableToHeader("NATURA");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
		if (var_stanz_res_riga.getVar_stanz_res().getTipologia_fin() != null){
			sql.openParenthesis("AND");
			sql.addSQLClause("OR","NATURA.TIPO",SQLBuilder.EQUALS,var_stanz_res_riga.getVar_stanz_res().getTipologia_fin());

			Optional.ofNullable(((Configurazione_cnrHome)getHome(userContext,Configurazione_cnrBulk.class)).getCdrPersonale(CNRUserContext.getEsercizio(userContext))).ifPresent(cdrPersonale->{
				sql.addSQLClause( FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdrPersonale);
			});

			sql.closeParenthesis();
		}
		 // Obbligatorio cofog sulle GAE
		try{
			if(((Parametri_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Parametri_cnrComponentSession",Parametri_cnrComponentSession.class)).isCofogObbligatorio(userContext))
				sql.addSQLClause("AND","CD_COFOG",SQLBuilder.ISNOTNULL,null);
		
		} catch (RemoteException e) {
			throw new ComponentException(e);
		} catch (EJBException e) {
			throw new ComponentException(e);
		}
		return sql;
	}
	public SQLBuilder selectElemento_voceByClause (UserContext userContext,Var_stanz_res_rigaBulk var_stanz_res_riga, Elemento_voceBulk elemento_voce, CompoundFindClause clause) throws ComponentException, PersistencyException{
		try{
			Parametri_cnrHome parCnrhome = (Parametri_cnrHome)getHome(userContext, Parametri_cnrBulk.class);
			Parametri_cnrBulk parCnrBulk = (Parametri_cnrBulk)parCnrhome.findByPrimaryKey(new Parametri_cnrBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext )));
	
			if (clause == null) clause = ((OggettoBulk)elemento_voce).buildFindClauses(null);
	
			SQLBuilder sql = getHome(userContext, elemento_voce,"V_ELEMENTO_VOCE_PDG_SPE").createSQLBuilder();
	
			if(clause != null) sql.addClause(clause);
			sql.addSQLClause(FindClause.AND, "V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO", SQLBuilder.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ) );
				
			sql.addTableToHeader("PARAMETRI_LIVELLI");
			sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO", "PARAMETRI_LIVELLI.ESERCIZIO");
	
			sql.addTableToHeader("V_CLASSIFICAZIONE_VOCI_ALL");
			sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_SPE.ID_CLASSIFICAZIONE", "V_CLASSIFICAZIONE_VOCI_ALL.ID_CLASSIFICAZIONE");
			sql.addSQLJoin("V_CLASSIFICAZIONE_VOCI_ALL.NR_LIVELLO", "PARAMETRI_LIVELLI.LIVELLI_SPESA");
	
			sql.openParenthesis(FindClause.AND);
			sql.addSQLClause(FindClause.OR, "V_ELEMENTO_VOCE_PDG_SPE.FL_PARTITA_GIRO", SQLBuilder.ISNULL, null);	
			sql.addSQLClause(FindClause.OR, "V_ELEMENTO_VOCE_PDG_SPE.FL_PARTITA_GIRO", SQLBuilder.EQUALS, "N");	
			sql.closeParenthesis();
			sql.addSQLClause( FindClause.AND, "V_ELEMENTO_VOCE_PDG_SPE.FL_SOLO_COMPETENZA", SQLBuilder.EQUALS, "N");
			if (var_stanz_res_riga.getLinea_di_attivita() != null)
				sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_FUNZIONE",SQLBuilder.EQUALS,var_stanz_res_riga.getLinea_di_attivita().getCd_funzione());
				
			if(!parCnrBulk.getFl_nuovo_pdg())
				if (var_stanz_res_riga.getCentroTestata()!=null && var_stanz_res_riga.getCentroTestata().getUnita_padre().getCd_tipo_unita() != null)
					sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_TIPO_UNITA",SQLBuilder.EQUALS,var_stanz_res_riga.getCentroTestata().getUnita_padre().getCd_tipo_unita());

			if (var_stanz_res_riga.getCentroTestata()!=null && var_stanz_res_riga.getCentroTestata().getCd_centro_responsabilita()!=null){
				Optional.ofNullable(((Configurazione_cnrHome)getHome(userContext,Configurazione_cnrBulk.class)).getCdrPersonale(CNRUserContext.getEsercizio(userContext)))
						.filter(cdrPersonale->!cdrPersonale.equals(var_stanz_res_riga.getCentroTestata().getCd_centro_responsabilita()))
						.ifPresent(cdrPersonale->{
					sql.addSQLClause(FindClause.AND, "FL_VOCE_PERSONALE", SQLBuilder.EQUALS, "N");
				});
			}
			//controllo aggiunto solo per variazioni su anni successivi a quello di attivazione piano economico e per progetti con Piano Economico
			if (Utility.createParametriEnteComponentSession().isProgettoPianoEconomicoEnabled(userContext, var_stanz_res_riga.getVar_stanz_res().getEsercizio_residuo())) {
				Optional.ofNullable(var_stanz_res_riga.getProgetto()).flatMap(el->Optional.ofNullable(el.getPg_progetto()))
						.orElseThrow(()->new ApplicationException("Errore: Progetto non valorizzato sulla riga della variazione!"));
				ProgettoHome home = (ProgettoHome)getHome(userContext, ProgettoBulk.class);
				home.setFetchPolicy("it.cnr.contab.progettiric00.comp.ProgettoRicercaComponent.find");
				ProgettoBulk progetto = (ProgettoBulk)home.findByPrimaryKey(userContext, var_stanz_res_riga.getProgetto());
				getHomeCache(userContext).fetchAll(userContext);
				if (progetto.isPianoEconomicoRequired()) {
					Ass_progetto_piaeco_voceHome assHome = (Ass_progetto_piaeco_voceHome)getHome(userContext, Ass_progetto_piaeco_voceBulk.class);
			    	SQLBuilder assSql = assHome.createSQLBuilder();
			    	assSql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.PG_PROGETTO",SQLBuilder.EQUALS,var_stanz_res_riga.getProgetto().getPg_progetto());
			    	assSql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.ESERCIZIO_PIANO",SQLBuilder.EQUALS,var_stanz_res_riga.getVar_stanz_res().getEsercizio_residuo());
	
					List list = assHome.fetchAll(assSql);
					List listRim = new BulkList();
					if (Optional.ofNullable(var_stanz_res_riga.getVar_stanz_res().getProgettoRimodulazione())
							.filter(rim->rim.getPg_progetto().equals(var_stanz_res_riga.getProgetto().getPg_progetto()))
							.isPresent()) {
						Progetto_rimodulazioneHome rimHome = (Progetto_rimodulazioneHome)getHome(userContext, Progetto_rimodulazioneBulk.class);
						listRim = new BulkList<>(rimHome.findDettagliVoceRimodulazione(var_stanz_res_riga.getVar_stanz_res().getProgettoRimodulazione()));
					}

					if (list.isEmpty() && listRim.isEmpty())
						sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO",SQLBuilder.EQUALS,-100);
					else {
						//Recupero la lista delle voci movimentate perchè se tra quelle da eliminare occorre comunque selezionarle per consentire
						//all'utente di effettuare una variazione negativa
						List vociMovimentate = ((V_saldi_voce_progettoHome)getHome(userContext, V_saldi_voce_progettoBulk.class))
								.cercaSaldoVoce(progetto.getPg_progetto(),progetto.getEsercizio()).stream()
								.filter(el->el.getAssestato().compareTo(BigDecimal.ZERO)>0 ||
										el.getUtilizzatoAssestatoFinanziamento().compareTo(BigDecimal.ZERO)>0)
								.collect(Collectors.toList());

						sql.openParenthesis(FindClause.AND);
						for (Ass_progetto_piaeco_voceBulk assVoce : list) {
							//Se la voce è stata eliminata nella rimodulazione la stessa non viene proposta
							if (listRim.stream().filter(voceRim->voceRim.getElementoVoce().equalsByPrimaryKey(assVoce.getElemento_voce()))
									.filter(Progetto_rimodulazione_voceBulk::isTiOperazioneEliminato)
									.filter(voceRim->!vociMovimentate.stream()
											.filter(voceMov->voceMov.getEsercizio_voce().equals(voceRim.getElementoVoce().getEsercizio()))
											.filter(voceMov->voceMov.getTi_appartenenza().equals(voceRim.getElementoVoce().getTi_appartenenza()))
											.filter(voceMov->voceMov.getTi_gestione().equals(voceRim.getElementoVoce().getTi_gestione()))
											.filter(voceMov->voceMov.getCd_elemento_voce().equals(voceRim.getElementoVoce().getCd_elemento_voce()))
											.findFirst().isPresent())
									.findFirst().isPresent())
								continue;
							Elemento_voceBulk voceNew = Utility.createCRUDConfigAssEvoldEvnewComponentSession().getCurrentElementoVoce(userContext, assVoce.getElemento_voce(), it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ));
							if (Optional.ofNullable(voceNew).flatMap(el->Optional.ofNullable(el.getCd_elemento_voce())).isPresent()){
								sql.openParenthesis(FindClause.OR);
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO",SQLBuilder.EQUALS,voceNew.getEsercizio());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.TI_APPARTENENZA",SQLBuilder.EQUALS,voceNew.getTi_appartenenza());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.TI_GESTIONE",SQLBuilder.EQUALS,voceNew.getTi_gestione());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_ELEMENTO_VOCE",SQLBuilder.EQUALS,voceNew.getCd_elemento_voce());
								sql.closeParenthesis();
							}
						}
						//Aggiungo le voci di bilancio inserite nella rimodulazione
						for (Ass_progetto_piaeco_voceBulk assVoce : list) {
							Elemento_voceBulk voceNew = Utility.createCRUDConfigAssEvoldEvnewComponentSession().getCurrentElementoVoce(userContext, assVoce.getElemento_voce(), it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ));
							if (Optional.ofNullable(voceNew).flatMap(el->Optional.ofNullable(el.getCd_elemento_voce())).isPresent()){
								sql.openParenthesis(FindClause.OR);
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.ESERCIZIO",SQLBuilder.EQUALS,voceNew.getEsercizio());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.TI_APPARTENENZA",SQLBuilder.EQUALS,voceNew.getTi_appartenenza());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.TI_GESTIONE",SQLBuilder.EQUALS,voceNew.getTi_gestione());
								sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_ELEMENTO_VOCE",SQLBuilder.EQUALS,voceNew.getCd_elemento_voce());
								sql.closeParenthesis();
							}
						}
						sql.closeParenthesis();
					}
				}
			}
			return sql;
		} catch (RemoteException e) {
			throw new ComponentException(e);
		}
	}
	public SQLBuilder selectAssestatoResiduoByClause (UserContext userContext,Var_stanz_resBulk var_stanz_res, V_assestato_residuoBulk assestato_residuo, CompoundFindClause clause) throws ComponentException, PersistencyException{	
		SQLBuilder sql = getHome(userContext, V_assestato_residuoBulk.class).createSQLBuilder();
		sql.addClause( clause );
		sql.addClause("AND", "esercizio", SQLBuilder.EQUALS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio());
		sql.addClause("AND", "ti_gestione", SQLBuilder.EQUALS, CostantiTi_gestione.TI_GESTIONE_SPESE);		
		sql.addClause("AND", "ti_appartenenza", SQLBuilder.NOT_EQUALS, "C");
		sql.addClause("AND", "esercizio_res", SQLBuilder.EQUALS, var_stanz_res.getEsercizio_res().getEsercizio());
		if (var_stanz_res.getTipologia_fin() != null){
			sql.addTableToHeader("NATURA");
			sql.addTableToHeader("LINEA_ATTIVITA");
			sql.addSQLJoin("V_ASSESTATO_RESIDUO.CD_LINEA_ATTIVITA","LINEA_ATTIVITA.CD_LINEA_ATTIVITA");
			sql.addSQLJoin("V_ASSESTATO_RESIDUO.CD_CENTRO_RESPONSABILITA","LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
			sql.addSQLJoin("LINEA_ATTIVITA.CD_NATURA","NATURA.CD_NATURA");
			sql.addSQLClause("AND","NATURA.TIPO",SQLBuilder.EQUALS,var_stanz_res.getTipologia_fin());	
		}else{
			sql.addTableToHeader("LINEA_ATTIVITA");  
			sql.addSQLJoin("V_ASSESTATO_RESIDUO.CD_LINEA_ATTIVITA","LINEA_ATTIVITA.CD_LINEA_ATTIVITA");
			sql.addSQLJoin("V_ASSESTATO_RESIDUO.CD_CENTRO_RESPONSABILITA","LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
			
		}
		 // Obbligatorio cofog sulle GAE
		try{
			if(((Parametri_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Parametri_cnrComponentSession",Parametri_cnrComponentSession.class)).isCofogObbligatorio(userContext))
				sql.addSQLClause("AND","CD_COFOG",SQLBuilder.ISNOTNULL,null);
		
		} catch (RemoteException e) {
			throw new ComponentException(e);
		} catch (EJBException e) {
			throw new ComponentException(e);
		}
		if (var_stanz_res.getCdr() != null){
			sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, var_stanz_res.getCdr().getCd_centro_responsabilita());		
		}else{
			if (var_stanz_res.getCentroDiResponsabilita().getLivello().intValue() > 1){
				sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, var_stanz_res.getCentroDiResponsabilita().getCd_centro_responsabilita());
			}else{
				if (!var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_ECO))
				  sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, var_stanz_res.getCentroDiResponsabilita().getCd_centro_responsabilita());
				else{
					SQLBuilder sqlStruttura = getHome(userContext, V_struttura_organizzativaBulk.class).createSQLBuilder();
					sqlStruttura.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio());
					sqlStruttura.addSQLJoin("V_ASSESTATO_RESIDUO.CD_CENTRO_RESPONSABILITA","V_STRUTTURA_ORGANIZZATIVA.CD_CENTRO_RESPONSABILITA");
					sqlStruttura.addSQLClause("AND", "CD_CDR_AFFERENZA", SQLBuilder.EQUALS, var_stanz_res.getCentroDiResponsabilita().getCd_centro_responsabilita());
	                sql.addSQLExistsClause("AND",sqlStruttura);
				}
                
			}
		}
		return sql;
	}
	
	/**
	 * 
	 * @param userContext
	 * @param ogettoBulk
	 * @return
	 * @throws ComponentException
	 */
	public it.cnr.jada.bulk.OggettoBulk salvaDefinitivo(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{
		Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk;
		var_stanz_res = (Var_stanz_resBulk)modificaConBulk(userContext,var_stanz_res);
	    var_stanz_res = (Var_stanz_resBulk)inizializzaBulkPerModifica(userContext,var_stanz_res);
		verificaTotaliDaAccertamentoModifica(userContext, var_stanz_res);
		var_stanz_res.setStato(Pdg_variazioneBulk.STATO_PROPOSTA_DEFINITIVA);
		
		java.sql.Timestamp tsOdierno = EJBCommonServices.getServerDate();
		GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) GregorianCalendar.getInstance();
       	tsOdiernoGregorian.setTime(tsOdierno);
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");		
        	        
        if(tsOdiernoGregorian.get(GregorianCalendar.YEAR) > CNRUserContext.getEsercizio(userContext).intValue())
			try {
				var_stanz_res.setDt_chiusura(new java.sql.Timestamp(sdf.parse("31/12/"+var_stanz_res.getEsercizio().intValue()).getTime()));
			} catch (ParseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		else {
        	var_stanz_res.setDt_chiusura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
        }
				
//		var_stanz_res.setDt_chiusura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
		var_stanz_res.setToBeUpdated();
		if (var_stanz_res.getAssociazioneCDR().isEmpty()) 
			throw new ApplicationException("Associare almeno un Centro di Responsabilità alla Variazione.");
		


		controllaRimodulazioneProgetto(userContext,var_stanz_res);

		try {
			Utility.createSaldoComponentSession().checkPdgPianoEconomico(userContext, var_stanz_res);
		} catch (RemoteException e) {
			throw new ComponentException(e);
		}		
		
		var_stanz_res = (Var_stanz_resBulk)super.modificaConBulk(userContext, var_stanz_res);
		if ((var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_STO)||
		    var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_STO_INT)) &&
		    Utility.nvl(var_stanz_res.getTotale_da_ripartire()).compareTo(Utility.ZERO)!= 0){
				throw new ApplicationException("Il Totale da ripartire per uno storno deve essere zero.");
		    }
		try{
			boolean existDettPersonale = true;
			String cdrPersonale = null;
			if (Optional.ofNullable(var_stanz_res.getTiMotivazioneVariazione()).isPresent() &&
					var_stanz_res.isMotivazioneVariazionePersonale()) {
				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."));
				existDettPersonale = false;
			}

			for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){
				Ass_var_stanz_res_cdrBulk ass_cdr = (Ass_var_stanz_res_cdrBulk)j.next();
				Ass_var_stanz_res_cdrHome ass_cdrHome = (Ass_var_stanz_res_cdrHome)getHome(userContext,Ass_var_stanz_res_cdrBulk.class);
	
				existDettPersonale = existDettPersonale||cdrPersonale.equals(ass_cdr.getCd_centro_responsabilita());

				java.util.Collection dettagliSpesa = ass_cdrHome.findDettagliSpesa(ass_cdr);
				if (dettagliSpesa.isEmpty()) 
						throw new ApplicationException("Associare almeno un dettaglio di variazione al Centro di Responsabilità " + ass_cdr.getCd_centro_responsabilita());
				if (ass_cdr.getSpesa_diff().compareTo(Utility.ZERO) != 0)
					throw new ApplicationException("La Differenza di spesa ("+new it.cnr.contab.util.EuroFormat().format(ass_cdr.getSpesa_diff())+")"+
												   "\n" + "per il Cdr "+ ass_cdr.getCd_centro_responsabilita()+ " è diversa da zero. ");

				if (!existDettPersonale) {
					for (Var_stanz_res_rigaBulk varStanzResRiga : dettagliSpesa) {
						if (!existDettPersonale) {
							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()));
							existDettPersonale = classif.getFl_accentrato()&&cdrPersonale.equals(classif.getCdr_accentratore());
						}
					}
				}
			}

			if (!existDettPersonale)
				throw new ApplicationException("In un variazione di tipo 'Personale' occorre selezionare almeno una voce accentrata "
						+ "verso il CDR del personale o scegliere tra i CDR partecipanti anche quello del personale ("+cdrPersonale+").");

			aggiornaLimiteSpesa(userContext, var_stanz_res);
		} catch (IntrospectionException|PersistencyException e) {
			throw new ComponentException(e);
		}
		return var_stanz_res;
	}
	/**
	 * 
	 * @param userContext
	 * @param ogettoBulk
	 * @return
	 * @throws ComponentException
	 */
	public it.cnr.jada.bulk.OggettoBulk approva(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{
		Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk;
		var_stanz_res.setStato(Pdg_variazioneBulk.STATO_APPROVATA);
		
		java.sql.Timestamp tsOdierno = EJBCommonServices.getServerDate();
		GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) GregorianCalendar.getInstance();
       	tsOdiernoGregorian.setTime(tsOdierno);
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");		
        	        
        if(tsOdiernoGregorian.get(GregorianCalendar.YEAR) > CNRUserContext.getEsercizio(userContext).intValue())
			try {
				var_stanz_res.setDt_approvazione(new java.sql.Timestamp(sdf.parse("31/12/"+var_stanz_res.getEsercizio().intValue()).getTime()));
			} catch (ParseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		else {
        	var_stanz_res.setDt_approvazione(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
//        	var_stanz_res.setDt_approvazione(EJBCommonServices.getServerDate());
        }
				
//		var_stanz_res.setDt_approvazione(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
		var_stanz_res.setToBeUpdated();
		var_stanz_res = (Var_stanz_resBulk)super.modificaConBulk(userContext, var_stanz_res);
		Var_stanz_resHome testataHome = (Var_stanz_resHome)getHome(userContext, Var_stanz_resBulk.class);		
		try {
			UtenteHome utenteHome = (UtenteHome)getHome(userContext,UtenteBulk.class);
				for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){			
					Ass_var_stanz_res_cdrBulk ass_var = (Ass_var_stanz_res_cdrBulk)j.next();		
					if (inviaMessaggio(userContext,var_stanz_res,ass_var)){
					for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(ass_var.getCd_centro_responsabilita()).iterator();i.hasNext();){
						UtenteBulk utente = (UtenteBulk)i.next();
						MessaggioBulk messaggio = generaMessaggio(userContext,utente,var_stanz_res,Var_stanz_resBulk.STATO_APPROVATA);
						super.creaConBulk(userContext, messaggio);
					}
				}
			}
			for (Iterator righe = testataHome.findAllVariazioniRiga(var_stanz_res).iterator();righe.hasNext();){
				Var_stanz_res_rigaBulk varRiga = (Var_stanz_res_rigaBulk)righe.next();
				Voce_f_saldi_cdr_lineaBulk saldi = allineaSaldi(userContext, varRiga);
				super.modificaConBulk(userContext,saldi);
			}
			generaVariazioneBilancio(userContext, var_stanz_res);
			if (var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_STO)||
				var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_ECO)){
				String soggetto = "E' stata approvata la Variazione allo stanziamento residuo n° "+var_stanz_res.getPg_variazione();
				generaEMAIL(userContext, var_stanz_res,soggetto,soggetto +" del "+var_stanz_res.getEsercizio()+"
",null, "APP"); } } catch (IntrospectionException e) { throw new ComponentException(e); } catch (PersistencyException e) { throw new ComponentException(e); } catch (RemoteException e) { throw new ComponentException(e); } return var_stanz_res; } private Voce_f_saldi_cdr_lineaBulk allineaSaldi(UserContext userContext, Var_stanz_res_rigaBulk varRiga) throws PersistencyException, ComponentException, ApplicationException, RemoteException { return allineaSaldi(userContext, varRiga, false); } private Voce_f_saldi_cdr_lineaBulk allineaSaldi(UserContext userContext, Var_stanz_res_rigaBulk varRiga, Boolean sottraiImportoDaVariazioneEsistente) throws PersistencyException, ComponentException, ApplicationException, RemoteException { Voce_f_saldi_cdr_lineaBulk saldo = new Voce_f_saldi_cdr_lineaBulk(varRiga.getEsercizio(), varRiga.getEsercizio_res(), varRiga.getCd_cdr(), varRiga.getCd_linea_attivita(), varRiga.getElemento_voce().getTi_appartenenza(), varRiga.getElemento_voce().getTi_gestione(), varRiga.getCd_voce()!=null?varRiga.getCd_voce():varRiga.getCd_elemento_voce()); Voce_f_saldi_cdr_lineaBulk saldi = (Voce_f_saldi_cdr_lineaBulk) getHome(userContext, Voce_f_saldi_cdr_lineaBulk.class).findByPrimaryKey(saldo); if (saldi == null){ saldo.setToBeCreated(); saldo.inizializzaSommeAZero(); saldo.setCd_elemento_voce(varRiga.getElemento_voce().getCd_elemento_voce()); saldi = (Voce_f_saldi_cdr_lineaBulk)super.creaConBulk(userContext,saldo); } if (sottraiImportoDaVariazioneEsistente){ if (varRiga.getIm_variazione().compareTo(Utility.ZERO) < 0) saldi.setVar_piu_stanz_res_imp(saldi.getVar_piu_stanz_res_imp().subtract(varRiga.getIm_variazione().abs())); else if (varRiga.getIm_variazione().compareTo(Utility.ZERO) > 0) saldi.setVar_meno_stanz_res_imp(saldi.getVar_meno_stanz_res_imp().subtract(varRiga.getIm_variazione().abs())); } else { if (varRiga.getIm_variazione().compareTo(Utility.ZERO) < 0) saldi.setVar_meno_stanz_res_imp(saldi.getVar_meno_stanz_res_imp().add(varRiga.getIm_variazione().abs())); else if (varRiga.getIm_variazione().compareTo(Utility.ZERO) > 0) saldi.setVar_piu_stanz_res_imp(saldi.getVar_piu_stanz_res_imp().add(varRiga.getIm_variazione().abs())); } //calcolo i vincoli try{ Pdg_vincoloHome home = (Pdg_vincoloHome)getHome(userContext, Pdg_vincoloBulk.class); List listVincoli = home.cercaDettagliVincolati(saldi); BigDecimal impVincolo = listVincoli.stream().map(e->e.getIm_vincolo()).reduce((x,y)->x.add(y)).orElse(BigDecimal.ZERO); BigDecimal diff = saldi.getDispAdImpResiduoImproprio().subtract(impVincolo); if (diff.compareTo(Utility.ZERO) < 0){ StringBuilder messaggio = new StringBuilder("Impossibile effettuare l'operazione !\n"+ "Nell'esercizio residuo "+ varRiga.getEsercizio_res()+ " e per il CdR "+varRiga.getCd_cdr()+", "+ " Voce "+(varRiga.getCd_voce()!=null?varRiga.getCd_voce():varRiga.getCd_elemento_voce())+ " e GAE "+varRiga.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()); } saldi.setToBeUpdated(); } catch (Exception e ) { throw handleException( e ); } Utility.createSaldoComponentSession().aggiornaSaldiAnniSuccessivi(userContext, saldi.getCd_centro_responsabilita(), saldi.getCd_linea_attivita(), new Voce_fBulk( saldi.getCd_voce(), saldi.getEsercizio(), saldi.getTi_appartenenza(), saldi.getTi_gestione()), saldi.getEsercizio_res(), varRiga.getIm_variazione().negate(), saldi); return saldi; } /** * * @param userContext * @param ogettoBulk * @return * @throws ComponentException */ public it.cnr.jada.bulk.OggettoBulk controllaApprova(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk; Var_stanz_resHome testataHome = (Var_stanz_resHome)getHome(userContext, Var_stanz_resBulk.class); try { for (Iterator righe = testataHome.findAllVariazioniRiga(var_stanz_res).iterator();righe.hasNext();){ Var_stanz_res_rigaBulk varRiga = (Var_stanz_res_rigaBulk)righe.next(); Voce_f_saldi_cdr_lineaBulk saldo = new Voce_f_saldi_cdr_lineaBulk(varRiga.getEsercizio(), varRiga.getEsercizio_res(), varRiga.getCd_cdr(), varRiga.getCd_linea_attivita(), varRiga.getElemento_voce().getTi_appartenenza(), varRiga.getElemento_voce().getTi_gestione(), varRiga.getCd_voce()); Voce_f_saldi_cdr_lineaBulk saldi = (Voce_f_saldi_cdr_lineaBulk) getHome(userContext, Voce_f_saldi_cdr_lineaBulk.class).findByPrimaryKey(saldo); if (saldi == null){ saldo.inizializzaSommeAZero(); saldo.setCd_elemento_voce(varRiga.getElemento_voce().getCd_elemento_voce()); } if (varRiga.getIm_variazione().compareTo(Utility.ZERO) < 0) saldi.setVar_meno_stanz_res_imp(saldi.getVar_meno_stanz_res_imp().add(varRiga.getIm_variazione().abs())); else if (varRiga.getIm_variazione().compareTo(Utility.ZERO) > 0) saldi.setVar_piu_stanz_res_imp(saldi.getVar_piu_stanz_res_imp().add(varRiga.getIm_variazione().abs())); if (saldi.getDispAdImpResiduoImproprio().compareTo(Utility.ZERO) < 0){ throw new ApplicationException("Impossibile effettuare l'operazione !\n"+ "Nell'esercizio residuo "+ varRiga.getEsercizio_res()+ " e per il CdR "+varRiga.getCd_cdr()+", "+ " Voce "+varRiga.getCd_voce()+ " e GAE "+varRiga.getCd_linea_attivita()+" lo stanziamento Residuo Improprio "+ " diventerebbe negativo ("+new it.cnr.contab.util.EuroFormat().format(saldi.getDispAdImpResiduoImproprio().abs())+")"); } } } catch (IntrospectionException e) { throw new ComponentException(e); } catch (PersistencyException e) { throw new ComponentException(e); } return var_stanz_res; } private void generaEMAIL(UserContext userContext, Var_stanz_resBulk var_stanz_res, String soggetto, String preText, String postText,String tipo) throws ComponentException, IntrospectionException, PersistencyException{ String formDate = "dd/MM/yyyy"; SimpleDateFormat formatterDate = new SimpleDateFormat(formDate,Config.getHandler().getLocale()); String text = new String(); Utente_indirizzi_mailHome utente_indirizzi_mailHome = (Utente_indirizzi_mailHome)getHome(userContext,Utente_indirizzi_mailBulk.class); if (preText != null) text += preText + "
"; text = text +"CdR proponente: "+var_stanz_res.getCentroDiResponsabilita().getCd_ds_cdr()+"
"; text = text +"Esercizio residuo: "+var_stanz_res.getEsercizio_residuo()+"
"; text = text +"Tipologia: "+var_stanz_res.getTi_tipologiaKeys().get(var_stanz_res.getTipologia())+"
"; if (var_stanz_res.getTipologia_fin() != null) text = text + var_stanz_res.getTi_tipologia_finKeys().get(var_stanz_res.getTipologia_fin())+"
"; text = text +"Data di approvazione: "+formatterDate.format(var_stanz_res.getDt_approvazione())+"
"; text = text +"
"; text = text +"CdR abilitati a concorrervi:
"; String addressTO = null; for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){ Ass_var_stanz_res_cdrBulk ass_var = (Ass_var_stanz_res_cdrBulk)j.next(); text = text + "CdR:"+ass_var.getCentro_di_responsabilita().getCd_ds_cdr()+ " quota assegnata " +new it.cnr.contab.util.EuroFormat().format(ass_var.getIm_spesa())+"
"; } if (tipo.equalsIgnoreCase("ERR")){ for (java.util.Iterator i= utente_indirizzi_mailHome.findUtenteMancataApprovazioneVariazioniBilancioEnte().iterator();i.hasNext();){ Utente_indirizzi_mailBulk utente_indirizzi = (Utente_indirizzi_mailBulk)i.next(); if (addressTO == null) addressTO = new String(); else addressTO = addressTO + ","; addressTO = addressTO+utente_indirizzi.getIndirizzo_mail(); } }else if (tipo.equalsIgnoreCase("APP")){ for (java.util.Iterator i= utente_indirizzi_mailHome.findUtenteApprovaVariazioniBilancio(var_stanz_res).iterator();i.hasNext();){ Utente_indirizzi_mailBulk utente_indirizzi = (Utente_indirizzi_mailBulk)i.next(); if (addressTO == null) addressTO = new String(); else addressTO = addressTO + ","; addressTO = addressTO+utente_indirizzi.getIndirizzo_mail(); } } if (postText != null) text += "
" + postText+ "
"; if (addressTO != null){ try { SendMail.sendMail(soggetto,text,InternetAddress.parse(addressTO)); } catch (AddressException e) { } } } protected Query select(UserContext userContext,CompoundFindClause clauses,OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException { SQLBuilder sql = (SQLBuilder)super.select(userContext,clauses,bulk); sql.addSQLClause("AND","VAR_STANZ_RES.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext)); Optional.ofNullable(bulk) .filter(Var_stanz_resBulk.class::isInstance) .map(Var_stanz_resBulk.class::cast) .filter(el->Pdg_variazioneBulk.MOTIVAZIONE_GENERICO.equals(el.getMapMotivazioneVariazione())) .ifPresent(var->sql.addSQLClause(FindClause.AND,"VAR_STANZ_RES.TI_MOTIVAZIONE_VARIAZIONE",SQLBuilder.ISNULL,null)); Unita_organizzativa_enteBulk ente = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0); CdrHome cdrHome = (CdrHome)getHome(userContext,CdrBulk.class); CdrBulk cdrUtente = (CdrBulk)cdrHome.findByPrimaryKey(new CdrKey(it.cnr.contab.utenze00.bp.CNRUserContext.getCd_cdr(userContext))); if (!((CNRUserContext) userContext).getCd_unita_organizzativa().equals( ente.getCd_unita_organizzativa())){ sql.openParenthesis("AND"); sql.addSQLClause("OR", "VAR_STANZ_RES.CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdrUtente.getCd_centro_responsabilita()); for (java.util.Iterator j=cdrHome.findCdrAfferenti(cdrUtente).iterator();j.hasNext();){ CdrBulk cdrAfferenti = (CdrBulk)j.next(); sql.addSQLClause("OR", "VAR_STANZ_RES.CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdrAfferenti.getCd_centro_responsabilita()); } SQLBuilder sqlAssUo = getHome(userContext,Ass_var_stanz_res_cdrBulk.class).createSQLBuilder(); sqlAssUo.addSQLJoin("VAR_STANZ_RES.ESERCIZIO","ASS_VAR_STANZ_RES_CDR.ESERCIZIO"); sqlAssUo.addSQLJoin("VAR_STANZ_RES.PG_VARIAZIONE","ASS_VAR_STANZ_RES_CDR.PG_VARIAZIONE"); sqlAssUo.openParenthesis("AND"); sqlAssUo.addSQLClause("OR", "ASS_VAR_STANZ_RES_CDR.CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdrUtente.getCd_centro_responsabilita()); for (java.util.Iterator j=cdrHome.findCdrAfferenti(cdrUtente).iterator();j.hasNext();){ CdrBulk cdrAfferenti = (CdrBulk)j.next(); sqlAssUo.addSQLClause("OR", "ASS_VAR_STANZ_RES_CDR.CD_CENTRO_RESPONSABILITA", SQLBuilder.EQUALS, cdrAfferenti.getCd_centro_responsabilita()); } sqlAssUo.closeParenthesis(); sql.addSQLExistsClause("OR",sqlAssUo); sql.closeParenthesis(); } return sql; } /** * * @param userContext * @param ogettoBulk * @return * @throws ComponentException */ public it.cnr.jada.bulk.OggettoBulk respingi(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk; var_stanz_res.setStato(Pdg_variazioneBulk.STATO_RESPINTA); java.sql.Timestamp tsOdierno = EJBCommonServices.getServerDate(); GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) GregorianCalendar.getInstance(); tsOdiernoGregorian.setTime(tsOdierno); java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy"); if(tsOdiernoGregorian.get(GregorianCalendar.YEAR) > CNRUserContext.getEsercizio(userContext).intValue()) try { var_stanz_res.setDt_chiusura(new java.sql.Timestamp(sdf.parse("31/12/"+var_stanz_res.getEsercizio().intValue()).getTime())); } catch (ParseException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } else { var_stanz_res.setDt_chiusura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext))); } // var_stanz_res.setDt_chiusura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext))); var_stanz_res.setToBeUpdated(); var_stanz_res = (Var_stanz_resBulk)super.modificaConBulk(userContext, var_stanz_res); aggiornaLimiteSpesa(userContext, var_stanz_res); return var_stanz_res; } public it.cnr.jada.bulk.OggettoBulk statoPrecedente(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk; var_stanz_res.setStato(Pdg_variazioneBulk.STATO_PROPOSTA_PROVVISORIA); var_stanz_res.setDt_chiusura(null); var_stanz_res.setToBeUpdated(); var_stanz_res = (Var_stanz_resBulk)super.modificaConBulk(userContext, var_stanz_res); aggiornaLimiteSpesa(userContext, var_stanz_res); return var_stanz_res; } private void aggiornaLimiteSpesa(UserContext userContext,Var_stanz_resBulk pdg) throws ComponentException { try { LoggableStatement cs = new LoggableStatement(getConnection( userContext ), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB053.aggiornaLimiteSpesaVar(?,?,?,?)}",false,this.getClass()); cs.setObject( 1, pdg.getEsercizio() ); cs.setObject( 2, pdg.getPg_variazione()); cs.setObject( 3,"R"); //competenza cs.setObject( 4, userContext.getUser()); try { lockBulk(userContext,pdg); cs.executeQuery(); } catch (Throwable e) { throw handleException(pdg,e); } finally { cs.close(); } } catch (java.sql.SQLException e) { // Gestisce eccezioni SQL specifiche (errori di lock,...) throw handleSQLException(e); } } private void inizializzaSommeAZero(Var_stanz_resBulk var_stanz_res){ for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){ Ass_var_stanz_res_cdrBulk ass_var_stanz = (Ass_var_stanz_res_cdrBulk)j.next(); ass_var_stanz.setSpesa_ripartita(Utility.ZERO); } } private void inizializzaSommeCDR(UserContext usercontext,Var_stanz_resBulk var_stanz_res) throws ComponentException, IntrospectionException, PersistencyException{ BigDecimal totale_da_ripartire = Utility.ZERO; Ass_var_stanz_res_cdrHome AssHome = (Ass_var_stanz_res_cdrHome)getHome(usercontext, Ass_var_stanz_res_cdrBulk.class); for (Iterator ass_var_cdrList=var_stanz_res.getAssociazioneCDR().iterator();ass_var_cdrList.hasNext();){ Ass_var_stanz_res_cdrBulk ass_var_cdr = (Ass_var_stanz_res_cdrBulk)ass_var_cdrList.next(); var_stanz_res.setTotale_da_ripartire(Utility.nvl(var_stanz_res.getTotale_da_ripartire()).add(ass_var_cdr.getIm_spesa())); ass_var_cdr.setSpesa_ripartita(Utility.ZERO); for (Iterator dettagliSpesa= AssHome.findDettagliSpesa(ass_var_cdr).iterator();dettagliSpesa.hasNext();){ Var_stanz_res_rigaBulk riga = (Var_stanz_res_rigaBulk)dettagliSpesa.next(); ass_var_cdr.setSpesa_ripartita(Utility.nvl(ass_var_cdr.getSpesa_ripartita()).add(Utility.nvl(riga.getIm_variazione()))); } } } public List findEsercizi_res(UserContext userContext,Var_stanz_resBulk var_stanz_res) throws it.cnr.jada.comp.ComponentException { List lista; try { Esercizio_baseHome home = (Esercizio_baseHome)getHome(userContext,Esercizio_baseBulk.class); Voce_f_saldi_cdr_linea_resHome cdr_linea_home = (Voce_f_saldi_cdr_linea_resHome)getHome(userContext,Voce_f_saldi_cdr_linea_resBulk.class); SQLBuilder sql = home.createSQLBuilder(); SQLBuilder sql_cdr_linea = cdr_linea_home.createSQLBuilder(); sql_cdr_linea.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio()); sql_cdr_linea.addSQLJoin("ESERCIZIO_BASE.ESERCIZIO","VOCE_F_SALDI_CDR_LINEA.ESERCIZIO_RES"); sql_cdr_linea.addSQLClause("AND","IM_STANZ_RES_IMPROPRIO + VAR_PIU_STANZ_RES_IMP - VAR_MENO_STANZ_RES_IMP",SQLBuilder.NOT_EQUALS,Utility.ZERO); sql.addSQLClause("AND", "ESERCIZIO", SQLBuilder.LESS, ((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio()); sql.addSQLExistsClause("AND",sql_cdr_linea); sql.addOrderBy("ESERCIZIO DESC"); Broker broker = home.createBroker(sql); lista = home.fetchAll(broker); broker.close(); }catch(Exception e) { throw handleException(e); } return lista; } public Voce_fBulk getVoce_FdaEV(UserContext userContext,Integer aEsercizio,String aTI_APPARTENENZA,String aTI_GESTIONE, String aCD_ELEMENTO_VOCE , String acd_centro_responsabilita , String acd_linea_attivita) throws it.cnr.jada.comp.ComponentException { LoggableStatement cs = null; String cd_voce = null; Voce_fBulk voceBulk = null; try { cs = new LoggableStatement(getConnection(userContext), "{ ? = call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB053.getVoce_FdaEV(?,?,?,?,?,?)}",false,this.getClass()); cs.registerOutParameter( 1, java.sql.Types.VARCHAR); cs.setObject(2, aEsercizio ); cs.setObject(3, aTI_APPARTENENZA ); cs.setObject(4, aTI_GESTIONE ); cs.setObject(5, aCD_ELEMENTO_VOCE ); cs.setObject(6, acd_centro_responsabilita ); cs.setObject(7, acd_linea_attivita ); cs.executeQuery(); cd_voce = cs.getString(1); voceBulk = new Voce_fBulk(cd_voce,aEsercizio,aTI_APPARTENENZA,aTI_GESTIONE); voceBulk = (Voce_fBulk)getHome(userContext,Voce_fBulk.class).findByPrimaryKey(voceBulk); } catch (Throwable e) { throw handleException(e); } finally { if (cs != null) try { cs.close(); } catch (SQLException e1) { throw handleException(e1); } } return voceBulk; } public boolean isCdsAbilitatoAdApprovare(UserContext userContext,String cd_cds, Var_stanz_resBulk var_stanz_res) throws ComponentException{ try { Parametri_cdsBulk param_cds = (Parametri_cdsBulk)getHome(userContext, Parametri_cdsBulk.class).findByPrimaryKey(new Parametri_cdsBulk(cd_cds,((it.cnr.contab.utenze00.bp.CNRUserContext) userContext).getEsercizio())); if (!param_cds.getFl_approva_var_stanz_res().booleanValue()) return false; for (Iterator lista = ((Configurazione_cnrHome)getHome(userContext, Configurazione_cnrBulk.class)).findTipoVariazioniStanz_res().iterator();lista.hasNext();){ Configurazione_cnrBulk config_cnr = (Configurazione_cnrBulk)lista.next(); if(config_cnr.getVal01().equalsIgnoreCase(var_stanz_res.getTipologia())) return true; } } catch (PersistencyException e) { throw new ComponentException(e); } return false; } private boolean isEnteAbilitatoAdApprovare(UserContext userContext, Var_stanz_resBulk var_stanz_res) throws ComponentException{ try { for (Iterator lista = ((Configurazione_cnrHome)getHome(userContext, Configurazione_cnrBulk.class)).findTipoVariazioniEnteStanz_res().iterator();lista.hasNext();){ Configurazione_cnrBulk config_cnr = (Configurazione_cnrBulk)lista.next(); if(config_cnr.getVal01().equalsIgnoreCase(var_stanz_res.getTipologia())) return true; } } catch (PersistencyException e) { throw new ComponentException(e); } return false; } private MessaggioBulk generaMessaggio(UserContext userContext, UtenteBulk utente, Var_stanz_resBulk var_stanz_res) throws ComponentException, PersistencyException{ return generaMessaggio(userContext, utente, var_stanz_res, null); } private MessaggioBulk inizializzaMessaggio(UserContext userContext, UtenteBulk utente) throws ComponentException, PersistencyException{ MessaggioHome messHome = (MessaggioHome)getHome(userContext,MessaggioBulk.class); MessaggioBulk messaggio = new MessaggioBulk(); messaggio.setPg_messaggio(new Long(messHome.fetchNextSequenceValue(userContext,"CNRSEQ00_PG_MESSAGGIO").longValue())); messaggio.setCd_utente(utente.getCd_utente()); messaggio.setPriorita(new Integer(1)); return messaggio; } private MessaggioBulk generaMessaggio(UserContext userContext, UtenteBulk utente, Var_stanz_resBulk var_stanz_res, String tipo) throws ComponentException, PersistencyException{ MessaggioBulk messaggio = inizializzaMessaggio(userContext, utente); java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); if (tipo == null){ messaggio.setDs_messaggio(sdf.format(EJBCommonServices.getServerTimestamp()) + " - è stata aperta una nuova Variazione allo Stanziamento residuo"); }else if (tipo.equals(Var_stanz_resBulk.STATO_APPROVATA)){ messaggio.setDs_messaggio(sdf.format(EJBCommonServices.getServerTimestamp()) + " - è stata approvata la Variazione allo Stanziamento residuo"); }else if (tipo.equals(Var_stanz_resBulk.STATO_RESPINTA)){ messaggio.setDs_messaggio(sdf.format(EJBCommonServices.getServerTimestamp()) + " - è stata respinta la Variazione allo Stanziamento residuo"); } messaggio.setCorpo("Numero variazione:"+var_stanz_res.getPg_variazione()); messaggio.setCorpo(messaggio.getCorpo() + "\n" + "CdR proponente:"+var_stanz_res.getCentroDiResponsabilita().getCd_ds_cdr()); messaggio.setSoggetto(messaggio.getDs_messaggio()); messaggio.setToBeCreated(); return messaggio; } private MessaggioBulk generaMessaggioCopertura(UserContext userContext, UtenteBulk utente, Var_stanz_resBulk var_stanz_res, Ass_var_stanz_res_cdrBulk ass_var) throws ComponentException, PersistencyException{ MessaggioBulk messaggio = inizializzaMessaggio(userContext, utente); java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); messaggio.setDs_messaggio(sdf.format(EJBCommonServices.getServerTimestamp()) + " - è stata raggiunta la quota di Spesa assegnata alla Variazione"); messaggio.setCorpo("Numero variazione:"+var_stanz_res.getPg_variazione()); messaggio.setCorpo(messaggio.getCorpo() + "\n" + "Il CdR :"+ass_var.getCentro_di_responsabilita().getCd_ds_cdr()+" ha coperto la quota assegnata."); messaggio.setSoggetto(messaggio.getDs_messaggio()); messaggio.setToBeCreated(); return messaggio; } private boolean inviaMessaggio(UserContext usercontext,Var_stanz_resBulk var_stanz_res, Ass_var_stanz_res_cdrBulk ass_var) throws PersistencyException, ComponentException{ CdrBulk cdr = (CdrBulk)getHome(usercontext,CdrBulk.class).findByPrimaryKey(new CdrBulk(ass_var.getCd_centro_responsabilita())); Unita_organizzativaBulk uo = (Unita_organizzativaBulk)getHome(usercontext,Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cdr.getCd_unita_organizzativa())); if (var_stanz_res.getTipologia().equalsIgnoreCase(Var_stanz_resBulk.TIPOLOGIA_STO) || uo.getCd_tipo_unita().equalsIgnoreCase( it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome.TIPO_UO_SAC ) ) return true; return false; } public OggettoBulk modificaConBulk(UserContext usercontext,OggettoBulk oggettobulk)throws ComponentException { Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)oggettobulk; try { UtenteHome utenteHome = (UtenteHome)getHome(usercontext,UtenteBulk.class); for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){ Ass_var_stanz_res_cdrBulk ass_var = (Ass_var_stanz_res_cdrBulk)j.next(); if(ass_var.getCrudStatus()==OggettoBulk.TO_BE_CREATED && ass_var.getCentro_di_responsabilita() != null && ass_var.getCd_centro_responsabilita()!=null){ if (inviaMessaggio(usercontext,var_stanz_res,ass_var)){ for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(ass_var.getCd_centro_responsabilita()).iterator();i.hasNext();){ UtenteBulk utente = (UtenteBulk)i.next(); MessaggioBulk messaggio = generaMessaggio(usercontext,utente,var_stanz_res); super.creaConBulk(usercontext, messaggio); } } } } Ass_var_stanz_res_cdrHome AssHome = (Ass_var_stanz_res_cdrHome)getHome(usercontext, Ass_var_stanz_res_cdrBulk.class); boolean rigaInsMod = false; BigDecimal totaleRighe = Utility.ZERO; for (java.util.Iterator righe=var_stanz_res.getRigaVariazione().iterator();righe.hasNext();){ Var_stanz_res_rigaBulk var_riga = (Var_stanz_res_rigaBulk)righe.next(); totaleRighe = totaleRighe.add(Utility.nvl(var_riga.getIm_variazione())); if(var_riga.getCrudStatus()==OggettoBulk.TO_BE_CREATED || var_riga.getCrudStatus()==OggettoBulk.TO_BE_UPDATED){ rigaInsMod = true; } } BigDecimal totaleImportoRiga = BigDecimal.ZERO; if (var_stanz_res.isApprovata() ){ Ass_var_stanz_res_cdrBulk ass_var_cdr = (Ass_var_stanz_res_cdrBulk)AssHome.findByPrimaryKey(new Ass_var_stanz_res_cdrBulk(var_stanz_res.getEsercizio(), var_stanz_res.getPg_variazione(), var_stanz_res.getCentroDiResponsabilita().getCd_centro_responsabilita())); for (java.util.Iterator i = var_stanz_res.getRigaVariazione().iterator();i.hasNext();) { Var_stanz_res_rigaBulk riga = (Var_stanz_res_rigaBulk)i.next(); try { if (isRigaLiquidazioneIva(usercontext, riga)){ throw new ApplicationException ("Attenzione: Non è possibile salvare la variazione contenente la GAE di default della liquidazione IVA!"); } else { totaleImportoRiga = totaleImportoRiga.add(Utility.nvl(riga.getIm_variazione())); } } catch (ComponentException e) { throw new ApplicationException (e.getMessage()); } } if (Utility.nvl(ass_var_cdr.getIm_spesa()).compareTo(totaleImportoRiga) != 0){ throw new ApplicationException ("Attenzione: la somma degli importi "+totaleImportoRiga+" non corrisponde al totale indicato "+Utility.nvl(ass_var_cdr.getIm_spesa())+" sul centro di responsabilità!"); } try { if(rigaInsMod) allineaSaldiVariazioneApprovata(usercontext, var_stanz_res, totaleImportoRiga); } catch (ComponentException e) { throw handleException(e); } } if (rigaInsMod){ Ass_var_stanz_res_cdrBulk ass_var_cdr = (Ass_var_stanz_res_cdrBulk)AssHome.findByPrimaryKey(new Ass_var_stanz_res_cdrBulk(var_stanz_res.getEsercizio(), var_stanz_res.getPg_variazione(), var_stanz_res.getCdr().getCd_centro_responsabilita())); if (ass_var_cdr.getIm_spesa().compareTo(totaleRighe) == 0){ if (inviaMessaggio(usercontext,var_stanz_res,ass_var_cdr)){ for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(var_stanz_res.getCd_centro_responsabilita()).iterator();i.hasNext();){ UtenteBulk utente = (UtenteBulk)i.next(); MessaggioBulk messaggio = generaMessaggioCopertura(usercontext,utente,var_stanz_res,ass_var_cdr); super.creaConBulk(usercontext, messaggio); } } } } } catch (PersistencyException e) { throw new ComponentException(e); } catch (IntrospectionException e) { throw new ComponentException(e); } //cercaProgettiResidui(usercontext,var_stanz_res); return super.modificaConBulk(usercontext, var_stanz_res); } private void allineaSaldiVariazioneApprovata(UserContext userContext, Var_stanz_resBulk var_stanz_res, BigDecimal totaleImporto) throws ComponentException { boolean primoGiro = true; Configurazione_cnrBulk config; try { config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_COMUNE_VERSAMENTO_IVA); } catch (ComponentException e1) { throw handleException(e1); } catch (RemoteException e1) { throw handleException(e1); } catch (EJBException e1) { throw handleException(e1); } for (java.util.Iterator i = var_stanz_res.getRigaVariazione().iterator();i.hasNext();) { Var_stanz_res_rigaBulk riga = (Var_stanz_res_rigaBulk)i.next(); try { Voce_f_saldi_cdr_lineaBulk saldi = allineaSaldi(userContext, riga); super.modificaConBulk(userContext,saldi); if (primoGiro){ Var_stanz_res_rigaBulk rigaCloned = new Var_stanz_res_rigaBulk(); WorkpackageBulk wp = new WorkpackageBulk(riga.getCentroTestata().getCd_centro_responsabilita(), config.getVal01()); wp = (WorkpackageBulk) getHome(userContext, WorkpackageBulk.class).findByPrimaryKey(wp); if (wp == null){ throw new ApplicationException("Impossibile effettuare l'operazione !\n"+ "Linea Attività della liquidazione IVA non esistente."); } rigaCloned.setElemento_voce(riga.getElemento_voce()); rigaCloned.setVar_stanz_res(riga.getVar_stanz_res()); rigaCloned.setCentroTestata(riga.getCentroTestata()); rigaCloned.setEsercizio_res(riga.getEsercizio_res()); rigaCloned.setCd_voce(riga.getCd_voce()); rigaCloned.setLinea_di_attivita(wp); rigaCloned.setIm_variazione(totaleImporto.multiply(new BigDecimal(-1))); saldi = allineaSaldi(userContext, rigaCloned, true); super.modificaConBulk(userContext,saldi); primoGiro = false; } } catch (PersistencyException e) { throw handleException(e); } catch (RemoteException e) { throw handleException(e); } catch (ComponentException e) { throw handleException(e); } } } public OggettoBulk creaConBulk(UserContext usercontext, OggettoBulk oggettobulk)throws ComponentException { Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)super.creaConBulk(usercontext, oggettobulk); try { UtenteHome utenteHome = (UtenteHome)getHome(usercontext,UtenteBulk.class); for (java.util.Iterator j=var_stanz_res.getAssociazioneCDR().iterator();j.hasNext();){ Ass_var_stanz_res_cdrBulk ass_var = (Ass_var_stanz_res_cdrBulk)j.next(); if(ass_var.getCd_centro_responsabilita()!=null){ if (inviaMessaggio(usercontext,var_stanz_res,ass_var)){ for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(ass_var.getCd_centro_responsabilita()).iterator();i.hasNext();){ UtenteBulk utente = (UtenteBulk)i.next(); MessaggioBulk messaggio = generaMessaggio(usercontext,utente,var_stanz_res); super.creaConBulk(usercontext, messaggio); } } } } } catch (PersistencyException e) { throw new ComponentException(e); } catch (IntrospectionException e) { throw new ComponentException(e); } //cercaProgettiResidui(usercontext,var_stanz_res); return var_stanz_res; } public void cercaProgettiResidui(UserContext usercontext, OggettoBulk oggettobulk){ try{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)oggettobulk; for (java.util.Iterator j=var_stanz_res.getRigaVariazione().iterator();j.hasNext();){ Var_stanz_res_rigaBulk var_stanz_res_rigaBulk = (Var_stanz_res_rigaBulk)j.next(); ProgettoHome progettoHome = (ProgettoHome)getHome(usercontext,ProgettoBulk.class); SQLBuilder sql = progettoHome.createSQLBuilder(); sql.addClause("AND", "esercizio", SQLBuilder.EQUALS, var_stanz_res.getEsercizio_residuo()); sql.addClause("AND", "pg_progetto", SQLBuilder.EQUALS, var_stanz_res_rigaBulk.getLinea_di_attivita().getProgetto().getPg_progetto()); Broker broker = progettoHome.createBroker(sql); List lista = progettoHome.fetchAll(broker); /** * Il Modulo non esiste nell'esercizio residuo */ if (lista.isEmpty()){ SQLBuilder sqlCrea = progettoHome.createSQLBuilder(); sqlCrea.addClause("AND", "esercizio", SQLBuilder.EQUALS, CNRUserContext.getEsercizio(usercontext)); sqlCrea.addClause("AND", "tipo_fase", SQLBuilder.EQUALS, ProgettoBulk.TIPO_FASE_NON_DEFINITA); sqlCrea.addClause("AND", "pg_progetto", SQLBuilder.EQUALS, var_stanz_res_rigaBulk.getLinea_di_attivita().getProgetto().getPg_progetto()); Broker brokerCrea = progettoHome.createBroker(sqlCrea); List listaCrea = progettoHome.fetchAll(brokerCrea); if (listaCrea.isEmpty()) return; ProgettoBulk progetto = (ProgettoBulk)listaCrea.get(0); //Creo il Modulo creaProgettiResidui(usercontext, progetto.getPg_progetto(), var_stanz_res.getEsercizio_residuo()); //Creo la Commessa creaProgettiResidui(usercontext, progetto.getProgettopadre().getPg_progetto(), var_stanz_res.getEsercizio_residuo()); //Creo il Progetto creaProgettiResidui(usercontext, progetto.getProgettopadre().getProgettopadre().getPg_progetto(), var_stanz_res.getEsercizio_residuo()); } broker.close(); } }catch(Exception e){ //Se si verifica qualsiasi tipo di errore non faccio niente } } private void creaProgettiResidui(UserContext userContext, Integer pgProgettoRes, Integer esercizioResiduo) throws ComponentException, PersistencyException{ ProgettoHome progettoHome = (ProgettoHome)getHome(userContext,ProgettoBulk.class); ProgettoHome progettoSICHome = (ProgettoHome)getHome(userContext,ProgettoBulk.class,"PROGETTO_SIC"); SQLBuilder sqlCrea = progettoHome.createSQLBuilder(); sqlCrea.addClause("AND", "esercizio", SQLBuilder.EQUALS, CNRUserContext.getEsercizio(userContext)); sqlCrea.addClause("AND", "tipo_fase", SQLBuilder.EQUALS, ProgettoBulk.TIPO_FASE_NON_DEFINITA); sqlCrea.addClause("AND", "pg_progetto", SQLBuilder.EQUALS, pgProgettoRes); Broker brokerCrea = progettoHome.createBroker(sqlCrea); List listaCrea = progettoHome.fetchAll(brokerCrea); if (listaCrea.isEmpty()) return; ProgettoBulk progetto = (ProgettoBulk)listaCrea.get(0); for(Enumeration tipoFasi = ProgettoBulk.tipo_faseAllKeys.keys();tipoFasi.hasMoreElements();){ String tipo_fase = String.valueOf(tipoFasi.nextElement()); progetto.setEsercizio(esercizioResiduo); if (progetto.isModulo() || progetto.isCommessa()) progetto.setEsercizio_progetto_padre(esercizioResiduo); if (progetto.getUnita_organizzativa()==null) progetto.setUnita_organizzativa((Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0)); if (progetto.getResponsabile() == null) progetto.setResponsabile(((TerzoHome)getHome( userContext, TerzoBulk.class)).findTerzoEnte()); if (progetto.getDt_inizio() == null) progetto.setDt_inizio(DateUtils.firstDateOfTheYear(esercizioResiduo)); progetto.setUser(CNRUserContext.getUser(userContext)); progetto.setFl_piano_triennale(true); progetto.setTipo_fase(tipo_fase); if (progetto.isModulo() || progetto.isCommessa()) progetto.setTipo_fase_progetto_padre(tipo_fase); progetto.setToBeCreated(); try{ progettoSICHome.insert(progetto, userContext); }catch(Exception e){ //Se si verifica qualsiasi tipo di errore non faccio niente } } brokerCrea.close(); } public void aggiungiDettaglioVariazione(UserContext usercontext, Var_stanz_resBulk var_stanz_res, V_assestato_residuoBulk saldo)throws ComponentException { try { //Verifico innanzitutto se esiste l'associazione con il CDR altrimenti la creo Ass_var_stanz_res_cdrHome AssHome = (Ass_var_stanz_res_cdrHome)getHome(usercontext, Ass_var_stanz_res_cdrBulk.class); Ass_var_stanz_res_cdrBulk ass_var_cdrOld = new Ass_var_stanz_res_cdrBulk(var_stanz_res.getEsercizio(), var_stanz_res.getPg_variazione(), saldo.getCd_centro_responsabilita()); Ass_var_stanz_res_cdrBulk ass_var_cdrNew = (Ass_var_stanz_res_cdrBulk)AssHome.findByPrimaryKey(ass_var_cdrOld); if (ass_var_cdrNew == null){ ass_var_cdrOld.setIm_spesa(Utility.ZERO); ass_var_cdrOld.setToBeCreated(); super.creaConBulk(usercontext,ass_var_cdrOld); } //Ora posso inserire la riga di variazione Var_stanz_res_rigaBulk var_stanz_res_riga = new Var_stanz_res_rigaBulk(); var_stanz_res_riga.setEsercizio_res(saldo.getEsercizio_res()); var_stanz_res_riga.setVar_stanz_res(var_stanz_res); var_stanz_res_riga.setLinea_di_attivita(new WorkpackageBulk(saldo.getCd_centro_responsabilita(),saldo.getCd_linea_attivita())); var_stanz_res_riga.setElemento_voce((Elemento_voceBulk)getHome(usercontext, Elemento_voceBulk.class).findByPrimaryKey(new Elemento_voceBulk(saldo.getCd_elemento_voce(),saldo.getEsercizio(),saldo.getTi_appartenenza(),saldo.getTi_gestione()))); if (!((Parametri_cnrHome)getHome(usercontext, Parametri_cnrBulk.class)).isNuovoPdg(var_stanz_res.getEsercizio())) var_stanz_res_riga.setVoce_f(new Voce_fBulk(saldo.getCd_voce(),saldo.getEsercizio(),saldo.getTi_appartenenza(),saldo.getTi_gestione())); else { var_stanz_res_riga.setVoce_f(null); var_stanz_res_riga.setCd_voce(var_stanz_res_riga.getCd_elemento_voce()); } var_stanz_res_riga.setIm_variazione(saldo.getImp_da_assegnare()); Var_stanz_resHome testataHome = (Var_stanz_resHome)getHome(usercontext, Var_stanz_resBulk.class); try { var_stanz_res.setRigaVariazione(new it.cnr.jada.bulk.BulkList(testataHome.findVariazioniRiga(var_stanz_res))); } catch (IntrospectionException e1) { throw new ComponentException(e1); } try { var_stanz_res_riga.validate(var_stanz_res_riga); } catch (ValidationException e) { throw new ApplicationException(e.getMessage()); } var_stanz_res_riga.setToBeCreated(); super.creaConBulk(usercontext,var_stanz_res_riga); } catch (PersistencyException e) { throw new ComponentException(e); } } public it.cnr.jada.bulk.OggettoBulk generaVariazioneBilancio(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk; LoggableStatement cs = null; try { cs = new LoggableStatement(getConnection(userContext), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB075.genera_varente_da_Varstanzres(?,?,?,?,?,?,?)}",false,this.getClass()); cs.setObject(1, var_stanz_res.getEsercizio() ); cs.setObject(2, var_stanz_res.getPg_variazione() ); cs.setObject(3, CNRUserContext.getUser(userContext) ); cs.registerOutParameter( 4, java.sql.Types.VARCHAR); cs.registerOutParameter( 5, java.sql.Types.INTEGER); cs.registerOutParameter( 6, java.sql.Types.CHAR); cs.registerOutParameter( 7, java.sql.Types.INTEGER); cs.executeQuery(); String cds_var_bil = cs.getString(4); if (cds_var_bil != null ){ var_stanz_res.setCds_var_bil(cds_var_bil); var_stanz_res.setEs_var_bil(new Integer(cs.getString(5))); var_stanz_res.setTi_app_var_bil(new Character(cs.getString(6).charAt(0))); var_stanz_res.setPg_var_bil(new Integer(cs.getString(7))); } }catch (Throwable e) { throw handleException(e); } finally { if (cs != null) try { cs.close(); } catch (SQLException e1) { throw handleException(e1); } } return var_stanz_res; } public it.cnr.jada.bulk.OggettoBulk esitaVariazioneBilancio(UserContext userContext, it.cnr.jada.bulk.OggettoBulk ogettoBulk) throws ComponentException{ Var_stanz_resBulk var_stanz_res = (Var_stanz_resBulk)ogettoBulk; if (var_stanz_res.getCds_var_bil() != null){ LoggableStatement cs = null; try { cs = new LoggableStatement(getConnection(userContext), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB055.esitaVariazioneBilancio(?,?,?,?,?)}",false,this.getClass()); cs.setObject(1, var_stanz_res.getEs_var_bil() ); cs.setObject(2, var_stanz_res.getCds_var_bil()); cs.setObject(3, var_stanz_res.getTi_app_var_bil().toString() ); cs.setObject(4, var_stanz_res.getPg_var_bil() ); cs.setObject(5, CNRUserContext.getUser(userContext) ); cs.executeQuery(); }catch (SQLException e) { try { SQLExceptionHandler sqlException = SQLExceptionHandler.getInstance(); PersistencyException eccezione = sqlException.handleSQLException(e, var_stanz_res); String soggetto = "Si è verificato un errore durante l'approvazione della variazione sul bilancio dell'ente "+var_stanz_res.getEs_var_bil()+"/"+var_stanz_res.getPg_var_bil(); String preText = "Si è verificato il seguente errore durante l'approvazione della variazione sul bilancio dell'ente "+var_stanz_res.getEs_var_bil()+"/"+var_stanz_res.getPg_var_bil() + "
" + "generata in automatico a seguito della Variazione allo stanziamento residuo num. "+var_stanz_res.getPg_variazione()+ " del "+ var_stanz_res.getEsercizio()+".

"+ ""+eccezione.getMessage()+"

"+ "La Variazione al bilancio dell'Ente rimarrà pertanto PROVVISORIA.
"; generaEMAIL(userContext, var_stanz_res, soggetto, preText, null,"ERR"); var_stanz_res.setErroreEsitaVariazioneBilancio(true); }catch (IntrospectionException e1) { throw handleException(e1); } catch (PersistencyException e1) { throw handleException(e1); } } finally { if (cs != null) try { cs.close(); } catch (SQLException e1) { throw handleException(e1); } } } return var_stanz_res; } private void verificaTotaliDaAccertamentoModifica(UserContext usercontext, Var_stanz_resBulk var) throws ApplicationException { Accertamento_modificaBulk accMod = var.getAccMod(); if (accMod!=null) { BigDecimal impTotale = Utility.ZERO; for(Iterator it = accMod.getAccertamento_mod_voceColl().iterator();it.hasNext();) { Accertamento_mod_voceBulk accModVoce = (Accertamento_mod_voceBulk) it.next(); impTotale = impTotale.add(accModVoce.getIm_modifica()); } if (impTotale.compareTo(Utility.nvl(var.getTotale_da_ripartire()))!=0) throw new ApplicationException("Impossibile effettuare l'operazione !\n"+ "Il totale da ripartire non corrisponde al totale della modifica all'accertamento residuo collegato."); } } /** * Crea la ComponentSession da usare per effettuare le operazioni di lettura della Configurazione CNR * * @return Configurazione_cnrComponentSession l'istanza di Configurazione_cnrComponentSession che serve per leggere i parametri di configurazione del CNR */ private Configurazione_cnrComponentSession createConfigurazioneCnrComponentSession() throws ComponentException { try { return (Configurazione_cnrComponentSession)EJBCommonServices.createEJB("CNRCONFIG00_EJB_Configurazione_cnrComponentSession"); } catch ( Exception e ) { throw handleException( e ) ; } } public void validaOrigineFontiPerAnnoResiduo(UserContext usercontext, Integer annoResiduo, String origineFonti) throws ComponentException { try{ UtenteBulk utente = (UtenteBulk)(getHome(usercontext, UtenteBulk.class).findByPrimaryKey(new UtenteBulk(CNRUserContext.getUser(usercontext)))); if (!utente.isSupervisore()) { Configurazione_cnrBulk config = createConfigurazioneCnrComponentSession().getConfigurazione( usercontext, CNRUserContext.getEsercizio(usercontext), CNRUserContext.getCd_cds(usercontext), Configurazione_cnrBulk.PK_ANNI_RESIDUI_VAR_ST_RES, String.valueOf(annoResiduo)); if ( config == null ) config = createConfigurazioneCnrComponentSession().getConfigurazione( usercontext, CNRUserContext.getEsercizio(usercontext), null, Configurazione_cnrBulk.PK_ANNI_RESIDUI_VAR_ST_RES, String.valueOf(annoResiduo)); if (config != null){ if (!origineFonti.equalsIgnoreCase(config.getVal01()) && !origineFonti.equalsIgnoreCase(config.getVal02())){ throw new ApplicationException("Non è consentito emettere variazioni allo stanziamento residuo\n"+ "su residui del "+annoResiduo+" sulle "+ NaturaBulk.tipo_naturaKeys.get(origineFonti)); } } } }catch ( Exception e ){ throw handleException( e ) ; } } @Override protected void validaCreaModificaConBulk(UserContext usercontext, OggettoBulk oggettobulk) throws ComponentException { if (oggettobulk instanceof Var_stanz_resBulk){ Var_stanz_resBulk var = (Var_stanz_resBulk)oggettobulk; Optional.ofNullable(var.getEsercizio_res()).flatMap(el->Optional.ofNullable(el.getEsercizio())) .orElseThrow(()->new ApplicationException("Operazione non possibile! Indicare l'esercizio residuo della variazione!")); validaOrigineFontiPerAnnoResiduo(usercontext, var.getEsercizio_residuo(), var.getTipologia_fin()); } super.validaCreaModificaConBulk(usercontext, oggettobulk); } public boolean isVariazioneFromLiquidazioneIvaDaModificare(UserContext userContext, Var_stanz_resBulk variazione) throws ComponentException,java.rmi.RemoteException{ /** * Recupero la linea di attività dell'IVA C20 */ it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null; try { if (variazione.isApprovata()){ Var_stanz_res_rigaBulk varRiga = recuperoRigaLiquidazioneIva(userContext, variazione); if (varRiga != null){ return true; } } } catch (EJBException e) { throw new ComponentException(e); } return false; } public Var_stanz_res_rigaBulk recuperoRigaLiquidazioneIva(it.cnr.jada.UserContext userContext, Var_stanz_resBulk bulk) throws it.cnr.jada.comp.ComponentException,javax.ejb.EJBException { /** * Recupero la linea di attività dell'IVA C20 */ it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null; try { config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_COMUNE_VERSAMENTO_IVA); Var_stanz_resHome home = (Var_stanz_resHome) getHome(userContext, Var_stanz_resBulk.class); for (Iterator dett = home.findAllVariazioniRiga(bulk).iterator(); dett.hasNext();){ Var_stanz_res_rigaBulk spe_det = (Var_stanz_res_rigaBulk) dett.next(); if (spe_det.getCd_linea_attivita() != null && spe_det.getCd_linea_attivita().equals(config.getVal01())){ return spe_det; } } } catch (IntrospectionException e) { throw new ComponentException(e); } catch (RemoteException e) { throw new ComponentException(e); } catch (PersistencyException e) { throw new ComponentException(e); } catch (EJBException e) { throw new ComponentException(e); } return null; } private boolean isRigaLiquidazioneIva(it.cnr.jada.UserContext userContext, Var_stanz_res_rigaBulk bulk) throws it.cnr.jada.comp.ComponentException,javax.ejb.EJBException { /** * Recupero la linea di attività dell'IVA C20 */ it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null; try { config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_COMUNE_VERSAMENTO_IVA); if (bulk.getCd_linea_attivita() != null && bulk.getCd_linea_attivita().equals(config.getVal01())){ return true; } } catch (RemoteException e) { throw new ComponentException(e); } catch (EJBException e) { throw new ComponentException(e); } return false; } /** * Metodo che verifica se esistono rimodulazioni in stato definitivo/approvato che richiedono variazioni di residuo a quadratura * sull'anno residuo uguale a quello inserito nella variazine stessa. * In tal caso restituisce un errore. * * @param userContext * @param varStanzRes La variazione che si sta rendendo definitiva * @throws it.cnr.jada.comp.ComponentException */ private void controllaRimodulazioneProgetto(UserContext userContext, Var_stanz_resBulk varStanzRes) throws it.cnr.jada.comp.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); //Se la variazione residua è su un anno precedente all'attivazione dei progetti non faccio alcun controllo if (varStanzRes.getEsercizio_residuo().compareTo(annoFrom.intValue())<0) return; String cdNaturaReimpiego = configSession.getVal01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_NATURA_REIMPIEGO); List listCtrlVarPianoEco = new ArrayList(); Var_stanz_resHome detHome = (Var_stanz_resHome) getHome(userContext, Var_stanz_resBulk.class); for (java.util.Iterator dett = detHome.findAllVariazioniRiga(varStanzRes).iterator();dett.hasNext();){ Var_stanz_res_rigaBulk rigaVar = (Var_stanz_res_rigaBulk)dett.next(); WorkpackageBulk latt = ((WorkpackageHome)getHome(userContext, WorkpackageBulk.class)).searchGAECompleta(userContext,CNRUserContext.getEsercizio(userContext), rigaVar.getLinea_di_attivita().getCd_centro_responsabilita(), rigaVar.getLinea_di_attivita().getCd_linea_attivita()); ProgettoBulk progetto = latt.getProgetto(); NaturaBulk natura = (NaturaBulk)((NaturaHome)getHome(userContext, NaturaBulk.class)).findByPrimaryKey(latt.getNatura()); BigDecimal imSpeseInterne = BigDecimal.ZERO; BigDecimal imSpeseEsterne = BigDecimal.ZERO; if (Optional.ofNullable(natura).filter(el->el.isFonteInterna()||el.getCd_natura().equals(cdNaturaReimpiego)).isPresent()) imSpeseInterne = Optional.ofNullable(rigaVar.getIm_variazione()).orElse(BigDecimal.ZERO); else imSpeseEsterne = Optional.ofNullable(rigaVar.getIm_variazione()).orElse(BigDecimal.ZERO); CtrlVarPianoEco varPianoEco = listCtrlVarPianoEco.stream() .filter(el->el.getProgetto().getPg_progetto().equals(progetto.getPg_progetto())) .findFirst() .orElse(new CtrlVarPianoEco(progetto)); varPianoEco.setImSpeseInterne(varPianoEco.getImSpeseInterne().add(imSpeseInterne)); varPianoEco.setImSpeseEsterne(varPianoEco.getImSpeseEsterne().add(imSpeseEsterne)); if (!listCtrlVarPianoEco.contains(varPianoEco)) listCtrlVarPianoEco.add(varPianoEco); } if (Optional.ofNullable(varStanzRes.getPg_progetto_rimodulazione()).isPresent()) { listCtrlVarPianoEco.stream().filter(el->!el.getProgetto().getPg_progetto().equals(varStanzRes.getPg_progetto_rimodulazione())) .findFirst().ifPresent(el->{ throw new ApplicationRuntimeException("La variazione è associata alla rimodulazione del progetto " + varStanzRes.getProgettoRimodulazione().getProgetto().getCd_progetto() + ". Non è possibile movimentare con essa altri " + "progetti ("+el.getProgetto().getCd_progetto()); }); } else { /** * Verifico che per i progetti movimentati non esistino rimodulazioni ancora in stato definitivo o approvato che * richiedono variazioni di residuo sull'anno della variazione in corso */ listCtrlVarPianoEco.stream().forEach(el->{ try { Progetto_rimodulazioneHome rimodHome = (Progetto_rimodulazioneHome) getHome(userContext, Progetto_rimodulazioneBulk.class); ProgettoHome prgHome = (ProgettoHome) getHome(userContext, ProgettoBulk.class); prgHome.findRimodulazioni(el.getProgetto().getPg_progetto()).stream() .filter(rim->rim.isStatoDefinitivo()||rim.isStatoValidato()) .findFirst().ifPresent(rim->{ try { rim = rimodHome.rebuildRimodulazione(userContext, rim); if (rim.getVariazioniModels().stream().filter(Var_stanz_resBulk.class::isInstance).map(Var_stanz_resBulk.class::cast) .filter(varRim->varRim.getEsercizio_residuo().equals(varStanzRes.getEsercizio_residuo())).findFirst().isPresent()) throw new ApplicationRuntimeException("La variazione movimenta il progetto "+el.getProgetto().getCd_progetto() + " sul quale è in corso la rimodulazione nr."+ rim.getPg_gen_rimodulazione() + " che si trova attualmente in stato '" + (rim.isStatoDefinitivo()?"Definitivo":"Validato") + "' e richiede una variazione di residuo a quadratura sull'anno residuo " + varStanzRes.getEsercizio_residuo()+ ".
Non è effettuare variazioni sull'anno residuo " + varStanzRes.getEsercizio_residuo()+ " fino a quando la suddetta rimodulazione non viene " + "approvata/respinta."); } catch (PersistencyException ex){ throw new DetailedRuntimeException(ex); } }); } catch (ComponentException|PersistencyException ex){ throw new DetailedRuntimeException(ex); } }); } } catch (Throwable e) { throw handleException(e); } } public SQLBuilder selectProgettoRimodulatoForSearchByClause(UserContext userContext, Var_stanz_resBulk varStanzRes, ProgettoBulk prg, CompoundFindClause clause) throws ComponentException, PersistencyException { ProgettoHome progettoHome = (ProgettoHome)getHome(userContext, ProgettoBulk.class); SQLBuilder sql; if (varStanzRes.getCentroDiResponsabilita().getUnita_padre().isUoEnte()) sql = progettoHome.selectProgetti(userContext); else sql = progettoHome.selectProgettiAbilitati(userContext); sql.addTableToHeader("PROGETTO_RIMODULAZIONE"); sql.addSQLJoin("V_PROGETTO_PADRE.PG_PROGETTO", "PROGETTO_RIMODULAZIONE.PG_PROGETTO"); sql.addSQLClause(FindClause.AND,"PROGETTO_RIMODULAZIONE.STATO",SQLBuilder.EQUALS,StatoProgettoRimodulazione.STATO_VALIDATO.value()); if (clause != null) sql.addClause(clause); return sql; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy