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

it.cnr.contab.missioni00.comp.AnticipoComponent 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.missioni00.comp;

import it.cnr.contab.docamm00.docs.bulk.*;
import java.sql.*;
import it.cnr.contab.config00.ejb.*;
import java.util.*;
import java.math.BigDecimal;
import java.io.Serializable;

import java.rmi.RemoteException;
import it.cnr.contab.anagraf00.core.bulk.*;
import it.cnr.contab.missioni00.docs.bulk.*;
import it.cnr.contab.docamm00.tabrif.bulk.*;
import it.cnr.contab.doccont00.core.bulk.*;
import it.cnr.contab.compensi00.docs.bulk.*;
import it.cnr.contab.config00.bulk.*;
import it.cnr.contab.utenze00.bp.*;
import it.cnr.contab.util.Utility;
import it.cnr.contab.docamm00.ejb.RiportoDocAmmComponentSession;
import it.cnr.contab.doccont00.comp.DocumentoContabileComponentSession;
import it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession;
import it.cnr.contab.doccont00.ejb.AccertamentoAbstractComponentSession;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.PrimaryKeyHashMap;
import it.cnr.jada.bulk.PrimaryKeyHashtable;
import it.cnr.jada.comp.*;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.*;
import it.cnr.jada.util.RemoteIterator;
import it.cnr.jada.util.ejb.EJBCommonServices;

/**
 * Insert the type's description here.
 * Creation date: (23/11/2001 15.02.34)
 * @author: Paola sala
 */
 
public class AnticipoComponent extends it.cnr.jada.comp.CRUDComponent implements IAnticipoMgr,Cloneable,Serializable
{
/**
 * MissioneComponent constructor comment.
 */
public AnticipoComponent() {
	super();
}
private void aggiornaCogeCoan(
	UserContext userContext,
	AnticipoBulk anticipo,
	IDocumentoContabileBulk docCont)
	throws ComponentException {

	try {
		if (docCont != null && anticipo != null && anticipo.getDefferredSaldi() != null) {
			IDocumentoContabileBulk key = anticipo.getDefferredSaldoFor(docCont);
			if (key != null) {
				java.util.Map values = (java.util.Map)anticipo.getDefferredSaldi().get(key);

				//caso di creazione o di nessuna modifica sui doc cont
				if (values == null) return;
				
				//QUI chiamare component del documento contabile interessato
				String jndiName = null;
				Class clazz = null;
				DocumentoContabileComponentSession session = null;
				if (docCont instanceof ObbligazioneBulk) {
					jndiName = "CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession";
					clazz = ObbligazioneAbstractComponentSession.class;
					session = 
						(ObbligazioneAbstractComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
						jndiName,clazz);
				} else if (docCont instanceof AccertamentoBulk) {
					jndiName = "CNRDOCCONT00_EJB_AccertamentoAbstractComponentSession";
					clazz = AccertamentoAbstractComponentSession.class;
					session = 
						(AccertamentoAbstractComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
						jndiName,clazz);
				}
				if (session != null) {
					session.aggiornaCogeCoanInDifferita(userContext, key, values);
					anticipo.getDefferredSaldi().remove(key);
				}
			}
		}
	} catch (javax.ejb.EJBException e) {
		throw handleException(anticipo, e);
	} catch (java.rmi.RemoteException e) {
		throw handleException(anticipo, e);
	}
}
private void aggiornaCogeCoanDocAmm(
	UserContext userContext,
	AnticipoBulk anticipo)
	throws ComponentException {

	if (anticipo == null) return;

	aggiornaCogeCoanObbligazioniDaCancellare(userContext, anticipo);
	aggiornaCogeCoanObbligazioni(userContext, anticipo);
}
private void aggiornaCogeCoanObbligazioni(
	UserContext userContext,
	AnticipoBulk anticipo)
	throws ComponentException {

	if (anticipo != null) {
		ObbligazioniTable obbligazioniHash = anticipo.getObbligazioniHash();
		if (obbligazioniHash != null && !obbligazioniHash.isEmpty()) {

			//Aggiorna coge coan per le obbligazioni NON temporanee
			for (java.util.Enumeration e = getDocumentiContabiliNonTemporanei(userContext, ((ObbligazioniTable)obbligazioniHash.clone()).keys()).keys(); e.hasMoreElements();)
				aggiornaCogeCoan(
					userContext, 
					anticipo, 
					(IDocumentoContabileBulk)e.nextElement());
				
		}
	}
}
private void aggiornaCogeCoanObbligazioniDaCancellare(
	UserContext userContext,
	AnticipoBulk anticipo)
	throws ComponentException {

	if (anticipo != null) {
		if (anticipo.getDocumentiContabiliCancellati() != null &&
			!anticipo.getDocumentiContabiliCancellati().isEmpty() &&
			anticipo.getObbligazioniHash() != null) {

			for (java.util.Enumeration e = anticipo.getDocumentiContabiliCancellati().elements(); e.hasMoreElements();) {
				OggettoBulk oggettoBulk = (OggettoBulk)e.nextElement();
				if (oggettoBulk instanceof Obbligazione_scadenzarioBulk) {
					Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)oggettoBulk;
					if (!scadenza.getObbligazione().isTemporaneo()) {
						PrimaryKeyHashtable obbligs = getDocumentiContabiliNonTemporanei(userContext, anticipo.getObbligazioniHash().keys());
						if (!obbligs.containsKey(scadenza.getObbligazione()))
							aggiornaCogeCoan(
								userContext, 
								anticipo, 
								scadenza.getObbligazione());
					}
				}
			}
		}
	}
}
/**
 * Aggiorna obbligazione
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna obbligazione temporanea
 * Pre:  L'utente ha richiesto l'inserimento/modifica di un anticipo
 *       L'utente ha creato una nuova obbligazione nel contesto transazionale dell'anticipo
 * Post: Il sistema assegna un progressivo definitivo all'obbligazione (metodo 'aggiornaObbligazioneTemporanea'),
 *       aggiorna l'importo associato a doc. amministrativi della scadenza di obbligazione, aggiorna il saldo dell'obbligazione
 *       (metodo 'aggiornaSaldi')
 *
 * Nome: Aggiorna obbligazione non temporanea
 * Pre:  L'utente ha richiesto l'inserimento/modifica di un anticipo
 *       L'utente ha selezionato una scadenza di obbligazione già esistente
 * Post: Il sistema aggiorna l'importo associato a doc. amministrativi della scadenza di obbligazione e aggiorna il saldo dell'obbligazione
 *       (metodo 'aggiornaSaldi')
 *
 * Nome: Elimina associazione con obbligazione 
 * Pre:  L'utente ha richiesto la modifica di un anticipo
 *       L'utente ha eliminato un'associazione con una scadenza di obbligazione
 * Post: Il sistema azzera l'importo associato a doc. amministrativi della scadenza di obbligazione e aggiorna il saldo dell'obbligazione
 *       (metodo 'aggiornaSaldi')
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk da creare/modificare
 * @param	status		serve per gestire l'eccezione lanciata dall'obbligazione
 *						nel caso non ci sia disponibilita' di cassa 
 *
 */	
private void aggiornaObbligazione(UserContext userContext, AnticipoBulk anticipo, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status) throws ComponentException
{
	Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)anticipo.getScadenza_obbligazione();
	
	if(	(scadenza==null) || (scadenza.getPg_obbligazione_scadenzario()==null) ||
		(scadenza.getPg_obbligazione()==null) || (scadenza.getEsercizio_originale()==null))
		return;			// L'anticipo avra' sempre una obbligazione

	// Ciclo sulle scadenze precedentementi associate all'anticipo.
	// Se nuove le inserisco comunque in tabella con "im_associato_doc_amm" nullo e ne aggiorno i saldi
	// Se non nuove le aggiorno azzerando il loro "im_associato_doc_amm"
	Obbligazione_scadenzarioBulk aScadenzaNonAssociata;
	if(anticipo.getDocumentiContabiliCancellati() != null)
	{
		for ( Iterator i = anticipo.getDocumentiContabiliCancellati().iterator(); i.hasNext(); )
		{
			aScadenzaNonAssociata = (Obbligazione_scadenzarioBulk) i.next();				
			if(!aScadenzaNonAssociata.getObbligazione().equalsByPrimaryKey(scadenza.getObbligazione()))
			{
				// se la scadenza appartiene alla stessa obbligazione della scadenza associata all'anticipo 
				// non aggiornare i saldi altrimenti lo faresti due volte (l'aggiornamento dei saldi va per
				// obbligazione e non per scadenze)
				aggiornaSaldi(userContext, anticipo, aScadenzaNonAssociata.getObbligazione(), status);
				
				if (aScadenzaNonAssociata.getObbligazione().isTemporaneo())
					aggiornaObbligazioneTemporanea(userContext, aScadenzaNonAssociata.getObbligazione());				
			}				

			aScadenzaNonAssociata.setIm_associato_doc_amm((new BigDecimal(0)));
			updateImportoAssociatoDocAmm(userContext, aScadenzaNonAssociata);
		}			
	}
	// Se la scadenza era gia' stata creata e non e' stata modificata
	// il metodo non aggiornera' alcun saldo
	aggiornaSaldi(userContext, anticipo, scadenza.getObbligazione(), status);	
			
	if (scadenza.getObbligazione().isTemporaneo())
		aggiornaObbligazioneTemporanea(userContext, scadenza.getObbligazione());

	scadenza.setIm_associato_doc_amm(anticipo.getIm_anticipo_divisa());			
	updateImportoAssociatoDocAmm(userContext, scadenza);

	if((anticipo.getDocumentiContabiliCancellati() == null) ||
	   (anticipo.getDocumentiContabiliCancellati().isEmpty()))
		return;
}
/**
 * Aggiorna obbligazione temporanea
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna obbligazione temporanea
 * Pre:  L'utente ha richiesto l'inserimento/modifica di un anticipo
 *       L'utente ha creato una nuova obbligazione nel contesto transazionale dell'anticipo e pertanto
 *       questa obbligazione ha un progressivo temporaneo
 * Post: Il sistema assegna la numerazione definitiva all'obbligazione creata nel contesto dell'anticipo
 *	
 * @param	userContext				lo UserContext che ha generato la richiesta
 * @param	obbligazioneTemporanea	l'ObbligazioneBulk con numerazione temporanea da rendere definitiva
 * 
*/
private void aggiornaObbligazioneTemporanea(UserContext userContext,ObbligazioneBulk obbligazioneTemporanea) throws ComponentException 
{
	try 
	{
		Numerazione_doc_contHome numHome = (Numerazione_doc_contHome) getHomeCache(userContext).getHome(Numerazione_doc_contBulk.class);
		Long pg = null;
		pg = numHome.getNextPg(userContext,
								obbligazioneTemporanea.getEsercizio(), 
								obbligazioneTemporanea.getCd_cds(), 
								obbligazioneTemporanea.getCd_tipo_documento_cont(), 
								obbligazioneTemporanea.getUser());
		
		ObbligazioneHome home = (ObbligazioneHome)getHome(userContext, obbligazioneTemporanea);
		home.confirmObbligazioneTemporanea(userContext, obbligazioneTemporanea, pg);
		
	} 
	catch (it.cnr.jada.persistency.PersistencyException e) {throw handleException(obbligazioneTemporanea, e);} 
	catch (it.cnr.jada.persistency.IntrospectionException e) {throw handleException(obbligazioneTemporanea, e);}	
}
/**
 * Aggiorna saldi obbligazione
 *
 * Pre-post-conditions:
 *
 * Nome: Aggiorna saldi obbligazione
 * Pre:  L'utente ha richiesto l'inserimento/modifica di un anticipo
 *       L'utente ha associato una obbligazione all'anticipo
 * Post: Il sistema richiede alla Component che gestisce l'Obbligazione l'aggiornamento in differita dei saldi
 * 
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk a cui e' stata associata una scadenza di obbligazione
 * @param   docCont 	il documento contabile di tipo ObbligazioneBulk per cui chiedere l'aggiornamento dei saldi
 * @param	status		serve per gestire l'eccezione lanciata dall'obbligazione
 *						nel caso non ci sia disponibilita' di cassa
 */	

private void aggiornaSaldi(it.cnr.jada.UserContext userContext, AnticipoBulk anticipo, IDocumentoContabileBulk docCont, OptionRequestParameter status) throws ComponentException
{
	try 
	{
		if (docCont != null && anticipo != null && anticipo.getDefferredSaldi() != null) 
		{
			IDocumentoContabileBulk key = anticipo.getDefferredSaldoFor(docCont);
			if(key != null) 
			{
				java.util.Map values = (java.util.Map)anticipo.getDefferredSaldi().get(key);

				if(values != null)
				{				
					//QUI chiamare component del documento contabile interessato
					String jndiName = null;
					Class clazz = null;
					it.cnr.contab.doccont00.comp.DocumentoContabileComponentSession session = null;
					if (docCont instanceof ObbligazioneBulk)
					{
						jndiName = "CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession";
						clazz = it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession.class;
						session = (it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB(jndiName,clazz);
					} 
					if(session != null)
					{
						session.aggiornaSaldiInDifferita(userContext, key, values, status);
						//NON Differibile: si rischia di riprocessare i saldi impropriamente
						anticipo.getDefferredSaldi().remove(key);
					}	
				}		
			}
		}
	} 
	catch (javax.ejb.EJBException e) 
	{
		throw handleException(anticipo, e);
	} 
	catch (java.rmi.RemoteException e) 
	{
		throw handleException(anticipo, e);
	}
}
/**
 * Carica i dati relativi al terzo
 *
 * Pre-post-conditions:
 *
 * Nome: Carica terzo
 * Pre:  Il sistema carica in modifica un anticipo selezionato
 * Post: Il sistema carica i dati relativi al terzo dell'anticipo, comprensivi dei termini 
 *		 e delle modalità di pagamento
 *
 * Nome: Carica terzo - errore 
 * Pre:  Il sistema non trova il terzo da caricare per l'anticipo che si sta aprendo in modifica
 * Post: Una segnalazione di errore viene restituita all'utente
 *
 *
 * @param	uc			lo UserContext che ha generato la richiesta
 * @param	anticipo	l'AnticipoBulk da caricare
 *
 */	
private void caricaTerzoInModificaAnticipo(UserContext userContext,AnticipoBulk anticipo) throws ComponentException
{
	try
	{ 
		anticipo.setV_terzo(new V_terzo_per_compensoBulk());
		SQLBuilder sql = selectV_terzoByClause(userContext,anticipo, anticipo.getV_terzo(), null);
		sql.addClause("AND", "cd_terzo", SQLBuilder.EQUALS, anticipo.getCd_terzo());
		
		V_terzo_per_compensoHome terzoHome = (V_terzo_per_compensoHome)getHome(userContext,V_terzo_per_compensoBulk.class);

		List terzi = terzoHome.fetchAll( sql );
		if(terzi==null || terzi.isEmpty())
			throw new ApplicationException("Attenzione, il terzo associato all'anticipo non esiste !");
	
		anticipo.setV_terzo((V_terzo_per_compensoBulk)terzi.get(0));
		anticipo.setTermini(findTermini(userContext, anticipo));
		anticipo.setModalita(findModalita(userContext, anticipo));		
	} 
	catch (Throwable e) 
	{
		throw handleException(e);
	} 		
}
/** 
  *	Tutti i controlli  superati.
  *		PreCondition:
  * 		Ricerca la lista delle scadenze di obbligazioni eleggibili all'anticipo
  *   	PostCondition:
  *  		Il sistema fornisce le scadenze di obbligazioni ove:
  *			- l'esercizio dell'obbligazione e' uguale a quello di scrivania
  *			- l'obbligazione e' definitiva
  *			- l'obbligazione non e' stata cancellata logicamente
  *			- l'obbligazione non e' una partita di giro
  *			- la scadenza non ha importo nullo
  *			- l'importo associato a documento amministrativo della scadenza e' nullo (oppure 0)
  *			- l'importo associato a documento contabile della scadenza e' nullo (oppure 0)
  *			- l'unita' organizzativa dell'obbligazione e' uguale a quella dell'anticipo
  *			- l'obbligazione non e' riportata
  *			- il terzo dell'obbligazione e' uguale a quello dell'anticipo
  *			Possono essere aggiunte altre condizioni di ricerca se l'utente le ha specificate
  *			nella finestra di ricerca delle obbligazioni. Tali condizioni sono relative al terzo, alla
  *			data di scadenza, all'importo della scadenza, al progressivo dell'obbligazione e all'elemento
  *			voce dell'obbligazione
  *			
  */
public RemoteIterator cercaObbligazioni(UserContext context, Filtro_ricerca_obbligazioniVBulk filtro)
	throws ComponentException {

	Obbligazione_scadenzarioHome home = (Obbligazione_scadenzarioHome)getHome(context, Obbligazione_scadenzarioBulk.class);
	it.cnr.jada.persistency.sql.SQLBuilder sql = home.createSQLBuilder();
	sql.setDistinctClause(true);
	sql.addTableToHeader("OBBLIGAZIONE");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.CD_CDS","OBBLIGAZIONE.CD_CDS");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO","OBBLIGAZIONE.ESERCIZIO");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO_ORIGINALE","OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE","OBBLIGAZIONE.PG_OBBLIGAZIONE");

	sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context));
	sql.addSQLClause("AND","OBBLIGAZIONE.STATO_OBBLIGAZIONE", sql.EQUALS, "D");
	sql.addSQLClause("AND","OBBLIGAZIONE.DT_CANCELLAZIONE", sql.ISNULL, null);
	sql.addSQLClause("AND","OBBLIGAZIONE.FL_PGIRO",sql.NOT_EQUALS, "Y");		
	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_SCADENZA", sql.NOT_EQUALS, new java.math.BigDecimal(0));
	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM IS NULL");
	sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP),java.sql.Types.DECIMAL,2);
	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE IS NULL");
	sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP),java.sql.Types.DECIMAL,2);
	sql.addSQLClause("AND","OBBLIGAZIONE.CD_UNITA_ORGANIZZATIVA",sql.EQUALS, filtro.getCd_unita_organizzativa());
	sql.addSQLClause("AND","OBBLIGAZIONE.RIPORTATO",sql.EQUALS, "N");
	
	if (filtro.getElemento_voce() != null) {
		sql.addSQLClause("AND","OBBLIGAZIONE.CD_ELEMENTO_VOCE",sql.STARTSWITH, filtro.getElemento_voce().getCd_elemento_voce());
		sql.addSQLClause("AND","OBBLIGAZIONE.TI_APPARTENENZA",sql.EQUALS, filtro.getElemento_voce().getTi_appartenenza());
		sql.addSQLClause("AND","OBBLIGAZIONE.TI_GESTIONE",sql.EQUALS, filtro.getElemento_voce().getTi_gestione());
		sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO",sql.EQUALS, filtro.getElemento_voce().getEsercizio());
	}

	if (!filtro.getFl_fornitore().booleanValue()) {
		sql.addTableToHeader("TERZO");
		sql.addTableToHeader("ANAGRAFICO");
		sql.addSQLJoin("OBBLIGAZIONE.CD_TERZO", "TERZO.CD_TERZO");
		sql.addSQLJoin("TERZO.CD_ANAG", "ANAGRAFICO.CD_ANAG");
		sql.addSQLClause("AND","(OBBLIGAZIONE.CD_TERZO = ? OR ANAGRAFICO.TI_ENTITA = ?)");
		sql.addParameter(filtro.getFornitore().getCd_terzo(),java.sql.Types.INTEGER,0);
		sql.addParameter(AnagraficoBulk.DIVERSI,java.sql.Types.VARCHAR,0);
	} else {
		sql.addSQLClause("AND","OBBLIGAZIONE.CD_TERZO",sql.EQUALS, filtro.getFornitore().getCd_terzo());
	}
	
	if (filtro.getFl_data_scadenziario().booleanValue() && filtro.getData_scadenziario() != null)
		sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.DT_SCADENZA",sql.EQUALS, filtro.getData_scadenziario());
	if (filtro.getFl_importo().booleanValue() && filtro.getIm_importo() != null)
		sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_SCADENZA",sql.GREATER_EQUALS, filtro.getIm_importo());

	//filtro su Tipo obbligazione
	if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getTipo_obbligazione() != null) {
		if (ObbligazioneBulk.TIPO_COMPETENZA.equals(filtro.getTipo_obbligazione()))
			sql.addSQLClause("AND","OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT",sql.EQUALS,Numerazione_doc_contBulk.TIPO_OBB);
		else if (ObbligazioneBulk.TIPO_RESIDUO_PROPRIO.equals(filtro.getTipo_obbligazione()))
			sql.addSQLClause("AND","OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT",sql.EQUALS,Numerazione_doc_contBulk.TIPO_OBB_RES);
		else if (ObbligazioneBulk.TIPO_RESIDUO_IMPROPRIO.equals(filtro.getTipo_obbligazione()))
			sql.addSQLClause("AND","OBBLIGAZIONE.CD_TIPO_DOCUMENTO_CONT",sql.EQUALS,Numerazione_doc_contBulk.TIPO_OBB_RES_IMPROPRIA);
	}

	//filtro su Anno Residuo obbligazione
	if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getEsercizio_ori_obbligazione() != null)
		sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO_ORIGINALE",sql.EQUALS, filtro.getEsercizio_ori_obbligazione());

	//filtro su Numero obbligazione
	if (filtro.getFl_nr_obbligazione().booleanValue() && filtro.getNr_obbligazione() != null)
		sql.addSQLClause("AND","OBBLIGAZIONE.PG_OBBLIGAZIONE",sql.EQUALS, filtro.getNr_obbligazione());

	return iterator(
		context,
		sql,
		Obbligazione_scadenzarioBulk.class,
		"default");
} 
/**
 * Completa i dati relativi al terzo
 *
 * Pre-post-conditions:
 *
 * Nome: Completa terzo
 * Pre:  L'utente ha selezionato un nuovo terzo per l'anticipo
 * Post: Il sistema valorizza tutti i dati relativi all'anagrafico associato al terzo selezionato, in particolare
 *	     nome, cognome, ragione sociale, codice fiscale, partita iva, modalita e termini di pagamento 
 *
 * @param	uc			lo UserContext che ha generato la richiesta
 * @param	anticipo	l'AnticipoBulk per cui e' stato selezionato un nuovo terzo
 * @param	aTerzo		il terzo di tipo V_terzo_per_compensoBulk selezionato dall'utente
 *
 * @return 	l'AnticipoBulk con i dati relativi al terzo inizializzati
 */	
public AnticipoBulk completaTerzo(UserContext uc, AnticipoBulk anticipo, V_terzo_per_compensoBulk aTerzo) throws ComponentException
{
	if (anticipo != null) 
	{
		anticipo.setV_terzo(aTerzo);		
		anticipo.setCd_terzo(aTerzo.getCd_terzo());
		anticipo.setNome(aTerzo.getNome());
		anticipo.setCognome(aTerzo.getCognome());
		anticipo.setRagione_sociale(aTerzo.getRagione_sociale());
		anticipo.setCodice_fiscale(aTerzo.getCodice_fiscale());
		anticipo.setPartita_iva(aTerzo.getPartita_iva());
		anticipo.setTermini(findTermini(uc, anticipo));
		anticipo.setModalita(findModalita(uc, anticipo));
	} 

	return anticipo;
}
/**
 * Creazione anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Crea anticipo
 * Pre:  L'utente ha completato l'inserimento dei dati relativi ad un nuovo anticipo e ne chiede il salvataggio
 * Post: Il sistema rende persistente l'anticipo creato
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk per cui e' stato richiesta la creazione
 *
 * @return l'AnticipoBulk creato e salvato
 */	

public OggettoBulk creaConBulk(it.cnr.jada.UserContext userContext,OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException 
{
	return creaConBulk(userContext, bulk, null);
}	
/**
 * Crea l'anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Validazione della scadenza di obbligazione associata all'anticipo
 * Pre:  La scadenza legata all'anticipo passa la validazione
 * Post: Il sistema prosegue con la creazione dell'anticipo
 *
 * Nome: Aggiornamento dell'obbligazione
 * Pre:  L'utente richiede il salvataggio di un anticipo con obbligazione
 * Post: Il sistema aggiorna l' "importo associato a documento amministrativo" della scadenza associata 
 *		 all'anticipo ed aggiorna anche i saldi.
 * 		 Se l'utente ha creato delle scadenze senza associarle all'anticipo il sistema provvede comunque
 *		 all'aggiornamento dei saldi.
 *
 * 
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk per cui e' stato richiesta la creazione
 * @param	status		serve per gestire l'eccezione lanciata dall'obbligazione
 *						nel caso non ci sia disponibilita' di cassa  
 *
 * @return l'AnticipoBulk salvato
 */	

public OggettoBulk creaConBulk(it.cnr.jada.UserContext userContext,OggettoBulk bulk, OptionRequestParameter status) throws it.cnr.jada.comp.ComponentException 
{
	AnticipoBulk anticipo = (AnticipoBulk)bulk;
	
    // Salvo temporaneamente l'hash map dei saldi
    PrimaryKeyHashMap aTempDiffSaldi=new PrimaryKeyHashMap();
    if (anticipo.getDefferredSaldi() != null)
	    aTempDiffSaldi=(PrimaryKeyHashMap)anticipo.getDefferredSaldi().clone();    

    validaObbligazione(userContext,anticipo.getScadenza_obbligazione(),anticipo);
	
	aggiornaObbligazione(userContext, anticipo, status);
	anticipo.setStato_cofi(anticipo.STATO_CONTABILIZZATO);
	
	anticipo = (AnticipoBulk)super.creaConBulk(userContext, anticipo);

    // Restore dell'hash map dei saldi
    if (anticipo.getDefferredSaldi() != null)
		anticipo.getDefferredSaldi().putAll(aTempDiffSaldi);
	aggiornaCogeCoanDocAmm(userContext, anticipo);
	
    if (!verificaStatoEsercizio(userContext, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk(anticipo.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getEsercizio())))
          throw new it.cnr.jada.comp.ApplicationException("Impossibile salvare un documento per un esercizio non aperto!");

    return anticipo;
}	
/**
 * Creazione Rimborso Anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Crea rimborso
 * Pre:  Una richiesta di creazione di un rimborso completo di un anticipo è stata generata
 *       L'anticipo e' in stato pagato
 *       L'utente ha selezionato la linea di attività per cui creare l'accertamento su cui contabilizzare il rimborso
 * Post: Viene chiamata la stored procedure che 
 *       - crea un accertamento nel bilancio del CNR con voce del piano uguale
 *         a quella specificata in Configurazione CNR e linea di attività uguale a quella specificata dall'utente
 *       - crea un rimborso contabilizzato sull'accertamento precedente 
 *
 * Nome: Crea rimborso - errore 
 * Pre:  Una richiesta di creazione di un rimborso completo di un anticipo è stata generata
 *       L'utente non ha selezionato una linea di attività per cui creare l'accertamento su cui contabilizzare il rimborso
 * Post: Una segnalazione di errore viene restituita all'utente
 *
 *
 * @param	uc			lo UserContext che ha generato la richiesta
 * @param	anticipo 	l' AnticipoBulk per cui creare il rimborso
 * @return 	l'AnticipoBulk con il rimborso associato
 *
 */

public AnticipoBulk creaRimborsoCompleto(UserContext userContext, AnticipoBulk anticipo) throws ComponentException
{
	try
	{
		if ( anticipo.getCd_linea_attivita() == null )
			throw new ApplicationException( "E' necessario specificare un GAE per il rimborso");
		
		LoggableStatement cs =new LoggableStatement( getConnection( userContext ), 
			"{  call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +			
			"CNRCTB580.rimborsoCompletoAnticipo(?, ?, ?, ?, ?, ?)}",false,this.getClass());
		try
		{
			cs.setString( 1, anticipo.getCd_cds() );
			cs.setObject( 2, anticipo.getEsercizio() );		
			cs.setString( 3, anticipo.getCd_unita_organizzativa());
			cs.setObject( 4, anticipo.getPg_anticipo());
			cs.setObject( 5, CNRUserContext.getEsercizio(userContext));
			cs.setString( 6, userContext.getUser());						
			cs.executeQuery();
			return anticipo;
		}
		catch ( SQLException e )
		{
			throw handleException(e);
		}
		finally
		{
			cs.close();
		}	
	}
	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 )	;
	}	
}
/**
 * Cancellazione logica anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: cancellazione logica anticipo
 * Pre:  L'utente ha selezionato elimina anticipo
 * Post: Il sistema cancella logicamente l' anticipo e se l'anticipo risulta
 *		 contabilizzato in Coge/Coan riporto i relativi stati ad "R"
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l' AnticipoBulk da cancellare
 *
 */
private void deleteLogically(UserContext userContext,AnticipoBulk anticipo) throws ComponentException 
{
	try
	{
		anticipo.setToBeUpdated();

		// ************
        //	Se l'esercizio di scrivania e' diverso da quello solare
        //	inizializzo la data di cancellazione al 31/12/esercizio anticipo		
        java.sql.Timestamp tsOdierno = ((AnticipoHome) getHome(userContext, anticipo)).getServerDate();
        GregorianCalendar tsOdiernoGregorian = (GregorianCalendar) anticipo.getGregorianCalendar(tsOdierno);
        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
        
        if(tsOdiernoGregorian.get(GregorianCalendar.YEAR) != it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue())
	        anticipo.setDt_cancellazione(new java.sql.Timestamp(sdf.parse("31/12/"+anticipo.getEsercizio().intValue()).getTime()));
		else
		{
			String currentDate = Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.DAY_OF_MONTH)) + "/" + 
								Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.MONTH)) + "/" + 
								Integer.toString(tsOdiernoGregorian.get(GregorianCalendar.YEAR));
	        anticipo.setDt_cancellazione(new java.sql.Timestamp(sdf.parse(currentDate).getTime()));
		}
		// ************

		anticipo.setStato_cofi(AnticipoBulk.STATO_ANNULLATO);

		if(AnticipoBulk.STATO_CONTABILIZZATO_COAN.equals(anticipo.getStato_coan()))
			anticipo.setStato_coan(AnticipoBulk.STATO_RICONTABILIZZARE_COAN);
		if(AnticipoBulk.STATO_CONTABILIZZATO_COGE.equals(anticipo.getStato_coge()))
			anticipo.setStato_coge(AnticipoBulk.STATO_RICONTABILIZZARE_COGE);
		
		updateBulk(userContext, anticipo);
	}
	catch (Throwable e) 
	{
		throw handleException(e);
	} 	
}
/**
 * Cancellazione anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: 	cancellazione anticipo
 * Pre:  	L'utente vuole eliminare un anticipo
 * Post: 	Il sistema scollega la scadenza di obbligazione dell'anticipo azzerandone
 *			l'importo associato a documento amministrativo
 *
 * Nome: 	cancellazione fisica anticipo
 * Pre:  	L'utente vuole eliminare un anticipo non associato a mandato, non contabilizzato in Coge/Coan e
 *			la cui obbligazione non e' stata riportata
 * Post: 	Il sistema consente l'eliminazione fisica dell'anticipo
 *
 * Nome: 	cancellazione logica anticipo
 * Pre:  	L'utente vuole eliminare un anticipo o associato a mandato o contabilizzato in Coge/Coan o la cui
 *			obbligazione e' stata riportata
 * Post: 	Il sistema consente l'eliminazione logica dell'anticipo
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l' AnticipoBulk da cancellare
 *
 */
 
public void eliminaConBulk (UserContext aUC,OggettoBulk bulk) throws ComponentException 
{
	AnticipoBulk anticipo = (AnticipoBulk)bulk;

	try 
	{
	
		// Controllo dello stato dell'es COEP prec. per compensi riportati Da ese. prec. (isRiportataInScrivania())
		validateEsercizioCOEP(aUC, anticipo);
		
	    // Salvo temporaneamente l'hash map dei saldi
	    PrimaryKeyHashMap aTempDiffSaldi=new PrimaryKeyHashMap();
	    if (anticipo.getDefferredSaldi() != null)
		    aTempDiffSaldi=(PrimaryKeyHashMap)anticipo.getDefferredSaldi().clone();    

		//	Scollego la scadenza di obbligazione dell'anticipo
		Obbligazione_scadenzarioBulk scadenza = anticipo.getScadenza_obbligazione();
	    if(scadenza !=null)
	    {
	        scadenza.setIm_associato_doc_amm(new BigDecimal(0));
	        updateImportoAssociatoDocAmm(aUC, scadenza);
	    }

	    //	Cancello logicamente/fisicamente l'anticipo
		if(	anticipo.STATO_INIZIALE_MANREV.equals(anticipo.getTi_associato_manrev()) &&
			anticipo.STATO_INIZIALE_COGE.equals(anticipo.getStato_coge()) &&
			anticipo.STATO_INIZIALE_COAN.equals(anticipo.getStato_coan()) &&
			!anticipo.isRiportata())
				super.eliminaConBulk(aUC, anticipo);
		else		
			deleteLogically(aUC, anticipo);

	    // Restore dell'hash map dei saldi
	    if (anticipo.getDefferredSaldi() != null)
			anticipo.getDefferredSaldi().putAll(aTempDiffSaldi);
		
		aggiornaCogeCoanDocAmm(aUC, anticipo);

		if (!verificaStatoEsercizio(aUC, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk( anticipo.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext)aUC).getEsercizio())))
			throw new it.cnr.jada.comp.ApplicationException("Impossibile eliminare un documento per un esercizio non aperto!");						
	}
	catch (Throwable e) 
	{
		throw handleException(e);
	} 	
}
/**
 * Carica i dati relativi al cambio
 *
 * Pre-post-conditions:
 *
 * Nome: Carica cambio
 * Pre:  E' stata generata una richiesta di caricamento di un cambio associato ad una certa divisa e valido 
 *       in una certa data 
 * Post: Il sistema restituisce il cambio valido per la divisa data
 *
 * @param	uc	lo UserContext che ha generato la richiesta
 * @param	divisa	la DivisaBulk per cui ricercare il cambio
 * @param	dataCambio	la data per cui il cambio deve essere valido
 *
 * @return il CambioBulk trovato oppure null se non esiste nessun cambio valido per quella divisa in quella data
 */	

private CambioBulk findCambio(UserContext uc, DivisaBulk divisa, java.sql.Timestamp dataCambio) throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	CambioHome cambioHome = (CambioHome)getHome(uc, CambioBulk.class);
	CambioBulk aCambio = cambioHome.getCambio(divisa, dataCambio);

	if(aCambio == null)
		return null;

	return aCambio;
}
/**
 * Carica i dati relativi alla divisa di default
 *
 * Pre-post-conditions:
 *
 * Nome: Carica divisa
 * Pre:  E' stata generata una richiesta di caricamento della divisa di default (EURO)
 * Post: Il sistema restituisce la divisa di default
 *
 * @param	uc	lo UserContext che ha generato la richiesta
 *
 * @return la DivisaBulk di default oppure null se non esiste nessuna divisa di default
 */	

private DivisaBulk findDivisaDefault(UserContext aUC) throws it.cnr.jada.comp.ComponentException, javax.ejb.EJBException, it.cnr.jada.persistency.PersistencyException, RemoteException
{
	DivisaHome divisaHome = (DivisaHome)getHome(aUC, DivisaBulk.class);
	DivisaBulk divisaDefault = divisaHome.getDivisaDefault(aUC);
	
	return divisaDefault;
}
/**
 * Carica i dati relativi alle coordinate bancarie 
 *
 * Pre-post-conditions:
 *
 * Nome: Carica banche
 * Pre:  E' stata generata una richiesta di caricamento delle coordinate bancarie relative al terzo dell'anticipo
 * Post: Il sistema restituisce la lista delle coordinate bancarie relative al terzo dell'anticipo
 *
 * @param	uc			lo UserContext che ha generato la richiesta
 * @param	anticipo 	l' AnticipoBulk da cui ricavare il terzo per cui selezionare le coordinate bancarie
 *
 * @return la collezione di istanze di tipo BancaBulk 
 */	

public java.util.Collection findListabanche(UserContext aUC, AnticipoBulk anticipo) throws ComponentException,it.cnr.jada.persistency.PersistencyException 
{
	if(anticipo.getV_terzo() == null) 
	 	return null;

	return getHome(aUC, BancaBulk.class).fetchAll(selectBancaByClause(aUC, anticipo, null, null));
}
/**
 * Carica i dati relativi alle modalità di pagamento
 *
 * Pre-post-conditions:
 *
 * Nome: Carica modalita
 * Pre:  E' stata generata una richiesta di caricamento delle modalità di pagamento relative al terzo dell'anticipo
 * Post: Il sistema restituisce la lista delle modalità di pagamento relative al terzo dell'anticipo
 *
 * @param	uc		lo UserContext che ha generato la richiesta
 * @param	bulk 	l' AnticipoBulk da cui ricavare il terzo per cui selezionare le modalità di pagamento
 *
 * @return la collezione di istanze di tipo Rif_modalita_pagamentoBulk 
 */	

public java.util.Collection findModalita(UserContext userContext, OggettoBulk bulk) throws ComponentException 
{
	try 
	{ 
		AnticipoBulk anticipo = (AnticipoBulk) bulk;
		if((anticipo.getTerzo() == null))
			return null;
		TerzoHome terzoHome = (TerzoHome)getHome(userContext,TerzoBulk.class);
		
		return terzoHome.findRif_modalita_pagamento(anticipo.getTerzo());
	}
	catch (it.cnr.jada.persistency.PersistencyException ex)
	{
		throw handleException(bulk, ex);
	}
	catch (it.cnr.jada.persistency.IntrospectionException ex)
	{
		throw handleException(bulk, ex);
	}
}
/**
 * Carica i dati relativi ai termini di pagamento
 *
 * Pre-post-conditions:
 *
 * Nome: Carica termini
 * Pre:  E' stata generata una richiesta di caricamento dei termini di pagamento relativi al terzo dell'anticipo
 * Post: Il sistema restituisce la lista dei termini di pagamento relativi al terzo dell'anticipo
 *
 * @param	uc		lo UserContext che ha generato la richiesta
 * @param	bulk 	l' AnticipoBulk da cui ricavare il terzo per cui selezionare i termini di pagamento
 *
 * @return la collezione di istanze di tipo Rif_termini_pagamentoBulk 
 */	

public java.util.Collection findTermini(UserContext userContext, OggettoBulk bulk) throws ComponentException
{
	try
	{ 
		AnticipoBulk anticipo = (AnticipoBulk) bulk;
		if((anticipo.getTerzo() == null))
			return null;
		TerzoHome terzoHome = (TerzoHome)getHome(userContext,TerzoBulk.class);
		
		return terzoHome.findRif_termini_pagamento(anticipo.getTerzo());
	}
	catch (it.cnr.jada.persistency.PersistencyException ex)
	{
		throw handleException(bulk, ex);
	}
	catch (it.cnr.jada.persistency.IntrospectionException ex)
	{
		throw handleException(bulk, ex);
	}

}
/**
 * Cambio data data registrazione
 *
 * Pre-post-conditions:
 *
 * Nome: cambio data - ok 
 * Pre:  L'utente ha modificato la data di registrazione dell'anticipo
 *       La nuova data supera la validazione ( metodo 'validaDataRegistrazione')
 * Post: Il sistema inizializza la divisa di default e il cambio relativo a
 *		 tale divisa e valido alla data di registrazione
 *
 * Nome: cambio data - errore
 * Pre:  L'utente ha modificato la data di registrazione dell'anticipo
 *       La nuova data non supera la validazione ( metodo 'validaDataRegistrazione')
 * Post: Il sistema segnala all'utente che la nuova data non ha superato la validazione
 *
 * @param	aUC			lo UserContext che ha generato la richiesta
 * @param	anticipo 	l' AnticipoBulk per cui gestire la nuova data di registrazioen
 *
 * @return l'AnticipoBulk con caricato il cambio relativo alla divisa per la nuova data di registrazione
*/
public AnticipoBulk gestisciCambioDataRegistrazione(UserContext aUC, AnticipoBulk anticipo) throws ComponentException, it.cnr.jada.persistency.PersistencyException, java.sql.SQLException
{
	// Verifico l'eleggibilita della data di registrazione
	validaDataRegistrazione(aUC, anticipo );

	try
	{
		if(anticipo.getCd_divisa() == null)
			anticipo.setDivisa(findDivisaDefault(aUC));
	}
	catch ( RemoteException e )
	{
		throw handleException(anticipo, e);
	}
	catch ( javax.ejb.EJBException e )
	{
		throw handleException(anticipo, e);
	}
		
	// Ricerco il cambio alla data
	CambioBulk cambio = findCambio(aUC, anticipo.getDivisa(), anticipo.getDt_registrazione());
	if(cambio != null)
		anticipo.setCambio(cambio.getCambio());
		
	return anticipo;
}
/**
 * Pre:  L'esercizio di scrivania è antecedente a quello corrente
 * Post: La data restituita viene inizializzata al 31/12/esercizio scrivania
 *
 * Pre:  L'esercizio di scrivania NON è antecedente a quello corrente
 * Post: La data restituita viene inizializzata alla data odierna
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	L' AnticipoBulk la cui data deve essere inizializzata.
 *
 * @return 	La data correttamente inizializzata
*/

private Timestamp getDataPerInizializzazioni(UserContext userContext,OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException, java.text.ParseException
{
	AnticipoBulk anticipo = (AnticipoBulk) bulk;

	java.sql.Timestamp tsOdierno = ((AnticipoHome) getHome(userContext, anticipo)).getServerDate();
   	java.util.GregorianCalendar tsOdiernoGregorian = anticipo.getGregorianCalendar(tsOdierno);

	if (tsOdiernoGregorian.get(java.util.GregorianCalendar.YEAR) > anticipo.getEsercizio().intValue()) 
	{
		java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
       	return(new java.sql.Timestamp(sdf.parse("31/12/"+anticipo.getEsercizio().intValue()).getTime()));
    } 
    return tsOdierno;
}
private it.cnr.jada.bulk.PrimaryKeyHashtable getDocumentiContabiliNonTemporanei(
	UserContext userContext, 
	java.util.Enumeration scadenze) throws ComponentException {

	it.cnr.jada.bulk.PrimaryKeyHashtable documentiContabiliNonTemporanei = new it.cnr.jada.bulk.PrimaryKeyHashtable();
	if (scadenze != null)
		while (scadenze.hasMoreElements()) {
			IScadenzaDocumentoContabileBulk scadenza = (IScadenzaDocumentoContabileBulk)scadenze.nextElement();
			if (!scadenza.getFather().isTemporaneo()) {
				if (!documentiContabiliNonTemporanei.containsKey(scadenza.getFather())) {
					Vector allInstances = new java.util.Vector();
					allInstances.addElement(scadenza.getFather());
					documentiContabiliNonTemporanei.put(scadenza.getFather(), allInstances);
				} else {
					((Vector)documentiContabiliNonTemporanei.get(scadenza.getFather())).add(scadenza.getFather());
				}
			}
		}
	return documentiContabiliNonTemporanei;
}
/**
 * Pre:	 Il sistema carica in modifica un anticipo con obbligazione riportata all'esercizio successivo
 * Post: Viene restituita la stringa 'R'
 *
 * Pre:	 Il sistema carica in modifica un anticipo con obbligazione non riportata all'esercizio successivo
 * Post: Viene restituita la stringa 'N'
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	L' AnticipoBulk caricato in modifica.
 *
 * @return 	Lo stato del documento contabile associato all'anticipo
*/
private String getStatoRiporto(UserContext context, AnticipoBulk anticipo)throws ComponentException 
{
	try 
	{
		RiportoDocAmmComponentSession session = (RiportoDocAmmComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCAMM00_EJB_RiportoDocAmmComponentSession",RiportoDocAmmComponentSession.class);
		return session.getStatoRiporto(context, anticipo);
	} 
	catch (Throwable t) 
	{
		throw handleException(anticipo, t);
	}
}
/**
 * Pre:	 Il sistema carica in modifica un anticipo con una obbligazione riportata all'esercizio di scrivania
 * Post: Viene restituita la stringa 'R'
 *
 * Pre:	 Il sistema carica in modifica un anticipo con nessuna obbligazione riportata all'esercizio di scrivania
 * Post: Viene restituita la stringa 'N'
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	L' AnticipoBulk caricato in modifica.
 *
 * @return 	Lo stato del documento contabile associato all'anticipo
*/
private String getStatoRiportoInScrivania(UserContext context, AnticipoBulk anticipo)throws ComponentException 
{
	try 
	{
		RiportoDocAmmComponentSession session = (RiportoDocAmmComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRDOCAMM00_EJB_RiportoDocAmmComponentSession",RiportoDocAmmComponentSession.class);
		return session.getStatoRiportoInScrivania(context, anticipo);
	} 
	catch (Throwable t) 
	{
		throw handleException(anticipo, t);
	}
}
/**
 * Pre:	 Il sistema carica in modifica unrimborso con accertamento riportato all'esercizio successivo
 * Post: La procedura restitusce la stringa 'R'
 *
 * Pre:	 Il sistema carica in modifica un rimborso con accertamento non riportato all'esercizio successivo
 * Post: La procedura restitusce la stringa 'N'
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	il RimborsoBulk caricato in modifica.
 *
 * @return 	Lo stato del documento contabile associato al rimborso
*/

private String getStatoRiportoRimborso(UserContext context, RimborsoBulk rimborso)throws ComponentException 
{
	LoggableStatement cs = null;
	String status = null;
	
	try 
	{
		try	
		{
			cs = new LoggableStatement(getConnection(context), 
					"{ ? = call " +
						it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
					"CNRCTB105.getStatoRiportato(?, ?, ?, ?, ?, ?) }",false,this.getClass());
			
			cs.registerOutParameter( 1, java.sql.Types.VARCHAR);
			cs.setString(2, rimborso.getCd_cds());
			cs.setString(3, rimborso.getCd_unita_organizzativa());
			cs.setInt(4, rimborso.getEsercizio().intValue());
			cs.setLong(5, rimborso.getPg_rimborso().longValue());
			cs.setString(6, Numerazione_doc_ammBulk.TIPO_RIMBORSO);
			cs.setInt(7, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context).intValue());
			
			cs.executeQuery();
			status = new String(cs.getString(1));
		} catch (Throwable e) {
			throw handleException(e);
		} finally {
			if (cs != null) cs.close();
		}
	} 
	catch (java.sql.SQLException ex) 
	{
		throw handleException(ex);
	}
	return status;		
}
/**
 * Pre:	 Il sistema carica in modifica unrimborso con accertamento riportato all'esercizio successivo
 * Post: La procedura restitusce la stringa 'R'
 *
 * Pre:	 Il sistema carica in modifica un rimborso con accertamento non riportato all'esercizio successivo
 * Post: La procedura restitusce la stringa 'N'
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	il RimborsoBulk caricato in modifica.
 *
 * @return 	Lo stato del documento contabile associato al rimborso
*/

private String getStatoRiportoRimborsoInScrivania(UserContext context, RimborsoBulk rimborso)throws ComponentException 
{
	LoggableStatement cs = null;
	String status = null;
	
	try 
	{
		try	
		{
			cs = new LoggableStatement(getConnection(context), 
					"{ ? = call " +
						it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
					"CNRCTB105.getStatoRiportatoInScrivania(?, ?, ?, ?, ?, ?) }",false,this.getClass());
			
			cs.registerOutParameter( 1, java.sql.Types.VARCHAR);
			cs.setString(2, rimborso.getCd_cds());
			cs.setString(3, rimborso.getCd_unita_organizzativa());
			cs.setInt(4, rimborso.getEsercizio().intValue());
			cs.setLong(5, rimborso.getPg_rimborso().longValue());
			cs.setString(6, Numerazione_doc_ammBulk.TIPO_RIMBORSO);
			cs.setInt(7, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context).intValue());
			
			cs.executeQuery();
			status = new String(cs.getString(1));
		} catch (Throwable e) {
			throw handleException(e);
		} finally {
			if (cs != null) cs.close();
		}
	} 
	catch (java.sql.SQLException ex) 
	{
		throw handleException(ex);
	}
	return status;		
}
/**
 * Tipo di Cancellazione
 *
 * Pre-post-conditions:
 *
 * Nome: Tipo di Cancellazione
 * Pre:  L'utente ha richiesto la cancellazione dell'anticipo
 * Post: Il sistema richiama la stored procedure che stabilisce se la cancellazione
 *       dell'anticipo deve essere logica o fisica
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	missione	l' AnticipoBulk da cancellare
 *
 * @return  il tipo di cancellazione (NULL = non cancellabile; F = cancellazione
 *			fisica; L = cancellazione logica)
 */	

private Character getTipoCancellazione (UserContext aUC, OggettoBulk bulk) throws ComponentException 
{
	AnticipoBulk anticipo = (AnticipoBulk)bulk;
	Character rc = null;
	LoggableStatement cs = null ;	

	try 
	{ 
		try
		{
			cs = new LoggableStatement(getConnection(aUC), "{call 	"+it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()+"CNRCTB505.eseguiDelMissione(?,?,?,?,?)}",false,this.getClass());

			cs.setObject( 1, anticipo.getCd_cds()                 );		
			cs.setObject( 2, anticipo.getCd_unita_organizzativa() );		
			cs.setObject( 3, anticipo.getEsercizio()              );
			cs.setObject( 4, anticipo.getPg_anticipo()            );
			cs.setNull( 5, java.sql.Types.CHAR);

	        cs.registerOutParameter(5,java.sql.Types.CHAR);

	        cs.executeQuery();
	        rc = (Character)cs.getObject(5);
		}
		finally 
		{
		    cs.close();
		}		
		return rc;
	} 
	catch (java.sql.SQLException e)
	{
		throw handleException(anticipo, e);
	}
}
/**
  *  Inizializzazione dell'anticipo per la creazione
  *
  *  Esercizio non aperto
  *    PreCondition: L'esercizio di scrivania e' in uno stato diverso da APERTO
  *    PostCondition: Il metodo utilizza un Throw Exception per comunicare che non e' possibile creare missioni.
  *
  *  Esercizio aperto
  *    PreCondition: L'esercizio di scrivania e' in stato APERTO
  *    PostCondition: e' possibile procedere con la creazione dell' anticipo
  * 
  *	 Inizializzazione data registrazione e data competenza coge da/a
  *    PreCondition: Inizializzazione della data registrazione e della data competenza coge da/a
  *    PostCondition: Il sistema inizializza la data registrazione e la data competenza coge da/a
  *
  * @param aUC 	lo user context 
  * @param bulk l'istanza di  AnticipoBulk che si sta creando
  * @return 	l'istanza di  AnticipoBulk 
  *
**/
public OggettoBulk inizializzaBulkPerInserimento (UserContext aUC,OggettoBulk bulk) throws ComponentException
{
	AnticipoBulk anticipo = (AnticipoBulk)  bulk;	
	try
	{
        //	Verifico che l'esercizio dell'anticipo (scrivania) sia aperto	    
		if (!verificaStatoEsercizio(aUC, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk( anticipo.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext)aUC).getEsercizio())))
            throw new it.cnr.jada.comp.ApplicationException("Impossibile inserire un anticipo per un esercizio non aperto!");

		//	Inizializzazione e controlli della data di registrazione	
		anticipo.setDt_registrazione(getDataPerInizializzazioni(aUC, bulk));
		anticipo.setDt_a_competenza_coge(anticipo.getDt_registrazione());
		anticipo.setDt_da_competenza_coge(anticipo.getDt_registrazione());
		gestisciCambioDataRegistrazione(aUC, anticipo);
		
		return super.inizializzaBulkPerInserimento(aUC, anticipo );
	}
	catch (Throwable e) 
	{
		throw handleException(e);
	} 	
}
/**
 * Inizializzazione dell'anticipo per la modifica
 *
 * Pre-post-conditions:
 *
 * Nome: esercizio non valorizzato
 * Pre:  L'anticipo da caricare non ha valorizzato l'esercizio
 * Post: Il metodo utilizza un Throw Exception per comunicare che non e' possibile procedere.
 * 
 * Nome: esercizio anticipo maggiore di quello di scrivania
 * Pre:  L'utente ha selezionato un anticipo con esercizio maggiore a quello di scrivania
 * Post: Il metodo utilizza un Throw Exception per comunicare che non e' possibile procedere.
 *
 * Nome: inizializzazione anticipo
 * Pre:  inizializzazione anticipo per modifica
 * Post: Il sistema inizializza l'anticipo con i dati relativi al terzo, all'eventuale rimborso e missione collegata
 *		 e verifica se il documento contabile associato all'anticipo e' stato riportato
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	l' AnticipoBulk da inizializzare
 *
 * @return l'AnticipoBulk inizializzato
*/
public OggettoBulk inizializzaBulkPerModifica(UserContext userContext,OggettoBulk bulk) throws ComponentException
{
	if(bulk == null)
		return null;

	AnticipoBulk anticipo = (AnticipoBulk) bulk;		
	try
	{
		if (anticipo.getEsercizio() == null)
		throw new it.cnr.jada.comp.ApplicationException("L'esercizio del documento non è valorizzato! Impossibile proseguire.");
			
		if (anticipo.getEsercizio().intValue() > it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue())
			throw new it.cnr.jada.comp.ApplicationException("Il documento deve appartenere o all'esercizio di scrivania o ad esercizi precedenti per essere aperto in modifica!");
		
		anticipo = (AnticipoBulk) super.inizializzaBulkPerModifica(userContext, anticipo);
		
		caricaTerzoInModificaAnticipo(userContext, anticipo);

		// 	Serve nella lettura delle scadenze eleggibili (per poter riselezionare la scadenza 
		//	associata all' anticipo che si sta modificando)		
		if(anticipo.getScadenza_obbligazione() != null)
		{
			anticipo.setScadenza_obbligazioneClone(new Obbligazione_scadenzarioBulk());
			anticipo.getScadenza_obbligazioneClone().setEsercizio_originale(anticipo.getEsercizio_ori_obbligazione());
			anticipo.getScadenza_obbligazioneClone().setPg_obbligazione(anticipo.getPg_obbligazione());
			anticipo.getScadenza_obbligazioneClone().setPg_obbligazione_scadenzario(anticipo.getPg_obbligazione_scadenzario());
			anticipo.getScadenza_obbligazioneClone().setEsercizio(anticipo.getScadenza_obbligazione().getEsercizio());
			anticipo.getScadenza_obbligazioneClone().setCd_cds(anticipo.getScadenza_obbligazione().getCd_cds());
		}

		//	In base allo stato di riporto dell'obbligazione dell'anticipo
		//	inizializzo la variabile 'riportata' dell'anticipo
		anticipo.setRiportata(getStatoRiporto(userContext, anticipo));

		/**
		  * Gennaro Borriello - (02/11/2004 15.04.39)
		  *	Aggiunta gestione dell Stato Riportato all'esercizio di scrivania.
		 */
		 anticipo.setRiportataInScrivania(getStatoRiportoInScrivania(userContext, anticipo));

		anticipo = inizializzaRimborso( userContext, anticipo );

		if(anticipo.isAnticipoConMissione())
			loadMissione(userContext, anticipo);

	} 
	catch (Throwable e) 
	{
		throw handleException(e);
	} 		
	
	return anticipo;
}
/**
 * Inizializzazione rimborso
 *
 * Pre-post-conditions:
 *
 * Nome: Inizializzazione rimborso
 * Pre:  L'utente ha selezionato un anticipo per modificarlo.  L'anticipo e' stato rimborsato
 * Post: Il sistema verifica se il documento contabile associato al rimborso e' stato riportato o meno e
 *		 restituisce l'anticipo con impostati tutti i dati relativi al rimborso
 *
 * @param	aUC		lo UserContext che ha generato la richiesta
 * @param	bulk 	l' AnticipoBulk da inizializzare
 *
 * @return l'AnticipoBulk inizializzato
*/
private AnticipoBulk inizializzaRimborso(UserContext userContext,AnticipoBulk anticipo) throws ComponentException
{
	try
	{
		SQLBuilder sql = getHome( userContext, RimborsoBulk.class ).createSQLBuilder();
		sql.addClause( "AND", "esercizio_anticipo", sql.EQUALS, anticipo.getEsercizio());
		sql.addClause( "AND", "cd_cds_anticipo", sql.EQUALS, anticipo.getCd_cds());
		sql.addClause( "AND", "cd_uo_anticipo", sql.EQUALS, anticipo.getCd_unita_organizzativa());
		sql.addClause( "AND", "pg_anticipo", sql.EQUALS, anticipo.getPg_anticipo());
		List result = getHome( userContext, RimborsoBulk.class ).fetchAll( sql );
		if ( result.size() > 1 )
			throw new ApplicationException("Attenzione esiste piu' di un rimborso associato all'anticipo");
		if ( result.size() == 1 )
			anticipo.setRimborso( (RimborsoBulk)result.get(0));

		//	In base allo stato di riporto dell'obbligazione dell'rimborso
		//	inizializzo la variabile 'riportata' del rimborso
		if(anticipo.hasRimborso()){
			anticipo.getRimborso().setRiportata(getStatoRiportoRimborso(userContext, anticipo.getRimborso()));

			/**
			  * Gennaro Borriello - (02/11/2004 15.04.39)
			  *	Aggiunta gestione dell Stato Riportato all'esercizio di scrivania.
			 */
			anticipo.getRimborso().setRiportataInScrivania(getStatoRiportoRimborsoInScrivania(userContext, anticipo.getRimborso()));
		}
			
			return anticipo;	
	} 
	catch (Throwable e) 
	{
		throw handleException(e);
	} 		
}
/**
  * Verifica annullamento anticipo
  *
  * Pre-post-conditions
  *
  *	Nome: Verifica stato_cofi anticipo
  *		Pre:  Viene richiesto se l'anticipo e' annullato o meno
  *		Post: Il sistema esegue una query per verificare lo stato cofi dell'anticipo.
  *			  stato_cofi = A --> il metodo ritorna  (anticipo annullato)
  *			  stato_cofi <> A --> il metodo ritorna  (anticipo non annullato)
  *
  * @param userContext 	lo UserContext che ha generato la richiesta
  * @param anticipo 	L'anticipo da controllare  
  * @return vero se l'anticipo è anullato falso altrimenti
  *
**/
public boolean isAnticipoAnnullato(UserContext userContext, AnticipoBulk anticipo) throws ComponentException
{
	try
	{
		java.sql.ResultSet rs;
		String stato = null;
		String str = "SELECT STATO_COFI FROM " + 
					it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + 			
					"ANTICIPO " +
					"WHERE " +
					"CD_CDS = ? AND " +
					"CD_UNITA_ORGANIZZATIVA = ? AND " +
					"ESERCIZIO = ? AND " +
					"PG_ANTICIPO = ?";

		LoggableStatement ps = new LoggableStatement(getConnection(userContext),str,true,this.getClass());
		try
		{	
			ps.setObject( 1, anticipo.getCd_cds());
			ps.setObject( 2, anticipo.getCd_unita_organizzativa());
			ps.setObject( 3, anticipo.getEsercizio());
			ps.setObject( 4, anticipo.getPg_anticipo());

			rs = ps.executeQuery();
			try
			{
				if (rs.next() )
					stato = rs.getString( 1 );
			}
			finally
			{
				try{rs.close();}catch( java.sql.SQLException e ){};
			}
		}
		finally
		{
			try{ps.close();}catch( java.sql.SQLException e ){};
		}

		return(anticipo.STATO_ANNULLATO.equals(stato));

	}
	catch(java.sql.SQLException ex)
	{
		throw handleException(anticipo, ex);
	}
}
/**
 * Carica missione
 *
 * Pre-post-conditions:
 *
 * Nome: Carica missione
 * Pre:  Il sistema inizializza un anticipo legato a missione per la modifica
 * Post: Il sistema esegue una query per caricare la missione
 *
 * Nome: Carica missione
 * Pre:  L'anticipo risulta legato a missione ma il sistema non trova la missione associata
 * Post: Il metodo utilizza un Throw Exception per comunicare che non e' possibile procedere.
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	anticipo	l' AnticipoBulk per cui caricare la missione
 *
 * @return  l' AnticipoBulk con la missione caricata
 */	

private AnticipoBulk loadMissione(UserContext userContext, AnticipoBulk anticipo) throws ComponentException 
{
	try 
	{
		MissioneHome missioneHome = (MissioneHome)getHome( userContext, MissioneBulk.class );
		MissioneBulk missione = missioneHome.loadMissione(userContext,anticipo);
		anticipo.setMissione(missione);	
			
		if(missione == null)
			throw new ApplicationException("Impossibile trovare la missione associata all' anticipo !");
	}
	catch (Throwable e) 
	{
		throw handleException(e);
	} 	
	return anticipo;
}
/**
 * Modifica l'anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Modifica anticipo 
 * Pre:  L'utente ha completato le modifiche dei dati dell'anticipo e ne chiede il salvataggio
 * Post: Il sistema rende persistente le modifiche dell'anticipo
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk per cui e' stato richiesta la modifica
 *
 * @return l'AnticipoBulk salvato
 */	

public OggettoBulk modificaConBulk(it.cnr.jada.UserContext userContext,OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException 
{
	return modificaConBulk(userContext, bulk, null);
}	
/**
 * Modifica l'anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Validazione della scadenza di obbligazione associata all'anticipo
 * Pre:  La scadenza legata all'anticipo passa la validazione
 * Post: Il sistema prosegue con la modifica dell'anticipo
 *
 * Nome: Modifica anticipo con obbligazione appena creata
 * Pre:  L'obbligazione associata all'anticipo modificato e' appena stata creata
 * Post: Il sistema aggiorna l'obbligazione associata all'anticipo e i suoi saldi
 *
 * Nome: Modifica anticipo con obbligazione gia' esistente
 * Pre:  L'obbligazione associata all'anticipo modificato gia' esisteva
 * Post: Il sistema aggiorna l'importo associato a documento amministrativo della relativa scadenza
 *
 * Nome: Modifica anticipo
 * Pre:  E' stata tolta l'associazione dell'anticipo con l'obbligazione originaria
 * Post: Il sistema aggiorna tale obbligazione azzerando l'importo associato a documento amministrativo 
 *		 della relativa scadenza
 *
 * Nome: Modifica anticipo
 * Pre:  In fase di modifica dell'anticipo l'utente ha creato una obbligazione che poi non ha associato all'anticipo
 * Post: Il sistema rende persistente tale obbligazione ed aggiorna i saldi
 *
 * Nome: Modifica anticipo
 * Pre:  Gli aggiornamenti delle obbligazioni e scadenze sono andati a buon fine
 * Post: Il sistema rende persistente le modifiche dell'anticipo
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk per cui e' stato richiesta la modifica
 * @param	status		serve per gestire l'eccezione lanciata dall'obbligazione
 *						nel caso non ci sia disponibilita' di cassa
 *
 * @return l'AnticipoBulk salvato
 */	

public OggettoBulk modificaConBulk(it.cnr.jada.UserContext userContext,OggettoBulk bulk, OptionRequestParameter status) throws it.cnr.jada.comp.ComponentException 
{
	AnticipoBulk anticipo = (AnticipoBulk)bulk;
	
    // Salvo temporaneamente l'hash map dei saldi
    PrimaryKeyHashMap aTempDiffSaldi=new PrimaryKeyHashMap();
    aTempDiffSaldi=(PrimaryKeyHashMap)anticipo.getDefferredSaldi().clone();    

    validaObbligazione(userContext,anticipo.getScadenza_obbligazione(),anticipo);	
	aggiornaObbligazione(userContext, anticipo, status);
	
	anticipo = (AnticipoBulk)super.modificaConBulk(userContext, anticipo);

    // Restore dell'hash map dei saldi
    if (anticipo.getDefferredSaldi() != null)
     anticipo.getDefferredSaldi().putAll(aTempDiffSaldi);

    //Aggiornamenti degli stati COGE e COAN
	boolean aggiornaStatoCoge = false;
	try {
		AnticipoBulk anticipoDB = (AnticipoBulk)getTempHome(userContext, AnticipoBulk.class).findByPrimaryKey(anticipo);
		if (!Utility.equalsNull(anticipo.getStato_pagamento_fondo_eco(),anticipoDB.getStato_pagamento_fondo_eco())||
			!Utility.equalsNull(anticipo.getCd_terzo(),anticipoDB.getCd_terzo())||
			!Utility.equalsNull(anticipo.getDt_da_competenza_coge(),anticipoDB.getDt_da_competenza_coge())||
			!Utility.equalsNull(anticipo.getDt_a_competenza_coge(),anticipoDB.getDt_a_competenza_coge())||
			!Utility.equalsNull(anticipo.getIm_anticipo_divisa(),anticipoDB.getIm_anticipo_divisa().setScale(2))||
			!Utility.equalsNull(anticipo.getIm_anticipo(),anticipoDB.getIm_anticipo().setScale(2))||
			!Utility.equalsBulkNull(anticipo.getScadenza_obbligazione(),anticipoDB.getScadenza_obbligazione())
		)
			aggiornaStatoCoge = true;
	} catch (PersistencyException e) {
		throw new ComponentException(e);
	} 
	if (aggiornaStatoCoge){
		if (AnticipoBulk.STATO_CONTABILIZZATO_COAN.equalsIgnoreCase(anticipo.getStato_coan())) {
			anticipo.setStato_coan(AnticipoBulk.STATO_RICONTABILIZZARE_COAN);
			anticipo.setToBeUpdated();
		}
		if (AnticipoBulk.STATO_CONTABILIZZATO_COGE.equalsIgnoreCase(anticipo.getStato_coge())) {
			anticipo.setStato_coge(AnticipoBulk.STATO_RICONTABILIZZARE_COGE);
			anticipo.setToBeUpdated();
		}
	}
	//	Aggiornamenti degli stati COGE e COAN sui rimborsi
	boolean aggiornaStatoCogeRimborsi = false;
	if (anticipo.getRimborso()!= null){
		RimborsoBulk rimborso = anticipo.getRimborso();
		try {
			RimborsoBulk rimborsoDB = (RimborsoBulk)getTempHome(userContext, RimborsoBulk.class).findByPrimaryKey(rimborso);
			if (!Utility.equalsNull(rimborso.getIm_rimborso(),rimborso.getIm_rimborso())||
				!Utility.equalsNull(rimborso.getCd_terzo(),rimborsoDB.getCd_terzo())||
				!Utility.equalsNull(rimborso.getDt_da_competenza_coge(),rimborsoDB.getDt_da_competenza_coge())||
				!Utility.equalsNull(rimborso.getDt_a_competenza_coge(),rimborsoDB.getDt_a_competenza_coge())||
				!Utility.equalsNull(rimborso.getEsercizio_accertamento(),rimborsoDB.getEsercizio_accertamento())||
				!Utility.equalsNull(rimborso.getCd_cds_accertamento(),rimborsoDB.getCd_cds_accertamento())||
				!Utility.equalsNull(rimborso.getPg_accertamento(),rimborsoDB.getPg_accertamento())||
				!Utility.equalsNull(rimborso.getPg_accertamento_scadenzario(),rimborsoDB.getPg_accertamento_scadenzario())
			)
				aggiornaStatoCogeRimborsi = true;
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		} 
		if (aggiornaStatoCogeRimborsi){
			if (AnticipoBulk.STATO_CONTABILIZZATO_COAN.equalsIgnoreCase(rimborso.getStato_coan())) {
				rimborso.setStato_coan(AnticipoBulk.STATO_RICONTABILIZZARE_COAN);
				anticipo.setToBeUpdated();
			}
			if (AnticipoBulk.STATO_CONTABILIZZATO_COGE.equalsIgnoreCase(rimborso.getStato_coge())) {
				rimborso.setStato_coge(AnticipoBulk.STATO_RICONTABILIZZARE_COGE);
				anticipo.setToBeUpdated();
			}
		}
	}
	if (!verificaStatoEsercizio(userContext, new it.cnr.contab.config00.esercizio.bulk.EsercizioBulk( anticipo.getCd_cds(), ((it.cnr.contab.utenze00.bp.CNRUserContext)userContext).getEsercizio())))
          throw new it.cnr.jada.comp.ApplicationException("Impossibile salvare un documento per un esercizio non aperto!");
          
	return anticipo;	
}	
/**
 * Riporto ad esercizio successivo dell'accertamento
 *
 * Pre-post-conditions:
 *
 * Nome: Riporto ad esercizio successivo dell'accertamento del rimborso
 * Pre:  L'utente ha richiesto il riporto in avanti del documento contabile associato al rimborso
 * Post: Il sistema chiama la procedura che gestisce il riporto in avanti
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	bulk		l'AnticipoBulk rimborsato
 *
 * @return l'AnticipoBulk rimborsato
 */	

public AnticipoBulk riportaRimborsoAvanti(UserContext userContext, AnticipoBulk anticipo) throws  ComponentException 
{
	LoggableStatement cs = null;
	try	
	{
		cs = new LoggableStatement(getConnection(userContext), 
			"{ call " +
			it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +
			"CNRCTB046.riportoEsNextDocAmm(?, ?, ?, ?, ?, ?, ?) }",false,this.getClass());
		
		cs.setInt(1, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue());
		cs.setString(2, Numerazione_doc_ammBulk.TIPO_RIMBORSO);
		cs.setString(3, anticipo.getRimborso().getCd_cds());
		cs.setInt(4, anticipo.getRimborso().getEsercizio().intValue());
		cs.setString(5, anticipo.getRimborso().getCd_unita_organizzativa());
		cs.setLong(6, anticipo.getRimborso().getPg_rimborso().longValue());
		cs.setString(7, it.cnr.contab.utenze00.bp.CNRUserContext.getUser(userContext));

		cs.executeQuery();
		
	} catch (Throwable e) {
		throw handleException(e);
	} finally {
		try {
			if (cs != null) cs.close();
		} catch (java.sql.SQLException e) {
			throw handleException(e);
		}
 	}
	return anticipo;
}
public AnticipoBulk riportaRimborsoIndietro(UserContext userContext, AnticipoBulk anticipo)throws ComponentException 
{
	LoggableStatement cs = null;
    try 
    {
        cs =	new LoggableStatement(getConnection(userContext),
                "{ call "
                    + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema()
                    + "CNRCTB046.deriportoEsNextDocAmm(?, ?, ?, ?, ?, ?, ?) }",false,this.getClass());

        cs.setInt(1, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue());
        cs.setString(2, Numerazione_doc_ammBulk.TIPO_RIMBORSO);
        cs.setString(3, anticipo.getRimborso().getCd_cds());
        cs.setInt(4, anticipo.getRimborso().getEsercizio().intValue());
        cs.setString(5, anticipo.getRimborso().getCd_unita_organizzativa());
        cs.setLong(6, anticipo.getRimborso().getPg_rimborso().longValue());
        cs.setString(7, it.cnr.contab.utenze00.bp.CNRUserContext.getUser(userContext));

        cs.executeQuery();
    } 
    catch (Throwable e) 
    {
        throw handleException(e);
    } 
    finally 
    {
        try {
            if (cs != null)
                cs.close();
        } catch (java.sql.SQLException e) {
            throw handleException(e);
        }
    }
    return anticipo;
}
/**
 * Annulla le modifiche apportate all'anticipo e ritorna al savepoint impostato in precedenza
 *
 * Pre-post-conditions:
 *
 * Nome: 	Rollback to savePoint
 * Pre:  	Una richiesta di annullare tutte le modifiche apportate e di ritornare al savepoint e' stata generata 
 * Post: 	Tutte le modifiche effettuate sull'anticipo da quando si e' impostato il savepoint vengono annullate
 * @param	uc	lo UserContext che ha generato la richiesta
 */	
public void rollbackToSavePoint(UserContext userContext, String savePointName) throws ComponentException 
{
	try 
	{
		rollbackToSavepoint(userContext, savePointName);
	} 
	catch (java.sql.SQLException e) 
	{
		if (e.getErrorCode() != 1086)
			throw handleException(e);
	}
}
/**
 * Ricerca anticipo
 *
 * Pre-post-conditions:
 *
 * Nome: Ricerca
 * Pre:  L'utente ha richiesto una ricerca di anticipi 
 * Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta con le clausole che
 *       l'anticipo abbia cds, unità organizzativa uguali a quello di scrivania
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param   clauses le clausole speicificate dall'utene
 * @param	bulk	l'AnticipoBulk da ricercare
 *
 * @return  il SQLBuilder con tutte le clausole
 */	

public Query select(UserContext userContext,it.cnr.jada.persistency.sql.CompoundFindClause clauses,OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	SQLBuilder sql = (SQLBuilder) super.select( userContext, clauses, bulk );
	AnticipoBulk anticipo = (AnticipoBulk) bulk;

	sql.addClause("AND", "cd_cds", SQLBuilder.EQUALS, anticipo.getCd_cds());
	sql.addClause("AND", "cd_unita_organizzativa", SQLBuilder.EQUALS, anticipo.getCd_unita_organizzativa());

	sql.addTableToHeader("TERZO");
	sql.addSQLJoin("ANTICIPO.CD_TERZO", "TERZO.CD_TERZO");
	sql.addSQLClause("AND","TERZO.CD_PRECEDENTE", SQLBuilder.EQUALS, anticipo.getV_terzo().getCd_terzo_precedente());
	
	return sql;
}

/**
 * Ricerca banca
 *
 * Pre-post-conditions:
 *
 * Nome: Ricerca
 * Pre:  L'utente ha richiesto una ricerca delle coordinate bancarie del terzo associato all'anticipo
 * Post: Il sistema restitusce il SQLBuilder con le clausole specificate dall'utente e in aggiunta con le clausole che
 *       le coordinate bancarie siano valide (non cancellate), siano associate al terzo dell'anticipo a abbiano un tipo uguale
 *       a quello selezionato dall'utente (bancario, postale, etc.)
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	anticipo	l'AnticipoBulk da cui ricavare il terzo e il tipo di pagamento
 * @param	banca	la BancaBulk da ricercare
 * @param	clauses	le clausole specificate dall'utente
 *
 * @return  il SQLBuilder con tutte le clausole
 */	

public SQLBuilder selectBancaByClause(UserContext aUC, AnticipoBulk anticipo, BancaBulk banca, CompoundFindClause clauses) throws ComponentException 
{
	BancaHome bancaHome = (BancaHome)getHome(aUC, BancaBulk.class);
	return bancaHome.selectBancaFor(
							anticipo.getModalita_pagamento(),							
							anticipo.getCd_terzo());
}
/**
 *
 * Pre-post-conditions:
 *
 * Nome: Seleziona linee attività
 * Pre:  Una richiesta di listare le linee di attività da cui selezionare quella da utilizzare 
 *       per la creazione del rimborso e' stata generata
 * Post: Viene restituito il SQLBuilder con le clausole specificate dall'utente e le clausole aggiuntive che
 *       la linea di attività sia di Entrata e il Cdr della Linea di attività appartenga all'Uo di scrivania
 *
 * @param	uc	lo UserContext che ha generato la richiesta
 * @param	anticipo l' AnticipoBulk per cui selezionare la linea di attività
 * @param	latt la Linea_attivitaBulk da ricercare
 * @param	clauses le clausole specificate dall'utente
 * @return 	il SQLBuilder con tutte le clausole
 *
 */

public SQLBuilder selectLattPerRimborsoByClause(UserContext aUC,AnticipoBulk anticipo, it.cnr.contab.config00.latt.bulk.WorkpackageBulk latt, CompoundFindClause clauses) throws ComponentException, RemoteException 
{
	Configurazione_cnrBulk config = createConfigurazioneCnrComponentSession().getConfigurazione( aUC, ((CNRUserContext)aUC).getEsercizio(), null, "ELEMENTO_VOCE_SPECIALE", "RIMBORSO_ANTICIPO" );
	if ( config == null  )
		throw new ApplicationException("Configurazione CNR: manca la definizione dell'ELEMENTO VOCE per RIMBORSO ANTICIPO");

	if ( config.getVal01() == null )
		throw new ApplicationException("Configurazione CNR: manca il CODICE  dell'ELEMENTO VOCE per RIMBORSO ANTICIPO");


	SQLBuilder sql = getHome( aUC,latt.getClass(), "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();
	sql.addClause( clauses );
	sql.addSQLClause( "AND", "esercizio", sql.EQUALS, anticipo.getEsercizio() );
	sql.addClause( "AND", "cd_centro_responsabilita", sql.LIKE, anticipo.getCd_unita_organizzativa() + ".%" );
	sql.addClause( "AND", "ti_gestione", sql.EQUALS, it.cnr.contab.config00.latt.bulk.WorkpackageBulk.TI_GESTIONE_ENTRATE );
	sql.addSQLClause( " AND ", "CD_NATURA IN ( SELECT CD_NATURA FROM " +
						it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() + "ASS_EV_EV " +
						"WHERE ASS_EV_EV.esercizio = ? and" +
						"  ASS_EV_EV.cd_elemento_voce = ? " +
						" and ASS_EV_EV.ti_appartenenza = ? " +
						" and ASS_EV_EV.ti_gestione = ?)");
	sql.addParameter( ((CNRUserContext)aUC).getEsercizio(), Types.INTEGER, 0);
	sql.addParameter( config.getVal01(), Types.CHAR, 0);	
	sql.addParameter( it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome.APPARTENENZA_CNR, Types.CHAR, 0);
	sql.addParameter( it.cnr.contab.config00.pdcfin.bulk.Elemento_voceHome.GESTIONE_ENTRATE, Types.CHAR, 0);
	return sql;
}
/**
 *
 * Pre-post-conditions:
 *
 * Nome: Seleziona scadenza di obbligazione
 * Pre:  Una richiesta di listare le scadenze di obbligazione da cui selezionare quella da utilizzare 
 *       per la creazione dell'anticipo e' stata generata
 * Post: Viene restituito il SQLBuilder con le clausole specificate dall'utente e le seguenti clausole aggiuntive:
 *       - obbligazione definitiva non annullata
 *       - obbligazione con cds e esercizio uguali a quelli di scrivania
 *       - obbligazione con terzo uguale a quello specificato per l'anticipo
 *       - scadenza con data maggiore o uguale a quella di registrazione dell'anticipo
 *       - scadenza con importo associato a doc. amministrativo uguale a 0
 *
 * @param	aUC	lo UserContext che ha generato la richiesta
 * @param	anticipo l'AnticipoBulk per cui selezionare la scadenza di obbligazione
 * @param	scadenza l'Obbligazione_scadenzarioBulk da ricercare
 * @param	clauses le clausole specificate dall'utente
 * @return 	il SQLBuilder con tutte le clausole
 *
 */

public SQLBuilder selectScadenza_obbligazioneByClause(UserContext aUC, AnticipoBulk anticipo, Obbligazione_scadenzarioBulk scadenza, CompoundFindClause clauses) throws ComponentException 
{
	Obbligazione_scadenzarioHome scadenzaHome = (Obbligazione_scadenzarioHome)getHome(aUC, Obbligazione_scadenzarioBulk.class);
	SQLBuilder sql = scadenzaHome.createSQLBuilder();

  	GregorianCalendar ggRegistrazione = (GregorianCalendar)anticipo.getGregorianCalendar(anticipo.getDt_registrazione()).clone();		
	ggRegistrazione.set(GregorianCalendar.HOUR_OF_DAY, 0);
	ggRegistrazione.set(GregorianCalendar.MINUTE, 0);
	ggRegistrazione.set(GregorianCalendar.SECOND, 0);	
	java.sql.Timestamp dataRegistrazione = new java.sql.Timestamp(ggRegistrazione.getTime().getTime());		
	
	sql.setDistinctClause(true);
	sql.addTableToHeader("OBBLIGAZIONE");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.CD_CDS","OBBLIGAZIONE.CD_CDS");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO","OBBLIGAZIONE.ESERCIZIO");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.ESERCIZIO_ORIGINALE","OBBLIGAZIONE.ESERCIZIO_ORIGINALE");
	sql.addSQLJoin("OBBLIGAZIONE_SCADENZARIO.PG_OBBLIGAZIONE","OBBLIGAZIONE.PG_OBBLIGAZIONE");
	
	sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, anticipo.getEsercizio());
	sql.addSQLClause("AND","OBBLIGAZIONE.CD_CDS", sql.EQUALS, anticipo.getCd_cds());
	sql.addSQLClause("AND","OBBLIGAZIONE.STATO_OBBLIGAZIONE", sql.EQUALS, "D");
	sql.addSQLClause("AND","OBBLIGAZIONE.DT_CANCELLAZIONE", sql.ISNULL, null);
	sql.addSQLClause("AND","OBBLIGAZIONE.CD_TERZO",sql.EQUALS, anticipo.getCd_terzo());
	sql.addSQLClause("AND","OBBLIGAZIONE.FL_PGIRO",sql.NOT_EQUALS, "Y");
	sql.addSQLClause("AND","OBBLIGAZIONE.RIPORTATO",sql.EQUALS, "N");		

	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.DT_SCADENZA",sql.GREATER_EQUALS, dataRegistrazione);	
	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_AMM IS NULL");
	sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP),java.sql.Types.DECIMAL,2);
	sql.addSQLClause("AND","OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE = ? OR OBBLIGAZIONE_SCADENZARIO.IM_ASSOCIATO_DOC_CONTABILE IS NULL");
	sql.addParameter(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP),java.sql.Types.DECIMAL,2);

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

	return sql;
}
/**
 *
 * Pre-post-conditions:
 *
 * Nome: Seleziona terzo
 * Pre:  Una richiesta di listare i terzi da cui selezionare quello da utilizzare 
 *       per la creazione dell'anticipo e' stata generata
 * Post: Viene restituito il SQLBuilder con le clausole specificate dall'utente e la clausola aggiuntiva che il
 *       tipo anagrafico (dipendente/altro) sia uguale a quello specificato per l'anticipo
 *
 * @param	aUC	lo UserContext che ha generato la richiesta
 * @param	anticipo l'AnticipoBulk per cui selezionare il terzo
 * @param	aTerzo il V_terzo_per_compensoBulk da ricercare
 * @param	clauses le clausole specificate dall'utente
 * @return 	il SQLBuilder con tutte le clausole
 *
 */

public SQLBuilder selectV_terzoByClause(UserContext aUC,AnticipoBulk anticipo, V_terzo_per_compensoBulk aTerzo, CompoundFindClause clauses) throws ComponentException 
{
	//	Faccio una select DISTINCT perche' altrimenti seleziono tanti terzi
	//	quanti sono i tipi rapporto
	
	SQLBuilder sql = getHome(aUC,V_terzo_per_compensoBulk.class,"DISTINCT_TERZO").createSQLBuilder();
	sql.addClause(clauses);
	sql.setDistinctClause(true);
	sql.addSQLClause("AND","TI_DIPENDENTE_ALTRO",sql.EQUALS,anticipo.getTi_anagrafico());
	sql.addSQLClause("AND","CD_TERZO",sql.EQUALS, anticipo.getCd_terzo());
	
	// Validita del terzo
	CompoundFindClause clause = CompoundFindClause.or(
		new SimpleFindClause("dt_fine_validita_terzo",sql.GREATER_EQUALS, anticipo.getDt_registrazione()),
		new SimpleFindClause("dt_fine_validita_terzo",sql.ISNULL, null));
	sql.addClause(clause);
		
	return sql;
}
/**
 * Imposta un savepoint che consente di salvare le modifiche apportate al doc. amministrativo 
 * fino a quel momento 
 * Pre-post-conditions:
 *
 * Nome: Imposta savePoint
 * Pre:  Una richiesta di impostare un savepoint e' stata generata 
 * Post: Un savepoint e' stato impostato in modo che le modifiche apportate al doc. amministrativo vengono consolidate
 *
 * @param	uc	lo UserContext che ha generato la richiesta
 */	
public void setSavePoint(UserContext userContext, String savePointName) throws ComponentException 
{
	try 
	{
		setSavepoint(userContext, savePointName);
	} 
	catch (java.sql.SQLException e) 
	{
		throw handleException(e);
	}
}
/**
 * Aggiorna importo associato a doc.amm. della scadenza
 *
 * Pre-post-conditions:
 *
 * Nome: aggiorna
 * Pre:  L'utente ha selezionato una scadenza di obbligazione per contabilizzare l'anticipo
 * Post: Il sistema aggiorna l'importo associato a documenti amministrativi della scadenza dell'obbligazione su cui+
 *       l'anticipo e' stato contabilizzato
 *
 * @param	userContext	lo UserContext che ha generato la richiesta
 * @param	scadenza	l'Obbligazione_scadenzarioBulk per cui modificare l'importo associato a doc.amm.
 *
 * @return l'Obbligazione_scadenzarioBulk con l'importo aggiornato
 *
 */	

//
//	Aggiorno l'importo "IM_ASSOCIATO_DOC_AMM" della scadenza di obbligazione legata all'anticipo
//
private IScadenzaDocumentoContabileBulk updateImportoAssociatoDocAmm(UserContext userContext, IScadenzaDocumentoContabileBulk scadenza)	throws ComponentException 
{
	try 
	{
		((IScadenzaDocumentoContabileHome)getHome(userContext, scadenza.getClass())).aggiornaImportoAssociatoADocAmm(userContext,scadenza);
	} 
	catch (it.cnr.jada.persistency.PersistencyException exc){throw handleException((OggettoBulk)scadenza, exc);} 
	catch (it.cnr.jada.bulk.BusyResourceException exc) {throw handleException((OggettoBulk)scadenza, exc);} 
	catch (it.cnr.jada.bulk.OutdatedResourceException exc) {throw handleException((OggettoBulk)scadenza, exc);}

	return scadenza;
}
/**
 * Verifica data registrazione
 *
 * Pre-post-conditions:
 *
 * Nome: valida data - ok 
 * Pre:  L'utente ha modificato la data di registrazione dell'anticipo
 *       La nuova data e' uguale o successiva alla data dell'ultimo anticipo inserito
 * Post: Il sistema valida la nuova data
 *
 * Nome: valida data - errore
 * Pre:  L'utente ha modificato la data di registrazione dell'anticipo
 *       La nuova data e' antecedente alla data dell'ultimo anticipo inserito
 * Post: Il sistema segnala con un errore all'utente la non validazione della data inserita
 *
 * @param	uc	lo UserContext che ha generato la richiesta
 * @param	anticipo	l'AnticipoBulk per cui validare la data di registrazione
 *
 */	


private void validaDataRegistrazione(UserContext userContext, AnticipoBulk anticipo ) throws it.cnr.jada.persistency.PersistencyException, ComponentException, it.cnr.jada.comp.ApplicationException, java.sql.SQLException
{
	java.sql.Timestamp dtUltimoAnticipo = ((AnticipoHome) getHome( userContext, AnticipoBulk.class )).findDataRegistrazioneUltimoAnticipo( anticipo );
	if((dtUltimoAnticipo != null) && (dtUltimoAnticipo.after(anticipo.getDt_registrazione())))
		throw  new it.cnr.jada.comp.ApplicationException( "Non è possibile inserire un'Anticipo con data anteriore a " +  java.text.DateFormat.getDateInstance().format(dtUltimoAnticipo));
}
/**
  * Viene richiesta la validazione dell'obbligazione associata all'anticipo
  *
  * Pre-post-conditions
  *
  * Nome: 	Scadenza non selezionata
  *	Pre: 	Non e' stata selezionata la scadenza da associare all'anticipo
  *	Post: 	Non viene consentita l'associazione della scadenza con l'anticipo
  *		  	Generata una ApplicationException con il messaggio:	"Nessuna obbligazione associata!"
  *
  * Nome: 	Importi obbligazione/scadenza NULLI
  *	Pre: 	L'importo della obbligazione e/o della scadenza è nullo
  *	Post: 	Non viene consentita l'associazione della scadenza con l'anticipo
  *		  	Generata una ApplicationException con il messaggio:	
  *			"L'importo dell'obbligazione/scadenza è un dato obbligatorio"
  *
  * Nome: 	Importo scadenza diverso da quello dell'anticipo
  *	Pre: 	L'importo della scadenza è diverso da quello dell' anticipo
  *	Post: 	Non viene consentita l'associazione della scadenza con l'anticipo
  *		  	Generata una ApplicationException con il messaggio:
  *			"La scadenza di obbligazione associata ha un importo diverso da quello dell'anticipo!"
  *
  * Nome: 	Data scadenza NON valida
  *	Pre: 	La scadenza selezionata ha una data minore della data di registrazione dell'anticipo
  *	Post: 	Non viene consentita l'associazione della scadenza con l'anticipo
  *		  	Generata una ApplicationException con il messaggio:
  *			"La data della scadenza dell'obbligazione deve essere successiva alla data di registrazione dell' anticipo!"
  *  
  * Nome: 	Terzo selezionato NON valido
  *	Pre: 	Il terzo selezionato è diverso dal terzo dell'anticipo oppure il tipo entità NON è DIVERSI
  *	Post: 	Non viene consentita l'associazione della scadenza con l'anticipo
  *		  	Generata una ApplicationException con il messaggio:
  *			"L'obbligazione deve avere un creditore valido!"
  *
  * Nome: 	Tutte le validazioni precedenti superate
  * Pre: 	L'obbligazione supera tutte le validazioni precedenti
  * Post: 	Viene validata l'associazione dell'anticipo con la scadenza di obbligazione
  *
  * @param	userContext		lo UserContext che genera la richiesta
  * @param	scadenza		la scadenza da validare
  *
 **/
public void validaObbligazione(UserContext userContext, Obbligazione_scadenzarioBulk scadenza, OggettoBulk bulk) throws ComponentException
{
	AnticipoBulk anticipo = (AnticipoBulk)bulk;
	ObbligazioneBulk obbligazione = scadenza.getObbligazione();
	
	if (scadenza==null)
		throw new it.cnr.jada.comp.ApplicationException("Nessun impegno associato!");
		
	if (obbligazione.getIm_obbligazione()==null)
		throw new it.cnr.jada.comp.ApplicationException("L'importo dell'impegno è un dato obbligatorio");
		
	if (scadenza.getIm_scadenza()==null)
		throw new it.cnr.jada.comp.ApplicationException("L'importo della scadenza è un dato obbligatorio");
		
	if (scadenza.getIm_scadenza().compareTo(anticipo.getIm_anticipo_divisa())!=0)
		throw new it.cnr.jada.comp.ApplicationException("La scadenza dell'impegno associato ha un importo diverso da quello dell'anticipo!");

	GregorianCalendar gcRegistrazione = (GregorianCalendar)anticipo.getGregorianCalendar(anticipo.getDt_registrazione()).clone();
	gcRegistrazione.set(java.util.GregorianCalendar.HOUR_OF_DAY, 0);			
	gcRegistrazione.set(java.util.GregorianCalendar.MINUTE, 0);
	gcRegistrazione.set(java.util.GregorianCalendar.SECOND, 0);				
	if(gcRegistrazione.getTime().compareTo(scadenza.getDt_scadenza())>=0)
		throw new it.cnr.jada.comp.ApplicationException("La data della scadenza dell'impegno deve essere successiva alla data di registrazione dell' anticipo!");
		
	validaTerzoObbligazione(userContext, anticipo, obbligazione);
}
/**
 * Validazione del Anticipo per Esercizio COEP precedente
 *
 * Gennaro Borriello/Luisa Farinella - (05/11/2004 18.11.25)
 *	Aggiunto controllo per i documenti RIPORTATI, in base all'esercizio COEP precedente
 *	all'es. di scrivania.
 *
*/
private void validateEsercizioCOEP(it.cnr.jada.UserContext userContext, AnticipoBulk anticipo) throws ComponentException{

	LoggableStatement cs = null;	
	String status = null;
	
	try{
		if (anticipo.isRiportataInScrivania() ){
			Integer es_prec = new Integer(it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(userContext).intValue()-1);

			cs = new LoggableStatement(getConnection(userContext), "{ ? = call " + it.cnr.jada.util.ejb.EJBCommonServices.getDefaultSchema() +	"CNRCTB200.isChiusuraCoepDef(?,?)}",false,this.getClass());	
			cs.registerOutParameter( 1, java.sql.Types.VARCHAR);
			cs.setObject( 2, es_prec);
			cs.setObject( 3, anticipo.getCd_cds());		
			
			cs.executeQuery();

			status = new String(cs.getString(1));

			if (status.compareTo("Y")!=0){
				throw new it.cnr.jada.comp.ApplicationException("Attenzione: non è possibile eliminare il documento, poichè l'esercizio economico precedente non è chiuso.");	
			}
		}
	
	} catch(java.sql.SQLException ex){
		throw new it.cnr.jada.comp.ComponentException(ex);
	} finally {
		try{
			if (cs != null)
				cs.close();
		} catch (Throwable t){
			throw new it.cnr.jada.comp.ComponentException(t);
		}
	}	
}
/**
  * Viene controllato che il terzo selezionato nell'anticipo corrisponda con al terzo selezionato 
  *	nell'obbligazione
  *
  * Pre-post-conditions
  *
  * Nome:	Terzo obbligazione non valido
  *	Pre: 	Non è stato selezionato il terzo nell'obbligazione
  *	Post: 	Ritorna un ApplicationException con la descrizione dell'errore
  *
  * Nome: 	Terzo obbligazione uguale al terzo dell'anticipo 
  *	Pre: 	Il terzo selezionato nell'obbligazione corrisponde al terzo dell'anticipo
  *	Post: 	Viene validato il terzo
  *
  *	Nome: 	L'anagrafica dell'obbligazione ha tipo entita DIVERSI
  *	Pre: 	L'anagafica associata al terzo dell'obbligazione ha come tipo entita DIVERSI
  *	Post: 	Viene validato il terzo
  *
  * Nome: 	Nessuna delle due condizioni precedenti è verificata
  *	Pre: 	Il terzo selezionato NON corrisponde al terzo dell'anticipo e
  *		 	l'anagrafica associata NON ha tipo entita DIVERSI
  *	Post: 	Ritorna un ApplicationException con la descrizione dell'errore
  *
  * @param	userContext		lo UserContext che genera la richiesta
  * @param	compenso		l'anticipo di cui validare il terzo
  * @param	obblig			l'obbligazione di cui validare il terzo
  *
 **/
private void validaTerzoObbligazione(UserContext userContext, AnticipoBulk anticipo, ObbligazioneBulk obbligazione) throws ComponentException
{
	try
	{
		TerzoBulk creditore = obbligazione.getCreditore();
		TerzoHome terzoHome = (TerzoHome)getHome(userContext, TerzoBulk.class);
		
		creditore = (TerzoBulk)terzoHome.findByPrimaryKey(obbligazione.getCreditore());
		if (creditore==null || creditore.getCd_terzo()==null)
			throw new it.cnr.jada.comp.ApplicationException("L'impegno deve avere un creditore valido!");
		getHomeCache(userContext).fetchAll(userContext);

		AnagraficoHome anaHome = (AnagraficoHome)getHome(userContext, AnagraficoBulk.class);
		AnagraficoBulk anagrafico = (AnagraficoBulk)anaHome.findByPrimaryKey(creditore.getAnagrafico());
		if (!anticipo.getTerzo().equalsByPrimaryKey(creditore) && !AnagraficoBulk.DIVERSI.equalsIgnoreCase(anagrafico.getTi_entita()))
			throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata deve appartenere ad un'obbligazione che ha come creditore il fornitore dell'anticipo!");
	}
	catch(it.cnr.jada.persistency.PersistencyException ex)
	{
		throw handleException(ex);
	}
}
public boolean verificaStatoEsercizio(UserContext userContext,it.cnr.contab.config00.esercizio.bulk.EsercizioBulk anEsercizio) throws ComponentException 
{
	try 
	{
		it.cnr.contab.config00.esercizio.bulk.EsercizioHome eHome = (it.cnr.contab.config00.esercizio.bulk.EsercizioHome)getHome(userContext, it.cnr.contab.config00.esercizio.bulk.EsercizioBulk.class);
		
		return !eHome.isEsercizioChiuso(userContext, anEsercizio.getEsercizio(), anEsercizio.getCd_cds());
	} 
	catch (it.cnr.jada.persistency.PersistencyException e) 
	{
		throw handleException(e);
	}
}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy