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

it.cnr.contab.pdg01.comp.CRUDPdgVariazioneGestionaleComponent 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 Jan 19, 2006
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package it.cnr.contab.pdg01.comp;

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;

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

import it.cnr.contab.config00.bulk.Configurazione_cnrHome;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cdsBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession;
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.Elemento_voceHome;
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.CdsBulk;
import it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.V_struttura_organizzativaBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneHome;
import it.cnr.contab.doccont00.ejb.SaldoComponentSession;
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.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.pdg00.comp.PdGVariazioniComponent;
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.pdg01.bulk.Tipo_variazioneHome;
import it.cnr.contab.prevent00.bulk.V_assestatoBulk;
import it.cnr.contab.prevent00.bulk.V_assestatoHome;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk;
import it.cnr.contab.prevent01.bulk.Pdg_esercizioBulk;
import it.cnr.contab.progettiric00.comp.RimodulazioneNonApprovataException;
import it.cnr.contab.progettiric00.core.bulk.ProgettoBulk;
import it.cnr.contab.progettiric00.core.bulk.ProgettoHome;
import it.cnr.contab.progettiric00.core.bulk.Progetto_rimodulazioneBulk;
import it.cnr.contab.progettiric00.core.bulk.Progetto_rimodulazioneHome;
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.ApplicationMessageFormatException;
import it.cnr.contab.util.ICancellatoLogicamente;
import it.cnr.contab.util.Utility;
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.comp.OptionRequestException;
import it.cnr.jada.ejb.CRUDComponentSession;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.persistency.sql.FindClause;
import it.cnr.jada.persistency.sql.LoggableStatement;
import it.cnr.jada.persistency.sql.SQLBuilder;
import it.cnr.jada.persistency.sql.SQLExceptionHandler;
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;

public class CRUDPdgVariazioneGestionaleComponent extends PdGVariazioniComponent {
    private static final Logger log = LoggerFactory.getLogger(CRUDPdgVariazioneGestionaleComponent.class);

    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;
		}
	}
	
	private class CtrlPianoEco {
		public CtrlPianoEco(ProgettoBulk progetto, Timestamp dtScadenza, boolean cashFund) {
			super();
			this.progetto = progetto;
			this.dtScadenza = dtScadenza;
			this.cashFund = cashFund;
		}
		private ProgettoBulk progetto;
		private Timestamp dtScadenza;
		private boolean cashFund;
		private BigDecimal impPositivi = BigDecimal.ZERO;
		private BigDecimal impNegativi = BigDecimal.ZERO;
		private BigDecimal impPositiviNaturaReimpiego = BigDecimal.ZERO;
		private BigDecimal impNegativiNaturaReimpiego = BigDecimal.ZERO;
		private BigDecimal impPositiviVoceSpeciale = BigDecimal.ZERO;
		private BigDecimal impNegativiVoceSpeciale = BigDecimal.ZERO;
		public ProgettoBulk getProgetto() {
			return progetto;
		}
		public void setProgetto(ProgettoBulk progetto) {
			this.progetto = progetto;
		}
		public Timestamp getDtScadenza() {
			return dtScadenza;
		}
		public void setDtScadenza(Timestamp dtScadenza) {
			this.dtScadenza = dtScadenza;
		}
		public boolean isCashFund() {
			return cashFund;
		}
		public void setCashFund(boolean cashFund) {
			this.cashFund = cashFund;
		}
		public BigDecimal getImpPositivi() {
			return impPositivi;
		}
		public void setImpPositivi(BigDecimal impPositivi) {
			this.impPositivi = impPositivi;
		}
		public BigDecimal getImpNegativi() {
			return impNegativi;
		}
		public void setImpNegativi(BigDecimal impNegativi) {
			this.impNegativi = impNegativi;
		}
		public BigDecimal getImpPositiviNaturaReimpiego() {
			return impPositiviNaturaReimpiego;
		}
		public void setImpPositiviNaturaReimpiego(BigDecimal impPositiviNaturaReimpiego) {
			this.impPositiviNaturaReimpiego = impPositiviNaturaReimpiego;
		}
		public BigDecimal getImpNegativiNaturaReimpiego() {
			return impNegativiNaturaReimpiego;
		}
		public void setImpNegativiNaturaReimpiego(BigDecimal impNegativiNaturaReimpiego) {
			this.impNegativiNaturaReimpiego = impNegativiNaturaReimpiego;
		}
		public BigDecimal getImpPositiviVoceSpeciale() {
			return impPositiviVoceSpeciale;
		}
		public void setImpPositiviVoceSpeciale(BigDecimal impPositiviVoceSpeciale) {
			this.impPositiviVoceSpeciale = impPositiviVoceSpeciale;
		}
		public BigDecimal getImpNegativiVoceSpeciale() {
			return impNegativiVoceSpeciale;
		}
		public void setImpNegativiVoceSpeciale(BigDecimal impNegativiVoceSpeciale) {
			this.impNegativiVoceSpeciale = impNegativiVoceSpeciale;
		}
	}
	
	private static final java.math.BigDecimal ZERO = new java.math.BigDecimal(0);

	public  CRUDPdgVariazioneGestionaleComponent()
	{
		/*Default constructor*/
	}

	public OggettoBulk creaConBulk(UserContext userContext, OggettoBulk bulk) throws ComponentException {
		if (((Pdg_variazioneBulk)bulk).getDs_delibera()==null)
			((Pdg_variazioneBulk)bulk).setDs_delibera(".");
		return super.creaConBulk(userContext, bulk);
	}
	public Pdg_variazioneBulk salvaDefinitivo(UserContext userContext, Pdg_variazioneBulk pdg) throws ComponentException{
		pdg.setStato(Pdg_variazioneBulk.STATO_PROPOSTA_DEFINITIVA);
		pdg.setDt_chiusura(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
		pdg.setToBeUpdated();
		inizializzaSommeCdR(userContext, pdg);
		if (pdg.getAssociazioneCDR().isEmpty()) 
			throw new ApplicationException("Associare almeno un Centro di Responsabilità alla Variazione.");
		//	P.R.: Controllo proveniente da ModificaConBulk e CreaConBulk
		//	Deciso con Angelini di spostare i controlli in fase di salvataggio definitivo
		validaDettagliEntrataSpesa(userContext, pdg);

		try {
			controllaRimodulazioneProgetto(userContext,pdg);

			SaldoComponentSession saldoComponent = Utility.createSaldoComponentSession();
	
			//Verifico che il tipo di variazione sia consentita
			saldoComponent.checkPdgPianoEconomico(userContext, pdg);
			//Verifico che piano economico non si sfondi
			saldoComponent.checkDispPianoEconomicoProgetto(userContext, pdg);
		} catch (RemoteException e) {
			throw new ComponentException(e);
		}	
		
		/*
		 * Confermo l'operazione
		 * E' importante salvare in questo momento in controllo di disponibilità avviene tramite
		 * procedura Pl-Sql che deve già trovare sul DB la variazione con stato Definitivo altrimenti non la 
		 * considera ai fini del controllo  
		 */ 
		pdg = (Pdg_variazioneBulk)super.modificaConBulk(userContext, pdg);
			
		try{
			for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){			
				Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next();
				Ass_pdg_variazione_cdrHome ass_pdgHome = (Ass_pdg_variazione_cdrHome)getHome(userContext,Ass_pdg_variazione_cdrBulk.class);
	
				if (ass_pdgHome.findDettagliSpesaVariazioneGestionale(ass_pdg).isEmpty()) { 
					if (ass_pdgHome.findDettagliEntrataVariazioneGestionale(ass_pdg).isEmpty()) 
						throw new ApplicationException("Associare almeno un dettaglio di variazione al Centro di Responsabilità " + ass_pdg.getCd_centro_responsabilita());
				}
	
				if (ass_pdg.getEntrata_diff().compareTo(Utility.ZERO) != 0)
					throw new ApplicationException("La Differenza di entrata ("+new it.cnr.contab.util.EuroFormat().format(ass_pdg.getEntrata_diff())+")"+
												   "\n" + "per il Cdr "+ ass_pdg.getCd_centro_responsabilita()+ " è diversa da zero. ");
				if (ass_pdg.getSpesa_diff().compareTo(Utility.ZERO) != 0)
					throw new ApplicationException("La Differenza di spesa ("+new it.cnr.contab.util.EuroFormat().format(ass_pdg.getSpesa_diff())+")"+
												   "\n" + "per il Cdr "+ ass_pdg.getCd_centro_responsabilita()+ " è diversa da zero. ");
			}

			if (!pdg.isStorno() && !pdg.getTipo_variazione().isMovimentoSuFondi())
				controllaQuadraturaImportiAree(userContext, pdg);
			
			aggiornaLimiteSpesa(userContext, pdg);
			/*
			 * Verifico che l'assestato di tutte le combinazioni scelte sia positivo in modo da avvertire
			 * l'utente del problema di approvazione che avrebbe  
			 */
			checkDispAssestatoCdrGAEVoce(userContext, pdg, "onSalvaDefinitivoDispAssestatoCdrGAEVoceFailed");
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}	
		return pdg;
	}
	

private void aggiornaLimiteSpesa(UserContext userContext,Pdg_variazioneBulk 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_pdg() );
		cs.setObject( 3,"C"); //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);
	}
}

	protected Voce_f_saldi_cdr_lineaBulk trovaSaldo(UserContext userContext, Pdg_variazione_riga_gestBulk pdg_det,Voce_fBulk voce) throws PersistencyException, ComponentException{
		Voce_f_saldi_cdr_lineaBulk saldo = (Voce_f_saldi_cdr_lineaBulk)getHome(userContext, Voce_f_saldi_cdr_lineaBulk.class).findByPrimaryKey(
		   new Voce_f_saldi_cdr_lineaBulk(pdg_det.getEsercizio(),
										  pdg_det.getEsercizio(),
										  pdg_det.getCd_cdr_assegnatario(),
										  pdg_det.getCd_linea_attivita(),
										  pdg_det.getTi_appartenenza(),
										  pdg_det.getTi_gestione(),
										  voce.getCd_voce()));
		return saldo;									  	
	}
	
	public V_assestatoBulk trovaAssestato(UserContext userContext, Pdg_variazione_riga_gestBulk pdg_det) throws ComponentException{
		try {
			V_assestatoBulk assestato = (V_assestatoBulk)getHome(userContext, V_assestatoBulk.class).findByPrimaryKey(
				   new V_assestatoBulk(pdg_det.getEsercizio(),
									   pdg_det.getEsercizio(),
									   pdg_det.getCd_cdr_assegnatario(),
									   pdg_det.getCd_linea_attivita(),
									   pdg_det.getTi_appartenenza(),
									   pdg_det.getTi_gestione(),
									   pdg_det.getCd_elemento_voce()));
			return assestato;									  	
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch (ComponentException e) {
			throw new ComponentException(e);
		}
	}

	private void aggiornaSaldiCdrLinea(UserContext userContext, Pdg_variazione_riga_gestBulk varRiga, Boolean sottraiImportoDaVariazioneEsistente) throws ComponentException{
		try {
			BigDecimal impDaAggiornare = Utility.ZERO;
			Voce_f_saldi_cdr_lineaBulk saldo = new Voce_f_saldi_cdr_lineaBulk(varRiga.getEsercizio(), 
			                                                                  varRiga.getEsercizio(), 
																			  varRiga.getCd_cdr_assegnatario(), 
																			  varRiga.getCd_linea_attivita(), 
																			  varRiga.getElemento_voce().getTi_appartenenza(), 
																			  varRiga.getElemento_voce().getTi_gestione(), 
																			  getVoce_FdaEV(userContext, 
																					        varRiga.getEsercizio(), 
																					        varRiga.getElemento_voce().getTi_appartenenza(),
																						    varRiga.getElemento_voce().getTi_gestione(), 
																					        varRiga.getCd_elemento_voce(),
																					        varRiga.getCd_cdr_assegnatario(), 
																							varRiga.getCd_linea_attivita()));
			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.getCd_elemento_voce());
				saldi = (Voce_f_saldi_cdr_lineaBulk)((CRUDComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB("JADAEJB_CRUDComponentSession",it.cnr.jada.ejb.CRUDComponentSession.class)).creaConBulk(userContext,saldo);
			}
			
			Voce_f_saldi_cdr_lineaBulk saldoNew = Utility.createSaldoComponentSession().aggiornaVariazioneStanziamento(userContext, 
																				 varRiga.getCd_cdr_assegnatario(), 
																				 varRiga.getCd_linea_attivita(), 
																				 saldo.getVoce(), 
																				 varRiga.getEsercizio(), 
																				 Voce_f_saldi_cdr_lineaBulk.TIPO_COMPETENZA, 
																				 varRiga.getIm_variazione(),
																				 sottraiImportoDaVariazioneEsistente);
			if (saldo.getTi_gestione().equalsIgnoreCase(Voce_f_saldi_cdr_lineaBulk.TIPO_GESTIONE_SPESA)||
				varRiga.getIm_variazione().compareTo(Utility.ZERO)==-1){
				String err = Utility.createSaldoComponentSession().getMessaggioSfondamentoDisponibilita(userContext, 
																									    saldoNew);
				if (!(err==null ||err.equals("")))
					throw new ApplicationException(err);
		        }
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}catch (RemoteException e) {
			throw new ComponentException(e);
		} catch (EJBException e) {
			throw new ComponentException(e);
		}
	}

	public void aggiornaSaldiCdrLinea(UserContext userContext, Pdg_variazione_riga_gestBulk varRiga) throws ComponentException{
		aggiornaSaldiCdrLinea(userContext, varRiga, false);
	}

	public void allineaSaldiVariazioneApprovata(UserContext userContext, Ass_pdg_variazione_cdrBulk ass) 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 =  ass.getRigheVariazioneSpeGest().iterator();i.hasNext();) {
			Pdg_variazione_riga_gestBulk varRiga = (Pdg_variazione_riga_gestBulk)i.next();
			try {
				aggiornaSaldiCdrLinea(userContext,varRiga);
				if (primoGiro){
					Pdg_variazione_riga_gestBulk rigaCloned = new Pdg_variazione_riga_gestBulk();
					rigaCloned.setElemento_voce(varRiga.getElemento_voce());
					rigaCloned.setPdg_variazione(varRiga.getPdg_variazione());
					rigaCloned.setCdr_assegnatario(varRiga.getCdr_assegnatario());
					rigaCloned.setCd_linea_attivita(config.getVal01());
					rigaCloned.setIm_spese_gest_accentrata_est(ass.getIm_spesa().multiply(new BigDecimal(-1)));
					aggiornaSaldiCdrLinea(userContext,rigaCloned, true);
					primoGiro = false;
				}
			} catch (ComponentException e) {
				throw handleException(e);
			}
		}
	}

	/**
	 * 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 Pdg_variazioneBulk approva(UserContext userContext, Pdg_variazioneBulk varPdg) throws ComponentException{
		try {
			varPdg.setStato(Pdg_variazioneBulk.STATO_APPROVATA);
			varPdg.setDt_approvazione(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext)));
			varPdg.setToBeUpdated();
			varPdg = (Pdg_variazioneBulk)super.modificaConBulk(userContext, varPdg);
	
			gestioneVistoDipartimenti(userContext, varPdg);
			
			Pdg_variazioneHome testataHome = (Pdg_variazioneHome)getHome(userContext, Pdg_variazioneBulk.class);

			ribaltaCostiPdGArea(userContext,varPdg);
			
			/*
			 * Ricarico il BULK con i dati presenti sul DB che, nel frattempo, potrebbero essere
			 * aumentati a causa di procedure DB lanciate da comandi precedenti (es. ribaltaCostiPdGArea)
			 */
			varPdg = (Pdg_variazioneBulk)testataHome.findByPrimaryKey(varPdg);
			varPdg.setAssociazioneCDR(new it.cnr.jada.bulk.BulkList(testataHome.findAssociazioneCDR(varPdg)));
	
			for (Iterator righe = testataHome.findDettagliVariazioneGestionale(varPdg).iterator();righe.hasNext();){
				Pdg_variazione_riga_gestBulk varRiga = (Pdg_variazione_riga_gestBulk)righe.next();
				if (!varRiga.isDettaglioScaricato())
					aggiornaSaldiCdrLinea(userContext,varRiga);
			}
			
			if (varPdg.isVariazioneRimodulazioneProgetto()) {
				try {
	            	Progetto_rimodulazioneHome prgHome = (Progetto_rimodulazioneHome)getHome(userContext, Progetto_rimodulazioneBulk.class);
	        		Progetto_rimodulazioneBulk rimodulazione = prgHome.rebuildRimodulazione(userContext, varPdg.getProgettoRimodulazione());
	        		prgHome.validaPassaggioStatoApprovato(userContext, rimodulazione, varPdg);
	        		Utility.createRimodulaProgettoRicercaComponentSession().approva(userContext, rimodulazione, varPdg);
				} catch (RimodulazioneNonApprovataException e) {
					log.info("Approvazione Variazione di Rimodulazione "+varPdg.getEsercizio()+"\\"+varPdg.getPg_variazione_pdg()+" che non genera "
							+"approvazione della rimodulazione associata.");
				} catch (ComponentException e) {
					throw new ApplicationMessageFormatException("Anomalia in fase di approvazione Rimodulazione Progetto.
{0}", Optional.ofNullable(e.getDetail()) .map(el->el.getMessage()) .orElse(e.getMessage())); } } /* * Spedisco i messaggi di avvertimento a tutti i CDR interessati alla Variazione */ UtenteHome utenteHome = (UtenteHome)getHome(userContext,UtenteBulk.class); if (!varPdg.isVariazioneInternaIstituto()){ for (java.util.Iterator j=varPdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_var = (Ass_pdg_variazione_cdrBulk)j.next(); 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,varPdg,Pdg_variazioneBulk.STATO_APPROVATA); super.creaConBulk(userContext, messaggio); } } } generaVariazioneBilancio(userContext, varPdg); if (!varPdg.isVariazioneInternaIstituto()){ String soggetto = "E' stata approvata la Variazione al Pdg n° "+varPdg.getPg_variazione_pdg(); generaEMAIL(userContext, varPdg,soggetto,soggetto +" del "+varPdg.getEsercizio()+"
",null, "APP"); } } catch (IntrospectionException|PersistencyException|EJBException|RemoteException e) { throw new ComponentException(e); } return varPdg; } public Pdg_variazioneBulk respingi(UserContext userContext, Pdg_variazioneBulk pdg) throws ComponentException{ if (pdg.getCd_causale_respinta()==null) throw new it.cnr.jada.comp.ApplicationException("Indicare la causale della Mancata Approvazione."); pdg.setStato(Pdg_variazioneBulk.STATO_RESPINTA); pdg.setDt_approvazione(DateUtils.dataContabile(EJBCommonServices.getServerDate(), CNRUserContext.getEsercizio(userContext))); pdg.setToBeUpdated(); Pdg_variazioneHome testataHome = (Pdg_variazioneHome)getHome(userContext, Pdg_variazioneBulk.class); try { MessaggioHome messHome = (MessaggioHome)getHome(userContext,MessaggioBulk.class); UtenteHome utenteHome = (UtenteHome)getHome(userContext,UtenteBulk.class); for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next(); for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(ass_pdg.getCd_centro_responsabilita()).iterator();i.hasNext();){ UtenteBulk utente = (UtenteBulk)i.next(); MessaggioBulk messaggio = generaMessaggio(userContext,utente,pdg,Pdg_variazioneBulk.STATO_RESPINTA); super.creaConBulk(userContext, messaggio); } } } catch (IntrospectionException e) { throw new ComponentException(e); } catch (PersistencyException e) { throw new ComponentException(e); } super.modificaConBulk(userContext, pdg); aggiornaLimiteSpesa(userContext, pdg); return pdg; } /** * 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; Pdg_variazioneBulk var = (Pdg_variazioneBulk) bulk; if (var.getStato().compareTo(Pdg_variazioneBulk.STATO_PROPOSTA_DEFINITIVA)==0) stato_prec=Pdg_variazioneBulk.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); } } /** * Inizializza con valori di Default i campi delle tabelle coinvolte eventualmente * non valorizzati dall'utente * * Pre-post-conditions: * * @param oggettobulk l'OggettoBulk da eliminare * @return void * **/ protected void inizializzaValoriDefaultCampi(OggettoBulk oggettobulk) { Pdg_variazioneBulk pdg = (Pdg_variazioneBulk)oggettobulk; for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next(); if (ass_pdg.getIm_entrata()==null) ass_pdg.setIm_entrata(Utility.ZERO); if (ass_pdg.getIm_spesa()==null) ass_pdg.setIm_spesa(Utility.ZERO); } } protected void inizializzaSommeDiSpesa(UserContext userContext, Pdg_variazioneBulk pdg) throws ComponentException, IntrospectionException, PersistencyException{ Pdg_variazioneHome testataHome = (Pdg_variazioneHome)getHome(userContext, Pdg_variazioneBulk.class); for (java.util.Iterator spesa = testataHome.findDettagliSpesaVariazioneGestionale(pdg).iterator();spesa.hasNext();){ Pdg_variazione_riga_gestBulk spesa_det = (Pdg_variazione_riga_gestBulk)spesa.next(); if (!spesa_det.isDettaglioScaricato()) { pdg.setSomma_spesa_var_piu(pdg.getSomma_spesa_var_piu().add( (sommaVariazioniPos(spesa_det.getIm_spese_gest_accentrata_int())).add( (sommaVariazioniPos(spesa_det.getIm_spese_gest_accentrata_est())).add( (sommaVariazioniPos(spesa_det.getIm_spese_gest_decentrata_int())).add( (sommaVariazioniPos(spesa_det.getIm_spese_gest_decentrata_est()))))) )); pdg.setSomma_spesa_var_meno(pdg.getSomma_spesa_var_meno().add( (sommaVariazioniNeg(spesa_det.getIm_spese_gest_accentrata_int())).add( (sommaVariazioniNeg(spesa_det.getIm_spese_gest_accentrata_est())).add( (sommaVariazioniNeg(spesa_det.getIm_spese_gest_decentrata_int())).add( (sommaVariazioniNeg(spesa_det.getIm_spese_gest_decentrata_est()))))) )); } } pdg.setSomma_spesa_diff(pdg.getSomma_spesa_diff().add( pdg.getSomma_spesa_var_piu().subtract(pdg.getSomma_spesa_var_meno()).abs() )); pdg.setSomma_costi_diff(pdg.getSomma_costi_diff().add( pdg.getSomma_costi_var_piu().subtract(pdg.getSomma_costi_var_meno()).abs() )); } protected void inizializzaSommeDiEntrata(UserContext userContext, Pdg_variazioneBulk pdg) throws ComponentException, IntrospectionException, PersistencyException{ Pdg_variazioneHome testataHome = (Pdg_variazioneHome)getHome(userContext, Pdg_variazioneBulk.class); for (java.util.Iterator entrate = testataHome.findDettagliEntrataVariazioneGestionale(pdg).iterator();entrate.hasNext();){ Pdg_variazione_riga_gestBulk etr_det = (Pdg_variazione_riga_gestBulk)entrate.next(); if (!etr_det.isDettaglioScaricato()) { pdg.setSomma_entrata_var_piu(pdg.getSomma_entrata_var_piu().add( (sommaVariazioniPos(etr_det.getIm_entrata())) )); pdg.setSomma_entrata_var_meno(pdg.getSomma_entrata_var_meno().add( (sommaVariazioniNeg(etr_det.getIm_entrata())) )); } } pdg.setSomma_entrata_diff(pdg.getSomma_entrata_diff().add( pdg.getSomma_entrata_var_piu().subtract(pdg.getSomma_entrata_var_meno()).abs() )); pdg.setSomma_ricavi_diff(pdg.getSomma_ricavi_diff().add( pdg.getSomma_ricavi_var_piu().subtract(pdg.getSomma_ricavi_var_meno()).abs() )); } /* * Controlli da effettuare per tipo di variazione gestionale: * * STORNO_SPESA_STESSO_ISTITUTO: * le righe di variazione possono essere solo per la spesa ed il saldo algebrico pari a zero. * I CdR chiamati a partecipare possono essere solo quelli appartenenti al CDS che ha aperto * la variazione. * STO_E_CDS: le righe di variazione possono essere solo per l'entrata ed il saldo algebrico pari a zero. * I CdR chiamati a partecipare possono essere solo quelli appartenenti al CDS che ha aperto * la variazione. * STO_S_TOT: le righe di variazione possono essere solo per la spesa ed il saldo algebrico pari a zero. * I CdR chiamati a partecipare possono anche appartenere a CDS diversi da quello che ha aperto * la variazione. * STO_E_TOT: le righe di variazione possono essere solo per l'entrata ed il saldo algebrico pari a zero. * I CdR chiamati a partecipare possono anche appartenere a CDS diversi da quello che ha aperto * la variazione. * VAR_PIU_CDS: le righe di variazione devono essere sia di entrata che di spesa (obbligatoriamente), * gli importi solo positivi e uguali tra entrata e spesa. * Inoltre i CdR chiamati a partecipare devono essere solo quelli appartenenti al CDS che ha * aperto la variazione. * VAR_MENO_CDS: le righe di variazione devono essere sia di entrata che di spesa (obbligatoriamente), * gli importi solo negativi e uguali tra entrata e spesa. * Inoltre i CdR chiamati a partecipare devono essere solo quelli appartenenti al CDS che ha * aperto la variazione. * VAR_PIU_TOT: le righe di variazione devono essere sia di entrata che di spesa (obbligatoriamente), * gli importi solo positivi e uguali tra entrata e spesa. * I CdR chiamati a partecipare possono anche appartenere a CDS diversi da quello che ha * aperto la variazione. * VAR_MENO_TOT: le righe di variazione devono essere sia di entrata che di spesa (obbligatoriamente), * gli importi solo negativi e uguali tra entrata e spesa. * I CdR chiamati a partecipare possono anche appartenere a CDS diversi da quello che ha aperto * la variazione. */ protected void validaDettagliEntrataSpesa(UserContext usercontext, OggettoBulk oggettobulk) throws ComponentException { try { Pdg_variazioneBulk pdg = (Pdg_variazioneBulk)oggettobulk; Ass_pdg_variazione_cdrHome testataHome = (Ass_pdg_variazione_cdrHome)getHome(usercontext, Ass_pdg_variazione_cdrBulk.class); BigDecimal totImportoEntrataPositivo = Utility.ZERO; BigDecimal totImportoEntrataNegativo = Utility.ZERO; BigDecimal totImportoSpesaPositivo = Utility.ZERO; BigDecimal totImportoSpesaNegativo = Utility.ZERO; BigDecimal totSommaEntrata = Utility.ZERO; BigDecimal totSommaSpesa = Utility.ZERO; BigDecimal impTotaleEntrateDaPrel = Utility.ZERO; BigDecimal impTotaleSpesePrel = Utility.ZERO; int contaRigheEntrata = Utility.ZERO.intValue(); int contaRigheSpesa = Utility.ZERO.intValue(); if (Optional.of(pdg).filter(el->el.isMotivazioneTrasferimentoAutorizzato()).isPresent() && !pdg.getCentro_responsabilita().isCdrAC()) throw new ApplicationException("Variazione di tipo 'Trasferimento in deroga' consentita solo alla UO Ente."); boolean existDettPersonale = true; String cdrPersonale = null; if (Optional.of(pdg).filter(el->el.isMotivazioneVariazionePersonale()).isPresent()) { 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; } boolean existDettArea = true; if (Optional.of(pdg).filter(el->el.isMotivazioneTrasferimentoArea()).isPresent()) existDettArea = false; for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next(); existDettPersonale = existDettPersonale||cdrPersonale.equals(ass_pdg.getCd_centro_responsabilita()); existDettArea = existDettArea||ass_pdg.getCentro_responsabilita().getUnita_padre().isUoArea(); if (pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_SPESA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_ENTRATA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_POSITIVA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_NEGATIVA_STESSO_ISTITUTO)) if (!pdg.getCentro_responsabilita().getCd_cds().equals(ass_pdg.getCentro_responsabilita().getCd_cds())) throw new ApplicationException("In un variazione di tipo 'Storno\\Variazione Stesso Istituto' i CDR " + "partecipanti devono appartenere allo stesso istituto del CDR proponente (" + pdg.getCentro_responsabilita().getCd_cds() + ")"); //Calcolo il totale delle entrate per il CDR selezionato e lo confronto con il totale //assegnato BigDecimal sommaEntrata = Utility.ZERO; for (java.util.Iterator entrate = testataHome.findDettagliEntrataVariazioneGestionale(ass_pdg).iterator();entrate.hasNext();){ Pdg_variazione_riga_gestBulk etr_det = (Pdg_variazione_riga_gestBulk)entrate.next(); sommaEntrata = sommaEntrata.add(etr_det.getIm_variazione()); contaRigheEntrata = ++contaRigheEntrata; if (etr_det.getIm_variazione().compareTo(Utility.ZERO)>0) totImportoEntrataPositivo = totImportoEntrataPositivo.add(etr_det.getIm_variazione()); else totImportoEntrataNegativo = totImportoEntrataNegativo.add(etr_det.getIm_variazione()); } //Aggiorno il totalizzatore complessivo totSommaEntrata = totSommaEntrata.add(sommaEntrata); if (ass_pdg.getIm_entrata() != null){ if(ass_pdg.getIm_entrata().compareTo(sommaEntrata) < 0) throw new ApplicationException("La Somma dei dettagli di entrata ("+new it.cnr.contab.util.EuroFormat().format(sommaEntrata)+")"+ "\n" + "per il Cdr "+ ass_pdg.getCd_centro_responsabilita()+ " supera la quota di entrata assegnata di "+ new it.cnr.contab.util.EuroFormat().format(sommaEntrata.subtract(ass_pdg.getIm_entrata()))); } //Calcolo il totale delle spese per il CDR selezionato e lo confronto con il totale //assegnato BigDecimal sommaSpesa = Utility.ZERO; for (java.util.Iterator spese = testataHome.findDettagliSpesaVariazioneGestionale(ass_pdg).iterator();spese.hasNext();){ Pdg_variazione_riga_gestBulk spesa_det = (Pdg_variazione_riga_gestBulk)spese.next(); sommaSpesa = sommaSpesa.add(spesa_det.getIm_variazione()); contaRigheSpesa = ++contaRigheSpesa; if (spesa_det.getIm_variazione().compareTo(Utility.ZERO)>0) totImportoSpesaPositivo = totImportoSpesaPositivo.add(spesa_det.getIm_variazione()); else totImportoSpesaNegativo = totImportoSpesaNegativo.add(spesa_det.getIm_variazione()); if (!existDettPersonale) { Elemento_voceBulk voce = (Elemento_voceBulk)getHome(usercontext, Elemento_voceBulk.class).findByPrimaryKey(spesa_det.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()); } } //Aggiorno il totalizzatore complessivo totSommaSpesa = totSommaSpesa.add(sommaSpesa); if (ass_pdg.getIm_spesa() != null){ if(ass_pdg.getIm_spesa().compareTo(sommaSpesa) < 0) throw new ApplicationException("La Somma dei dettagli di spesa ("+new it.cnr.contab.util.EuroFormat().format(sommaSpesa)+")"+ "\n" + "per il Cdr "+ ass_pdg.getCd_centro_responsabilita()+ " supera la quota di spesa assegnata di "+ new it.cnr.contab.util.EuroFormat().format(sommaSpesa.subtract(ass_pdg.getIm_spesa()))); } } if (totSommaEntrata.compareTo(totSommaSpesa)!=0 && !isUoPdgUoEnte(usercontext, pdg)) throw new ApplicationException("Il totale delle variazioni di spesa ("+new it.cnr.contab.util.EuroFormat().format(totSommaSpesa)+")"+ "\n" + "non è uguale al totale delle variazioni di entrata ("+ new it.cnr.contab.util.EuroFormat().format(totSommaEntrata)+")"); 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+")."); if (!existDettArea) throw new ApplicationException("In un variazione di tipo 'Trasferimento ad Aree' occorre scegliere tra i CDR partecipanti " + "almeno uno di tipo Area."); if (pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_SPESA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_SPESA_ISTITUTI_DIVERSI)) { if (contaRigheEntrata>Utility.ZERO.intValue()) throw new ApplicationException("Non è possibile inserire dettagli di entrata in un variazione di tipo 'Storno Spesa'"); if (totSommaSpesa.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Storno Spesa' il saldo algebrico deve essere nullo"); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_ENTRATA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.STORNO_ENTRATA_ISTITUTI_DIVERSI)) { if (contaRigheSpesa>Utility.ZERO.intValue()) throw new ApplicationException("Non è possibile inserire dettagli di spesa in un variazione di tipo 'Storno Entrata'"); if (totSommaEntrata.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Storno Entrata' il saldo algebrico deve essere nullo"); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.PRELIEVO_FONDI)) { if (contaRigheEntrata>Utility.ZERO.intValue()) throw new ApplicationException("Non è possibile inserire dettagli di entrata in un variazione di tipo 'Prelievo Fondi'"); if (totSommaSpesa.compareTo(Utility.ZERO)!=1) throw new ApplicationException("In un variazione di tipo 'Prelievo da Fondi' il saldo algebrico deve essere positivo"); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_NEGATIVA_FONDI)) { if (contaRigheSpesa>Utility.ZERO.intValue()) throw new ApplicationException("Non è possibile inserire dettagli di spesa in un variazione di tipo 'Decremento Fondi'"); if (totImportoEntrataPositivo.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Decremento Fondi' non è possibile inserire dettagli di entrata con importi positivi."); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_POSITIVA_FONDI)) { if (contaRigheSpesa>Utility.ZERO.intValue()) throw new ApplicationException("Non è possibile inserire dettagli di spesa in un variazione di tipo 'Incremento\\Decremento Fondi'"); if (totImportoEntrataNegativo.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Incremento Fondi' non è possibile inserire dettagli di entrata con importi negativi."); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_POSITIVA_STESSO_ISTITUTO) || pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_POSITIVA_ISTITUTI_DIVERSI)) { if (contaRigheSpesa==Utility.ZERO.intValue()|| contaRigheEntrata==Utility.ZERO.intValue()) throw new ApplicationException("E' necessario inserire sia dettagli di spesa che di entrata in un variazione di tipo 'Variazione Positiva'"); if (totImportoSpesaNegativo.compareTo(Utility.ZERO)!=0 || totImportoEntrataNegativo.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Variazione Positiva' non è possibile inserire dettagli di entrata/spesa con importi negativi."); CdrBulk cdr_prel=null; Pdg_variazioneHome pdgHome = (Pdg_variazioneHome)getHome(usercontext, Pdg_variazioneBulk.class); //Calcolo il totale delle entrate for (java.util.Iterator entrate = pdgHome.findDettagliEntrateVariazioneGestionaleSoggettePrelievo(pdg).iterator();entrate.hasNext();){ Pdg_variazione_riga_gestBulk etr_det = (Pdg_variazione_riga_gestBulk)entrate.next(); Elemento_voceBulk ev = (Elemento_voceBulk)getHome(usercontext, Elemento_voceBulk.class).findByPrimaryKey(etr_det.getElemento_voce()); if(etr_det.getElemento_voce()!=null &&etr_det.getElemento_voce().getPerc_prelievo_pdgp_entrate().compareTo(ZERO)!=0){ CdrBulk cdr = (CdrBulk)getHome(usercontext, CdrBulk.class).findByPrimaryKey(etr_det.getCdr_assegnatario()); cdr.setUnita_padre((Unita_organizzativaBulk)getHome(usercontext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cdr.getCd_unita_organizzativa()))); if(!etr_det.getCdr_assegnatario().isCdrSAC()){ impTotaleEntrateDaPrel = impTotaleEntrateDaPrel.add(etr_det.getIm_entrata().multiply(ev.getPerc_prelievo_pdgp_entrate()).divide(new BigDecimal("100"),2,BigDecimal.ROUND_HALF_DOWN)); cdr_prel=etr_det.getCdr_assegnatario(); } } } //Calcolo il totale delle spese for (java.util.Iterator spese = pdgHome.findDettagliSpesaVariazioneGestionalePrelievo(pdg).iterator();spese.hasNext();){ Pdg_variazione_riga_gestBulk spesa_det = (Pdg_variazione_riga_gestBulk)spese.next(); if(cdr_prel!= null && cdr_prel.getCd_centro_responsabilita()!=null && spesa_det.getCdr_assegnatario().getCd_centro_responsabilita().compareTo(cdr_prel.getCd_centro_responsabilita())==0) impTotaleSpesePrel = impTotaleSpesePrel.add(spesa_det.getIm_spese_gest_accentrata_est()).add(spesa_det.getIm_spese_gest_decentrata_est()); } if (impTotaleEntrateDaPrel.compareTo(ZERO)!=0){ //if(impTotaleSpesePrel.compareTo(ZERO)!=0){ if(impTotaleEntrateDaPrel.compareTo(impTotaleSpesePrel)!=0) throw new ApplicationException("Il contributo per l'attività ordinaria per il cdr "+cdr_prel.getCd_centro_responsabilita()+" è pari a "+ new it.cnr.contab.util.EuroFormat().format(impTotaleEntrateDaPrel)+ ". Impossibile salvare, poichè è stato imputato sulla voce dedicata l'importo di "+new it.cnr.contab.util.EuroFormat().format(impTotaleSpesePrel)+"."); //} } if (totSommaEntrata.compareTo(totSommaSpesa)!=0) throw new ApplicationException("In un variazione di tipo 'Variazione Positiva' il totale delle variazioni di spesa ("+ new it.cnr.contab.util.EuroFormat().format(totSommaSpesa)+")"+ "\n" + "deve essere uguale al totale delle variazioni di entrata ("+ new it.cnr.contab.util.EuroFormat().format(totSommaEntrata)+")"); } else if (pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_NEGATIVA_STESSO_ISTITUTO)|| pdg.getTipologia().equals(Tipo_variazioneBulk.VARIAZIONE_NEGATIVA_ISTITUTI_DIVERSI)) { if (contaRigheSpesa==Utility.ZERO.intValue() || contaRigheEntrata==Utility.ZERO.intValue()) throw new ApplicationException("E' necessario inserire sia dettagli di spesa che di entrata in un variazione di tipo 'Variazione Negativa'"); if (totImportoSpesaPositivo.compareTo(Utility.ZERO)!=0 || totImportoEntrataPositivo.compareTo(Utility.ZERO)!=0) throw new ApplicationException("In un variazione di tipo 'Variazione Negativa' non è possibile inserire dettagli di entrata/spesa con importi positivi."); if (totSommaEntrata.compareTo(totSommaSpesa)!=0) { throw new ApplicationException("In un variazione di tipo 'Variazione Negativa' il totale delle variazioni di spesa ("+ new it.cnr.contab.util.EuroFormat().format(totSommaSpesa)+")"+ "\n" + "deve essere uguale al totale delle variazioni di entrata ("+ new it.cnr.contab.util.EuroFormat().format(totSommaEntrata)+")"); } } } catch (PersistencyException e) { throw new ComponentException(e); } } public void inizializzaSommeCdR(UserContext userContext, Pdg_variazioneBulk pdg) throws ComponentException{ try { Ass_pdg_variazione_cdrHome testataHome = (Ass_pdg_variazione_cdrHome)getHome(userContext, Ass_pdg_variazione_cdrBulk.class); for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next(); BigDecimal sommaEntrata = Utility.ZERO; for (java.util.Iterator entrate = testataHome.findDettagliEntrataVariazioneGestionale(ass_pdg).iterator();entrate.hasNext();){ Pdg_variazione_riga_gestBulk etr_det = (Pdg_variazione_riga_gestBulk)entrate.next(); sommaEntrata = (sommaEntrata.add( (etr_det.getIm_entrata()) )); } ass_pdg.setEntrata_ripartita(sommaEntrata); ass_pdg.setEntrata_diff(nvl(ass_pdg.getIm_entrata()).subtract(sommaEntrata)); BigDecimal sommaSpesa = Utility.ZERO; for (java.util.Iterator spese = testataHome.findDettagliSpesaVariazioneGestionale(ass_pdg).iterator();spese.hasNext();){ Pdg_variazione_riga_gestBulk spesa_det = (Pdg_variazione_riga_gestBulk)spese.next(); sommaSpesa = (sommaSpesa.add( (spesa_det.getIm_spese_gest_accentrata_int()).add( (spesa_det.getIm_spese_gest_accentrata_est()).add( (spesa_det.getIm_spese_gest_decentrata_int()).add( (spesa_det.getIm_spese_gest_decentrata_est())))) )); } ass_pdg.setSpesa_ripartita(sommaSpesa); ass_pdg.setSpesa_diff(nvl(ass_pdg.getIm_spesa()).subtract(sommaSpesa)); } } catch (PersistencyException e) { throw new ComponentException(e); } } /** * Tutti controlli superati * PreCondition: * Viene richiesto il ribaltamento dei costi del Piano di Gestione del CdR specificato all'area di ricerca a cui afferisce. Il bilancio del CNR è già stato approvato * PostCondition: * La procedura Oracle CNRCTB053.ribaltaSuAreaPDG viene eseguita per l'anno di esercizio ed il CdR specificati. */ protected void ribaltaCostiPdGArea(UserContext userContext,Pdg_variazioneBulk pdg) throws it.cnr.jada.comp.ApplicationException, it.cnr.jada.comp.ComponentException { try { LoggableStatement cs = new LoggableStatement(getConnection( userContext ), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB053.ribaltaSuAreaPDG_da_gest_var(?,?,?)}",false,this.getClass()); cs.setObject( 1, pdg.getEsercizio() ); cs.setObject( 2, pdg.getPg_variazione_pdg() ); cs.setObject( 3, 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); } } public void controllaBilancioPreventivoCdsApprovato(UserContext userContext,CdrBulk cdr) throws ComponentException { try { Unita_organizzativaBulk uo = (Unita_organizzativaBulk)getHome(userContext,Unita_organizzativaBulk.class).findByPrimaryKey(cdr.getUnita_padre()); Pdg_esercizioBulk bilancio = (Pdg_esercizioBulk)getHome(userContext,Pdg_esercizioBulk.class).findByPrimaryKey(new Pdg_esercizioBulk( it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext), cercaCdrPrimoLivello(userContext, cdr).getCd_centro_responsabilita())); if (bilancio == null) throw new it.cnr.jada.comp.ApplicationException("Piano di Gestione inesistente per il cds "+uo.getCd_unita_padre()); if (!bilancio.STATO_CHIUSURA_GESTIONALE_CDR.equalsIgnoreCase(bilancio.getStato())) throw new it.cnr.jada.comp.ApplicationException("Il Piano di Gestione del cdr "+cdr.getCd_centro_responsabilita()+" deve essere approvato per registrare le variazioni"); } catch(Throwable e) { throw handleException(e); } } public String getDesTipoVariazione(UserContext userContext, Pdg_variazioneBulk tipovar) throws ComponentException { try { if (tipovar.getTipo_variazione()!=null) { if (tipovar.getTipo_variazione().getDs_tipo_variazione()!=null) return tipovar.getTipo_variazione().getDs_tipo_variazione(); } return null; } catch(Throwable e) { throw handleException(e); } } public SQLBuilder selectCentro_responsabilitaByClause (UserContext userContext, Ass_pdg_variazione_cdrBulk ass_pdg, CdrBulk cdr, CompoundFindClause clause) throws ComponentException, PersistencyException{ SQLBuilder sql = getHome(userContext, CdrBulk.class,"V_CDR_VALIDO").createSQLBuilder(); sql.addSQLClause("AND","V_CDR_VALIDO.ESERCIZIO",sql.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext)); if (ass_pdg.getPdg_variazione().isVariazioneInternaIstituto()) { sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA"); sql.addSQLJoin("V_CDR_VALIDO.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO"); sql.addSQLJoin("V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT"); sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDS",sql.EQUALS,ass_pdg.getPdg_variazione().getCentro_responsabilita().getCd_cds()); } else if (!ass_pdg.getPdg_variazione().getCentro_responsabilita().getUnita_padre().isUoArea()) { sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA"); sql.addSQLJoin("V_CDR_VALIDO.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO"); sql.addSQLJoin("V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT"); Parametri_cnrBulk parametriCnr = (Parametri_cnrBulk)getHome(userContext,Parametri_cnrBulk.class).findByPrimaryKey(new Parametri_cnrBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext))); if (parametriCnr==null || !parametriCnr.getFl_nuovo_pdg().booleanValue()){ sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA B"); sql.addSQLJoin("B.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO"); sql.addSQLJoin("B.CD_ROOT", "V_STRUTTURA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA"); sql.addSQLClause("AND","B.CD_TIPO_UNITA",sql.NOT_EQUALS,Tipo_unita_organizzativaHome.TIPO_UO_AREA); } } if(clause != null) sql.addClause(clause); sql.addOrderBy("CD_CENTRO_RESPONSABILITA"); return sql; } public SQLBuilder selectCentro_responsabilitaByClause (UserContext userContext, Pdg_variazioneBulk pdg, CdrBulk cdr, CompoundFindClause clause) throws ComponentException, PersistencyException{ SQLBuilder sql = getHome(userContext, CdrBulk.class,"V_CDR_VALIDO").createSQLBuilder(); sql.addSQLClause("AND","V_CDR_VALIDO.ESERCIZIO",sql.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext)); if(clause != null) sql.addClause(clause); sql.addOrderBy("CD_CENTRO_RESPONSABILITA"); return sql; } public it.cnr.jada.bulk.OggettoBulk generaVariazioneBilancio(UserContext userContext, it.cnr.jada.bulk.OggettoBulk oggettoBulk) throws ComponentException{ Pdg_variazioneBulk pdgVar = (Pdg_variazioneBulk)oggettoBulk; LoggableStatement cs = null; try { cs = new LoggableStatement(getConnection(userContext), "{call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "CNRCTB053.genera_varente_da_Var_Pdg(?,?,?,?,?,?,?)}",false,this.getClass()); cs.setObject(1, pdgVar.getEsercizio() ); cs.setObject(2, pdgVar.getPg_variazione_pdg() ); 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 ){ pdgVar.setCds_var_bil(cds_var_bil); pdgVar.setEs_var_bil(new Integer(cs.getString(5))); pdgVar.setTi_app_var_bil(new Character(cs.getString(6).charAt(0))); pdgVar.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 pdgVar; } public it.cnr.jada.bulk.OggettoBulk esitaVariazioneBilancio(UserContext userContext, it.cnr.jada.bulk.OggettoBulk oggettoBulk) throws ComponentException{ Pdg_variazioneBulk pdgVar = (Pdg_variazioneBulk)oggettoBulk; if (pdgVar.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, pdgVar.getEs_var_bil() ); cs.setObject(2, pdgVar.getCds_var_bil()); cs.setObject(3, pdgVar.getTi_app_var_bil().toString() ); cs.setObject(4, pdgVar.getPg_var_bil() ); cs.setObject(5, CNRUserContext.getUser(userContext) ); cs.executeQuery(); }catch (SQLException e) { try { SQLExceptionHandler sqlException = SQLExceptionHandler.getInstance(); PersistencyException eccezione = sqlException.handleSQLException(e, pdgVar); String soggetto = "Si è verificato un errore durante l'approvazione della variazione sul bilancio dell'ente "+pdgVar.getEs_var_bil()+"/"+pdgVar.getPg_var_bil(); String preText = "Si è verificato il seguente errore durante l'approvazione della variazione sul bilancio dell'ente "+pdgVar.getEs_var_bil()+"/"+pdgVar.getPg_var_bil() + "
" + "generata in automatico a seguito della Variazione al PdG n°"+pdgVar.getPg_variazione_pdg()+ " del "+ pdgVar.getEsercizio()+".

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

"+ "La Variazione al bilancio dell'Ente rimarrà pertanto PROVVISORIA.
"; generaEMAIL(userContext, pdgVar, soggetto, preText, null,"ERR"); pdgVar.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 pdgVar; } private void generaEMAIL(UserContext userContext, Pdg_variazioneBulk pdgVar, 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: "+pdgVar.getCentro_responsabilita().getCd_ds_cdr()+"
"; text = text +"Tipologia: "+pdgVar.getTipo_variazione().getTi_tipologieKeys().get(pdgVar.getTipologia())+"
"; if (pdgVar.getTipologia_fin() != null) text = text + pdgVar.getTi_tipologia_finKeys().get(pdgVar.getTipologia_fin())+"
"; text = text +"Data di approvazione: "+formatterDate.format(pdgVar.getDt_approvazione())+"
"; text = text +"
"; text = text +"CdR abilitati a concorrervi:
"; String addressTO = null; for (java.util.Iterator j=pdgVar.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_var = (Ass_pdg_variazione_cdrBulk)j.next(); text = text + "CdR:"+ass_var.getCentro_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.findUtenteMancataApprovazioneVariazioniBilancioEnteComp().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(pdgVar).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) { } } } public void aggiungiDettaglioVariazione(UserContext usercontext, Pdg_variazioneBulk pdgVar, V_assestatoBulk saldo)throws ComponentException { try { //Verifico innanzitutto se esiste l'associazione con il CDR altrimenti la creo Ass_pdg_variazione_cdrHome AssHome = (Ass_pdg_variazione_cdrHome)getHome(usercontext, Ass_pdg_variazione_cdrBulk.class); Ass_pdg_variazione_cdrBulk ass_cdrOld = new Ass_pdg_variazione_cdrBulk(pdgVar.getEsercizio(), pdgVar.getPg_variazione_pdg(), saldo.getCd_centro_responsabilita()); Ass_pdg_variazione_cdrBulk ass_cdrNew = (Ass_pdg_variazione_cdrBulk)AssHome.findByPrimaryKey(ass_cdrOld); if (ass_cdrNew == null){ ass_cdrOld.setIm_spesa(Utility.ZERO); ass_cdrOld.setToBeCreated(); insertBulk(usercontext,ass_cdrOld); ass_cdrNew = ass_cdrOld; } //Ora posso inserire la riga di variazione Pdg_variazione_riga_gestBulk pdgVarRigaGest = new Pdg_variazione_riga_gestBulk(); if (saldo.getTi_gestione().equals(CostantiTi_gestione.TI_GESTIONE_ENTRATE)) ass_cdrOld.addToRigheVariazioneEtrGest(pdgVarRigaGest); else ass_cdrOld.addToRigheVariazioneSpeGest(pdgVarRigaGest); getHomeCache(usercontext).fetchAll(usercontext); pdgVarRigaGest.setLinea_attivita(new WorkpackageBulk(saldo.getCd_centro_responsabilita(),saldo.getCd_linea_attivita())); pdgVarRigaGest.setElemento_voce(new Elemento_voceBulk(saldo.getCd_elemento_voce(),saldo.getEsercizio(),saldo.getTi_appartenenza(),saldo.getTi_gestione())); pdgVarRigaGest.setIm_variazione(saldo.getImp_da_assegnare()); pdgVarRigaGest.setArea((CdsBulk)getHome(usercontext,CdsBulk.class).findByPrimaryKey(new CdsBulk(ass_cdrNew.getCentro_responsabilita().getCd_cds()))); pdgVarRigaGest.setToBeCreated(); insertBulk(usercontext,pdgVarRigaGest); } catch (PersistencyException e) { throw new ComponentException(e); } } public SQLBuilder selectAssestatoEntrateByClause (UserContext userContext, Pdg_variazioneBulk pdgVar, V_assestatoBulk assestato, CompoundFindClause clause) throws ComponentException, PersistencyException{ SQLBuilder sql = getHome(userContext, V_assestatoBulk.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_ENTRATE); sql.addClause("AND", "ti_appartenenza", SQLBuilder.NOT_EQUALS, "C"); sql.addClause("AND", "esercizio_res", SQLBuilder.EQUALS, pdgVar.getEsercizio()); if (pdgVar.getTipologia_fin() != null){ sql.addTableToHeader("NATURA"); sql.addTableToHeader("LINEA_ATTIVITA"); sql.addSQLJoin("V_ASSESTATO.CD_LINEA_ATTIVITA","LINEA_ATTIVITA.CD_LINEA_ATTIVITA"); sql.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA","LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA"); sql.addSQLJoin("LINEA_ATTIVITA.CD_NATURA","NATURA.CD_NATURA"); sql.addSQLClause("AND","NATURA.TIPO",SQLBuilder.EQUALS,pdgVar.getTipologia_fin()); } if (pdgVar.getCentro_responsabilita() != null){ sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); }else{ if (pdgVar.getCentro_responsabilita().getLivello().intValue() > 1){ sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); }else{ if (!pdgVar.getTipo_variazione().isMovimentoSuFondi()) sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); else{ SQLBuilder sqlStruttura = getHome(userContext, V_struttura_organizzativaBulk.class).createSQLBuilder(); sqlStruttura.addSQLJoin("V_ASSESTATO.ESERCIZIO","V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO"); sqlStruttura.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA","V_STRUTTURA_ORGANIZZATIVA.CD_CENTRO_RESPONSABILITA"); sqlStruttura.addSQLClause("AND", "V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); sql.addSQLExistsClause("AND",sqlStruttura); } } } return sql; } public SQLBuilder selectAssestatoSpeseByClause (UserContext userContext, Pdg_variazioneBulk pdgVar, V_assestatoBulk assestato, CompoundFindClause clause) throws ComponentException, PersistencyException{ SQLBuilder sql = getHome(userContext, V_assestatoBulk.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, pdgVar.getEsercizio()); if (pdgVar.getTipologia_fin() != null){ sql.addTableToHeader("NATURA"); sql.addTableToHeader("LINEA_ATTIVITA"); sql.addSQLJoin("V_ASSESTATO.CD_LINEA_ATTIVITA","LINEA_ATTIVITA.CD_LINEA_ATTIVITA"); sql.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA","LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA"); sql.addSQLJoin("LINEA_ATTIVITA.CD_NATURA","NATURA.CD_NATURA"); sql.addSQLClause("AND","NATURA.TIPO",SQLBuilder.EQUALS,pdgVar.getTipologia_fin()); } if (pdgVar.getCentro_responsabilita() != null){ sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); }else{ if (pdgVar.getCentro_responsabilita().getLivello().intValue() > 1){ sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); }else{ if (!pdgVar.getTipo_variazione().isMovimentoSuFondi()) sql.addClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); else{ SQLBuilder sqlStruttura = getHome(userContext, V_struttura_organizzativaBulk.class).createSQLBuilder(); sqlStruttura.addSQLJoin("V_ASSESTATO.ESERCIZIO","V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO"); sqlStruttura.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA","V_STRUTTURA_ORGANIZZATIVA.CD_CENTRO_RESPONSABILITA"); sqlStruttura.addSQLClause("AND", "V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA", SQLBuilder.EQUALS, pdgVar.getCentro_responsabilita().getCd_centro_responsabilita()); sql.addSQLExistsClause("AND",sqlStruttura); } } } return sql; } private void checkDispAssestatoCdrGAEVoce(UserContext userContext, Pdg_variazioneBulk pdgVariazione, String nomeAction) throws ComponentException { if (pdgVariazione.isCheckDispAssestatoCdrGAEVoceEseguito()) return; Pdg_variazioneHome detHome = (Pdg_variazioneHome)getHome(userContext,Pdg_variazioneBulk.class); V_assestatoHome assHome = (V_assestatoHome)getHome(userContext,V_assestatoBulk.class); BigDecimal totVariazioneEtr = new BigDecimal(0); BigDecimal totVariazioneSpe = new BigDecimal(0); Pdg_variazione_riga_gestBulk rigaDB; String messaggio = ""; try{ for (java.util.Iterator dett = detHome.findDettagliVariazioneGestionale(pdgVariazione).iterator();dett.hasNext();){ Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)dett.next(); if (rigaVar.getTi_gestione().equals(Elemento_voceHome.GESTIONE_ENTRATE)) totVariazioneEtr = totVariazioneEtr.add(rigaVar.getIm_variazione()); else totVariazioneSpe = totVariazioneSpe.add(rigaVar.getIm_variazione()); totVariazioneEtr = totVariazioneEtr.add(rigaVar.getIm_variazione()); V_assestatoBulk assestato = (V_assestatoBulk)assHome.findByPrimaryKey( new V_assestatoBulk(rigaVar.getEsercizio(), rigaVar.getEsercizio(), rigaVar.getCd_cdr_assegnatario(), rigaVar.getCd_linea_attivita(), rigaVar.getTi_appartenenza(), rigaVar.getTi_gestione(), rigaVar.getCd_elemento_voce())); if (assestato==null || assestato.getAssestato_finale().compareTo(Utility.ZERO) == -1) { if (messaggio!=null && messaggio.length()>0) messaggio = messaggio+ "
"; messaggio = messaggio + "La disponibilità del CdR "+rigaVar.getCd_cdr_assegnatario()+ " per la Voce " + rigaVar.getCd_elemento_voce() + " e GAE " + rigaVar.getCd_linea_attivita() + " non è sufficiente a coprire
la variazione che risulta di " + new it.cnr.contab.util.EuroFormat().format(rigaVar.getIm_variazione()) + ".
"; } } /* * Se è una variazione di tipo "Movimentazione da Fondi" effettuo la verifica che il Fondo prescelto * abbia una disponibilità sufficiente a coprire la variazione */ if (pdgVariazione.getTipo_variazione().isMovimentoSuFondi()) { it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = 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_ATTIVITA_SPESA_ENTE ); if ( config == null ) throw new ApplicationException("Configurazione CNR: manca la definizione del GAE SPESA ENTE"); V_assestatoBulk assestato = (V_assestatoBulk)assHome.findByPrimaryKey( new V_assestatoBulk(pdgVariazione.getEsercizio(), pdgVariazione.getEsercizio(), pdgVariazione.getCd_centro_responsabilita(), config.getVal02(), pdgVariazione.getTi_appartenenza(), pdgVariazione.getTi_gestione(), pdgVariazione.getCd_elemento_voce())); if (assestato==null || assestato.getAssestato_finale().subtract(totVariazioneSpe).compareTo(Utility.ZERO) == -1) { if (messaggio!=null && messaggio.length()>0) messaggio = messaggio+ "
"; messaggio = messaggio + "La Voce del Fondo " + pdgVariazione.getCd_elemento_voce() + " del CdR "+pdgVariazione.getCd_centro_responsabilita() + " non è sufficiente a coprire la variazione che risulta di " + new it.cnr.contab.util.EuroFormat().format(totVariazioneSpe) + ".
"; } } } catch (PersistencyException e) { throw new ComponentException(e); }catch (RemoteException e) { throw new ComponentException(e); } catch (EJBException e) { throw new ComponentException(e); } if (!messaggio.equals("")) throw handleException( new OptionRequestException(nomeAction, "Attenzione!
"+messaggio+"
Vuoi continuare per il momento?")); } private void controllaQuadraturaImportiAree(UserContext userContext, Pdg_variazioneBulk pdgVar) throws ComponentException { try { SQLBuilder sql = sqlImportiAree(userContext, pdgVar); String area = null; BigDecimal impSpe = Utility.ZERO; BigDecimal impEtr = Utility.ZERO; try { java.sql.ResultSet rs = null; LoggableStatement ps = null; try { ps = sql.prepareStatement(getConnection(userContext)); try { rs = ps.executeQuery(); while (rs.next()) { area = rs.getString(1); if (rs.getBigDecimal(2)!= null) impSpe = impSpe.add(rs.getBigDecimal(2)); if (rs.getBigDecimal(3)!= null) impEtr = impEtr.add(rs.getBigDecimal(3)); if (!area.equals(pdgVar.getCd_centro_responsabilita()) && impSpe.compareTo(impEtr)!=0) throw new ApplicationException("L'importo assegnato all'Area "+area+" di parte spese (" + new it.cnr.contab.util.EuroFormat().format(impSpe) + ") è diverso dall'importo assegnato alla stessa Area di parte entrate (" + new it.cnr.contab.util.EuroFormat().format(impEtr) + ")."); } } catch (java.sql.SQLException e) { throw handleSQLException(e); } finally { if (rs != null) try{rs.close();}catch( java.sql.SQLException e ){}; } } finally { if (ps != null) try{ps.close();}catch( java.sql.SQLException e ){}; } } catch (java.sql.SQLException ex) { throw handleException(ex); } } catch (ComponentException e) { throw handleException(e); } } private SQLBuilder sqlImportiAree(UserContext userContext, Pdg_variazioneBulk pdgVar) throws ComponentException { try { Pdg_variazione_riga_gestHome home = (Pdg_variazione_riga_gestHome)getHome(userContext,Pdg_variazione_riga_gestBulk.class); SQLBuilder sql = home.createSQLBuilder(); sql.resetColumns(); sql.addColumn("CD_CDS_AREA"); sql.addColumn("NVL(SUM(NVL(IM_SPESE_GEST_ACCENTRATA_EST,0)" + "+ NVL(IM_SPESE_GEST_ACCENTRATA_INT,0)" + "+ NVL(IM_SPESE_GEST_DECENTRATA_EST,0)" + "+ NVL(IM_SPESE_GEST_DECENTRATA_INT,0)), 0)"); sql.addColumn("NVL(SUM(IM_ENTRATA),0)"); sql.addClause("AND","esercizio",SQLBuilder.EQUALS,pdgVar.getEsercizio()); sql.addClause("AND","pg_variazione_pdg",SQLBuilder.EQUALS,pdgVar.getPg_variazione_pdg()); sql.addSQLClause("AND","substr(cd_cdr_assegnatario,1,3)!=cd_cds_area"); sql.addSQLGroupBy("CD_CDS_AREA") ; return sql; } catch (ComponentException e) { throw handleException(e); } } public SQLBuilder selectElemento_voceByClause (UserContext userContext, Pdg_variazioneBulk pdgVar, Elemento_voceBulk voce, CompoundFindClause clause) throws ComponentException, PersistencyException{ SQLBuilder sql = getHome(userContext, Elemento_voceBulk.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", "fl_voce_fondo", SQLBuilder.EQUALS, Boolean.TRUE); return sql; } public boolean isCdsAbilitatoAdApprovare(UserContext userContext,String cd_cds, Pdg_variazioneBulk pdg) 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_pdg().booleanValue()) return false; if (pdg.getTipologia()!=null) { Tipo_variazioneHome tipoVarHome = (Tipo_variazioneHome)getHome(userContext, Tipo_variazioneBulk.class); Tipo_variazioneBulk tipoVarBulk = (Tipo_variazioneBulk)tipoVarHome.findByPrimaryKey(new Tipo_variazioneBulk(pdg.getEsercizio(), pdg.getTipologia())); if (tipoVarBulk != null) return tipoVarBulk.getTi_approvazione()!=null && tipoVarBulk.getTi_approvazione().equals(Tipo_variazioneBulk.APPROVAZIONE_CDS); } } catch (PersistencyException e) { throw new ComponentException(e); } return false; } /** * Verifica che il CDR associato alla variazione è eliminabile * * Pre-post-conditions: * * @param userContext * @param assBulk l'OggettoBulk della associazione CDR della variazione * @return boolean * **/ public void validaAssociazioneCDRPerCancellazione(UserContext userContext, Ass_pdg_variazione_cdrBulk assBulk) throws ComponentException { try{ Ass_pdg_variazione_cdrHome assHome = (Ass_pdg_variazione_cdrHome)getHome(userContext,Ass_pdg_variazione_cdrBulk.class); if (!assHome.findDettagliEntrataVariazioneGestionale(assBulk).isEmpty() || !assHome.findDettagliSpesaVariazioneGestionale(assBulk).isEmpty()) throw new ComponentException("Non è possibile eliminare l'associazione della variazione con il CDR " + assBulk.getCd_centro_responsabilita() + " in quanto esistono dettagli di entrata/spesa collegati."); } catch (it.cnr.jada.persistency.PersistencyException pe){ throw new ComponentException(pe); } } public String controllaTotPropostoEntrataSpesa(it.cnr.jada.UserContext usercontext,it.cnr.contab.pdg00.bulk.Pdg_variazioneBulk pdg) throws it.cnr.jada.comp.ComponentException { BigDecimal totSommaEntrata = ZERO; BigDecimal totSommaSpesa = ZERO; if (pdg == null || pdg.getAssociazioneCDR() == null) return null; for (java.util.Iterator j=pdg.getAssociazioneCDR().iterator();j.hasNext();){ Ass_pdg_variazione_cdrBulk ass_pdg = (Ass_pdg_variazione_cdrBulk)j.next(); if (ass_pdg.getIm_entrata() != null) { totSommaEntrata = totSommaEntrata.add(ass_pdg.getIm_entrata()); if (pdg.getTipo_variazione().isPrelievoFondi() && ass_pdg.getIm_entrata().compareTo(ZERO)!=0) return ("Non possono essere assegnate quote di entrate in una variazione di tipo 'Prelievo Fondi'."); if (pdg.getTipo_variazione().isRestituzioneFondi() && ass_pdg.getIm_entrata().compareTo(ZERO)!=0) return ("Non possono essere assegnate quote di entrate in una variazione di tipo 'Restituzione Fondi'."); if (pdg.getTipo_variazione().isVariazionePositivaSuFondi() && ass_pdg.getIm_entrata().compareTo(ZERO)==-1) return ("Non possono essere assegnate quote di entrate negative in una variazione di tipo 'Incremento Fondi'."); if (pdg.getTipo_variazione().isVariazioneNegativaSuFondi() && ass_pdg.getIm_entrata().compareTo(ZERO)==1) return ("Non possono essere assegnate quote di entrate positive in una variazione di tipo 'Decremento Fondi'."); } if (ass_pdg.getIm_spesa() != null) { totSommaSpesa = totSommaSpesa.add(ass_pdg.getIm_spesa()); if (pdg.getTipo_variazione().isPrelievoFondi() && ass_pdg.getIm_spesa().compareTo(ZERO)==-1) return ("Non possono essere assegnate quote di spesa negative in una variazione di tipo 'Prelievo Fondi'."); if (pdg.getTipo_variazione().isRestituzioneFondi() && ass_pdg.getIm_spesa().compareTo(ZERO)==1) return ("Non possono essere assegnate quote di spesa positive in una variazione di tipo 'Restituzione Fondi'."); if (pdg.getTipo_variazione().isVariazioneSuFondi() && ass_pdg.getIm_spesa().compareTo(ZERO)!=0) return ("Non possono essere assegnate quote di spesa in una variazione di tipo 'Incremento/Decremento Fondi'."); } } if (!pdg.getTipo_variazione().isMovimentoSuFondi() && totSommaEntrata.compareTo(totSommaSpesa)!=0) { return ("La quota di spesa assegnata ("+new it.cnr.contab.util.EuroFormat().format(totSommaSpesa)+")"+ "\n" + "non è uguale alla quota di entrata assegnata ("+ new it.cnr.contab.util.EuroFormat().format(totSommaEntrata)+")"); } return null; } public it.cnr.jada.bulk.OggettoBulk statoPrecedente( UserContext userContext, it.cnr.jada.bulk.OggettoBulk oggettoBulk) throws ComponentException { Pdg_variazioneBulk var = (Pdg_variazioneBulk) oggettoBulk; var.setStato(Pdg_variazioneBulk.STATO_PROPOSTA_PROVVISORIA); var.setDt_chiusura(null); var.setToBeUpdated(); var = (Pdg_variazioneBulk) super.modificaConBulk(userContext, var); aggiornaLimiteSpesa(userContext, var); return var; } /** * Metodo che verifica se esistono rimodulazioni in stato definitivo/approvato che richiedono variazioni di competenza a quadratura. * In tal caso restituisce un errore. * * @param userContext * @param pdgVariazione La variazione che si sta rendendo definitiva * @throws it.cnr.jada.comp.ComponentException */ private void controllaRimodulazioneProgetto(UserContext userContext, Pdg_variazioneBulk pdgVariazione) throws it.cnr.jada.comp.ComponentException { try { List listCtrlVarPianoEco = new ArrayList(); Pdg_variazioneHome detHome = (Pdg_variazioneHome) getHome(userContext, Pdg_variazioneBulk.class); 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(); 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()); 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(pdgVariazione.getPg_progetto_rimodulazione()).isPresent()) { listCtrlVarPianoEco.stream().filter(el->!el.getProgetto().getPg_progetto().equals(pdgVariazione.getPg_progetto_rimodulazione())) .findFirst().ifPresent(el->{ throw new ApplicationRuntimeException("La variazione è associata alla rimodulazione del progetto " + pdgVariazione.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 che richiedono variazioni di competenza * che sono ancora in stato definitivo o approvato */ 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(Pdg_variazioneBulk.class::isInstance).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 competenza a quadratura.
Non è possibile effettuare " + "variazioni a competenza sul progetto 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, Pdg_variazioneBulk pdgVar, ProgettoBulk prg, CompoundFindClause clause) throws ComponentException, PersistencyException { ProgettoHome progettoHome = (ProgettoHome)getHome(userContext, ProgettoBulk.class); SQLBuilder sql; if (pdgVar.getCentro_responsabilita().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