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

it.cnr.contab.ordmag.ordini.comp.OrdineAcqComponent 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.ordmag.ordini.comp;

import java.io.Serializable;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.Vector;

import it.cnr.contab.anagraf00.core.bulk.AnagraficoBulk;
import it.cnr.contab.anagraf00.core.bulk.AnagraficoHome;
import it.cnr.contab.anagraf00.core.bulk.Anagrafico_terzoBulk;
import it.cnr.contab.anagraf00.core.bulk.TerzoBulk;
import it.cnr.contab.anagraf00.core.bulk.TerzoHome;
import it.cnr.contab.config00.bulk.CigBulk;
import it.cnr.contab.config00.bulk.Configurazione_cnrBulk;
import it.cnr.contab.config00.bulk.Parametri_cdsBulk;
import it.cnr.contab.config00.bulk.Parametri_cdsHome;
import it.cnr.contab.config00.contratto.bulk.Ass_contratto_uoBulk;
import it.cnr.contab.config00.contratto.bulk.ContrattoBulk;
import it.cnr.contab.config00.contratto.bulk.ContrattoHome;
import it.cnr.contab.config00.contratto.bulk.Procedure_amministrativeBulk;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk;
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.V_struttura_organizzativaBulk;
import it.cnr.contab.config00.sto.bulk.V_struttura_organizzativaHome;
import it.cnr.contab.docamm00.docs.bulk.Filtro_ricerca_obbligazioniVBulk;
import it.cnr.contab.docamm00.docs.bulk.ObbligazioniTable;
import it.cnr.contab.docamm00.ejb.CategoriaGruppoInventComponentSession;
import it.cnr.contab.docamm00.tabrif.bulk.Bene_servizioBulk;
import it.cnr.contab.docamm00.tabrif.bulk.Bene_servizioHome;
import it.cnr.contab.docamm00.tabrif.bulk.Categoria_gruppo_voceBulk;
import it.cnr.contab.docamm00.tabrif.bulk.DivisaBulk;
import it.cnr.contab.docamm00.tabrif.bulk.DivisaHome;
import it.cnr.contab.docamm00.tabrif.bulk.Voce_ivaBulk;
import it.cnr.contab.docamm00.tabrif.bulk.Voce_ivaHome;
import it.cnr.contab.doccont00.comp.DateServices;
import it.cnr.contab.doccont00.comp.DocumentoContabileComponentSession;
import it.cnr.contab.doccont00.core.bulk.IDocumentoContabileBulk;
import it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileBulk;
import it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileHome;
import it.cnr.contab.doccont00.core.bulk.Numerazione_doc_contBulk;
import it.cnr.contab.doccont00.core.bulk.Numerazione_doc_contHome;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneHome;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneResBulk;
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.ejb.ObbligazioneAbstractComponentSession;
import it.cnr.contab.ordmag.anag00.AbilUtenteUopOperBulk;
import it.cnr.contab.ordmag.anag00.AbilUtenteUopOperHome;
import it.cnr.contab.ordmag.anag00.LuogoConsegnaMagBulk;
import it.cnr.contab.ordmag.anag00.LuogoConsegnaMagHome;
import it.cnr.contab.ordmag.anag00.MagazzinoBulk;
import it.cnr.contab.ordmag.anag00.MagazzinoHome;
import it.cnr.contab.ordmag.anag00.NumerazioneOrdBulk;
import it.cnr.contab.ordmag.anag00.NumerazioneOrdHome;
import it.cnr.contab.ordmag.anag00.TipoOperazioneOrdBulk;
import it.cnr.contab.ordmag.anag00.UnitaOperativaOrdBulk;
import it.cnr.contab.ordmag.anag00.UnitaOperativaOrdHome;
import it.cnr.contab.ordmag.anag00.UnitaOperativaOrdKey;
import it.cnr.contab.ordmag.ejb.NumeratoriOrdMagComponentSession;
import it.cnr.contab.ordmag.ordini.bulk.OrdineAcqBulk;
import it.cnr.contab.ordmag.ordini.bulk.OrdineAcqConsegnaBulk;
import it.cnr.contab.ordmag.ordini.bulk.OrdineAcqHome;
import it.cnr.contab.ordmag.ordini.bulk.OrdineAcqRigaBulk;
import it.cnr.contab.ordmag.ordini.bulk.TipoOrdineBulk;
import it.cnr.contab.ordmag.ordini.bulk.TipoOrdineHome;
import it.cnr.contab.ordmag.ordini.dto.ImportoOrdine;
import it.cnr.contab.ordmag.ordini.dto.ParametriCalcoloImportoOrdine;
import it.cnr.contab.utenze00.bp.CNRUserContext;
import it.cnr.contab.util.Utility;
import it.cnr.jada.UserContext;
import it.cnr.jada.bulk.BulkList;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.PrimaryKeyHashtable;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.comp.ICRUDMgr;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.persistency.sql.FindClause;
import it.cnr.jada.persistency.sql.LoggableStatement;
import it.cnr.jada.persistency.sql.Query;
import it.cnr.jada.persistency.sql.SQLBuilder;
import it.cnr.jada.util.RemoteIterator;
import it.cnr.jada.util.ejb.EJBCommonServices;

public class OrdineAcqComponent
	extends it.cnr.jada.comp.CRUDComponent
	implements ICRUDMgr,Cloneable,Serializable {

	public final static String TIPO_TOTALE_COMPLETO = "C";
	public final static String TIPO_TOTALE_PARZIALE = "P";
	private final static int INSERIMENTO = 1;
	private final static int MODIFICA    = 2;
	private final static int CANCELLAZIONE    = 3;		
	
    public  OrdineAcqComponent()
    {

        /*Default constructor*/


    }
    
	private void assegnaProgressivo(UserContext userContext,OrdineAcqBulk ordine) throws ComponentException {

	try {
		// Assegno un nuovo progressivo al documento
		NumeratoriOrdMagComponentSession progressiviSession = (NumeratoriOrdMagComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRORDMAG_EJB_NumeratoriOrdMagComponentSession", NumeratoriOrdMagComponentSession.class);
		NumerazioneOrdBulk numerazione = new NumerazioneOrdBulk(ordine.getCdUnitaOperativa(), ordine.getEsercizio(), ordine.getCdNumeratore());
		ordine.setNumero(progressiviSession.getNextPG(userContext, numerazione));
	} catch (Throwable t) {
		throw handleException(ordine, t);
	}
}
public OggettoBulk creaConBulk(UserContext userContext,OggettoBulk bulk) throws ComponentException {

	return creaConBulk(userContext, bulk, null);
}
////^^@@
///** 
//  *  Creazione di un nuovo documento
//  *	 Validazioni superate
//  *    PreCondition:
//  *      Viene richiesto il salvataggio di un nuovo documento
//  *    PostCondition:
//  *      Salva.
//  *  Validazioni non superate
//  *    PreCondition:
//  *      Viene richiesto il salvataggio di un nuovo documento ma le validazioni
//  *      non vengono superate
//  *    PostCondition:
//  *      Informa l'utente della causa per la quale non è possibile salvare
// */
////^^@@
	public it.cnr.jada.bulk.OggettoBulk creaConBulk(it.cnr.jada.UserContext userContext, it.cnr.jada.bulk.OggettoBulk bulk, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status)
			throws it.cnr.jada.comp.ComponentException {

		OrdineAcqBulk ordine= (OrdineAcqBulk) bulk;
//			//assegna un progressivo al documento all'atto della creazione.
		validaOrdine(userContext, ordine);
		calcolaImportoOrdine(userContext, ordine);

	    manageDocumentiContabiliCancellati(userContext, ordine, status);

		aggiornaObbligazioni(userContext,ordine,status);
		verificaCoperturaContratto( userContext,ordine, INSERIMENTO);
		assegnaProgressivo(userContext, ordine);
		ordine = (OrdineAcqBulk)super.creaConBulk(userContext, ordine);
		return ordine;
	}

	public OrdineAcqBulk calcolaImportoOrdine(it.cnr.jada.UserContext userContext, OrdineAcqBulk ordine) throws it.cnr.jada.comp.ComponentException{
		if (ordine.getCambio() == null || ordine.getDivisa() == null || ordine.getDivisa().getCd_divisa() == null ){
			throw new it.cnr.jada.comp.ApplicationException("Campi di testata ordine necessari per il calcolo dell'importo non valorizzati.");
		}
		ParametriCalcoloImportoOrdine parametriTestata = new ParametriCalcoloImportoOrdine();
		parametriTestata.setCambio(ordine.getCambio());
		parametriTestata.setDivisa(ordine.getDivisa());
		parametriTestata.setDivisaRisultato(getEuro(userContext));
		parametriTestata.setPercProrata(ordine.getPercProrata());
		ordine.setImImponibile(BigDecimal.ZERO);
		ordine.setImIva(BigDecimal.ZERO);
		ordine.setImIvaD(BigDecimal.ZERO);
		ordine.setImTotaleOrdine(BigDecimal.ZERO);
    	for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
    		OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
    		if (riga == null){
    			throw new it.cnr.jada.comp.ApplicationException("Dettaglio vuoto.");
    		}
    		if (riga.getCoefConv() == null || riga.getPrezzoUnitario() == null || riga.getVoceIva() == null || riga.getVoceIva().getCd_voce_iva() == null ){
    			throw new it.cnr.jada.comp.ApplicationException("Campi di dettaglio ordine necessari per il calcolo dell'importo non valorizzati.");
    		}
    		ParametriCalcoloImportoOrdine parametriRiga = (ParametriCalcoloImportoOrdine)parametriTestata.clone();
    		parametriRiga.setCoefacq(riga.getCoefConv());
    		parametriRiga.setPrezzo(riga.getPrezzoUnitario());
    		parametriRiga.setSconto1(riga.getSconto1());
    		parametriRiga.setSconto2(riga.getSconto2());
    		parametriRiga.setSconto3(riga.getSconto3());
    		parametriRiga.setVoceIva(riga.getVoceIva());
    		riga.setImImponibile(BigDecimal.ZERO);
    		riga.setImImponibileDivisa(BigDecimal.ZERO);
    		riga.setImIva(BigDecimal.ZERO);
    		riga.setImIvaDivisa(BigDecimal.ZERO);
    		riga.setImIvaD(BigDecimal.ZERO);
    		riga.setImIvaNd(BigDecimal.ZERO);
    		riga.setImTotaleRiga(BigDecimal.ZERO);
    		if (riga.getRigheConsegnaColl() == null || riga.getRigheConsegnaColl().isEmpty()){
        		if (riga.getDspQuantita() != null){
            		gestioneSalvataggioRigaConsegnaSingola(riga);
        		} else {
        			throw new it.cnr.jada.comp.ApplicationException("Campi di dettaglio ordine necessari per il calcolo dell'importo non valorizzati.");
        		}
    		}
    		for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
    			OggettoBulk consbulk= (OggettoBulk) c.next();
    			OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
    			ParametriCalcoloImportoOrdine parametriCons = (ParametriCalcoloImportoOrdine)parametriRiga.clone();
        		if (cons.getQuantita() == null ){
        			throw new it.cnr.jada.comp.ApplicationException("Campi di consegna ordine necessari per il calcolo dell'importo non valorizzati.");
        		}
    			parametriCons.setQtaOrd(cons.getQuantita());
    			parametriCons.setArrAliIva(cons.getArrAliIva());
    			ImportoOrdine importo = calcoloImportoOrdine(parametriCons);
    			cons.setImImponibile(importo.getImponibile());
    			cons.setImImponibileDivisa(importo.getImponibile());
    			cons.setImIva(importo.getImportoIva());
    			cons.setImIvaDivisa(importo.getImportoIva());
    			cons.setImIvaD(importo.getImportoIvaDetraibile());
    			cons.setImIvaNd(importo.getImportoIvaInd());
    			cons.setImTotaleConsegna(importo.getTotale());
    			cons.setToBeUpdated();
    			riga.setImImponibile(riga.getImImponibile().add(cons.getImImponibile()));
    			riga.setImImponibileDivisa(riga.getImImponibileDivisa().add(cons.getImImponibileDivisa()));
    			riga.setImIva(riga.getImIva().add(cons.getImIva()));
    			riga.setImIvaDivisa(riga.getImIvaDivisa().add(cons.getImIvaDivisa()));
    			riga.setImIvaD(riga.getImIvaD().add(cons.getImIvaD()));
    			riga.setImIvaNd(riga.getImIvaNd().add(cons.getImIvaNd()));
    			riga.setImTotaleRiga(riga.getImTotaleRiga().add(cons.getImTotaleConsegna()));
    			riga.setToBeUpdated();
    		}
    	}
		impostaTotaliOrdine(ordine);
		return ordine;
	}

	public void impostaTotaliOrdine(OrdineAcqBulk ordine) {
		BigDecimal imponibile = BigDecimal.ZERO, iva = BigDecimal.ZERO, ivaD = BigDecimal.ZERO, totale = BigDecimal.ZERO;
		for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
			OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
			if (riga != null){
				for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
					OggettoBulk consbulk= (OggettoBulk) c.next();
					OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
					imponibile = imponibile.add(cons.getImImponibile());
					iva = iva.add(cons.getImIva());
					ivaD = ivaD.add(cons.getImIvaD());
					totale = totale.add(cons.getImTotaleConsegna());
				}
			}
		}
		ordine.setImImponibile(imponibile);
		ordine.setImIva(iva);
		ordine.setImIvaD(ivaD);
		ordine.setImTotaleOrdine(totale);
	}
	
	
	private void validaOrdine(it.cnr.jada.UserContext userContext, OrdineAcqBulk ordine) throws it.cnr.jada.comp.ComponentException{
		controlloEsistenzaRigheOrdine(ordine);
    	for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
    		OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
    		if (riga != null){
    			gestioneSalvataggioRigaConsegnaSingola(riga);
            	for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
            		OggettoBulk consbulk= (OggettoBulk) c.next();
            		OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
            		if (cons.getObbligazioneScadenzario() == null || cons.getObbligazioneScadenzario().getPg_obbligazione() == null){
                		cons.setObbligazioneScadenzario(riga.getDspObbligazioneScadenzario());
            		}
            		controlliValiditaConsegna(userContext, cons);
            	}
    		}
    	}
    	controllaQuadraturaObbligazioni(userContext, ordine);
    	controlloCongruenzaObbligazioni(userContext, ordine);
    	controlloCongruenzaFornitoreContratto(userContext, ordine);
    }

	private void controlloEsistenzaRigheOrdine(OrdineAcqBulk ordine) throws ApplicationException {
		if (ordine.getRigheOrdineColl() == null || ordine.getRigheOrdineColl().size() == 0){
			throw new ApplicationException ("Non è possibile salvare un ordine senza dettagli.");
		} else {
    		boolean esisteRigaValida = false;
	    	for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
	    		OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
	    		if (!riga.isToBeDeleted()){
	    			esisteRigaValida = true;
	    		}
	    	}
	    	if (!esisteRigaValida){
				throw new ApplicationException ("Non è possibile salvare un ordine senza dettagli.");
	    	}
		}
	}

	private void controlliValiditaConsegna(UserContext userContext, OrdineAcqConsegnaBulk consegna)throws it.cnr.jada.comp.ComponentException{
		if (consegna.getMagazzino() == null || consegna.getMagazzino().getCdMagazzino() == null){
			throw new ApplicationException ("E' necessario indicare il magazzino.");
		}
		if (consegna.getLuogoConsegnaMag() == null || consegna.getLuogoConsegnaMag().getCdLuogoConsegna() == null){
			throw new ApplicationException ("E' necessario indicare il luogo di consegna.");
		}
		if (!consegna.isConsegnaMagazzino()){
			if (consegna.getCdUopDest() == null){
				throw new ApplicationException("E' necessario indicare l'unità operativa di destinazione per la riga "+consegna.getRiga()+".");
			}
		} else {
			if (consegna.getCdUopDest() != null){
				throw new ApplicationException("Per una consegna a magazzino non è possibile selezionare l'unità operativa di destinazione per la riga "+consegna.getRiga()+".");
			}
		}
    	if (consegna.getOrdineAcqRiga().getOrdineAcq().getDataOrdine() == null){
        	OrdineAcqHome home = (OrdineAcqHome)getHome(userContext, OrdineAcqBulk.class);
        	try {
				OrdineAcqBulk ordine = (OrdineAcqBulk)home.findByPrimaryKey(consegna.getOrdineAcqRiga().getOrdineAcq());
				consegna.getOrdineAcqRiga().setOrdineAcq(ordine);
        	} catch (PersistencyException e) {
				throw new ApplicationException(e);
			}
    		
    	}
		if (consegna.getDtPrevConsegna() != null && consegna.getDtPrevConsegna().before(consegna.getOrdineAcqRiga().getOrdineAcq().getDataOrdine())){
			throw new ApplicationException("La data di prevista consegna non può essere precedente alla data dell'ordine per la riga "+consegna.getRiga()+".");
		}

	}
	
	private void controlloCongruenzaFornitoreContratto(it.cnr.jada.UserContext userContext, OrdineAcqBulk ordine)
			throws ComponentException, ApplicationException {
		if (ordine.getPgContratto() != null){
    		ContrattoBulk contratto;
			try {
				contratto = retrieveContratto(userContext, ordine);
	    		if (contratto != null){
	        		if (!ordine.getFornitore().equalsByPrimaryKey(contratto.getFigura_giuridica_esterna())){
						throw new ApplicationException ("Fornitore del contratto "+contratto.getFig_giu_esterna_codice()+" diverso dal fornitore indicato sull'ordine.");
	        		}
	    		}
			} catch (PersistencyException e) {
				throw new ComponentException(e);
			}
    	}
	}

	private void controlloCongruenzaObbligazioni(it.cnr.jada.UserContext userContext, OrdineAcqBulk ordine)
			throws ComponentException, ApplicationException {
		CategoriaGruppoInventComponentSession h= (CategoriaGruppoInventComponentSession)
				EJBCommonServices.createEJB(
							"CNRDOCAMM00_EJB_CategoriaGruppoInventComponentSession",
							CategoriaGruppoInventComponentSession.class);
		for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
    		OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
    		if (riga != null){
            	for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
            		OggettoBulk consbulk= (OggettoBulk) c.next();
            		OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
            		if (cons.getPgObbligazioneScad() != null){
            			try {
							ObbligazioneBulk obb = retrieveObbligazione(userContext, cons);
							if (obb != null){
								if (obb.getPg_contratto() != null){
									if (!obb.getContratto().equalsByPrimaryKey(ordine.getContratto())){
										throw new ApplicationException ("Contratto dell'impegno "+obb.getEsercizio_originale()+"/"+obb.getPg_obbligazione()+" diverso dal contratto indicato sull'ordine.");
									}
								}
								controlloCongruenzaVoceCategoriaGruppo(userContext, h, riga, obb);
								controlloCongruenzaUoImpegno(userContext, cons, obb);
							}
            			} catch (PersistencyException e) {
							throw new ComponentException(e);
						}
            		}
            	}
    		}
    	}
	}

	private void controlloCongruenzaVoceCategoriaGruppo(it.cnr.jada.UserContext userContext,
			CategoriaGruppoInventComponentSession h, OrdineAcqRigaBulk riga, ObbligazioneBulk obb)
			throws ComponentException, PersistencyException, ApplicationException {
		if (obb.getElemento_voce() != null){
			Bene_servizioBulk bene = recuperoBeneServizio(userContext, riga.getCdBeneServizio());
			if (bene != null){
				java.util.List titoliCapitoliCatGrp;
				try {
					titoliCapitoliCatGrp = h.findAssVoceFList(userContext, bene.getCategoria_gruppo());
					if (titoliCapitoliCatGrp == null)
						throw new it.cnr.jada.comp.ApplicationException("Alla categoria " + bene.getCd_categoria_gruppo() + "\" non è stato attribuita l'associazione al capitolo di spesa");
					boolean trovataVoce = false;
					for (java.util.Iterator k = titoliCapitoliCatGrp.iterator(); k.hasNext();) {
						Categoria_gruppo_voceBulk assVoce = (Categoria_gruppo_voceBulk)k.next();
						if (obb.getElemento_voce().equalsByPrimaryKey(assVoce.getElemento_voce())){
							trovataVoce = true;
						}
					}
					if (!trovataVoce){
						throw new ApplicationException ("Per la riga "+riga.getRiga()+" la voce dell'obbligazione collegata "+obb.getElemento_voce().getCd_elemento_voce()+" non è associata alla categoria/gruppo del bene/servizio "+riga.getCdBeneServizio());
					}
				} catch (IntrospectionException | RemoteException e) {
					throw new ComponentException(e);
				}
			}
		}
	}

	private void controlloCongruenzaUoImpegno(it.cnr.jada.UserContext userContext,
			OrdineAcqConsegnaBulk cons, ObbligazioneBulk obb)
			throws ComponentException, PersistencyException, ApplicationException {
		if (obb.getCd_unita_organizzativa() != null){
			Unita_organizzativaBulk uoOrdine = recuperoUoPerImpegno(userContext, cons);
			if (uoOrdine != null && !uoOrdine.getCd_unita_organizzativa().equals(obb.getCd_unita_organizzativa())){
				throw new ApplicationException ("Per la consegna "+cons.getConsegna()+" della riga "+cons.getRiga()+ " la uo dell'obbligazione non è corretta.");
			}
		}
	}

	private void gestioneSalvataggioRigaConsegnaSingola(OrdineAcqRigaBulk riga) throws ApplicationException {
		if ((riga.isToBeCreated() && riga.getRigheConsegnaColl() == null || riga.getRigheConsegnaColl().isEmpty()) 
//				||
//				(riga.getRigheConsegnaColl() != null && riga.getRigheConsegnaColl().size() == 1)
				){
			if (riga.getDspQuantita() == null){
				throw new ApplicationException ("E' necessario indicare la quantità.");
			}
			if (riga.getDspDtPrevConsegna() == null){
				throw new ApplicationException ("E' necessario indicare la data di prevista consegna.");
			}
			if (riga.getDspTipoConsegna() == null){
				throw new ApplicationException ("E' necessario indicare il tipo di consegna.");
			} else {
				if ((!riga.getDspTipoConsegna().equals(Bene_servizioBulk.TIPO_CONSEGNA_MAGAZZINO)) && (riga.getDspUopDest() == null || riga.getDspUopDest().getCdUnitaOperativa() == null)){
					throw new ApplicationException ("E' necessario indicare l'unità operativa per i tipi consegna in 'Transito' o 'Fuori Magazzino'.");
				}
				
			}
			if (riga.getDspMagazzino() == null || riga.getDspMagazzino().getCdMagazzino() == null){
				throw new ApplicationException ("E' necessario indicare il magazzino.");
			}
			if (riga.getDspLuogoConsegna() == null || riga.getDspLuogoConsegna().getCdLuogoConsegna() == null){
				throw new ApplicationException ("E' necessario indicare il luogo di consegna.");
			}
			OrdineAcqConsegnaBulk consegna = null;
			if (riga.isToBeCreated()){
				consegna = new OrdineAcqConsegnaBulk();
				consegna.setOrdineAcqRiga(riga);
				consegna.setStato(OrdineAcqConsegnaBulk.STATO_INSERITA);
				consegna.setRiga(riga.getRiga());
				consegna.setConsegna(1);
				consegna.setToBeCreated();
			} else {
				consegna = (OrdineAcqConsegnaBulk)riga.getRigheConsegnaColl().get(0);
				riga.getRigheConsegnaColl().remove(consegna);
				consegna.setToBeUpdated();
			}
			consegna.setStato(OrdineAcqConsegnaBulk.STATO_INSERITA);
			consegna.setStatoFatt(OrdineAcqConsegnaBulk.STATO_FATT_NON_ASSOCIATA);
			consegna.setImImponibile(riga.getImImponibile());
			consegna.setImImponibileDivisa(riga.getImImponibileDivisa());
			consegna.setImIva(riga.getImIva());
			consegna.setImIvaDivisa(riga.getImIvaDivisa());
			consegna.setImTotaleConsegna(riga.getImTotaleRiga());
			consegna.setImIvaD(riga.getImIvaD());
			consegna.setImIvaNd(riga.getImIvaNd());

			consegna.setLuogoConsegnaMag(riga.getDspLuogoConsegna());
			consegna.setMagazzino(riga.getDspMagazzino());
			consegna.setDtPrevConsegna(riga.getDspDtPrevConsegna());
			consegna.setQuantita(riga.getDspQuantita());
			consegna.setTipoConsegna(riga.getDspTipoConsegna());
			consegna.setUnitaOperativaOrd(riga.getDspUopDest());
			riga.getRigheConsegnaColl().add(consegna);
		}
	}
	
public it.cnr.jada.bulk.OggettoBulk stampaConBulk(it.cnr.jada.UserContext aUC, it.cnr.jada.bulk.OggettoBulk bulk) throws it.cnr.jada.comp.ComponentException {

//	if (bulk instanceof Stampa_vpg_doc_genericoBulk)
//		validateBulkForPrint(aUC, (Stampa_vpg_doc_genericoBulk)bulk);
//	if (bulk instanceof Stampa_elenco_fattureVBulk)
//		validateBulkForPrint(aUC, (Stampa_elenco_fattureVBulk)bulk);
//	
//	/*if (bulk instanceof Stampa_docamm_per_voce_del_pianoVBulk) 
//		return  stampaConBulk(aUC, (Stampa_docamm_per_voce_del_pianoVBulk) bulk);*/
//	if (bulk instanceof Stampa_fat_pas_per_vpVBulk) 
//		return  stampaConBulk(aUC, (Stampa_fat_pas_per_vpVBulk) bulk);
	return bulk;

}

@Override
public OggettoBulk inizializzaBulkPerInserimento(UserContext usercontext, OggettoBulk oggettobulk)
		throws ComponentException {
	OggettoBulk oggetto = super.inizializzaBulkPerInserimento(usercontext, oggettobulk);
	return inizializzaOrdine(usercontext, oggetto, true);
}

@Override
public OggettoBulk inizializzaBulkPerModifica(UserContext usercontext, OggettoBulk oggettobulk)
		throws ComponentException {
	OrdineAcqBulk ordine = (OrdineAcqBulk)super.inizializzaBulkPerModifica(usercontext, oggettobulk);

	ordine.setIsAbilitatoTuttiMagazzini(isAbilitatoTuttiMagazzini(usercontext, ordine));
	
	it.cnr.jada.bulk.BulkHome homeRiga= getHome(usercontext, OrdineAcqRigaBulk.class);
    it.cnr.jada.persistency.sql.SQLBuilder sql= homeRiga.createSQLBuilder();
    sql.addClause("AND", "numero", sql.EQUALS, ordine.getNumero());
    sql.addClause("AND", "cdCds", sql.EQUALS, ordine.getCdCds());
    sql.addClause("AND", "cdUnitaOperativa", sql.EQUALS, ordine.getCdUnitaOperativa());
    sql.addClause("AND", "esercizio", sql.EQUALS, ordine.getEsercizio());
    sql.addClause("AND", "cdNumeratore", sql.EQUALS, ordine.getCdNumeratore());
	sql.addOrderBy("cd_cds");
	sql.addOrderBy("cd_unita_operativa");
	sql.addOrderBy("esercizio");
	sql.addOrderBy("cd_numeratore");
	sql.addOrderBy("numero");
	sql.addOrderBy("riga");

    try {
    	ordine.setRigheOrdineColl(new it.cnr.jada.bulk.BulkList(homeRiga.fetchAll(sql)));

    	for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
    		OrdineAcqRigaBulk riga= (OrdineAcqRigaBulk) i.next();
//    		if (riga.getBeneServizio() != null){
//    			Bene_servizioBulk bene = recuperoBeneServizio(usercontext, riga.getCdBeneServizio());
//    			riga.setBeneServizio(bene);
//    			riga.setTipoConsegnaDefault(bene.getTipoGestione());
//    		}
//    		if (riga.getUnitaMisura() != null){
//    			UnitaMisuraHome home = (UnitaMisuraHome)getHome(usercontext, UnitaMisuraBulk.class);
//    			UnitaMisuraBulk um = (UnitaMisuraBulk)home.findByPrimaryKey(new UnitaMisuraBulk(riga.getCdUnitaMisura()));
//    			riga.setUnitaMisura(um);
//    		}
//    		if (riga.getVoceIva() != null){
//    			Voce_ivaHome home = (Voce_ivaHome)getHome(usercontext, Voce_ivaBulk.class);
//    			Voce_ivaBulk voce = (Voce_ivaBulk)home.findByPrimaryKey(new Voce_ivaBulk(riga.getCdVoceIva()));
//    			riga.setVoceIva(voce);
//    		}
    		
    		it.cnr.jada.bulk.BulkHome homeConsegna= getHome(usercontext, OrdineAcqConsegnaBulk.class);
    	    it.cnr.jada.persistency.sql.SQLBuilder sqlConsegna= homeConsegna.createSQLBuilder();
    	    sqlConsegna.addClause("AND", "numero", sql.EQUALS, ordine.getNumero());
    	    sqlConsegna.addClause("AND", "cdCds", sql.EQUALS, ordine.getCdCds());
    	    sqlConsegna.addClause("AND", "cdUnitaOperativa", sql.EQUALS, ordine.getCdUnitaOperativa());
    	    sqlConsegna.addClause("AND", "esercizio", sql.EQUALS, ordine.getEsercizio());
    	    sqlConsegna.addClause("AND", "cdNumeratore", sql.EQUALS, ordine.getCdNumeratore());
    	    sqlConsegna.addClause("AND", "riga", sql.EQUALS, riga.getRiga());
    		sqlConsegna.addOrderBy("consegna");

    		riga.setRigheConsegnaColl(new it.cnr.jada.bulk.BulkList(homeConsegna.fetchAll(sqlConsegna)));

    		getHomeCache(usercontext).fetchAll(usercontext);
        	
    		Obbligazione_scadenzarioBulk scadenzaComune = null;
        	Boolean esisteScadenzaComune = false;
        	for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
        		OggettoBulk consbulk= (OggettoBulk) c.next();
        		OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
//        		if (cons.getLuogoConsegnaMag() != null){
//        			LuogoConsegnaMagHome home = (LuogoConsegnaMagHome)getHome(usercontext, LuogoConsegnaMagBulk.class);
//        			LuogoConsegnaMagBulk luogo = (LuogoConsegnaMagBulk)home.findByPrimaryKey(new LuogoConsegnaMagBulk(cons.getCdCdsLuogo(), cons.getCdLuogoConsegna()));
//        			cons.setLuogoConsegnaMag(luogo);
//        		}
//        		if (cons.getMagazzino() != null){
//        			MagazzinoBulk mag = recuperoMagazzino(usercontext, cons);
//        			cons.setMagazzino(mag);
//        		}
        		if (cons.getObbligazioneScadenzario() != null){
//        			Obbligazione_scadenzarioBulk scad = retrieveObbligazioneScadenzario(usercontext, cons);
//        			cons.setObbligazioneScadenzario(scad);
        			Obbligazione_scadenzarioBulk scad = cons.getObbligazioneScadenzario();
        			if (scadenzaComune == null || scadenzaComune.equalsByPrimaryKey(scad)){
            			esisteScadenzaComune = true;
        				scadenzaComune = scad;
        			} else {
            			esisteScadenzaComune = false;
        			}
        		} else {
        			esisteScadenzaComune = false;
        		}
        		if (cons.getUnitaOperativaOrd() != null){
        			UnitaOperativaOrdBulk uop = recuperoUopDest(usercontext, cons);
        			cons.setUnitaOperativaOrd(uop);
        		}
        	}
    		impostaCampiDspRiga(riga);
        	if (esisteScadenzaComune){
            	riga.setDspObbligazioneScadenzario(scadenzaComune);
        	}
    	}
    } catch (PersistencyException e) {
    	throw handleException(e);
    }
        
//    impostaTotaliOrdine(ordine);
    rebuildObbligazioni(usercontext, ordine);
    return inizializzaOrdine(usercontext, (OggettoBulk)ordine, false);
}

protected void impostaCampiDspRiga(OrdineAcqRigaBulk riga) {
	if (riga.getRigheConsegnaColl().size() == 1){
		OrdineAcqConsegnaBulk cons = (OrdineAcqConsegnaBulk)riga.getRigheConsegnaColl().iterator().next();
		riga.setDspDtPrevConsegna(cons.getDtPrevConsegna());
		riga.setDspLuogoConsegna(cons.getLuogoConsegnaMag());
		riga.setDspMagazzino(cons.getMagazzino());
		riga.setDspQuantita(cons.getQuantita());
		riga.setDspTipoConsegna(cons.getTipoConsegna());
		riga.setDspUopDest(cons.getUnitaOperativaOrd());
	}
}

private MagazzinoBulk recuperoMagazzino(UserContext usercontext, OrdineAcqConsegnaBulk cons) throws ComponentException, PersistencyException {
	MagazzinoHome home = (MagazzinoHome)getHome(usercontext, MagazzinoBulk.class);
	MagazzinoBulk mag = (MagazzinoBulk)home.findByPrimaryKey(new MagazzinoBulk(cons.getCdCdsMag(), cons.getCdMagazzino()));
	return mag;
}

private UnitaOperativaOrdBulk recuperoUopDest(UserContext usercontext, OrdineAcqConsegnaBulk cons)
		throws ComponentException, PersistencyException {
	UnitaOperativaOrdHome home = (UnitaOperativaOrdHome)getHome(usercontext, UnitaOperativaOrdBulk.class);
	UnitaOperativaOrdBulk uop = (UnitaOperativaOrdBulk)home.findByPrimaryKey(new UnitaOperativaOrdBulk(cons.getCdUnitaOperativa()));
	return uop;
}

private UnitaOperativaOrdBulk recuperoUop(UserContext usercontext, UnitaOperativaOrdBulk uop)
		throws ComponentException, PersistencyException {
	UnitaOperativaOrdHome home = (UnitaOperativaOrdHome)getHome(usercontext, UnitaOperativaOrdBulk.class);
	UnitaOperativaOrdBulk uo = (UnitaOperativaOrdBulk)home.findByPrimaryKey(new UnitaOperativaOrdBulk(uop.getCdUnitaOperativa()));
	return uo;
}

private Obbligazione_scadenzarioBulk retrieveObbligazioneScadenzario(UserContext usercontext,
		OrdineAcqConsegnaBulk cons) throws ComponentException, PersistencyException {
	Obbligazione_scadenzarioHome home = (Obbligazione_scadenzarioHome)getHome(usercontext, Obbligazione_scadenzarioBulk.class);
	Obbligazione_scadenzarioBulk scad = (Obbligazione_scadenzarioBulk)home.findByPrimaryKey(new Obbligazione_scadenzarioBulk(cons.getCdCdsObbl(), cons.getEsercizioObbl(), cons.getEsercizioOrigObbl(), cons.getPgObbligazione(), cons.getPgObbligazioneScad()));
	return scad;
}

private ContrattoBulk retrieveContratto(UserContext usercontext,
		OrdineAcqBulk ordine) throws ComponentException, PersistencyException {
	ContrattoHome home = (ContrattoHome)getHome(usercontext, ContrattoBulk.class);
	ContrattoBulk bulk = (ContrattoBulk)home.findByPrimaryKey(new ContrattoBulk(ordine.getEsercizioContratto(), ordine.getStato(), ordine.getPgContratto()));
	return bulk;
}

private ObbligazioneBulk retrieveObbligazione(UserContext usercontext,
		OrdineAcqConsegnaBulk cons) throws ComponentException, PersistencyException {
	Obbligazione_scadenzarioBulk scad = retrieveObbligazioneScadenzario(usercontext, cons);
	ObbligazioneHome home = (ObbligazioneHome)getHome(usercontext, ObbligazioneBulk.class);
	ObbligazioneBulk obbl = (ObbligazioneBulk)home.findByPrimaryKey(new ObbligazioneBulk(scad.getCd_cds(), scad.getEsercizio(), scad.getEsercizio_originale(), scad.getPg_obbligazione()));
	return obbl;
}

@Override
public OggettoBulk inizializzaBulkPerRicerca(UserContext usercontext, OggettoBulk oggettobulk)
		throws ComponentException {
	oggettobulk = super.inizializzaBulkPerRicerca( usercontext, oggettobulk );
//	try
//		{
//			if ( oggettobulk instanceof ObbligazioneBulk)
//			{
//				ObbligazioneBulk obbligazione = (ObbligazioneBulk) bulk;
//				obbligazione.setCds( (CdsBulk) getHome( aUC, CdsBulk.class).findByPrimaryKey( new CdsBulk(((CNRUserContext) aUC).getCd_cds())));
//				obbligazione.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, obbligazione );
//			}
//			else
//				return super.inizializzaBulkPerRicerca( aUC, bulk );		
//		}
//		catch ( it.cnr.jada.persistency.PersistencyException e )
//		{
//			throw handleException(bulk, e);
//		}
	return inizializzaOrdine(usercontext, oggettobulk, false);
}

@Override
public OggettoBulk inizializzaBulkPerRicercaLibera(UserContext usercontext, OggettoBulk oggettobulk)
		throws ComponentException {
	OggettoBulk oggetto = super.inizializzaBulkPerRicercaLibera(usercontext, oggettobulk);
	return inizializzaOrdine(usercontext, oggetto, false);
}
//public SQLBuilder selectCentroResponsabilitaByClause(
//		UserContext userContext, RichiestaUopRigaBulk pdg, CdrBulk cdr,
//		CompoundFindClause clause) throws PersistencyException, ComponentException {
//
//	SQLBuilder sql = getHome(userContext, CdrBulk.class, "V_CDR_VALIDO").createSQLBuilder();
//	sql.addSQLClause("AND", "V_CDR_VALIDO.ESERCIZIO", SQLBuilder.EQUALS, CNRUserContext.getEsercizio(userContext));
//
//	if (!isCdrUo(userContext)){
//		sql.addSQLClause("AND","V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS, CNRUserContext.getCd_cdr(userContext));
//	} else {
//		sql.addTableToHeader("V_STRUTTURA_ORGANIZZATIVA", "B");		
//		sql.addSQLJoin("V_CDR_VALIDO.ESERCIZIO", "B.ESERCIZIO");
//		sql.addSQLJoin("V_CDR_VALIDO.CD_UNITA_ORGANIZZATIVA", "B.CD_UNITA_ORGANIZZATIVA");
//		sql.addSQLJoin("V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA", "B.CD_CENTRO_RESPONSABILITA");
//		sql.addSQLClause("AND", "B.CD_TIPO_LIVELLO", SQLBuilder.EQUALS, V_struttura_organizzativaHome.LIVELLO_CDR);
//		sql.addSQLClause("AND","B.CD_CDS",SQLBuilder.EQUALS, CNRUserContext.getCd_cds(userContext));
//		sql.addSQLClause("AND","B.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
//	}
//
//	if (clause != null)
//		sql.addClause(clause);
//	sql.addOrderBy("V_CDR_VALIDO.CD_CENTRO_RESPONSABILITA");
//	
//	return sql;
//}
//
protected Boolean isCdrUo(UserContext userContext) throws ComponentException, PersistencyException {
	V_struttura_organizzativaHome homeStr =(V_struttura_organizzativaHome)getHome(userContext, V_struttura_organizzativaBulk.class );
	SQLBuilder sqlStr =homeStr.createSQLBuilder();
	sqlStr.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.ESERCIZIO",SQLBuilder.EQUALS, CNRUserContext.getEsercizio(userContext));
	sqlStr.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CDS",SQLBuilder.EQUALS, CNRUserContext.getCd_cds(userContext));
	sqlStr.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_UNITA_ORGANIZZATIVA",SQLBuilder.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
	sqlStr.addSQLClause("AND","V_STRUTTURA_ORGANIZZATIVA.CD_CENTRO_RESPONSABILITA",SQLBuilder.EQUALS, CNRUserContext.getCd_cdr(userContext));
	sqlStr.addSQLClause("AND", "V_STRUTTURA_ORGANIZZATIVA.CD_TIPO_LIVELLO", SQLBuilder.EQUALS, V_struttura_organizzativaHome.LIVELLO_CDR);
	sqlStr.addSQLClause("AND", "V_STRUTTURA_ORGANIZZATIVA.FL_CDR_UO", SQLBuilder.EQUALS, "Y");

	List listStr=homeStr.fetchAll(sqlStr);
	if (listStr != null && listStr.size() == 1){
		return true;
	} else {
		return false;
	}
}

//public SQLBuilder selectLinea_attivitaByClause (UserContext userContext, 
//		RichiestaUopRigaBulk dett,
//		WorkpackageBulk latt, 
//		CompoundFindClause clause) throws ComponentException, PersistencyException, RemoteException {	
//	SQLBuilder sql = getHome(userContext, latt, "V_LINEA_ATTIVITA_VALIDA").createSQLBuilder();
//
//	sql.addSQLClause(FindClause.AND,"V_LINEA_ATTIVITA_VALIDA.ESERCIZIO",SQLBuilder.EQUALS,CNRUserContext.getEsercizio(userContext));
//	if (dett.getCdCentroResponsabilita() != null){
//		sql.addClause(FindClause.AND,"cd_centro_responsabilita",SQLBuilder.EQUALS,dett.getCdCentroResponsabilita());
//	} else {
//		throw new ApplicationException ("GAE non selezionabile senza aver prima indicato il centro di responsabilità!");
//	}
//
//	sql.openParenthesis(FindClause.AND);
//	sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_SPESE);
//	sql.addClause(FindClause.OR,"ti_gestione",SQLBuilder.EQUALS,WorkpackageBulk.TI_GESTIONE_ENTRAMBE);
//	sql.closeParenthesis();
//
//	if (dett.getProgetto()!=null && dett.getProgetto().getPg_progetto()!=null)
//		sql.addClause(FindClause.AND,"pg_progetto",SQLBuilder.EQUALS,dett.getProgetto().getPg_progetto());
//
//	// Obbligatorio cofog sulle GAE
//	if(((Parametri_cnrComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Parametri_cnrComponentSession",Parametri_cnrComponentSession.class)).isCofogObbligatorio(userContext))
//		sql.addSQLClause(FindClause.AND,"CD_COFOG",SQLBuilder.ISNOTNULL,null);
//	sql.addTableToHeader("FUNZIONE");
//	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_FUNZIONE","FUNZIONE.CD_FUNZIONE");
//	sql.addSQLClause(FindClause.AND, "FUNZIONE.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");
//
//	sql.addTableToHeader("NATURA");
//	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.CD_NATURA","NATURA.CD_NATURA");
//	sql.addSQLClause(FindClause.AND, "NATURA.FL_SPESA",SQLBuilder.EQUALS,"Y");
//
//	sql.addTableToHeader("PROGETTO_GEST");
//	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.ESERCIZIO","PROGETTO_GEST.ESERCIZIO");
//	sql.addSQLJoin("V_LINEA_ATTIVITA_VALIDA.PG_PROGETTO","PROGETTO_GEST.PG_PROGETTO");
//	sql.addSQLClause(FindClause.AND,"PROGETTO_GEST.FL_UTILIZZABILE",SQLBuilder.EQUALS,"Y");
//
//	/**
//	 * Escludo la linea di attività dell'IVA C20
//	 */
//	it.cnr.contab.config00.bulk.Configurazione_cnrBulk config = null;
//	try {
//		config = Utility.createConfigurazioneCnrComponentSession().getConfigurazione( userContext, null, null, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.PK_LINEA_ATTIVITA_SPECIALE, it.cnr.contab.config00.bulk.Configurazione_cnrBulk.SK_LINEA_COMUNE_VERSAMENTO_IVA);
//	} catch (RemoteException e) {
//		throw new ComponentException(e);
//	} catch (EJBException e) {
//		throw new ComponentException(e);
//	}
//	if (config != null){
//		sql.addSQLClause( FindClause.AND, "V_LINEA_ATTIVITA_VALIDA.CD_LINEA_ATTIVITA",  SQLBuilder.NOT_EQUALS, config.getVal01());
//	}
//
//	if (clause != null) sql.addClause(clause);
//
//	return sql; 
//}	
//
//public SQLBuilder selectElementoVoceByClause (UserContext userContext, 
//		RichiestaUopRigaBulk dett,
//		Elemento_voceBulk elementoVoce, 
//		CompoundFindClause clause) throws ComponentException, PersistencyException {
//	if (clause == null) clause = ((OggettoBulk)elementoVoce).buildFindClauses(null);
//
//	SQLBuilder sql = getHome(userContext, elementoVoce,"V_ELEMENTO_VOCE_ORDINI").createSQLBuilder();
//	
//	if(clause != null) sql.addClause(clause);
//
//	sql.addSQLClause("AND", "V_ELEMENTO_VOCE_ORDINI.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio( userContext ) );
//	sql.addSQLClause("AND", "V_ELEMENTO_VOCE_ORDINI.CD_CATEGORIA_GRUPPO_INVENT", sql.EQUALS, dett.getCdCategoriaGruppo());
//
//	if (dett.getLineaAttivita() != null)
//		sql.addSQLClause("AND","V_ELEMENTO_VOCE_ORDINI.CD_FUNZIONE",sql.EQUALS,dett.getLineaAttivita().getCd_funzione());
//
//	if (clause != null) sql.addClause(clause);
//
//	sql.addOrderBy("fl_default desc, ordine asc");
//	return sql;
//}
//public SQLBuilder selectProgettoByClause (UserContext userContext, 
//		RichiestaUopRigaBulk dett,
//		ProgettoBulk prg, 
//		CompoundFindClause clause) throws ComponentException, PersistencyException {
//	ProgettoHome progettohome = (ProgettoHome)getHome(userContext, ProgettoBulk.class,"V_PROGETTO_PADRE");
//	SQLBuilder sql = progettohome.createSQLBuilder();
//	sql.addClause( clause );
//
//	sql.addSQLClause("AND", "V_PROGETTO_PADRE.ESERCIZIO", sql.EQUALS, CNRUserContext.getEsercizio(userContext));
//	
//    if (prg!=null)
//    	sql.addSQLClause("AND", "V_PROGETTO_PADRE.PG_PROGETTO", sql.EQUALS, prg.getPg_progetto());
//	sql.addSQLClause("AND", "V_PROGETTO_PADRE.TIPO_FASE", sql.EQUALS, ProgettoBulk.TIPO_FASE_NON_DEFINITA);
//	sql.addSQLClause("AND", "V_PROGETTO_PADRE.LIVELLO", sql.EQUALS, ProgettoBulk.LIVELLO_PROGETTO_SECONDO);
//	// Se uo 999.000 in scrivania: visualizza tutti i progetti
//	Unita_organizzativa_enteBulk ente = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0);
//	if (!((CNRUserContext) userContext).getCd_unita_organizzativa().equals( ente.getCd_unita_organizzativa()))
//		sql.addSQLExistsClause("AND",progettohome.abilitazioniCommesse(userContext));
//	if (clause != null) 
//		sql.addClause(clause);
//
//	return sql; 
//}	
public SQLBuilder selectBeneServizioByClause(UserContext userContext, OrdineAcqRigaBulk riga, 
		Bene_servizioBulk bene, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	Bene_servizioHome beneHome = (Bene_servizioHome)getHome(userContext, Bene_servizioBulk.class);
	SQLBuilder sql = beneHome.selectByClause(userContext, compoundfindclause);
	sql.addSQLClause("AND", "FL_VALIDO", SQLBuilder.EQUALS, Bene_servizioBulk.STATO_VALIDO);
	
	return sql;
}

public SQLBuilder selectObbligazioneScadenzarioByClause(UserContext userContext, OrdineAcqConsegnaBulk consegna, 
		Obbligazione_scadenzarioBulk obblScad, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{

	Obbligazione_scadenzarioHome obblScadHome = (Obbligazione_scadenzarioHome)getHome(userContext, Obbligazione_scadenzarioBulk.class);
	Filtro_ricerca_obbligazioniVBulk filtro = new Filtro_ricerca_obbligazioniVBulk();
	filtro.setFornitore(consegna.getOrdineAcqRiga().getOrdineAcq().getFornitore());
	filtro.setIm_importo(consegna.getImTotaleConsegna());

	java.util.List listaCapitoli;
	try {
		listaCapitoli = recuperoListaCapitoliSelezionabili(userContext, consegna);
		filtro.setListaVociSelezionabili(listaCapitoli);
		filtro.setContratto(consegna.getOrdineAcqRiga().getOrdineAcq().getContratto());
		Unita_organizzativaBulk uo = recuperoUoPerImpegno(userContext, consegna) ;
		if (uo != null && uo.getCd_unita_organizzativa() != null){
			filtro.setCd_unita_organizzativa( uo.getCd_unita_organizzativa() );
		} else {
			throw new it.cnr.jada.comp.ApplicationException("Non è stato possibile individuare l'unità organizzativa.");
		}
		filtro.setFl_importo(Boolean.FALSE);

		SQLBuilder sql = ricercaObbligazioni(userContext, filtro, obblScadHome);
		return sql;
	} catch (ComponentException | IntrospectionException | RemoteException e) {
		throw new PersistencyException(e);
	}
}

private java.util.List recuperoListaCapitoliSelezionabili(UserContext userContext, OrdineAcqConsegnaBulk consegna)
		throws ComponentException, PersistencyException, ApplicationException, IntrospectionException, RemoteException {
	CategoriaGruppoInventComponentSession session = (CategoriaGruppoInventComponentSession)EJBCommonServices.createEJB(
			"CNRDOCAMM00_EJB_CategoriaGruppoInventComponentSession",
			CategoriaGruppoInventComponentSession.class);

	java.util.List listaCapitoli = new ArrayList<>();
	if (consegna.getOrdineAcqRiga().getCdBeneServizio() != null){
		Bene_servizioBulk bene = recuperoBeneServizio(userContext, consegna.getOrdineAcqRiga().getCdBeneServizio());
		if (bene != null) {
			java.util.List titoliCapitoliCatGrp = session.findAssVoceFList(userContext, bene.getCategoria_gruppo());
			if (titoliCapitoliCatGrp == null)
				throw new it.cnr.jada.comp.ApplicationException("Alla categoria " + bene.getCategoria_gruppo().getCd_categoria_gruppo() + "\" non è stato attribuita l'associazione al capitolo di spesa");
			for (java.util.Iterator k = titoliCapitoliCatGrp.iterator(); k.hasNext();) {
				Categoria_gruppo_voceBulk assVoce = (Categoria_gruppo_voceBulk)k.next();
				listaCapitoli.add(assVoce.getElemento_voce());
			}
		} else {
			throw new it.cnr.jada.comp.ApplicationException("Bene/servizio non valido per il dettaglio " + ((consegna.getOrdineAcqRiga().getRiga() == null) ? "" : "\"" + consegna.getOrdineAcqRiga().getRiga() + "\"") + "!");
		}
	} else {
		throw new it.cnr.jada.comp.ApplicationException("Valorizzare il bene/servizio per il dettaglio " + ((consegna.getOrdineAcqRiga().getRiga() == null) ? "" : "\"" + consegna.getOrdineAcqRiga().getRiga() + "\"") + "!");
	}
	return listaCapitoli;
}

public SQLBuilder selectDspMagazzinoByClause(UserContext userContext, OrdineAcqRigaBulk riga, 
		MagazzinoBulk mag, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	MagazzinoHome magHome = (MagazzinoHome)getHome(userContext, MagazzinoBulk.class);
	SQLBuilder sql = recuperoMagazziniAbilitati(userContext, riga.getOrdineAcq(), magHome, compoundfindclause);
	
	return sql;
}

public SQLBuilder selectMagazzinoByClause(UserContext userContext, OrdineAcqConsegnaBulk cons, 
		MagazzinoBulk mag, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	MagazzinoHome magHome = (MagazzinoHome)getHome(userContext, MagazzinoBulk.class);
	SQLBuilder sql = recuperoMagazziniAbilitati(userContext, cons.getOrdineAcqRiga().getOrdineAcq(), magHome, compoundfindclause);
	
	return sql;
}

private SQLBuilder recuperoMagazziniAbilitati(UserContext userContext, OrdineAcqBulk ord,
		MagazzinoHome magHome, CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException {
	SQLBuilder sql = magHome.selectByClause(userContext, compoundfindclause);
	if (!isAbilitatoTuttiMagazzini(userContext, ord)){
		sql.addTableToHeader("ABIL_UTENTE_UOP_OPER_MAG", "B");		
		sql.addSQLJoin("MAGAZZINO.CD_CDS", "B.CD_CDS");
		sql.addSQLJoin("MAGAZZINO.CD_MAGAZZINO", "B.CD_MAGAZZINO");
		sql.addSQLClause("AND", "B.CD_TIPO_OPERAZIONE", SQLBuilder.EQUALS, TipoOperazioneOrdBulk.OPERAZIONE_ORDINE);
		sql.addSQLClause("AND", "B.CD_UNITA_OPERATIVA", SQLBuilder.EQUALS, ord.getCdUnitaOperativa());
		sql.addSQLClause("AND", "B.CD_UTENTE", SQLBuilder.EQUALS, userContext.getUser());
	}
	return sql;
}

public SQLBuilder selectVoceIvaByClause(UserContext userContext, OrdineAcqRigaBulk riga, 
		Voce_ivaBulk voceIva, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	Voce_ivaHome voceIvaHome = (Voce_ivaHome)getHome(userContext, Voce_ivaBulk.class);
	SQLBuilder sql = voceIvaHome.selectByClause(userContext, compoundfindclause);
	if (riga.getBeneServizio() == null){
		throw new it.cnr.jada.comp.ApplicationException("Impossibile caricare il Codice Iva! E' necessario prima selezionare il bene/servizio.");
	}
	Bene_servizioBulk bene = riga.getBeneServizio();
	if (bene.getVoce_iva() == null || bene.getVoce_iva().getCd_voce_iva() == null){
		Bene_servizioHome beneHome = (Bene_servizioHome)getHome(userContext, Bene_servizioBulk.class);
		try {
			bene = (Bene_servizioBulk)beneHome.findByPrimaryKey(userContext, bene);
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
	}
	
	sql.addSQLClause("AND", "CD_VOCE_IVA", SQLBuilder.EQUALS, bene.getCd_voce_iva());
	
	return sql;
}

public SQLBuilder selectLuogoConsegnaMagByClause(UserContext userContext, OrdineAcqConsegnaBulk cons, 
		LuogoConsegnaMagBulk luogo, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	LuogoConsegnaMagHome luogoHome = (LuogoConsegnaMagHome)getHome(userContext, LuogoConsegnaMagBulk.class);
	SQLBuilder sql = luogoHome.selectByClause(userContext, compoundfindclause);
	if (cons.getMagazzino() == null){
		throw new it.cnr.jada.comp.ApplicationException("Impossibile caricare il Codice Iva! E' necessario prima selezionare il bene/servizio.");
	}
	MagazzinoBulk mag = cons.getMagazzino();
	if (mag.getLuogoConsegnaMag() == null || mag.getLuogoConsegnaMag().getCdLuogoConsegna() == null){
		MagazzinoHome magHome = (MagazzinoHome)getHome(userContext, MagazzinoBulk.class);
		try {
			mag = (MagazzinoBulk)magHome.findByPrimaryKey(userContext, mag);
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
	}
	
	sql.addSQLClause("AND", "CD_LUOGO_CONSEGNA", SQLBuilder.EQUALS, mag.getCdLuogoConsegna());
	
	return sql;
}

public SQLBuilder selectTipoOrdineByClause(UserContext userContext, OrdineAcqBulk ord, 
		TipoOrdineBulk tipo, 
		CompoundFindClause compoundfindclause) throws PersistencyException, ComponentException{
	TipoOrdineHome tipoHome = (TipoOrdineHome)getHome(userContext, TipoOrdineBulk.class);
	SQLBuilder sql = tipoHome.selectByClause(userContext, compoundfindclause);
	return sql;
}

protected Query select(UserContext userContext,CompoundFindClause clauses,OggettoBulk bulk) throws ComponentException, it.cnr.jada.persistency.PersistencyException
{
	SQLBuilder sql = (SQLBuilder) super.select( userContext, clauses, bulk );
	AbilUtenteUopOperHome abilHome = (AbilUtenteUopOperHome) getHomeCache(userContext).getHome(AbilUtenteUopOperBulk.class);
	OrdineAcqBulk ordineAcqBulk = (OrdineAcqBulk)bulk;
	SQLBuilder sqlExists = null;
	sqlExists = abilHome.createSQLBuilder();
	sqlExists.addSQLJoin("ORDINE_ACQ.CD_UNITA_OPERATIVA", "ABIL_UTENTE_UOP_OPER.CD_UNITA_OPERATIVA");
	if (!ordineAcqBulk.getIsForFirma()){
		sqlExists.openParenthesis("AND");
		sqlExists.addSQLClause("OR", "ABIL_UTENTE_UOP_OPER.CD_TIPO_OPERAZIONE", SQLBuilder.EQUALS, TipoOperazioneOrdBulk.OPERAZIONE_ORDINE);
		sqlExists.addSQLClause("OR", "ABIL_UTENTE_UOP_OPER.CD_TIPO_OPERAZIONE", SQLBuilder.EQUALS, TipoOperazioneOrdBulk.OPERAZIONE_APPROVAZIONE_ORDINE);
		sqlExists.closeParenthesis();
	} else {
		sqlExists.addSQLClause("AND", "ABIL_UTENTE_UOP_OPER.CD_TIPO_OPERAZIONE", SQLBuilder.EQUALS, TipoOperazioneOrdBulk.OPERAZIONE_FIRMA_ORDINE);
		sql.openParenthesis("AND");
		sql.addSQLClause("OR", "ORDINE_ACQ.STATO", SQLBuilder.EQUALS, OrdineAcqBulk.STATO_ALLA_FIRMA);
		sql.addSQLClause("OR", "ORDINE_ACQ.STATO", SQLBuilder.EQUALS, OrdineAcqBulk.STATO_DEFINITIVO);
		sql.addSQLClause("OR", "ORDINE_ACQ.STATO", SQLBuilder.EQUALS, OrdineAcqBulk.STATO_INVIATO_ORDINE);
		sql.closeParenthesis();
	}
	sqlExists.addSQLClause("AND", "ABIL_UTENTE_UOP_OPER.CD_UTENTE", SQLBuilder.EQUALS, userContext.getUser());

	sql.addSQLExistsClause("AND", sqlExists);
	sql.addSQLClause("AND", "ORDINE_ACQ.STATO", SQLBuilder.NOT_EQUALS, OrdineAcqBulk.STATO_ANNULLATO);
	sql.addOrderBy("cd_cds");
	sql.addOrderBy("cd_unita_operativa");
	sql.addOrderBy("esercizio");
	sql.addOrderBy("cd_numeratore");
	sql.addOrderBy("numero");
	return sql;
}

private OggettoBulk inizializzaOrdine(UserContext usercontext, OggettoBulk oggettobulk, Boolean daInserimento)
		throws ComponentException {
	OrdineAcqBulk ordine = (OrdineAcqBulk)oggettobulk;
	try {
		if (daInserimento){
			impostaDatiDivisaCambioDefault(usercontext, ordine);
		}
		OrdineAcqHome home = (OrdineAcqHome) getHomeCache(usercontext).getHome(OrdineAcqBulk.class);
		if (daInserimento){
			ordine.setCdCds( ((CNRUserContext) usercontext).getCd_cds());
		}
		if (ordine.getCdUopOrdine() == null){
			UnitaOperativaOrdHome uopHome = (UnitaOperativaOrdHome)getHome(usercontext, UnitaOperativaOrdBulk.class);
			SQLBuilder sql = home.selectUnitaOperativaOrdByClause(usercontext, ordine, uopHome, new UnitaOperativaOrdBulk(), new CompoundFindClause());
			List listUop=uopHome.fetchAll(sql);
			if (listUop != null && (listUop.size() == 1 || isPresenteUnaUop(listUop))){
				ordine.setUnitaOperativaOrd((UnitaOperativaOrdBulk)listUop.get(0));
				
				ordine.setIsAbilitatoTuttiMagazzini(isAbilitatoTuttiMagazzini(usercontext, ordine));
//				assegnaUnitaOperativaDest(usercontext, ordine, home, uopHome);
			}
		}
		assegnaNumeratoreOrd(usercontext, ordine, home);
	} catch (PersistencyException e){
		throw new ComponentException(e);
	}
	return ordine;
}

private Boolean isPresenteUnaUop(List listUop) throws ComponentException {
	UnitaOperativaOrdKey key = null;
	for (Object oggettoBulk : listUop){
		UnitaOperativaOrdBulk uop = (UnitaOperativaOrdBulk)oggettoBulk;
		if (key ==null){
			key = (UnitaOperativaOrdKey)uop.getKey();
		} else {
			if (!key.equals((UnitaOperativaOrdKey)uop.getKey())){
				return false;
			}
		}
	}
	if (key != null){
		return true;
	}
	return false;
}

private void impostaDatiDivisaCambioDefault(UserContext usercontext, OrdineAcqBulk ordine) throws ComponentException {
	ordine.setDivisa(getEuro(usercontext));
	ordine.setCambio(BigDecimal.ONE);
}

//private void assegnaUnitaOperativaDest(UserContext usercontext, OrdineAcqBulk ordine, OrdineAcqHome home,
//		UnitaOperativaOrdHome uopHome) throws PersistencyException {
//	if (ordine.getCdUnitaOperativaDest() == null){
//		SQLBuilder sqlAss = home.selectUnitaOperativaOrdDestByClause(usercontext, ordine, uopHome, new UnitaOperativaOrdBulk(), new CompoundFindClause());
//		List listAssUop=uopHome.fetchAll(sqlAss);
//		if (listAssUop != null && listAssUop.size() == 1){
//			ordine.setUnitaOperativaOrdDest((UnitaOperativaOrdBulk)listAssUop.get(0));
//		}
//	}
//}
//
private Boolean isAbilitatoTuttiMagazzini(UserContext userContext, OrdineAcqBulk ordine) throws ComponentException {
	
	AbilUtenteUopOperBulk abil = recuperoAbilUtenteUo(userContext, ordine, TipoOperazioneOrdBulk.OPERAZIONE_ORDINE);
	if (abil != null && abil.getTuttiMagazzini())
		return true;
	return false;
}
private void assegnaNumeratoreOrd(UserContext usercontext, OrdineAcqBulk ordine, OrdineAcqHome home)
		throws PersistencyException, ComponentException {
	if (ordine.getCdNumeratore() == null && ordine.getCdUopOrdine() != null){
//			AbilUtenteUopOperHome abilHome = (AbilUtenteUopOperHome)getHome(usercontext, AbilUtenteUopOperBulk.class);
//			AbilUtenteUopOperBulk abil = new AbilUtenteUopOperBulk(usercontext.getUser(), richiesta.getCdUnitaOperativa(), TipoOperazioneOrdBulk.OPERAZIONE_RICHIESTA);
//			abil = (AbilUtenteUopOperBulk)abilHome.findByPrimaryKey(usercontext, abil);
//			if (abil != null){
			NumerazioneOrdHome numerazioneHome = (NumerazioneOrdHome)getHome(usercontext, NumerazioneOrdBulk.class);
			SQLBuilder sql = home.selectNumerazioneOrdByClause(usercontext, ordine, numerazioneHome, new NumerazioneOrdBulk(), new CompoundFindClause());
			List listNum=numerazioneHome.fetchAll(sql);
			if (listNum != null && listNum.size() == 1){
				ordine.setNumerazioneOrd((NumerazioneOrdBulk)listNum.get(0));
				ordine.setPercProrata(((NumerazioneOrdBulk)listNum.get(0)).getPercProrata());
				ordine.setTiAttivita(((NumerazioneOrdBulk)listNum.get(0)).getTi_istituz_commerc());
			}
//			}
	}
}
public Boolean isUtenteAbilitatoOrdine(UserContext usercontext, OrdineAcqBulk ordine) throws ComponentException, PersistencyException{
	return isUtenteAbilitato(usercontext, ordine, TipoOperazioneOrdBulk.OPERAZIONE_ORDINE);
}

public Boolean isUtenteAbilitatoValidazioneOrdine(UserContext usercontext, OrdineAcqBulk ordine) throws ComponentException, PersistencyException{
	return isUtenteAbilitato(usercontext, ordine, TipoOperazioneOrdBulk.OPERAZIONE_APPROVAZIONE_ORDINE);
}

private Boolean isUtenteAbilitato(UserContext usercontext, OrdineAcqBulk ordine, String tipoOperazione) throws ComponentException {
	if (ordine.getCdUnitaOperativa() != null){
		AbilUtenteUopOperBulk abil = recuperoAbilUtenteUo(usercontext, ordine, tipoOperazione);
		if (abil != null){
			return true;
		}
		return false;
	}
	return true;
}

private AbilUtenteUopOperBulk recuperoAbilUtenteUo(UserContext userContext, OrdineAcqBulk ordine, String tipoOperazione) throws ComponentException {
	if (ordine.getCdUnitaOperativa() != null){
		AbilUtenteUopOperHome abilHome = (AbilUtenteUopOperHome)getHome(userContext, AbilUtenteUopOperBulk.class);
		AbilUtenteUopOperBulk abil = new AbilUtenteUopOperBulk(userContext.getUser(), ordine.getCdUnitaOperativa(), tipoOperazione);
		try {
			return (AbilUtenteUopOperBulk)abilHome.findByPrimaryKey(userContext, abil);
		} catch (PersistencyException e) {
			throw new ComponentException(e);
		}
	}
	return null;
}
public void completaOrdine(UserContext userContext, OrdineAcqBulk ordine) throws PersistencyException, ComponentException{
	OrdineAcqHome home = (OrdineAcqHome) getHomeCache(userContext).getHome(OrdineAcqBulk.class);
	assegnaNumeratoreOrd(userContext, ordine, home);
	UnitaOperativaOrdHome uopHome = (UnitaOperativaOrdHome)getHome(userContext, UnitaOperativaOrdBulk.class);
//	assegnaUnitaOperativaDest(userContext, ordine, home, uopHome);
}

public it.cnr.jada.bulk.OggettoBulk modificaConBulk(it.cnr.jada.UserContext userContext, it.cnr.jada.bulk.OggettoBulk bulk, it.cnr.contab.doccont00.core.bulk.OptionRequestParameter status)
		throws it.cnr.jada.comp.ComponentException {
	OrdineAcqBulk ordine= (OrdineAcqBulk)bulk;
	validaOrdine(userContext, ordine);
	controlliCambioStato(userContext,ordine);
	calcolaImportoOrdine(userContext, ordine);
    manageDeletedElements(userContext, ordine, status);
	aggiornaObbligazioni(userContext,ordine,status);
	verificaCoperturaContratto( userContext,ordine);
	return (OrdineAcqBulk)super.modificaConBulk(userContext, bulk);
}

private void controlliCambioStato(UserContext usercontext, OrdineAcqBulk ordine) throws ComponentException{
	OrdineAcqBulk ordineDB;
	try {
		ordineDB = (OrdineAcqBulk)getTempHome(usercontext, OrdineAcqBulk.class).findByPrimaryKey(
				new OrdineAcqBulk(
						ordine.getCdCds(),
						ordine.getCdUnitaOperativa(),
						ordine.getEsercizio(),
						ordine.getCdNumeratore(),
						ordine.getNumero()
		                ));
		if (ordineDB != null && !ordineDB.getStato().equals(ordine.getStato())){
			if (ordineDB.isOrdineInserito()){
				if (!ordine.isOrdineInviatoApprovazione()){
					throw new it.cnr.jada.comp.ApplicationException("Non è possibile indicare uno stato diverso da 'in approvazione'");
				}
			} else if (ordineDB.isOrdineDefinitivo()){
				if (!ordine.isOrdineInviatoFornitore()){
					throw new it.cnr.jada.comp.ApplicationException("Non è possibile indicare uno stato diverso da inviato al fornitore");
				}
			} else if (ordineDB.isOrdineAllaFirma()){
				if (!(ordine.isStatoDefinitivo() || ordine.isStatoInApprovazione())){
					throw new it.cnr.jada.comp.ApplicationException("Non è possibile indicare uno stato diverso da definito o in approvazione");
				}
			} else if (ordineDB.isOrdineInviatoApprovazione()){
				AbilUtenteUopOperHome abilHome = (AbilUtenteUopOperHome) getHomeCache(usercontext).getHome(AbilUtenteUopOperBulk.class);
				if (!abilHome.isUtenteAbilitato(usercontext, TipoOperazioneOrdBulk.OPERAZIONE_APPROVAZIONE_ORDINE, ordine.getCdUnitaOperativa())){
					throw new it.cnr.jada.comp.ApplicationException("Utente non abilitato ad operare su ordini in approvazione");
				}
				if (!(ordine.isStatoAllaFirma() || ordine.isStatoInserito())){
					throw new it.cnr.jada.comp.ApplicationException("Non è possibile indicare uno stato diverso da inserito o alla firma");
				}
			} else if (ordineDB.isOrdineInviatoFornitore()){
				throw new it.cnr.jada.comp.ApplicationException("Non è possibile cambiare lo stato di un ordine inviato al fornitore");
			}
		}
	} catch (PersistencyException e) {
		throw new ComponentException(e);
	} catch (IntrospectionException e) {
		throw new ComponentException(e);
	}
}

@Override
public OggettoBulk modificaConBulk(UserContext usercontext, OggettoBulk oggettobulk) throws ComponentException {
	return modificaConBulk(usercontext, oggettobulk, null);
}


private Boolean isUoImpegnoDaUopDestinazione(UserContext userContext) throws ComponentException {

	
	String uoDestinazione = null;
	try {
		 uoDestinazione = ((it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession)it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRCONFIG00_EJB_Configurazione_cnrComponentSession", it.cnr.contab.config00.ejb.Configurazione_cnrComponentSession.class)).getVal01(userContext, CNRUserContext.getEsercizio(userContext), "*", Configurazione_cnrBulk.PK_ORDINI, Configurazione_cnrBulk.SK_ORDINE_IMPEGNO_UO_DESTINAZIONE);
		if (uoDestinazione != null && uoDestinazione.equals("Y")){
			return true;
		}
		
	} catch (javax.ejb.EJBException e) {
		handleException(e);
	} catch (java.rmi.RemoteException e) {
		handleException(e);
	}

	return false;
}

private DivisaBulk getEuro(UserContext userContext) throws ComponentException {
	try {
		DivisaBulk divisaDefault = ((DivisaHome)getHome(userContext, DivisaBulk.class)).getDivisaDefault(userContext);
		Optional.ofNullable(divisaDefault)
				.map(DivisaBulk::getCd_divisa)
				.orElseThrow(()->new it.cnr.jada.comp.ApplicationException("Impossibile caricare la valuta di default! Prima di poter inserire un ordine, immettere tale valore."));
		return divisaDefault;
	} catch (javax.ejb.EJBException|PersistencyException e) {
		handleException(e);
	}
	return null;
}

/**
 * Pre:  Ricerca CIG
 * Post: Il CIG può essere collegato ad un contratto solo se vengono rispettate le seguenti regole:				
		CD_TERZO_RUP del CIG è il medesimo del contratto che si sta inserendo quindi : 
		CIG. CD_TERZO_RUP = CONTRATTO. CD_TERZO_RESP
		Il CIG non deve risultare associato ad altri contratti.
 */
public SQLBuilder selectCigByClause (UserContext userContext, OrdineAcqBulk ordine, CigBulk cig, CompoundFindClause clause)	throws ComponentException, PersistencyException
{
	if (clause == null) 
	  clause = cig.buildFindClauses(null);
	SQLBuilder sql = getHome(userContext, cig).createSQLBuilder();
	if(ordine.getResponsabileProcPers() == null || ordine.getResponsabileProcPers().getCd_terzo() == null)
	   throw new ApplicationException("Per effettuare la ricerca valorizzare il campo Responsabile!");  
	sql.addSQLClause(FindClause.AND, "CD_TERZO_RUP", SQLBuilder.EQUALS, ordine.getResponsabileProcPers().getCd_terzo());
	sql.addClause(FindClause.AND, "FL_VALIDO", SQLBuilder.EQUALS, Boolean.TRUE);
	if (clause != null) 
	  sql.addClause(clause);
	return sql;
}

/**
 * Pre:  Ricerca Figura giuridica interna
 * Post: Limitazione ai terzi di tipo Unità Organizzativa
 */
public SQLBuilder selectTerzoCdrByClause (UserContext userContext, OggettoBulk bulk, TerzoBulk terzo,CompoundFindClause clause)	throws ComponentException, PersistencyException
{
	if (clause == null) 
	  clause = terzo.buildFindClauses(null);
	SQLBuilder sql = getHome(userContext, terzo).createSQLBuilder();
	sql.addSQLClause("AND", "CD_UNITA_ORGANIZZATIVA", sql.ISNOTNULL, null);
	// Se uo 999.000 in scrivania: visualizza tutti i progetti
	Unita_organizzativa_enteBulk ente = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0);
	if (!((CNRUserContext) userContext).getCd_unita_organizzativa().equals( ente.getCd_unita_organizzativa())){
	  sql.addSQLClause("AND", "CD_UNITA_ORGANIZZATIVA", sql.EQUALS, CNRUserContext.getCd_unita_organizzativa(userContext));
	}		
	if (clause != null) 
	  sql.addClause(clause);
	return sql;
}	
public SQLBuilder selectFornitoreByClause(UserContext userContext,  OggettoBulk bulk, TerzoBulk terzo, CompoundFindClause clauses) throws ComponentException {
	
	TerzoHome home = (TerzoHome)getHome(userContext, TerzoBulk.class, "V_TERZO_CF_PI");
	SQLBuilder sql = home.createSQLBuilder();
	sql.addSQLClause("AND","DT_FINE_RAPPORTO",SQLBuilder.ISNULL,null);
	sql.addSQLClause("AND","CD_UNITA_ORGANIZZATIVA", SQLBuilder.ISNULL, null);
	sql.addClause(clauses); 
	return sql;
}
/**
 * Pre:  Ricerca Tipo Provvedimento
 * Post: Limitazione ai tipi non annullati
 */
public SQLBuilder selectProcedureAmministrativeByClause (UserContext userContext, OggettoBulk bulk, Procedure_amministrativeBulk procedura_amministrativa,CompoundFindClause clause)	throws ComponentException, PersistencyException
{
	if (clause == null) 
	  clause = procedura_amministrativa.buildFindClauses(null);
	SQLBuilder sql = getHome(userContext, procedura_amministrativa).createSQLBuilder();
	sql.openParenthesis("AND");
	sql.addClause("OR", "ti_proc_amm", SQLBuilder.EQUALS, Procedure_amministrativeBulk.TIPO_FORNITURA_SERVIZI);
	sql.addClause("OR", "ti_proc_amm", SQLBuilder.EQUALS, Procedure_amministrativeBulk.TIPO_GENERICA);
	sql.closeParenthesis();
	sql.addClause("AND", "fl_cancellato", SQLBuilder.EQUALS, Boolean.FALSE);
	if (clause != null) 
	  sql.addClause(clause);
	return sql;
}	
public ImportoOrdine calcoloImportoOrdine(ParametriCalcoloImportoOrdine parametri) throws ApplicationException{
	BigDecimal imponibile = calcoloImponibile(parametri);
	Voce_ivaBulk voceIva = null;
	if (parametri.getVoceIvaRet() != null && parametri.getVoceIvaRet().getPercentuale() != null){
		voceIva = parametri.getVoceIvaRet();
	} else {
		voceIva = parametri.getVoceIva();
	}
	BigDecimal importoIva = Utility.round6Decimali((Utility.divide(imponibile, Utility.CENTO, 6)).multiply(voceIva.getPercentuale()));
	BigDecimal ivaNonDetraibile = Utility.round6Decimali(importoIva.multiply((Utility.CENTO.subtract(voceIva.getPercentuale_detraibilita()))));
	BigDecimal ivaPerCalcoloProrata = importoIva.subtract(ivaNonDetraibile);
	BigDecimal ivaDetraibile = Utility.round6Decimali(ivaPerCalcoloProrata.multiply(Utility.nvl(parametri.getPercProrata())));
	ivaNonDetraibile = ivaNonDetraibile.add((ivaPerCalcoloProrata.subtract(ivaDetraibile)));
	
	if (ivaDetraibile.compareTo(BigDecimal.ZERO) == 0 || ivaNonDetraibile.compareTo(BigDecimal.ZERO) > 0){
		ivaNonDetraibile = ivaNonDetraibile.add(Utility.nvl(parametri.getArrAliIva()));
	}else {
		ivaDetraibile = ivaDetraibile.add(Utility.nvl(parametri.getArrAliIva()));
	}
	importoIva = importoIva.add(ivaDetraibile);
	ImportoOrdine importoOrdine = new ImportoOrdine();
	importoOrdine.setImponibile(Utility.round2Decimali(imponibile));
	importoOrdine.setImportoIva(Utility.round2Decimali(importoIva));
	importoOrdine.setImportoIvaInd(Utility.round2Decimali(ivaNonDetraibile));
	importoOrdine.setImportoIvaDetraibile(Utility.round2Decimali(ivaDetraibile));
	importoOrdine.setArrAliIva(BigDecimal.ZERO);
	return importoOrdine;
}

public ImportoOrdine calcoloImportoOrdinePerMagazzino(ParametriCalcoloImportoOrdine parametri) throws ApplicationException{
	BigDecimal imponibile = calcoloImponibile(parametri);
	imponibile = imponibile.divide(parametri.getQtaOrd());
	BigDecimal arrotondamento = Utility.nvl(parametri.getArrAliIva()).divide(parametri.getQtaOrd());
	BigDecimal arrAliIva = arrotondamento;
			
	Voce_ivaBulk voceIva = null;
	if (parametri.getVoceIvaRet() != null && parametri.getVoceIvaRet().getPercentuale() != null){
		voceIva = parametri.getVoceIvaRet();
	} else {
		voceIva = parametri.getVoceIva();
	}

	BigDecimal importoIva = (Utility.divide(imponibile, Utility.CENTO, 6)).multiply(voceIva.getPercentuale());
	BigDecimal ivaNonDetraibile = importoIva.multiply((Utility.CENTO.subtract(voceIva.getPercentuale_detraibilita())));

	BigDecimal ivaPerCalcoloProrata = importoIva.subtract(ivaNonDetraibile);
	
	BigDecimal ivaDetraibile = ivaPerCalcoloProrata.multiply(Utility.nvl(parametri.getPercProrata()));
	
	ivaNonDetraibile = ivaNonDetraibile.add((ivaPerCalcoloProrata.subtract(ivaDetraibile)));
	
	if (ivaDetraibile.compareTo(BigDecimal.ZERO) == 0 || ivaNonDetraibile.compareTo(BigDecimal.ZERO) > 0){
		ivaNonDetraibile = ivaNonDetraibile.add(Utility.nvl(parametri.getArrAliIva()));
	}else {
		ivaDetraibile = ivaDetraibile.add(Utility.nvl(parametri.getArrAliIva()));
	}
	importoIva = importoIva.add(ivaDetraibile);
	ImportoOrdine importoOrdine = new ImportoOrdine();
	importoOrdine.setImponibile(Utility.round6Decimali(imponibile));
	importoOrdine.setImportoIva(Utility.round6Decimali(importoIva));
	importoOrdine.setImportoIvaInd(Utility.round6Decimali(ivaNonDetraibile));
	importoOrdine.setImportoIvaDetraibile(Utility.round6Decimali(ivaDetraibile));
	importoOrdine.setArrAliIva(arrAliIva);
	return importoOrdine;
}

private BigDecimal calcoloImponibile(ParametriCalcoloImportoOrdine parametri) throws ApplicationException {
	BigDecimal prezzo = Utility.nvl(parametri.getPrezzoRet(), parametri.getPrezzo());
	BigDecimal cambio = Utility.nvl(parametri.getCambioRet(), parametri.getCambio());
	if (parametri.getDivisa() == null || parametri.getDivisaRisultato() == null || 
			parametri.getDivisa().getCd_divisa() == null || parametri.getDivisaRisultato().getCd_divisa() == null){
		throw new it.cnr.jada.comp.ApplicationException("E' necessario indicare le divise.");
	}
	if (!parametri.getDivisa().getCd_divisa().equals(parametri.getDivisaRisultato().getCd_divisa())){
		if (parametri.getDivisaRisultato().getFl_calcola_con_diviso().booleanValue())
			prezzo = Utility.divide(prezzo, cambio, 6);
		else
			prezzo= prezzo.multiply(cambio).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);

	}
	BigDecimal sconto1 = Utility.nvl(Utility.nvl(parametri.getSconto1Ret(), parametri.getSconto1()));
	BigDecimal sconto2 = Utility.nvl(Utility.nvl(parametri.getSconto2Ret(), parametri.getSconto2()));
	BigDecimal sconto3 = Utility.nvl(Utility.nvl(parametri.getSconto3Ret(), parametri.getSconto3()));
	BigDecimal prezzoScontato = prezzo.
									multiply(BigDecimal.ONE.subtract(sconto1.divide(Utility.CENTO))).
									multiply(BigDecimal.ONE.subtract(sconto2.divide(Utility.CENTO))).
									multiply(BigDecimal.ONE.subtract(sconto3.divide(Utility.CENTO)));
	BigDecimal imponibile = prezzoScontato.multiply(parametri.getQtaOrd());
	return imponibile;
}
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 = ricercaObbligazioni(context, filtro, home);

		return iterator(
			context,
			sql,
			Obbligazione_scadenzarioBulk.class,
			"default");
	}

private it.cnr.jada.persistency.sql.SQLBuilder ricercaObbligazioni(UserContext context,
		Filtro_ricerca_obbligazioniVBulk filtro, Obbligazione_scadenzarioHome home) {
	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.addTableToHeader("ELEMENTO_VOCE");
	sql.addSQLJoin("OBBLIGAZIONE.CD_ELEMENTO_VOCE","ELEMENTO_VOCE.CD_ELEMENTO_VOCE");
	sql.addSQLJoin("OBBLIGAZIONE.TI_APPARTENENZA","ELEMENTO_VOCE.TI_APPARTENENZA");
	sql.addSQLJoin("OBBLIGAZIONE.TI_GESTIONE","ELEMENTO_VOCE.TI_GESTIONE");
	sql.addSQLJoin("OBBLIGAZIONE.ESERCIZIO","ELEMENTO_VOCE.ESERCIZIO");

	sql.addSQLClause("AND", "OBBLIGAZIONE.ESERCIZIO", sql.EQUALS, it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context));
	sql.addSQLClause("AND","OBBLIGAZIONE.RIPORTATO", sql.EQUALS, "N");
	sql.addSQLClause("AND","OBBLIGAZIONE.DT_CANCELLAZIONE", sql.ISNULL, null);
	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());

	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.getListaVociSelezionabili() != null && !filtro.getListaVociSelezionabili().isEmpty()) {
		sql.openParenthesis("AND");
		for (Elemento_voceBulk voce : filtro.getListaVociSelezionabili()){
			sql.openParenthesis("OR");
			sql.addSQLClause("AND","OBBLIGAZIONE.CD_ELEMENTO_VOCE",sql.EQUALS, voce.getCd_elemento_voce());
			sql.addSQLClause("AND","OBBLIGAZIONE.TI_APPARTENENZA",sql.EQUALS, voce.getTi_appartenenza());
			sql.addSQLClause("AND","OBBLIGAZIONE.TI_GESTIONE",sql.EQUALS, voce.getTi_gestione());
			sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO",sql.EQUALS, voce.getEsercizio());
			sql.closeParenthesis();
			
		}
		sql.closeParenthesis();
	}
	
	if (filtro.getContratto() != null && filtro.getContratto().getPg_contratto() != null) {
		sql.addSQLClause("AND","OBBLIGAZIONE.PG_CONTRATTO",sql.EQUALS, filtro.getContratto().getPg_contratto());
		sql.addSQLClause("AND","OBBLIGAZIONE.ESERCIZIO_CONTRATTO",sql.EQUALS, filtro.getContratto().getEsercizio());
		sql.addSQLClause("AND","OBBLIGAZIONE.STATO_CONTRATTO",sql.EQUALS, filtro.getContratto().getStato());
	}
	
	sql.addSQLClause("AND","OBBLIGAZIONE.FL_PGIRO",sql.EQUALS, "N");

	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 sql;
} 
public OrdineAcqBulk contabilizzaDettagliSelezionati(
		UserContext context,
		OrdineAcqBulk ordine,
		java.util.Collection dettagliSelezionati,
		it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioBulk obbligazioneSelezionata)
		throws ComponentException {

		if (obbligazioneSelezionata != null && dettagliSelezionati != null) {
			if (!dettagliSelezionati.isEmpty()) {
				for (java.util.Iterator i = dettagliSelezionati.iterator(); i.hasNext();) {
					OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk)i.next();

	                validaScadenze(ordine, obbligazioneSelezionata);
	                
	                riga.setDspObbligazioneScadenzario(obbligazioneSelezionata);
					riga.setToBeUpdated();
					for (Object bulk : riga.getRigheConsegnaColl()){
						OrdineAcqConsegnaBulk cons = (OrdineAcqConsegnaBulk)bulk;
						if (cons.getObbligazioneScadenzario() == null || cons.getEsercizioOrigObbl() == null || cons.getObbligazioneScadenzario().equalsByPrimaryKey(riga.getDspObbligazioneScadenzario())){
							ordine.addToOrdineObbligazioniHash(obbligazioneSelezionata, cons);
						} else {
							throw new it.cnr.jada.DetailedRuntimeException("L'impegno sulla riga di consegna è diverso dall'impegno indicato sulla riga d'ordine.");
						}
					}
				}
				ordine.addToOrdineAss_totaliMap(obbligazioneSelezionata, calcolaTotalePer(
											(Vector)ordine.getOrdineObbligazioniHash().get(obbligazioneSelezionata),
											false));
			} else {
				ordine.addToOrdineObbligazioniHash(obbligazioneSelezionata, null);
			}
			try {
				ObbligazioneAbstractComponentSession session = (ObbligazioneAbstractComponentSession)EJBCommonServices.createEJB(
																"CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession",
																ObbligazioneAbstractComponentSession.class);
				session.lockScadenza(context, obbligazioneSelezionata);
			} catch (Throwable t) {
				throw handleException(ordine, t);
			}
		}
		return ordine;
	}

public OrdineAcqBulk contabilizzaConsegneSelezionate(
		UserContext context,
		OrdineAcqBulk ordine,
		java.util.Collection dettagliSelezionati,
		it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioBulk obbligazioneSelezionata)
				throws ComponentException {

	if (obbligazioneSelezionata != null && dettagliSelezionati != null) {
		if (!dettagliSelezionati.isEmpty()) {
			for (java.util.Iterator i = dettagliSelezionati.iterator(); i.hasNext();) {
				OrdineAcqConsegnaBulk cons = (OrdineAcqConsegnaBulk)i.next();

				validaScadenze(ordine, obbligazioneSelezionata);

				cons.setObbligazioneScadenzario(obbligazioneSelezionata);
				cons.setToBeUpdated();
				if (cons.getObbligazioneScadenzario() != null && cons.getEsercizioOrigObbl() != null){
					ordine.addToOrdineObbligazioniHash(obbligazioneSelezionata, cons);
				}
				ordine.addToOrdineAss_totaliMap(obbligazioneSelezionata, calcolaTotalePer(
						(Vector)ordine.getOrdineObbligazioniHash().get(obbligazioneSelezionata),
						false));
			}
			try {
				ObbligazioneAbstractComponentSession session = (ObbligazioneAbstractComponentSession)EJBCommonServices.createEJB(
						"CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession",
						ObbligazioneAbstractComponentSession.class);
				session.lockScadenza(context, obbligazioneSelezionata);
			} catch (Throwable t) {
				throw handleException(ordine, t);
			}
		}
	}
	return ordine;
}

private java.math.BigDecimal calcolaTotalePer(
		java.util.List selectedModels,
		boolean escludiIVA)
		throws it.cnr.jada.comp.ApplicationException {

		java.math.BigDecimal importo = new java.math.BigDecimal(0);
		//RP 20/03/2015 
		boolean escludiIVAInt=false;
		boolean escludiIVAOld=escludiIVA;	
		if (selectedModels != null) {
			for (java.util.Iterator i = selectedModels.iterator(); i.hasNext();) {
				escludiIVA=escludiIVAOld;	
				OrdineAcqConsegnaBulk riga = (OrdineAcqConsegnaBulk)i.next();
				importo = importo.add(
					(escludiIVA	) ?
						riga.getImImponibile() :
						riga.getImTotaleConsegna());
			}
		}

		importo = importo.setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
		return importo;
	}

private void validaScadenze(OrdineAcqBulk ordine, Obbligazione_scadenzarioBulk newScad) throws ComponentException{
	Iterator it;
	
	Vector scadCanc = ordine.getDocumentiContabiliCancellati();
	if (scadCanc != null) {
		it = scadCanc.iterator();
	 
		while(it.hasNext()) {
			Obbligazione_scadenzarioBulk scad = (Obbligazione_scadenzarioBulk) it.next();
			if(scad.getObbligazione() instanceof ObbligazioneResBulk){
				if (scad.getObbligazione().equalsByPrimaryKey(newScad.getObbligazione()) && ((ObbligazioneResBulk)scad.getObbligazione()).getObbligazione_modifica()!=null
					&& ((ObbligazioneResBulk)scad.getObbligazione()).getObbligazione_modifica().getPg_modifica()!=null) {
					throw new it.cnr.jada.comp.ApplicationException("Impossibile collegare una scadenza dell'impegno residuo "+scad.getPg_obbligazione()+" poichè é stata effettuata una modifica in questo ordine!");									
				}
			}
		}
	}
		
    ObbligazioniTable obbligazioniHash= ordine.getObbligazioniHash();
    if (obbligazioniHash != null && !obbligazioniHash.isEmpty()) {

    	for (java.util.Enumeration e= obbligazioniHash.keys(); e.hasMoreElements();) {
    		Obbligazione_scadenzarioBulk scad = (Obbligazione_scadenzarioBulk) e.nextElement();
    		if(scad.getObbligazione() instanceof ObbligazioneResBulk){
    			if (scad.getObbligazione().equalsByPrimaryKey(newScad.getObbligazione()) && ((ObbligazioneResBulk)scad.getObbligazione()).getObbligazione_modifica()!=null
					&& ((ObbligazioneResBulk)scad.getObbligazione()).getObbligazione_modifica().getPg_modifica()!=null) {
    				throw new it.cnr.jada.comp.ApplicationException("Impossibile collegare una scadenza dell'impegno residuo "+scad.getPg_obbligazione()+" poichè è stata effettuata una modifica in questo ordine!");									
    			}
    		}
    	}
    }
}
private void aggiornaObbligazioni(
		UserContext userContext,
		OrdineAcqBulk ordine,
		OptionRequestParameter status)
		throws ComponentException {

		if (ordine != null) {
			ObbligazioniTable obbligazioniHash = ordine.getOrdineObbligazioniHash();
			if (obbligazioniHash != null && !obbligazioniHash.isEmpty()) {
				Obbligazione_scadenzarioHome home = (Obbligazione_scadenzarioHome)getHome(userContext, Obbligazione_scadenzarioBulk.class);

				//Aggiorna i saldi per le obbligazioni NON temporanee
				for (java.util.Enumeration e = getDocumentiContabiliNonTemporanei(userContext, ((ObbligazioniTable)obbligazioniHash.clone()).keys()).keys(); e.hasMoreElements();)
					aggiornaSaldi(
						userContext, 
						ordine, 
						(IDocumentoContabileBulk)e.nextElement(),
						status);
					
				PrimaryKeyHashtable obblTemporanee = getDocumentiContabiliTemporanei(userContext, ((ObbligazioniTable)obbligazioniHash.clone()).keys());
				for (java.util.Enumeration e = obblTemporanee.keys(); e.hasMoreElements();) {
					ObbligazioneBulk obblT = (ObbligazioneBulk)e.nextElement();

					//Aggiorna i saldi per le obbligazioni temporanee
					//DEVE ESSERE FATTO PRIMA DELL'AGGIORNAMENTO A DEFINITIVA
					aggiornaSaldi(userContext, ordine, obblT, status);
					
					aggiornaObbligazioniTemporanee(userContext, obblT);
					obblTemporanee = new it.cnr.jada.bulk.PrimaryKeyHashtable(obblTemporanee);
					for (Iterator i = ((Vector)obblTemporanee.get(obblT)).iterator(); i.hasNext();) 
						((ObbligazioneBulk)i.next()).setPg_obbligazione(obblT.getPg_obbligazione());
				}
				ObbligazioniTable newObbligazioniHash = new ObbligazioniTable(obbligazioniHash);

				ordine.setOrdineObbligazioniHash(newObbligazioniHash);
				for (java.util.Enumeration e = ((ObbligazioniTable)newObbligazioniHash.clone()).keys(); e.hasMoreElements();) {
					Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)e.nextElement();
					it.cnr.jada.bulk.BulkHome homeObbligazione= getHome(userContext, ObbligazioneBulk.class);
					ObbligazioneBulk obbl;
					try {
						obbl = (ObbligazioneBulk)homeObbligazione.findByPrimaryKey(scadenza.getObbligazione());
					} catch (PersistencyException e1) {
						// TODO Auto-generated catch block
						throw new ApplicationException(e1);
					}
					scadenza.setObbligazione(obbl);
					java.math.BigDecimal im_ass = null;
					im_ass = calcolaTotaleObbligazione(userContext, scadenza, ordine);
					scadenza.setFlAssociataOrdine(true);
					scadenza.setIm_associato_doc_amm(im_ass);
					updateImportoAssociatoDocAmm(userContext, scadenza);
				}
			}
		}
	}
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;
	}
private it.cnr.jada.bulk.PrimaryKeyHashtable getDocumentiContabiliTemporanei(UserContext userContext, java.util.Enumeration scadenze) throws ComponentException {

	it.cnr.jada.bulk.PrimaryKeyHashtable documentiContabiliTemporanei = new it.cnr.jada.bulk.PrimaryKeyHashtable();
	if (scadenze != null)
		while (scadenze.hasMoreElements()) {
			IScadenzaDocumentoContabileBulk scadenza = (IScadenzaDocumentoContabileBulk)scadenze.nextElement();
			if (scadenza.getFather().isTemporaneo()) {
				if (!documentiContabiliTemporanei.containsKey(scadenza.getFather())) {
					Vector allInstances = new java.util.Vector();
					allInstances.addElement(scadenza.getFather());
					documentiContabiliTemporanei.put(scadenza.getFather(), allInstances);
				} else {
					((Vector)documentiContabiliTemporanei.get(scadenza.getFather())).add(scadenza.getFather());
				}
			}
		}
	return documentiContabiliTemporanei;
}
private void aggiornaSaldi(
		it.cnr.jada.UserContext uc,
		OrdineAcqBulk ordine,
		IDocumentoContabileBulk docCont,
		OptionRequestParameter status) 
	 	throws ComponentException{

		try {
			if (docCont != null && ordine != null && ordine.getDefferredSaldi() != null) {
				IDocumentoContabileBulk key = ordine.getDefferredSaldoFor(docCont);
				if (key != null) {
					java.util.Map values = (java.util.Map)ordine.getDefferredSaldi().get(key);
					//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);
					}
					if (session != null) {
						session.aggiornaSaldiInDifferita(uc, key, values, status);
						//NON Differibile: si rischia di riprocessare i saldi impropriamente
						ordine.getDefferredSaldi().remove(key);
					}
				}
			}
		} catch (javax.ejb.EJBException e) {
			throw handleException(ordine, e);
		} catch (java.rmi.RemoteException e) {
			throw handleException(ordine, e);
		}
	}

private void aggiornaObbligazioniTemporanee(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);
	}	
}

private java.math.BigDecimal calcolaTotaleObbligazione(
		it.cnr.jada.UserContext userContext,
		Obbligazione_scadenzarioBulk scadenza,
		OrdineAcqBulk ordine)
				throws it.cnr.jada.comp.ComponentException {

	ObbligazioniTable obbligazioniHash = ordine.getOrdineObbligazioniHash();
	Vector dettagli = (Vector)obbligazioniHash.get(scadenza);
	java.math.BigDecimal impTotaleDettagli = calcolaTotalePer(dettagli, false);
	return impTotaleDettagli;
}
public IScadenzaDocumentoContabileBulk updateImportoAssociatoDocAmm(
		it.cnr.jada.UserContext userContext, 
		IScadenzaDocumentoContabileBulk scadenza)
		throws it.cnr.jada.comp.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;
	}
private void rebuildObbligazioni(UserContext aUC, OrdineAcqBulk ordine) throws ComponentException {

	if (ordine == null) return;
	
	BulkList righe = ordine.getRigheOrdineColl();
	if (righe != null) {

		for (Iterator i = righe.iterator(); i.hasNext(); ) {
			OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk)i.next();
        	for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
        		OggettoBulk consbulk= (OggettoBulk) c.next();
        		OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;

        		Obbligazione_scadenzarioBulk scadenza = cons.getObbligazioneScadenzario();

        		if (cons.getObbligazioneScadenzario() != null) {
        			if (ordine.getOrdineObbligazioniHash() == null ||
        					ordine.getOrdineObbligazioniHash().getKey(scadenza) == null) {
        				scadenza = caricaScadenzaObbligazionePer(aUC, scadenza);
        			}
        			ordine.addToOrdineObbligazioniHash(scadenza, cons);
        		}
        	}
		}
	}
	try {
		getHomeCache(aUC).fetchAll(aUC);
	} catch (it.cnr.jada.persistency.PersistencyException e) {
		throw handleException(ordine, e);
	}
}
private Obbligazione_scadenzarioBulk caricaScadenzaObbligazionePer(
		UserContext context,
		Obbligazione_scadenzarioBulk scadenza)
		throws ComponentException {

		if (scadenza != null) {
			try {
				it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession h = (it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession)
																			it.cnr.jada.util.ejb.EJBCommonServices.createEJB(
																						"CNRDOCCONT00_EJB_ObbligazioneAbstractComponentSession",
																						it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession.class);
				ObbligazioneBulk obbligazione = (ObbligazioneBulk)h.inizializzaBulkPerModifica(context, scadenza.getObbligazione());
				BulkList scadenze = obbligazione.getObbligazione_scadenzarioColl();
				scadenza = (Obbligazione_scadenzarioBulk)scadenze.get(scadenze.indexOfByPrimaryKey(scadenza));
			} catch (java.rmi.RemoteException e) {
				throw handleException(scadenza, e);
			} catch (javax.ejb.EJBException e) {
				throw handleException(scadenza, e);
			}
			return scadenza;
		}
		return null;
	}
private void manageDocumentiContabiliCancellati(
		UserContext userContext, 
		OrdineAcqBulk ordine,
		OptionRequestParameter status)
		throws ComponentException {

		if (ordine != null) {
			if (ordine.getDocumentiContabiliCancellati() != null &&
				!ordine.getDocumentiContabiliCancellati().isEmpty()) {

					PrimaryKeyHashtable scadenzeConfermateTemporanee = getDocumentiContabiliTemporanei(
																			userContext,
																			ordine.getOrdineObbligazioniHash().keys());
					Vector scadenzeConfermate = new Vector();
					java.util.Enumeration e = scadenzeConfermateTemporanee.keys();
					while (e.hasMoreElements()) {
						OggettoBulk obj = (OggettoBulk)e.nextElement();
						if (obj instanceof ObbligazioneBulk)
							scadenzeConfermate.add(obj);
					}
					aggiornaObbligazioniSuCancellazione(
						userContext,
						ordine,
						ordine.getDocumentiContabiliCancellati().elements(),
						scadenzeConfermate,
						status);
			}
		}
	}
private void aggiornaObbligazioniSuCancellazione(
		UserContext userContext,
		OrdineAcqBulk ordine,
		java.util.Enumeration scadenzeDaCancellare,
		java.util.Collection scadenzeConfermate,
		OptionRequestParameter status)
		throws ComponentException {

		if (scadenzeDaCancellare != null) {

			it.cnr.jada.bulk.PrimaryKeyHashtable obblTemporanee = new it.cnr.jada.bulk.PrimaryKeyHashtable();
			for (java.util.Enumeration e = scadenzeDaCancellare; e.hasMoreElements();) {
				OggettoBulk oggettoBulk = (OggettoBulk)e.nextElement();
				if (oggettoBulk instanceof Obbligazione_scadenzarioBulk) {
					Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)oggettoBulk;
					if (scadenza.getObbligazione().isTemporaneo()) {
						if (!obblTemporanee.containsKey(scadenza.getObbligazione())) {
							Vector allInstances = new java.util.Vector();
							allInstances.addElement(scadenza);
							obblTemporanee.put(scadenza.getObbligazione(), allInstances);
						} else {
							((Vector)obblTemporanee.get(scadenza.getObbligazione())).add(scadenza);
						}
					} else if (!ordine.isToBeCreated() && OggettoBulk.NORMAL == scadenza.getCrudStatus()) {
						PrimaryKeyHashtable obbligs = getDocumentiContabiliNonTemporanei(userContext, ordine.getObbligazioniHash().keys());
						if (!obbligs.containsKey(scadenza.getObbligazione()))
							aggiornaSaldi(
								userContext, 
								ordine, 
								scadenza.getObbligazione(),
								status);
						scadenza.setIm_associato_doc_amm(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
						scadenza.setFlAssociataOrdine(false);
						updateImportoAssociatoDocAmm(userContext, scadenza);
					}
	            	/**
	            	 * Devo aggiornare i Saldi per quelle scadenze modificate e riportate
	            	 * ma poi scollegate dal documento 
	            	 * Marco Spasiano 05/05/2006
	            	 */
	                aggiornaSaldi(userContext, ordine, scadenza.getObbligazione(), status);
				}
			}
			for (java.util.Enumeration e = obblTemporanee.keys(); e.hasMoreElements();) {
				ObbligazioneBulk obblT = (ObbligazioneBulk)e.nextElement();

				//Aggiorna i saldi per le obbligazioni temporanee
				//DEVE ESSERE FATTO PRIMA DELL'AGGIORNAMENTO A DEFINITIVA
				PrimaryKeyHashtable obbligs = getDocumentiContabiliTemporanei(userContext, ordine.getObbligazioniHash().keys());
				if (!obbligs.containsKey(obblT))
					aggiornaSaldi(
							userContext, 
							ordine, 
							obblT,
							status);

				if (scadenzeConfermate == null || !it.cnr.jada.bulk.BulkCollections.containsByPrimaryKey(scadenzeConfermate, obblT))
					aggiornaObbligazioniTemporanee(userContext, obblT);
			}
		}
	}
private OrdineAcqBulk manageDeletedElements(
		UserContext userContext, 
		OrdineAcqBulk ordine,
		OptionRequestParameter status)
		throws ComponentException {

		if (ordine != null) {
			manageDocumentiContabiliCancellati(userContext, ordine, status);
		}
		return ordine;
	}
public void controllaQuadraturaObbligazioni(UserContext aUC,OrdineAcqBulk ordine)
		throws ComponentException {

		if (ordine != null ) {
			ObbligazioniTable obbligazioniHash = ordine.getOrdineObbligazioniHash();
			if (obbligazioniHash != null) {
				for (java.util.Enumeration e = obbligazioniHash.keys(); e.hasMoreElements();) {
					Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk)e.nextElement();
					
					try {
						scadenza = (Obbligazione_scadenzarioBulk)getTempHome(aUC, Obbligazione_scadenzarioBulk.class).findByPrimaryKey(
								new Obbligazione_scadenzarioBulk(
										scadenza.getCd_cds(),
										scadenza.getEsercizio(),
										scadenza.getEsercizio_originale(),
										scadenza.getPg_obbligazione(),
										scadenza.getPg_obbligazione_scadenzario()
						                ));
					} catch (PersistencyException e1) {
						throw new ComponentException(e1);
					}

					
					
					java.math.BigDecimal totale = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
					java.math.BigDecimal delta = null;
					totale = calcolaTotaleObbligazione(aUC, scadenza, ordine);
					delta = scadenza.getIm_scadenza().subtract(totale);
					if (delta.compareTo(new java.math.BigDecimal(0)) > 0) {
						StringBuffer sb = new StringBuffer();
						sb.append("Attenzione: La scadenza ");
						sb.append(scadenza.getDs_scadenza());
						sb.append(" di " + scadenza.getIm_scadenza().doubleValue() + " EUR");
						sb.append(" è stata coperta solo per ");
						sb.append(totale.doubleValue() + " EUR!");
						throw new it.cnr.jada.comp.ApplicationException(sb.toString());
					} else if (delta.compareTo(new java.math.BigDecimal(0)) < 0) {
						StringBuffer sb = new StringBuffer();
						sb.append("Attenzione: La scadenza ");
						sb.append(scadenza.getDs_scadenza());
						sb.append(" di " + scadenza.getIm_scadenza().doubleValue() + " EUR");
						sb.append(" è scoperta per ");
						sb.append(delta.abs().doubleValue() + " EUR!");
						throw new it.cnr.jada.comp.ApplicationException(sb.toString());
					}					
				}
			}
		}
	}

protected Bene_servizioBulk recuperoBeneServizio(it.cnr.jada.UserContext userContext, String cdBeneServizio)
		throws ComponentException, PersistencyException {
	Bene_servizioHome home = (Bene_servizioHome)getHome(userContext, Bene_servizioBulk.class);
	Bene_servizioBulk bene = (Bene_servizioBulk)home.findByPrimaryKey(new Bene_servizioBulk(cdBeneServizio));
	return bene;
}
public SQLBuilder selectContrattoByClause(UserContext userContext, OrdineAcqBulk ordine, ContrattoBulk contratto, CompoundFindClause clauses) throws ComponentException, it.cnr.jada.persistency.PersistencyException 
{
	Parametri_cdsHome paramHome = (Parametri_cdsHome)getHome(userContext, Parametri_cdsBulk.class);
	Parametri_cdsBulk param_cds;
	try {
		param_cds =
			(Parametri_cdsBulk) paramHome.findByPrimaryKey(
				new Parametri_cdsBulk(
						ordine.getCd_cds(),
						ordine.getEsercizio()));
	} catch (PersistencyException e) {
		throw new ComponentException(e);
	}
	
	SQLBuilder sql = getHome(userContext,ContrattoBulk.class).createSQLBuilder();
	
	if (clauses != null) 
	  sql.addClause(clauses);
	sql.openParenthesis("AND");  
	  sql.addSQLClause("AND","NATURA_CONTABILE",SQLBuilder.EQUALS, ContrattoBulk.NATURA_CONTABILE_PASSIVO);
	  sql.addSQLClause("OR","NATURA_CONTABILE",SQLBuilder.EQUALS, ContrattoBulk.NATURA_CONTABILE_ATTIVO_E_PASSIVO);
	sql.closeParenthesis();  
	if(param_cds != null && param_cds.getFl_contratto_cessato().booleanValue()){
		sql.openParenthesis("AND");  
		  sql.addSQLClause("AND","STATO",SQLBuilder.EQUALS, ContrattoBulk.STATO_DEFINITIVO);
		  sql.addSQLClause("OR","STATO",SQLBuilder.EQUALS, ContrattoBulk.STATO_CESSSATO);
		sql.closeParenthesis();		
	}	
	else  
	  sql.addSQLClause("AND", "STATO", sql.EQUALS, ContrattoBulk.STATO_DEFINITIVO);

	// Se uo 999.000 in scrivania: visualizza tutti i contratti
	Unita_organizzativa_enteBulk ente = (Unita_organizzativa_enteBulk) getHome( userContext, Unita_organizzativa_enteBulk.class).findAll().get(0);
	if (!((CNRUserContext) userContext).getCd_unita_organizzativa().equals( ente.getCd_unita_organizzativa())){
	  sql.openParenthesis("AND");
		sql.addSQLClause("AND","CONTRATTO.CD_UNITA_ORGANIZZATIVA",sql.EQUALS,CNRUserContext.getCd_unita_organizzativa(userContext));
		SQLBuilder sqlAssUo = getHome(userContext,Ass_contratto_uoBulk.class).createSQLBuilder();		   
		sqlAssUo.addSQLJoin("CONTRATTO.ESERCIZIO","ASS_CONTRATTO_UO.ESERCIZIO");
		sqlAssUo.addSQLJoin("CONTRATTO.PG_CONTRATTO","ASS_CONTRATTO_UO.PG_CONTRATTO");
		sqlAssUo.addSQLClause("AND","ASS_CONTRATTO_UO.CD_UNITA_ORGANIZZATIVA",sql.EQUALS,CNRUserContext.getCd_unita_organizzativa(userContext));
		sql.addSQLExistsClause("OR",sqlAssUo);
	  sql.closeParenthesis();  		 
	}
	sql.addTableToHeader("TERZO");
	sql.addSQLJoin("CONTRATTO.FIG_GIUR_EST", SQLBuilder.EQUALS,"TERZO.CD_TERZO");
	sql.addSQLClause("AND","TERZO.DT_FINE_RAPPORTO",SQLBuilder.ISNULL,null);
		
	if((ordine.getFornitore() != null && ordine.getFornitore().getCd_terzo()!=null)){
		sql.openParenthesis("AND");
	    sql.openParenthesis("AND");
	    sql.addSQLClause(FindClause.AND, "FIG_GIUR_EST",SQLBuilder.EQUALS,ordine.getFornitore().getCd_terzo());
		AnagraficoHome anagraficoHome = (AnagraficoHome) getHome(userContext, AnagraficoBulk.class);
		sql.closeParenthesis();
		try {
			for (Iterator i = anagraficoHome.findAssociatiStudio(ordine.getFornitore().getAnagrafico()).iterator(); i.hasNext();) {
				sql.openParenthesis("OR");
					Anagrafico_terzoBulk associato = i.next();
					sql.addSQLClause("OR", "CONTRATTO.FIG_GIUR_EST",SQLBuilder.EQUALS, associato.getCd_terzo());
				sql.closeParenthesis();
			}
		} catch (IntrospectionException e) { 
		}
	  sql.closeParenthesis();
	}
	/*
    sql.openParenthesis("AND");	   
	  sql.addSQLClause("AND","TRUNC(NVL(DT_FINE_VALIDITA,SYSDATE)) >= TRUNC(SYSDATE)");
	  sql.addSQLClause("OR","(DT_PROROGA IS NOT NULL AND TRUNC(DT_PROROGA) >= TRUNC(SYSDATE))");
	sql.closeParenthesis();
	*/  
	return sql;
}
public void verificaCoperturaContratto (UserContext aUC,OrdineAcqBulk ordine, int flag) throws ComponentException
{
	if (ordine.getContratto() != null && ordine.getContratto().getPg_contratto() != null){
	  try {	
		  ContrattoHome contrattoHome = (ContrattoHome)getHome(aUC, ContrattoBulk.class);
		  SQLBuilder sql = contrattoHome.calcolaTotOrdini(aUC,ordine.getContratto());
		  BigDecimal totale = BigDecimal.ZERO; 
			try {
				java.sql.ResultSet rs = null;
				LoggableStatement ps = null;
				try {
					ps = sql.prepareStatement(getConnection(aUC));
					try {
						rs = ps.executeQuery();
						if (rs.next())
						totale = rs.getBigDecimal(1);
					} catch (java.sql.SQLException e) {
						throw handleSQLException(e);
					} finally {
						if (rs != null) try{rs.close();}catch( java.sql.SQLException e ){};
					}
				} finally {
					if (ps != null) try{ps.close();}catch( java.sql.SQLException e ){};
				}
			} catch (java.sql.SQLException ex) {
				throw handleException(ex);
			}
		  if (flag == INSERIMENTO){
			    totale = Utility.nvl(totale).add(ordine.getImTotaleOrdine());			  
		  } else if (flag == MODIFICA){
				OrdineAcqBulk ordineDB;
				try {
					ordineDB = (OrdineAcqBulk)getTempHome(aUC, OrdineAcqBulk.class).findByPrimaryKey(
							new OrdineAcqBulk(
									ordine.getCdCds(),
									ordine.getCdUnitaOperativa(),
									ordine.getEsercizio(),
									ordine.getCdNumeratore(),
									ordine.getNumero()
					                ));
				} catch (PersistencyException e) {
					throw new ComponentException(e);
				}

			  totale = totale.subtract(Utility.nvl(ordineDB.getImTotaleOrdine())).add(Utility.nvl(ordine.getImTotaleOrdine()));
		  }
		  if (totale != null ){
			  if (totale.compareTo(ordine.getContratto().getIm_contratto_passivo()) > 0){
				  throw handleException( new ApplicationException("La somma degli ordini associati supera l'importo definito nel contratto."));
			  }
		  }
	  } catch (IntrospectionException e1) {
		  throw new it.cnr.jada.comp.ComponentException(e1);
	  } catch (PersistencyException e1) {
		  throw new it.cnr.jada.comp.ComponentException(e1);
	  }
  }		

}
public void verificaCoperturaContratto (UserContext aUC,OrdineAcqBulk ordine) throws ComponentException
{
	verificaCoperturaContratto (aUC,ordine, MODIFICA);
}
public OrdineAcqBulk cancellaOrdine(
	    UserContext aUC,
	    OrdineAcqBulk ordine)
	    throws ComponentException {
	    try {
			for (java.util.Iterator i= ordine.getRigheOrdineColl().iterator(); i.hasNext();) {
				OrdineAcqRigaBulk riga = (OrdineAcqRigaBulk) i.next();
				if (riga.getDspObbligazioneScadenzario() != null && riga.getDspObbligazioneScadenzario().getPg_obbligazione() != null){
					  throw new ApplicationException("Scollegare prima gli impegni collegati all'ordine prima di procedere alla cancellazione.");
				}
				if (riga != null){
					for (java.util.Iterator c= riga.getRigheConsegnaColl().iterator(); c.hasNext();) {
						OggettoBulk consbulk= (OggettoBulk) c.next();
						OrdineAcqConsegnaBulk cons= (OrdineAcqConsegnaBulk) consbulk;
						if (cons.getObbligazioneScadenzario() != null && cons.getObbligazioneScadenzario().getPg_obbligazione() != null){
							  throw new ApplicationException("Scollegare prima gli impegni collegati all'ordine prima di procedere alla cancellazione.");
						}
					}
				}
			}
	            
			ordine.setAnnullato(DateServices.getDt_valida(aUC));
			ordine.setToBeUpdated();
			makeBulkPersistent( aUC, ordine);
			return ordine;
	    } catch (Exception e) {
	        throw handleException(e);
	    }

		}
public Unita_organizzativaBulk recuperoUoPerImpegno
(
		UserContext aUC,
		OrdineAcqConsegnaBulk consegna)
				throws ComponentException {
	try {
		if (!isUoImpegnoDaUopDestinazione(aUC)){
			return recuperoUoOrdinante(aUC, consegna);
		} else {
			if (!consegna.isToBeDeleted()) {
				if (!consegna.isConsegnaMagazzino()){
					if (consegna.getCdUopDest() != null){
						UnitaOperativaOrdBulk uop = recuperoUopDest(aUC, consegna);
						if (uop != null){
							return uop.getUnitaOrganizzativa();
						}
					} else {
						throw new ApplicationException("E' necessario indicare l'unità operativa per la consegna "+consegna.getConsegna() + " della riga "+consegna.getRiga());
					}
				} else {
					if (consegna.getCdMagazzino() != null && consegna.getCdCdsMag() != null){
						MagazzinoBulk magazzino = recuperoMagazzino(aUC, consegna);
						if (magazzino != null && magazzino.getCdUnitaOperativa() != null){
							UnitaOperativaOrdBulk uop = recuperoUop(aUC, magazzino.getUnitaOperativaOrd());
							if (uop != null){
								return uop.getUnitaOrganizzativa();
							}
						} else {
							return recuperoUoOrdinante(aUC, consegna);
						}
					} else {
						throw new ApplicationException("E' necessario indicare il magazzino per la consegna "+consegna.getConsegna() + " della riga "+consegna.getRiga());
					}
				}
			}
		}
	} catch (Exception e) {
		throw handleException(e);
	}
	return null;
}

private Unita_organizzativaBulk recuperoUoOrdinante(UserContext aUC, OrdineAcqConsegnaBulk consegna)
		throws ComponentException, PersistencyException {
	UnitaOperativaOrdBulk uop = recuperoUop(aUC, consegna.getOrdineAcqRiga().getOrdineAcq().getUnitaOperativaOrd());
	if (uop != null){
		return uop.getUnitaOrganizzativa();
	}
	throw new ApplicationException("Non è stato possibile recuperare l'unita' organizzativa ordinante");
}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy