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

it.cnr.contab.doccont00.comp.ObbligazioneBilEnteComponent Maven / Gradle / Ivy

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

package it.cnr.contab.doccont00.comp;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import it.cnr.contab.anagraf00.core.bulk.TerzoBulk;
import it.cnr.contab.anagraf00.core.bulk.TerzoHome;
import it.cnr.contab.config00.bulk.Parametri_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cnrHome;
import it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession;
import it.cnr.contab.config00.esercizio.bulk.EsercizioBulk;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk;
import it.cnr.contab.config00.pdcfin.bulk.Voce_fBulk;
import it.cnr.contab.config00.sto.bulk.CdsBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativa_enteBulk;
import it.cnr.contab.config00.sto.bulk.Unita_organizzativa_enteHome;
import it.cnr.contab.doccont00.core.bulk.AccertamentoPGiroBulk;
import it.cnr.contab.doccont00.core.bulk.Ass_partita_giroBulk;
import it.cnr.contab.doccont00.core.bulk.Ass_partita_giroHome;
import it.cnr.contab.doccont00.core.bulk.IDocumentoContabileBulk;
import it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileBulk;
import it.cnr.contab.doccont00.core.bulk.ImpegnoBulk;
import it.cnr.contab.doccont00.core.bulk.ImpegnoHome;
import it.cnr.contab.doccont00.core.bulk.Mandato_rigaBulk;
import it.cnr.contab.doccont00.core.bulk.Numerazione_doc_contBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scad_voceBulk;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scad_voceHome;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioBulk;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioHome;
import it.cnr.contab.doccont00.core.bulk.OptionRequestParameter;
import it.cnr.contab.doccont00.core.bulk.ReversaleBulk;
import it.cnr.contab.doccont00.core.bulk.V_doc_passivo_obbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.V_mod_saldi_obbligBulk;
import it.cnr.contab.doccont00.core.bulk.V_mod_saldi_obbligHome;
import it.cnr.contab.doccont00.core.bulk.V_mod_saldi_obblig_scad_voceBulk;
import it.cnr.contab.doccont00.core.bulk.V_mod_saldi_obblig_scad_voceHome;
import it.cnr.contab.doccont00.ejb.AccertamentoPGiroComponentSession;
import it.cnr.contab.doccont00.ejb.SaldoComponentSession;
import it.cnr.contab.prevent00.bulk.Voce_f_saldi_cdr_lineaBulk;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.PrimaryKeyHashMap;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.comp.ICRUDMgr;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.persistency.sql.LoggableStatement;
import it.cnr.jada.persistency.sql.Query;
import it.cnr.jada.persistency.sql.SQLBuilder;
import it.cnr.jada.util.ejb.EJBCommonServices;

/**
 * Classe che ridefinisce alcune operazioni di CRUD su ImpegnoBulk
 */

/* Gestisce documenti di tipo
	IMP con fl_pgiro = 'Y' - bilancio Ente
	IMP_RES con fl_pgiro = 'Y'- bilancio Ente
	OBB_PGIRO - bilancio Cds
*/	

public class ObbligazioneBilEnteComponent extends it.cnr.jada.comp.CRUDComponent implements IDocumentoContabileMgr,ICRUDMgr,Cloneable,Serializable
{
	private final static int INSERIMENTO 	= 1;
	private final static int MODIFICA    	= 2;
	private final static int CANCELLAZIONE = 3;		

	
//@@<< CONSTRUCTORCST
    public  ObbligazioneBilEnteComponent()
    {
//>>

//<< CONSTRUCTORCSTL
        /*Default constructor*/
//>>

//<< CONSTRUCTORCSTT

    }
public OggettoBulk creaConBulk_ (UserContext userContext, OggettoBulk bulk) throws ComponentException
{
	try
	{
/*
		ImpegnoBulk imp = ( ImpegnoBulk ) bulk;
		//imp.setCrudStatus(OggettoBulk.NORMAL);
		imp = (ImpegnoBulk) super.creaConBulk( userContext, imp );
		//callCreaImpegno (userContext, imp);
		return imp;
*/
		ImpegnoBulk imp = ( ImpegnoBulk ) bulk;
		imp.setCd_cds( imp.getUnita_organizzativa().getCd_unita_padre() );
				
		if ( imp.getCd_unita_organizzativa().equals( imp.getCd_uo_ente()) )
			imp.setCd_tipo_documento_cont( Numerazione_doc_contBulk.TIPO_IMP);
		else
			imp.setCd_tipo_documento_cont( Numerazione_doc_contBulk.TIPO_OBB_PGIRO);
				
		verificaObbligazione( userContext, imp );
		Obbligazione_scadenzarioBulk obblig_scad = creaObbligazione_scadenzario( userContext, imp);
		creaObbligazione_scad_voce( userContext, obblig_scad );
		
		imp = (ImpegnoBulk) super.creaConBulk( userContext, imp );
		
		if ( !userContext.isTransactional() )
			//aggiorna i saldi
			aggiornaCapitoloSaldoObbligazione( userContext, imp, INSERIMENTO );
				
				
		//AccertamentoPGiroBulk accert_pgiro = createAccertamentoPGiroComponent().creaAccertamento( userContext, imp);
			
		//Ass_obb_acr_pgiroBulk ass_oa_pgiro = (Ass_obb_acr_pgiroBulk) creaAss_obb_acr_pgiro( userContext, imp, accert_pgiro);
		verificaStatoEsercizio( 
							userContext, 
							((CNRUserContext)userContext).getEsercizio(), 
							imp.getCd_cds());
		return imp;
	}
	catch ( Exception e )
	{
		throw handleException( bulk, e );
	}	

}

public OggettoBulk modificaConBulk_ (UserContext userContext, OggettoBulk bulk) throws ComponentException
{			
	try
	{
		ImpegnoBulk imp = (ImpegnoBulk) bulk;
		imp = (ImpegnoBulk) super.modificaConBulk( userContext, imp );
		callCreaImpegno (userContext, imp);
		return imp;
	} 
	catch ( Exception e )
	{
		throw handleException( bulk, e );
	}
}

public void callCreaImpegno (UserContext userContext, ImpegnoBulk imp) throws it.cnr.jada.comp.ComponentException
{
	try
	{

		LoggableStatement cs = new LoggableStatement(getConnection( userContext ), 
			"call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +			
			"CNRCTB030.creaImpegnoBilEnte(?, ?)",false,this.getClass());
		try
		{
			cs.setObject( 1, imp.getEsercizio());			
			cs.setString( 2, imp.getVoce_f().getCd_voce());
			//cs.setString( 3, ((CNRUserContext)userContext).getUser() );
			cs.executeQuery();
			
		}
		catch ( SQLException e )
		{
			throw handleException( e );
		}	
		finally
		{
			cs.close();
		}
	}
	catch ( SQLException e )
	{
		throw handleException( e );
	}	
}

/*
  *  creazione obbligazione 
  *    PreCondition:
  *      Un'obbligazione e' stata creata
  *    PostCondition:
  *      Viene chiamato il metodo 'aggiornaSaldiInInserimento' che, per la voce del piano utilizzata nell'obbligazione calcola
  *      l'importo dell' aggiornamento da apportare ai saldi e richiama il metodo sulla Component di Gestione Saldi (SaldoComponent) che
  *      effettua tale aggiornamento
  *  modifica/eliminazione obbligazione
  *    PreCondition:
  *      Un'obbligazione e' stata modificata/eliminata
  *    PostCondition:
  *      Viene chiamato il metodo 'aggiornaSaldiInModifica' che, per la voce del piano utilizzata nell'obbligazione calcola
  *      l'importo dell' aggiornamento da apportare ai saldi e richiama il metodo sulla Component di Gestione Saldi (SaldoComponent) che
  *      effettua tale aggiornamento
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param obbligazione ObbligazioneBulk l'obbligazione da salvare
  * @param azione indica l'azione effettuata sull'obbligazione e puo' assumere i valori INSERIMENTO, MODIFICA, CANCELLAZIONE  
  *
 */

private void aggiornaCapitoloSaldoObbligazione (UserContext aUC,ImpegnoBulk obbligazione, int azione) throws ComponentException
{
	try
	{
		Obbligazione_scad_voceBulk osv, osvDaDB;
		// non si aggiornano i saldi di obbligazioni con esercizio di competenza diverso da esercizio di creazione
		if ( obbligazione.getEsercizio().compareTo( obbligazione.getEsercizio_competenza()) != 0 )
			return;
		if ( azione == INSERIMENTO )
			aggiornaSaldiInInserimento( aUC, obbligazione, false );
		else if ( azione == MODIFICA )
			aggiornaSaldiInModifica( aUC, 
											 obbligazione, 
											 obbligazione.getPg_ver_rec(),
											 false);
		else if ( azione == CANCELLAZIONE )
			aggiornaSaldiInModifica( aUC, 
											 obbligazione, 
											 new Long(obbligazione.getPg_ver_rec().longValue() + 1),
											 false);		
			
			

		/*	
		SaldoComponentSession session = createSaldoComponentSession();
		osv = (Obbligazione_scad_voceBulk)
			((Obbligazione_scadenzarioBulk)obbligazione.getObbligazione_scadenzarioColl().get(0)).getObbligazione_scad_voceColl().get(0);

		Voce_fBulk voce = new Voce_fBulk( osv.getCd_voce(), osv.getEsercizio(), osv.getTi_appartenenza(), osv.getTi_gestione() );
		switch( osv.getCrudStatus() )
		{
			case osv.TO_BE_CREATED:
				session.aggiornaObbligazioniAccertamenti( aUC, voce, osv.getCd_cds(), osv.getIm_voce());
				break;
			case osv.TO_BE_DELETED:
				osvDaDB = (Obbligazione_scad_voceBulk) getHome(aUC, Obbligazione_scad_voceBulk.class).findByPrimaryKey( osv);
				session.aggiornaObbligazioniAccertamenti( aUC, voce, osvDaDB.getCd_cds(), osvDaDB.getIm_voce().negate());
				break;
			case osv.TO_BE_UPDATED:
				//rileggo il valore precedente e lo aggiorno
				osvDaDB = (Obbligazione_scad_voceBulk) getHome(aUC, Obbligazione_scad_voceBulk.class).findByPrimaryKey( osv);
				if ( osvDaDB.getIm_voce().compareTo( osv.getIm_voce() ) != 0 )
					session.aggiornaObbligazioniAccertamenti( aUC, voce, osv.getCd_cds(), osv.getIm_voce().subtract( osvDaDB.getIm_voce()));								
				break;
		}
		*/
	}
	catch ( Exception e )
	{
		throw handleException( e );
	}	
}
/**
 * aggiornaCogeCoanInDifferita method comment.
 */
public void aggiornaCogeCoanInDifferita(it.cnr.jada.UserContext userContext, it.cnr.contab.doccont00.core.bulk.IDocumentoContabileBulk docContabile, java.util.Map values) throws it.cnr.jada.comp.ComponentException {
	
	try
	{
		if ( docContabile instanceof ImpegnoBulk )
		{
			ImpegnoBulk impegno = (ImpegnoBulk) docContabile;
			Long pg_ver_rec = (Long) values.get("pg_ver_rec");
			if ( pg_ver_rec == null )
				throw new ApplicationException( "Aggiornamento in differita dello stato coge/coan dei documenti contabili impossibile (pg_ver_rec nullo)");
			if ( impegno.getPg_obbligazione().longValue() >= 0 ) //accertamento non temporaneo
				callDoRiprocObb(userContext, impegno, pg_ver_rec );			
		}
	}
	catch ( Exception e )
	{
		throw handleException(e);
	}
}
/**
 * Aggiornamento in differita dei saldi dell'impegno su bilancio ente.
 * Un documento amministrativo di spesa che agisce in modalità transazionale ha creato/modificato gli importi 
 * relativi ad un impegno; i saldi di tale impegno non possono essere aggiornati subito in quanto
 * tale operazione genererebbe dei lock sulle voci del piano che non ne consentirebbere l'utilizzo ad altri utenti;
 * pertanto l'aggiornamento dei saldi dell'impegno su bilancio ente viene differito al momento del salvataggio
 * del documento amministrativo.
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna saldi per obbligazione su impegno su bilancio ente creata 
 * Pre:  Una richiesta di aggiornamento dei saldi in differita e' stata generata per un'impegno su capitoli
 *       che e' stata creata nel contesto transazionale del documento amministrativo ( progressivo
 *       impegno pgiro < 0)
 * Post: I saldi dell'impegno su bilancio ente sono stati aggiornati nel metodo 'aggiornaSaldiInInserimento'
 *
 * Nome: Aggiorna saldi per obbligazione su partita di giro esistente
 * Pre:  Una richiesta di aggiornamento dei saldi in differita e' stata generata per un'obbligazione su capitoli di
 *       partita di giro che non e' stata creata nel contesto transazionale del documento amministrativo ( progressivo
 *       impegno pgiro > 0)
 * Post: I saldi dell'obbligazione pgiro sono stati aggiornati nel metodo 'aggiornaSaldiInModifica'
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	docContabile	l'ImpegnoBulk per cui aggiornare i saldi
 * @param	values	la Map che contiene il "pg_ver_rec" iniziale dell'impegno 
 * @param	param parametro non utilizzato per le partite di giro
 * 
*/
public void aggiornaSaldiInDifferita( UserContext userContext, IDocumentoContabileBulk docContabile, Map values, OptionRequestParameter param ) throws ComponentException
{
	try
	{
		if ( docContabile instanceof ImpegnoBulk )
		{
			ImpegnoBulk imp = (ImpegnoBulk) docContabile;
			Long pg_ver_rec = (Long) values.get("pg_ver_rec");
			if ( pg_ver_rec == null )
				throw new ApplicationException( "Aggiornamento in differita dei saldi dei documenti contabili impossibile (pg_ver_rec nullo)");
			if ( imp.getPg_obbligazione().longValue() < 0 ) //obbligazione appena inserita
				aggiornaSaldiInInserimento( userContext, imp, true );
			else
				aggiornaSaldiInModifica( userContext, imp, pg_ver_rec, true );			
		}
	}
	catch ( Exception e )
	{
		throw handleException(e);
	}		
}
/**
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna saldi 
 * Pre:  Un'obbligazione e' stata creata
 * Post: Per la Voce del piano presente nell'obbligazione viene richiamato il metodo sulla Component di gestione dei Saldi (SaldoComponent) per incrementare
 *       il saldo del capitolo corrispondente
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	imp	l'ImpegnoBulk per cui aggiornare i saldi
 * 
 */
private void aggiornaSaldiInInserimento(
	UserContext userContext, 
	ImpegnoBulk imp,
	boolean aggiornaControparte)
	throws ComponentException, it.cnr.jada.persistency.PersistencyException, java.rmi.RemoteException
{
	SaldoComponentSession session = createSaldoComponentSession();
	PrimaryKeyHashMap saldiDaAggiornare;
	try {
		saldiDaAggiornare = imp.getVociMap(((Parametri_cnrHome)getHome(userContext, Parametri_cnrBulk.class)).isNuovoPdg(userContext));
	} catch (PersistencyException e) {
		throw handleException(e);
	}
	for ( Iterator i = saldiDaAggiornare.keySet().iterator(); i.hasNext(); )
	{
		Voce_fBulk voce = (Voce_fBulk) i.next();
		BigDecimal im_voce = (BigDecimal) saldiDaAggiornare.get(voce);
		session.aggiornaObbligazioniAccertamenti( userContext, voce, imp.getCd_cds(), im_voce, it.cnr.contab.prevent00.bulk.Voce_f_saldi_cmpBulk.TIPO_COMPETENZA);
	}
	/*
	* Aggiorno i Saldi per CDR/Linea
	*/	
	PrimaryKeyHashMap saldiDaAggiornareCdrLinea = imp.getObbligazione_scad_voceMap();
	for ( Iterator i = saldiDaAggiornareCdrLinea.keySet().iterator(); i.hasNext(); )
	{
		Obbligazione_scad_voceBulk osv = (Obbligazione_scad_voceBulk) i.next();
		BigDecimal im_voce = (BigDecimal) saldiDaAggiornareCdrLinea.get(osv);
		Voce_fBulk voce = new Voce_fBulk( osv.getCd_voce(), osv.getEsercizio(), osv.getTi_appartenenza(), osv.getTi_gestione());
		session.aggiornaObbligazioniAccertamenti( userContext, osv.getCd_centro_responsabilita(), osv.getCd_linea_attivita(), voce, imp.getEsercizio_originale(),imp.isObbligazioneResiduoImproprio()?Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO:Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_PROPRIO,im_voce,imp.getCd_tipo_documento_cont());
	}		
}
/**
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna saldi
 * Pre:  Un'obbligazione e' stata modificata/eliminata
 * Post: Per ogni V_mod_saldi_obbligBulk presente nel database a fronte dell'obbligazione e del suo pg_ver_rec
 *       e' stato richiamato il metodo sulla Component di gestione dei Saldi (SaldoCompoennt) per aggiornare
 *       il saldo del capitolo corrispondente; se necessario
 *       anche i saldi relativi ai mandati e al pagato vengono aggiornati.
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	imp	l'ImpegnoBulk per cui aggiornare i saldi
 * @param	pg_ver_rec	il "pg_ver_rec" iniziale dell'impegno 
 */
private void aggiornaSaldiInModifica(
	UserContext userContext, 
	ImpegnoBulk imp, 
	Long pg_ver_rec,
	boolean aggiornaControparte) throws it.cnr.jada.persistency.PersistencyException, ComponentException, java.rmi.RemoteException
{
	SaldoComponentSession session = createSaldoComponentSession();			
	List saldiDaAggiornare = ((V_mod_saldi_obbligHome)getHome( userContext, V_mod_saldi_obbligBulk.class )).findModificheSaldiFor( imp, pg_ver_rec );
	if ( userContext.isTransactional() && saldiDaAggiornare.size() == 0 )
		throw new ApplicationException( "Attenzione! I saldi relativi all'impegno " + imp.getEsercizio_originale() + "/" + imp.getPg_obbligazione() + " non possono essere aggiornati perchè l'impegno non e' presente nello storico.");

	String ti_competenza_residuo;
	if ( imp.isResiduo() )
		ti_competenza_residuo = ReversaleBulk.TIPO_RESIDUO;
	else
		ti_competenza_residuo = ReversaleBulk.TIPO_COMPETENZA;
		
	for ( Iterator i = saldiDaAggiornare.iterator(); i.hasNext(); )
	{
		V_mod_saldi_obbligBulk modSaldo = (V_mod_saldi_obbligBulk) i.next();
		Voce_fBulk voce = new Voce_fBulk( modSaldo.getCd_voce(), imp.getEsercizio(), modSaldo.getTi_appartenenza(), modSaldo.getTi_gestione() );
		if ( modSaldo.getIm_delta_voce().compareTo( new BigDecimal(0)) != 0 )
		{

			/* il check della disponabilità di cassa deve essere eseguito solo se 
			    l'importo delta del saldo e' positivo e
		 	   l'utente non ha ancora avuto il warning sulla disp.cassa oppure
			    l'utente ha avuto il warning sulla disp.cassa e ha risposto no */
			session.aggiornaObbligazioniAccertamenti( userContext, voce, imp.getCd_cds(), modSaldo.getIm_delta_voce(), ti_competenza_residuo);

			if ( modSaldo.getIm_delta_man_voce().compareTo( new BigDecimal(0) ) != 0 )
				session.aggiornaMandatiReversali( userContext, voce, imp.getCd_cds(), modSaldo.getIm_delta_man_voce(), ti_competenza_residuo);

			if ( modSaldo.getIm_delta_pag_voce().compareTo( new BigDecimal(0) ) != 0 )
				session.aggiornaPagamentiIncassi( userContext, voce, imp.getCd_cds(), modSaldo.getIm_delta_pag_voce(), ti_competenza_residuo);
		}		
		
	}	
	/*
	* Aggiorno i Saldi per CDR/Linea
	*/	
	List saldiDaAggiornareCdrLinea = ((V_mod_saldi_obblig_scad_voceHome)getHome( userContext, V_mod_saldi_obblig_scad_voceBulk.class )).findModificheSaldiFor( imp, pg_ver_rec );
	if ( userContext.isTransactional() && saldiDaAggiornareCdrLinea.size() == 0 )
		throw new ApplicationException( "Attenzione! I saldi relativi all'impegno " + imp.getEsercizio_originale() + "/" + imp.getPg_obbligazione() + " non possono essere aggiornati perchè l'impegno non e' presente nello storico.");
	for ( Iterator i = saldiDaAggiornareCdrLinea.iterator(); i.hasNext(); )
	{
		V_mod_saldi_obblig_scad_voceBulk modSaldo = (V_mod_saldi_obblig_scad_voceBulk) i.next();
		Voce_fBulk voce = new Voce_fBulk( modSaldo.getCd_voce(), imp.getEsercizio(), modSaldo.getTi_appartenenza(), modSaldo.getTi_gestione() );
		if ( modSaldo.getIm_delta_voce().compareTo( new BigDecimal(0)) != 0 )
			session.aggiornaObbligazioniAccertamenti( userContext, modSaldo.getCd_centro_responsabilita(), modSaldo.getCd_linea_attivita(), voce, modSaldo.getEsercizio_originale(),modSaldo.getCd_tipo_documento_cont().equals(Numerazione_doc_contBulk.TIPO_OBB_RES_IMPROPRIA)?Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO:Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_PROPRIO,modSaldo.getIm_delta_voce(),modSaldo.getCd_tipo_documento_cont());

		if ( modSaldo.getIm_delta_man_voce().compareTo( new BigDecimal(0) ) != 0 )
		    session.aggiornaMandatiReversali( userContext,modSaldo.getCd_centro_responsabilita(),modSaldo.getCd_linea_attivita(),voce,modSaldo.getEsercizio_originale(),modSaldo.getIm_delta_man_voce(),modSaldo.getCd_tipo_documento_cont().equals(Numerazione_doc_contBulk.TIPO_OBB_RES_IMPROPRIA)?Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_IMPROPRIO:Voce_f_saldi_cdr_lineaBulk.TIPO_RESIDUO_PROPRIO);

		if ( modSaldo.getIm_delta_pag_voce().compareTo( new BigDecimal(0) ) != 0 )
		    session.aggiornaPagamentiIncassi( userContext,modSaldo.getCd_centro_responsabilita(),modSaldo.getCd_linea_attivita(),voce,modSaldo.getEsercizio_originale(),modSaldo.getIm_delta_pag_voce());
		
	}
}
/** 
  *  aggiornamento Stato COAN o COGE dei Documenti Amministrativi
  *    PreCondition:
  *      Nel caso un'impegno sia stato eliminato o modificato, occorre
  *		 aggiornare lo stato di eventuali documenti amministrativi che fanno
  *		 riferimento all'impegno stesso.
  *	   PostCondition:
  *		 Vengono quindi aggiornati i documenti amministrativi tramite una stored procedure
  *		 (doRiprocObb)
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param docContabile ObbligazioneBulk l'obbligazione modificata o eliminata
  *
  */
private void aggiornaStatoCOAN_COGEDocAmm( UserContext userContext, ObbligazioneBulk docContabile  )  throws  ComponentException
{
	callDoRiprocObb(userContext, docContabile, null);
}
/** 
  *  cancellazione (logica)
  *    PreCondition:
  *      L'utente richiede la cancellazione di un impegno su bilancio ente
  *  errore - doc.amm.associati
  *    PreCondition:
  *      La richiesta di cancellazione di un impegno su bilancio ente e' stata generata ma esistono
  *      documenti amministrativi contabilizzati sulla scadenza dell'obbligazione
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente l'impossibilità di effettuare la cancellazione
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param imp ImpegnoBulk l'impegno su bilancio ente da cancellare (logicamente)
  * @return imp ImpegnoBulk l'impegno su bilancio ente annullato
  *
 */
public ImpegnoBulk annullaObbligazione(UserContext userContext, ImpegnoBulk imp ) throws ComponentException
{
	try
	{
		verificaStatoEsercizio( userContext, imp.getEsercizio(), imp.getCd_cds());
		//	segnalo impossibilità di annullare un residuo se l'esercizio precedente è ancora aperto
		if ( imp.getCd_tipo_documento_cont().equals( Numerazione_doc_contBulk.TIPO_IMP_RES))
			verificaStatoEsercizioEsPrecedente( userContext, imp.getEsercizio(), imp.getCd_cds());
		
			
		if ( imp.isAssociataADocAmm() )
			throw new ApplicationException( "Impossibile cancellare l'Impegno su bilancio Ente perche' ha documenti amministrativi associati");

		// annullo il record relativo all'accertamento partita di giro
		//if ( !imp.isFl_isTronco() )
		//	createAccertamentoPGiroComponent().eliminaAccertamento( userContext, imp.getAssociazione().getAccertamento());

		// annullo il record relativo all'obbligazione partita di giro
		eliminaObbligazione( userContext, imp);
		
		return imp;

	}
	catch ( Exception e )
	{
		throw handleException(imp, e)	;
	}

}
/** 
  *  riprocessa lo stato coge/coan di documenti associati al doc. contabile
  *    PreCondition:
  *      E' stata inoltrata una richiesta di riprocessare lo stato coge/coan di doc. amm. associati al documento contabile
  *	 PostCondition:
  *      Vengono cambiati gli stati coge/coan dei doc amm associati al doc. cont
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param doc IDocumentoContabileBulk doc.contabile da utilizzare
  * @param pg_ver_rec Long pg_ver_rec di riferimento
  *
  */

public void callDoRiprocObb(
	UserContext userContext,
	IDocumentoContabileBulk doc,
	Long pg_ver_rec)
	throws it.cnr.jada.comp.ComponentException
{
	try
	{
		LoggableStatement cs =new LoggableStatement(getConnection( userContext ), 
			"call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +			
			"CNRCTB215.doRiprocObb(?, ?, ?, ?, ?)",false,this.getClass());
		try
		{
			cs.setInt( 1, doc.getEsercizio().intValue());
			cs.setString( 2, doc.getCd_cds());			
			cs.setInt( 3, doc.getEsercizio_originale().intValue());
			cs.setLong( 4, doc.getPg_doc_contabile().longValue());
			if (pg_ver_rec == null)
				cs.setNull( 5, Types.DECIMAL);
			else
				cs.setLong( 5, pg_ver_rec.longValue());
			cs.executeQuery();
			
		}
		catch ( SQLException e )
		{
			throw handleException( e );
		}	
		finally
		{
			cs.close();
		}
	}
	catch ( SQLException e )
	{
		throw handleException( e );
	}	
}
/** 
  *  riporta all'esercizio successivo di doc.contabile
  *    PreCondition:
  *      E' stata inoltrata una richiesta di riportare all'esercizio successivo un documento contabile
  *	 PostCondition:
  *		Il sistema identifica quale delle 2 parti della partita di giro deve essere passata come parametro
  *      alla stored procedure (metodo 'findPGiroDaRiportareAvanti').
  *		Il doc.contabile è stato riportato all'esercizio successivo richiamando 
  *      la stored procedure CNRCTB046.riportoEsNextDocCont
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param doc IDocumentoContabileBulk doc.contabile da riportare
  *
  */

public void callRiportaAvanti (UserContext userContext,IDocumentoContabileBulk doc) throws it.cnr.jada.comp.ComponentException
{
	try
	{
		
		LoggableStatement cs = new LoggableStatement(getConnection( userContext ), 
			"call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +			
			"CNRCTB046.riportoEsNextDocCont(?, ?, ?, ?, ?, ?)",false,this.getClass());
		try
		{
			cs.setString( 1, doc.getCd_cds());			
			cs.setObject( 2, doc.getEsercizio());
			cs.setObject( 3, doc.getEsercizio_originale());
			cs.setObject( 4, doc.getPg_doc_contabile());
			cs.setString( 5, doc.getTi_entrata_spesa());					
			cs.setString( 6, ((CNRUserContext)userContext).getUser() );
			cs.executeQuery();
			
		}
		catch ( SQLException e )
		{
			throw handleException( e );
		}	
		finally
		{
			cs.close();
		}
	}
	catch ( SQLException e )
	{
		throw handleException( e );
	}	
}
/** 
  *  riporta indietro dall'esercizio successivo di un doc.contabile
  *    PreCondition:
  *      E' stata inoltrata una richiesta di riportare indietro dall'esercizio successivo un documento contabile
  *	 PostCondition:
  *		Il sistema identifica quale delle 2 parti della partita di giro deve essere passata come parametro
  *      alla stored procedure (metodo 'findPGiroDaRiportareIndietro').
  *		Il doc.contabile è stato riportato all'esercizio successivo richiamando 
  *      la stored procedure CNRCTB046.deriportoEsNextDocCont
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param doc IDocumentoContabileBulk doc.contabile da riportare
  *
  */

public void callRiportaIndietro (UserContext userContext,IDocumentoContabileBulk doc) throws ComponentException
{
	try
	{
		LoggableStatement cs = new LoggableStatement(getConnection( userContext ), 
			"call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +			
			"CNRCTB046.deriportoEsNextDocCont(?, ?, ?, ?, ?, ?)",false,this.getClass());
		try
		{
			cs.setString( 1, doc.getCd_cds());			
			cs.setObject( 2, doc.getEsercizio());
			cs.setObject( 3, doc.getEsercizio_originale());
			cs.setObject( 4, doc.getPg_doc_contabile());
			cs.setString( 5, doc.getTi_entrata_spesa());					
			cs.setString( 6, ((CNRUserContext)userContext).getUser() );
			cs.executeQuery();
			
		}
		catch ( SQLException e )
		{
			throw handleException( e );
		}	
		finally
		{
			cs.close();
		}
	}
	catch ( SQLException e )
	{
		throw handleException( e );
	}	
}
/** 
  *  creazione
  *    PreCondition:
  *      L'utente richiede la creazione di un nuovo impegno su partita di giro
  *    PostCondition:
  *      L'impegno, dopo essere stato validato (metodo verificaObbligazione), viene creato e in automatico viene creata una 
  *		 scadenza (metodo creaObbligazione_scadenzario) e un dettaglio di scadenza (metodo creaObbligazione_scad_voce). 
  *		 I saldi relativi alla voce del piano dell'obbligazione vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione). 
  *		 Alla componente che gestisce gli AccertamentiPGiro viene chiesta la creazione di un Accertamento (metodo creaAccertamento). 
  *		 Viene creata l'associazione (Ass_obb_acr_pgiroBulk) fra l'impegno e l'accertamento su partita di giro (metodo creaAss_obb_acr_pgiro)
  *
  * @param uc lo UserContext che ha generato la richiesta
  * @param bulk OggettoBulk l'impegno su partita di giro da creare
  *
  * @return imp L'impegno su partita di giro creato
 */
public OggettoBulk creaConBulk (UserContext uc,OggettoBulk bulk) throws ComponentException
{
	try
	{
		ImpegnoBulk imp = ( ImpegnoBulk ) bulk;

		// controlliamo che non esista già un impegno su bilancio ente per la voce selezionata
		//ObbligazioneHome vocehome =(ObbligazioneHome)getHome(uc, ObbligazioneBulk.class);
		Obbligazione_scad_voceHome vocehome =(Obbligazione_scad_voceHome)getHome(uc, Obbligazione_scad_voceBulk.class);
		SQLBuilder sql = vocehome.createSQLBuilder();
		sql.addTableToHeader("OBBLIGAZIONE");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.CD_CDS","OBBLIGAZIONE.CD_CDS");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO","OBBLIGAZIONE.ESERCIZIO");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO_ORIGINALE","OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.PG_OBBLIGAZIONE","OBBLIGAZIONE.PG_OBBLIGAZIONE");
		sql.addClause("AND","esercizio",sql.EQUALS, imp.getEsercizio() );
		sql.addClause("AND","cd_cds",sql.EQUALS, imp.getUnita_organizzativa().getCd_unita_padre() );
		sql.addClause("AND","cd_voce",sql.EQUALS, imp.getVoce_f().getCd_voce() );
		sql.addSQLClause("AND","cd_tipo_documento_cont",sql.EQUALS, Numerazione_doc_contBulk.TIPO_IMP);

		List result = vocehome.fetchAll( sql );
		if (!result.isEmpty())
			throw new ApplicationException("Impossibile creare l'impegno con la voce del piano selezionata poichè è già stato creato un impegno su bilancio ente per tale voce.");

		imp.setCd_cds( imp.getUnita_organizzativa().getCd_unita_padre() );
		
		if ( imp.getCd_unita_organizzativa().equals( imp.getCd_uo_ente()) )
			imp.setCd_tipo_documento_cont( Numerazione_doc_contBulk.TIPO_IMP);
		else
			imp.setCd_tipo_documento_cont( Numerazione_doc_contBulk.TIPO_OBB_PGIRO);
		
		verificaObbligazione( uc, imp );

		// impostiamo la voce del piano in testata coerentemente con quella nelle scadenze
		// viene già impostato nel doBringBack ma lo rifacciamo
		if (imp.getVoce_f()!=null)
			imp.setElemento_voce(((ImpegnoHome)getHome(uc, ImpegnoBulk.class)).findElementoVoceFor(imp.getVoce_f()));

		Obbligazione_scadenzarioBulk obblig_scad = creaObbligazione_scadenzario( uc, imp);
		creaObbligazione_scad_voce( uc, obblig_scad );

		imp = (ImpegnoBulk) super.creaConBulk( uc, imp );

		if ( !uc.isTransactional() )
			//aggiorna i saldi
			aggiornaCapitoloSaldoObbligazione( uc, imp, INSERIMENTO );
		
		
		//AccertamentoPGiroBulk accert_pgiro = createAccertamentoPGiroComponent().creaAccertamento( uc, imp);
	
		//Ass_obb_acr_pgiroBulk ass_oa_pgiro = (Ass_obb_acr_pgiroBulk) creaAss_obb_acr_pgiro( uc, imp, accert_pgiro);
		verificaStatoEsercizio( 
							uc, 
							((CNRUserContext)uc).getEsercizio(), 
							imp.getCd_cds());

		return imp;
	}
	catch ( Exception e )
	{
		throw handleException( bulk, e );
	}	

}
/** 
  *  creazione per il Cds
  *    PreCondition:
  *      Un Accertamento su partita di giro per il Cds e' stato creato ed e' necessario creare il corrispondente Impegno
  *    PostCondition:
  *      L'impegno (ImpegnoBulk) viene creato con importo pari a quello dell'accertamento, codice terzo
  *      recuperato dalla Configurazione CNR come codice DIVERSI per PARTITA di GIRO, capitolo di entrata ricavato
  *      (metodo findVoce_f) dall'associazione fra Capitoli di Entrata e di Spesa per Partita di Giro, cds e unità
  *		 organizzativa di appartenenza e di origine uguali a quelli dell'accertamento, data di scadenza uguale a 
  *		 quella della scadenza dell'accertamento su partita di giro.
  *      Viene inoltre creata una scadenza (metodo creaObbligazione_scadenzario) e
  *      un dettaglio di scadenza (metodo creaObbligazione_scad_voce). I saldi relativi alla voce del piano
  *      dell'obbligazione vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione).
  *		 Viene infine validata l'Obbligazione prima della sua creazione (metodo verificaObbligazione)
  *  creazione per il CNR
  *    PreCondition:
  *      Un Accertamento su partita di giro per il CNR e' stato creato ed e' necessario creare il corrispondente Impegno
  *    PostCondition:
  *      L'impegno (ImpegnoBulk) viene creato con importo pari a quello dell'accertamento, codice terzo
  *      recuperato dalla Configurazione CNR come codice DIVERSI per PARTITA di GIRO, capitolo di entrata ricavato
  *      (metodo findVoce_f) dall'associazione fra Capitoli di Entrata e di Spesa per Partita di Giro, cds e unità
  *		 organizzativa di appartenenza uguali a quelli dell'accertamento e cds e unità organizzativa di origine
  *		 uguali a quelli dell'ente.
  *      Viene inoltre creata una scadenza (metodo creaObbligazione_scadenzario) e
  *      un dettaglio di scadenza (metodo creaObbligazione_scad_voce). I saldi relativi alla voce del piano
  *      dell'obbligazione vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione).
  *		 Viene infine validata l'Obbligazione prima della sua creazione (metodo verificaObbligazione)
  *  errore - Configurazione CNR per codice DIVERSI su PGIRO
  *    PreCondition:
  *      non e' presente in Configurazione CNR la definizione del CODICE DIVERSI per PGIRO
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente la mancata definizione in Configurazione CNR del CODICE DIVERSI per PGIRO
  *  errore - Anagrafica per codice DIVERSI su PGIRO
  *    PreCondition:
  *      non e' presente in Anagrafica il codice terzo presente in Configurazione CNR come CODICE DIVERSI per PGIRO
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente la mancata definizione in Anagrafica
  *  errore - Associazione capitoli entrata/spese
  *    PreCondition:
  *      non e' presente (Ass_partita_giroBulk) l'associazione fra il capitolo di entrata dell'accertamento e un capitolo di spesa
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente l'assenza dell'associazione
  *
  * @param uc lo UserContext che ha generato la richiesta
  * @param accert_pgiro AccertamentoPGiroBulk l'accertamento su partita di giro creato
  *
  * @return imp L'impegno su partita di giro creato in corrispondenza dell'accertamento
*/
public ImpegnoBulk creaObbligazione(
    UserContext uc,
    AccertamentoPGiroBulk accert_pgiro)
    throws ComponentException {
    try {
        /* IMPEGNO PARTITA GIRO BULK */
        ImpegnoBulk imp = new ImpegnoBulk();
        imp.setUser(accert_pgiro.getUser());
        imp.setToBeCreated();

        // campi chiave
        imp.setEsercizio(accert_pgiro.getEsercizio());
        imp.setCd_cds(accert_pgiro.getCd_cds());
		imp.setEsercizio_originale(accert_pgiro.getEsercizio_originale());

        // altri campi...
        imp.setDt_scadenza(accert_pgiro.getDt_scadenza());
        if (accert_pgiro
            .getCd_tipo_documento_cont()
            .equals(Numerazione_doc_contBulk.TIPO_ACR))
            imp.setCd_tipo_documento_cont(Numerazione_doc_contBulk.TIPO_IMP);
        else
            imp.setCd_tipo_documento_cont(Numerazione_doc_contBulk.TIPO_OBB_PGIRO);

        imp.setCd_unita_organizzativa(accert_pgiro.getCd_unita_organizzativa());
        /* 17.5.2002 modificato Simona
        if ( imp.getCd_unita_organizzativa().equals( accert_pgiro.getCd_uo_ente()))
        {
        	imp.setCd_cds_origine( accert_pgiro.getCd_cds() );
        	imp.setCd_uo_origine( accert_pgiro.getCd_unita_organizzativa() );
        }
        else
        {
        	imp.setCd_cds_origine( accert_pgiro.getCd_cds_origine() );
        	imp.setCd_uo_origine( accert_pgiro.getCd_uo_origine() );
        }
        */
        imp.setCd_cds_origine(accert_pgiro.getCd_cds_origine());
        imp.setCd_uo_origine(accert_pgiro.getCd_uo_origine());

        imp.setDt_registrazione(accert_pgiro.getDt_registrazione());
        imp.setDs_obbligazione(
            "Annotazione di Spesa su Partita di Giro creata in automatico dal CdS: "
                .concat(
                accert_pgiro.getCd_cds_origine()));
        //gestione x impegni tronchi
        if (!accert_pgiro.isFl_isTronco())
        {
	       imp.setIm_obbligazione(accert_pgiro.getIm_accertamento());
	       imp.setStato_obbligazione(imp.STATO_OBB_DEFINITIVO);            
        }   
        else 
        {
            imp.setIm_obbligazione(new BigDecimal(0));
            imp.setFl_isTronco(true);
	       	imp.setStato_obbligazione(imp.STATO_OBB_STORNATO);                        
            imp.setDt_cancellazione(accert_pgiro.getDt_registrazione());
        }
        imp.setFl_calcolo_automatico(new Boolean(true));

        imp.setFl_spese_costi_altrui(new Boolean(false));
        imp.setFl_gara_in_corso(new Boolean(false));
        imp.setEsercizio_competenza(accert_pgiro.getEsercizio());
        imp.setIm_costi_anticipati(new java.math.BigDecimal(0));
        imp.setRiportato("N");

        // ...e in particolare il campo cd_terzo
        it.cnr.contab.config00.bulk.Configurazione_cnrBulk config =
            createConfigurazioneCnrComponentSession().getConfigurazione(
                uc,
                null,
                null,
                it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_TERZO_SPECIALE,
                it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_CODICE_DIVERSI_PGIRO);
        if (config == null)
            throw new ApplicationException("Configurazione CNR: manca la definizione del CODICE DIVERSI per partite di giro");

        if (config.getIm01() == null)
            throw new ApplicationException("Configurazione CNR: manca il CODICE TERZI nella definizione del codice diversi per partite di giro");

        SQLBuilder sql =
            getHomeCache(uc)
                .getHome(it.cnr.contab.anagraf00.core.bulk.TerzoBulk.class)
                .createSQLBuilder();
        sql.addClause(
            "AND",
            "cd_terzo",
            sql.EQUALS,
            new Integer(config.getIm01().intValue()));
        List result =
            getHomeCache(uc)
                .getHome(it.cnr.contab.anagraf00.core.bulk.TerzoBulk.class)
                .fetchAll(sql);
        if (result.size() == 0)
            throw new ApplicationException("Il terzo DIVERSI per partita di giro non e' presente in anagrafica");

        imp.setCd_terzo(
            ((it.cnr.contab.anagraf00.core.bulk.TerzoBulk) result.get(0)).getCd_terzo());
        Ass_partita_giroHome ass_pgiroHome =
            (Ass_partita_giroHome) getHome(uc, Ass_partita_giroBulk.class);
		Ass_partita_giroBulk ass_pgiro = ass_pgiroHome.getAssociazionePGiroFor(accert_pgiro);
		
        imp.setTi_appartenenza(ass_pgiro.getTi_appartenenza_clg());
        imp.setTi_gestione(ass_pgiro.getTi_gestione_clg());
        imp.setCd_elemento_voce(ass_pgiro.getCd_voce_clg());

        Obbligazione_scadenzarioBulk obblig_scad =
            creaObbligazione_scadenzario(uc, imp);
        // creaAccertamento_scad_voce( uc, accert_scad, (Obbligazione_scad_voceBulk)(((Obbligazione_scadenzarioBulk)imp.getObbligazione_scadenzarioColl().get(0)).getObbligazione_scad_voceColl().get(0)));
        creaObbligazione_scad_voce(uc, obblig_scad);

        verificaObbligazione(uc, imp);

        imp = (ImpegnoBulk) super.creaConBulk(uc, imp);

        if (!uc.isTransactional())
            aggiornaCapitoloSaldoObbligazione(uc, imp, INSERIMENTO);

        return imp;
    } catch (Exception e) {
        throw handleException(e);

    }
}
/** 
  *  creazione
  *    PreCondition:
  *      una scadenza di un impegno pgiro e' stata creata ed e' necessario creare il suo dettaglio
  *    PostCondition:
  *      Il dettaglio di scadenza (Obbligazione_scad_voceBulk) viene creato
  *      con linea attività uguale alla linea di attività definita nella Configurazione CNR come Linea attività Spesa ENTE
  *      e importo uguale all'importo della scadenza dell'obbligazione
  *  errore - Configurazione CNR
  *    PreCondition:
  *      una richiesta di creazione di un dettaglio di scadenza di un impegno pgiro e' stata generata
  *      ma non e' stata definita in Configurazione CNR la Linea attività Spesa ENTE
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente la mancata definizione in Configurazione CNR della linea di attivita' Spesa ENTE
  *
  * @param uc lo UserContext che ha generato la richiesta
  * @param obblig_scad Obbligazione_scadenzarioBulk la scadenza dell'impegno pgiro creata
  *
  * @return obblig_scad_voce Il dettaglio di scadenza dell'impegno pgiro creato
 */
private Obbligazione_scad_voceBulk creaObbligazione_scad_voce (UserContext uc,Obbligazione_scadenzarioBulk obblig_scad) throws ComponentException
{
	try
	{
		Obbligazione_scad_voceBulk obblig_scad_voce = new Obbligazione_scad_voceBulk();
		obblig_scad_voce.setUser( obblig_scad.getObbligazione().getUser() );
		obblig_scad_voce.setToBeCreated();

		// campi chiave
		obblig_scad_voce.setObbligazione_scadenzario( obblig_scad );

		// altri campi chiave
		obblig_scad_voce.setTi_appartenenza( obblig_scad.getObbligazione().getTi_appartenenza() );
		obblig_scad_voce.setTi_gestione( obblig_scad.getObbligazione().getTi_gestione() );
		obblig_scad_voce.setCd_voce(((ImpegnoBulk)(obblig_scad.getObbligazione())).getVoce_f().getCd_voce() );

		it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = createConfigurazioneCnrComponentSession().getConfigurazione( uc, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_ATTIVITA_SPESA_ENTE );
		if ( config != null  )
		{
			it.cnr.contab.config00.latt.bulk.WorkpackageBulk latt = 
				new it.cnr.contab.config00.latt.bulk.WorkpackageBulk( config.getVal01(), config.getVal02());	
				obblig_scad_voce.setLinea_attivita( latt );
		}
		else
			throw new ApplicationException("Configurazione CNR: manca la definizione del GAE SPESA ENTE");

		
		// altri campi
		obblig_scad_voce.setIm_voce( obblig_scad.getObbligazione().getIm_obbligazione()  );
		//obblig_scad_voce.setCd_fondo_ricerca( obblig_scad.getObbligazione().getCd_fondo_ricerca() );
	
		obblig_scad.getObbligazione_scad_voceColl().add( obblig_scad_voce );

		return obblig_scad_voce;
		
	}
	catch ( Exception e )
	{
		throw handleException( e )	;
	}
}
/** 
  *  creazione
  *    PreCondition:
  *      un impegno pgiro e' stato creato ed e' necessario creare la scadenza ad esso associata
  *    PostCondition:
  *      Viene creata una scadenza (Obbligazione_scadenzarioBulk) di obbligazione su partita di giro 
  *		 con data uguale alla data di scadenza dell'obbligazione e con importo pari a quello dell'obbligazione.
  *
  * @param uc lo UserContext che ha generato la richiesta
  * @param imp ImpegnoBulk l'impegno su partita di giro creato
  *
  * @return obblig_scad La scadenza dell'impegno pgiro creata
 */
private Obbligazione_scadenzarioBulk creaObbligazione_scadenzario (UserContext uc, ImpegnoBulk imp) throws ComponentException
{

	// gc.set((imp.getEsercizio_competenza()).intValue(),1,1);
	//Timestamp time = new Timestamp(gc.MILLISECOND);

		Obbligazione_scadenzarioBulk obblig_scad = new Obbligazione_scadenzarioBulk();
		/* simona 12/7 
		imp.getObbligazione_scadenzarioColl().add( obblig_scad ); */
		imp.addToObbligazione_scadenzarioColl( obblig_scad );
		
		obblig_scad.setUser( imp.getUser() );
		obblig_scad.setToBeCreated();

		// campi chiave
		// obblig_scad.setObbligazione( imp );
 
		// altri campi
		obblig_scad.setDt_scadenza( imp.getDt_scadenza() );
		/*
		// controllo se l'anno di emissione dell'impegno è maggiore dell'anno corrente
		gc.set(java.util.GregorianCalendar.MONTH,1);
		gc.set(java.util.GregorianCalendar.DATE,1);
		
		if (imp.getEsercizio_competenza().intValue() > gc.get(java.util.GregorianCalendar.YEAR) )
			obblig_scad.setDt_scadenza( java.sql.Timestamp.valueOf( imp.getEsercizio_competenza().intValue() + "-" + 
																   		    gc.get(java.util.GregorianCalendar.MONTH) + "-" +
																   		    gc.get(java.util.GregorianCalendar.DATE) +" 00:00:00.0" ) );
		else
			obblig_scad.setDt_scadenza( imp.getDt_registrazione() );
		*/	
		
		obblig_scad.setDs_scadenza( imp.getDs_obbligazione() );
		obblig_scad.setIm_scadenza( imp.getIm_obbligazione() );
		return obblig_scad;
		
}
/**
 * Crea la ComponentSession da usare per effettuare le operazioni di CRUD su Accertamenti in Partita di Giro
 *
 * @return AccertamentoComponentSession l'istanza di AccertamentoComponentSession che serve per gestire un accertamento
 */
private AccertamentoPGiroComponentSession createAccertamentoPGiroComponent( ) throws it.cnr.jada.comp.ComponentException
{
	try
	{
		return (AccertamentoPGiroComponentSession)EJBCommonServices.createEJB("CNRDOCCONT00_EJB_AccertamentoPGiroComponentSession");

	}
	catch (Exception e )
	{
		throw handleException( e ) ;
	}		
}
/**
 * Crea la ComponentSession da usare per effettuare le operazioni di lettura della Configurazione CNR
 *
 * @return Configurazione_cnrComponentSession l'istanza di Configurazione_cnrComponentSession che serve per leggere i parametri di configurazione del CNR
 */
private Configurazione_cnrComponentSession createConfigurazioneCnrComponentSession() throws ComponentException 
{
	try
	{
		return (Configurazione_cnrComponentSession)EJBCommonServices.createEJB("CNRCONFIG00_EJB_Configurazione_cnrComponentSession");
	}
	catch ( Exception e )
	{
		throw handleException( e )	;
	}	
}
/**
 * Crea la ComponentSession da usare per effettuare le operazioni di aggiornamento saldi documenti contabili
 *
 * @return SaldoComponentSession l'istanza di SaldoComponentSession che serve per aggiornare un saldo
 */
private it.cnr.contab.doccont00.ejb.SaldoComponentSession createSaldoComponentSession() throws ComponentException 
{
	try
	{
		return (SaldoComponentSession)EJBCommonServices.createEJB("CNRDOCCONT00_EJB_SaldoComponentSession");
	}
	catch ( Exception e )
	{
		throw handleException( e )	;
	}	
}
/** 
  *  cancellazione (logica)
  *    PreCondition:
  *      L'utente richiede la cancellazione di un impegno su partita di giro
  *    PostCondition:
  *     Viene inoltrata la richiesta di cancellazione (logica) dell'impegno su partita di giro
  *		(metodo annullaObbligazione)
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param bulk OggettoBulk l'impegno su partita di giro da cancellare (logicamente)
  *
 */
public void eliminaConBulk (UserContext aUC,OggettoBulk bulk) throws ComponentException
{
	try
	{
		annullaObbligazione( aUC, (ImpegnoBulk) bulk);
	}
	catch ( Exception e )
	{
		throw handleException(bulk, e)	;
	}
}
/** 
  *  cancellazione (logica)
  *    PreCondition:
  *      La richiesta di cancellazione di un'obbligazione su partita di giro e' stata generata
  *    PostCondition:
  *      L'obbligazione, la sua scadenza e il suo dettaglio vengono cancellati (logicamente). I saldi relativi 
  *		ai documenti contabili vengono aggiornati (metodo aggiornaCapitoloSaldoObbligazione).
  *  errore - doc.amm.associati
  *    PreCondition:
  *      La richiesta di cancellazione di un'obbligazione su partita di giro e' stata generata ma esistono
  *      documenti amministrativi contabilizzati sulla scadenza dell'obbligazione
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente l'impossibilità di effettuare la cancellazione
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param imp ImpegnoBulk l'impegno su partita di giro da cancellare (logicamente)
  *
 */
public void eliminaObbligazione(UserContext aUC,ImpegnoBulk imp ) throws ComponentException
{
	try
	{
		if ( imp.isAssociataADocAmm() )
			throw new ApplicationException( "Impossibile cancellare l'Impegno su bilancio Ente perche' ha documenti amministrativi associati");

		/*	
		imp.setToBeDeleted();
		makeBulkPersistent( aUC, imp);
		aggiornaCapitoloSaldoObbligazione( aUC, imp, CANCELLAZIONE);
		*/
		imp.setCrudStatus(OggettoBulk.NORMAL);		
        imp.storna();
    //    imp.setDt_cancellazione( getHome(aUC, imp.getClass()).getServerDate());
        imp.setDt_cancellazione( DateServices.getDt_valida(aUC));    

	  // aggiornamento obbligazione + scadenze + dettagli
      makeBulkPersistent( aUC, imp);

      //aggiorno i saldi
      aggiornaCapitoloSaldoObbligazione(aUC, imp, MODIFICA);		
	}
	catch ( Exception e )
	{
		throw handleException( e );
	}
}
/** 
  *  ricerca Unità Organizzative
  *    PreCondition:
  *      La richiesta di identificazione delle Unità Organizzative per cui e' possibile creare un'impegno
  *      è stata generata
  *    PostCondition:
  *      Una lista contente l'UO Ente + l'UO di scrivania (se diverso da Ente) viene restituita
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param impegno ImpegnoBulk l'impegno su partita di giro da creare
  *
  * @return result la lista delle unità organizzative definite per l'impegno su partita di giro
 */
public List findUnitaOrganizzativaOptions (UserContext userContext,ImpegnoBulk impegno) throws it.cnr.jada.persistency.PersistencyException, it.cnr.jada.persistency.IntrospectionException, ComponentException
{
	SQLBuilder sql = getHome( userContext, Unita_organizzativa_enteBulk.class ).createSQLBuilder();
	List result = getHome( userContext, Unita_organizzativa_enteBulk.class ).fetchAll( sql );
	impegno.setCd_uo_ente( ((Unita_organizzativaBulk)result.get(0)).getCd_unita_organizzativa());
	if ( !((Unita_organizzativaBulk)result.get(0)).getCd_unita_organizzativa().equals( impegno.getUnita_organizzativa().getCd_unita_organizzativa()))
		result.add( impegno.getUnita_organizzativa() );
	return result;
}
/** 
  *  inizializzazione per inserimento
  *    PreCondition:
  *      La richiesta di inizializzazione di un ImpegnoBulk per inserimento
  *      e' stata generata
  *    PostCondition:
  *      Viene impostata la data di registrazione dell'obbligazione con la data odierna, 
  *		 il codice Cds e il codice Cds di origine con il codice Cds di scrivania
  *  inizializzazione per inserimento - errore
  *    PreCondition:
  *      L'unità organizzativa è uguale a quella dell'Ente
  *    PostCondition:
  *      Un messaggio di errore segnala all'utente che l'Ente non è abilitato a creare documenti su partita di giro
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param bulk OggettoBulk l'impegno su partita di giro da inizializzare per l'inserimento
  *
  * @return OggettoBulk l'impegno su partita di giro inizializzato per l'inserimento
 */
public OggettoBulk inizializzaBulkPerInserimento (UserContext aUC,OggettoBulk bulk) throws ComponentException
{
	ImpegnoBulk imp = (ImpegnoBulk) bulk;

	try
	{
		Unita_organizzativa_enteBulk uoEnte = (Unita_organizzativa_enteBulk)getHome( aUC, Unita_organizzativa_enteBulk.class).findAll().get(0);
			
		it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = createConfigurazioneCnrComponentSession().getConfigurazione( aUC, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_TERZO_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_CODICE_DIVERSI_IMPEGNI);
		if ( config == null  )
			throw new ApplicationException("Configurazione CNR: manca la definizione del TERZO_SPECIALE");	
		if ( config.getIm01() == null )
			throw new ApplicationException("Configurazione CNR: non sono stati impostati i valori per TERZO_SPECIALE - CODICE_DIVERSI_IMPEGNI");			
		TerzoHome terzohome = (TerzoHome) getHome(aUC, TerzoBulk.class);
		TerzoBulk cred = (TerzoBulk) terzohome.findByPrimaryKey(new TerzoBulk(new Integer(config.getIm01().intValue())));
		imp.setCreditore(cred);

		imp.setDt_registrazione( DateServices.getDt_valida( aUC) );
		imp.setDt_scadenza(DateServices.getDt_valida( aUC));
		imp.setCds( (CdsBulk) getHome( aUC, CdsBulk.class).findByPrimaryKey( imp.getUnita_organizzativa().getUnita_padre() ));
		imp.setCd_cds_origine( ((CNRUserContext) aUC).getCd_cds() );
		verificaStatoEsercizio( aUC, imp.getEsercizio(), imp.getCd_cds());
		/* if (!((ObbligazioneHome)getHome(aUC, obbligazione.getClass())).verificaStatoEsercizio(obbligazione))
			throw handleException( new ApplicationException( "Non e' possibile creare obbligazioni: esercizio non ancora aperto!") );*/
			
		// se l'unità organizzativa NON è uguale a quella dell'Ente, non è possibile creare documenti su partita di giro
		if ( !imp.getCd_unita_organizzativa().equals( uoEnte.getCd_unita_organizzativa() ))
			throw new ApplicationException("Funzione consentita unicamente per utente abilitato a " + uoEnte.getCd_unita_organizzativa() ); 
		return super.inizializzaBulkPerInserimento( aUC, imp );
	}
	catch ( Exception e )
	{
		throw handleException(imp, e);
	}
}
/** 
  *  inizializzazione per modifica
  *    PreCondition:
  *      La richiesta di inizializzazione di un ImpegnoBulk per modifica
  *      e' stata generata
  *    PostCondition:
  *      Vengono recuperati la scadenza e il dettaglio di scadenza associati all'impegno.
  *      Viene recuperata l'associazione fra l'impegno e l'accertamento
  *		 Viene recuperato l'accertamento associato all'impegno e la relativa scadenza e dettaglio scadenza
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param bulk OggettoBulk l'impegno su partita di giro da inizializzare per la modifica
  *
  * @return imp l'impegno su partita di giro inizializzato per la modifica
 */
public OggettoBulk inizializzaBulkPerModifica (UserContext aUC,OggettoBulk bulk) throws ComponentException
{
	try
	{
		bulk = super.inizializzaBulkPerModifica( aUC, bulk );
		
		ImpegnoBulk imp = (ImpegnoBulk) bulk;
		AccertamentoPGiroBulk accert_pgiro = null;		

		imp.setCd_terzo_iniziale( imp.getCd_terzo());
		imp.setIm_iniziale_obbligazione( imp.getIm_obbligazione());
	
	//query per recuperare la scadenza dell'obbligazione
	//impegnoPgiro.getObbligazione_scadenzarioColl().add( scadenza );
		Obbligazione_scadenzarioHome obblig_scadHome = (Obbligazione_scadenzarioHome) getHome( aUC, Obbligazione_scadenzarioBulk.class );

		SQLBuilder sql = obblig_scadHome.createSQLBuilder();
		sql.addClause("AND","cd_cds",sql.EQUALS, imp.getCd_cds() );
		sql.addClause("AND","esercizio",sql.EQUALS, imp.getEsercizio() );
		sql.addClause("AND","esercizio_originale",sql.EQUALS, imp.getEsercizio_originale() );
		sql.addClause("AND","pg_obbligazione",sql.EQUALS, imp.getPg_obbligazione() );

		List result = obblig_scadHome.fetchAll( sql );
		Obbligazione_scadenzarioBulk obblig_scad = (Obbligazione_scadenzarioBulk) result.get(0);

		imp.setDt_scadenza( obblig_scad.getDt_scadenza());
		imp.getObbligazione_scadenzarioColl().add( obblig_scad );
		obblig_scad.setObbligazione( imp);

		//carico l'eventuale doc.amministrativo legato alla scadenza
		V_doc_passivo_obbligazioneBulk docPassivo = obblig_scadHome.findDoc_passivo( obblig_scad );
		if ( docPassivo != null)
		{
			obblig_scad.setEsercizio_doc_passivo( docPassivo.getEsercizio());
			obblig_scad.setPg_doc_passivo( docPassivo.getPg_documento_amm());
			imp.setEsercizio_doc_passivo( docPassivo.getEsercizio());
			imp.setPg_doc_passivo( docPassivo.getPg_documento_amm());
			imp.setCd_tipo_documento_amm( docPassivo.getCd_tipo_documento_amm());
		}

		//carico l'eventuale mandato associato
		Mandato_rigaBulk mandato = obblig_scadHome.findMandato( obblig_scad );
		if ( mandato != null )
		{
			imp.setEsercizio_mandato( mandato.getEsercizio());
			imp.setPg_mandato( mandato.getPg_mandato());
		}
		
	//query per recuperare scad_voce dell'obbligazione
	//scadenza.getObbligazione_scad_voceColl().add( scad_voce );
		Obbligazione_scad_voceHome obblig_scad_voceHome = (Obbligazione_scad_voceHome) getHome( aUC, Obbligazione_scad_voceBulk.class );

		sql = obblig_scad_voceHome.createSQLBuilder();
		sql.addClause("AND","cd_cds",sql.EQUALS, imp.getCd_cds() );
		sql.addClause("AND","esercizio",sql.EQUALS, imp.getEsercizio() );
		sql.addClause("AND","esercizio_originale",sql.EQUALS, imp.getEsercizio_originale() );
		sql.addClause("AND","pg_obbligazione",sql.EQUALS, imp.getPg_obbligazione() );

		result = obblig_scad_voceHome.fetchAll( sql );
		Obbligazione_scad_voceBulk obblig_scad_voce = (Obbligazione_scad_voceBulk) result.get(0);

		obblig_scad.getObbligazione_scad_voceColl().add( obblig_scad_voce );
		obblig_scad_voce.setObbligazione_scadenzario( obblig_scad );

		//query per recuperare cd_uo_ente dell'impegno
		Unita_organizzativa_enteHome uo_enteHome = (Unita_organizzativa_enteHome) getHome( aUC, Unita_organizzativa_enteBulk.class );
		sql = uo_enteHome.createSQLBuilder();
		result = uo_enteHome.fetchAll( sql );
		Unita_organizzativa_enteBulk uo_ente = (Unita_organizzativa_enteBulk) result.get(0);

		imp.setCd_uo_ente( uo_ente.getCd_unita_organizzativa() );
		if ( accert_pgiro!= null )
		{
			accert_pgiro.setCd_uo_ente( uo_ente.getCd_unita_organizzativa() );

			if (( accert_pgiro.getDt_cancellazione() == null && imp.getDt_cancellazione() != null ) ||
				 ( accert_pgiro.getDt_cancellazione() != null && imp.getDt_cancellazione() == null ) )
			{	 
				 accert_pgiro.setFl_isTronco( true );
			 	imp.setFl_isTronco( true );
			}
		}	
		
		// valorizziamo la voce presa dall'unica scadenza-voce inserita
		if (imp.hasDettagli()) {
			Voce_fBulk voce = ((Obbligazione_scad_voceBulk)((Obbligazione_scadenzarioBulk)imp.getObbligazione_scadenzarioColl().get(0)).getObbligazione_scad_voceColl().get(0)).getVoce_f();
			voce = (Voce_fBulk) getHome(aUC, voce).findByPrimaryKey(voce);
			imp.setVoce_f(voce);
		}

	return imp;
	}
	catch ( Exception e )
	{
		throw handleException(bulk, e)	;
	}
}
/** 
  *  inizializzazione per ricerca
  *    PreCondition:
  *      La richiesta di inizializzazione di un ImpegnoBulk per ricerca
  *      e' stata generata
  *    PostCondition:
  *      Vengono impostati il codice Cds e il codice Cds di origine con il codice Cds di scrivania
  *
  * @param aUC lo UserContext che ha generato la richiesta
  * @param bulk OggettoBulk l'impegno su partita di giro da inizializzare per la ricerca
  *
  * @return OggettoBulk l'impegno su partita di giro inizializzato per la ricerca
 */
public OggettoBulk inizializzaBulkPerRicerca (UserContext userContext,OggettoBulk bulk) throws ComponentException
{
	ImpegnoBulk imp = (ImpegnoBulk) bulk;
	try
	{
		/*
		imp.setCds( (CdsBulk) getHome( aUC, CdsBulk.class).findByPrimaryKey( imp.getUnita_organizzativa().getUnita_padre() ));
		imp.setCd_cds_origine( ((CNRUserContext) aUC).getCd_cds() );
		// if (!((ObbligazioneHome)getHome(aUC, obbligazione.getClass())).verificaStatoEsercizio(obbligazione))
		//	throw handleException( new ApplicationException( "Non e' possibile creare obbligazioni: esercizio non ancora aperto!") );
		return super.inizializzaBulkPerRicerca( aUC, imp );
		*/
		imp = (ImpegnoBulk) super.inizializzaBulkPerRicerca( userContext, imp );
		Unita_organizzativa_enteBulk uoEnte = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class ).findAll().get(0); 
		//imposto cds e uo origine
		if ( !uoEnte.getCd_unita_organizzativa().equals(((CNRUserContext)userContext).getCd_unita_organizzativa()))
		{
			Unita_organizzativaBulk uoScrivania = (Unita_organizzativaBulk)getHome( userContext, Unita_organizzativaBulk.class ).findByPrimaryKey( new Unita_organizzativaBulk( ((CNRUserContext)userContext).getCd_unita_organizzativa()));
			imp.setCd_uo_origine( uoScrivania.getCd_unita_organizzativa());		
			imp.setCd_cds_origine( uoScrivania.getCd_unita_padre());
			if ( imp.isResiduo() )
			{
				imp.setCd_cds( uoEnte.getCd_unita_padre());
				imp.setCd_unita_organizzativa( uoEnte.getCd_unita_organizzativa());
			}	
		}
		else
		{
			imp.setCd_cds( uoEnte.getCd_unita_padre());
			imp.setCd_unita_organizzativa( uoEnte.getCd_unita_organizzativa());					
		}
		return imp;
	}
	catch ( it.cnr.jada.persistency.PersistencyException e )
	{
		throw handleException(imp, e);
	}
}
public OggettoBulk inizializzaBulkPerRicercaLibera (UserContext userContext,OggettoBulk bulk) throws ComponentException
{
	return inizializzaBulkPerRicerca( userContext, bulk );
}
/** 
  *  Lock scadenza
  *		PreCondition:
  *			E' stato richiesto l'inserimento di un lock sulla scadenza di un'obbligazione
  *    PostCondition:
  *  		Il record relativo alla scadenza e' stato messo in lock e non e' pertanto consentito ad altre transazioni
  *         l'accesso a tale scadenza
 */

public void lockScadenza( UserContext userContext,IScadenzaDocumentoContabileBulk scadenza) throws ComponentException
{
	try
	{
		getHome( userContext, scadenza.getClass()).lock( (OggettoBulk)scadenza );
	}
	catch ( Exception e )
	{
		throw handleException( e )	;
	}	
}	

public OggettoBulk modificaConBulk (UserContext aUC,OggettoBulk bulk) throws ComponentException
{			
	try
	{
		ImpegnoBulk imp = (ImpegnoBulk) bulk;

		verificaStatoEsercizio( aUC, imp.getEsercizio(), imp.getCd_cds());		

		// controlliamo che non esista già un impegno su bilancio ente per la voce selezionata
		//ObbligazioneHome vocehome =(ObbligazioneHome)getHome(uc, ObbligazioneBulk.class);
		Obbligazione_scad_voceHome vocehome =(Obbligazione_scad_voceHome)getHome(aUC, Obbligazione_scad_voceBulk.class);
		SQLBuilder sql = vocehome.createSQLBuilder();
		sql.addTableToHeader("OBBLIGAZIONE");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.CD_CDS","OBBLIGAZIONE.CD_CDS");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO","OBBLIGAZIONE.ESERCIZIO");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.ESERCIZIO_ORIGINALE","OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
		sql.addSQLJoin("OBBLIGAZIONE_SCAD_VOCE.PG_OBBLIGAZIONE","OBBLIGAZIONE.PG_OBBLIGAZIONE");
		sql.addClause("AND","esercizio",sql.EQUALS, imp.getEsercizio() );
		sql.addClause("AND","cd_cds",sql.EQUALS, imp.getUnita_organizzativa().getCd_unita_padre() );
		sql.addClause("AND","cd_voce",sql.EQUALS, imp.getVoce_f().getCd_voce() );
		sql.addSQLClause("AND","cd_tipo_documento_cont",sql.EQUALS, Numerazione_doc_contBulk.TIPO_IMP);
		// deve essere escluso l'impegno che si sta modificando
		sql.openParenthesis("AND");
		sql.addClause("AND","esercizio_originale",sql.NOT_EQUALS, imp.getEsercizio_originale() );
		sql.addClause("OR","pg_obbligazione",sql.NOT_EQUALS, imp.getPg_obbligazione() );
		sql.closeParenthesis();

		List result = vocehome.fetchAll( sql );
		if (!result.isEmpty())
			throw new ApplicationException("Impossibile creare l'impegno con la voce del piano selezionata poichè è già stato creato un impegno su bilancio ente per tale voce.");

		//segnalo impossibilità di modificare importo se ci sono doc amministrativi associati
		if ( !imp.isFromDocAmm() && 
			imp.isAssociataADocAmm() && imp.getIm_iniziale_obbligazione() != null &&
			imp.getIm_iniziale_obbligazione().compareTo( imp.getIm_obbligazione()) != 0 )
			throw new ApplicationException( "Impossibile variare importo dell'Impegno su bilancio Ente perche' e' associata a doc. amministrativi");

		//segnalo impossibilità di modificare importo se ci sono mandati associati
		if ( imp.isFromDocAmm() && 
			imp.isAssociataADocAmm() && imp.getIm_iniziale_obbligazione() != null &&
			imp.getIm_iniziale_obbligazione().compareTo( imp.getIm_obbligazione()) != 0 &&
			imp.getPg_mandato() != null )
			throw new ApplicationException( "Impossibile variare importo dell'Impegno su bilancio Ente perche' e' associata a mandato");
		
		//	segnalo impossibilità di modificare un residuo se l'esercizio precedente è ancora aperto
		if ( imp.getCd_tipo_documento_cont().equals( Numerazione_doc_contBulk.TIPO_IMP_RES))
			verificaStatoEsercizioEsPrecedente( aUC, imp.getEsercizio(), imp.getCd_cds());
			
		//importo
		Obbligazione_scadenzarioBulk obblig_scadenzario = (Obbligazione_scadenzarioBulk)imp.getObbligazione_scadenzarioColl().get(0);
		obblig_scadenzario.setIm_scadenza( imp.getIm_obbligazione() );
		obblig_scadenzario.setToBeUpdated();
		
		Obbligazione_scad_voceBulk obblig_scad_voce = (Obbligazione_scad_voceBulk)obblig_scadenzario.getObbligazione_scad_voceColl().get(0);
		obblig_scad_voce.setIm_voce(imp.getIm_obbligazione() );
		obblig_scad_voce.setToBeUpdated();

		// descrizione
		obblig_scadenzario.setDs_scadenza( imp.getDs_obbligazione() );

		//dt_scadenza
		obblig_scadenzario.setDt_scadenza( imp.getDt_scadenza());


		// CHIAMARE IL METODO modificaAccertamento() su AccertamentoPGiroComponent
		//if ( !imp.isFl_isTronco() && !imp.isResiduo())
		//	createAccertamentoPGiroComponent().modificaAccertamento( aUC, imp);

		//aggiorna il db:

		// impostiamo la voce del piano in testata coerentemente con quella nelle scadenze
		// viene già impostato nel doBringBack ma lo rifacciamo
		if (imp.getVoce_f()!=null)
			imp.setElemento_voce(((ImpegnoHome)getHome(aUC, ImpegnoBulk.class)).findElementoVoceFor(imp.getVoce_f()));
		
		imp.setUser( aUC.getUser());		
		updateBulk( aUC, imp );
		obblig_scadenzario.setUser( aUC.getUser());		
		updateBulk( aUC, obblig_scadenzario );
		obblig_scad_voce.setUser( aUC.getUser());
		if ( obblig_scad_voce.getCd_voce().equals( imp.getVoce_f().getCd_voce()))
			updateBulk( aUC, obblig_scad_voce );
		else
			// se e' stato modificato il capitolo e' necessario ricreare lo scad_voce 
			// perchè non e' possibile aggiornare la chiave
		{
			Obbligazione_scad_voceBulk newObblig_scad_voce = new Obbligazione_scad_voceBulk();
			newObblig_scad_voce.setLinea_attivita( obblig_scad_voce.getLinea_attivita());
			newObblig_scad_voce.setObbligazione_scadenzario( obblig_scad_voce.getObbligazione_scadenzario());
			newObblig_scad_voce.setIm_voce(obblig_scad_voce.getIm_voce());
			newObblig_scad_voce.setTi_appartenenza(obblig_scad_voce.getTi_appartenenza());
			newObblig_scad_voce.setTi_gestione(obblig_scad_voce.getTi_gestione());
			// aggiorniamo la voce con quella impostata in mappa
			newObblig_scad_voce.setCd_voce(imp.getVoce_f().getCd_voce());
			newObblig_scad_voce.setUser(obblig_scad_voce.getUser());
			newObblig_scad_voce.setCd_fondo_ricerca(obblig_scad_voce.getCd_fondo_ricerca());															
			insertBulk( aUC, newObblig_scad_voce );
			deleteBulk( aUC, obblig_scad_voce);
		}	

	    if ( !aUC.isTransactional() )
		//aggiorna i saldi
		{
			aggiornaCapitoloSaldoObbligazione( aUC, imp, MODIFICA );
	    
			aggiornaStatoCOAN_COGEDocAmm( aUC, imp );
		}	
		

		verificaStatoEsercizio( 
							aUC, 
							((CNRUserContext)aUC).getEsercizio(), 
							imp.getCd_cds());
		return imp;
	
	} 
	catch ( Exception e )
	{
		throw handleException( bulk, e );
	}
}
/*
 * Modifica l'importo di una scadenza e della testata dell'obbligazione
 *	
 * Pre-post-conditions:
 *
 * Nome: Scadenza successiva - Errore ultima scadenza
 * Pre:  E' stata generata la richiesta di modifica della scadenza successiva
 * Post: Viene generata un'ApplicationException in quanto le obbligazioni su partita di giro hanno un'unica scadenza
 *
 * Nome: Modifica scadenza
 * Pre:  E' stata generata la richiesta di modifica dell'importo di una scadenza
 * Post: Vengono aggiornati l'importo in testata, in scadenza e in scad_voce e la controparte per l'accertamento su pgiro
 *
 * @param userContext lo userContext che ha generato la richiesta
 * @param scad la scadenza (con importo originale)
 * @param nuovoImporto che deve assumere la scadenza
 * @param modificaScadenzaSuccessiva se true indica il fatto che la testata dell'obbligazione non deve essere modificata
 *                                   e che la differenza fra l'importo attuale e il vecchio importo deve essere riportata sulla
 *									 scadenza successiva
 * @param modificaScadenzaSuccessiva se false indica il fatto che deve essere modificato l'importo della scadenza e della testata
 *                                   dell'obbligazione
 * @return la scadenza 
 */

public IScadenzaDocumentoContabileBulk modificaScadenzaInAutomatico( UserContext userContext,	IScadenzaDocumentoContabileBulk scad,	BigDecimal nuovoImporto, boolean modificaScadenzaSuccessiva ) throws ComponentException 
{
	Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)scad;
	if ( modificaScadenzaSuccessiva )
		throw new ApplicationException(" Non esiste scadenza successiva" );
	if ( scadenza.getIm_scadenza().compareTo( nuovoImporto ) == 0 )
		throw handleException( new ApplicationException( "Aggiornamento in automatico non necessario" ));
	if (  nuovoImporto.compareTo( new BigDecimal(0)) < 0  )
		throw handleException( new ApplicationException( "L'importo della scadenza deve essere maggiore di 0" ));					

	//aggiorno importo testata
	ImpegnoBulk imp = (ImpegnoBulk) scadenza.getObbligazione();
	if ( imp.getCd_tipo_documento_cont().equals( Numerazione_doc_contBulk.TIPO_IMP_RES) )
		throw handleException( new ApplicationException( "Non è consentita la modifica dell'importo di testata di un'annotazione residua." ));					
	
	imp.setIm_obbligazione( nuovoImporto );
	imp.setToBeUpdated();

	imp.setFromDocAmm( true );
	modificaConBulk( userContext, scadenza.getObbligazione());
	return scadenza;

}
protected Query select(UserContext userContext,CompoundFindClause clauses,OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException 
{
	ImpegnoBulk imp = (ImpegnoBulk) bulk;
	SQLBuilder sql = (SQLBuilder) super.select( userContext, clauses, bulk );
//	sql.addClause( "AND", "cd_uo_origine", sql.EQUALS, ((CNRUserContext)userContext).getCd_unita_organizzativa()); 
	sql.addClause( "AND", "esercizio", sql.EQUALS, ((CNRUserContext)userContext).getEsercizio()); 
	if ( imp.getStato_obbligazione() != null )
		sql.addClause( "AND", "stato_obbligazione", sql.EQUALS, imp.getStato_obbligazione());
	Unita_organizzativa_enteBulk uoEnte = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class ).findAll().get(0); 
	//imposto cds e uo origine
	if ( !uoEnte.getCd_unita_organizzativa().equals(((CNRUserContext)userContext).getCd_unita_organizzativa()))
	{
		Unita_organizzativaBulk uoScrivania = (Unita_organizzativaBulk)getHome( userContext, Unita_organizzativaBulk.class ).findByPrimaryKey( new Unita_organizzativaBulk( ((CNRUserContext)userContext).getCd_unita_organizzativa()));
	    sql.addClause( "AND", "cd_uo_origine", sql.EQUALS, uoScrivania.getCd_unita_organizzativa());
	    sql.addClause( "AND", "cd_cds_origine", sql.EQUALS, uoScrivania.getCd_unita_padre());			    
	}
	else
	{
	    sql.addClause( "AND", "cd_unita_organizzativa", sql.EQUALS, uoEnte.getCd_unita_organizzativa());
	    sql.addClause( "AND", "cd_cds", sql.EQUALS, uoEnte.getCd_unita_padre());	    
	}

	if ( imp.isResiduo() )
	{
		sql.addSQLClause( "AND", "cd_tipo_documento_cont", sql.EQUALS, Numerazione_doc_contBulk.TIPO_IMP_RES);
		return sql;
	}	
	return sql;
}
/** 
  *  Tutti controlli superati
  *    PreCondition:
  *      La data di registrazione dell'obbligazione su partita di giro è corretta.
  *    PostCondition:
  *      L'obbligazione su partita di giro è valida. E' consentito eseguire l'attività di salvataggio.
  *  La data di registrazione dell'obbligazione su partita di giro non è corretta.
  *    PreCondition:
  *     E' stata inserita dall'utente una data di registrazione antecedente a quella dell'ultima obbligazione pgiro
  *		salvata sul database
  *    PostCondition:
  *      L'utente viene avvisato tramite un messaggio di errore che non è possibile inserire un'obbligazione su partita 
  *		 di giro con data anteriore a quella dell'ultima obbligazione salvata su database. L'attività non è consentita.
  *
  * @param userContext lo UserContext che ha generato la richiesta
  * @param impegno ImpegnoBulk l'obbligazione su partita di giro da validare
  *
 */
protected void verificaObbligazione(UserContext userContext, ImpegnoBulk impegno ) throws it.cnr.jada.persistency.PersistencyException, ComponentException, ApplicationException, javax.ejb.EJBException
{
	if ( impegno.isToBeCreated() )
	{
		Timestamp lastDayOfTheYear = DateServices.getLastDayOfYear( impegno.getEsercizio().intValue());

		if ( impegno.getDt_registrazione().before(DateServices.getFirstDayOfYear( impegno.getEsercizio().intValue())) ||
			  impegno.getDt_registrazione().after(lastDayOfTheYear))
			throw  new ApplicationException( "La data di registrazione deve appartenere all'esercizio di scrivania" );

		Timestamp today = it.cnr.jada.util.ejb.EJBCommonServices.getServerDate();
		if ( today.after(lastDayOfTheYear ) &&
			  impegno.getDt_registrazione().compareTo( lastDayOfTheYear) != 0 )
			throw  new ApplicationException( "La data di registrazione deve essere " +
		   									java.text.DateFormat.getDateInstance().format( lastDayOfTheYear ));					

		Timestamp dataUltObbligazione = ((ImpegnoHome) getHome( userContext, ImpegnoBulk.class )).findDataUltimaObbligazionePerCds( impegno );
		if ( dataUltObbligazione != null && dataUltObbligazione.after( impegno.getDt_registrazione() ) )
			throw  new ApplicationException( "Non è possibile inserire un'Annotazione di Spesa su Partita di Giro con data anteriore a " +  
   									java.text.DateFormat.getDateTimeInstance().format( dataUltObbligazione ));
		}

}
/**
 * Verifica dello stato dell'esercizio 
 *
 * @param userContext UserContext 
 *
 * @return FALSE se per il cds interessato non è stato inserito nessun esercizio o se l'esercizio non è in stato di "aperto"
 *		   TRUE in tutti gli altri casi
 *
 */

void verificaStatoEsercizio( UserContext userContext, Integer es, String cd_cds ) throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	EsercizioBulk esercizio = (EsercizioBulk) getHome(userContext, EsercizioBulk.class).findByPrimaryKey( 
																									new EsercizioBulk( cd_cds, es ));
	if (esercizio == null )
			throw handleException( new ApplicationException( "Operazione impossibile: esercizio inesistente!") );
	if ( !esercizio.STATO_APERTO.equals(esercizio.getSt_apertura_chiusura()))
			throw handleException( new ApplicationException( "Operazione impossibile: esercizio non aperto!") );
}			
			
/**
 * Verifica dello stato dell'esercizio precedenet per residui
 *
 * @param userContext UserContext 
 *
 * @return FALSE se per il cds interessato l'esercizio precedente non è in stato di "chiuso"
 *		   TRUE in tutti gli altri casi
 *
 */

void verificaStatoEsercizioEsPrecedente( UserContext userContext, Integer es, String cd_cds ) throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	EsercizioBulk esPrec = (EsercizioBulk) getHome(userContext, EsercizioBulk.class).findByPrimaryKey( 
																									new EsercizioBulk( cd_cds, new Integer( es.intValue() - 1 )));
	if (esPrec != null && !esPrec.STATO_CHIUSO_DEF.equals(esPrec.getSt_apertura_chiusura()))
			throw handleException( new ApplicationException( "Operazione impossibile: esercizio precedente non chiuso!") );
			
}	
/**
 *  Recupera l'elemento voce di tipo categoria, da cui discende la voce
 *  passata come parametro, questo elemento voce verrà inserito in testata
 *  all'impegno per bilancio ente corrispondente alla voce inserita nel
 *  dettaglio della scadenza
 * @param voce
 * @return
 * @throws ComponentException
 */
public Elemento_voceBulk findElementoVoceFor(UserContext userContext, Voce_fBulk voce) throws ComponentException {

	try{
		ImpegnoHome impHome = (ImpegnoHome)getHome(userContext,ImpegnoBulk.class);
		return impHome.findElementoVoceFor(voce);
		
	}catch (it.cnr.jada.persistency.PersistencyException ex){
		throw handleException(voce,ex);
	}
}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy