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

it.cnr.contab.pdg00.comp.CostiDipendenteComponent 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.pdg00.comp;

import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJBException;

import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.esercizio.bulk.EsercizioBulk;
import it.cnr.contab.config00.esercizio.bulk.EsercizioHome;
import it.cnr.contab.config00.latt.bulk.WorkpackageBulk;
import it.cnr.contab.config00.pdcfin.bulk.NaturaBulk;
import it.cnr.contab.config00.sto.bulk.CdrBulk;
import it.cnr.contab.config00.sto.bulk.CdrHome;
import it.cnr.contab.config00.sto.bulk.Tipo_unita_organizzativaHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaHome;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativa_enteBulk;
import it.cnr.contab.config00.sto.bulk.V_struttura_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.V_struttura_organizzativaHome;
import it.cnr.contab.pdg00.bulk.Pdg_preventivoBulk;
import it.cnr.contab.pdg00.cdip.bulk.Ass_cdp_laBulk;
import it.cnr.contab.pdg00.cdip.bulk.Ass_cdp_uoBulk;
import it.cnr.contab.pdg00.cdip.bulk.Costi_dipendenteVBulk;
import it.cnr.contab.pdg00.cdip.bulk.Costo_del_dipendenteBulk;
import it.cnr.contab.pdg00.cdip.bulk.Stampa_imponibili_dipendentiVBulk;
import it.cnr.contab.pdg00.cdip.bulk.Stampa_ripartizione_costiVBulk;
import it.cnr.contab.pdg00.cdip.bulk.Stipendi_coanBulk;
import it.cnr.contab.pdg00.cdip.bulk.Stipendi_cofiBulk;
import it.cnr.contab.pdg00.cdip.bulk.Stipendi_cofi_obb_scadBulk;
import it.cnr.contab.pdg00.cdip.bulk.V_cdp_matricolaBulk;
import it.cnr.contab.pdg00.cdip.bulk.V_cdp_stato_mensilitaBulk;
import it.cnr.contab.pdg00.cdip.bulk.V_dipendenteBulk;
import it.cnr.contab.pdg00.cdip.bulk.V_dipendenteHome;
import it.cnr.contab.prevent01.bulk.Pdg_esercizioBulk;
import it.cnr.contab.prevent01.bulk.Pdg_moduloBulk;
import it.cnr.contab.prevent01.bulk.Pdg_modulo_speseBulk;
import it.cnr.contab.prevent01.ejb.PdgAggregatoModuloComponentSession;
import it.cnr.contab.progettiric00.core.bulk.ProgettoBulk;
import it.cnr.contab.progettiric00.core.bulk.ProgettoHome;
import it.cnr.contab.progettiric00.core.bulk.Progetto_sipBulk;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.contab.util.Utility;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BulkHome;
import it.cnr.jada.bulk.BulkList;
import it.cnr.jada.bulk.BusyResourceException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.OutdatedResourceException;
import it.cnr.jada.bulk.ROWrapper;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.comp.IPrintMgr;
import it.cnr.jada.comp.RicercaComponent;
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;

public class CostiDipendenteComponent extends RicercaComponent implements ICostiDipendenteMgr, IPrintMgr {
/**
 * CostiPersonaleComponent constructor comment.
 */
public CostiDipendenteComponent() {
	super();
}
/**
 *  Default
 *    PreCondition:
 *      L'utente richiede l'annullamento della scrittura analitica per i costi stipendiali mensili
 *    PostCondition:
 *      Viene invocata la procedura CNRCTB207.annullaScaricaCDPSuPdgGestione per
 *		l'unità organizzativa e il mese selezionato dall'utente
 */
public void annullaScritturaAnalitica(UserContext userContext,int mese) throws ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Funzione non disponibile ad esercizio chiuso.");

	try {
		LoggableStatement stm = new LoggableStatement(getConnection(userContext),
				"{  call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() 
				+ "CNRCTB207.annullaScaricaCDPSuPdgGestione(?, ?, ?, ?)}",false,this.getClass());
		try {
			stm.setInt(1, CNRUserContext.getEsercizio(userContext).intValue());
			stm.setInt(2,mese);		
			stm.setString(3,CNRUserContext.getCd_unita_organizzativa(userContext));
			stm.setString(4,CNRUserContext.getUser(userContext));
			stm.execute();
		} finally {
		}
	} catch(java.sql.SQLException e) {
		throw handleException(e);
	}
}
/** 
  *  Default
  *    PreCondition:
  *      Viene richiesto la visualizzazione dello stato di scarico dei costi dei dipendenti del CDS a cui l'utente appartiene.
  *		 Non è specificata alcuna matricola
  *    PostCondition:
  *      Restituisce un Costi_dipendenteVBulk che contiene un'elenco di V_cdp_matricolaBulk costituito da:
  *      - l'elenco di tutti i dipendenti relativi all'unità organizzativa a cui l'utente appartiene (provenienza interna).
  *      - l'elenco dei dipendenti di altre unità organizzative che hanno richiesto di scaricare parte dei costi sull'unità organizzativa dell'utente (provenienza esterna).
  *
  *    PreCondition:
  *      Viene richiesto la visualizzazione dello stato di scarico dei costi dei dipendenti del CDS a cui l'utente appartiene per un mese > 0
  *		 E' stata specificata una matricola di provenienza interna.
  *		 Il mese specificato è 0 o esiste almeno una riga di dettaglio ass_cdp_la o ass_cdp_uo.
  *    PostCondition:
  *      Per la matricola selezionata vengono caricati:
  *      - l'elenco degli Ass_cdp_la (percentuali di scarico per CDR e linea di attività) relativi all'unità organizzativa a cui l'utente appartiene;
  *      - l'elenco degli Ass_cdp_uo (percentuali di scarico su altre UO diverse da quella del dipendente);
  *      Per ognuno degli ass_cdp_la/ass_cdp_uo caricati viene calcolato il corrispondente in giorni lavorativi annui alla percentuale scaricata; se un ass_cdp_la proviene da una UO diversa da quella dell'utente (costo caricato da altra UO) il totale dei giorni lavorativi viene calcolato in proporzione alla percentuale caricata dall'UO a cui appartiene la matricola
  *
  *    PreCondition:
  *      Viene richiesto la visualizzazione dello stato di scarico dei costi dei dipendenti del CDS a cui l'utente appartiene per un mese > 0
  *		 E' stata specificata una matricola di provenienza esterna.
  *		 Il mese specificato è 0 o esiste almeno una riga di dettaglio ass_cdp_la o ass_cdp_uo.
  *    PostCondition:
  *      Per la matricola selezionata vengono caricati:
  *      - l'elenco degli Ass_cdp_la (percentuali di scarico per CDR e linea di attività) relativi all'unità organizzativa a cui l'utente appartiene;
  *      Per ognuno degli ass_cdp_la caricati viene calcolato il corrispondente in giorni lavorativi annui alla percentuale scaricata; se un ass_cdp_la proviene da una UO diversa da quella dell'utente (costo caricato da altra UO) il totale dei giorni lavorativi viene calcolato in proporzione alla percentuale caricata dall'UO a cui appartiene la matricola,
  *		  pesata sulla percentuale dell'ass_cdp_uo da cui proviene.
  *
  *    PreCondition:
  *      Viene richiesto la visualizzazione dello stato di scarico dei costi dei dipendenti del CDS a cui l'utente appartiene per un mese > 0
  *		 E' stata specificata una matricola di provenienza interna.
  *		 Il mese specificato è > 0 e non esiste nessuna riga di dettaglio ass_cdp_la o ass_cdp_uo.
  *    PostCondition:
  *		 Viene generato un'elenco di dettagli ass_cdp_la copiandoli dalla ripartizione del mese precedente.
  *		 Viene generato un'elenco di dettagli ass_cdp_uo copiandoli dalla ripartizione del mese precedente filtrando solo quelli
  *		  in stato 'accettato' o 'iniziale' e relativi ad una UO per cui non è stata ancora generata la
  *		  scrittura analitica per il mese selezionato.
  *		 Viene impostato il flag RipartizioneGenerata a true.
 */
public OggettoBulk caricaCosto_dipendente(UserContext userContext,Costi_dipendenteVBulk costi_dipendente,V_cdp_matricolaBulk cdp) throws it.cnr.jada.comp.ComponentException {
	try {
		Integer esercizio = costi_dipendente.getEsercizio();
		String cd_unita_organizzativa = costi_dipendente.getUnita_organizzativa_filter().getCd_unita_organizzativa();
		int mese = costi_dipendente.getMese();

		if (cdp!=null && cdp.getId_matricola()!= null &&  
			(cdp.getCostiScaricati()==null || cdp.getCostiScaricati().isEmpty()) && 
			(cdp.getCostiScaricati()==null || cdp.getCostiScaricatiAltraUO().isEmpty())) {
			cdp.setGiorni_lavorativi_a1(costi_dipendente.getGiorni_lavorativi());
			cdp.setGiorni_lavorativi_a2(costi_dipendente.getGiorni_lavorativi());
			cdp.setGiorni_lavorativi_a3(costi_dipendente.getGiorni_lavorativi());			

			// Estraggo l'elenco degli Ass_cdp_laBulk per la matricola selezionata
			BulkHome home = getHome(userContext,Ass_cdp_laBulk.class);
			SQLBuilder sql = home.createSQLBuilder();
			// Estraggo solo le righe appartenenti alla mia UO
			sql.addClause(FindClause.AND,"esercizio",SQLBuilder.EQUALS,esercizio);
			sql.addClause(FindClause.AND,"id_matricola",SQLBuilder.EQUALS,cdp.getId_matricola());
			sql.addClause(FindClause.AND,"mese",SQLBuilder.EQUALS,mese);
			sql.addTableToHeader("CDR");
			sql.addSQLJoin("CDR.CD_CENTRO_RESPONSABILITA","ASS_CDP_LA.CD_CENTRO_RESPONSABILITA");
			sql.addSQLClause(FindClause.AND,"CDR.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS,cd_unita_organizzativa);
				
			cdp.setCostiScaricati(new BulkList(home.fetchAll(sql)));

			// Estraggo l'elenco degli Ass_cdp_uoBulk per la matricola selezionata
			home = getHome(userContext,Ass_cdp_uoBulk.class);			
			sql = home.createSQLBuilder();
			sql.addClause(FindClause.AND,"esercizio",SQLBuilder.EQUALS,esercizio);
			sql.addClause(FindClause.AND,"id_matricola",SQLBuilder.EQUALS,cdp.getId_matricola());
			sql.addClause(FindClause.AND,"mese",SQLBuilder.EQUALS,new Integer(mese));
			if (!cdp.isProvenienzaInterna())
				sql.addClause(FindClause.AND,"cd_unita_organizzativa",SQLBuilder.EQUALS,cd_unita_organizzativa);				
			
			java.util.List ass_cdp_uo_list = home.fetchAll(sql);

			if (cdp.isProvenienzaInterna()) {
				// Se la provenienza è interna (i.e. matricola appartenente al CDS
				// dell'utente) imposto l'elenco dei costi scaricati su altra UO
				cdp.setCostiScaricatiAltraUO(new BulkList(ass_cdp_uo_list));
			} else {
				// Altrimenti imposto la provenienza del costo caricato
				Ass_cdp_uoBulk ass_cdp_uo = (Ass_cdp_uoBulk)ass_cdp_uo_list.get(0);
				cdp.setCostiScaricatiAltraUO(new BulkList());
				cdp.setCostoCaricato(ass_cdp_uo);
				// e ricalcolo la base del totale dei gg lavorativi da usare per
				// le conversioni da/per prc a giorni
				cdp.calcolaGiorni_lavorativi(1,ass_cdp_uo.getPrc_uo_a1());
				cdp.calcolaGiorni_lavorativi(2,ass_cdp_uo.getPrc_uo_a2());
				cdp.calcolaGiorni_lavorativi(3,ass_cdp_uo.getPrc_uo_a3());
			}

			// Calcolo i giorni lavorativi per i costi scaricati verso altra UO corrispondenti
			// alle percentuali
			// Se la provenienza NON è interna la lista è vuota
			if (cdp.getCostiScaricatiAltraUO() != null)
				for (java.util.Iterator i = cdp.getCostiScaricatiAltraUO().iterator();i.hasNext();)
					(i.next()).calcolaGiorni_uo(costi_dipendente.getGiorni_lavorativi());
	
			boolean modificabile = isCosto_del_dipendenteValidoPerModifica(userContext,cdp);
	
			for (java.util.Iterator i = cdp.getCostiScaricati().iterator();i.hasNext();) {
				// Calcolo i giorni lavorativi corrispondenti alle percentuali
				Ass_cdp_laBulk ass_cdp_la = i.next();
				ass_cdp_la.calcolaGiorni_la(1,cdp.getGiorni_lavorativi_a1());
				ass_cdp_la.calcolaGiorni_la(2,cdp.getGiorni_lavorativi_a2());
				ass_cdp_la.calcolaGiorni_la(3,cdp.getGiorni_lavorativi_a3());
				if (mese == 0) {
					// Controllo che il pdgP del cdr sia aperto
					CdrBulk cdrPdgP = getCdrPdgP(userContext);
					Pdg_esercizioBulk pdgp = (Pdg_esercizioBulk)getHome(userContext,Pdg_esercizioBulk.class).findByPrimaryKey(new Pdg_esercizioBulk(esercizio, cdrPdgP.getCd_centro_responsabilita()));
					ass_cdp_la.setReadonly(!modificabile || !isStatoPdgPValidoPerModificaCDP(pdgp));
				} else {
					ass_cdp_la.setReadonly(!modificabile);
				}
			}
			// 05/09/2003
			// Aggiunto controllo sulla chiusura dell'esercizio
			if (isEsercizioChiuso(userContext))
				return asRO(costi_dipendente,"Ripartizione non modificabile ad esercizio chiuso.");
			else if (!modificabile)
				return asRO(costi_dipendente,"Ripartizione non modificabile per questa matricola");
		}

		return cdp;
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	} catch(javax.ejb.EJBException e) {
		throw handleException(e);
	}
}
/**
 *  Default
 *    PreCondition:
 *      L'utente richiede la generazione della contabilizzazione dei flussi stipendiali mensili
 *    PostCondition:
 *      Viene invocata la procedura CNRCTB680.contabilFlussoStipCOFI per
 *		il mese selezionato dall'utente
 */
public void contabilizzaFlussoStipendialeMensile(UserContext userContext,int mese) throws ComponentException {
	try {
		
		LoggableStatement stm = new LoggableStatement(getConnection(userContext),
				"{  call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() 
				+ "CNRCTB680.contabilFlussoStipCOFI(?, ?, ?)}",false,this.getClass());
		try {
			stm.setInt(1, CNRUserContext.getEsercizio(userContext).intValue());
			stm.setInt(2,mese);		
			stm.setString(3,CNRUserContext.getUser(userContext));
			stm.execute();
		} finally {
		}
	} catch(java.sql.SQLException e) {
		throw handleException(e);
	}
}
/*
 * Pre-post-conditions:
 *
 * Nome: Dipendente non modificabile
 * Pre: Viene la copia della ripartizione dei costi da una matricola in un'altra matricola.
 *		Per la matricola specificata come destinazione esiste già una ripartizione dei costi.
 * Post: Viene generata una ApplicationException con il messaggio: "La matricola xyz possiede già una ripartizione"
 * Nome: Tutti i controlli superati
 * Pre:	Viene la copia della ripartizione dei costi da una matricola in un'altra matricola.
 *		Nessuna delle altre pre-condizioni è verificata.
 * Post: Viene copiata la configurazione della ripartizione dei costi del dipendente sulla
 *		matricola di destinazione (nella tabella ASS_CDP_LA)
 */
public OggettoBulk copiaRipartizione(it.cnr.jada.UserContext userContext,Costi_dipendenteVBulk cdp, V_cdp_matricolaBulk matricola_src,V_cdp_matricolaBulk matricola_dest) throws it.cnr.jada.comp.ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Funzione non disponibile ad esercizio chiuso.");

	try {
		// Lock della matricola
		lockMatricola(userContext,matricola_dest.getId_matricola(),cdp.getMese());

		for (java.util.Iterator i = cdp.getCosti_dipendenti().iterator();i.hasNext();) {
			V_cdp_matricolaBulk matricola = i.next();
			if (matricola.getEsercizio().equals(matricola_dest.getEsercizio()) &&
				matricola.getMese().equals(matricola_dest.getMese()) &&
				matricola.getId_matricola().equals(matricola_dest.getId_matricola()) &&
				matricola.getTi_prev_cons().equals(matricola_dest.getTi_prev_cons()) &&
				matricola.getTi_appartenenza().equals(matricola_dest.getTi_appartenenza()) &&
				matricola.getTi_gestione().equals(matricola_dest.getTi_gestione())) {
				matricola_dest = matricola;
				break;
			}
		}

		if (matricola_src==null || matricola_dest==null) 
			return cdp;

		if (!matricola_dest.getCostiScaricati().isEmpty())
			throw new ApplicationException("La matricola "+matricola_dest.getId_matricola()+" possiede già una ripartizione");
		if (!matricola_dest.getCostiScaricatiAltraUO().isEmpty())
			throw new ApplicationException("La matricola "+matricola_dest.getId_matricola()+" possiede già una ripartizione");

		for (java.util.Iterator i = matricola_src.getCostiScaricati().iterator();i.hasNext();) {
			Ass_cdp_laBulk ass_cdp_la = i.next();
			ass_cdp_la.setId_matricola(matricola_dest.getId_matricola());
			ass_cdp_la.setUser(userContext.getUser());
			ass_cdp_la.setFl_dip_altra_uo(new Boolean(matricola_dest.isProvenienzaCaricato()));
			matricola_dest.addToCostiScaricati(ass_cdp_la);
		}
		return cdp;
	} catch(Throwable e) {
		throw handleException(e);
	}
}
public V_cdp_matricolaBulk generaDaUltimaRipartizione(UserContext userContext,V_cdp_matricolaBulk cdp) throws it.cnr.jada.comp.ComponentException {
	try {
		String id_matricola = cdp.getId_matricola();
		Integer mese = cdp.getMese();
		Integer esercizio = cdp.getEsercizio();

		LoggableStatement stm = new LoggableStatement(getConnection(userContext), 
				                "SELECT MAX(MESE) FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"COSTO_DEL_DIPENDENTE " +
								"WHERE ID_MATRICOLA = ? " +
								"AND ESERCIZIO = ? " +
								"AND CD_UNITA_ORGANIZZATIVA = ? " +
								"AND MESE < ? " +
								"AND ( EXISTS ( SELECT 1 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"ASS_CDP_UO " +
												"WHERE ASS_CDP_UO.ESERCIZIO = COSTO_DEL_DIPENDENTE.ESERCIZIO " +
												"AND ASS_CDP_UO.ID_MATRICOLA = COSTO_DEL_DIPENDENTE.ID_MATRICOLA " +
												"AND ASS_CDP_UO.MESE = COSTO_DEL_DIPENDENTE.MESE " +
												"AND ASS_CDP_UO.STATO <> 'N') " +
												"OR EXISTS ( SELECT 1 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"ASS_CDP_LA " +
															"WHERE ASS_CDP_LA.ESERCIZIO = COSTO_DEL_DIPENDENTE.ESERCIZIO " +
															"AND ASS_CDP_LA.ID_MATRICOLA = COSTO_DEL_DIPENDENTE.ID_MATRICOLA " +
															"AND ASS_CDP_LA.MESE = COSTO_DEL_DIPENDENTE.MESE ) )",true,this.getClass());
		try {
			stm.setString(1,id_matricola);
			stm.setInt(2,cdp.getEsercizio().intValue());
			stm.setString(3,cdp.getCd_unita_organizzativa());
			stm.setInt(4,mese);
			java.sql.ResultSet rs = stm.executeQuery();
			try {
				if (!rs.next()) return cdp;
				int ultimo_mese = rs.getInt(1);
				if (ultimo_mese != mese.intValue()-1)
					return cdp;

				String cd_unita_organizzativa = ((Unita_organizzativaBulk)getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext)))).getCd_unita_organizzativa(); 
				
				SQLBuilder sql = getHome(userContext,Ass_cdp_laBulk.class).createSQLBuilder();
				// Estraggo solo le righe appartenenti alla mia UO
				sql.addTableToHeader("CDR");
				sql.addSQLJoin("CDR.CD_CENTRO_RESPONSABILITA","ASS_CDP_LA.CD_CENTRO_RESPONSABILITA");
				sql.addSQLClause("AND","CDR.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS,cd_unita_organizzativa);
				sql.addClause("AND","esercizio",SQLBuilder.EQUALS,esercizio);
				sql.addClause("AND","id_matricola",SQLBuilder.EQUALS,id_matricola);
				sql.addClause("AND","mese",SQLBuilder.EQUALS,new Integer(ultimo_mese));
				cdp.setCostiScaricati(new BulkList(getHome(userContext,Ass_cdp_laBulk.class).fetchAll(sql)));

				sql = getHome(userContext,Ass_cdp_uoBulk.class).createSQLBuilder();
				sql.addClause("AND","esercizio",SQLBuilder.EQUALS,esercizio);
				sql.addClause("AND","id_matricola",SQLBuilder.EQUALS,id_matricola);
				sql.addClause("AND","mese",SQLBuilder.EQUALS,new Integer(ultimo_mese));
				sql.addClause("AND","stato",SQLBuilder.NOT_EQUALS,Ass_cdp_uoBulk.STATO_NON_ACCETTATO);
				cdp.setCostiScaricatiAltraUO(new BulkList(getHome(userContext,Ass_cdp_uoBulk.class).fetchAll(sql)));

				for (java.util.Iterator i = cdp.getCostiScaricati().iterator();i.hasNext();) {
					Ass_cdp_laBulk ass_cdp_la = (Ass_cdp_laBulk)i.next();
					ass_cdp_la.setMese(mese);
					// (1/21/2004 11:04:29 AM) CNRADM
					// Aggiunto modifica stato ass_cdp_la a non scaricato:
					// le ripartizione copiate non sono state ancora scaricate.
					ass_cdp_la.setStato(Ass_cdp_laBulk.STATO_NON_SCARICATO);
					ass_cdp_la.setCrudStatus(OggettoBulk.TO_BE_CREATED);
				}

				for (java.util.Iterator i = cdp.getCostiScaricatiAltraUO().iterator();i.hasNext();) {
					Ass_cdp_uoBulk ass_cdp_uo = (Ass_cdp_uoBulk)i.next();
					if (isStatoAnaliticaValidoPerModificaCDP(
						userContext,
						ass_cdp_uo.getCd_unita_organizzativa(),
						ass_cdp_uo.getEsercizio(),
						ass_cdp_uo.getMese().intValue())) {
						ass_cdp_uo.setMese(mese);
						ass_cdp_uo.setStato(Ass_cdp_uoBulk.STATO_INIZIALE);
						ass_cdp_uo.setCrudStatus(OggettoBulk.TO_BE_CREATED);
					} else {
						i.remove();
					}
				}

			} finally {
				try{rs.close();}catch( java.sql.SQLException e ){};
			}
		} finally {
			try{stm.close();}catch( java.sql.SQLException e ){};
		}
		return cdp;
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	} catch(java.sql.SQLException e) {
		throw handleException(e);
	}
}
/**
 *  Default
 *    PreCondition:
 *      L'utente richiede la generazione della scrittura analitica per i costi stipendiali mensili
 *    PostCondition:
 *      Viene invocata la procedura CNRCTB207.scaricaCDPSuPdgGestione per
 *		l'unità organizzativa e il mese selezionato dall'utente
 */
public void generaScritturaAnalitica(UserContext userContext,int mese) throws ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Funzione non disponibile ad esercizio chiuso.");

	try {
		
		LoggableStatement stm = new LoggableStatement(getConnection(userContext),
				"{  call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
				+ "CNRCTB207.scaricaCDPSuPdgGestione(?, ?, ?, ?)}",false,this.getClass());
		try {
			stm.setInt(1, CNRUserContext.getEsercizio(userContext).intValue());
			stm.setInt(2,mese);		
			stm.setString(3,CNRUserContext.getCd_unita_organizzativa(userContext));
			stm.setString(4,CNRUserContext.getUser(userContext));
			stm.execute();
		} finally {
		}
	} catch(java.sql.SQLException e) {
		throw handleException(e);
	}
}
/**
 * inizializzaBulkPerStampa method comment.
 */
private void inizializzaBulkPerStampa(UserContext userContext, Stampa_imponibili_dipendentiVBulk stampa) throws it.cnr.jada.comp.ComponentException {

	stampa.setCd_cds(it.cnr.contab.utenze00.bp.CNRUserContext.getCd_cds(userContext));
	stampa.setEsercizio(CNRUserContext.getEsercizio(userContext));

	try{
	
		String cd_uo_scrivania = it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext);
		Unita_organizzativaHome uoHome = (it.cnr.contab.config00.sto.bulk.Unita_organizzativaHome)getHome(userContext, it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk.class);
		it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk uo = (it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk)uoHome.findByPrimaryKey(new it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk(cd_uo_scrivania));
		
		if (!uo.isUoCds()){
			stampa.setUoForPrint(uo);
			stampa.setIsUOForPrintEnabled(false);
		} else {
			stampa.setUoForPrint(new it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk());
			stampa.setIsUOForPrintEnabled(true);
		}
			
	} catch (it.cnr.jada.persistency.PersistencyException pe){
		throw new ComponentException(pe);
	}
}
/**
 * inizializzaBulkPerStampa method comment.
 */
private void inizializzaBulkPerStampa(UserContext userContext, Stampa_ripartizione_costiVBulk stampa) throws it.cnr.jada.comp.ComponentException {

	stampa.setCd_cds(it.cnr.contab.utenze00.bp.CNRUserContext.getCd_cds(userContext));
	stampa.setEsercizio(CNRUserContext.getEsercizio(userContext));
	
	stampa.setCommessaForPrint(new ProgettoBulk());
	stampa.setModuloForPrint(new ProgettoBulk());
	stampa.setDipendenteForPrint(new V_dipendenteBulk());
	try{	    
		String cd_uo_scrivania = it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext);
		Unita_organizzativaHome uoHome = (it.cnr.contab.config00.sto.bulk.Unita_organizzativaHome)getHome(userContext, it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk.class);
		it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk uo = (it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk)uoHome.findByPrimaryKey(new it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk(cd_uo_scrivania));
		
		if (!uo.isUoCds()){
			stampa.setUoForPrint(uo);
			stampa.setIsUOForPrintEnabled(false);
		} else {
			stampa.setUoForPrint(new it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk());
			stampa.setIsUOForPrintEnabled(true);
		}
			
	} catch (it.cnr.jada.persistency.PersistencyException pe){
		throw new ComponentException(pe);
	}	
}
/**
 * inizializzaBulkPerStampa method comment.
 */
public it.cnr.jada.bulk.OggettoBulk inizializzaBulkPerStampa(it.cnr.jada.UserContext userContext, it.cnr.jada.bulk.OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
	
	if (bulk instanceof Stampa_imponibili_dipendentiVBulk)
		inizializzaBulkPerStampa(userContext, (Stampa_imponibili_dipendentiVBulk)bulk);
	else
	if(bulk instanceof Stampa_ripartizione_costiVBulk)
		inizializzaBulkPerStampa(userContext, (Stampa_ripartizione_costiVBulk)bulk);
		
	return bulk;
}
private boolean isCosto_del_dipendenteValidoPerModifica(UserContext userContext,V_cdp_matricolaBulk costo_del_dipendente) throws ComponentException {
	return
		costo_del_dipendente.getMese().intValue() == 0 ||
		isStatoAnaliticaValidoPerModificaCDP(
			userContext,
			costo_del_dipendente.getCd_unita_organizzativa(),
			costo_del_dipendente.getEsercizio(),
			costo_del_dipendente.getMese().intValue());
}
public boolean isEsercizioChiuso(UserContext userContext) throws ComponentException {
	try {
		EsercizioHome home = (EsercizioHome)getHome(userContext,EsercizioBulk.class);
		return home.isEsercizioChiuso(userContext);
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	}
}
protected boolean isEsercizioChiuso(UserContext userContext,Unita_organizzativaBulk uo) throws ComponentException {
	try {
		EsercizioHome home = (EsercizioHome)getHome(userContext,EsercizioBulk.class);
		return home.isEsercizioChiuso(userContext,CNRUserContext.getEsercizio(userContext),uo.getCd_unita_padre());
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	}
}
private boolean isStatoAnaliticaValidoPerModificaCDP(UserContext userContext,String cd_unita_organizzativa,Integer esercizio,int mese) throws ComponentException {
	try {
		LoggableStatement stm = new LoggableStatement(getConnection(userContext),
				"SELECT 1 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
				+"STIPENDI_COAN WHERE ESERCIZIO = ? AND CD_UO = ? AND MESE = ? AND PG_SCRITTURA_AN IS NOT NULL",true,this.getClass());
		try {
			stm.setInt(1,CNRUserContext.getEsercizio(userContext).intValue());
			stm.setString(2,cd_unita_organizzativa);
			stm.setInt(3,mese);
			java.sql.ResultSet rs = stm.executeQuery();
			try {
				return !rs.next();
			} finally {
				try{rs.close();}catch( java.sql.SQLException e ){};
			}
		} finally {
			try{stm.close();}catch( java.sql.SQLException e ){};
		}
	} catch(java.sql.SQLException e) {
		throw handleException(e);
	} 
}
private boolean isStatoPdgValidoPerModificaCDP(Pdg_preventivoBulk pdg) {
	return 
		pdg.getStato().equalsIgnoreCase(pdg.ST_A_CREAZIONE) || 
		pdg.getStato().equalsIgnoreCase(pdg.ST_B_MODIFICA) ||
		pdg.getStato().equalsIgnoreCase(pdg.ST_D_CHIUSURA_I) || 
		pdg.getStato().equalsIgnoreCase(pdg.ST_E_CHIUSO); 
}
private boolean isStatoPdgPValidoPerModificaCDP(Pdg_esercizioBulk pdgP) {
	if (pdgP==null)
		return false;
	else
	return 
		(pdgP.getStato().equalsIgnoreCase(pdgP.STATO_APERTURA_CDR) || 
		 pdgP.getStato().equalsIgnoreCase(pdgP.STATO_ESAMINATO_CDR)); 
}
/**
 *  Default
 *    PreCondition:
 *      Viene richiesto l'elenco delle mensilità relative alla ripartizione
 *		 dei costi stipendiali mensili.
 *    PostCondition:
 *      Viene effettuata una query sulla vista V_CDP_STATO_MENSILITA 
 *		 per l'UO a cui appartiene l'utente e con la condizione 'stato_scarico = 'P'
 *		 (mensilità già contabilizzate)
 */
public it.cnr.jada.util.RemoteIterator listaCdp_analitica(UserContext userContext) throws ComponentException {
	SQLBuilder sql = getHome(userContext,V_cdp_stato_mensilitaBulk.class).createSQLBuilder();
	sql.addClause("AND","esercizio",sql.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
	sql.addClause("AND","cd_unita_organizzativa",sql.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext));
	sql.addClause("AND","stato_carico",sql.EQUALS,"P");
	return iterator(userContext,sql,V_cdp_stato_mensilitaBulk.class,null);
}
/** 
  *  Costi del dipendente
  *    PreCondition:
  *      Viene richiesto l'elenco dei CDR utilizzabili per effettuare uno scarico dei costi di un dipendente su CDR
  *		 Il mese è 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella dei cdr con le clausole specificate più
  *      - il pdg associato al cdr deve essere in stato A,B,D o E    
  *      - il cdr deve appartenere alla unità organizzativa dell'utente per l'esercizio di scrivania
  *
  *  Costi stipendiali mensili
  *    PreCondition:
  *      Viene richiesto l'elenco dei CDR utilizzabili per effettuare uno scarico dei costi di un dipendente su CDR
  *		 Il mese è > 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella dei cdr con le clausole specificate più
  *      - il cdr deve appartenere alla unità organizzativa dell'utente per l'esercizio di scrivania
 */
public it.cnr.jada.util.RemoteIterator listaCdr(UserContext userContext,String cd_unita_organizzativa,int mese) throws ComponentException {
	SQLBuilder sql = getHome(userContext,CdrBulk.class).createSQLBuilder();
	if (mese == 0) {
		SQLBuilder sqlPdgP = getHome(userContext, Pdg_moduloBulk.class).createSQLBuilder();
		
		sqlPdgP.addSQLClause("AND","PDG_MODULO.ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sqlPdgP.addSQLClause("AND","PDG_MODULO.CD_CENTRO_RESPONSABILITA",sql.EQUALS,getCdrPdgP(userContext).getCd_centro_responsabilita());
		sqlPdgP.addSQLClause("AND","PDG_MODULO.STATO", sql.NOT_EQUALS, Pdg_moduloBulk.STATO_AC);
		sqlPdgP.addSQLClause("AND","PDG_MODULO.STATO", sql.NOT_EQUALS, Pdg_moduloBulk.STATO_AD);

		sql.addSQLNotExistsClause("AND", sqlPdgP);
	}
	sql.addSQLClause("AND","CDR.CD_UNITA_ORGANIZZATIVA",sql.EQUALS,cd_unita_organizzativa);
//	sql.addSQLClause("AND","CDR.CD_UNITA_ORGANIZZATIVA",sql.EQUALS,CNRUserContext.getCd_unita_organizzativa(userContext));
	return iterator(userContext,sql,CdrBulk.class,null);
}
/** 
  *  Costi del dipendente
  *    PreCondition:
  *      Viene richiesto l'elenco delle linee di attività utilizzabili per effettuare uno scarico dei costi di un dipendente su CDR
  *		 Il mese è 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle linee di attività con le clausole specificate più
  *      - il pdgp associato al cdr della linea di attività deve essere in stato AC, o AP    
  *      - la linea di attività deve appartenere al cdr specificato
  *		 - la linea di attività deve essere di spesa
  *		 - la linea di attività deve essere valida nell'esercizio di scrivania
  *
  *  Costi stipendiali mensili
  *    PreCondition:
  *      Viene richiesto l'elenco delle linee di attività utilizzabili per effettuare uno scarico dei costi di un dipendente su CDR
  *		 Il mese è > 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle linee di attività con le clausole specificate più
  *      - la linea di attività deve appartenere al cdr specificato
  *		 - la linea di attività deve essere di spesa
  *		 - la linea di attività deve essere valida nell'esercizio di scrivania
  */
public it.cnr.jada.util.RemoteIterator listaLinea_attivitaPerCdr(UserContext userContext,CdrBulk cdr,int mese, String tipo_rapporto, boolean isRapporto13) throws ComponentException {
	it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null;
	SQLBuilder sql = getHome(userContext,it.cnr.contab.config00.latt.bulk.WorkpackageBulk.class, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();
try {	
	if (mese == 0) {
		sql.addTableToHeader("PDG_MODULO");
		sql.addSQLJoin("PDG_MODULO.ESERCIZIO","V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
		sql.addSQLClause(FindClause.AND, "PDG_MODULO.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS, getCdrPdgP(userContext).getCd_centro_responsabilita());
		sql.addSQLJoin("PDG_MODULO.PG_PROGETTO","V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO");
		sql.openParenthesis(FindClause.AND);
		sql.addSQLClause(FindClause.AND,"PDG_MODULO.STATO", SQLBuilder.EQUALS, Pdg_moduloBulk.STATO_AC);
		sql.addSQLClause(FindClause.OR,"PDG_MODULO.STATO", SQLBuilder.EQUALS, Pdg_moduloBulk.STATO_AD);
		sql.closeParenthesis();
	}
	// Obbligatorio cofog sulle GAE
	Parametri_cnrBulk parCnr = Utility.createParametriCnrComponentSession().getParametriCnr(userContext, CNRUserContext.getEsercizio(userContext)); 
	if (parCnr.isCofogObbligatorio())
		sql.addSQLClause("AND","CD_COFOG",SQLBuilder.ISNOTNULL,null);
	if (parCnr.getFl_nuovo_pdg()) {
		sql.addSQLClause(FindClause.AND,"CD_PROGRAMMA",SQLBuilder.ISNOTNULL,null);
		sql.addSQLClause(FindClause.AND,"CD_MISSIONE",SQLBuilder.ISNOTNULL,null);
	}
//Filtro che estrae solo le linee di attività di spesa: 25/02/2002
	sql.openParenthesis(FindClause.AND);
	sql.addSQLClause(FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.TI_GESTIONE", SQLBuilder.EQUALS, WorkpackageBulk.TI_GESTIONE_SPESE);
	sql.addSQLClause(FindClause.OR, "V_LINEA_ATTIVITA_VALIDA.TI_GESTIONE", SQLBuilder.EQUALS, WorkpackageBulk.TI_GESTIONE_ENTRAMBE);
	sql.closeParenthesis();

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

//	sql.addSQLClause("AND","V_LINEA_ATTIVITA_VALIDA.CD_NATURA",sql.NOT_EQUALS,new Integer(5));

	sql.addTableToHeader("NATURA");
	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
	sql.addSQLClause(FindClause.AND, "NATURA.FL_SPESA",SQLBuilder.EQUALS,"Y");
	//Nel gestionale devono vedere tutte le GAE va tolto il controllo della natura per il tempo determiniato/indeterminato
	if (mese==0 && tipo_rapporto!=null &&
		(tipo_rapporto.equalsIgnoreCase(Costo_del_dipendenteBulk.TI_RAPPORTO_INDETERMINATO) ||
		 (tipo_rapporto.equalsIgnoreCase(Costo_del_dipendenteBulk.TI_RAPPORTO_DETERMINATO) && isRapporto13)))
		sql.addSQLClause(FindClause.AND, "NATURA.TIPO",SQLBuilder.EQUALS,NaturaBulk.TIPO_NATURA_FONTI_INTERNE);
	
	sql.addTableToHeader("FUNZIONE");
	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_FUNZIONE","FUNZIONE.CD_FUNZIONE");
	sql.addSQLClause(FindClause.AND, "FUNZIONE.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");

	/**
	 * Escludo la linea di attività dell'IVA C20
	 */
			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());
	}

	sql.addOrderBy("V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA");
	return iterator(userContext,sql,it.cnr.contab.config00.latt.bulk.WorkpackageBulk.class,null);
}
/** 
  *  Costi del dipendente
  *    PreCondition:
  *      Viene richiesto l'elenco delle linee di attività utilizzabili per effettuare la ripartizione dei residui delle percentuali di scarico di un dipendente
  *		 Il mese è 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle linee di attività tali che
  *      - il pdgp associato al cdr della linea di attività deve essere in stato AC, o AP    
  *      - la linea di attività deve appartenere ad un cdr dell'unità organizzativa dell'utente per l'esercizio di scrivania
  *
  *  Costi stipendiali mensili
  *    PreCondition:
  *      Viene richiesto l'elenco delle linee di attività utilizzabili per effettuare la ripartizione dei residui delle percentuali di scarico di un dipendente
  *		 Il mese è 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle linee di attività tali che
  *      - il pdg associato al cdr della linea di attività deve essere in stato A,B,D o E    
  *      - la linea di attività deve appartenere ad un cdr dell'unità organizzativa dell'utente per l'esercizio di scrivania
  */
public java.util.List listaLinea_attivitaPerRipartizioneResidui(UserContext userContext,String id_matricola,String cd_unita_organizzativa,int mese, String tipo_rapporto, boolean isRapporto13) throws ComponentException {
	try {
		BulkHome home = getHome(userContext,it.cnr.contab.config00.latt.bulk.WorkpackageBulk.class,"V_LINEA_ATTIVITA_VALIDA");
		SQLBuilder sql = home.createSQLBuilder();
		sql.addTableToHeader("CDR");
		sql.addSQLJoin("CDR.CD_CENTRO_RESPONSABILITA","V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA");
		sql.addSQLClause(FindClause.AND,"CDR.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS,cd_unita_organizzativa);
		sql.addClause(FindClause.AND,"ti_gestione",SQLBuilder.EQUALS,it.cnr.contab.config00.latt.bulk.WorkpackageBulk.TI_GESTIONE_SPESE);
		sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
		
		// Obbligatorio cofog sulle GAE
		Parametri_cnrBulk parCnr = Utility.createParametriCnrComponentSession().getParametriCnr(userContext, CNRUserContext.getEsercizio(userContext)); 
		if (parCnr.isCofogObbligatorio())
			sql.addSQLClause("AND","CD_COFOG",SQLBuilder.ISNOTNULL,null);
		if (parCnr.getFl_nuovo_pdg()) {
			sql.addSQLClause(FindClause.AND,"CD_PROGRAMMA",SQLBuilder.ISNOTNULL,null);
			sql.addSQLClause(FindClause.AND,"CD_MISSIONE",SQLBuilder.ISNOTNULL,null);
		}
// Tolta perchè voglio vedere tutte le linee di attività anche se sono già
// state scaricate
//		sql.addSQLClause("AND","NOT EXISTS ( SELECT 1 FROM ASS_CDP_LA WHERE ASS_CDP_LA.ESERCIZIO = LINEA_ATTIVITA.ESERCIZIO AND ASS_CDP_LA.CD_CENTRO_RESPONSABILITA = LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA AND ASS_CDP_LA.CD_LINEA_ATTIVITA = LINEA_ATTIVITA.CD_LINEA_ATTIVITA )");

		if (mese == 0) {
			sql.addTableToHeader("PDG_MODULO");
			sql.addSQLJoin("PDG_MODULO.ESERCIZIO","V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
			sql.addSQLClause(FindClause.AND, "PDG_MODULO.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS, getCdrPdgP(userContext).getCd_centro_responsabilita());
			sql.addSQLJoin("PDG_MODULO.PG_PROGETTO","V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO");
			sql.openParenthesis(FindClause.AND);
			sql.addSQLClause(FindClause.AND,"PDG_MODULO.STATO", SQLBuilder.EQUALS, Pdg_moduloBulk.STATO_AC);
			sql.addSQLClause(FindClause.OR,"PDG_MODULO.STATO", SQLBuilder.EQUALS, Pdg_moduloBulk.STATO_AD);
			sql.closeParenthesis();
		}
		
		sql.addTableToHeader("NATURA");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");

		sql.addSQLClause(FindClause.AND, "NATURA.FL_SPESA",SQLBuilder.EQUALS,"Y");
		//Nel gestionale devono vedere tutte le GAE va tolto il controllo della natura per il tempo determiniato/indeterminato
		if (mese==0 && tipo_rapporto!=null &&
				(tipo_rapporto.equalsIgnoreCase(Costo_del_dipendenteBulk.TI_RAPPORTO_INDETERMINATO) ||
				 (tipo_rapporto.equalsIgnoreCase(Costo_del_dipendenteBulk.TI_RAPPORTO_DETERMINATO) && isRapporto13)))
			sql.addSQLClause(FindClause.AND, "NATURA.TIPO",SQLBuilder.EQUALS,NaturaBulk.TIPO_NATURA_FONTI_INTERNE);

		sql.addTableToHeader("FUNZIONE");
		sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_FUNZIONE","FUNZIONE.CD_FUNZIONE");
		sql.addSQLClause(FindClause.AND, "FUNZIONE.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");

		/**
		 * 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());
		}

		java.util.List list = home.fetchAll(sql);
		getHomeCache(userContext).fetchAll(userContext,home);
		return list;
	} catch(Throwable e) {
		throw handleException(e);
	}
}
public it.cnr.jada.util.RemoteIterator listaStipendi_cofi(UserContext userContext) throws ComponentException {
	SQLBuilder sql = getHome(userContext,Stipendi_cofiBulk.class).createSQLBuilder();
	sql.addClause("AND","esercizio",sql.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
	return iterator(userContext,sql,Stipendi_cofiBulk.class,null);
}
/** 
  *  Costi del dipendente
  *    PreCondition:
  *      Viene richiesto l'elenco delle Unità organizzative utilizzabili per effettuare uno scarico dei costi di un dipendente su altra UO
  *		 Il mese è 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle UO con le clausole specificate più
  *      - il pdgP associato al cds responsabile dell'UO deve essere in stato AC, o EC    
  *      - l'uo deve essere diversa da quella a cui appartiene la matricola
  *      - l'uo cui imputare i costi di un dipendente non deve aver già effettuato lo scarico dei costi 
  *
  *  Costi stipendiali mensili
  *    PreCondition:
  *      Viene richiesto l'elenco delle Unità organizzative utilizzabili per effettuare uno scarico dei costi di un dipendente su altra UO
  *		 Il mese è > 0
  *    PostCondition:
  *      Viene restituita una query sulla tabella delle UO con le clausole specificate più
  *      - l'uo deve essere diversa da quella a cui appartiene la matricola
  *		 - non deve essere ancora stata generata una ripartizione analitica per l'uo nel mese selezionato
  */
public it.cnr.jada.util.RemoteIterator listaUnita_organizzativa(UserContext userContext,String cd_unita_organizzativa,int mese) throws ComponentException {
	//nel caso della ripartizione mensile occorre far vedere ance le UO chiuse
	BulkHome home = getHome(userContext,Unita_organizzativaBulk.class,"V_UNITA_ORGANIZZATIVA_VALIDA");
	SQLBuilder sql = home.createSQLBuilder();
	sql.addClause(FindClause.AND,"cd_unita_organizzativa",SQLBuilder.NOT_EQUALS,cd_unita_organizzativa);
	sql.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));

	if (mese == 0) {
		sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "A");
		sql.addSQLJoin("V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO","A.ESERCIZIO");
		sql.addSQLJoin("V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA","A.CD_ROOT");

		sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "B");
		sql.addSQLJoin("A.ESERCIZIO","B.ESERCIZIO");
		sql.addSQLJoin("A.CD_CDS","B.CD_CDS");
		sql.addSQLClause(FindClause.AND,"B.CD_TIPO_LIVELLO", SQLBuilder.EQUALS, V_struttura_organizzativaHome.LIVELLO_CDR);
		sql.addSQLClause(FindClause.AND,"B.FL_CDR_UO", SQLBuilder.EQUALS, "Y");
		sql.addSQLClause(FindClause.AND,"B.FL_UO_CDS", SQLBuilder.EQUALS, "Y");

		sql.addTableToHeader("PDG_ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.ESERCIZIO","B.ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.CD_CENTRO_RESPONSABILITA","B.CD_ROOT");

		sql.openParenthesis(FindClause.AND);
		sql.addSQLClause(FindClause.AND,"PDG_ESERCIZIO.STATO", SQLBuilder.EQUALS, Pdg_esercizioBulk.STATO_APERTURA_CDR);
		sql.addSQLClause(FindClause.OR,"PDG_ESERCIZIO.STATO", SQLBuilder.EQUALS, Pdg_esercizioBulk.STATO_ESAMINATO_CDR);
		sql.closeParenthesis();
		
		BulkHome homeAss = getHome(userContext,Ass_cdp_laBulk.class);
		SQLBuilder sqlAss = homeAss.createSQLBuilder();
		sqlAss.resetColumns();
		sqlAss.addColumn("1");

		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");

		sqlAss.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAss.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAss.addSQLJoin("C.CD_CDS","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_PADRE");

		sqlAss.openParenthesis(FindClause.AND);
		sqlAss.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO);
		sqlAss.addSQLClause(FindClause.OR,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_PDGP);
		sqlAss.closeParenthesis();
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlAss);
	} else {
		BulkHome homeAss = getHome(userContext,Ass_cdp_laBulk.class);
		SQLBuilder sqlAss = homeAss.createSQLBuilder();
		sqlAss.resetColumns();
		sqlAss.addColumn("1");

		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");

		sqlAss.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAss.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAss.addSQLJoin("C.CD_CDS","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_PADRE");

		sqlAss.openParenthesis(FindClause.AND);
		sqlAss.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
		sqlAss.closeParenthesis();
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlAss);

		BulkHome homeCoan = getHome(userContext,Stipendi_coanBulk.class);
		SQLBuilder sqlCoan = homeCoan.createSQLBuilder();
		sqlCoan.resetColumns();
		sqlCoan.addColumn("1");

		sqlCoan.addClause(FindClause.AND,"esercizio",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
		sqlCoan.addSQLJoin("STIPENDI_COAN.CD_UO","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA");
		sqlCoan.addClause(FindClause.AND,"pg_scrittura_an",SQLBuilder.ISNOTNULL,null);
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlCoan);
		//sql.addSQLClause("AND","NOT EXISTS ( SELECT 1 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"STIPENDI_COAN WHERE STIPENDI_COAN.PG_SCRITTURA_AN IS NOT NULL AND STIPENDI_COAN.ESERCIZIO = UNITA_ORGANIZZATIVA.ESERCIZIO AND STIPENDI_COAN.CD_UO = UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA )");
	}

	return iterator(userContext,sql,Unita_organizzativaBulk.class,null);
}
public void lockMatricola(UserContext userContext,String id_matricola,int mese) throws ComponentException, BusyResourceException {
	try {
		SQLBuilder sql = getHome(userContext,Costo_del_dipendenteBulk.class).createSQLBuilder();
		sql.addSQLClause(FindClause.AND,"ESERCIZIO",SQLBuilder.EQUALS,it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause(FindClause.AND,"ID_MATRICOLA",SQLBuilder.EQUALS,id_matricola);
		sql.addSQLClause(FindClause.AND,"MESE",SQLBuilder.EQUALS,new Integer(mese));
		sql.setForUpdate(true);
		LoggableStatement stm = sql.prepareStatement(getConnection(userContext));
		try {
			java.sql.ResultSet rs = stm.executeQuery();
			while (rs.next());
		} finally {
			try{stm.close();}catch( java.sql.SQLException e ){};
		}
	} catch(java.sql.SQLException e) {
		throw new BusyResourceException();
	}
}
/** 
  *  default
  *    PreCondition:
  *      Viene richiesta la ripartizione dei residui delle percentuali di scarico di un dipendente su un elenco di linee di attività.
  *    PostCondition:
  *      Detto R il residuo del totale dei costi già scaricati per calcolato sottraendo a 100%:
  *      - la somma degli ass_cdp_la già scaricati sui cdr dell'uo dell'utente 
  *      - se l'uo dell'utente è quella della matricola la somma degli ass_cdp_uo accettati o in stato iniziale;
  *      
  *      Vengono create nuove righe ass_cdp_la, una per ognli linea di attività specificata, con le seguenti condizioni:
  *      - le percentuali per ogni anno sono calcolate dividendo R per il numero di linee di attività scelte; sull'ultima linea di attività viene aggiunta l'eventuale resto della divisione (per arrivare a 100 con 2 cifre decimali)
  *      - se una linea di attività è già stata scaricata per quella matricola le percentuali cacolate al precedente punto vengono sommate a quelle già esistenti.
  *  Costi scaricati per linea di attivita non validi
  *    PreCondition:
  *      Viene richiesta la ripartizione dei residui delle percentuali di scarico di un dipendente su un elenco di linee di attività e qualcuno degli ass_cdp_la generati non è valido (validaAss_cdp_la genera un'eccezione)
  *    PostCondition:
  *      Viene lasciata uscire l'eccezione di validazione
 */
public void ripartizioneResidui(it.cnr.jada.UserContext userContext, java.lang.String id_matricola,String cd_unita_organizzativa,int mese,java.util.Collection linee_attivita) throws it.cnr.jada.comp.ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Funzione non disponibile ad esercizio chiuso.");

	try {
		// Lock della matricola
		lockMatricola(userContext,id_matricola,mese);

		// Cerco la riga di ass_cdp_uo da cui proviene la matricola
		// Se non esiste vuol dire che la matricola appartiene alla UO dell'utente
		Ass_cdp_uoBulk ass_cdp_uo = (Ass_cdp_uoBulk)getHome(userContext,Ass_cdp_uoBulk.class).findByPrimaryKey(new Ass_cdp_uoBulk(
			cd_unita_organizzativa,
			CNRUserContext.getEsercizio(userContext),
			id_matricola,
			new Integer(mese)));

		if (ass_cdp_uo != null && ass_cdp_uo.isStato_iniziale())
			throw new ApplicationException("Per poter effettuare lo scarico di una matricola proveniente da un altra unità organizzativa è necessario prima accettare la contrattazione.");

		// Eseguo query per il calcolo dei totali già scaricati
		LoggableStatement stm = new LoggableStatement(getHomeCache(userContext).getConnection(),
				"SELECT PRC_A1,PRC_A2,PRC_A3 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
				+"V_CDP_TOTALI WHERE ESERCIZIO = ? AND ID_MATRICOLA = ? AND MESE = ? AND "
				+" CD_UNITA_ORGANIZZATIVA = ?",true,this.getClass());
		stm.setInt(1,CNRUserContext.getEsercizio(userContext).intValue());
		stm.setString(2,id_matricola);
		stm.setInt(3,mese);
		stm.setString(4,cd_unita_organizzativa);
		java.sql.ResultSet rs = stm.executeQuery();

		// Costanti
		final java.math.BigDecimal BD_100 = java.math.BigDecimal.valueOf(100);
		final java.math.BigDecimal BD_LATT_S = java.math.BigDecimal.valueOf(linee_attivita.size());
		
		// Calcolo del residuo per ogni anno
		java.math.BigDecimal prc_a1 = BD_100;
		java.math.BigDecimal prc_a2 = BD_100;
		java.math.BigDecimal prc_a3 = BD_100;
		if (rs.next()) {
			prc_a1 = prc_a1.subtract(rs.getBigDecimal(1));
			prc_a2 = prc_a2.subtract(rs.getBigDecimal(2));
			prc_a3 = prc_a3.subtract(rs.getBigDecimal(3));
		} 
		try{rs.close();}catch( java.sql.SQLException e ){};

		// Calcolo della percentuale ripartita per ogni anno
		prc_a1 = prc_a1.divide(BD_LATT_S,2,java.math.BigDecimal.ROUND_HALF_UP);
		prc_a2 = prc_a2.divide(BD_LATT_S,2,java.math.BigDecimal.ROUND_HALF_UP);
		prc_a3 = prc_a3.divide(BD_LATT_S,2,java.math.BigDecimal.ROUND_HALF_UP);

		Ass_cdp_laBulk ass_cdp_la = null;
		// Creazione/modifica delle Ass_cdp_la
		for (java.util.Iterator i = linee_attivita.iterator();i.hasNext();) {
			it.cnr.contab.config00.latt.bulk.WorkpackageBulk linea = (it.cnr.contab.config00.latt.bulk.WorkpackageBulk)i.next();

			// Cerco una ass_cdp_la per la linea attivita corrente
			Ass_cdp_laBulk ass_cdp_la_pk = new Ass_cdp_laBulk(
				linea.getCd_centro_responsabilita(),
				linea.getCd_linea_attivita(),
				CNRUserContext.getEsercizio(userContext),
				id_matricola,
				new Integer(mese));
			ass_cdp_la = (Ass_cdp_laBulk)getHome(userContext,ass_cdp_la_pk).findByPrimaryKey(ass_cdp_la_pk);
			
			if (ass_cdp_la != null) {
				// Se esiste aggiungo alla percentuale già scaricata la
				// percentuale residua ripartita
				ass_cdp_la.setPrc_la_a1(ass_cdp_la.getPrc_la_a1().add(prc_a1));
				ass_cdp_la.setPrc_la_a2(ass_cdp_la.getPrc_la_a2().add(prc_a2));
				ass_cdp_la.setPrc_la_a3(ass_cdp_la.getPrc_la_a3().add(prc_a3));
				ass_cdp_la.setToBeUpdated();
			} else {
				// Se non esiste creo una nuova ass_cdp_la con la
				// percentuale residua ripartita
				ass_cdp_la = ass_cdp_la_pk;
				ass_cdp_la.setToBeCreated();
				ass_cdp_la.setFl_dip_altra_uo(ass_cdp_uo == null ? Boolean.FALSE : Boolean.TRUE);
				ass_cdp_la.setStato(ass_cdp_la.STATO_NON_SCARICATO);
				ass_cdp_la.setPrc_la_a1(prc_a1);
				ass_cdp_la.setPrc_la_a2(prc_a2);
				ass_cdp_la.setPrc_la_a3(prc_a3);
			}
			ass_cdp_la.setUser(userContext.getUser());

			// Controllo di validità della ass_cdp_la creata/modificata
			validaAss_cdp_la(userContext,ass_cdp_la);

			// Salvo la ass_cpd_la
			makeBulkPersistent(userContext,ass_cdp_la);
		}

		if (ass_cdp_la != null) {
			// Se è l'ultima linea di attività aggiungo il resto della divisione
			rs = stm.executeQuery();
			rs.next();
			ass_cdp_la.setPrc_la_a1(ass_cdp_la.getPrc_la_a1().add(BD_100.subtract(rs.getBigDecimal(1))));
			ass_cdp_la.setPrc_la_a2(ass_cdp_la.getPrc_la_a2().add(BD_100.subtract(rs.getBigDecimal(2))));
			ass_cdp_la.setPrc_la_a3(ass_cdp_la.getPrc_la_a3().add(BD_100.subtract(rs.getBigDecimal(3))));
			ass_cdp_la.setToBeUpdated();
			try{rs.close();}catch( java.sql.SQLException e ){};
			makeBulkPersistent(userContext,ass_cdp_la);
		}

	} catch(Throwable e) {
		throw handleException(e);
	}
}
/** 
  *  default
  *    PreCondition:
  *      Viene richiesto il salvatggio dello stato di scarico dei costi di un dipendente
  *    PostCondition:
  *      Tutti gli oggetti (Ass_cdp_laBulk e Ass_cdp_uoBulk) vengono resi persistenti; Viene restituito un oggetto  Costi_dipendenteVBulk conforme al valore di ritorno del metodo "caricaCosti_dipendente"
  *  Matricola modificata in concorrenza con altro utente
  *    PreCondition:
  *      Viene richiesto il salvatggio dello stato di scarico dei costi di un dipendente e qualche altro utente sta effettuando la medesima operazione sulla stessa matricola
  *    PostCondition:
  *      Viene generata una BusyResourceException
  *  Risorsa occupata per i Costi stipendiali mensili 
  *    PreCondition:
  *      Viene richiesto il salvatggio dello stato di scarico dei costi di un dipendente e qualche altro utente sta tentando di generare la ripartizione analitica
  *    PostCondition:
  *      Viene generata una BusyResourceException
  *  Costi scaricati per linea di attivita non validi
  *    PreCondition:
  *      Viene richiesto il salvatggio dello stato di scarico dei costi di un dipendente e qualcuno degli ass_cdp_la modificati non è valido (validaAss_cdp_la genera un'eccezione)
  *    PostCondition:
  *      Viene lasciata uscire l'eccezione di validazione
  *  Costi scaricati su altra unità organizzativa non validi
  *    PreCondition:
  *      Viene richiesto il salvatggio dello stato di scarico dei costi di un dipendente e qualcuno degli ass_cdp_uo modificati non è valido (validaAss_cdp_uo genera un'eccezione)
  *    PostCondition:
  *      Viene lasciata uscire l'eccezione di validazione
  *  Somma delle percentuali scaricate superiore a 100%
  *    PreCondition:
  *      Viene richiesto il salvataggio dello stato di scarico dei costi di un dipendente e la somma delle percentuali scaricate sui cdr dell'unità organizzativa dell'utente più la somma delle percentuali scaricate su altre UO è superiore a 100 in qualche anno
  *    PostCondition:
  *      Viene generata una eccezione con il messaggio "La somma delle percentuali scaricate è superiore a 100%"
 */
public OggettoBulk salvaCosti_dipendente(UserContext userContext,Costi_dipendenteVBulk costi_dipendente) throws ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Importi non modificabili ad esercizio chiuso.");

	for (Iterator iterator = costi_dipendente.getCosti_dipendenti().iterator(); iterator.hasNext();) {
		V_cdp_matricolaBulk cdp = iterator.next();
		cdp = salvaCosti_dipendente(userContext, cdp);
	}
	return costi_dipendente;
}
public V_cdp_matricolaBulk salvaCosti_dipendente(UserContext userContext,V_cdp_matricolaBulk cdp) throws ComponentException {
	// 05/09/2003
	// Aggiunto controllo sulla chiusura dell'esercizio
	if (isEsercizioChiuso(userContext))
		throw new ApplicationException("Importi non modificabili ad esercizio chiuso.");

	try {
		// Lock della matricola
		lockMatricola(userContext,cdp.getId_matricola(),cdp.getMese());

		// Controllo dei constraint SQL (campi not null, lunghezza...)
		for (java.util.Iterator j = cdp.getCostiScaricati().iterator();j.hasNext();)
			checkSQLConstraints(userContext,(OggettoBulk)j.next());

		// Controllo di validità degli ass_cdp_la modificati o cancellati
		for (java.util.Iterator i = cdp.getCostiScaricati().iterator();i.hasNext();) {
			Ass_cdp_laBulk assCdpLa = (Ass_cdp_laBulk)i.next();
			validaAss_cdp_la(userContext,assCdpLa);
			if (cdp.getMese()!=0)
				assCdpLa.setStato(Ass_cdp_laBulk.STATO_SCARICATO_PROVVISORIO);
		}
		for (java.util.Iterator i = cdp.getCostiScaricati().deleteIterator();i.hasNext();)
			validaAss_cdp_la(userContext,(Ass_cdp_laBulk)i.next());

		// Controllo di validità degli ass_cdp_uo modificati o cancellati
		if (cdp.getCostiScaricatiAltraUO() != null) {
			for (java.util.Iterator i = cdp.getCostiScaricatiAltraUO().iterator();i.hasNext();) {
				Ass_cdp_uoBulk assCdpUo = (Ass_cdp_uoBulk)i.next();
				validaAss_cdp_uo(userContext,assCdpUo);
			}
			for (java.util.Iterator i = ((BulkList)cdp.getCostiScaricatiAltraUO()).deleteIterator();i.hasNext();)
				validaAss_cdp_uo(userContext,(Ass_cdp_uoBulk)i.next());
		}

		// Rendo persistenti gli ass_cdp_la e gli ass_cdp_uo modificati
		makeBulkListPersistent(userContext,(BulkList)cdp.getCostiScaricati());
		makeBulkListPersistent(userContext,(BulkList)cdp.getCostiScaricatiAltraUO());
		// Rendo persistente l'ass_cdp_uo che rappresenta il costo caricato
		// (se l'utente ha modificato lo stato di scarico)
		if (cdp.getCostoCaricato() != null)
			makeBulkPersistent(userContext,cdp.getCostoCaricato());

		// Eseguo una query per controllare che il totale dei costi scaricati
		// non sia superiore a 100%
		LoggableStatement stm = new LoggableStatement(getHomeCache(userContext).getConnection(),
				"SELECT 0 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
				+"V_CDP_TOTALI WHERE ESERCIZIO = ? AND ID_MATRICOLA = ? AND MESE = ? AND "
				+" CD_UNITA_ORGANIZZATIVA = ? AND ( PRC_A1 > 100 OR PRC_A2 > 100 OR PRC_A3 > 100 )",true,this.getClass());
		stm.setInt(1,cdp.getEsercizio());
		stm.setString(2,cdp.getId_matricola());
		stm.setInt(3,cdp.getMese());
		stm.setString(4,cdp.getCd_unita_organizzativa());
		java.sql.ResultSet rs = stm.executeQuery();
		if (rs.next())
			throw new ApplicationException("La somma delle percentuali scaricate è superiore a 100%");
		try{rs.close();}catch( java.sql.SQLException e ){};
		try{stm.close();}catch( java.sql.SQLException e ){};

		return cdp;
	} catch(Throwable e) {
		throw handleException(e);
	}
}
/**
  * Costruisce l'struzione SQL corrispondente ad una ricerca con le clausole specificate.
  * Aggiunge una clausola a tutte le operazioni di ricerca eseguite sulla Unita Organizzativa
  *
  * Nome: Richiesta di ricerca di una Unita Organizzativa per la Stampa dei degli Imponibili Dipendenti
  * Pre: E' stata generata la richiesta di ricerca delle UO associate al Cds di scrivania
  * Post: Viene restituito l'SQLBuilder per filtrare le UO
  *		  in base al cds di scrivania
  *
  * @param userContext	lo userContext che ha generato la richiesta
  * @param stampa		l'OggettoBulk che rappresenta il contesto della ricerca.
  * @param uo			l'OggettoBulk da usare come prototipo della ricerca; sul prototipo vengono
  *						costruite delle clausole aggiuntive che vengono aggiunte in AND alle clausole specificate.
  * @param				clauses L'albero logico delle clausole da applicare alla ricerca
  * @return Un'istanza di SQLBuilder contenente l'istruzione SQL da eseguire e tutti i parametri
  *			della query.
  *
**/
public SQLBuilder selectUoForPrintByClause(UserContext userContext, Stampa_imponibili_dipendentiVBulk stampa, it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk uo, CompoundFindClause clauses) throws ComponentException {

	Unita_organizzativaHome home = (Unita_organizzativaHome)getHome(userContext, it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk.class);
	SQLBuilder sql = home.createSQLBuilder();
	sql.addClause("AND", "cd_unita_padre", sql.EQUALS, stampa.getCd_cds());
	sql.addClause(clauses);
	return sql;
}

/**
  * Costruisce l'struzione SQL corrispondente ad una ricerca con le clausole specificate.
  * Aggiunge una clausola a tutte le operazioni di ricerca eseguite sulla Unita Organizzativa
  *
  * Nome: Richiesta di ricerca di una Unita Organizzativa per la Stampa dei degli Imponibili Dipendenti
  * Pre: E' stata generata la richiesta di ricerca delle UO associate al Cds di scrivania
  * Post: Viene restituito l'SQLBuilder per filtrare le UO
  *		  in base al cds di scrivania
  *
  * @param userContext	lo userContext che ha generato la richiesta
  * @param stampa		l'OggettoBulk che rappresenta il contesto della ricerca.
  * @param uo			l'OggettoBulk da usare come prototipo della ricerca; sul prototipo vengono
  *						costruite delle clausole aggiuntive che vengono aggiunte in AND alle clausole specificate.
  * @param				clauses L'albero logico delle clausole da applicare alla ricerca
  * @return Un'istanza di SQLBuilder contenente l'istruzione SQL da eseguire e tutti i parametri
  *			della query.
  *
**/
public SQLBuilder selectUoForPrintByClause(UserContext usercontext, Stampa_ripartizione_costiVBulk stampa_ripartizione_costivbulk, Unita_organizzativaBulk unita_organizzativabulk, CompoundFindClause compoundfindclause)
	throws ComponentException
{
	Unita_organizzativaHome unita_organizzativahome = (Unita_organizzativaHome)getHome(usercontext, it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk.class);
	SQLBuilder sqlbuilder = unita_organizzativahome.createSQLBuilder();
	sqlbuilder.addClause("AND", "cd_unita_padre", sqlbuilder.EQUALS, stampa_ripartizione_costivbulk.getCd_cds());
	sqlbuilder.addClause(compoundfindclause);
	return sqlbuilder;
}
public SQLBuilder selectDipendenteForPrintByClause(UserContext usercontext, Stampa_ripartizione_costiVBulk stampa_ripartizione_costivbulk, V_dipendenteBulk dipendenteBulk, CompoundFindClause compoundfindclause)
	throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	V_dipendenteHome dipendentehome = (V_dipendenteHome)getHome(usercontext, V_dipendenteBulk.class,"V_DIPENDENTE_RID");
	SQLBuilder sqlbuilder = dipendentehome.createSQLBuilder();
	sqlbuilder.addSQLClause("AND", "ESERCIZIO", sqlbuilder.EQUALS, stampa_ripartizione_costivbulk.getEsercizio());
	// Se uo 999.000 in scrivania: visualizza tutti i dipendenti
	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())){
		sqlbuilder.addSQLClause("AND","cd_unita_organizzativa",sqlbuilder.EQUALS,CNRUserContext.getCd_unita_organizzativa(usercontext));	
	}
	sqlbuilder.setDistinctClause(Boolean.TRUE);
	sqlbuilder.addClause(compoundfindclause);
	sqlbuilder.setOrderBy("nominativo",it.cnr.jada.util.OrderConstants.ORDER_ASC);
	return sqlbuilder;
}
public SQLBuilder selectCommessaForPrintByClause(UserContext usercontext, Stampa_ripartizione_costiVBulk stampa_ripartizione_costivbulk, ProgettoBulk progettoBulk, CompoundFindClause compoundfindclause)
	throws ComponentException, it.cnr.jada.persistency.PersistencyException, RemoteException, EJBException
{
	Parametri_cnrBulk par=Utility.createParametriCnrComponentSession().getParametriCnr(usercontext, CNRUserContext.getEsercizio(usercontext));
	ProgettoHome progettohome = (ProgettoHome)getHome(usercontext, ProgettoBulk.class,"V_PROGETTO_PADRE");
	SQLBuilder sqlbuilder = progettohome.createSQLBuilder();
	if (par.getFl_nuovo_pdg())
		sqlbuilder.addSQLClause("AND", "LIVELLO", sqlbuilder.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_PRIMO);
	else
		sqlbuilder.addSQLClause("AND", "LIVELLO", sqlbuilder.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_SECONDO);
	sqlbuilder.addSQLClause("AND", "TIPO_FASE", sqlbuilder.EQUALS, ProgettoBulk.TIPO_FASE_PREVISIONE);
	sqlbuilder.addSQLClause("AND", "ESERCIZIO", sqlbuilder.EQUALS, stampa_ripartizione_costivbulk.getEsercizio());
	// 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 (par.getFl_nuovo_pdg())
			sqlbuilder.addSQLExistsClause("AND",progettohome.abilitazioniProgetti(usercontext));
		else
			sqlbuilder.addSQLExistsClause("AND",progettohome.abilitazioniCommesse(usercontext));
	}	
	sqlbuilder.addClause(compoundfindclause);
	return sqlbuilder;
}
public SQLBuilder selectModuloForPrintByClause(UserContext usercontext, Stampa_ripartizione_costiVBulk stampa_ripartizione_costivbulk, ProgettoBulk progettoBulk, CompoundFindClause compoundfindclause)
	throws ComponentException, it.cnr.jada.persistency.PersistencyException, RemoteException, EJBException
{
	Parametri_cnrBulk par=Utility.createParametriCnrComponentSession().getParametriCnr(usercontext, CNRUserContext.getEsercizio(usercontext));
	ProgettoHome progettohome = (ProgettoHome)getHome(usercontext, ProgettoBulk.class,"V_PROGETTO_PADRE");
	SQLBuilder sqlbuilder = progettohome.createSQLBuilder();
	if (par.getFl_nuovo_pdg())
		sqlbuilder.addSQLClause("AND", "LIVELLO", sqlbuilder.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_SECONDO);
	else
		sqlbuilder.addSQLClause("AND", "LIVELLO", sqlbuilder.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_TERZO);

	sqlbuilder.addSQLClause("AND", "TIPO_FASE", sqlbuilder.EQUALS, ProgettoBulk.TIPO_FASE_PREVISIONE);
	sqlbuilder.addSQLClause("AND", "ESERCIZIO", sqlbuilder.EQUALS, stampa_ripartizione_costivbulk.getEsercizio());
	if(stampa_ripartizione_costivbulk.getCommessaForPrint()!= null && stampa_ripartizione_costivbulk.getCommessaForPrint().getPg_progetto()!=null)
	  sqlbuilder.addClause("AND", "pg_progetto_padre", sqlbuilder.EQUALS, stampa_ripartizione_costivbulk.getCommessaForPrint().getPg_progetto());
	// 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 (par.getFl_nuovo_pdg())
			sqlbuilder.addSQLExistsClause("AND",progettohome.abilitazioniCommesse(usercontext));
		else
			sqlbuilder.addSQLExistsClause("AND",progettohome.abilitazioniModuli(usercontext));
	}	  
	sqlbuilder.addClause(compoundfindclause);
	return sqlbuilder;
}
/**
 * stampaConBulk method comment.
 */
public it.cnr.jada.bulk.OggettoBulk stampaConBulk(it.cnr.jada.UserContext aUC, it.cnr.jada.bulk.OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {
	return bulk;
}
/** 
  *  Costi del dipendente, PDG chiuso
  *    PreCondition:
  *		 L'Ass_cdp_la ha mese = 0
  *      Viene richiesta una operazione di persistenza su un Ass_cdp_la e il PDG del cdr associato è in stato diverso da A, B, D o E
  *    PostCondition:
  *      Viene generata una ApplicationException con il messaggio "Il pdg relativo del cdr xxx.yy.zzz è già chiuso. Non è possibile scaricarvi costi."
  */
private void validaAss_cdp_la(UserContext userContext,Ass_cdp_laBulk ass_cdp_la) throws ComponentException {
	try {
		// Controllo che tutti i cdr su cui scarico i costi dei dipendenti
		// non siano già chiusi.
		if (ass_cdp_la.getCrudStatus() != ass_cdp_la.NORMAL) {
			if (ass_cdp_la.getMese().intValue() == 0) {
				CdrBulk cdrPdgP = getCdrPdgP(userContext);
				Pdg_esercizioBulk pdgp =
					(Pdg_esercizioBulk)getHome(userContext,Pdg_esercizioBulk.class).findAndLock(
								new Pdg_esercizioBulk(
									it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext),
							        cdrPdgP.getCd_centro_responsabilita()
								)
					);
				if (!isStatoPdgPValidoPerModificaCDP(pdgp))
					throw new ApplicationException("Il pdgP relativo del cdr "+getCdrPdgP(userContext).getCd_centro_responsabilita()+" è già chiuso. Non è possibile scaricarvi costi.");
			}
		}
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	} catch(OutdatedResourceException e) {
		throw handleException(e);
	} catch(BusyResourceException e) {
		throw handleException(e);
	}
}
/** 
  *  Costi del dipendente, PDG chiuso
  *    PreCondition:
  *		 L'Ass_cdp_uo ha mese = 0
  *      Viene richiesta una operazione di persistenza su un Ass_cdp_uo e il PDG del cdr responsabile dell'UO associata è in stato diverso da A, B, D o E
  *    PostCondition:
  *      Viene generata una ApplicationException con il messaggio "Il pdg relativo del cdr responsabile dell'uo xxx.yy è già chiuso. Non è possibile scaricarvi costi."
  *
  *  Costi stipendiali mensili, ripartizione analitica già generata
  *    PreCondition:
  *		 L'Ass_cdp_uo ha mese > 0
  *      Viene richiesta una operazione di persistenza su un Ass_cdp_uo ed è già stata generata la scrittura analitica per il mese selezionato
  *    PostCondition:
  *      Viene generata una ApplicationException con il messaggio "Non è possibile modificare la ripartizione perchè è già stato effettuato lo scarico in analitica per l'unità organizzativa xyz.abc"
  */
private void validaAss_cdp_uo(UserContext userContext,Ass_cdp_uoBulk ass_cdp_uo) throws ComponentException {
	try {
		if (ass_cdp_uo.getCrudStatus() != ass_cdp_uo.NORMAL) {
			// 05/09/2003
			// Aggiunto controllo sulla chiusura dell'esercizio
			if (isEsercizioChiuso(userContext,ass_cdp_uo.getUnita_organizzativa()))
				throw new ApplicationException("Non è possibile modificare la ripartizione verso l'uo "+ass_cdp_uo.getCd_unita_organizzativa()+" ad esercizio chiuso.");

			if (ass_cdp_uo.getMese().intValue() == 0) {
				// Controllo che il cdr responsabilie dell'uo su cui scarico i costi dei dipendenti
				// non abbia già il pdg chiuso
				BulkHome home = getHome(userContext,Pdg_esercizioBulk.class);
				SQLBuilder sql = home.createSQLBuilder();
				sql.addSQLClause("AND","PDG_ESERCIZIO.ESERCIZIO",sql.EQUALS,ass_cdp_uo.getEsercizio());

				V_struttura_organizzativaHome struttHome = (V_struttura_organizzativaHome)getHome(userContext,V_struttura_organizzativaBulk.class);
				CdrBulk cdr = struttHome.findCDRBaseCDS(ass_cdp_uo.getUnita_organizzativa(), ass_cdp_uo.getEsercizio());

				sql.addSQLClause("AND","PDG_ESERCIZIO.CD_CENTRO_RESPONSABILITA",sql.EQUALS,cdr.getCd_centro_responsabilita());

				sql.setForUpdate(true);
				Pdg_esercizioBulk pdgp = (Pdg_esercizioBulk)home.fetchAndLock(sql);
				if (!isStatoPdgPValidoPerModificaCDP(pdgp))
					throw new ApplicationException("Il pdgP relativo del cdr responsabile dell'uo"+ass_cdp_uo.getCd_unita_organizzativa()+" è già chiuso. Non è possibile scaricarvi costi.");
			} else {
				if (!isStatoAnaliticaValidoPerModificaCDP(userContext,ass_cdp_uo.getCd_unita_organizzativa(),ass_cdp_uo.getEsercizio(),ass_cdp_uo.getMese().intValue()))
					throw new ApplicationException("Non è possibile modificare la ripartizione perchè è già stato effettuato lo scarico in analitica per l'unità organizzativa "+ass_cdp_uo.getCd_unita_organizzativa()+".");
			}
		}
	} catch(it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(e);
	} catch(OutdatedResourceException e) {
		throw handleException(e);
	} catch(BusyResourceException e) {
		throw handleException(e);
	}
}
/** 
 *  Centro di responsabilità del Piano di Gestione Preventivo
 *    PreCondition:
 *      Viene richiesto il CDR utilizzabile per il caricamento del Piano di Gestione Preventivo
 *    PostCondition:
 *      Viene restituita un CdrBulk
*/
private CdrBulk getCdrPdgP (UserContext userContext)  throws ComponentException {
	try
	{
		PdgAggregatoModuloComponentSession session = (PdgAggregatoModuloComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
				  "CNRPREVENT01_EJB_PdgAggregatoModuloComponentSession", 
				  PdgAggregatoModuloComponentSession.class);

		CdrBulk cdrUtente = session.cdrFromUserContext(userContext);
		return getCdrPdgP(userContext, cdrUtente);
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Centro di responsabilità del Piano di Gestione Preventivo
  *    PreCondition:
  *      Viene richiesto il CDR utilizzabile per il caricamento del Piano di Gestione Preventivo
  *    PostCondition:
  *      Viene restituita un CdrBulk
 */
private CdrBulk getCdrPdgP (UserContext userContext, CdrBulk cdrUtente)  throws ComponentException {
	try
	{
		SQLBuilder sql = getHome(userContext, CdrBulk.class, "V_CDR_VALIDO").createSQLBuilder();
		
		sql.addSQLClause("AND", "esercizio", SQLBuilder.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
		
		if (cdrUtente == null) 
			throw new ApplicationException("L'utente non è configurato correttamente per l'utilizzo del pdg preliminare");
		
		// riempiamo i dati di cdrUtente.getUnita_padre() dato che ci servono
		cdrUtente.setUnita_padre((Unita_organizzativaBulk)getHome(userContext,cdrUtente.getUnita_padre()).findByPrimaryKey(cdrUtente.getUnita_padre()));
		
		if (cdrUtente.getLivello().equals(new Integer(1)) || cdrUtente.getUnita_padre().isUoArea() ||
			isCdrSAC(userContext, cdrUtente)) {
			sql.addSQLClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, cdrUtente.getCd_centro_responsabilita());
		}
		else {
			sql.addSQLClause("AND", "cd_centro_responsabilita", SQLBuilder.EQUALS, cdrUtente.getCd_cdr_afferenza());
		}
	
		List result = getHome( userContext, CdrBulk.class ).fetchAll( sql );
		if ( result.size() > 1 || result.size() == 0)
			throw new ApplicationException("Impossibile determinare il CdR legato alla UO in scrivania.");

		return (CdrBulk) result.get(0);	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi
  *    PreCondition:
  *      Viene richiesto se è possibile effettuare altre ripartizioni di costi
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isPdgPrevisionaleEnabled (UserContext userContext)  throws ComponentException {
	try {
		SQLBuilder sql = getHome(userContext, Pdg_moduloBulk.class).createSQLBuilder();
			
		sql.addSQLClause("AND","PDG_MODULO.ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause("AND","PDG_MODULO.CD_CENTRO_RESPONSABILITA",sql.EQUALS,getCdrPdgP(userContext).getCd_centro_responsabilita());
		sql.addSQLClause("AND","PDG_MODULO.STATO", sql.NOT_EQUALS, Pdg_moduloBulk.STATO_AC);
		sql.addSQLClause("AND","PDG_MODULO.STATO", sql.NOT_EQUALS, Pdg_moduloBulk.STATO_AD);
	
		List result = getHome( userContext, Pdg_moduloBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return false;
		return true;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi per il 
  *  CDR di scrivania
  *    PreCondition:
  *      Viene richiesto se è possibile effettuare altre ripartizioni di costi
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isCostiDipendenteRipartiti (UserContext userContext)  throws ComponentException {
	return isCostiDipendenteRipartiti(userContext, getCdrPdgP(userContext)); 		
}
/** 
  *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi per il 
  *  CDR indicato
  *    PreCondition:
  *      Viene richiesto se è possibile effettuare altre ripartizioni di costi per il CDR 
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isCostiDipendenteRipartiti (UserContext userContext, CdrBulk cdr)  throws ComponentException {
	try {
		SQLBuilder sql = getHome(userContext, Ass_cdp_laBulk.class).createSQLBuilder();
			
		// se il CdR è della SAC deve esser controllato direttamente
		// altrimenti si vede l'afferenza
		sql.addSQLClause("AND","ASS_CDP_LA.ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause("AND","ASS_CDP_LA.MESE",sql.EQUALS,BigDecimal.ZERO);
		
		if (isCdrSAC(userContext, cdr)) {
			sql.addSQLClause("AND","ASS_CDP_LA.CD_CENTRO_RESPONSABILITA",sql.EQUALS,cdr.getCd_centro_responsabilita());
		}
		else {
			sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
			sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
			sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA",sql.EQUALS,cdr.getCd_centro_responsabilita());
		}

		// controlliamo prima che esistano dati per cui effettuare la ripartizione
		List result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.isEmpty() )
			return false;

		sql.openParenthesis("AND");
		sql.addSQLClause("AND","ASS_CDP_LA.STATO", sql.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO);
		sql.addSQLClause("OR","ASS_CDP_LA.STATO", sql.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_PDGP);
		sql.closeParenthesis();
	
		result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi per il 
  *  CDR e il Modulo indicati
  *    PreCondition:
  *      Viene richiesto se è possibile effettuare altre ripartizioni di costi per il CDR , Modulo 
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isCostiDipendenteRipartiti (UserContext userContext, CdrBulk cdr, Progetto_sipBulk modulo)  throws ComponentException {
	try {
		SQLBuilder sql = getHome(userContext, Ass_cdp_laBulk.class).createSQLBuilder();
			
		// se il CdR è della SAC deve esser controllato direttamente
		// altrimenti si vede l'afferenza
		sql.addSQLClause("AND","ASS_CDP_LA.ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause("AND","ASS_CDP_LA.MESE",sql.EQUALS,BigDecimal.ZERO);
		
		if (isCdrSAC(userContext, cdr)) {
			sql.addToHeader("LINEA_ATTIVITA");
			sql.addSQLClause("AND","LINEA_ATTIVITA.PG_PROGETTO",sql.EQUALS,modulo.getPg_progetto());
			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
			sql.addSQLJoin("ASS_CDP_LA.CD_LINEA_ATTIVITA", "LINEA_ATTIVITA.CD_LINEA_ATTIVITA");		
			sql.addSQLClause("AND","ASS_CDP_LA.CD_CENTRO_RESPONSABILITA",sql.EQUALS,cdr.getCd_centro_responsabilita());
		}
		else {
			sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
			sql.addToHeader("LINEA_ATTIVITA");
			sql.addSQLClause("AND","LINEA_ATTIVITA.PG_PROGETTO",sql.EQUALS,modulo.getPg_progetto());
			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
			sql.addSQLJoin("ASS_CDP_LA.CD_LINEA_ATTIVITA", "LINEA_ATTIVITA.CD_LINEA_ATTIVITA");		
			sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
			sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA",sql.EQUALS,cdr.getCd_centro_responsabilita());
		}
		
		// controlliamo prima che esistano dati per cui effettuare la ripartizione
		List result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.isEmpty() )
			return true;

		sql.openParenthesis("AND");
		sql.addSQLClause("AND","ASS_CDP_LA.STATO", sql.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO);
		sql.addSQLClause("OR","ASS_CDP_LA.STATO", sql.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_PDGP);
		sql.closeParenthesis();
	
		result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi per il 
  *  CDR e il Modulo indicati
  *    PreCondition:
  *      Viene richiesto se è possibile effettuare altre ripartizioni di costi per il CDR , Modulo 
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isModuloUtilizzato (UserContext userContext, CdrBulk cdr, Progetto_sipBulk modulo)  throws ComponentException {
	try {
		int esercizio = CNRUserContext.getEsercizio(userContext);

		SQLBuilder sql = getHome(userContext, Ass_cdp_laBulk.class).createSQLBuilder();
		sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
		sql.addToHeader("V_LINEA_ATTIVITA_VALIDA");
		sql.addSQLClause("AND","V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,esercizio);
		sql.addSQLClause("AND","V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO",SQLBuilder.EQUALS,modulo.getPg_progetto());
		sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_LINEA_ATTIVITA_VALIDA.ESERCIZIO");
		sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_LINEA_ATTIVITA_VALIDA.CD_CENTRO_RESPONSABILITA");
		sql.addSQLJoin("ASS_CDP_LA.CD_LINEA_ATTIVITA", "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA");		
		sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
		sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
		sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA",SQLBuilder.EQUALS,cdr.getCd_centro_responsabilita());
	
		List result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  Metodo che ritorna se la riga delle spese proviene dallo scarico dei dipendenti 
  *  Spese indicate
  *    PreCondition:
  *      Viene richiesto se la riga delle spese proviene da una ripartizione dei costi del personale
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isSpeseFromScaricoDipendente(UserContext userContext, Pdg_modulo_speseBulk pdg_modulo_spese)  throws ComponentException {
	try {
		SQLBuilder sql = new SQLBuilder();
		sql.setHeader("SELECT 1");
		sql.addTableToHeader("ASS_CDP_PDGP");
		sql.addSQLClause("AND","ESERCIZIO",sql.EQUALS,pdg_modulo_spese.getEsercizio());
		sql.addSQLClause("AND","CD_CENTRO_RESPONSABILITA",sql.EQUALS,pdg_modulo_spese.getCd_centro_responsabilita());
		sql.addSQLClause("AND","PG_PROGETTO_SPESE",sql.EQUALS,pdg_modulo_spese.getPg_progetto());
		sql.addSQLClause("AND","ID_CLASSIFICAZIONE",sql.EQUALS,pdg_modulo_spese.getId_classificazione());
		sql.addSQLClause("AND","CD_CDS_AREA",sql.EQUALS,pdg_modulo_spese.getCd_cds_area());
		//sql.addSQLClause("AND","PG_DETTAGLIO",sql.EQUALS,pdg_modulo_spese.getPg_dettaglio());
		
		LoggableStatement stm = sql.prepareStatement(getConnection(userContext));
		try {
			java.sql.ResultSet rs = stm.executeQuery();
			if (rs.next())
			  return true;
		} finally {
			try{stm.close();}catch( java.sql.SQLException e ){};
		}
	return false;
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}

/** 
  *  Metodo che ritorna se sono stati caricati i costi del dipendente da ripartire per almeno una UO
  *  appartenente al CDS del CDR di scrivania 
  *    PreCondition:
  *      Viene richiesto se sono stati caricati record nella tabella COSTO_DEL_DIPENDENTE per almeno una 
  *      Uo appartenente al CDS del CDR di scrivania 
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isCostiDipendenteCaricati (UserContext userContext)  throws ComponentException {
	return isCostiDipendenteCaricati(userContext, getCdrPdgP(userContext)); 		
}
/** 
  *  Metodo che ritorna se sono stati caricati i costi del dipendente da ripartire per almeno una UO
  *  appartenente al CDS del CDR indicato come parametro 
  *    PreCondition:
  *      Viene richiesto se sono stati caricati record nella tabella COSTO_DEL_DIPENDENTE per almeno una 
  *      Uo appartenente al CDS del CDR  indicato come parametro 
  *    PostCondition:
  *      Viene restituita un boolean
 */
public boolean isCostiDipendenteCaricati (UserContext userContext, CdrBulk cdr)  throws ComponentException {
	try {
		// Estraggo tutti i V_cdp_matricolaBulk che competono all'utente
		BulkHome home = getHome(userContext,V_cdp_matricolaBulk.class);
		SQLBuilder sql = home.createSQLBuilder();
		sql.addSQLClause("AND","ESERCIZIO",sql.EQUALS,CNRUserContext.getEsercizio(userContext));
		sql.addSQLClause("AND","MESE",sql.EQUALS,BigDecimal.ZERO);
		if (isCdrSAC(userContext, cdr) && cdr.getUnita_padre()!=null) {
			sql.addSQLClause("AND","CD_UO_CARICO",sql.EQUALS,cdr.getUnita_padre().getCd_unita_organizzativa());
		}
		else{
			V_struttura_organizzativaHome homeStrutt = (V_struttura_organizzativaHome)getHome(userContext,V_struttura_organizzativaBulk.class);
			List uoList = (List)homeStrutt.findUoCollegateCDS(cdr.getUnita_padre(), CNRUserContext.getEsercizio(userContext));
			Unita_organizzativaBulk uoBulk;
			
			sql.openParenthesis("AND");
			for ( Iterator uoIterator = uoList.iterator(); uoIterator.hasNext();) {
				uoBulk = (Unita_organizzativaBulk) uoIterator.next();
				sql.addSQLClause("OR", "CD_UO_CARICO",sql.EQUALS,uoBulk.getCd_unita_organizzativa());
			}
			sql.closeParenthesis();
		}
		List result = getHome( userContext, V_cdp_matricolaBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
public SQLBuilder selectUnita_organizzativa_filterByClause(UserContext userContext, Costi_dipendenteVBulk costiDipendente, Unita_organizzativaBulk uo, CompoundFindClause clauses) throws ComponentException
{				  
	try {
		Integer esercizio = it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext);
  		String cd_unita_organizzativa = it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext);
		Unita_organizzativaBulk uoScrivania = (Unita_organizzativaBulk) getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cd_unita_organizzativa));

		SQLBuilder sql = getHome(userContext, Unita_organizzativaBulk.class).createSQLBuilder();
		sql.addClause( clauses );

 		String from = sql.getFromClause().toString() + ".";
	
		if (uoScrivania.getFl_uo_cds().booleanValue()){
			sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA");
			sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO",sql.EQUALS,esercizio);
			sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDS",sql.EQUALS,uoScrivania.getCd_cds());
			sql.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_TIPO_LIVELLO",sql.EQUALS,V_struttura_organizzativaHome.LIVELLO_UO);
			sql.addSQLJoin("V_STRUTTURA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA",from +"CD_UNITA_ORGANIZZATIVA");
		}else{
			sql.addSQLClause("AND",from +"CD_UNITA_ORGANIZZATIVA",sql.EQUALS,cd_unita_organizzativa);				        					
		}
		return sql;		
	} catch (PersistencyException e) {
		throw handleException( e );
	} catch (ComponentException e) {
		throw handleException( e );
	}		
}
public SQLBuilder selectUnita_organizzativa_scaricoByClause(UserContext userContext, Costi_dipendenteVBulk costiDipendente, Unita_organizzativaBulk uo, CompoundFindClause clauses) throws ComponentException {
	//nel caso della ripartizione mensile occorre far vedere ance le UO chiuse
	BulkHome home = getHome(userContext,Unita_organizzativaBulk.class,"V_UNITA_ORGANIZZATIVA_VALIDA");
	SQLBuilder sql = home.createSQLBuilder();
	sql.addClause(FindClause.AND,"cd_unita_organizzativa",SQLBuilder.NOT_EQUALS,costiDipendente.getUnita_organizzativa_filter().getCd_unita_organizzativa());
	sql.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));

	if (costiDipendente.getMese() == 0) {
		sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "A");
		sql.addSQLJoin("V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO","A.ESERCIZIO");
		sql.addSQLJoin("V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA","A.CD_ROOT");

		sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "B");
		sql.addSQLJoin("A.ESERCIZIO","B.ESERCIZIO");
		sql.addSQLJoin("A.CD_CDS","B.CD_CDS");
		sql.addSQLClause(FindClause.AND,"B.CD_TIPO_LIVELLO", SQLBuilder.EQUALS, V_struttura_organizzativaHome.LIVELLO_CDR);
		sql.addSQLClause(FindClause.AND,"B.FL_CDR_UO", SQLBuilder.EQUALS, "Y");
		sql.addSQLClause(FindClause.AND,"B.FL_UO_CDS", SQLBuilder.EQUALS, "Y");

		sql.addTableToHeader("PDG_ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.ESERCIZIO","B.ESERCIZIO");
		sql.addSQLJoin("PDG_ESERCIZIO.CD_CENTRO_RESPONSABILITA","B.CD_ROOT");

		sql.openParenthesis(FindClause.AND);
		sql.addSQLClause(FindClause.AND,"PDG_ESERCIZIO.STATO", SQLBuilder.EQUALS, Pdg_esercizioBulk.STATO_APERTURA_CDR);
		sql.addSQLClause(FindClause.OR,"PDG_ESERCIZIO.STATO", SQLBuilder.EQUALS, Pdg_esercizioBulk.STATO_ESAMINATO_CDR);
		sql.closeParenthesis();
		
		BulkHome homeAss = getHome(userContext,Ass_cdp_laBulk.class);
		SQLBuilder sqlAss = homeAss.createSQLBuilder();
		sqlAss.resetColumns();
		sqlAss.addColumn("1");

		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");

		sqlAss.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAss.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAss.addSQLJoin("C.CD_CDS","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_PADRE");
		sqlAss.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.CD_TIPO_UNITA", SQLBuilder.NOT_EQUALS,Tipo_unita_organizzativaHome.TIPO_UO_SAC);		

		sqlAss.openParenthesis(FindClause.AND);
		sqlAss.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO);
		sqlAss.addSQLClause(FindClause.OR,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_PDGP);
		sqlAss.closeParenthesis();
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlAss);
		SQLBuilder sqlAssSac = homeAss.createSQLBuilder();
		sqlAssSac.resetColumns();
		sqlAssSac.addColumn("1");

		sqlAssSac.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");

		sqlAssSac.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAssSac.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAssSac.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAssSac.addSQLJoin("C.CD_UNITA_ORGANIZZATIVA","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA");
		sqlAssSac.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.CD_TIPO_UNITA", SQLBuilder.EQUALS,Tipo_unita_organizzativaHome.TIPO_UO_SAC);		

		sqlAssSac.openParenthesis(FindClause.AND);
		sqlAssSac.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO);
		sqlAssSac.addSQLClause(FindClause.OR,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_PDGP);
		sqlAssSac.closeParenthesis();
		sql.addSQLNotExistsClause(FindClause.AND, sqlAssSac);

	} else {
		BulkHome homeAss = getHome(userContext,Ass_cdp_laBulk.class);
		SQLBuilder sqlAss = homeAss.createSQLBuilder();
		sqlAss.resetColumns();
		sqlAss.addColumn("1");

		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");
		sqlAss.addClause(FindClause.AND, "mese", SQLBuilder.EQUALS, costiDipendente.getMese());

		sqlAss.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAss.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAss.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAss.addSQLJoin("C.CD_CDS","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_PADRE");
		sqlAss.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.CD_TIPO_UNITA", SQLBuilder.NOT_EQUALS,Tipo_unita_organizzativaHome.TIPO_UO_SAC);

		sqlAss.openParenthesis(FindClause.AND);
		sqlAss.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
		sqlAss.closeParenthesis();
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlAss);
		
		SQLBuilder sqlAssSac = homeAss.createSQLBuilder();
		sqlAssSac.resetColumns();
		sqlAssSac.addColumn("1");

		sqlAssSac.addSQLJoin("ASS_CDP_LA.ESERCIZIO","V_UNITA_ORGANIZZATIVA_VALIDA.ESERCIZIO");

		sqlAssSac.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "C");
		sqlAssSac.addSQLJoin("ASS_CDP_LA.ESERCIZIO","C.ESERCIZIO");
		sqlAssSac.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA","C.CD_ROOT");
		sqlAssSac.addSQLJoin("C.CD_UNITA_ORGANIZZATIVA","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA");
		sqlAssSac.addSQLClause(FindClause.AND,"V_UNITA_ORGANIZZATIVA_VALIDA.CD_TIPO_UNITA", SQLBuilder.EQUALS,Tipo_unita_organizzativaHome.TIPO_UO_SAC);		

		sqlAssSac.openParenthesis(FindClause.AND);
		sqlAssSac.addSQLClause(FindClause.AND,"ASS_CDP_LA.STATO", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
		sqlAssSac.closeParenthesis();
		sql.addSQLNotExistsClause(FindClause.AND, sqlAssSac);

		BulkHome homeCoan = getHome(userContext,Stipendi_coanBulk.class);
		SQLBuilder sqlCoan = homeCoan.createSQLBuilder();
		sqlCoan.resetColumns();
		sqlCoan.addColumn("1");

		sqlCoan.addClause(FindClause.AND,"esercizio",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
		sqlCoan.addSQLJoin("STIPENDI_COAN.CD_UO","V_UNITA_ORGANIZZATIVA_VALIDA.CD_UNITA_ORGANIZZATIVA");
		sqlCoan.addClause(FindClause.AND,"pg_scrittura_an",SQLBuilder.ISNOTNULL,null);
		
		sql.addSQLNotExistsClause(FindClause.AND, sqlCoan);
		//sql.addSQLClause("AND","NOT EXISTS ( SELECT 1 FROM "+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"STIPENDI_COAN WHERE STIPENDI_COAN.PG_SCRITTURA_AN IS NOT NULL AND STIPENDI_COAN.ESERCIZIO = UNITA_ORGANIZZATIVA.ESERCIZIO AND STIPENDI_COAN.CD_UO = UNITA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA )");
	}

	if (clauses!=null)
		sql.addClause(clauses);
	return sql;
}
/**
 * verifica se il cdr è di tipo SAC,
 * può essere utilizzato anche in altri contesti
 * 
 * @param userContext
 * @return
 * @throws ComponentException
 */
private boolean isCdrSAC(UserContext userContext, CdrBulk cdr) throws ComponentException, it.cnr.jada.persistency.PersistencyException {
	if (cdr==null)
		return false;
	// cerchiamo l'uo legata al cdr per capirne il tipo
	Unita_organizzativaBulk aUO = (Unita_organizzativaBulk)getHome(userContext,Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(cdr.getCd_unita_organizzativa()));

	if (aUO.getCd_tipo_unita().equals(Tipo_unita_organizzativaHome.TIPO_UO_SAC))
		return true;
	else
		return false;		 	
}
public SQLBuilder selectStipendiObbByClause(UserContext userContext, Stipendi_cofi_obb_scadBulk dett,  Stipendi_cofi_obb_scadBulk bulkClass, CompoundFindClause clauses)  throws ComponentException 
{
	//if (dett == null)
	//	return null;
	 SQLBuilder sql;
	 sql = getHome(userContext,Stipendi_cofi_obb_scadBulk.class).createSQLBuilder();
	
	 sql.addSQLClause("AND", "ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
	 //sql.addSQLClause("AND", "MESE", sql.EQUALS, dett.getMese());
	 return sql;
}
/** 
 *  Metodo che ritorna se è possibile o meno effettuare, per il mese in oggetto, altre ripartizioni dei costi per il 
 *  CDR di scrivania
 *    PreCondition:
 *      Viene richiesto se è possibile effettuare altre ripartizioni di costi
 *    PostCondition:
 *      Viene restituita un boolean
*/
public boolean isCostiDipendenteDefinitivi (UserContext userContext, int mese)  throws ComponentException {
	return isCostiDipendenteDefinitivi(userContext, mese, getCdrPdgP(userContext)); 		
}
/** 
 *  Metodo che ritorna se è possibile o meno effettuare, per il mese in oggetto, altre ripartizioni dei costi per il 
 *  CDR indicato
 *    PreCondition:
 *      Viene richiesto se è possibile effettuare altre ripartizioni di costi per il CDR 
 *    PostCondition:
 *      Viene restituita un boolean
*/
public boolean isCostiDipendenteDefinitivi (UserContext userContext, int mese, CdrBulk cdr)  throws ComponentException {
	try {
		SQLBuilder sql = getHome(userContext, Ass_cdp_laBulk.class).createSQLBuilder();
			
		// se il CdR è della SAC deve esser controllato direttamente
		// altrimenti si vede l'afferenza
//		if (isCdrSAC(userContext, cdr)) {
			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,cdr.getCd_centro_responsabilita());
//		}
//		else {
//			sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
//			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
//			sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
//			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
//			sql.addSQLClause(FindClause.AND,"V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA",SQLBuilder.EQUALS,cdr.getCd_centro_responsabilita());
//		}

		// controlliamo prima che esistano dati per cui effettuare la ripartizione
		List result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.isEmpty() )
			return false;

		sql.addClause(FindClause.AND,"mese", SQLBuilder.EQUALS, mese);
		sql.addClause(FindClause.AND,"stato", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
	
		result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}

/** 
 *  Metodo che ritorna se sono stati caricati i costi del dipendente da ripartire per almeno una UO
 *  appartenente al CDS del CDR indicato come parametro 
 *    PreCondition:
 *      Viene richiesto se sono stati caricati record nella tabella COSTO_DEL_DIPENDENTE per almeno una 
 *      Uo appartenente al CDS del CDR  indicato come parametro 
 *    PostCondition:
 *      Viene restituita un boolean
*/
public boolean isCostiDipendenteDefinitivi (UserContext userContext, int mese, String cd_unita_organizzativa)  throws ComponentException {
	try {
		if (cd_unita_organizzativa==null) return false;
	
		CdrHome cdrHome = (CdrHome)getHome(userContext,CdrBulk.class,"V_CDR_VALIDO");
		SQLBuilder sqlCdr = cdrHome.createSQLBuilderEsteso();
		sqlCdr.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, CNRUserContext.getEsercizio(userContext));
		sqlCdr.addClause("AND", "cd_unita_organizzativa", SQLBuilder.EQUALS, cd_unita_organizzativa);
		sqlCdr.addClause("AND", "cd_proprio_cdr", SQLBuilder.EQUALS, "000");

		List result = getHome( userContext, CdrBulk.class ).fetchAll( sqlCdr );
		if ( result.size() > 1 || result.size() == 0)
			throw new ApplicationException("Impossibile determinare il CdR legato alla U.O. " + cd_unita_organizzativa + ".");
	
		CdrBulk cdrUo = (CdrBulk) result.get(0);	
	
		return isCostiDipendenteDefinitivi(userContext, mese, cdrUo);
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}

/** 
 *  Metodo che ritorna se è possibile o meno effettuare altre ripartizioni dei costi per il 
 *  CDR e il Modulo indicati
 *    PreCondition:
 *      Viene richiesto se è possibile effettuare altre ripartizioni di costi per il CDR , Modulo 
 *    PostCondition:
 *      Viene restituita un boolean
*/
public boolean isCostiDipendenteDefinitivi (UserContext userContext, int mese, CdrBulk cdr, Progetto_sipBulk modulo)  throws ComponentException {
	try {
		SQLBuilder sql = getHome(userContext, Ass_cdp_laBulk.class).createSQLBuilder();
			
		// se il CdR è della SAC deve esser controllato direttamente
		// altrimenti si vede l'afferenza
//		if (isCdrSAC(userContext, cdr)) {
			sql.addToHeader("LINEA_ATTIVITA");
			sql.addSQLClause(FindClause.AND,"LINEA_ATTIVITA.PG_PROGETTO",SQLBuilder.EQUALS,modulo.getPg_progetto());
			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
			sql.addSQLJoin("ASS_CDP_LA.CD_LINEA_ATTIVITA", "LINEA_ATTIVITA.CD_LINEA_ATTIVITA");		
			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS,cdr.getCd_centro_responsabilita());
//		}
//		else {
//			sql.addToHeader("V_STRUTTURA_ORGANIZZATIVA");
//			sql.addToHeader("LINEA_ATTIVITA");
//			sql.addSQLClause(FindClause.AND,"LINEA_ATTIVITA.PG_PROGETTO",SQLBuilder.EQUALS,modulo.getPg_progetto());
//			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "LINEA_ATTIVITA.CD_CENTRO_RESPONSABILITA");
//			sql.addSQLJoin("ASS_CDP_LA.CD_LINEA_ATTIVITA", "LINEA_ATTIVITA.CD_LINEA_ATTIVITA");		
//			sql.addSQLClause(FindClause.AND,"ASS_CDP_LA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
//			sql.addSQLJoin("ASS_CDP_LA.ESERCIZIO", "V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO");
//			sql.addSQLJoin("ASS_CDP_LA.CD_CENTRO_RESPONSABILITA", "V_STRUTTURA_ORGANIZZATIVA.CD_ROOT");
//			sql.addSQLClause(FindClause.AND,"V_STRUTTURA_ORGANIZZATIVA.CD_CDR_AFFERENZA",SQLBuilder.EQUALS,cdr.getCd_centro_responsabilita());
//		}
		
		// controlliamo prima che esistano dati per cui effettuare la ripartizione
		List result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.isEmpty() )
			return true;

		sql.addClause(FindClause.AND,"mese", SQLBuilder.EQUALS, mese);
		sql.addClause(FindClause.AND,"stato", SQLBuilder.EQUALS, Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
	
		result = getHome( userContext, Ass_cdp_laBulk.class ).fetchAll( sql );
		if ( result.size() > 0 )
			return true;
		return false;	
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
public OggettoBulk salvaDefinitivoCosti_dipendente(UserContext userContext,Costi_dipendenteVBulk costi_dipendente) throws ComponentException {
	try {
		if (isEsercizioChiuso(userContext))
			throw new ApplicationException("Operazione non consentita ad esercizio chiuso.");
		
		for (Iterator iterator = costi_dipendente.getCosti_dipendenti().iterator(); iterator.hasNext();) {
			V_cdp_matricolaBulk cdp = iterator.next();
	
			if (cdp.getMese()==0)
				throw new ApplicationException("Operazione non consentita per i dati previsionali.");
			
			if (cdp.getIm_a1().compareTo(BigDecimal.ZERO)==1) {
				BigDecimal totPerc=BigDecimal.ZERO;
				BigDecimal totStatoIniziale=BigDecimal.ZERO;
				if (cdp.getCostiScaricati()!=null) {
					for (Iterator iterator2 = cdp.getCostiScaricati().iterator(); iterator2.hasNext();) {
						Ass_cdp_laBulk assCdpLa = iterator2.next();
						assCdpLa.setStato(Ass_cdp_laBulk.STATO_SCARICATO_DEFINITIVO);
						assCdpLa.setToBeUpdated();
						updateBulk(userContext, assCdpLa);
						totPerc=totPerc.add(assCdpLa.getPrc_la_a1());
					}
				}
				if (cdp.getCostiScaricatiAltraUO()!=null) {
					for (Iterator iterator2 = cdp.getCostiScaricatiAltraUO().iterator(); iterator2.hasNext();) {
						Ass_cdp_uoBulk assCdpUo = iterator2.next();
						if (!assCdpUo.getStato().equals(Ass_cdp_uoBulk.STATO_NON_ACCETTATO))
							totPerc=totPerc.add(assCdpUo.getPrc_uo_a1());
						if (assCdpUo.getStato().equals(Ass_cdp_uoBulk.STATO_INIZIALE))
							totStatoIniziale=totStatoIniziale.add(assCdpUo.getPrc_uo_a1());
					}
				}
				if (totPerc.compareTo(BigDecimal.TEN.multiply(BigDecimal.TEN))!=0)
					throw new ApplicationException("Operazione non consentita! La ripartizione della matricola " + cdp.getId_matricola() + " non è completa.");
				if (totStatoIniziale.compareTo(BigDecimal.ZERO)!=0)
					throw new ApplicationException("Operazione non consentita! La matricola " + cdp.getId_matricola() + " non è stata ancora accettata dalla UO alla quale è stata assegnata.");
			} else {
				if (!cdp.getCostiScaricati().isEmpty() || !cdp.getCostiScaricatiAltraUO().isEmpty())
					throw new ApplicationException("Operazione non consentita! Esiste una ripartizione per la matricola " + cdp.getId_matricola() + " anche se il suo costo è nullo.");
			}

		}
		return costi_dipendente;
	} catch (PersistencyException e) {
		throw handleException( e );
	} catch (ComponentException e) {
		throw handleException( e );
	}		
}
public OggettoBulk annullaDefinitivoCosti_dipendente(UserContext userContext,Costi_dipendenteVBulk costi_dipendente) throws ComponentException {
	try {
		if (isEsercizioChiuso(userContext))
			throw new ApplicationException("Operazione non consentita ad esercizio chiuso.");
		
		for (Iterator iterator = costi_dipendente.getCosti_dipendenti().iterator(); iterator.hasNext();) {
			V_cdp_matricolaBulk cdp = iterator.next();
	
			if (cdp.getMese()==0)
				throw new ApplicationException("Operazione non consentita per i dati previsionali.");
			
			if (cdp.getCostiScaricati()!=null) {
				for (Iterator iterator2 = cdp.getCostiScaricati().iterator(); iterator2.hasNext();) {
					Ass_cdp_laBulk assCdpLa = iterator2.next();
					assCdpLa.setStato(Ass_cdp_laBulk.STATO_SCARICATO_PROVVISORIO);
					assCdpLa.setToBeUpdated();
					updateBulk(userContext, assCdpLa);
				}
			}
		}
		return costi_dipendente;
	} catch (PersistencyException e) {
		throw handleException( e );
	} catch (ComponentException e) {
		throw handleException( e );
	}		
}
public OggettoBulk caricaCosti_dipendente(UserContext userContext,int mese) throws it.cnr.jada.comp.ComponentException {
	try {
		Unita_organizzativaBulk uo = (Unita_organizzativaBulk)getHome(userContext, Unita_organizzativaBulk.class).findByPrimaryKey(new Unita_organizzativaBulk(it.cnr.contab.utenze00.bp.CNRUserContext.getCd_unita_organizzativa(userContext)));
		return caricaCosti_dipendente(userContext,uo,mese);
	} catch (PersistencyException e) {
		throw handleException( e );
	}
}
public OggettoBulk caricaCosti_dipendente(UserContext userContext,Unita_organizzativaBulk uo,int mese) throws it.cnr.jada.comp.ComponentException {
	try {
		Costi_dipendenteVBulk costi_dipendente = new Costi_dipendenteVBulk();
	
		costi_dipendente.setEsercizio(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext));
		costi_dipendente.setMese(mese);
	
		// Imposto il numero di giorni lavorativi
		Configurazione_cnrBulk config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, costi_dipendente.getEsercizio(), "*", Configurazione_cnrBulk.PK_COSTANTI, Configurazione_cnrBulk.SK_TOTALE_GIORNI_LAVORATIVI_COSTI_PERSONALE);
		java.math.BigDecimal giorni_lavorativi = config.getIm01();
	
		if(giorni_lavorativi == null)
			 throw new ApplicationException("Totale giorni lavorativi non trovato in CONFIGURAZIONE CNR!");

		costi_dipendente.setGiorni_lavorativi(giorni_lavorativi);
		costi_dipendente.setUnita_organizzativa_filter(uo);
	
		if (costi_dipendente.getUnita_organizzativa_filter() != null &&
			costi_dipendente.getUnita_organizzativa_filter().getCd_unita_organizzativa() != null) {
			// Estraggo tutti i V_cdp_matricolaBulk che competono all'utente della UO selezionata
			BulkHome home = getHome(userContext,V_cdp_matricolaBulk.class);
			SQLBuilder sql = home.createSQLBuilder();
			sql.addClause(FindClause.AND,"esercizio",SQLBuilder.EQUALS,costi_dipendente.getEsercizio());
			sql.addClause(FindClause.AND,"cd_uo_carico",SQLBuilder.EQUALS,costi_dipendente.getUnita_organizzativa_filter().getCd_unita_organizzativa());
			sql.addClause(FindClause.AND,"mese",SQLBuilder.EQUALS,costi_dipendente.getMese());
	
			costi_dipendente.setCosti_dipendenti(new BulkList(home.fetchAll(sql)));
			
			ROWrapper roWrapper = null;
			for (Iterator iterator = costi_dipendente.getCosti_dipendenti().iterator(); iterator.hasNext();) {
				V_cdp_matricolaBulk cdp = (V_cdp_matricolaBulk) iterator.next();
				OggettoBulk bulk = (OggettoBulk)caricaCosto_dipendente(userContext, costi_dipendente, cdp);
				if (bulk instanceof ROWrapper)
					roWrapper = (ROWrapper)bulk; 
			}
			if (roWrapper != null) return roWrapper;
		}

		return costi_dipendente; 
	} catch (PersistencyException e) {
		throw handleException( e );
	} catch (RemoteException e) {
		throw handleException( e );
	}
}

/** 
 *  Metodo che ritorna se sono stati caricati i costi del dipendente da ripartire per almeno una UO
 *  appartenente al CDS del CDR indicato come parametro 
 *    PreCondition:
 *      Viene richiesto se sono stati caricati record nella tabella COSTO_DEL_DIPENDENTE per almeno una 
 *      Uo appartenente al CDS del CDR  indicato come parametro 
 *    PostCondition:
 *      Viene restituita un boolean
*/
public boolean isCostiDipendenteRipartiti (UserContext userContext, String cd_unita_organizzativa)  throws ComponentException {
	try {
		if (cd_unita_organizzativa==null) return false;
	
		CdrHome cdrHome = (CdrHome)getHome(userContext,CdrBulk.class,"V_CDR_VALIDO");
		SQLBuilder sqlCdr = cdrHome.createSQLBuilderEsteso();
		sqlCdr.addSQLClause("AND", "ESERCIZIO", SQLBuilder.EQUALS, CNRUserContext.getEsercizio(userContext));
		sqlCdr.addClause("AND", "cd_unita_organizzativa", SQLBuilder.EQUALS, cd_unita_organizzativa);
		sqlCdr.addClause("AND", "cd_proprio_cdr", SQLBuilder.EQUALS, "000");
	
		List result = getHome( userContext, CdrBulk.class ).fetchAll( sqlCdr );
		if ( result.size() > 1 || result.size() == 0)
			throw new ApplicationException("Impossibile determinare il CdR legato alla U.O. " + cd_unita_organizzativa + ".");
	
		CdrBulk cdrUo = (CdrBulk) result.get(0);	
	
		return isCostiDipendenteRipartiti(userContext, getCdrPdgP(userContext, cdrUo));
	}
	catch( Exception e )
	{
		throw handleException( e );
	}
}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy