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

it.cnr.contab.pdg01.comp.CRUDPdgVariazioneRigaGestComponent Maven / Gradle / Ivy

/*
 * Copyright (C) 2019  Consiglio Nazionale delle Ricerche
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Affero General Public License as
 *     published by the Free Software Foundation, either version 3 of the
 *     License, or (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Affero General Public License for more details.
 *
 *     You should have received a copy of the GNU Affero General Public License
 *     along with this program.  If not, see .
 */

package it.cnr.contab.pdg01.comp;

import java.io.IOException;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;

import javax.ejb.EJBException;

import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Configurazione_cnrHome;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrHome;
import it.cnr.contab.config00.ejb.Parametri_cnrComponentSession;
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.sto.bulk.CdsBulk;
import it.cnr.contab.config00.sto.bulk.CdsHome;
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.Unita_organizzativaHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativa_enteBulk;
import it.cnr.contab.messaggio00.bulk.MessaggioBulk;
import it.cnr.contab.messaggio00.bulk.MessaggioHome;
import it.cnr.contab.pdg00.bulk.ArchiviaStampaPdgVariazioneBulk;
import it.cnr.contab.pdg00.bulk.Pdg_variazioneBulk;
import it.cnr.contab.pdg00.bulk.Pdg_variazioneHome;
import it.cnr.contab.pdg00.bulk.storage.PdgVariazioneDocument;
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.ejb.PdGVariazioniComponentSession;
import it.cnr.contab.pdg01.bulk.Pdg_variazione_riga_entrata_gestBulk;
import it.cnr.contab.pdg01.bulk.Pdg_variazione_riga_gestBulk;
import it.cnr.contab.pdg01.bulk.Pdg_variazione_riga_spesa_gestBulk;
import it.cnr.contab.pdg01.ejb.CRUDPdgVariazioneGestionaleComponentSession;
import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseBulk;
import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseHome;
import it.cnr.contab.progettiric00.core.bulk.*;
import it.cnr.contab.reports.bulk.Print_spoolerBulk;
import it.cnr.contab.reports.bulk.Report;
import it.cnr.contab.reports.service.PrintService;
import it.cnr.contab.service.SpringUtil;
import it.cnr.contab.spring.service.StorePath;
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.UtenteKey;
import it.cnr.contab.util.Utility;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BulkList;
import it.cnr.jada.bulk.BusyResourceException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.ejb.CRUDComponentSession;
import it.cnr.jada.persistency.ObjectNotFoundException;
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.SQLBuilder;
import it.cnr.jada.util.ejb.EJBCommonServices;
import it.cnr.si.spring.storage.StorageObject;
import it.cnr.si.spring.storage.StorageService;
import it.cnr.si.spring.storage.StoreService;

public class CRUDPdgVariazioneRigaGestComponent extends it.cnr.jada.comp.CRUDComponent {
	/**
	  * CRUDPdgVariazioneRigaGestComponent constructor comment.
	  */
	public CRUDPdgVariazioneRigaGestComponent() {
		super();
	}

	/**
	 * Carica un modulo del Pdg con tutti i dettagli gestionali correlati.
	 *
	 * Nome: Inizializzazione;
	 * Pre:  Preparare l'oggetto alle modifiche;
	 * Post: Si procede, oltre che alla normale procedura di inizializzazione di un oggetto bulk,
	 *       anche al caricamento dei dettagli gestionali e al calcolo delle somme già ripartite.
	 *
	 * @param bulk dovrà essere sempre Pdg_variazioneBulk.
	 *
	 * @return un OggettoBulk che sarà sempre un Pdg_variazioneBulk.
	 */
	public OggettoBulk inizializzaBulkPerModifica(UserContext userContext, OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
		try {
			Ass_pdg_variazione_cdrBulk testata = (Ass_pdg_variazione_cdrBulk)super.inizializzaBulkPerModifica(userContext,bulk);
			Ass_pdg_variazione_cdrHome testataHome = (Ass_pdg_variazione_cdrHome)getHome(userContext, Ass_pdg_variazione_cdrBulk.class);
			testata.setRigheVariazioneEtrGest(new it.cnr.jada.bulk.BulkList(testataHome.findDettagliEntrataVariazioneGestionale(testata)));
			testata.setRigheVariazioneSpeGest(new it.cnr.jada.bulk.BulkList(testataHome.findDettagliSpesaVariazioneGestionale(testata)));
			inizializzaVistosuDettagli(userContext,testata);
			testata.setTotale_quota_spesa(Utility.ZERO);
			PersistentHome laHome = getHome(userContext, WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA");
			for (Iterator righeVar=testata.getRigheVariazioneSpeGest().iterator();righeVar.hasNext();){
				Pdg_variazione_riga_gestBulk varRiga = (Pdg_variazione_riga_gestBulk)righeVar.next();
				testata.setTotale_quota_spesa(Utility.nvl(testata.getTotale_quota_spesa()).add(Utility.nvl(varRiga.getIm_variazione())));

				SQLBuilder sql = laHome.createSQLBuilder();
				sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,testata.getEsercizio());
				sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,varRiga.getCd_cdr_assegnatario());
				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)
					varRiga.setProgetto(((WorkpackageBulk)list.get(0)).getProgetto());
			}					
			for (Iterator righeVar=testata.getRigheVariazioneEtrGest().iterator();righeVar.hasNext();){
				Pdg_variazione_riga_gestBulk varRiga = (Pdg_variazione_riga_gestBulk)righeVar.next();

				SQLBuilder sql = laHome.createSQLBuilder();
				sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,testata.getEsercizio());
				sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,varRiga.getCd_cdr_assegnatario());
				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)
					varRiga.setProgetto(((WorkpackageBulk)list.get(0)).getProgetto());
			}					
			getHomeCache(userContext).fetchAll(userContext);
			return testata;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch(Exception e) {
			throw handleException(e);
		}	
	}	 

	/**
	 * Esegue una operazione di modifica di un Pdg_variazioneBulk. 
	 *
	 * Pre-post-conditions:
	 *
	 * Nome: Modifica di una variazione
	 * Pre:  La richiesta di modifica di una variazione è stata generata
	 * Post: Viene loccato il record PDG_VARIAZIONE con l'istruzione findAndLock per evitare che salvataggi 
	 *       simultanei da parte di più utenti possano alterare i controlli.
	 * 	 Vengono verificati i dettagli della variazione gestionale associati al modulo per controllare che 
	 *       l'assestato di bilancio per la voce modificata non sia negativa.
	 * 	 In caso affermativo viene generata una ApplicationException per segnalare all'utente 
	 *       l'impossibilità di effettuare la variazione di Bilancio.
	 *
	 * @param	userContext	lo UserContext che ha generato la richiesta
	 * @param	oggettobulk il Pdg_variazioneBulk che deve essere modificato
	 * @return	il Pdg_variazioneBulk risultante dopo l'operazione di modifica.
	 */	
	public OggettoBulk modificaConBulk(UserContext userContext,	OggettoBulk oggettobulk) throws ComponentException {
		try {
			oggettobulk.setCrudStatus(OggettoBulk.NORMAL);
			Pdg_variazioneHome pdgHome = (Pdg_variazioneHome)getHome(userContext,Pdg_variazioneBulk.class);
			Pdg_variazioneBulk pdgClone;
			Ass_pdg_variazione_cdrHome testataHome = (Ass_pdg_variazione_cdrHome)getHome(userContext,Ass_pdg_variazione_cdrBulk.class);
			Ass_pdg_variazione_cdrBulk testataClone;
			try{
				pdgClone = (Pdg_variazioneBulk)pdgHome.findAndLock(((Ass_pdg_variazione_cdrBulk)oggettobulk).getPdg_variazione());
			} catch (BusyResourceException e) {
				throw new ApplicationException("Operazione effettuata al momento da un'altro utente sulla stessa variazione. Riprovare a salvare successivamente.");
			} catch (ObjectNotFoundException e) {
				throw new ApplicationException("Operazione non effettuata. La variazione risulta essere stata eliminata da un altro utente.");
			} 

			try{
				testataClone = (Ass_pdg_variazione_cdrBulk)testataHome.findAndLock(oggettobulk);
			} catch (BusyResourceException e) {
				throw new ApplicationException("Operazione effettuata al momento da un'altro utente sullo stesso CDR della variazione. Riprovare a salvare successivamente.");
			} catch (ObjectNotFoundException e) {
				throw new ApplicationException("Operazione non effettuata. L'associazione del CDR alla variazione risulta essere stata eliminata da un altro utente.");
			} 

			CdsHome cdsHome = (CdsHome)getHome(userContext,CdsBulk.class);

			boolean rigaInsModEtr = false;
			boolean rigaInsModSpe = false;
			BigDecimal totaleRigheEtr = Utility.ZERO;  
			BigDecimal totaleRigheSpe = Utility.ZERO;  
			
			for (java.util.Iterator i=((Ass_pdg_variazione_cdrBulk)oggettobulk).getRigheVariazioneEtrGest().iterator();i.hasNext();){			
				Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)i.next();
				totaleRigheEtr = totaleRigheEtr.add(Utility.nvl(rigaVar.getIm_variazione()));
				if (rigaVar.getCd_cds_area() == null )
					rigaVar.setArea((CdsBulk)cdsHome.findByPrimaryKey(new CdsBulk(rigaVar.getCdr_assegnatario().getCd_cds())));
				else if (!rigaVar.getCd_cds_area().equals(rigaVar.getCdr_assegnatario().getCd_cds())) {
					/*
					 * Se è stata valorizzata l'area occorre controllare:
					 * 1) Non è possibile, tramite storni di entrata, aumentare o ridurre gli importi dell'Area
					 * 
					 * n.b. si suppone che per l'area non si entri mai in questo ramo in quanto il campo Area 
					 *      è impostato automaticamente uguale al CDS del Cdr_accentratore   
					 */
					if (pdgClone.isStorno())
						throw new ApplicationException("Non è possibile effettuare storni di entrata su Area da parte di Istituti.");
				}
					
				if (rigaVar.getCrudStatus()==OggettoBulk.TO_BE_CREATED || rigaVar.getCrudStatus()==OggettoBulk.TO_BE_UPDATED)
					rigaInsModEtr = true;				
			}
			for (java.util.Iterator i=((Ass_pdg_variazione_cdrBulk)oggettobulk).getRigheVariazioneSpeGest().iterator();i.hasNext();){			
				Pdg_variazione_riga_gestBulk rigaVar = (Pdg_variazione_riga_gestBulk)i.next();
				totaleRigheSpe = totaleRigheSpe.add(Utility.nvl(rigaVar.getIm_variazione()));
				if (rigaVar.getCd_cds_area() == null )
					rigaVar.setArea((CdsBulk)cdsHome.findByPrimaryKey(new CdsBulk(rigaVar.getCdr_assegnatario().getCd_cds())));
				else if (!rigaVar.getCd_cds_area().equals(rigaVar.getCdr_assegnatario().getCd_cds())) {
					/*
					 * Se è stata valorizzata l'area occorre controllare:
					 * 1) Non è possibile, tramite lo storno di spesa, sottrarre importi all'Area
					 * 
					 * n.b. si suppone che per l'area non si entri mai in questo ramo in quanto il campo Area 
					 *      è impostato automaticamente uguale al CDS del Cdr_accentratore   
					 */
					if (pdgClone.isStorno() && rigaVar.getIm_variazione().compareTo(Utility.ZERO)<0)
						throw new ApplicationException("Non è possibile effettuare storni negativi di spesa su Area da parte di Istituti.");
				}
				if (rigaVar.getCrudStatus()==OggettoBulk.TO_BE_CREATED || rigaVar.getCrudStatus()==OggettoBulk.TO_BE_UPDATED)
					rigaInsModSpe = true;				
			}
			
			if ((rigaInsModEtr && testataClone.getIm_entrata().compareTo(totaleRigheEtr) == 0) ||
			    (rigaInsModSpe && testataClone.getIm_spesa().compareTo(totaleRigheSpe) == 0)){
				UtenteHome utenteHome = (UtenteHome)getHome(userContext,UtenteBulk.class);
				MessaggioBulk messaggio = null;
				for (java.util.Iterator i= utenteHome.findUtenteByCDRIncludeFirstLevel(pdgClone.getCd_centro_responsabilita()).iterator();i.hasNext();){
					UtenteBulk utente = (UtenteBulk)i.next();
					if (rigaInsModEtr)
						messaggio = generaMessaggioCopertura(userContext,utente,testataClone,Elemento_voceHome.GESTIONE_ENTRATE);
					else
						messaggio = generaMessaggioCopertura(userContext,utente,testataClone,Elemento_voceHome.GESTIONE_SPESE);
					
					super.creaConBulk(userContext, messaggio);
				}											
			}

			BigDecimal totaleImportoRiga = BigDecimal.ZERO;
			Ass_pdg_variazione_cdrBulk ass = (Ass_pdg_variazione_cdrBulk)oggettobulk;
			if (ass.getPdg_variazione().isApprovata()){
				for (java.util.Iterator i =  ass.getRigheVariazioneSpeGest().iterator();i.hasNext();) {
					Pdg_variazione_riga_gestBulk riga = (Pdg_variazione_riga_gestBulk)i.next();
					PdGVariazioniComponentSession comp = Utility.createPdGVariazioniComponentSession();
					try {
						if (comp.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 (ass.getPdg_variazione().isApprovata() && Utility.nvl(ass.getIm_spesa()).compareTo(totaleImportoRiga) != 0){
					throw new ApplicationException ("Attenzione: la somma degli importi "+totaleImportoRiga+" non corrisponde al totale indicato "+Utility.nvl(ass.getIm_spesa())+" sul centro di responsabilità!");
				}
				CRUDPdgVariazioneGestionaleComponentSession varSession = (CRUDPdgVariazioneGestionaleComponentSession)createComponentSessionVariazioneGestionale();
				try {
					varSession.allineaSaldiVariazioneApprovata(userContext, ass);
				} catch (ComponentException e) {
					throw handleException(e);
				} catch (RemoteException e) {
					throw handleException(e);
				}
			}

			OggettoBulk assPdg = super.modificaConBulk(userContext, oggettobulk);	
			if (ass.getPdg_variazione().isApprovata()){
				createDocumentForVariazioneLiquidazioneIVA(userContext, ass.getPdg_variazione());
			}
			return assPdg;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} catch(Exception e) {
			throw handleException(e);
		}	
	}

	private void createDocumentForVariazioneLiquidazioneIVA(UserContext userContext, Pdg_variazioneBulk variazione)
			throws ComponentException {
		try {
			ArchiviaStampaPdgVariazioneBulk archiviaStampaPdgVariazioneBulk = new ArchiviaStampaPdgVariazioneBulk();
			archiviaStampaPdgVariazioneBulk.setPdg_variazioneForPrint(variazione);
			archiviaStampaPdgVariazioneBulk.setCentro_responsabilita(variazione.getCentro_responsabilita());
			archiviaStampaPdgVariazioneBulk.setDs_variazione(variazione.getDs_variazione());
			archiviaStampaPdgVariazioneBulk.setPg_variazione_pdg(variazione.getPg_variazione_pdg());
			
			Print_spoolerBulk print = new Print_spoolerBulk();
			print.setPgStampa(UUID.randomUUID().getLeastSignificantBits());
			print.setFlEmail(false);
			print.setReport("/cnrpreventivo/pdg/stampa_variazioni_pdg.jasper");
			print.setNomeFile("Variazione al PdG n. "
					+ archiviaStampaPdgVariazioneBulk.getPg_variazione_pdg()
					+ " CdR proponente "
					+ archiviaStampaPdgVariazioneBulk.getCd_centro_responsabilita() + ".pdf");
			print.setUtcr(userContext.getUser());
			print.addParam("Esercizio", archiviaStampaPdgVariazioneBulk.getPdg_variazioneForPrint().getEsercizio(), Integer.class);
			print.addParam("Variazione", archiviaStampaPdgVariazioneBulk.getPg_variazione_pdg().intValue(), Integer.class);
			Report report = SpringUtil.getBean("printService",
					PrintService.class).executeReport(userContext,
					print);
			String cmisPath = getCMISPath(archiviaStampaPdgVariazioneBulk);
			StorageObject node = SpringUtil.getBean("storeService", StoreService.class).storeSimpleDocument(
			        archiviaStampaPdgVariazioneBulk,
                    report.getInputStream(),
                    report.getContentType(),
                    report.getName(),
                    cmisPath);
			archiviaStampaPdgVariazioneBulk.setPdgVariazioneDocument(PdgVariazioneDocument.construct(node));
		} catch (ComponentException e) {
			throw handleException(e);
		} catch (IOException e) {
			throw handleException(e);
		}
		
	}

	private String getCMISPath(ArchiviaStampaPdgVariazioneBulk archiviaStampaPdgVariazioneBulk) throws ApplicationException{
        return Arrays.asList(
                SpringUtil.getBean(StorePath.class).getPathVariazioniPianoDiGestione(),
                Optional.ofNullable(archiviaStampaPdgVariazioneBulk.getEsercizio())
                        .map(esercizio -> String.valueOf(esercizio))
                        .orElse("0"),
				SpringUtil.getBean("storeService", StoreService.class).
						sanitizeFolderName(archiviaStampaPdgVariazioneBulk.getCd_cds()),
                "CdR "+archiviaStampaPdgVariazioneBulk.getCd_centro_responsabilita()+
                        " Variazione "+ Utility.lpad(archiviaStampaPdgVariazioneBulk.getPg_variazione_pdg(),5,'0')
        ).stream().collect(
                Collectors.joining(StorageService.SUFFIX)
        );
	}
	
	public CRUDComponentSession createComponentSessionVariazioneGestionale() throws javax.ejb.EJBException {
		return (CRUDPdgVariazioneGestionaleComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRPDG01_EJB_CRUDPdgVariazioneGestionaleComponentSession",CRUDPdgVariazioneGestionaleComponentSession.class);
}

	/**
	 * Aggiunge delle clausole a tutte le operazioni di ricerca eseguite su WorkpackageBulk 
	 *	
	 * Pre-post-conditions:
	 *
	 * Nome: Default
	 * Pre:  E' stata generata la richiesta di ricerca di una Linea di Attività
	 * Post: Vengono restituite tutte le Linee di Attività che:
	 * 		 - sono associate al CDR Assegnatario del dettaglio gestionale Pdg_modulo_spese_gestBulk;
	 * 		 - sono associate al Modulo di Attività del dettaglio gestionale Pdg_modulo_speseBulk;
	 * 		 - siano Linee utilizzabile nella Gestione spese (TI_GESTIONE='S')
	 * 		 
	 * @param userContext lo userContext che ha generato la richiesta
	 * @param clause clausole di ricerca gia' specificate dall'utente
	 * @return il SQLBuilder con la clausola aggiuntiva sul gestore
	 * @throws RemoteException 
	 */
	public SQLBuilder selectLinea_attivitaByClause (UserContext userContext, 
													Pdg_variazione_riga_spesa_gestBulk dett,
													WorkpackageBulk latt, 
													CompoundFindClause clause) throws ComponentException, PersistencyException, RemoteException {	
		SQLBuilder sql = getHome(userContext, latt, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();

		sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addClause(FindClause.AND,"cd_centro_responsabilita",SQLBuilder.EQUALS,dett.getCd_cdr_assegnatario());
		
		sql.openParenthesis(FindClause.AND);
		sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_SPESE);
		sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_ENTRAMBE);
	    sql.closeParenthesis();

	    if (dett.getProgetto()!=null && dett.getProgetto().getPg_progetto()!=null)
	    	sql.addClause(FindClause.AND,"pg_progetto",SQLBuilder.EQUALS,dett.getProgetto().getPg_progetto());
	    
	 // Obbligatorio cofog sulle GAE
	 	if(((Parametri_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Parametri_cnrComponentSession",Parametri_cnrComponentSession.class)).isCofogObbligatorio(userContext))
	 		sql.addSQLClause(FindClause.AND,"CD_COFOG",SQLBuilder.ISNOTNULL,null);
		sql.addTableToHeader("FUNZIONE");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_FUNZIONE","FUNZIONE.CD_FUNZIONE");
		sql.addSQLClause(FindClause.AND, "FUNZIONE.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");

		sql.addTableToHeader("NATURA");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
		sql.addSQLClause(FindClause.AND, "NATURA.FL_SPESA",SQLBuilder.EQUALS,"Y");

		sql.addTableToHeader("PROGETTO_GEST");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO","PROGETTO_GEST.ESERCIZIO");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO","PROGETTO_GEST.PG_PROGETTO");
		sql.addSQLClause(FindClause.AND,"PROGETTO_GEST.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");

		if (dett.getPdg_variazione().getTipologia_fin() != null) {
			sql.openParenthesis(FindClause.AND);
			sql.addSQLClause(FindClause.OR,"NATURA.TIPO",SQLBuilder.EQUALS,dett.getPdg_variazione().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();
		}

		/**
		 * Escludo 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);
		} catch (RemoteException e) {
			throw new ComponentException(e);
		} catch (EJBException e) {
			throw new ComponentException(e);
		}
		if (config != null){
			sql.addSQLClause( FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA",  SQLBuilder.NOT_EQUALS, config.getVal01());
		}

		/*
		 * RP 11/01/2007
		 * Inizialmente inserita per garantire che le aree utilizzassero solo GAE movimentate dagli Istituti.
		 * Eliminata successivamente per non limitare le aree nell'utilizzo delle GAE
		 */
		/*
		if (dett.getPdg_variazione().getCentro_responsabilita().getUnita_padre().getCd_tipo_unita().compareTo(it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome.TIPO_UO_AREA)==0) {
			SQLBuilder sqlAssestato = getHome(userContext, V_assestatoBulk.class).createSQLBuilder();
			sqlAssestato.addSQLJoin("V_ASSESTATO.ESERCIZIO", "V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
			sqlAssestato.addSQLJoin("V_ASSESTATO.ESERCIZIO_RES", "V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
			sqlAssestato.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA", "V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA");
			sqlAssestato.addSQLJoin("V_ASSESTATO.CD_LINEA_ATTIVITA", "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA");
			sqlAssestato.addClause("AND", "importo_disponibile", sqlAssestato.GREATER, Utility.ZERO);
			sql.addSQLExistsClause("AND", sqlAssestato);
		}
		*/
		if (clause != null) sql.addClause(clause);
		
		return sql; 
	}	

	public SQLBuilder selectLinea_attivitaByClause (UserContext userContext, 
													Pdg_variazione_riga_entrata_gestBulk dett,
													WorkpackageBulk latt, 
													CompoundFindClause clause) throws ComponentException, PersistencyException {	
		SQLBuilder sql = getHome(userContext, latt, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();

		sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addClause(FindClause.AND,"cd_centro_responsabilita",SQLBuilder.EQUALS,dett.getCd_cdr_assegnatario());

		sql.openParenthesis(FindClause.AND);
		sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_ENTRATE);
		sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_ENTRAMBE);
	    sql.closeParenthesis();

	    if (dett.getProgetto()!=null && dett.getProgetto().getPg_progetto()!=null)
	    	sql.addClause(FindClause.AND,"pg_progetto",SQLBuilder.EQUALS,dett.getProgetto().getPg_progetto());

		sql.addTableToHeader("NATURA");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
		sql.addSQLClause(FindClause.AND, "NATURA.FL_ENTRATA",SQLBuilder.EQUALS,"Y");

		sql.addTableToHeader("PROGETTO_GEST");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO","PROGETTO_GEST.ESERCIZIO");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO","PROGETTO_GEST.PG_PROGETTO");
		sql.addSQLClause(FindClause.AND,"PROGETTO_GEST.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");
		/*
		 * L'origine delle fonti pilota l'utilizzo delle GAE sui dettagli della variazione.
		 * In particolare:
 		 *    - Variazione con Fonti Interne: solo GAE di tipo FIN;
		 *    - Variazione con Fonti Esterne: solo GAE di tipo FES.
		 * L'origine delle fonti filtra le GAE utilizzabili sulle righe di variazione ad eccezione
		 * delle GAE del CdR speciale del Personale in CONFIGURAZIONE_CNR, che risultano utilizzabili 
		 * sia su variazioni di Tipo Interno che Esterno.
		 */
		if (dett.getPdg_variazione().getTipologia_fin() != null) {
			sql.openParenthesis(FindClause.AND);
			sql.addSQLClause(FindClause.OR,"NATURA.TIPO",SQLBuilder.EQUALS,dett.getPdg_variazione().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();
		}

		/*
		 * RP 11/01/2007
		 * Inizialmente inserita per garantire che le aree utilizzassero solo GAE movimentate dagli Istituti.
		 * Eliminata successivamente per non limitare le aree nell'utilizzo delle GAE
		 */
		/*
		if (dett.getPdg_variazione().getCentro_responsabilita().getUnita_padre().getCd_tipo_unita().compareTo(it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome.TIPO_UO_AREA)==0) {
			SQLBuilder sqlAssestato = getHome(userContext, V_assestatoBulk.class).createSQLBuilder();
			sqlAssestato.addSQLJoin("V_ASSESTATO.ESERCIZIO", "V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
			sqlAssestato.addSQLJoin("V_ASSESTATO.ESERCIZIO_RES", "V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
			sqlAssestato.addSQLJoin("V_ASSESTATO.CD_CENTRO_RESPONSABILITA", "V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA");
			sqlAssestato.addSQLJoin("V_ASSESTATO.CD_LINEA_ATTIVITA", "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA");
			sqlAssestato.addClause("AND", "importo_disponibile", sqlAssestato.GREATER, Utility.ZERO);
			sql.addSQLExistsClause("AND", sqlAssestato);
		}
		*/

		sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
			
		if (clause != null) sql.addClause(clause);
		
		return sql; 
	}	

	public SQLBuilder selectLinea_attivita_progettoByClause (UserContext userContext, 
															 Pdg_variazione_riga_gestBulk dett,
															 ProgettoBulk prg, 
															 CompoundFindClause clause) throws ComponentException, PersistencyException {
		ProgettoHome progettoHome = (ProgettoHome)getHome(userContext, prg,"V_PROGETTO_PADRE");
		SQLBuilder sql = progettoHome.createSQLBuilder();
		sql.addSQLClause("AND","esercizio",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause("AND","tipo_fase",sql.EQUALS,ProgettoBulk.TIPO_FASE_GESTIONE);

		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 (parCnrBulk.getFl_nuovo_pdg())
			sql.addClause("AND", "livello", sql.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_SECONDO);
		else
			sql.addClause("AND", "livello", sql.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_TERZO);

		// Se uo 999.000 in scrivania: visualizza tutti i progetti
		Unita_organizzativa_enteBulk ente = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0);
		if (!((CNRUserContext) userContext).getCd_unita_organizzativa().equals( ente.getCd_unita_organizzativa())){
			if (parCnrBulk.getFl_nuovo_pdg())
				sql.addSQLExistsClause("AND",progettoHome.abilitazioniCommesse(userContext));
			else
				sql.addSQLExistsClause("AND",progettoHome.abilitazioniModuli(userContext));
		}	  
		if (clause != null) sql.addClause(clause);
		return sql; 
	}	
	
	public SQLBuilder selectProgettoByClause (UserContext userContext, 
											  Pdg_variazione_riga_gestBulk dett,
											  ProgettoBulk prg, 
											  CompoundFindClause clause) throws ComponentException, PersistencyException {
		return selectLinea_attivita_progettoByClause (userContext, dett, prg, clause); 
	}	

	/**
	 * Aggiunge delle clausole a tutte le operazioni di ricerca eseguite su Elemento_voceBulk 
	 *	
	 * Pre-post-conditions:
	 *
	 * Nome: Default
	 * Pre:  E' stata generata la richiesta di ricerca di Elemento Voce
	 * Post: Vengono restituiti tutti gli Elementi Voce che:
	 * 		 - sono associate a classificazioni di un livello pari a quello definito in Parametri_Ente;
	 * 		 - le classificazioni associate sono figlie della classificazione del dettaglio gestionale Pdg_modulo_spese_gestBulk
	 * 		 - non sia una partita di giro
	 * 		 - abbia la FUNZIONE uguale a quella della Linea di Attività del dettaglio gestionale Pdg_modulo_spese_gestBulk
	 * 		 - il CD_TIPO_UNITA è uguale a quello della UO associata al CDR
	 * 
	 * @param userContext lo userContext che ha generato la richiesta
	 * @param clause clausole di ricerca gia' specificate dall'utente
	 * @return il SQLBuilder con la clausola aggiuntiva sul gestore
	 */
	public SQLBuilder selectElemento_voceByClause (UserContext userContext, 
												   Pdg_variazione_riga_spesa_gestBulk dett,
												   Elemento_voceBulk elementoVoce, 
												   CompoundFindClause clause) throws ComponentException, PersistencyException {
		try {
			if (clause == null) clause = ((OggettoBulk)elementoVoce).buildFindClauses(null);
	
			SQLBuilder sql = getHome(userContext, elementoVoce,"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_RESIDUO", SQLBuilder.EQUALS, "N"); 
			if (dett.getLinea_attivita() != null)
				sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_FUNZIONE",SQLBuilder.EQUALS,dett.getLinea_attivita().getCd_funzione());
	
			if(!Utility.createParametriCnrComponentSession().getParametriCnr(userContext, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext )).getFl_nuovo_pdg())
				if (dett.getCdr_assegnatario()!=null && dett.getCdr_assegnatario().getUnita_padre().getCd_tipo_unita() != null)
					sql.addSQLClause(FindClause.AND,"V_ELEMENTO_VOCE_PDG_SPE.CD_TIPO_UNITA",SQLBuilder.EQUALS,dett.getCdr_assegnatario().getUnita_padre().getCd_tipo_unita());
	
			/*
			 * controllo aggiunto solo per variazioni su anni successivi a quello di attivazione piano economico e per 
			 * progetti con Piano Economico con data fine/proroga successiva all'anno di attivazione
			 */
			BigDecimal annoFrom = Utility.createConfigurazioneCnrComponentSession().getIm01(userContext, new Integer(0), null, Configurazione_cnrBulk.PK_GESTIONE_PROGETTI, Configurazione_cnrBulk.SK_PROGETTO_PIANO_ECONOMICO);
			if (Optional.ofNullable(annoFrom).map(BigDecimal::intValue).map(el->el.compareTo(CNRUserContext.getEsercizio( userContext ))<=0).orElse(Boolean.FALSE)) {
				ProgettoHome home = (ProgettoHome)getHome(userContext, ProgettoBulk.class);
				home.setFetchPolicy("it.cnr.contab.progettiric00.comp.ProgettoRicercaComponent.find");
				ProgettoBulk progetto = (ProgettoBulk)home.findByPrimaryKey(dett.getProgetto());
				getHomeCache(userContext).fetchAll(userContext);
				if (progetto.isPianoEconomicoRequired() &&
						Optional.ofNullable(progetto.getOtherField().getAnnoFine()).map(annoFine->annoFine.compareTo(annoFrom.intValue())>=0).orElse(Boolean.TRUE)) {
					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,dett.getProgetto().getPg_progetto());
			    	assSql.addSQLClause(FindClause.AND,"ASS_PROGETTO_PIAECO_VOCE.ESERCIZIO_PIANO",SQLBuilder.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ));
	
					List list = assHome.fetchAll(assSql);
					List listRim = new BulkList();
					if (Optional.ofNullable(dett.getPdg_variazione().getProgettoRimodulazione())
							.filter(rim->rim.getPg_progetto().equals(dett.getProgetto().getPg_progetto()))
							.isPresent()) {
						Progetto_rimodulazioneHome rimHome = (Progetto_rimodulazioneHome)getHome(userContext, Progetto_rimodulazioneBulk.class);
						listRim = new BulkList<>(rimHome.findDettagliVoceRimodulazione(dett.getPdg_variazione().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 (Progetto_rimodulazione_voceBulk assRimVoce : listRim) {
							if (assRimVoce.isTiOperazioneAggiunto()) {
								Elemento_voceBulk voceNew = Utility.createCRUDConfigAssEvoldEvnewComponentSession().getCurrentElementoVoce(userContext, assRimVoce.getElementoVoce(), 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();
					}
				}
			}
			if (clause != null) sql.addClause(clause);
			return sql;
		} catch (RemoteException e) {
			throw new ComponentException(e);
		}
	}
	
	public SQLBuilder selectElemento_voceByClause (UserContext userContext, 
												   Pdg_variazione_riga_entrata_gestBulk dett,
												   Elemento_voceBulk elementoVoce, 
												   CompoundFindClause clause) throws ComponentException, PersistencyException {
		if (clause == null) clause = ((OggettoBulk)elementoVoce).buildFindClauses(null);

		SQLBuilder sql = getHome(userContext, elementoVoce,"V_ELEMENTO_VOCE_PDG_ETR").createSQLBuilder();

		if(clause != null) sql.addClause(clause);

		sql.addSQLClause("AND", "V_ELEMENTO_VOCE_PDG_ETR.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ) );

		sql.addTableToHeader("PARAMETRI_LIVELLI");
		sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_ETR.ESERCIZIO", "PARAMETRI_LIVELLI.ESERCIZIO");

		sql.addTableToHeader("V_CLASSIFICAZIONE_VOCI_ALL");
		sql.addSQLJoin("V_ELEMENTO_VOCE_PDG_ETR.ID_CLASSIFICAZIONE", "V_CLASSIFICAZIONE_VOCI_ALL.ID_CLASSIFICAZIONE");
		sql.addSQLJoin("V_CLASSIFICAZIONE_VOCI_ALL.NR_LIVELLO", "PARAMETRI_LIVELLI.LIVELLI_ENTRATA");

		sql.openParenthesis("AND");
		sql.addSQLClause("OR", "V_ELEMENTO_VOCE_PDG_ETR.FL_PARTITA_GIRO", sql.ISNULL, null);	
		sql.addSQLClause("OR", "V_ELEMENTO_VOCE_PDG_ETR.FL_PARTITA_GIRO", sql.EQUALS, "N");	
		sql.closeParenthesis();
		sql.addSQLClause( "AND", "V_ELEMENTO_VOCE_PDG_ETR.FL_SOLO_RESIDUO", sql.EQUALS, "N");
		if (dett.getLinea_attivita() != null && dett.getCd_linea_attivita() != null)
			sql.addSQLClause("AND","V_ELEMENTO_VOCE_PDG_ETR.CD_NATURA",sql.EQUALS,dett.getLinea_attivita().getCd_natura());
		if (dett.getCdr_assegnatario()!=null && dett.getCdr_assegnatario().getUnita_padre().getCd_tipo_unita() != null && !dett.getCdr_assegnatario().getUnita_padre().getCd_tipo_unita().equals(it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome.TIPO_UO_SAC))
			sql.addSQLClause("AND","V_ELEMENTO_VOCE_PDG_ETR.FL_VOCE_SAC",sql.EQUALS,"N");	      
	
		if (clause != null) sql.addClause(clause);

		return sql;
	}

	public SQLBuilder selectAreaByClause (UserContext userContext,Pdg_variazione_riga_gestBulk dett,CdsBulk ass_uo,CompoundFindClause clause) throws ComponentException, PersistencyException
	{
		SQLBuilder sql = ((CdsHome)getHome(userContext, CdsBulk.class)).createSQLBuilder();
		if (clause != null) 
		  sql.addClause(clause);		
		if(dett.isNonAccentrata()|| (dett.getElemento_voce()!=null && dett.getElemento_voce().getFl_prelievo())){ 
			sql.addTableToHeader("ASS_UO_AREA");
			sql.addTableToHeader("UNITA_ORGANIZZATIVA UO");
			sql.addTableToHeader("UNITA_ORGANIZZATIVA CDS");
			sql.addSQLClause("AND", "ASS_UO_AREA.ESERCIZIO", sql.EQUALS, CNRUserContext.getEsercizio(userContext));
			sql.addSQLClause("AND", "UO.CD_UNITA_ORGANIZZATIVA", sql.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
			sql.addSQLJoin("CDS.CD_UNITA_PADRE","UO.CD_UNITA_PADRE");
			sql.addSQLJoin("CDS.CD_UNITA_ORGANIZZATIVA","ASS_UO_AREA.CD_UNITA_ORGANIZZATIVA");
			sql.addSQLJoin("ASS_UO_AREA.CD_AREA_RICERCA","UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA");
		}
		else{
			sql.addTableToHeader("UNITA_ORGANIZZATIVA UO");
			sql.addSQLClause("AND", "UO.CD_UNITA_ORGANIZZATIVA", sql.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
			sql.addSQLJoin("UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA","UO.CD_UNITA_PADRE");
		}	    
		SQLBuilder sql2 = ((CdsHome)getHome(userContext, CdsBulk.class)).createSQLBuilder();
		sql2.addTableToHeader("UNITA_ORGANIZZATIVA UO");
		sql2.addSQLClause("AND", "UO.CD_UNITA_ORGANIZZATIVA", sql.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
		sql2.addSQLJoin("UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA","UO.CD_UNITA_PADRE");
		return sql.union(sql2,false);
	}

	private BigDecimal calcolaImporto(UserContext userContext, SQLBuilder sql) throws ComponentException{
		BigDecimal totale = Utility.ZERO;
		try {
			java.sql.ResultSet rs = null;
			LoggableStatement ps = null;
			try {
				ps = sql.prepareStatement(getConnection(userContext));
				try {
					rs = ps.executeQuery();
					if (rs.next() && rs.getBigDecimal(1)!= null)
					  totale = totale.add(rs.getBigDecimal(1));
				} catch (java.sql.SQLException e) {
					throw handleSQLException(e);
				} finally {
					if (rs != null) try{rs.close();}catch( java.sql.SQLException e ){};
				}
			} finally {
				if (ps != null) try{ps.close();}catch( java.sql.SQLException e ){};
			}
		} catch (java.sql.SQLException ex) {
			throw handleException(ex);
		}		
		return totale;
	}

	private void valorizzaImportoTotali(UserContext userContext, Pdg_modulo_speseBulk pdg) throws ComponentException{
    	try {
    		Pdg_modulo_speseHome testataHome = (Pdg_modulo_speseHome)getHome(userContext, Pdg_modulo_speseBulk.class);
			pdg.setTotale_spese_accentrate_esterne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliAccEst(userContext,pdg)));						
			pdg.setTotale_spese_accentrate_interne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliAccInt(userContext,pdg)));						
			pdg.setTotale_spese_decentrate_esterne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliDecEst(userContext,pdg)));						
			pdg.setTotale_spese_decentrate_interne_gest(calcolaImporto(userContext,testataHome.calcolaTotaleDettagliGestionaliDecInt(userContext,pdg)));						
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}	
	}		

	private MessaggioBulk generaMessaggioCopertura(UserContext userContext, UtenteBulk utente, Ass_pdg_variazione_cdrBulk ass_var, String tipo) 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));
		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 " + (tipo.equals(Elemento_voceHome.GESTIONE_SPESE)?"Spesa":"Entrata") + " assegnata alla Variazione di competenza");
		messaggio.setCorpo("Numero variazione:"+ass_var.getPg_variazione_pdg());
		messaggio.setCorpo(messaggio.getCorpo() + "\n" + "Il CdR :"+ass_var.getCentro_responsabilita().getCd_ds_cdr()+" ha coperto la quota assegnata.");
		messaggio.setSoggetto(messaggio.getDs_messaggio());
		messaggio.setToBeCreated(); 
		return messaggio;	 	
	}

	private void inizializzaVistosuDettagli(UserContext userContext, Ass_pdg_variazione_cdrBulk ass) throws ComponentException{
		try {
			if (!ass.getPdg_variazione().isApprovata())	return;

			WorkpackageHome lineaHome = (WorkpackageHome)getHome(userContext, WorkpackageBulk.class);
			UtenteBulk utente = (UtenteBulk) getHome( userContext, UtenteBulk.class).findByPrimaryKey(new UtenteKey(it.cnr.contab.utenze00.bp.CNRUserContext.getUser(userContext)));

			Unita_organizzativaHome home = (Unita_organizzativaHome)getHome(userContext, Unita_organizzativaBulk.class);
			Unita_organizzativaBulk uoScrivania = (Unita_organizzativaBulk)home.findByPrimaryKey(new Unita_organizzativaBulk(CNRUserContext.getCd_unita_organizzativa(userContext)));

			if (uoScrivania.getCd_tipo_unita().equals(Tipo_unita_organizzativaHome.TIPO_UO_ENTE)) {
				if (utente.getDipartimento()!=null && utente.getDipartimento().getCd_dipartimento()!=null){
					for (java.util.Iterator rigaIt=ass.getRigheVariazioneEtrGest().iterator();rigaIt.hasNext();){
						Pdg_variazione_riga_gestBulk riga = (Pdg_variazione_riga_gestBulk)rigaIt.next();
						if (lineaHome.findDipartimento(userContext, riga.getLinea_attivita()).equalsByPrimaryKey(utente.getDipartimento()))
							riga.setFl_riga_vistabile(Boolean.TRUE);
					}
					for (java.util.Iterator rigaIt=ass.getRigheVariazioneSpeGest().iterator();rigaIt.hasNext();){
						Pdg_variazione_riga_gestBulk riga = (Pdg_variazione_riga_gestBulk)rigaIt.next();
						if (lineaHome.findDipartimento(userContext, riga.getLinea_attivita()).equalsByPrimaryKey(utente.getDipartimento()))
							riga.setFl_riga_vistabile(Boolean.TRUE);
					}
				}
				else
				{
					/**
					 * Il flag viene impostato a "TRUE" quando accede un utente di tipo ENTE senza dipartimento per
					 * consentire a chi deve dare "APPROVAZIONE FORMALE" di conoscere le righe della variazione
					 * ancora in attesa di apposizione di visto da parte dei dipartimenti.
					 */
					for (java.util.Iterator rigaIt=ass.getRigheVariazioneEtrGest().iterator();rigaIt.hasNext();)
						((Pdg_variazione_riga_gestBulk)rigaIt.next()).setFl_riga_vistabile(Boolean.TRUE);
					for (java.util.Iterator rigaIt=ass.getRigheVariazioneSpeGest().iterator();rigaIt.hasNext();)
						((Pdg_variazione_riga_gestBulk)rigaIt.next()).setFl_riga_vistabile(Boolean.TRUE);
				}
			}
					
		} catch (PersistencyException e) {
			throw handleException(e);
		} catch(it.cnr.jada.comp.ComponentException ex){
			throw handleException(ex);
		}
	}

	public ProgettoBulk getProgettoLineaAttivita(UserContext usercontext, Pdg_variazione_riga_gestBulk dett) 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,dett.getEsercizio());
			sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,dett.getCd_cdr_assegnatario());
			sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA",SQLBuilder.EQUALS,dett.getCd_linea_attivita());
			List list = laHome.fetchAll(sql);
			if (list.size()==1)
				return (ProgettoBulk)getHome(usercontext, ProgettoBulk.class).findByPrimaryKey(usercontext, ((WorkpackageBulk)list.get(0)).getProgetto());
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
		return null;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy