/*
 * 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 <https://www.gnu.org/licenses/>.
 */

package it.cnr.contab.docamm00.actions;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Vector;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.ejb.EJBException;

import it.cnr.contab.util.enumeration.TipoIVA;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import it.cnr.contab.anagraf00.core.bulk.AnagraficoBulk;
import it.cnr.contab.anagraf00.core.bulk.BancaBulk;
import it.cnr.contab.anagraf00.core.bulk.TerzoBulk;
import it.cnr.contab.anagraf00.tabrif.bulk.Rif_modalita_pagamentoBulk;
import it.cnr.contab.compensi00.bp.CRUDCompensoBP;
import it.cnr.contab.compensi00.docs.bulk.CompensoBulk;
import it.cnr.contab.compensi00.docs.bulk.V_terzo_per_compensoBulk;
import it.cnr.contab.config00.bulk.CigBulk;
import it.cnr.contab.config00.pdcfin.bulk.Elemento_voceBulk;
import it.cnr.contab.docamm00.bp.CRUDFatturaPassivaBP;
import it.cnr.contab.docamm00.bp.CRUDFatturaPassivaIBP;
import it.cnr.contab.docamm00.bp.CRUDNotaDiCreditoBP;
import it.cnr.contab.docamm00.bp.CRUDNotaDiDebitoBP;
import it.cnr.contab.docamm00.bp.ContabilizzaOrdineBP;
import it.cnr.contab.docamm00.bp.IDocumentoAmministrativoBP;
import it.cnr.contab.docamm00.bp.IDocumentoAmministrativoSpesaBP;
import it.cnr.contab.docamm00.bp.RisultatoEliminazioneBP;
import it.cnr.contab.docamm00.bp.TitoloDiCreditoDebitoBP;
import it.cnr.contab.docamm00.docs.bulk.AssociazioniInventarioTable;
import it.cnr.contab.docamm00.docs.bulk.CarichiInventarioTable;
import it.cnr.contab.docamm00.docs.bulk.Fattura_passivaBulk;
import it.cnr.contab.docamm00.docs.bulk.Fattura_passiva_IBulk;
import it.cnr.contab.docamm00.docs.bulk.Fattura_passiva_rigaBulk;
import it.cnr.contab.docamm00.docs.bulk.Fattura_passiva_rigaIBulk;
import it.cnr.contab.docamm00.docs.bulk.Filtro_ricerca_obbligazioniVBulk;
import it.cnr.contab.docamm00.docs.bulk.IDocumentoAmministrativoBulk;
import it.cnr.contab.docamm00.docs.bulk.Lettera_pagam_esteroBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_creditoBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_credito_rigaBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_debitoBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_debito_rigaBulk;
import it.cnr.contab.docamm00.docs.bulk.ObbligazioniTable;
import it.cnr.contab.docamm00.docs.bulk.Risultato_eliminazioneVBulk;
import it.cnr.contab.docamm00.docs.bulk.TrovatoBulk;
import it.cnr.contab.docamm00.ejb.CategoriaGruppoInventComponentSession;
import it.cnr.contab.docamm00.ejb.FatturaPassivaComponentSession;
import it.cnr.contab.docamm00.ejb.VoceIvaComponentSession;
import it.cnr.contab.docamm00.tabrif.bulk.Bene_servizioBulk;
import it.cnr.contab.docamm00.tabrif.bulk.Categoria_gruppo_inventBulk;
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.Tipo_sezionaleBulk;
import it.cnr.contab.docamm00.tabrif.bulk.Voce_ivaBulk;
import it.cnr.contab.doccont00.bp.CRUDVirtualObbligazioneBP;
import it.cnr.contab.doccont00.core.bulk.ObbligazioneBulk;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioBulk;
import it.cnr.contab.doccont00.core.bulk.OptionRequestParameter;
import it.cnr.contab.doccont00.core.bulk.SospesoBulk;
import it.cnr.contab.doccont00.ejb.ObbligazioneAbstractComponentSession;
import it.cnr.contab.inventario00.bp.AssBeneFatturaBP;
import it.cnr.contab.inventario00.docs.bulk.Ass_inv_bene_fatturaBulk;
import it.cnr.contab.inventario00.docs.bulk.V_ass_inv_bene_fatturaBulk;
import it.cnr.contab.inventario01.bp.CRUDCaricoInventarioBP;
import it.cnr.contab.inventario01.bulk.Buono_carico_scaricoBulk;
import it.cnr.contab.inventario01.ejb.BuonoCaricoScaricoComponentSession;
import it.cnr.contab.inventario01.ejb.NumerazioneTempBuonoComponentSession;
import it.cnr.contab.ordmag.ordini.bulk.EvasioneOrdineRigaBulk;
import it.cnr.contab.ordmag.ordini.bulk.FatturaOrdineBulk;
import it.cnr.contab.ordmag.ordini.bulk.OrdineAcqConsegnaBulk;
import it.cnr.contab.utenze00.bulk.CNRUserInfo;
import it.cnr.contab.utenze00.bulk.UtenteBulk;
import it.cnr.contab.util.Utility;
import it.cnr.jada.DetailedRuntimeException;
import it.cnr.jada.action.ActionContext;
import it.cnr.jada.action.BusinessProcessException;
import it.cnr.jada.action.Forward;
import it.cnr.jada.action.HookForward;
import it.cnr.jada.bulk.FillException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.ValidationException;
import it.cnr.jada.comp.ApplicationException;
import it.cnr.jada.comp.ComponentException;
import it.cnr.jada.persistency.IntrospectionException;
import it.cnr.jada.persistency.PersistencyException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.util.RemoteIterator;
import it.cnr.jada.util.action.BulkBP;
import it.cnr.jada.util.action.CRUDBP;
import it.cnr.jada.util.action.FormBP;
import it.cnr.jada.util.action.FormField;
import it.cnr.jada.util.action.OptionBP;
import it.cnr.jada.util.action.Selection;
import it.cnr.jada.util.action.SelezionatoreListaBP;
import it.cnr.jada.util.ejb.EJBCommonServices;

public class CRUDFatturaPassivaAction extends EconomicaAction {
    private transient static final Logger logger = LoggerFactory.getLogger(CRUDFatturaPassivaAction.class);
    public CRUDFatturaPassivaAction() {
        super();
    }

    /**
     * Aggiunge sul modello corrente del target i dettagli selzionati sul documento amministrativo di origine
     * Ogni dettaglio deve essere in stato iniziale.
     */
    private java.util.Vector basicAddDetailsTo(
            ActionContext context,
            CRUDNotaDiCreditoBP target)
            throws BusinessProcessException {

        Nota_di_creditoBulk notaDiCredito = (Nota_di_creditoBulk) target.getModel();
        it.cnr.jada.bulk.BulkList dettagliNdC = notaDiCredito.getFattura_passiva_dettColl();
        if (dettagliNdC == null) {
            dettagliNdC = new it.cnr.jada.bulk.BulkList();
            notaDiCredito.setFattura_passiva_dettColl(dettagliNdC);
        }
        java.util.Vector addedElements = new java.util.Vector();
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        if (!notaDiCredito.isEditable() || target.isViewing()) {
            if (!bp.getDettaglio().getSelection().isEmpty())
                target.setErrorMessage("Uno o più dettagli non sono stati aggiunti perchè la nota di credito è già stata pagata o annullata o riportata!");
        } else {
            for (java.util.Iterator i = bp.getDettaglio().getSelection().iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) bp.getDettaglio().getDetails().get(((Integer) i.next()).intValue());

                if (!dettaglio.STATO_INIZIALE.equals(dettaglio.getStato_cofi())) {
                    Nota_di_credito_rigaBulk dettaglioNdC = new Nota_di_credito_rigaBulk();
                    dettaglioNdC.setNotaDiCredito(notaDiCredito);
                    try {
                        try {
                            if (((FatturaPassivaComponentSession) bp.createComponentSession()).isBeneServizioPerSconto(context.getUserContext(), dettaglio))
                                throw new it.cnr.jada.bulk.FillException("Uno dei dettagli selezionati è un \"bene sconto\". Dettaglio non aggiunto.");
                        } catch (ComponentException exc) {
                            throw new BusinessProcessException(exc);
                        } catch (java.rmi.RemoteException exc) {
                            throw new BusinessProcessException(exc);
                        }
                        dettaglioNdC.copyFrom(dettaglio);
                        if (!isRigaContainedInDetails(dettaglioNdC, dettagliNdC)) {
                            dettaglioNdC.setUser(context.getUserInfo().getUserid());
                            dettagliNdC.add(dettaglioNdC);
                            addedElements.add(dettaglioNdC);
                        }
                    } catch (it.cnr.jada.bulk.FillException e) {
                        target.setErrorMessage("Uno o più dettagli non sono stati aggiunti o per mancanza di disponibiltà o perchè il bene contenuto è di tipo sconto/abbuono!");
                    }
                }
            }
        }

        if (!addedElements.isEmpty() && notaDiCredito.isToBeCreated()) {
            //try {
            //java.math.BigDecimal totNdC = notaDiCredito.getIm_totale_fattura().add(calcolaTotaleSelezionati(addedElements));
            //notaDiCredito.setIm_totale_fattura(totNdC);
            //} catch (it.cnr.jada.comp.ApplicationException e) {
            //notaDiCredito.setIm_totale_fattura(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
            //}
            notaDiCredito.setIm_totale_fattura(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
            notaDiCredito.calcolaTotaleFatturaFornitoreInEur();
        }
        return addedElements;
    }

    /**
     * Aggiunge sul modello corrente del target i dettagli selzionati sul documento amministrativo di origine
     * Ogni dettaglio deve essere in stato iniziale.
     */

    private java.util.Vector basicAddDetailsTo(ActionContext context, CRUDNotaDiDebitoBP target)
            throws BusinessProcessException {

        Nota_di_debitoBulk notaDiDebito = (Nota_di_debitoBulk) target.getModel();
        it.cnr.jada.bulk.BulkList dettagliNdD = notaDiDebito.getFattura_passiva_dettColl();
        if (dettagliNdD == null) {
            dettagliNdD = new it.cnr.jada.bulk.BulkList();
            notaDiDebito.setFattura_passiva_dettColl(dettagliNdD);
        }
        java.util.Vector addedElements = new java.util.Vector();
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        if (!notaDiDebito.isEditable() || target.isViewing()) {
            if (!bp.getDettaglio().getSelection().isEmpty())
                target.setErrorMessage("Uno o più dettagli non sono stati aggiunti perchè la nota di debito è già stata pagata o annullata o riportata!");
        } else {
            for (java.util.Iterator i = bp.getDettaglio().getSelection().iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) bp.getDettaglio().getDetails().get(((Integer) i.next()).intValue());

                if (!dettaglio.STATO_INIZIALE.equals(dettaglio.getStato_cofi())) {
                    Nota_di_debito_rigaBulk dettaglioNdD = new Nota_di_debito_rigaBulk();
                    dettaglioNdD.setNotaDiDebito(notaDiDebito);
                    try {
                        try {
                            if (((FatturaPassivaComponentSession) bp.createComponentSession()).isBeneServizioPerSconto(context.getUserContext(), dettaglio))
                                throw new it.cnr.jada.bulk.FillException("Uno dei dettagli selezionati è un \"bene sconto\". Dettaglio non aggiunto.");
                        } catch (ComponentException exc) {
                            throw new BusinessProcessException(exc);
                        } catch (java.rmi.RemoteException exc) {
                            throw new BusinessProcessException(exc);
                        }
                        dettaglioNdD.copyFrom(dettaglio);
                        if (!isRigaContainedInDetails(dettaglioNdD, dettagliNdD)) {
                            dettaglioNdD.setUser(context.getUserInfo().getUserid());
                            dettagliNdD.add(dettaglioNdD);
                            addedElements.add(dettaglioNdD);
                        }
                    } catch (it.cnr.jada.bulk.FillException e) {
                        target.setErrorMessage("Uno o più dettagli non sono stati aggiunti o per mancanza di disponibiltà o perchè il bene contenuto è di tipo sconto/abbuono!");
                    }
                }
            }
        }

        if (!addedElements.isEmpty()) {
            //try {
            //java.math.BigDecimal totNdD = notaDiDebito.getIm_totale_fattura().add(calcolaTotaleSelezionati(addedElements));
            //notaDiDebito.setIm_totale_fattura(totNdD);
            //} catch (it.cnr.jada.comp.ApplicationException e) {
            //notaDiDebito.setIm_totale_fattura(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
            //}
            notaDiDebito.setIm_totale_fattura(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
            notaDiDebito.calcolaTotaleFatturaFornitoreInEur();
        }
        return addedElements;
    }

    /**
     * Calcola l'importo disponibile per la nota di credito
     *
     * @param context       L'ActionContext della richiesta
     * @param riga
     * @param vecchioTotale
     * @throws FillException
     */
    protected void basicCalcolaImportoDisponibileNC(
            ActionContext context,
            Fattura_passiva_rigaBulk riga,
            java.math.BigDecimal vecchioTotale)
            throws it.cnr.jada.bulk.FillException {

        Fattura_passiva_rigaIBulk rigaFP = (Fattura_passiva_rigaIBulk) riga;

        if (rigaFP.getQuantita() == null) rigaFP.setQuantita(new java.math.BigDecimal(1));
        if (rigaFP.getPrezzo_unitario() == null) rigaFP.setPrezzo_unitario(new java.math.BigDecimal(0));
        if (rigaFP.getIm_iva() == null)
            rigaFP.setIm_iva(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));

        java.math.BigDecimal nuovoTotale = rigaFP.getIm_imponibile().add(rigaFP.getIm_iva()).add(rigaFP.getIm_totale_addebiti());
        java.util.HashMap storni = rigaFP.getFattura_passivaI().getStorniHashMap();
        if (storni == null ||
                storni.get(rigaFP) == null ||
                ((java.util.List) storni.get(rigaFP)).isEmpty())
            rigaFP.setIm_diponibile_nc(nuovoTotale);
        else {
            java.math.BigDecimal impStorni = vecchioTotale.subtract(rigaFP.getIm_diponibile_nc());
            java.math.BigDecimal impDisponibile = nuovoTotale.subtract(impStorni);
            if (impDisponibile.signum() < 0)
                throw new it.cnr.jada.bulk.FillException("Attenzione: l'importo totale di riga (" + nuovoTotale + ") è inferiore all'importo totale di " + impStorni + " degli storni ad essa associati!");
            rigaFP.setIm_diponibile_nc(impDisponibile);
        }
    }

    /**
     * Apre il pannello delle note di credito sul modello passato 'notaDiCebito' e nel
     * caso in cui alcune righe sono selezionate in fattura, cerca di aggiungerle come
     * dettagli della nota di credito stessa ('basicAddDetailsTo').
     */

    private Forward basicDoApriNotaDiCredito(
            ActionContext context,
            Nota_di_creditoBulk notaDiCredito)
            throws it.cnr.jada.comp.ApplicationException {

        try {
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
            if (bp.isDirty() && bp.getDettaglio().getSelection().size() != 0)
                throw new it.cnr.jada.comp.ApplicationException("Il documento risulta modificato! Per continuare o salvare o deselezionare i dettagli da aggiungere alla nota di credito e ricercarli successivamente.");

            //Assolutamente necessario eseguirlo DOPO i controlli
            bp.rollbackUserTransaction();

            String status = bp.isEditing() ? "M" : "V";
            CRUDNotaDiCreditoBP notaBp = (CRUDNotaDiCreditoBP) context.createBusinessProcess("CRUDNotaDiCreditoBP", new Object[]{status + "Tn"});

            if (notaDiCredito.getCrudStatus() == notaDiCredito.NORMAL) {
                notaBp.edit(context, notaDiCredito);
                notaDiCredito = (Nota_di_creditoBulk) notaBp.getModel();
            } else {
                notaDiCredito.setDt_termine_creazione_docamm(((Fattura_passivaBulk) notaBp.getModel()).getDt_termine_creazione_docamm());
                notaBp.setModel(context, notaDiCredito);
            }

            basicAddDetailsTo(context, notaBp);

            notaBp.setAutoGenerated(Boolean.TRUE);

            context.addHookForward("chiusuraNotaDiCredito", this, "doChiusuraNotaDiCredito");

            return context.addBusinessProcess(notaBp);

        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * Apre il pannello delle note di debito sul modello passato 'notaDiDebito' e nel
     * caso in cui alcune righe sono selezionate in fattura, cerca di aggiungerle come
     * dettagli della nota di debito stessa ('basicAddDetailsTo').
     */

    private Forward basicDoApriNotaDiDebito(
            ActionContext context,
            Nota_di_debitoBulk notaDiDebito)
            throws it.cnr.jada.comp.ApplicationException {

        try {
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
            if (bp.isDirty() && bp.getDettaglio().getSelection().size() != 0)
                throw new it.cnr.jada.comp.ApplicationException("Il documento risulta modificato! Per continuare o salvare o deselezionare i dettagli da aggiungere alla nota di debito e ricercarli successivamente.");

            //Assolutamente necessario eseguirlo DOPO i controlli
            bp.rollbackUserTransaction();

            String status = bp.isEditing() ? "M" : "V";
            CRUDNotaDiDebitoBP notaBp = (CRUDNotaDiDebitoBP) context.createBusinessProcess("CRUDNotaDiDebitoBP", new Object[]{status + "Tn"});

            if (notaDiDebito.getCrudStatus() == notaDiDebito.NORMAL) {
                notaBp.edit(context, notaDiDebito);
                notaDiDebito = (Nota_di_debitoBulk) notaBp.getModel();
            } else {
                notaDiDebito.setDt_termine_creazione_docamm(((Fattura_passivaBulk) notaBp.getModel()).getDt_termine_creazione_docamm());
                notaBp.setModel(context, notaDiDebito);
            }

            basicAddDetailsTo(context, notaBp);

            notaBp.setAutoGenerated(Boolean.TRUE);

            context.addHookForward("chiusuraNotaDiDebito", this, "doChiusuraNotaDiDebito");
            return context.addBusinessProcess(notaBp);

        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce l'associazione della scadenza riportata con il documento amm.
     * Se non esiste l'aggiunge, altrimenti sincronizza l'istanza già presente
     *
     * @param context   L'ActionContext della richiesta
     * @param newObblig scadenza selezionata dall'utente con riporta
     * @return Il Forward alla pagina di risposta
     */
    protected Forward basicDoBringBackOpenObbligazioniWindow(
            ActionContext context,
            Obbligazione_scadenzarioBulk newObblig) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        try {
            TerzoBulk creditore = newObblig.getObbligazione().getCreditore();
            Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
            if (!fp.getFornitore().equalsByPrimaryKey(creditore) &&
                    !AnagraficoBulk.DIVERSI.equalsIgnoreCase(creditore.getAnagrafico().getTi_entita()))
                throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata deve appartenere ad un'obbligazione che ha come creditore il fornitore della fattura!");
/* 	Rospuc 15/01/2015 Controllo SOSPESO  compatibilità dell'obbligazione con il titolo capitolo selezionato
       SOSPESO PER ESERCIZIO 2015	*/
            if (fp instanceof Fattura_passiva_IBulk) {
                java.util.List dettagliDaContabilizzare = (java.util.List) fp.getObbligazioniHash().get(newObblig);
                if (dettagliDaContabilizzare != null && !dettagliDaContabilizzare.isEmpty()) {
                    List titoloCapitoloValidolist = controllaSelezionePerTitoloCapitoloLista(context, dettagliDaContabilizzare.iterator());
                    Elemento_voceBulk titoloCapitoloObbligazione = newObblig.getObbligazione().getElemento_voce();
                    //Controllo la compatibilità dell'obbligazione con il titolo capitolo selezionato
                    Boolean compatibile = null;
                    if (titoloCapitoloValidolist != null && titoloCapitoloValidolist.size() != 0)
                        for (Iterator i = titoloCapitoloValidolist.iterator(); (i.hasNext() && (compatibile == null || !compatibile)); ) {
                            Categoria_gruppo_voceBulk bulk = (Categoria_gruppo_voceBulk) i.next();
                            if (bulk.getCd_elemento_voce().compareTo(titoloCapitoloObbligazione.getCd_elemento_voce()) == 0)
                                compatibile = new Boolean(true);
                            else
                                compatibile = new Boolean(false);
                        }
                    if (compatibile != null && !compatibile)
                        throw new it.cnr.jada.comp.ApplicationException("L'impegno selezionato non è compatibile con il titolo capitolo della categoria");//+ titoloCapitoloValido.getCd_ds_elemento_voce() + "\"!");
                }
            }

            Obbligazione_scadenzarioBulk obbligazione = (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel();
            if (obbligazione != null) {
                resyncObbligazione(context, obbligazione, newObblig);
            } else {
                basicDoContabilizza(context, newObblig, null);
            }
        } catch (Throwable t) {
            it.cnr.contab.doccont00.core.bulk.IDefferUpdateSaldi defSaldiBulk = bp.getDefferedUpdateSaldiParentBP().getDefferedUpdateSaldiBulk();
            if (newObblig.getObbligazione().getPg_ver_rec().equals((Long) newObblig.getObbligazione().getSaldiInfo().get("pg_ver_rec")))
                defSaldiBulk.removeFromDefferredSaldi(newObblig.getObbligazione());
            try {
                CRUDVirtualObbligazioneBP.rollbackToSafePoint(context);
            } catch (Exception e) {
                handleException(context, e);
            }
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Viene richiamato nel momento in cui si seleziona una valuta dal combo Valuta nella
     * testata della fattura.
     * Richiama a sua volta il metodo cercaCambio dalla component.
     */
    private void basicDoCalcolaTotaleFatturaFornitoreInEur(Fattura_passivaBulk fattura) {

        if (fattura != null)
            fattura.calcolaTotaleFatturaFornitoreInEur();
    }

    /**
     * Calcola i totali del dettaglio 'riga' e se necessario aggiorna l'importo disp
     * per le note di credito relativo al dettaglio stesso
     */

    protected void basicDoCalcolaTotaliDiRiga(
            ActionContext context,
            Fattura_passiva_rigaBulk riga,
            java.math.BigDecimal vecchioTotale)
            throws it.cnr.jada.bulk.FillException {

        if (riga.getQuantita() == null) riga.setQuantita(new java.math.BigDecimal(1));
        if (riga.getPrezzo_unitario() == null) riga.setPrezzo_unitario(new java.math.BigDecimal(0));
        if (riga.getIm_iva() == null)
            riga.setIm_iva(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));

        riga.setFl_iva_forzata(Boolean.FALSE);
        riga.calcolaCampiDiRiga();
        if (riga instanceof Fattura_passiva_rigaIBulk)
            basicCalcolaImportoDisponibileNC(context, (Fattura_passiva_rigaIBulk) riga, vecchioTotale);
        doSelectObbligazioni(context);
    }

    /**
     * Gestisce una richiesta di ricerca.
     * <p>
     * L'implementazione di default utilizza il metodo astratto <code>read</code>
     * di <code>CRUDBusinessProcess</code>.
     * Se la ricerca fornisce più di un risultato viene creato un
     * nuovo <code>SelezionatoreListaBP</code> per la selezione di un elemento.
     * Al business process viene anche chiesto l'elenco delle colonne da
     * visualizzare.
     */
    protected Forward basicDoCerca(ActionContext context) throws java.rmi.RemoteException, InstantiationException, javax.ejb.RemoveException {
        try {
            fillModel(context);
            CRUDBP bp = getBusinessProcess(context);
            OggettoBulk model = (OggettoBulk) bp.getModel();
            it.cnr.jada.util.RemoteIterator ri = bp.find(context, null, model);
            if (ri == null || ri.countElements() == 0) {
                it.cnr.jada.util.ejb.EJBCommonServices.closeRemoteIterator(context, ri);
                bp.setMessage("La ricerca non ha fornito alcun risultato.");
                return context.findDefaultForward();
                //} else if (ri.countElements() == 1) {
                //OggettoBulk bulk = (OggettoBulk)ri.nextElement();
                //return basicDoRiportaSelezione(context, bulk);
            } else {
                bp.setModel(context, model);
                SelezionatoreListaBP nbp = (SelezionatoreListaBP) context.createBusinessProcess("Selezionatore");
                nbp.setIterator(context, ri);
                nbp.setBulkInfo(bp.getBulkInfo());
                nbp.setColumns(getBusinessProcess(context).getSearchResultColumns());
                context.addHookForward("seleziona", this, "doRiportaSelezione");
                return context.addBusinessProcess(nbp);
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce la contabilizzazione dei dettagli selezionati, cioè crea
     * l'associazione della scadenza riportata con i dettagli selezionati.
     * Se non esiste la scadenza viene aggiunta, altrimenti aggiunge alla
     * scadenza esistente il dettaglio risincronizzando infine le istanze
     * e ricalcolando i totali di scadenza
     */

    private void basicDoContabilizza(
            ActionContext context,
            Obbligazione_scadenzarioBulk obbligazione,
            java.util.List selectedModels)
            throws it.cnr.jada.comp.ComponentException {

        if (obbligazione != null && selectedModels != null) {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();

            java.util.Vector dettagliDaContabilizzare = new java.util.Vector();
            dettagliDaContabilizzare.addAll(selectedModels);
            ObbligazioniTable obbs = ((Fattura_passivaBulk) bp.getModel()).getObbligazioniHash();
            if (obbs != null) {
                java.util.List dettagliContabilizzati = (java.util.List) obbs.get(obbligazione);
                if (dettagliContabilizzati != null && !dettagliContabilizzati.isEmpty())
                    dettagliDaContabilizzare.addAll(dettagliContabilizzati);
            }
            //Elemento_voceBulk titoloCapitoloValido = controllaSelezionePerTitoloCapitolo(context, dettagliDaContabilizzare.iterator());
            Elemento_voceBulk titoloCapitoloObbligazione = obbligazione.getObbligazione().getElemento_voce();

            // MI - controllo se l'obbligazione ha voce coerente con il tipo di bene
            if (selectedModels != null && !selectedModels.isEmpty()) {
                for (java.util.Iterator i = selectedModels.iterator(); i.hasNext(); ) {
                    Object rigaObj = i.next();
                    if (rigaObj instanceof Fattura_passiva_rigaIBulk) {
                        Fattura_passiva_rigaIBulk fpRiga = (Fattura_passiva_rigaIBulk) rigaObj;
                        if (!titoloCapitoloObbligazione.getFl_inv_beni_patr().equals(fpRiga.getBene_servizio().getFl_gestione_inventario())) {
                            final Optional<Boolean> flGestioneInventario = Optional.ofNullable(fpRiga)
                                    .flatMap(fattura_passiva_rigaIBulk -> Optional.ofNullable(fattura_passiva_rigaIBulk.getBene_servizio()))
                                    .flatMap(bene_servizioBulk -> Optional.ofNullable(bene_servizioBulk.getFl_gestione_inventario()));
                            if (flGestioneInventario.isPresent() && flGestioneInventario.get())
                                throw new it.cnr.jada.comp.ApplicationException("Il titolo capitolo dell'impegno selezionato non è utilizzabile per beni patrimoniali da inventariare!");
                            else
                                throw new it.cnr.jada.comp.ApplicationException("Il titolo capitolo dell'impegno selezionato non è utilizzabile per beni/servizi da non inventariare!");
                        }
                    }
                }
            }
            try {
                List titoloCapitoloValidolist;
                if (dettagliDaContabilizzare != null && !dettagliDaContabilizzare.isEmpty()) {
                    titoloCapitoloValidolist = controllaSelezionePerTitoloCapitoloLista(context, dettagliDaContabilizzare.iterator());

                    //Controllo la compatibilità dell'obbligazione con il titolo capitolo selezionato
                    Boolean compatibile = null;
                    if (titoloCapitoloValidolist != null && titoloCapitoloValidolist.size() != 0)
                        for (Iterator i = titoloCapitoloValidolist.iterator(); (i.hasNext() && (compatibile == null || !compatibile)); ) {
                            Categoria_gruppo_voceBulk bulk = (Categoria_gruppo_voceBulk) i.next();
                            if (bulk.getCd_elemento_voce().compareTo(titoloCapitoloObbligazione.getCd_elemento_voce()) == 0)
                                compatibile = new Boolean(true);
                            else
                                compatibile = new Boolean(false);
                        }
                    if (compatibile != null && !compatibile)
                        throw new it.cnr.jada.comp.ApplicationException("L'impegno selezionato non è compatibile con il titolo capitolo della categoria");//+ titoloCapitoloValido.getCd_ds_elemento_voce() + "\"!");
                }
            } catch (PersistencyException e1) {
                bp.handleException(e1);
            } catch (IntrospectionException e1) {
                bp.handleException(e1);
            } catch (RemoteException e1) {
                bp.handleException(e1);
            } catch (BusinessProcessException e1) {
                bp.handleException(e1);
            }
        /*	Rospuc 15/01/2015 Controllo SOSPESO  compatibilità dell'obbligazione con il titolo capitolo selezionato
		    SOSPESO PER ESERCIZIO 2015
		//Controllo la compatibilità dell'obbligazione con il titolo capitolo selezionato
		if (titoloCapitoloValido != null &&
			!(titoloCapitoloObbligazione.getCd_elemento_voce().startsWith(titoloCapitoloValido.getCd_elemento_voce()) ||
			titoloCapitoloValido.getCd_elemento_voce().startsWith(titoloCapitoloObbligazione.getCd_elemento_voce())))
			throw new it.cnr.jada.comp.ApplicationException("L'impegno selezionato non è compatibile con il titolo capitolo \"" + titoloCapitoloValido.getCd_ds_elemento_voce() + "\"!");
		 */
            try {
                FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                Fattura_passivaBulk fattura = h.contabilizzaDettagliSelezionati(
                        context.getUserContext(),
                        (Fattura_passivaBulk) bp.getModel(),
                        selectedModels,
                        obbligazione);
                try {
                    bp.setModel(context, fattura);
                    bp.setDirty(true);

                    doCalcolaTotalePerObbligazione(context, obbligazione);
                	if (!(fattura.isEstera() || fattura.isSanMarinoConIVA() || fattura.isSanMarinoSenzaIVA()) && 
                		!(obbligazione != null && obbligazione.getObbligazione() != null && obbligazione.getObbligazione().getContratto() != null && obbligazione.getObbligazione().getContratto().getCig() != null
                				&& obbligazione.getObbligazione().getContratto().getCig().getCdCig() != null)) {
                        bp.setMessage("L'impegno selezionato non ha il CIG. Indicare il CIG.");
                	}
                } catch (BusinessProcessException e) {
                }
            } catch (java.rmi.RemoteException e) {
                bp.handleException(e);
            } catch (BusinessProcessException e) {
                bp.handleException(e);
            }
        }
    }

    /**
     * Creo una nuova istanza di nota di credito e ne richiedo l'apertura con il
     * metodo 'basicDoApriNotaDiCredito'
     */

    private Forward basicDoGeneraNotaDiCredito(ActionContext context)
            throws ComponentException, BusinessProcessException {

        CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();

        Integer esercizioScrivania = it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext());
        Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) bp.getModel();

        if (fp.isRiportata() && esercizioScrivania.intValue() == fp.getEsercizio().intValue())
            throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di credito per fatture riportate!");

        // Gennaro Borriello - (02/11/2004 16.48.21)
        // 	Fix sul controllo dello "Stato Riportato": controlla che il documento sia stato
        //	riportato DA UN ES. PRECEDENTE a quello di scrivania.
        // RP 16/03/2010 Da commentare per generare NC di fatture di anni precedenti
        //else if (!fp.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(fp.getRiportataInScrivania()) && esercizioScrivania.intValue() != fp.getEsercizio().intValue())
        //throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di credito per fatture non completamente riportate nell'esercizio di scrivania!");

        //if (fp.isRiportata() && !fp.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(fp.getRiportata()))
        //throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di credito per fatture non riportate completamente!");
        try {
            java.sql.Timestamp date = it.cnr.jada.util.ejb.EJBCommonServices.getServerDate();
            int annoSolare = fp.getDateCalendar(date).get(java.util.Calendar.YEAR);
            if (annoSolare != esercizioScrivania.intValue())
                throw new it.cnr.jada.comp.ApplicationException("Non è possibile inserire note di credito in esercizi non corrispondenti all'anno solare!");
        } catch (javax.ejb.EJBException e) {
            return handleException(context, e);
        }

        //Rimanadato a basicDoApriNotaDiCredito
        //bp.rollbackUserTransaction();

        Nota_di_creditoBulk notaDiCredito = new Nota_di_creditoBulk(
                fp,
                esercizioScrivania);
        creaEsercizioPerFatturaFornitore(context, notaDiCredito);

        return basicDoApriNotaDiCredito(context, notaDiCredito);
    }

    /**
     * Creo una nuova istanza di nota di debito e ne richiedo l'apertura con il
     * metodo 'basicDoApriNotaDiDebito'
     */

    private Forward basicDoGeneraNotaDiDebito(ActionContext context)
            throws ComponentException, BusinessProcessException {

        CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();

        Integer esercizioScrivania = it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext());
        Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) bp.getModel();

        if (fp.isRiportata() && esercizioScrivania.intValue() == fp.getEsercizio().intValue())
            throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di debito per fatture riportate!");

        // Gennaro Borriello - (02/11/2004 16.48.21)
        // 	Fix sul controllo dello "Stato Riportato": controlla che il documento sia stato
        //	riportato DA UN ES. PRECEDENTE a quello di scrivania.
//	else if (!fp.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(fp.getRiportataInScrivania()) && esercizioScrivania.intValue() != fp.getEsercizio().intValue())
//		throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di credito per fatture non completamente riportate nell'esercizio di scrivania!");

        //if (fp.isRiportata() && !fp.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(fp.getRiportata()))
        //throw new it.cnr.jada.comp.ApplicationException("Non è possibile generare note di debito per fatture non riportate completamente!");
        try {
            java.sql.Timestamp date = it.cnr.jada.util.ejb.EJBCommonServices.getServerDate();
            int annoSolare = fp.getDateCalendar(date).get(java.util.Calendar.YEAR);
            if (annoSolare != esercizioScrivania.intValue())
                throw new it.cnr.jada.comp.ApplicationException("Non è possibile inserire note di debito in esercizi non corrispondenti all'anno solare!");
        } catch (javax.ejb.EJBException e) {
            return handleException(context, e);
        }

        //Rimanadato a basicDoApriNotaDiDebito
        //bp.rollbackUserTransaction();

        Nota_di_debitoBulk notaDiDebito = new Nota_di_debitoBulk(
                fp,
                esercizioScrivania);
        creaEsercizioPerFatturaFornitore(context, notaDiDebito);

        return basicDoApriNotaDiDebito(context, notaDiDebito);
    }

    /**
     * creo una nuova istanza di buono di carico; lo inizializzo, aggiungo i dettagli
     * selezionati e ne richiedo l'apertura. Se esistevano già dei buoni di carico, li
     * elimino
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     * @throws BusinessProcessException
     * @throws ComponentException
     * @throws RemoteException          Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward basicDoInventariaDettagli(ActionContext context)
            throws BusinessProcessException,
            ComponentException,
            java.rmi.RemoteException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        CarichiInventarioTable carichi = fattura.getCarichiInventarioHash();
        if (carichi != null && !carichi.isEmpty()) {
            BuonoCaricoScaricoComponentSession h = (BuonoCaricoScaricoComponentSession) bp.createComponentSession(
                    "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                    BuonoCaricoScaricoComponentSession.class);
            for (java.util.Enumeration e = ((CarichiInventarioTable) carichi.clone()).keys(); e.hasMoreElements(); ) {
                Buono_carico_scaricoBulk buono = (Buono_carico_scaricoBulk) e.nextElement();
                buono.setToBeDeleted();
                h.eliminaConBulk(context.getUserContext(), buono);
                carichi.remove(buono);
            }
            for (java.util.Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) i.next();
                if (riga.isInventariato() && !fattura.getHa_beniColl()) riga.setInventariato(false);
            }
        }

        java.util.List dettagliDaInventariare = getDettagliDaInventariare(context, bp.getDettaglio().getDetails().iterator());
        if (dettagliDaInventariare != null && !dettagliDaInventariare.isEmpty()) {
            CRUDCaricoInventarioBP ibp = (CRUDCaricoInventarioBP) context.createBusinessProcess("CRUDCaricoInventarioBP", new Object[]{"MRSWTh"});
            Buono_carico_scaricoBulk bcs = new Buono_carico_scaricoBulk();
            ibp.setBy_fattura(true);
            bcs.setTi_documento(Buono_carico_scaricoBulk.CARICO);
            bcs.setByFattura(Boolean.TRUE);
            bcs.initializeForInsert(ibp, context);

            bcs = (it.cnr.contab.inventario01.bulk.Buono_carico_scaricoBulk) ibp.createComponentSession().inizializzaBulkPerInserimento(context.getUserContext(), bcs);
            bcs.completeFrom(dettagliDaInventariare);
            try {

                bcs.setPg_buono_c_s(((NumerazioneTempBuonoComponentSession) EJBCommonServices.createEJB(
                        "CNRINVENTARIO01_EJB_NumerazioneTempBuonoComponentSession",
                        NumerazioneTempBuonoComponentSession.class)).getNextTempPG(context.getUserContext(), bcs));

            } catch (Throwable e) {
                throw new ComponentException(e);
            }
            ibp.setModel(context, bcs);
            ibp.setStatus(ibp.INSERT);
            ibp.setDirty(false);
            ibp.resetChildren(context);

            context.addHookForward("bringback", this, "doBringBackInventariaDettagli");
            HookForward hook = (HookForward) context.findForward("bringback");
            hook.addParameter("dettagliDaInventariare", dettagliDaInventariare);
            return context.addBusinessProcess(ibp);
        }
        bp.setMessage("Nessun dettaglio è inventariabile o tutti i dettagli inventariabili sono già stati caricati!");
        return context.findDefaultForward();
    }

    public Forward basicDoAssociaDettagli(ActionContext context)
            throws BusinessProcessException,
            ComponentException,
            java.rmi.RemoteException, PersistencyException, IntrospectionException, EJBException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();


        for (java.util.Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
            Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) i.next();
            AssociazioniInventarioTable associazioni = fattura.getAssociazioniInventarioHash();
            if ((associazioni != null && !associazioni.isEmpty()) || (riga.getCrudStatus() != OggettoBulk.TO_BE_CREATED)) {
                Ass_inv_bene_fatturaBulk ass = fattura.getAssociationWithInventarioFor(riga);
                if ((ass != null) && !ass.isPerAumentoValore()) {
					/*
					R.p. Non elimino le associazioni gia' fatte
					Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk)riga;
					FatturaPassivaComponentSession h = (FatturaPassivaComponentSession)bp.createComponentSession();
					h.rimuoviDaAssociazioniInventario(
												context.getUserContext(),
												dettaglio,
												ass);
					fattura.removeFromAssociazioniInventarioHash(ass, dettaglio);*/

                    if (riga.isInventariato()) riga.setInventariato(false);
                } else if (riga.getCrudStatus() != OggettoBulk.TO_BE_CREATED && (riga.getBene_servizio().getFl_gestione_inventario().booleanValue())) {
                    riga.setInventariato(false);
                }
            }
        }//ricerca
        java.util.List dettagliDaInventariare = getDettagliDaInventariare(context, bp.getDettaglio().getDetails().iterator());
        if (dettagliDaInventariare != null && !dettagliDaInventariare.isEmpty()) {
            AssBeneFatturaBP ibp = (AssBeneFatturaBP) context.getUserInfo().createBusinessProcess(context, "AssBeneFatturaBP", new Object[]{"MRSWTh"});
            Ass_inv_bene_fatturaBulk associa = new Ass_inv_bene_fatturaBulk();
            associa.setLocal_transactionID(ibp.getLocalTransactionID(context.getUserContext(), true));
            associa.completeFrom(dettagliDaInventariare);
            associa.setInventario(((BuonoCaricoScaricoComponentSession) EJBCommonServices.createEJB(
                    "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                    BuonoCaricoScaricoComponentSession.class)).caricaInventario(context.getUserContext()));

            ibp.setModel(context, associa);
            ibp.setDirty(false);
            context.addHookForward("bringback", this, "doBringBackAssociaInventario");
            HookForward hook = (HookForward) context.findForward("bringback");
            hook.addParameter("dettagliDaInventariare", dettagliDaInventariare);
            return context.addBusinessProcess(ibp);
        } else {  //R.P. MODIFICA BENI già ASSOCIATI(IN SOSPESO)
            if (fattura.getCrudStatus() != OggettoBulk.TO_BE_CREATED) {
                List dettagli = bp.getDettaglio().getDetails();
                for (Iterator i = dettagli.iterator(); i.hasNext(); ) {
                    if (dettagli.get(0) instanceof Fattura_passiva_rigaIBulk) {
                        Fattura_passiva_rigaIBulk riga = (Fattura_passiva_rigaIBulk) i.next();
                        if (riga.getBene_servizio().getFl_gestione_inventario().booleanValue())
                            dettagliDaInventariare.add(riga);
                    } else if (dettagli.get(0) instanceof Nota_di_credito_rigaBulk) {
                        Nota_di_credito_rigaBulk riga = (Nota_di_credito_rigaBulk) i.next();
                        if (riga.getBene_servizio().getFl_gestione_inventario().booleanValue())
                            dettagliDaInventariare.add(riga);
                    } else if (dettagli.get(0) instanceof Nota_di_debito_rigaBulk) {
                        Nota_di_debito_rigaBulk riga = (Nota_di_debito_rigaBulk) i.next();
                        if (riga.getBene_servizio().getFl_gestione_inventario().booleanValue())
                            dettagliDaInventariare.add(riga);
                    }
                }
                if (dettagliDaInventariare.size() == 0) {
                    bp.setMessage("Nessun dettaglio è inventariabile o tutti i dettagli inventariabili sono già stati caricati!");
                    return context.findDefaultForward();
                }

                AssBeneFatturaBP ibp = (AssBeneFatturaBP) context.getUserInfo().createBusinessProcess(context, "AssBeneFatturaBP", new Object[]{"MRSWTh"});
                Ass_inv_bene_fatturaBulk associa = new Ass_inv_bene_fatturaBulk();
                associa.setLocal_transactionID(ibp.getLocalTransactionID(context.getUserContext(), true));
                associa.completeFrom(dettagliDaInventariare);
                associa.setInventario(((BuonoCaricoScaricoComponentSession) EJBCommonServices.createEJB(
                        "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                        BuonoCaricoScaricoComponentSession.class)).caricaInventario(context.getUserContext()));

                ibp.setModel(context, associa);
                ibp.setDirty(false);

                context.addHookForward("bringback", this, "doBringBackAssociaInventario");
                HookForward hook = (HookForward) context.findForward("bringback");
                hook.addParameter("dettagliDaInventariare", dettagliDaInventariare);
                return context.addBusinessProcess(ibp);
            } else {
                bp.setMessage("Nessun dettaglio è inventariabile o tutti i dettagli inventariabili sono già stati caricati!");
                return context.findDefaultForward();
            }
        }
    }

    /**
     * Viene richiamato nel momento in cui si seleziona una valuta dal combo Valuta nella
     * testata della fattura.
     * Richiama a sua volta il metodo cercaCambio dalla component.
     */
    protected void basicDoOnIstituzionaleCommercialeChange(ActionContext context, Fattura_passivaBulk fattura)
            throws it.cnr.jada.comp.ComponentException {

        try {
            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) ((CRUDFatturaPassivaBP) getBusinessProcess(context)).createComponentSession();
            java.util.Vector sezionali = h.estraeSezionali(context.getUserContext(), fattura);
            fattura.setSezionali(sezionali);
            if (!getBusinessProcess(context).isSearching() &&
                    sezionali != null && !sezionali.isEmpty())
            	fattura.setTipo_sezionale((Tipo_sezionaleBulk) sezionali.firstElement());
            else
                fattura.setTipo_sezionale(null);

            if (fattura.getFattura_passiva_dettColl() != null) {
                Iterator dettagli = fattura.getFattura_passiva_dettColl().iterator();
                while (dettagli.hasNext()) {
                    Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) dettagli.next();

                    if (riga.getTi_istituz_commerc() != null && fattura.getTi_istituz_commerc() != null && !riga.getTi_istituz_commerc().equals(fattura.getTi_istituz_commerc())) {
                        riga.setTi_istituz_commerc(fattura.getTi_istituz_commerc());
                        riga.setToBeUpdated();
                    }
                }
            }
		/*commentato perchè da problemi con la fatturazione elettronica che trova già il fornitore caricato
		if (fattura.getFornitore() != null && fattura.getFornitore().getCrudStatus() == it.cnr.jada.bulk.OggettoBulk.NORMAL) {
			doBlankSearchFornitore(context, fattura);
			((it.cnr.jada.util.action.CRUDBP)context.getBusinessProcess()).setMessage("Attenzione: il fornitore non è più valido. Selezionare un altro fornitore!");
		}*/
        } catch (Throwable t) {
            throw new it.cnr.jada.comp.ComponentException(t);
        }
    }

    /**
     * Prepara e apre il filtro di ricerca per le obbligazioni valide al collegamento
     * con documenti amministrativi.
     */

    private Forward basicDoRicercaObbligazione(
            ActionContext context,
            Fattura_passivaBulk fatturaPassiva,
            java.util.List models) {

        try {
            controllaQuadraturaConti(context, fatturaPassiva);

            Filtro_ricerca_obbligazioniVBulk filtro = new Filtro_ricerca_obbligazioniVBulk();
            filtro.setData_scadenziario(fatturaPassiva.getDt_scadenza());
            filtro.setFornitore(fatturaPassiva.getFornitore());
            filtro.setIm_importo(calcolaTotaleSelezionati(models, fatturaPassiva.quadraturaInDeroga()));
            filtro.setCd_unita_organizzativa(fatturaPassiva.getCd_uo_origine());
            filtro.setHasDocumentoCompetenzaCOGEInAnnoPrecedente(fatturaPassiva.hasCompetenzaCOGEInAnnoPrecedente());
            filtro.setHasDocumentoCompetenzaCOGESoloInAnnoCorrente(
                    !fatturaPassiva.hasCompetenzaCOGEInAnnoPrecedente() &&
                            fatturaPassiva.getDateCalendar(fatturaPassiva.getDt_a_competenza_coge()).get(java.util.Calendar.YEAR) == fatturaPassiva.getEsercizio().intValue());
            if (filtro.getData_scadenziario() == null)
                filtro.setFl_data_scadenziario(Boolean.FALSE);
            if (models == null || models.isEmpty())
                filtro.setFl_importo(Boolean.FALSE);
            else {
                Fattura_passiva_rigaBulk firstRow = (Fattura_passiva_rigaBulk) models.get(0);

                //	Rospuc 15/01/2015 Controllo SOSPESO  compatibilità dell'obbligazione con il titolo capitolo selezionato
                //SOSPESO PER ESERCIZIO 2015
//			if (firstRow.getBene_servizio().getFl_gestione_inventario().booleanValue()) {
//				Elemento_voceBulk ev = getElementoVoce(context, firstRow.getBene_servizio().getCategoria_gruppo());
//				filtro.setElemento_voce(ev);
//			}
            }

            BulkBP robp = (BulkBP) context.getUserInfo().createBusinessProcess(context, "RicercaObbligazioniBP", new Object[]{"MRSWTh"});
            robp.setModel(context, filtro);
            context.addHookForward("bringback", this, "doContabilizza");
            HookForward hook = (HookForward) context.findForward("bringback");
            return context.addBusinessProcess(robp);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Prepara e apre la ricerca per l'evasione dell'ordine
     */
    private Forward basicDoRicercaEvasioneOrdine(ActionContext context, Fattura_passivaBulk fatturaPassiva, List<Fattura_passiva_rigaBulk> models, boolean manually) {
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        return Optional.ofNullable(models)
                .filter(list -> list.size() == 1 && manually)
                .map((List<Fattura_passiva_rigaBulk> list) -> {
                    try {
                        final RemoteIterator contabilizzaRigaIterator = bp.find(context, new CompoundFindClause(),
                                new EvasioneOrdineRigaBulk(), models.get(0), "contabilizzaRiga");
                        return Optional.ofNullable(contabilizzaRigaIterator)
                                .map(remoteIterator -> {
                                    try {
                                        return remoteIterator.countElements();
                                    } catch (RemoteException e) {
                                        throw new DetailedRuntimeException(e);
                                    }
                                })
                                .filter(elements -> elements != 0)
                                .map(integer -> {
                                    try {
                                        ContabilizzaOrdineBP nbp = (ContabilizzaOrdineBP) context.createBusinessProcess("ContabilizzaOrdineBP", new Object[]{"MRSWTh"});
                                        nbp.setFattura_passiva_rigaBulk(models.get(0));
                                        nbp.setMultiSelection(true);
                                        nbp.setIterator(context, contabilizzaRigaIterator);
                                        context.addHookForward("seleziona", this, "doContabilizzaOrdine");
                                        return (Forward)context.addBusinessProcess(nbp);
                                    } catch (BusinessProcessException | RemoteException e) {
                                        throw new DetailedRuntimeException(e);
                                    }
                                }).orElseGet(() -> {
                                    bp.setMessage("Non ci sono dati per i criteri impostati!");
                                    try {
                                        contabilizzaRigaIterator.close();
                                    } catch (RemoteException e) {
                                        throw new DetailedRuntimeException(e);
                                    }
                                    return context.findDefaultForward();
                                });
                    } catch (Throwable e) {
                        return handleException(context, e);
                    }
                }).orElseGet(() -> {
                    if (manually) {
                        bp.setMessage(FormBP.WARNING_MESSAGE, "Per procedere, bisogna selezionare un unico dettaglio da contabilizzare!");
                    } else {
                        final Map<Boolean, Long> result = models.stream().map(fattura_passiva_rigaBulk -> {
                            try {
                                return bp.associaOrdineRigaFattura(context, fattura_passiva_rigaBulk);
                            } catch (BusinessProcessException e) {
                                throw new DetailedRuntimeException(e);
                            }
                        }).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
                        final Long righeContabilizzate = Optional.ofNullable(result.get(true)).orElse(Long.valueOf(0));
                        if (righeContabilizzate.intValue() == models.size()) {
                            bp.setMessage(FormBP.INFO_MESSAGE,"Tutte le righe selezionate sono state contabilizzate.");
                        } else {
                            bp.setMessage(FormBP.ERROR_MESSAGE,"Sono state contabilizzate " + righeContabilizzate + " righe su " + models.size() + "! Procedere alla conatbilizzazione manuale.");
                        }
                    }
                    return context.findDefaultForward();
                });
    }
    /**
     * Contabilizza i dettagli selezionati previo controllo della selezione
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doContabilizzaOrdine(ActionContext context) {
        HookForward caller = (HookForward) context.getCaller();
        final Supplier<Stream<EvasioneOrdineRigaBulk>> selectedElements = () ->
                Optional.ofNullable(caller.getParameter("selectedElements"))
                .filter(List.class::isInstance)
                .map(List.class::cast)
                .filter(list -> !list.isEmpty())
                .map(list ->
                        list.stream()
                                .filter(EvasioneOrdineRigaBulk.class::isInstance)
                                .map(EvasioneOrdineRigaBulk.class::cast)
                ).orElse(Stream.empty());
        Optional<CRUDFatturaPassivaBP> crudFatturaPassivaBP = Optional.ofNullable(context.getBusinessProcess())
                .filter(CRUDFatturaPassivaBP.class::isInstance)
                .map(CRUDFatturaPassivaBP.class::cast);
        if (!crudFatturaPassivaBP.isPresent())
            return context.findDefaultForward();

        final Map<String, List<EvasioneOrdineRigaBulk>> collectBeneServizio = selectedElements.get().collect(
                Collectors.groupingBy(o -> o.getOrdineAcqConsegna().getOrdineAcqRiga().getCdBeneServizio())
        );
        if (collectBeneServizio.size() > 1) {
            crudFatturaPassivaBP.get().setMessage("Non è possibile collegare alla stessa riga di fattura consegne che hanno beni diversi ["
                    .concat(collectBeneServizio.keySet().stream().collect(Collectors.joining(","))).concat("]"));
            return context.findDefaultForward();
        }
        final Map<String, List<EvasioneOrdineRigaBulk>> collectCodiciIva = selectedElements.get().collect(
                Collectors.groupingBy(o -> o.getOrdineAcqConsegna().getOrdineAcqRiga().getCdVoceIva())
        );
        if (collectCodiciIva.size() > 1) {
            crudFatturaPassivaBP.get().setMessage("Non è possibile collegare alla stessa riga di fattura consegne che hanno codici iva diversi ["
                    .concat(collectCodiciIva.keySet().stream().collect(Collectors.joining(","))).concat("]"));
            return context.findDefaultForward();
        }
        try {
            Optional<Fattura_passiva_rigaBulk> fattura_passiva_rigaBulk =
                    Optional.ofNullable(crudFatturaPassivaBP.get().getDettaglio().getDetails().get(crudFatturaPassivaBP.get().getDettaglio().getSelection().getFocus()))
                    .filter(Fattura_passiva_rigaBulk.class::isInstance)
                    .map(Fattura_passiva_rigaBulk.class::cast);
            if (fattura_passiva_rigaBulk.isPresent()) {
                selectedElements.get().forEach(evasioneOrdineRigaBulk -> {
                    fattura_passiva_rigaBulk.get().setBene_servizio(Optional.ofNullable(fattura_passiva_rigaBulk.get().getBene_servizio())
                            .orElseGet(() -> evasioneOrdineRigaBulk.getOrdineAcqConsegna().getOrdineAcqRiga().getBeneServizio())
                    );
                    fattura_passiva_rigaBulk.get().setVoce_iva(Optional.ofNullable(fattura_passiva_rigaBulk.get().getVoce_iva())
                                    .orElseGet(() -> evasioneOrdineRigaBulk.getOrdineAcqConsegna().getOrdineAcqRiga().getVoce_iva())
                    );
                    fattura_passiva_rigaBulk.get().setDs_riga_fattura(Optional.ofNullable(fattura_passiva_rigaBulk.get().getDs_riga_fattura())
                            .orElseGet(() -> evasioneOrdineRigaBulk.getOrdineAcqConsegna().getOrdineAcqRiga().getBeneServizio().getDs_bene_servizio())
                    );
                    fattura_passiva_rigaBulk.get().setPrezzo_unitario(Optional.ofNullable(fattura_passiva_rigaBulk.get().getPrezzo_unitario())
                            .orElseGet(() -> evasioneOrdineRigaBulk.getOrdineAcqConsegna().getOrdineAcqRiga().getPrezzoUnitario())
                    );
                    fattura_passiva_rigaBulk.get().setQuantita(Optional.ofNullable(fattura_passiva_rigaBulk.get().getQuantita())
                            .orElseGet(() -> evasioneOrdineRigaBulk.getQuantitaEvasa())
                    );
                    doCalcolaTotaliDiRiga(context);
                    try {
                        crudFatturaPassivaBP.get().associaOrdineRigaFattura(context, evasioneOrdineRigaBulk, fattura_passiva_rigaBulk.get());
                    } catch (BusinessProcessException e) {
                        throw new DetailedRuntimeException(e);
                    }
                });
            }
            return context.findDefaultForward();
        } catch (Throwable _ex) {
            return handleException(context, _ex);
        }

    }
    /**
     * Riporta il documento amministrativo selezionato dall'utente (caso delle cancellazioni
     * di note di debito e credito)
     */
    protected Forward basicDoRiportaSelezione(ActionContext context, it.cnr.jada.bulk.OggettoBulk selezione) throws java.rmi.RemoteException {

        try {
            if (selezione != null) {
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
                bp.edit(context, selezione);
                selezione = bp.getModel();
                //if (!Fattura_passivaBulk.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(((Fattura_passivaBulk)selezione).getRiportata()) ||
                //((Fattura_passivaBulk)selezione).isCongelata())
                //throw new it.cnr.jada.comp.ApplicationException("Il documento amministrativo risulta riportato o congelato! Operazione annullata.");

                // Borriello: integrazione Err. CNR 775
                Integer esScriv = it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext());

                if ((((Fattura_passivaBulk) selezione).getEsercizio().compareTo(esScriv) == 0) && ((Fattura_passivaBulk) selezione).isRiportata()) {
                    throw new it.cnr.jada.comp.ApplicationException("Il documento amministrativo risulta (parzialmente) riportato! Operazione annullata.");
                }

                // Gennaro Borriello - (09/11/2004 18.08.57)
                //	Nuova gestione dello stato <code>getRiportata()</code>
                if ((((Fattura_passivaBulk) selezione).getEsercizio().compareTo(esScriv) != 0) && (!Fattura_passivaBulk.COMPLETAMENTE_RIPORTATO.equalsIgnoreCase(((Fattura_passivaBulk) selezione).getRiportataInScrivania()))) {
                    throw new it.cnr.jada.comp.ApplicationException("Il documento amministrativo non risulta completamente riportato! Operazione annullata.");
                }

                context.closeBusinessProcess();
                HookForward forward = (HookForward) context.findForward("bringback");
                forward.addParameter("documentoAmministrativoSelezionato", selezione);
                return forward;
            }
        } catch (Exception e) {
            return handleException(context, e);
        }
        return context.findDefaultForward();
    }

    /**
     * Calcola i totali per l'eelnco dei dettagli selezionati. Nel caso di fattura
     * vengono tolti gli importi di storno e aggiunti gli addebiti
     *
     * @param selectedModels
     * @return
     * @throws ApplicationException
     */
    protected java.math.BigDecimal calcolaTotaleSelezionati(
            java.util.List selectedModels,
            boolean escludiIVA)
            throws it.cnr.jada.comp.ApplicationException {

        java.math.BigDecimal importo = new java.math.BigDecimal(0);
        boolean escludiIVAInt = false;
        boolean escludiIVAOld = escludiIVA;
        if (selectedModels != null) {
            for (java.util.Iterator i = selectedModels.iterator(); i.hasNext(); ) {
                escludiIVA = escludiIVAOld;
                Fattura_passiva_rigaBulk rigaSelected = (Fattura_passiva_rigaBulk) i.next();
                boolean autofattura = Optional.ofNullable(rigaSelected)
                        .map(fattura_passiva_rigaBulk -> Optional.ofNullable(fattura_passiva_rigaBulk.getVoce_iva()).orElse(new Voce_ivaBulk()))
                        .map(voce_ivaBulk -> voce_ivaBulk.getFl_autofattura()).orElse(false);
                //RP 20/03/2015
                if (!escludiIVA && autofattura)
                    escludiIVAInt = true;
                else if (!escludiIVA && !autofattura)
                    escludiIVAInt = false;
                if (escludiIVAInt)
                    escludiIVA = escludiIVAInt;

                // fine RP 20/03/2015
                java.math.BigDecimal imTotale = (escludiIVA) ?
                        rigaSelected.getIm_imponibile() :
                        rigaSelected.getIm_imponibile().add(rigaSelected.getIm_iva());
                java.math.BigDecimal imStornati = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
                java.math.BigDecimal imAddebitati = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
                if (rigaSelected instanceof Fattura_passiva_rigaIBulk) {
                    Fattura_passiva_rigaIBulk dettaglioFatturaPassiva = (Fattura_passiva_rigaIBulk) rigaSelected;
                    java.math.BigDecimal impStorniDiRiga = (escludiIVA) ?
                            calcolaTotaleSelezionati((Vector) dettaglioFatturaPassiva.getFattura_passivaI().getStorniHashMap().get(dettaglioFatturaPassiva), true) :
                            dettaglioFatturaPassiva.getIm_totale_storni();
                    imStornati = imStornati.add(impStorniDiRiga);
                    java.math.BigDecimal impAddebitiDiRiga = (escludiIVA) ?
                            calcolaTotaleSelezionati((Vector) dettaglioFatturaPassiva.getFattura_passivaI().getAddebitiHashMap().get(dettaglioFatturaPassiva), true) :
                            dettaglioFatturaPassiva.getIm_totale_addebiti();
                    imAddebitati = imAddebitati.add(impAddebitiDiRiga);
                }
                importo = importo.add(imTotale.add(imAddebitati).subtract(imStornati));
            }
        }

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

    /**
     * Viene richiamato nel momento in cui si seleziona una valuta dal combo Valuta nella
     * testata della fattura.
     * Richiama a sua volta il metodo cercaCambio dalla component.
     */
    private Voce_ivaBulk caricaVoceIVADefault(ActionContext context)
            throws it.cnr.jada.comp.ComponentException {

        try {
            VoceIvaComponentSession h = (VoceIvaComponentSession)
                    context.getBusinessProcess().createComponentSession("CNRDOCAMM00_EJB_VoceIvaComponentSession", VoceIvaComponentSession.class);
            return h.caricaVoceIvaDefault(context.getUserContext());
        } catch (Throwable t) {
            throw new it.cnr.jada.comp.ComponentException(t);
        }
    }

    /**
     * Gestisce un comando di cancellazione o annullamento.
     * Nel caso di ndc o ndd richiede la gestione della quadratura delle scadenze di doc cont
     * tramite il gestore 'RisultatoEleminazioneBP'
     */
    public Forward confermaEliminazione(ActionContext context, int option) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        try {
            if (it.cnr.jada.util.action.OptionBP.YES_BUTTON == option) {
                Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();

                if (!bp.isEditing()) {
                    bp.setMessage("Non è possibile cancellare in questo momento");
                } else {
                    bp.delete(context);

                    RisultatoEliminazioneBP rebp = (RisultatoEliminazioneBP) context.createBusinessProcess("RisultatoEliminazioneBP", new String[]{"MRSWTh"});
                    Risultato_eliminazioneVBulk deleteManager = null;
                    if (!(bp instanceof CRUDFatturaPassivaIBP))
                        deleteManager = rebp.manageDelete(context, bp);
                    if (deleteManager != null &&
                            (!deleteManager.getDocumentiAmministrativiScollegati().isEmpty() || !deleteManager.getDocumentiContabiliScollegati().isEmpty())) {
                        rebp.edit(context, deleteManager);

                        context.addHookForward("bringback", this, "doBringBackConfirmDelete");
                        HookForward hook = (HookForward) context.findForward("bringback");
                        return context.addBusinessProcess(rebp);
                    } else {
                        bp.commitUserTransaction();
                        if (fp.isVoidable()) {
                            bp.setMessage("Annullamento effettuato.");
                            bp.edit(context, bp.getModel());
                        } else {
                            if (!(bp instanceof CRUDFatturaPassivaIBP)) {
                                //Nel caso in cui Ndc e Ndd vengano aggiornate completamente in
                                //automatico e non sia necessario il gestore cancellazioni riapro la
                                //fattura passiva di origine
                                doCloseForm(context);
                                Forward fwd = doChiusuraNotaDiCredito(context);
                                ((CRUDFatturaPassivaIBP) context.getBusinessProcess()).setMessage("Cancellazione effettuata.");
                                return fwd;
                            }
                            bp.reset(context);
                            bp.setMessage("Cancellazione effettuata.");
                        }
                    }
                }
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            try {
                bp.rollbackUserTransaction();
                bp.edit(context, bp.getModel());
            } catch (it.cnr.jada.action.BusinessProcessException ex) {
                return handleException(context, ex);
            }
            return handleException(context, e);
        }
    }

    /**
     * Invoca il metodo sulla component per la validazione e quadratura dei totali
     * tra testata e dettagli
     */
    protected void controllaQuadraturaConti(ActionContext context, Fattura_passivaBulk fatturaPassiva)
            throws it.cnr.jada.comp.ComponentException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();

        try {
            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
            h.controllaQuadraturaConti(context.getUserContext(), fatturaPassiva);
        } catch (java.rmi.RemoteException e) {
            bp.handleException(e);
        } catch (BusinessProcessException e) {
            bp.handleException(e);
        }
    }

    /**
     * Invoca il metodo sulla component per la validazione e quadratura dei totali
     * tra l'importo totale dei dettagli associati ad una scadenza di documento
     * contabile e l'importo della scadenza stessa
     */

    private void controllaQuadraturaObbligazioni(ActionContext context, Fattura_passivaBulk fatturaPassiva)
            throws it.cnr.jada.comp.ComponentException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();

        try {
            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
            h.controllaQuadraturaObbligazioni(context.getUserContext(), fatturaPassiva);
        } catch (java.rmi.RemoteException e) {
            bp.handleException(e);
        } catch (BusinessProcessException e) {
            bp.handleException(e);
        }
    }

    /**
     * Controlla che i dettagli selezionati per la contabilizzazione siano tutti in
     * stato iniziale (e --> non siano stati contabilizzati precedentemente)
     */
    protected void controllaSelezionePerContabilizzazione(ActionContext context, java.util.Iterator selectedModels)
            throws it.cnr.jada.comp.ApplicationException {

        if (selectedModels != null) {
            while (selectedModels.hasNext()) {
                Fattura_passiva_rigaBulk rigaSelected = (Fattura_passiva_rigaBulk) selectedModels.next();
                if (!Fattura_passiva_rigaBulk.STATO_INIZIALE.equals(rigaSelected.getStato_cofi()))
                    throw new it.cnr.jada.comp.ApplicationException("Il dettaglio \"" + rigaSelected.getDs_riga_fattura() + "\" è già stato contabilizzato! Modificare la selezione.");
                try {
                    rigaSelected.validaDateCompetenza();
                } catch (ValidationException e) {
                    throw new it.cnr.jada.comp.ApplicationException(e.getMessage());
                }
            }
        }
    }

    /**
     * In base alla data fattura fornitore di testata calcola e imposta l'esercizio
     * di validità del fornitore
     *
     * @param context         L'ActionContext della richiesta
     * @param fattura_passiva
     * @throws ComponentException
     */
    protected void creaEsercizioPerFatturaFornitore(ActionContext context, Fattura_passivaBulk fattura_passiva) throws ComponentException {

        if (fattura_passiva == null) return;

        if (fattura_passiva.getDt_fattura_fornitore() != null) {
            java.util.GregorianCalendar gc = (java.util.GregorianCalendar) java.util.GregorianCalendar.getInstance();
            gc.setTime(new java.util.Date(fattura_passiva.getDt_fattura_fornitore().getTime()));
            Integer year = new Integer(gc.get(java.util.GregorianCalendar.YEAR));
            fattura_passiva.setEsercizio_fattura_fornitore(year);
        } else
            fattura_passiva.setEsercizio_fattura_fornitore(null);

    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doAddToCRUD(ActionContext context, String tableName) {

        it.cnr.jada.util.action.CRUDBP bp = getBusinessProcess(context);
        Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
        if (fatturaPassiva.getTi_istituz_commerc() == null || fatturaPassiva.getTipo_sezionale() == null) {
            bp.setErrorMessage("Specificare prima una tipologia e un sezionale per la fattura.");
            return context.findDefaultForward();
        }
        return super.doAddToCRUD(context, tableName);
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doAddToCRUDMain_Dettaglio(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            bp.getDettaglio().add(context);
            Optional.ofNullable(bp.getDettaglio().getModel())
                    .filter(Fattura_passiva_rigaBulk.class::isInstance)
                    .map(Fattura_passiva_rigaBulk.class::cast)
                    .ifPresent(fattura_passiva_rigaBulk -> {
                        fattura_passiva_rigaBulk.setBene_servizio(new Bene_servizioBulk());
                        fattura_passiva_rigaBulk.setVoce_iva(new Voce_ivaBulk());
                    });
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doAddToCRUDMain_Obbligazioni(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            bp.getDettaglio().getSelection().clearSelection();
            fillModel(context);
            Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();

            if (fatturaPassiva.isGestione_doc_ele() && fatturaPassiva.isGenerataDaCompenso())
                throw new it.cnr.jada.comp.ApplicationException("La fattura deve essere associata a compenso, la contabilizzazione verrà fatta direttamente nel compenso!");

            if (fatturaPassiva.getFornitore() == null || fatturaPassiva.getFornitore().getCrudStatus() == it.cnr.jada.bulk.OggettoBulk.UNDEFINED)
                throw new it.cnr.jada.comp.ApplicationException("Per eseguire questa operazione è necessario selezionare un fornitore!");
            return basicDoRicercaObbligazione(context, fatturaPassiva, null);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doAddToCRUDMain_Obbligazioni_DettaglioObbligazioni(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            bp.getDettaglio().getSelection().clearSelection();
            fillModel(context);
            Obbligazione_scadenzarioBulk obbligazione = (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel();
            if (obbligazione == null)
                throw new it.cnr.jada.comp.ApplicationException("Selezionare l'impegno a cui associare i dettagli.");

            java.util.Vector selectedModels = new java.util.Vector();
            for (java.util.Enumeration e = bp.getDettaglio().getElements(); e.hasMoreElements(); ) {
                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) e.nextElement();
                if (riga.STATO_INIZIALE.equals(riga.getStato_cofi()))
                    selectedModels.add(riga);
            }
            if (selectedModels.isEmpty())
                throw new it.cnr.jada.comp.ApplicationException("Tutti i dettagli sono già stati contabilizzati!");
            it.cnr.jada.util.action.SelezionatoreListaBP slbp = (it.cnr.jada.util.action.SelezionatoreListaBP) select(
                    context,
                    new it.cnr.jada.util.ListRemoteIterator(selectedModels),
                    it.cnr.jada.bulk.BulkInfo.getBulkInfo(Fattura_passiva_rigaBulk.class),
                    "righiSet",
                    "doBringBackAddToCRUDMain_Obbligazioni_DettaglioObbligazioni");
            slbp.setMultiSelection(true);
            return slbp;
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Chiede conferma per l'apertura del pannello delle fatture sul modello fattura
     * estera specificato per le fatture di tipo bolla doganale e spedizioniere
     */

    public Forward doApriFatturaEstera(ActionContext context) {

        try {
            CRUDBP bp = getBusinessProcess(context);
            fillModel(context);
            if (bp.isDirty())
                return openContinuePrompt(context, "doConfermaApriFatturaEstera");
            return doConfermaApriFatturaEstera(context, it.cnr.jada.util.action.OptionBP.YES_BUTTON);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Apre la nota di credito selezionata come conseguenza della selezione del bottone
     * di testata 'Apri note...'
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doApriNdCSelezionata(ActionContext context) {

        try {
            Nota_di_creditoBulk ndc = (Nota_di_creditoBulk) ((HookForward) context.getCaller()).getParameter("focusedElement");
            if (ndc != null)
                return basicDoApriNotaDiCredito(context, ndc);
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Apre la nota di debito selezionata come conseguenza della selezione del bottone
     * di testata 'Apri note...'
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doApriNdDSelezionata(ActionContext context) {

        try {
            Nota_di_debitoBulk ndd = (Nota_di_debitoBulk) ((HookForward) context.getCaller()).getParameter("focusedElement");
            if (ndd != null)
                return basicDoApriNotaDiDebito(context, ndd);
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Come conseguenza della selezione del bottone di testata 'Apri note...', vengono
     * ricercate le note create dalla fattura e presenta all'utente il selezionatore
     * per la scelta. Se l'elenco della ricerca è = 1 questo elemento viene aperto
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doApriNotaDiCredito(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
            fillModel(context);

            it.cnr.jada.util.RemoteIterator ri = findNoteDiCreditoFor(context, (Fattura_passiva_IBulk) bp.getModel());
            ri = it.cnr.jada.util.ejb.EJBCommonServices.openRemoteIterator(context, ri);
            if (ri == null || ri.countElements() == 0) {
                it.cnr.jada.util.ejb.EJBCommonServices.closeRemoteIterator(context, ri);
                throw new it.cnr.jada.comp.ApplicationException("Nessuna nota di credito generata per questa fattura!");
            } else if (ri.countElements() == 1)
                return basicDoApriNotaDiCredito(context, (Nota_di_creditoBulk) ri.nextElement());
            else
                return select(context, ri, it.cnr.jada.bulk.BulkInfo.getBulkInfo(Nota_di_creditoBulk.class), "default", "doApriNdCSelezionata");
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Come conseguenza della selezione del bottone di testata 'Apri note...', vengono
     * ricercate le note create dalla fattura e presenta all'utente il selezionatore
     * per la scelta. Se l'elenco della ricerca è = 1 questo elemento viene aperto
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doApriNotaDiDebito(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
            fillModel(context);

            it.cnr.jada.util.RemoteIterator ri = findNoteDiDebitoFor(context, (Fattura_passiva_IBulk) bp.getModel());
            ri = it.cnr.jada.util.ejb.EJBCommonServices.openRemoteIterator(context, ri);
            if (ri == null || ri.countElements() == 0)
                throw new it.cnr.jada.comp.ApplicationException("Nessuna nota di debito generata per questa fattura!");
            else if (ri.countElements() == 1)
                return basicDoApriNotaDiDebito(context, (Nota_di_debitoBulk) ri.nextElement());
            else
                return select(context, ri, it.cnr.jada.bulk.BulkInfo.getBulkInfo(Nota_di_debitoBulk.class), "default", "doApriNdDSelezionata");
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Associa ad un buono di carico già creato i dettagli selezionati in fattura
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doAssociaInventario(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);

            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            controllaQuadraturaConti(context, fattura);

            if ((fattura.getAssociazioniInventarioHash() != null && !fattura.getAssociazioniInventarioHash().isEmpty()) || (fattura.getHa_beniColl()))
                return openConfirm(context, "Alcuni dettagli sono già stati associati. Si vuole continuare?", it.cnr.jada.util.action.OptionBP.CONFIRM_YES_NO, "doConfermaAssocia");

            return basicDoAssociaDettagli(context);

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di azzeramento del searchtool "fornitore"
     *
     * @param context         L'ActionContext della richiesta
     * @param fattura_passiva L'OggettoBulk padre del searchtool
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBlankSearchFatturaEstera(ActionContext context,
                                              Fattura_passivaBulk fattura_passiva)
            throws java.rmi.RemoteException {

        try {
            ((Fattura_passiva_IBulk) fattura_passiva).setFattura_estera(
                    new Fattura_passiva_IBulk(
                            fattura_passiva.getCd_cds(),
                            fattura_passiva.getCd_unita_organizzativa(),
                            fattura_passiva.getEsercizio(),
                            null
                    ));

            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di azzeramento del searchtool "fornitore"
     *
     * @param context         L'ActionContext della richiesta
     * @param fattura_passiva L'OggettoBulk padre del searchtool
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBlankSearchFornitore(ActionContext context,
                                          Fattura_passivaBulk fattura_passiva)
            throws java.rmi.RemoteException {

        try {
            TerzoBulk tb = new TerzoBulk();
            tb.setAnagrafico(new AnagraficoBulk());
            fattura_passiva.setFornitore(tb);
            fattura_passiva.setNome(null);
            fattura_passiva.setCognome(null);
            fattura_passiva.setRagione_sociale(null);
            fattura_passiva.setCodice_fiscale(null);
            fattura_passiva.setPartita_iva(null);
            fattura_passiva.setModalita(null);
            fattura_passiva.setTermini(null);
            fattura_passiva.setBanca(null);
            fattura_passiva.setCessionario(null);
            fattura_passiva.setModalita_pagamento(null);
            fattura_passiva.setTermini_pagamento(null);

            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di azzeramento del searchtool "sospeso"
     *
     * @param context         L'ActionContext della richiesta
     * @param fattura_passiva L'OggettoBulk padre del searchtool
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBlankSearchSospeso(ActionContext context,
                                        Fattura_passivaBulk fattura_passiva)
            throws java.rmi.RemoteException {

        try {
            Lettera_pagam_esteroBulk lettera = fattura_passiva.getLettera_pagamento_estero();
            SospesoBulk vecchioSospeso = lettera.getSospeso();
            if (vecchioSospeso != null)
                lettera.addToSospesiCancellati(vecchioSospeso);

            SospesoBulk sospeso = new SospesoBulk();
            sospeso.setEsercizio(lettera.getEsercizio());
            if (!Utility.createParametriCnrComponentSession().getParametriCnr(context.getUserContext(), lettera.getEsercizio()).getFl_tesoreria_unica().booleanValue())
                sospeso.setCd_cds(lettera.getCd_cds());
            sospeso.setTi_entrata_spesa(sospeso.TIPO_SPESA);
            sospeso.setTi_sospeso_riscontro(sospeso.TI_SOSPESO);
            lettera.setSospeso(sospeso);
            java.math.BigDecimal zero = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
            lettera.setIm_pagamento(zero);
            //lettera.setIm_commissioni(zero);
            //lettera.setDt_registrazione(new java.sql.Timestamp(System.currentTimeMillis()));
            ((CRUDBP) context.getBusinessProcess()).setDirty(true);
            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doBringBackAddToCRUDMain_Obbligazioni_DettaglioObbligazioni(ActionContext context) {

        try {
            HookForward fwd = (HookForward) context.getCaller();
            java.util.List selectedModels = (java.util.List) fwd.getParameter("selectedElements");
            if (selectedModels != null && !selectedModels.isEmpty()) {
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
                Obbligazione_scadenzarioBulk obbligazione = (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel();
                if (obbligazione != null) {
                    basicDoContabilizza(context, obbligazione, selectedModels);
                    bp.setDirty(true);
                }
                doCalcolaTotalePerObbligazione(context, obbligazione);
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Aggiunge, una volta terminata l'operazione di associazione, tale elenco nel
     * modello
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doBringBackAssociaInventario(ActionContext context) {

        try {
            HookForward hook = (HookForward) context.getCaller();
            Ass_inv_bene_fatturaBulk ass = (Ass_inv_bene_fatturaBulk) hook.getParameter("bringback");
            if (ass != null) {
                java.util.List dettagliInventariati = (java.util.List) hook.getParameter("dettagliDaInventariare");
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
                Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
                for (java.util.Iterator i = dettagliInventariati.iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                    if (ass.getPg_riga() == null) {
                        BuonoCaricoScaricoComponentSession h = (BuonoCaricoScaricoComponentSession) bp.createComponentSession(
                                "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                                BuonoCaricoScaricoComponentSession.class);
                        ass.setPg_riga(h.findMaxAssociazione(context.getUserContext(), ass));
                    }
                    fatturaPassiva.addToAssociazioniInventarioHash(ass, dettaglio);
                    dettaglio.setInventariato(true);
                }
            } else {
                java.util.List dettagliInventariati = (java.util.List) hook.getParameter("dettagliDaInventariare");
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
                Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
                for (java.util.Iterator i = dettagliInventariati.iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                    if (((FatturaPassivaComponentSession) bp.createComponentSession()).ha_beniColl(context.getUserContext(), dettaglio))
                        dettaglio.setInventariato(true);
                    else
                        dettaglio.setInventariato(false);
                }
            }

            return context.findDefaultForward();
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doBringBackConfirmDelete(ActionContext context) {

        HookForward caller = (HookForward) context.getCaller();

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        try {
            if (caller.getParameter("undoBringBack") != null)
                throw new it.cnr.jada.comp.ApplicationException("Cancellazione annullata!");
            Risultato_eliminazioneVBulk re = (Risultato_eliminazioneVBulk) caller.getParameter("bringback");
            if (!re.getDocumentiAmministrativiScollegati().isEmpty())
                throw new it.cnr.jada.comp.ApplicationException("Eseguire il controllo di quadratura per tutti i dettagli in elenco!");

            bp.commitUserTransaction();
            return doPostConfirmDelete(context, re);
        } catch (Throwable e) {
            try {
                bp.rollbackUserTransaction();
                bp.edit(context, bp.getModel());
            } catch (it.cnr.jada.action.BusinessProcessException ex) {
                return handleException(context, ex);
            }
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di assegnamento al crudtool "crea_fornitore"
     *
     * @param context          L'ActionContext della richiesta
     * @param fattura_passiva
     * @param fornitoreTrovato
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBringBackCRUDCrea_fornitore(ActionContext context,
                                                 Fattura_passivaBulk fattura_passiva,
                                                 TerzoBulk fornitoreTrovato)
            throws java.rmi.RemoteException {

        return doBringBackSearchFornitore(context, fattura_passiva, fornitoreTrovato);
    }
    public Forward doBringBackCRUDFornitore(ActionContext context,
            Fattura_passivaBulk fattura_passiva,
            TerzoBulk fornitoreTrovato)
            throws java.rmi.RemoteException {
    	return doBringBackCRUDCrea_fornitore(context, fattura_passiva, fornitoreTrovato);
	}
    
    /**
     * Aggiunge, una volta terminata l'operazione di creazione di buono di carico,
     * tale buono al modello
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doBringBackInventariaDettagli(ActionContext context) {

        try {
            HookForward hook = (HookForward) context.getCaller();
            Buono_carico_scaricoBulk buonoCS = (Buono_carico_scaricoBulk) hook.getParameter("bringback");

            if (buonoCS != null) {
                buonoCS.setByFattura(true);
                java.util.List dettagliInventariati = (java.util.List) hook.getParameter("dettagliDaInventariare");
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
                Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
                for (java.util.Iterator i = dettagliInventariati.iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                    fatturaPassiva.addToCarichiInventarioHash(buonoCS, dettaglio);
                    dettaglio.setInventariato(true);
                }
            }
            return context.findDefaultForward();
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * chiede l'associazione dell'obbligazione selezionata dall'utente ai dettagli
     * di fattura selezionati per la contabilizzazione ('basicDoBringBackOpenObbligazioniWindow')
     * Ricalcola i totali di scadenza e aggiunge ai documenti contabili modificati tale
     * scadenza
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doBringBackOpenObbligazioniWindow(ActionContext context) {

        HookForward caller = (HookForward) context.getCaller();
        Obbligazione_scadenzarioBulk obblig = (Obbligazione_scadenzarioBulk) caller.getParameter("bringback");
        if (obblig != null) {
            try {
                basicDoBringBackOpenObbligazioniWindow(context, obblig);

                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
                bp.getObbligazioniController().reset(context);
                bp.getObbligazioniController().setModelIndex(context, it.cnr.jada.bulk.BulkCollections.indexOfByPrimaryKey(bp.getObbligazioniController().getDetails(), obblig));

                doCalcolaTotalePerObbligazione(context, (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel());

                bp.setDirty(true);
                if (bp instanceof TitoloDiCreditoDebitoBP)
                    ((TitoloDiCreditoDebitoBP) bp).addToDocumentiContabiliModificati(obblig);
            } catch (Throwable t) {
                return handleException(context, t);
            }
        }
        return context.findDefaultForward();
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di ricerca del searchtool "bene_servizio"
     *
     * @param context              L'ActionContext della richiesta
     * @param fattura_passiva_riga L'OggettoBulk padre del searchtool
     * @param beneTrovato          L'OggettoBulk selezionato dall'utente
     * @return Il Forward alla pagina di risposta
     * @throws ComponentException
     */
    public Forward doBringBackSearchBene_servizio(ActionContext context,
                                                  Fattura_passiva_rigaBulk fattura_passiva_riga,
                                                  Bene_servizioBulk beneTrovato)
            throws it.cnr.jada.comp.ComponentException {

        try {
            Voce_ivaBulk voceIvaB = null;
            if (beneTrovato != null) {

                fattura_passiva_riga.setBene_servizio(beneTrovato);
                if (fattura_passiva_riga.getDs_riga_fattura() == null)
                    fattura_passiva_riga.setDs_riga_fattura(beneTrovato.getDs_bene_servizio());
                fattura_passiva_riga.setInventariato(false);
                Fattura_passivaBulk fatturaPassiva = fattura_passiva_riga.getFattura_passiva();
                if (TipoIVA.ISTITUZIONALE.value().equalsIgnoreCase(fatturaPassiva.getTi_istituz_commerc())) {
                    voceIvaB = caricaVoceIVADefault(context);
                    //if (voceIvaB == null)
                    //((it.cnr.jada.util.action.CRUDBP)context.getBusinessProcess()).setErrorMessage("Attenzione: non è stata caricata una voce IVA di default per le fatture istituzionali!");
                } else
                    voceIvaB = beneTrovato.getVoce_iva();
            }
            return doBringBackSearchVoce_iva(context, fattura_passiva_riga, voceIvaB);

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di ricerca del searchtool "fornitore"
     *
     * @param context          L'ActionContext della richiesta
     * @param fattura_passiva  L'OggettoBulk padre del searchtool
     * @param fornitoreTrovato L'OggettoBulk selezionato dall'utente
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBringBackSearchFornitore(ActionContext context,
                                              Fattura_passivaBulk fattura_passiva,
                                              TerzoBulk fornitoreTrovato)
            throws java.rmi.RemoteException {

        try {
            CRUDFatturaPassivaBP crudFattura = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            if (fornitoreTrovato != null) {
                if (fattura_passiva.getFl_intra_ue() != null && fattura_passiva.getFl_intra_ue().booleanValue()) {
                    if (fornitoreTrovato.getAnagrafico().getComune_fiscale() != null && fornitoreTrovato.getAnagrafico().getComune_fiscale().getNazione() != null) {
                        fornitoreTrovato.getAnagrafico().setNazionalita(fornitoreTrovato.getAnagrafico().getComune_fiscale().getNazione());
                        if (fornitoreTrovato.getAnagrafico().getNazionalita().getDivisa() != null &&
                                fattura_passiva.getValuta().getCd_divisa().compareTo(fornitoreTrovato.getAnagrafico().getNazionalita().getDivisa().getCd_divisa()) != 0)
                            crudFattura.setMessage("La valuta del fornitore " + fornitoreTrovato.getAnagrafico().getNazionalita().getDivisa().getDs_divisa() + " non è coerente con quella indicata in testata.");
                    }
                }
                FatturaPassivaComponentSession fpcs = (FatturaPassivaComponentSession) crudFattura.createComponentSession();
                fattura_passiva = fpcs.completaFornitore(context.getUserContext(), fattura_passiva, fornitoreTrovato);

                Fattura_passivaBulk originale = (Fattura_passivaBulk) crudFattura.getBulkClone();
                if (originale != null && !fattura_passiva.NON_REGISTRATO_IN_COGE.equalsIgnoreCase(fattura_passiva.getStato_coge())) {
                    TerzoBulk oldTerzo = originale.getFornitore();
                    if (oldTerzo != null && !oldTerzo.equalsByPrimaryKey(fornitoreTrovato))
                        fattura_passiva.setStato_coge(fattura_passiva.DA_RICONTABILIZZARE_IN_COGE);
                    else
                        fattura_passiva.setStato_coge(fattura_passiva.REGISTRATO_IN_COGE);
                }
                crudFattura.setModel(context, fattura_passiva);
            }
            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di ricerca del searchtool "sospeso"
     *
     * @param context         L'ActionContext della richiesta
     * @param fattura_passiva L'OggettoBulk padre del searchtool
     * @param sospesoTrovato  L'OggettoBulk selezionato dall'utente
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBringBackSearchSospeso(ActionContext context,
                                            Fattura_passivaBulk fattura_passiva,
                                            SospesoBulk sospesoTrovato)
            throws java.rmi.RemoteException {

        try {
            Lettera_pagam_esteroBulk lettera = fattura_passiva.getLettera_pagamento_estero();
            if (sospesoTrovato != null && lettera != null) {
                lettera.removeFromSospesiCancellati(sospesoTrovato);
                lettera.setSospeso(sospesoTrovato);
                lettera.setIm_pagamento(sospesoTrovato.getIm_sospeso());
                //lettera.setDt_registrazione(sospesoTrovato.getDt_registrazione());
                ((CRUDBP) context.getBusinessProcess()).setDirty(true);
            }
            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di ricerca del searchtool "voce_iva"
     *
     * @param context              L'ActionContext della richiesta
     * @param fattura_passiva_riga L'OggettoBulk padre del searchtool
     * @param ivaTrovata           L'OggettoBulk selezionato dall'utente
     * @return Il Forward alla pagina di risposta
     * @throws RemoteException Se si verifica qualche eccezione di sistema per cui non è possibile effettuare l'operazione
     */
    public Forward doBringBackSearchVoce_iva(ActionContext context,
                                             Fattura_passiva_rigaBulk fattura_passiva_riga,
                                             Voce_ivaBulk ivaTrovata)
            throws java.rmi.RemoteException {

        try {

            if (ivaTrovata != null) {
                fattura_passiva_riga.setVoce_iva(ivaTrovata);
                basicDoCalcolaTotaliDiRiga(
                        context,
                        fattura_passiva_riga,
                        fattura_passiva_riga.getIm_imponibile().add(fattura_passiva_riga.getIm_iva()));
            }
            return context.findDefaultForward();
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Viene richiamato nel momento in cui si seleziona una valuta dal combo Valuta nella
     * testata della fattura.
     * Ricalcola il valore di testata in EUR in base all'importo di fattura fornitore.
     */
    public Forward doCalcolaTotaleFatturaFornitoreInEur(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        java.math.BigDecimal impFornitore = fattura.getIm_totale_fattura();
        java.math.BigDecimal impFornitoreEuro = fattura.getIm_importo_totale_fattura_fornitore_euro();

        try {
            fillModel(context);
            if (fattura.getIm_totale_fattura() != null)
                basicDoCalcolaTotaleFatturaFornitoreInEur(fattura);
            return context.findDefaultForward();
        } catch (Throwable t) {
            fattura.setIm_totale_fattura(impFornitore);
            fattura.setIm_importo_totale_fattura_fornitore_euro(impFornitoreEuro);
            return handleException(context, t);
        }
    }

    /**
     * Ricalcola il valore totale degli importi associati alla scadenza
     */

    public Forward doCalcolaTotalePerObbligazione(ActionContext context, Obbligazione_scadenzarioBulk obbligazione) {

        it.cnr.jada.util.action.FormBP bulkBP = (it.cnr.jada.util.action.FormBP) context.getBusinessProcess();
        if (bulkBP instanceof CRUDFatturaPassivaBP) {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) bulkBP;
            Fattura_passivaBulk fatt = (Fattura_passivaBulk) bp.getModel();
            if (fatt.getFattura_passiva_obbligazioniHash() != null && obbligazione != null) {
                try {
                    fatt.setImportoTotalePerObbligazione(
                            calcolaTotaleSelezionati(
                                    (java.util.List) fatt.getFattura_passiva_obbligazioniHash().get(obbligazione),
                                    fatt.quadraturaInDeroga()));
                } catch (it.cnr.jada.comp.ApplicationException e) {
                    fatt.setImportoTotalePerObbligazione(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
                }
            } else
                fatt.setImportoTotalePerObbligazione(new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP));
        }
        return context.findDefaultForward();
    }

    /**
     * Ricalcola il totali di riga
     */

    public Forward doCalcolaTotaliDiRiga(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();
        java.math.BigDecimal qta = riga.getQuantita();
        java.math.BigDecimal pu = riga.getPrezzo_unitario();
        java.math.BigDecimal imiva = riga.getIm_iva();
        Boolean flimiva = riga.getFl_iva_forzata();
        java.math.BigDecimal impnc = riga.getIm_diponibile_nc();
        try {
            java.math.BigDecimal vecchioTotale = riga.getIm_imponibile().add(riga.getIm_iva());
            if (riga instanceof Fattura_passiva_rigaIBulk)
                vecchioTotale = vecchioTotale.add(((Fattura_passiva_rigaIBulk) riga).getIm_totale_addebiti());
            fillModel(context);
            basicDoCalcolaTotaliDiRiga(context, riga, vecchioTotale);
        } catch (Throwable e) {
            riga.setQuantita(qta);
            riga.setPrezzo_unitario(pu);
            riga.setIm_diponibile_nc(impnc);
            riga.setIm_iva(imiva);
            riga.setFl_iva_forzata(flimiva);
            riga.calcolaCampiDiRiga();
            return handleException(context, e);
        }
        return context.findDefaultForward();
    }

    /**
     * Viene richiamato nel momento in cui viene inserito/cambiato il trovato
     * nel dettaglio della fattura.
     */

    public Forward doVerificaEsistenzaTrovato(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            bp.ricercaDatiTrovato(context);
        } catch (Exception e) {
            return handleException(context, e);
        }
        return context.findDefaultForward();
//	try {
//		CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP)getBusinessProcess(context);
//		Fattura_passivaBulk fattura = (Fattura_passivaBulk)bp.getModel();
//		java.sql.Timestamp dataEmissione = fattura.getDt_fattura_fornitore();
//		try	{
//			fillModel( context );
//			if (!bp.isSearching())
//				fattura.validateDate();
//			creaEsercizioPerFatturaFornitore(context, fattura);
//
//			return context.findDefaultForward();
//		} catch(Throwable e) {
//			fattura.setDt_fattura_fornitore(dataEmissione);
//			bp.setModel(context,fattura);
//			throw e;
//		}
//	} catch(Throwable e) {
//		return handleException(context, e);
//	}
    }

    /**
     * Viene richiamato nel momento in cui viene cambiata la data di emissione
     * fattura fornitore nella testata della fattura.
     */

    public Forward doCambiaDataEmissioneFattura(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            java.sql.Timestamp dataEmissione = fattura.getDt_fattura_fornitore();
            boolean hasAccesso = ((it.cnr.contab.utente00.nav.ejb.GestioneLoginComponentSession) it.cnr.jada.util.ejb.EJBCommonServices.createEJB("CNRUTENZE00_NAV_EJB_GestioneLoginComponentSession")).controllaAccesso(context.getUserContext(), "AMMFATTURDOCSFATPASA");
            try {
                fillModel(context);
                if (!bp.isSearching())
                    if (fattura.isGestione_doc_ele() &&
                            (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                            !fattura.isElettronica() &&
                            !fattura.isEstera() &&
                            !fattura.isSanMarinoSenzaIVA() &&
                            !fattura.isSanMarinoConIVA() &&
                            !fattura.isBollaDoganale() &&
                            !hasAccesso) {
                        java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                        throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                    }
                fattura.validateDate();
                //NON ELIMINARE QUESTO COMMENTO: POSSIBILE VARIAZIONE IN FUTURO
                //java.sql.Timestamp dataFatturaFornitore = fattura.getDt_fattura_fornitore();
                //java.sql.Timestamp dataInizioValuta = fattura.getInizio_validita_valuta();
                //java.sql.Timestamp dataFineValuta = fattura.getFine_validita_valuta();
                //if (dataInizioValuta == null || dataFineValuta == null) {
                //creaEsercizioPerFatturaFornitore(context, fattura);
                //return doSelezionaValuta(context);
                //}
                //if (dataFatturaFornitore != null &&
                //!dataFatturaFornitore.equals(dataInizioValuta) &&
                //!dataFatturaFornitore.equals(dataFineValuta)) {

                //if (dataFatturaFornitore.before(dataInizioValuta) || dataFatturaFornitore.after(dataFineValuta)) {
                //creaEsercizioPerFatturaFornitore(context, fattura);
                //return doSelezionaValuta(context);
                //}
                //}
                if (fattura instanceof Nota_di_creditoBulk && fattura.getDt_scadenza() == null)
                    fattura.setDt_scadenza(fattura.getDt_fattura_fornitore());
                creaEsercizioPerFatturaFornitore(context, fattura);

                return context.findDefaultForward();
            } catch (Throwable e) {
                fattura.setDt_fattura_fornitore(dataEmissione);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Viene richiamato nel momento in cui viene cambiata la data di registrazione
     * Richiesta la validazione delle date
     */

    public Forward doCambiaDataRegistrazione(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            java.sql.Timestamp dataRegistrazione = fattura.getDt_registrazione();
            try {
                fillModel(context);
                if (!bp.isSearching())
                    fattura.validateDate();
                //NON ELIMINARE QUESTO COMMENTO: POSSIBILE VARIAZIONE IN FUTURO
                //java.sql.Timestamp dataFatturaFornitore = fattura.getDt_fattura_fornitore();
                //if (dataFatturaFornitore != null &&
                //!dataFatturaFornitore.equals(fattura.getInizio_validita_valuta()) &&
                //!dataFatturaFornitore.equals(fattura.getFine_validita_valuta())) {

                //if (fattura.getInizio_validita_valuta() == null || fattura.getFine_validita_valuta() == null ||
                //(!dataFatturaFornitore.after(fattura.getInizio_validita_valuta()) && !dataFatturaFornitore.before(fattura.getFine_validita_valuta()))) {

                //return doSelezionaValuta(context);
                //}
                //}
                //bp.valorizzaInfoDocEle(context, fattura);
                return context.findDefaultForward();
            } catch (Throwable e) {
                fattura.setDt_registrazione(dataRegistrazione);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }


    }

    /**
     * Viene richiamato nel momento in cui viene cambiata la data di scadenza fattura fornitore
     * Richiesta la validazione delle date
     */
    public Forward doCambiaDataScadenzaFatturaFornitore(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            java.sql.Timestamp dataScadenza = fattura.getDt_scadenza();
            try {
                fillModel(context);
                if (!bp.isSearching()) {
               	  	bp.setModel(context, fattura);
                    fattura.validateDate();
                    java.util.Calendar cal = Calendar.getInstance();
                    if (fattura.getData_protocollo() != null)
                        cal.setTime(fattura.getData_protocollo());
                    else
                        throw new ValidationException("La data di protocollo/ricezione non può essere nulla!");
                    cal.add(Calendar.DAY_OF_MONTH, 45);

                    if (fattura.getDt_scadenza() != null && fattura.getDt_scadenza().after(cal.getTime())) {
                        OptionBP optionBP = openConfirm(context, "Attenzione: la data di scadenza indicata è superiore a quanto previsto dalla normativa. Vuoi continuare?", OptionBP.CONFIRM_YES_NO, "doConfirmDtScadenza");
                        return optionBP;
                    }
                }
                return context.findDefaultForward();
            } catch (Throwable e) {
                fattura.setDt_scadenza(dataScadenza);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doCambiaDataInizioSospensione(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            java.sql.Timestamp dtInizioSospensione = fattura.getDt_inizio_sospensione();
            try {
                fillModel(context);
                if (!bp.isSearching()) {
                    if (Optional.ofNullable(fattura.getDt_inizio_sospensione()).orElse(EJBCommonServices.getServerTimestamp())
                            .before(Optional.ofNullable(fattura.getDt_registrazione()).orElse(EJBCommonServices.getServerTimestamp())))
                        throw new ValidationException("La data di sospensione non può essere antecedente o uguale alla data di registrazione!");
                }
                return context.findDefaultForward();
            } catch (Throwable e) {
                fattura.setDt_inizio_sospensione(dtInizioSospensione);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doCambiaDataProtocollo(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            java.sql.Timestamp dataprotocollo= fattura.getData_protocollo();
            try {
                fillModel(context);
                if (!bp.isSearching()) {
                	if(fattura.getTi_fattura().compareTo(Fattura_passivaBulk.TIPO_FATTURA_PASSIVA)==0)
               	  		basicDoOnIstituzionaleCommercialeChange(context, fattura);
               	  	bp.setModel(context, fattura);
                    fattura.validateDate();
                    java.util.Calendar cal = Calendar.getInstance();
                    if (fattura.getData_protocollo() != null)
                        cal.setTime(fattura.getData_protocollo());
                    else
                        throw new ValidationException("La data di protocollo/ricezione non può essere nulla!");
                    cal.add(Calendar.DAY_OF_MONTH, 45);

                }
                return context.findDefaultForward();
            } catch (Throwable e) {
                fattura.setData_protocollo(dataprotocollo);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable e) {
            return handleException(context, e);
        }


    }
    /**
     * Crea e imposta la lettera di pagamento estero
     */
    public Forward doCancellaLettera(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk model = (Fattura_passivaBulk) bp.getModel();
            if (model != null) {
                if (model.getLettera_pagamento_estero() == null)
                    return handleException(
                            context,
                            new it.cnr.jada.comp.ApplicationException("Lettera di pagamento estero NON presente!"));

                Lettera_pagam_esteroBulk lettera = model.getLettera_pagamento_estero();
                int status = lettera.getCrudStatus();
                if (status == OggettoBulk.UNDEFINED || status == OggettoBulk.TO_BE_CREATED) {
                    model.setLettera_pagamento_estero(null);

                } else {
                    model = ((FatturaPassivaComponentSession) bp.createComponentSession()).eliminaLetteraPagamentoEstero(context.getUserContext(), model);
                    bp.setModel(context, model);
                }
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce una richiesta di ricerca.
     * <p>
     * L'implementazione di default utilizza il metodo astratto <code>read</code>
     * di <code>CRUDBusinessProcess</code>.
     * Se la ricerca fornisce più di un risultato viene creato un
     * nuovo <code>SelezionatoreListaBP</code> per la selezione di un elemento.
     * Al business process viene anche chiesto l'elenco delle colonne da
     * visualizzare.
     */
    public Forward doCerca(ActionContext context) throws java.rmi.RemoteException, InstantiationException, javax.ejb.RemoveException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        if (bp instanceof IDocumentoAmministrativoSpesaBP && ((IDocumentoAmministrativoSpesaBP) bp).isSpesaBP())
            return basicDoCerca(context);
        return super.doCerca(context);
    }

    /**
     * Chide la nota di credito e riapre la fattura originante
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doChiusuraNotaDiCredito(ActionContext context) {

        try {
            it.cnr.jada.util.action.CRUDBP bp = (it.cnr.jada.util.action.CRUDBP) context.getBusinessProcess();
            if (bp instanceof CRUDFatturaPassivaBP && ((CRUDFatturaPassivaBP) bp).isFromFatturaElettronica())
                return this.doCloseForm(context);
            bp.edit(context, bp.getModel());
            return context.findDefaultForward();
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * Chide la nota di debito e riapre la fattura originante
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doChiusuraNotaDiDebito(ActionContext context) {

        try {
            it.cnr.jada.util.action.CRUDBP bp = (it.cnr.jada.util.action.CRUDBP) context.getBusinessProcess();
            bp.edit(context, bp.getModel());
            return context.findDefaultForward();
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * Apre il pannello delle fatture sul modello fattura estera
     * specificato per le fatture di tipio bolla doganale e spedizioniere
     */

    public Forward doConfermaApriFatturaEstera(ActionContext context, int option) {

        try {
            if (option == it.cnr.jada.util.action.OptionBP.YES_BUTTON) {
                CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
                Fattura_passiva_IBulk fattura = (Fattura_passiva_IBulk) bp.getModel();
                if (!fattura.isBollaDoganale() && !fattura.isSpedizioniere())
                    throw new it.cnr.jada.comp.ApplicationException("Comando disponibile solo se la fattura è di tipo bolla doganale o spedizioniere");
                Fattura_passiva_IBulk fatturaEstera = fattura.getFattura_estera();
                if (fatturaEstera == null || fatturaEstera.getCrudStatus() != OggettoBulk.NORMAL)
                    throw new it.cnr.jada.comp.ApplicationException("Specificare la fattura estera collegata!");

                bp.edit(context, fatturaEstera);
            }

            return context.findDefaultForward();

        } catch (it.cnr.jada.comp.ApplicationException e) {
            return handleException(context, e);
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * Richiede conferma all'utente per la continuazione del processo di creazione di
     * buono di carico
     */
    public Forward doConfermaInventaria(ActionContext context, int option) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            if (option == it.cnr.jada.util.action.OptionBP.YES_BUTTON) {
                return basicDoInventariaDettagli(context);
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    public Forward doConfermaAssocia(ActionContext context, int option) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            if (option == it.cnr.jada.util.action.OptionBP.YES_BUTTON) {
                return basicDoAssociaDettagli(context);
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Contabilizza i dettagli selezionati previo controllo della selezione
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doContabilizza(ActionContext context) {

        HookForward caller = (HookForward) context.getCaller();
        Obbligazione_scadenzarioBulk obblig = (Obbligazione_scadenzarioBulk) caller.getParameter("obbligazioneSelezionata");
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        java.util.List selectedModels = null;
        try {
            selectedModels = bp.getDettaglio().getSelectedModels(context);
            bp.getDettaglio().getSelection().clearSelection();
        } catch (Throwable e) {
        }

        if (obblig != null) {
            try {
                Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
                TerzoBulk creditore = obblig.getObbligazione().getCreditore();
                if (!fattura.getFornitore().equalsByPrimaryKey(creditore) &&
                        !AnagraficoBulk.DIVERSI.equalsIgnoreCase(creditore.getAnagrafico().getTi_entita())) {
                    ((IDocumentoAmministrativoBulk) fattura).addToDocumentiContabiliCancellati(obblig);
                    throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata deve appartenere ad un'obbligazione che ha come creditore il fornitore della fattura!");
                }
                Filtro_ricerca_obbligazioniVBulk filtro = (Filtro_ricerca_obbligazioniVBulk) caller.getParameter("filtroRicercaUtilizzato");
                if (filtro != null) {
                    Elemento_voceBulk ev = filtro.getElemento_voce();
                    if (ev != null) {
                        if (!obblig.getObbligazione().getElemento_voce().getCd_elemento_voce().startsWith(ev.getCd_elemento_voce())) {
                            if (!ev.getCd_elemento_voce().startsWith(obblig.getObbligazione().getElemento_voce().getCd_elemento_voce())) {
                                ((IDocumentoAmministrativoBulk) fattura).addToDocumentiContabiliCancellati(obblig);
                                throw new it.cnr.jada.comp.ApplicationException("Il titolo capitolo dell'impegno deve essere uguale o appartenere al titolo capitolo della categoria inventario dei beni selezionati (\"" + ev.getCd_elemento_voce() + "\")!");
                            }
                        }
                    }
                }
                Obbligazione_scadenzarioBulk obbligazione = null;
                ObbligazioniTable obbHash = fattura.getObbligazioniHash();
                if (obbHash != null && !obbHash.isEmpty())
                    obbligazione = obbHash.getKey(obblig);
                if (obbligazione != null && obbligazione.getObbligazione().isTemporaneo()) {
                    java.util.Vector models = ((java.util.Vector) obbHash.get(obbligazione));
                    java.util.Vector clone = (java.util.Vector) models.clone();
                    if (!clone.isEmpty()) {
                        scollegaDettagliDaObbligazione(context, clone);
                        clone.addAll(selectedModels);
                        basicDoContabilizza(context, obblig, clone);
                    } else {
                        obbHash.remove(obbligazione);
                        basicDoContabilizza(context, obblig, selectedModels);
                    }
                } else {
                    basicDoContabilizza(context, obblig, selectedModels);
                }
            } catch (it.cnr.jada.comp.ComponentException e) {
                return handleException(context, e);
            }
            bp.getObbligazioniController().getSelection().clear();
            bp.getObbligazioniController().setModelIndex(context, -1);
            bp.getObbligazioniController().setModelIndex(context, it.cnr.jada.bulk.BulkCollections.indexOfByPrimaryKey(bp.getObbligazioniController().getDetails(), obblig));

            bp.setDirty(true);
            if (!"tabFatturaPassivaObbligazioni".equals(bp.getTab("tab")))
                bp.setTab("tab", "tabFatturaPassivaObbligazioni");
        }
        return context.findDefaultForward();
    }

    /**
     * Crea e imposta la lettera di pagamento estero
     */
    public Forward doCreaLettera(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk model = (Fattura_passivaBulk) bp.getModel();
            if (model != null) {
                if (model.getLettera_pagamento_estero() == null) {
                    if (model instanceof Fattura_passiva_IBulk) {
                        Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) model;
                        // //RP 23/03/2010  ?? commentato per permettere la generazione delle nc/nd di fatture con lettera di pagamento
					/*if (fp.hasAddebiti() || fp.hasStorni())
						return handleException(
									context,
									new it.cnr.jada.comp.ApplicationException("La lettera di pagamento estero non puo' essere creata se la fattura è ha storni o addebiti!")); */
                        if (fp.isByFondoEconomale())
                            return handleException(
                                    context,
                                    new it.cnr.jada.comp.ApplicationException("La lettera di pagamento estero non puo' essere creata perchè la fattura è destinata al pagamento tramite fondo economale!"));
                    }
                    Lettera_pagam_esteroBulk lettera = new Lettera_pagam_esteroBulk(
                            model.getCd_cds_origine(),
                            model.getCd_uo_origine(),
                            it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext()),
                            null);
                    lettera.completeFrom(context);
                    lettera.setToBeCreated();
                    model.setLettera_pagamento_estero(lettera);
                } else {
                    return handleException(
                            context,
                            new it.cnr.jada.comp.ApplicationException("La lettera per il pagamento estero è già stata creata!"));
                }
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce un comando di cancellazione o annullamento.
     * Nel caso di ndc o ndd richiede la gestione della quadratura delle scadenze di doc cont
     * tramite il gestore 'RisultatoEleminazioneBP'
     */
    public Forward doElimina(ActionContext context) throws java.rmi.RemoteException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
        if (fp.existARowToBeInventoried())
            try {
                return openConfirm(
                        context,
                        "Si sta per eliminare un documento amministrativo passivo contenente beni soggetti ad inventario.\nSi vuole continuare?",
                        it.cnr.jada.util.action.OptionBP.WARNING_MESSAGE,
                        "confermaEliminazione");
            } catch (BusinessProcessException e) {
                return handleException(context, e);
            }
        return confermaEliminazione(context, it.cnr.jada.util.action.OptionBP.YES_BUTTON);
    }

    /**
     * Forza il flag 'ForzaIVA' e ricalcola i totali di riga
     */
    public Forward doForzaIVA(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();
        Boolean flForzaIVA = riga.getFl_iva_forzata();
        java.math.BigDecimal impIVA = riga.getIm_iva();
        try {
            java.math.BigDecimal vecchioTotale = riga.getIm_imponibile().add(riga.getIm_iva());
            if (riga instanceof Fattura_passiva_rigaIBulk)
                vecchioTotale = vecchioTotale.add(((Fattura_passiva_rigaIBulk) riga).getIm_totale_addebiti());
            fillModel(context);
            riga.setFl_iva_forzata(Boolean.TRUE);
            basicCalcolaImportoDisponibileNC(context, riga, vecchioTotale);
            doSelectObbligazioni(context);
        } catch (Throwable t) {
            riga.setFl_iva_forzata(flForzaIVA);
            riga.setIm_iva(impIVA);
            riga.calcolaCampiDiRiga();
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doFreeSearchFatturaEstera(ActionContext context) {

        FormField field = getFormField(context, "main.fatturaEstera");
        try {
            OggettoBulk fp = ((CRUDFatturaPassivaBP) context.getBusinessProcess()).createEmptyModelForFreeSearch(context);
            return freeSearch(context, field, fp);
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        }
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di ricerca libera del searchtool "fornitore"
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doFreeSearchFornitore(ActionContext context) {
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        TerzoBulk tb = new TerzoBulk();
        tb.setAnagrafico(new AnagraficoBulk());
        return freeSearch(context, bp.getFormField("fornitore"), tb);
    }

    /**
     * Creo e apro una nuova nota di credito. Viene eseguito rollback prima di
     * questa operazione per permettere il rilascio della fattura!
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doGeneraNotaDiCredito(ActionContext context) {

        try {
            fillModel(context);
            return basicDoGeneraNotaDiCredito(context);

        } catch (it.cnr.jada.bulk.FillException e) {
            return handleException(context, e);
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        } catch (it.cnr.jada.comp.ComponentException e) {
            return handleException(context, e);
        }
    }

    /**
     * Creo e apro una nuova nota di debito. Viene eseguito rollback prima di
     * questa operazione per permettere il rilascio della fattura!
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doGeneraNotaDiDebito(ActionContext context) {

        try {
            fillModel(context);
            return basicDoGeneraNotaDiDebito(context);

        } catch (it.cnr.jada.bulk.FillException e) {
            return handleException(context, e);
        } catch (BusinessProcessException e) {
            return handleException(context, e);
        } catch (it.cnr.jada.comp.ComponentException e) {
            return handleException(context, e);
        }
    }

    /**
     * Inventaria i dettagli
     * Richiesta la quadratura tra dettagli e testata
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doInventariaDettagli(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);

            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            controllaQuadraturaConti(context, fattura);
            java.util.List dettagliDaInventariare = getDettagliDaInventariare(context, bp.getDettaglio().getDetails().iterator());
            if (dettagliDaInventariare != null && !dettagliDaInventariare.isEmpty())
                //if (fattura.getCarichiInventarioHash() != null && !fattura.getCarichiInventarioHash().isEmpty())
                //return openConfirm(context,"Alcuni dettagli sono già stati inventariati. Se si procede tutti i buoni carico/scarico già creati verranno persi. Continuare?",it.cnr.jada.util.action.OptionBP.CONFIRM_YES_NO,"doConfermaInventaria");
                return basicDoInventariaDettagli(context);
            else
                bp.setMessage("Nessun dettaglio è inventariabile o tutti i dettagli inventariabili sono già stati caricati!");
            return context.findDefaultForward();

        } catch (Exception e) {
            return handleException(context, e);
        }

    }

    /**
     * Inventaria i dettagli per aumento di valore
     * Richiesta la quadratura tra dettagli e testata
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doInventariaDettagliPerAumentoValore(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);

            controllaQuadraturaConti(context, (Fattura_passivaBulk) bp.getModel());

            java.util.List dettagliDaInventariare = getDettagliDaInventariare(context, bp.getDettaglio().getDetails().iterator());
            if (dettagliDaInventariare != null && !dettagliDaInventariare.isEmpty()) {

                AssBeneFatturaBP ibp = (AssBeneFatturaBP) context.getUserInfo().createBusinessProcess(context, "AssBeneFatturaBP", new Object[]{"MRSWTh"});
                Ass_inv_bene_fatturaBulk associa = new Ass_inv_bene_fatturaBulk();
                associa.setLocal_transactionID(ibp.getLocalTransactionID(context.getUserContext(), true));

                associa.completeFrom(dettagliDaInventariare);
                associa.setPerAumentoValore(Boolean.TRUE);
                //???????
                // Crea ed inizializza il Buono di Carico
                Buono_carico_scaricoBulk buonoC = new Buono_carico_scaricoBulk();
                buonoC.setToBeCreated();
                buonoC.setByFatturaPerAumentoValore(Boolean.TRUE);
                buonoC.setTi_documento(Buono_carico_scaricoBulk.CARICO);
                buonoC = (Buono_carico_scaricoBulk) ibp.createComponentSession().inizializzaBulkPerInserimento(context.getUserContext(), buonoC);
                associa.setTest_buono(buonoC);
                associa.setInventario(buonoC.getInventario());
                try {

                    associa.getTest_buono().setPg_buono_c_s(((NumerazioneTempBuonoComponentSession) EJBCommonServices.createEJB(
                            "CNRINVENTARIO01_EJB_NumerazioneTempBuonoComponentSession",
                            NumerazioneTempBuonoComponentSession.class)).getNextTempPG(context.getUserContext(), associa.getTest_buono()));

                } catch (Throwable e) {
                    throw new ComponentException(e);
                }

                //

                ibp.setModel(context, associa);
                ibp.setDirty(false);
                ibp.setPerAumentoValore(Boolean.TRUE);

                context.addHookForward("bringback", this, "doBringBackAssociaInventario");
                HookForward hook = (HookForward) context.findForward("bringback");
                hook.addParameter("dettagliDaInventariare", dettagliDaInventariare);
                return context.addBusinessProcess(ibp);
            }
            bp.setMessage("Nessun dettaglio è inventariabile o tutti i dettagli inventariabili sono già stati caricati!");
            return context.findDefaultForward();
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    public Forward doBeni_coll(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);

        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();

        try {
            it.cnr.jada.util.RemoteIterator ri = ((FatturaPassivaComponentSession) bp.createComponentSession()).selectBeniFor(context.getUserContext(), fattura);
            ri = it.cnr.jada.util.ejb.EJBCommonServices.openRemoteIterator(context, ri);
            if (ri.countElements() == 0) {
                it.cnr.jada.util.ejb.EJBCommonServices.closeRemoteIterator(context, ri);
                throw new it.cnr.jada.comp.ApplicationException("Attenzione: Nessun dato disponibile.");
            }
            SelezionatoreListaBP nbp = (SelezionatoreListaBP) context.createBusinessProcess("Selezionatore");
            nbp.setIterator(context, ri);
            nbp.disableSelection();
            nbp.setBulkInfo(it.cnr.jada.bulk.BulkInfo.getBulkInfo(V_ass_inv_bene_fatturaBulk.class));
            HookForward hook = (HookForward) context.findForward("seleziona");
            return context.addBusinessProcess(nbp);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Richiede all'obbligazione di modificare in automatico la sua scadenza (quella
     * selezionata) portando la stessa ad importo pari alla sommatoria degli importi
     * di riga dei dettagli associati. Aggiorna la mappa dei saldi per le variazioni
     * subite dall'obbligazione
     *
     * @param context L'ActionContext della richiesta
     * @param prefix
     * @return Il Forward alla pagina di risposta
     */
    public Forward doModificaScadenzaInAutomatico(ActionContext context, String prefix) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);
            Fattura_passiva_IBulk fatturaPassiva = (Fattura_passiva_IBulk) bp.getModel();
            controllaQuadraturaConti(context, fatturaPassiva);

            Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel();

            if (scadenza == null)
                throw new it.cnr.jada.comp.ApplicationException("Selezionare l'impegno da modificare in automatico!");
            java.util.Vector righeAssociate = (java.util.Vector) fatturaPassiva.getFattura_passiva_obbligazioniHash().get(scadenza);
            if (righeAssociate == null || righeAssociate.isEmpty())
                throw new it.cnr.jada.comp.ApplicationException("Associare dei dettagli prima di aggiornare in automatico la scadenza impegno!");
            if (bp.isDeleting() &&
                    !bp.isViewing() &&
                    !it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext()).equals(scadenza.getEsercizio()))
                throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata appartiene all'esercizio " + scadenza.getEsercizio().intValue() + "! Operazione annullata.");

            ObbligazioneAbstractComponentSession h = CRUDVirtualObbligazioneBP.getVirtualComponentSession(context, true);

            try {
                scadenza = (Obbligazione_scadenzarioBulk) h.modificaScadenzaInAutomatico(
                        context.getUserContext(),
                        scadenza,
                        getImportoPerAggiornamentoScadenzaInAutomatico(
                                context,
                                scadenza,
                                fatturaPassiva,
                                new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP)),
                        false);
                bp.getDefferedUpdateSaldiParentBP().getDefferedUpdateSaldiBulk().addToDefferredSaldi(
                        scadenza.getObbligazione(),
                        scadenza.getObbligazione().getSaldiInfo());
            } catch (it.cnr.jada.comp.ComponentException e) {
                if (e.getDetail() instanceof it.cnr.contab.doccont00.comp.CheckDisponibilitaCassaFailed)
                    throw new it.cnr.jada.comp.ApplicationException(e.getDetail().getMessage());
                if (e.getDetail() instanceof it.cnr.contab.doccont00.comp.SfondamentoPdGException)
                    throw new it.cnr.jada.comp.ApplicationException(e.getDetail().getMessage());
                throw e;
            }

            Forward fwd = basicDoBringBackOpenObbligazioniWindow(context, scadenza);

            bp.getObbligazioniController().getSelection().clear();
            bp.getObbligazioniController().setModelIndex(context, -1);
            bp.getObbligazioniController().setModelIndex(context, it.cnr.jada.bulk.BulkCollections.indexOfByPrimaryKey(bp.getObbligazioniController().getDetails(), scadenza));
            bp.setDirty(true);

            return fwd;
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce la variazione manuale del valore del cambio e ricalcola tutti i totali
     */
    public Forward doOnChangeModified(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
            Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
            it.cnr.jada.bulk.PrimaryKeyHashtable vecchiTotali = new it.cnr.jada.bulk.PrimaryKeyHashtable();
            if (fp instanceof Fattura_passiva_IBulk) {
                for (java.util.Iterator i = fp.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) i.next();
                    java.math.BigDecimal vecchioTotale = dettaglio.getIm_imponibile().add(dettaglio.getIm_iva());
                    vecchioTotale = vecchioTotale.add(dettaglio.getIm_totale_addebiti());
                    vecchiTotali.put(dettaglio, vecchioTotale);
                }
            }
            java.math.BigDecimal vecchioCambio = fp.getCambio();
            fillModel(context);
            if (fp != null) {
                java.math.BigDecimal cambioAttuale = fp.getCambio();
                if (cambioAttuale == null)
                    fp.setCambio((cambioAttuale = new java.math.BigDecimal(0)));
                cambioAttuale = cambioAttuale.setScale(4, java.math.BigDecimal.ROUND_HALF_UP);
                fp.setCambio(cambioAttuale);
                if (cambioAttuale.compareTo(new java.math.BigDecimal(0)) == 0) {
                    fp.setCambio(vecchioCambio);
                    throw new it.cnr.jada.comp.ApplicationException("Non è stato inserito un cambio valido (>0)");
                }
                if (fp.getObbligazioniHash() != null && !fp.getObbligazioniHash().isEmpty())
                    bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze delle obbligazioni!");
                if (fp.getAccertamentiHash() != null && !fp.getAccertamentiHash().isEmpty())
                    bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze degli accertamenti!");
                fp.aggiornaImportiTotali();
                basicDoCalcolaTotaleFatturaFornitoreInEur(fp);
                for (java.util.Iterator i = fp.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                    if (dettaglio instanceof Fattura_passiva_rigaIBulk) {
                        java.math.BigDecimal vecchioTotale = (java.math.BigDecimal) vecchiTotali.get(dettaglio);
                        if (vecchioTotale == null)
                            vecchioTotale = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
                        basicCalcolaImportoDisponibileNC(context, (Fattura_passiva_rigaIBulk) dettaglio, vecchioTotale);
                    }
                }
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Gestisce l'eccezione CheckDisponibilitaCassaFailed generata dall'obbligazione
     * mantenendo traccia della scelta di conferma o annullamento dell'operazione
     * da parte dell'utente
     */

    public Forward doOnCheckDisponibilitaCassaFailed(
            ActionContext context,
            int option) {

        if (option == it.cnr.jada.util.action.OptionBP.OK_BUTTON) {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            try {
                boolean modified = fillModel(context);
                OptionRequestParameter userConfirmation = new OptionRequestParameter();
                userConfirmation.setCheckDisponibilitaDiCassaRequired(Boolean.FALSE);
                bp.setUserConfirm(userConfirmation);
                if (bp.isBringBack())
                    doConfermaRiporta(context, it.cnr.jada.util.action.OptionBP.OK_BUTTON);
                else if (bp.isCarryingThrough())
                    doRiportaAvanti(context);
                else
                    doSalva(context);
            } catch (Throwable e) {
                return handleException(context, e);
            }
        }
        return context.findDefaultForward();
    }

    /**
     * Metodo utilizzato per gestire la conferma dell'inserimento/modifica di una obbligazione che ha sfondato
     * la disponibilità per il contratto
     *
     * @param context <code>ActionContext</code> in uso.
     * @param option  Esito della risposta alla richiesta di sfondamento
     * @return <code>Forward</code>
     * @throws <code>RemoteException</code>
     */
    public Forward doOnCheckDisponibilitaContrattoFailed(ActionContext context, int option) {
        if (option == it.cnr.jada.util.action.OptionBP.OK_BUTTON) {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            try {
                boolean modified = fillModel(context);
                OptionRequestParameter userConfirmation = new OptionRequestParameter();
                userConfirmation.setCheckDisponibilitaContrattoRequired(Boolean.FALSE);
                bp.setUserConfirm(userConfirmation);
                if (bp.isBringBack())
                    doConfermaRiporta(context, it.cnr.jada.util.action.OptionBP.OK_BUTTON);
                else if (bp.isCarryingThrough())
                    doRiportaAvanti(context);
                else
                    doSalva(context);
            } catch (Throwable e) {
                return handleException(context, e);
            }
        }
        return context.findDefaultForward();
    }

    /**
     * Gestisce il cambiamento della data competenza coge 'a'
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doOnDataCompetenzaACogeChange(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        java.sql.Timestamp competenzaABck = fattura.getDt_a_competenza_coge();
        try {
            fillModel(context);
            java.sql.Timestamp competenzaDa = fattura.getDt_da_competenza_coge();
            java.sql.Timestamp competenzaA = fattura.getDt_a_competenza_coge();
            if (competenzaA != null) {
                java.util.GregorianCalendar tsOdiernoGregorian = new GregorianCalendar();
                tsOdiernoGregorian.setTime(new Date(competenzaA.getTime()));

                Integer esercizioCompetenzaA = new Integer(tsOdiernoGregorian.get(java.util.GregorianCalendar.YEAR));
                String cds = fattura.getCd_cds();

                if (competenzaA != null && competenzaDa != null)
                    if (!competenzaDa.equals(competenzaA) && !competenzaDa.before(competenzaA))
                        throw new it.cnr.jada.comp.ApplicationException("La data \"competenza da\" deve essere precedente o uguale a \"competenza a\"!");
                if (((FatturaPassivaComponentSession) bp.createComponentSession()).isEsercizioChiusoPerDataCompetenza(context.getUserContext(), esercizioCompetenzaA, cds) && !fattura.getStato_coge().equals("NON_PROCESSARE_IN_COGE"))
                    throw new it.cnr.jada.comp.ApplicationException("Le date \"Competenza da\" e \"Competenza a\" non possono appartenere ad un esercizio chiuso");
            }
            bp.setModel(context, fattura);
            return context.findDefaultForward();
        } catch (Throwable t) {
            fattura.setDt_a_competenza_coge(competenzaABck);
            try {
                bp.setModel(context, fattura);
            } catch (BusinessProcessException e) {
                return handleException(context, e);
            }
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento della data competenza coge 'da' *
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doOnDataCompetenzaDaCogeChange(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        java.sql.Timestamp competenzaDaBck = fattura.getDt_da_competenza_coge();
        try {
            fillModel(context);
            java.sql.Timestamp competenzaDa = fattura.getDt_da_competenza_coge();
            java.sql.Timestamp competenzaA = fattura.getDt_a_competenza_coge();
            if (competenzaDa != null) {
                java.util.GregorianCalendar tsOdiernoGregorian = new GregorianCalendar();
                tsOdiernoGregorian.setTime(new Date(competenzaDa.getTime()));

                Integer esercizioCompetenzaDa = new Integer(tsOdiernoGregorian.get(java.util.GregorianCalendar.YEAR));
                String cds = fattura.getCd_cds();

                if (competenzaA != null && competenzaDa != null)
                    if (!competenzaDa.equals(competenzaA) && !competenzaDa.before(competenzaA))
                        throw new it.cnr.jada.comp.ApplicationException("La data \"competenza a\" deve essere successiva o uguale a \"competenza da\"!");
                if (((FatturaPassivaComponentSession) bp.createComponentSession()).isEsercizioChiusoPerDataCompetenza(context.getUserContext(), esercizioCompetenzaDa, cds) && !fattura.getStato_coge().equals("NON_PROCESSARE_IN_COGE"))
                    throw new it.cnr.jada.comp.ApplicationException("Le date \"Competenza da\" e \"Competenza a\" non possono appartenere ad un esercizio chiuso");
            }
            bp.setModel(context, fattura);
            return context.findDefaultForward();
        } catch (Throwable t) {
            fattura.setDt_da_competenza_coge(competenzaDaBck);
            try {
                bp.setModel(context, fattura);
            } catch (BusinessProcessException e) {
                return handleException(context, e);
            }
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag autofattura ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlAutofatturaChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String fattServizi = fattura.getTi_bene_servizio();
            fillModel(context);
            try {
                if (!bp.isSearching()) {
                    basicDoOnIstituzionaleCommercialeChange(context, fattura);
                    bp.setModel(context, fattura);
                }
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setTi_bene_servizio(fattServizi);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag bolla doganale
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlBollaDoganaleChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);
            try {
                if (fattura.isGestione_doc_ele() &&
                        (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                        !fattura.isElettronica() &&
                        !fattura.isEstera() &&
                        !fattura.isSanMarinoSenzaIVA() &&
                        !fattura.isSanMarinoConIVA() &&
                        !fattura.isBollaDoganale()) {
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                }
                if (Boolean.TRUE.equals(fattura.getFl_bolla_doganale())) {
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.getStato_pagamento_fondo_eco());
                    //fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                    fattura.setFl_liquidazione_differita(Boolean.FALSE);
                    if (fattura instanceof Fattura_passiva_IBulk)
                        doBlankSearchFatturaEstera(context, (Fattura_passiva_IBulk) fattura);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                } else if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                fattura.setTi_bene_servizio(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag Extra UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlExtraUEChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);

            try {
                if (fattura.isGestione_doc_ele() &&
                        (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                        !fattura.isElettronica() &&
                        !fattura.isEstera() &&
                        !fattura.isSanMarinoSenzaIVA() &&
                        !fattura.isSanMarinoConIVA() &&
                        !fattura.isBollaDoganale()) {
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                }

                if (Boolean.TRUE.equals(fattura.getFl_extra_ue())) {
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    fattura.setFl_liquidazione_differita(Boolean.FALSE);
                    if (!fattura.isPromiscua())
                        fattura.setTi_bene_servizio(fattura.FATTURA_DI_BENI);
                    fattura.setFl_autofattura((fattura.isFatturaDiServizi()) ? Boolean.TRUE : Boolean.FALSE);
                    //fattura.setAutoFatturaNeeded(fattura.isFatturaDiServizi());
                } else {
                    fattura.setTi_bene_servizio(null);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    //fattura.setAutoFatturaNeeded(false);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                }

                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag Intra UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlIntraUEChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);

            try {
                if (fattura.isGestione_doc_ele() &&
                        (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                        !fattura.isElettronica() &&
                        !fattura.isEstera() &&
                        !fattura.isSanMarinoSenzaIVA() &&
                        !fattura.isSanMarinoConIVA() &&
                        !fattura.isBollaDoganale()) {
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                }

                if (Boolean.TRUE.equals(fattura.getFl_intra_ue())) {
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_liquidazione_differita(Boolean.FALSE);
                    if (!fattura.isPromiscua())
                        fattura.setTi_bene_servizio(fattura.FATTURA_DI_BENI);
                    if (fattura.isCommerciale()) {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(true);
                    }
                } else {
                    fattura.setTi_bene_servizio(null);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                }
                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag San Marino con IVA UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlSanMarinoConIVAChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);
            try {
                if (fattura.isGestione_doc_ele() &&
                        (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                        !fattura.isElettronica() &&
                        !fattura.isEstera() &&
                        !fattura.isSanMarinoSenzaIVA() &&
                        !fattura.isSanMarinoConIVA() &&
                        !fattura.isBollaDoganale()) {
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                }
                if (Boolean.TRUE.equals(fattura.getFl_san_marino_con_iva())) {
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setAutoFatturaNeeded(false);
                    fattura.setFl_liquidazione_differita(Boolean.FALSE);
                }
                if (!fattura.isDefaultValuta())
                    fattura = doSelezionaValutaDefault(context, fattura);
                fattura.setTi_bene_servizio(null);
                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag San Marino senza IVA UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlSanMarinoSenzaIVAChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);

            try {
                if (fattura.isGestione_doc_ele() &&
                        (fattura.getDt_fattura_fornitore() != null && !(fattura.getDt_fattura_fornitore().compareTo(fattura.getDataInizioFatturaElettronica()) < 0)) &&
                        !fattura.isElettronica() &&
                        !fattura.isEstera() &&
                        !fattura.isSanMarinoSenzaIVA() &&
                        !fattura.isSanMarinoConIVA() &&
                        !fattura.isBollaDoganale()) {
                    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile registrare una fattura che non sia elettronica, che non sia estera e che abbia data di emissione uguale o successiva al " + sdf.format(fattura.getDataInizioFatturaElettronica()) + "!");
                }

                if (Boolean.TRUE.equals(fattura.getFl_san_marino_senza_iva())) {
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_liquidazione_differita(Boolean.FALSE);
                    if (!fattura.isPromiscua())
                        fattura.setTi_bene_servizio(fattura.FATTURA_DI_BENI);
                    if (fattura.isCommerciale()) {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setFl_split_payment(Boolean.FALSE);
                        //fattura.setAutoFatturaNeeded(true);
                    }
                } else {
                    fattura.setTi_bene_servizio(null);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                }
                if (!fattura.isDefaultValuta())
                    fattura = doSelezionaValutaDefault(context, fattura);
                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag spedizioniere ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlSpedizioniereChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            fillModel(context);
            try {
                if (Boolean.TRUE.equals(fattura.getFl_spedizioniere())) {
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.getStato_pagamento_fondo_eco());
                    //fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    if (fattura instanceof Fattura_passiva_IBulk)
                        doBlankSearchFatturaEstera(context, (Fattura_passiva_IBulk) fattura);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                } else if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);

                fattura.setTi_bene_servizio(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del tipo sezionale ricaricandoli
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnIstituzionaleCommercialeChange(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();

            if (fattura.existARowInventoried())
                throw new it.cnr.jada.comp.ApplicationException("Alcuni dettagli sono già stati associati all'inventario. Modifica non possibile!");

            java.util.Collection sezionaliOld = fattura.getSezionali();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            Boolean liqDiff = fattura.getFl_liquidazione_differita();
            fillModel(context);
            try {
                fattura.setFl_intra_ue(Boolean.FALSE);
                fattura.setFl_extra_ue(Boolean.FALSE);
                fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                fattura.setFl_spedizioniere(Boolean.FALSE);
                fattura.setFl_bolla_doganale(Boolean.FALSE);
                fattura.setFl_autofattura(Boolean.FALSE);
                fattura.setAutoFatturaNeeded(false);
                fattura.setTi_bene_servizio(null);
                fattura.setFl_merce_extra_ue(Boolean.FALSE);
                fattura.setFl_merce_intra_ue(Boolean.FALSE);
                fattura.setFl_liquidazione_differita(Boolean.FALSE);
                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setSezionali(sezionaliOld);
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                fattura.setFl_liquidazione_differita(liqDiff);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento delle modalità di pagamento del fornitore
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnModalitaPagamentoChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP crudFattura = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            //Fattura_passivaBulk originale = (Fattura_passivaBulk)crudFattura.getBulkClone();
            Fattura_passivaBulk originale = (Fattura_passivaBulk) crudFattura.getModel();
            Rif_modalita_pagamentoBulk old_modalita = originale.getModalita_pagamento();

            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            //se c'è almeno un dettaglio non faccio più modificare la modalità di pagamento
            //commentato perchè per le fatture elettroniche hanno già i dettagli caricati
		/*
		if(fattura.getFattura_passiva_dettColl().size()>0)
		{
			if (old_modalita!=null)
			   fattura.setModalita_pagamento(old_modalita);
			throw new it.cnr.jada.comp.ApplicationException("Esiste almeno un dettaglio e quindi la Modalità di pagamento deve essere cambiata sul dettaglio stesso.");
		}
		*/
            if (fattura.getModalita_pagamento() != null) {
                FatturaPassivaComponentSession fpcs = (FatturaPassivaComponentSession) bp.createComponentSession();
                java.util.Collection coll = fpcs.findListabanche(context.getUserContext(), fattura);
                fattura.setBanca((coll == null || coll.isEmpty()) ? null : (BancaBulk) new java.util.Vector(coll).firstElement());
                fattura.setCessionario(fpcs.findCessionario(context.getUserContext(), fattura));
                if ((getBusinessProcess(context).isInserting()) && (fattura.getFattura_passiva_dettColl().size() > 0)) {
                    for (Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                        Fattura_passiva_rigaIBulk fattura_riga = (Fattura_passiva_rigaIBulk) i.next();
                        fattura_riga.setModalita_pagamento(fattura.getModalita_pagamento());
                        fattura_riga.setBanca((coll == null || coll.isEmpty()) ? null : (BancaBulk) new java.util.Vector(coll).firstElement());
                        fattura_riga.setCessionario(fpcs.findCessionario(context.getUserContext(), fattura_riga));
                    }
                }

            } else {
                fattura.setBanca(null);
                fattura.setCessionario(null);
            }

            //se c'è un solo dettaglio non pagato cambio la modalità anche al dettaglio
		/*
		if(fattura.getFattura_passiva_dettColl().size()==1)
		{
			for (java.util.Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext();) {
				Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk)i.next();

				riga.setModalita_pagamento(fattura.getModalita_pagamento());
				doOnModalitaPagamentoDetChange(context);
			}
		}
		*/
            bp.setModel(context, fattura);
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Gestisce il cambiamento della quantità del dettaglio
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnQuantitaChange(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();

        java.math.BigDecimal qta = riga.getQuantita();
        java.math.BigDecimal pu = riga.getPrezzo_unitario();
        java.math.BigDecimal imiva = riga.getIm_iva();
        Boolean flimiva = riga.getFl_iva_forzata();
        java.math.BigDecimal impnc = riga.getIm_diponibile_nc();
        try {
            java.math.BigDecimal vecchioTotale = riga.getIm_imponibile().add(riga.getIm_iva());
            if (riga instanceof Fattura_passiva_rigaIBulk)
                vecchioTotale = vecchioTotale.add(((Fattura_passiva_rigaIBulk) riga).getIm_totale_addebiti());
            fillModel(context);
            basicDoCalcolaTotaliDiRiga(context, riga, vecchioTotale);
        } catch (Throwable e) {
            riga.setQuantita(qta);
            riga.setPrezzo_unitario(pu);
            riga.setIm_diponibile_nc(impnc);
            riga.setIm_iva(imiva);
            riga.setFl_iva_forzata(flimiva);
            riga.calcolaCampiDiRiga();
            return handleException(context, e);
        }
        riga.setInventariato(false);

        return context.findDefaultForward();
    }

    /**
     * Gestisce il cambiamento delle modalità di pagamento del fornitore
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnModalitaPagamentoDetChange(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passiva_rigaBulk fattura_riga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();
            if (fattura_riga.getModalita_pagamento() != null) {
                FatturaPassivaComponentSession fpcs = (FatturaPassivaComponentSession) bp.createComponentSession();
                java.util.Collection coll = fpcs.findListabanchedett(context.getUserContext(), fattura_riga);

                fattura_riga.setBanca((coll == null || coll.isEmpty()) ? null : (BancaBulk) new java.util.Vector(coll).firstElement());
                fattura_riga.setCessionario(fpcs.findCessionario(context.getUserContext(), fattura_riga));
            } else {
                fattura_riga.setBanca(null);
                fattura_riga.setCessionario(null);
            }
            bp.setModel(context, fattura_riga.getFattura_passiva());
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    /**
     * Gestisce il cambiamento del sezionale
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnSezionaliFlagsChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            fillModel(context);
            try {

                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Gestisce il cambiamento del flag Intra UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnTiBeneServizioChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            fillModel(context);
            try {
                if (fattura.getFl_extra_ue() != null &&
                        fattura.getFl_extra_ue().booleanValue()) {
                    if (fattura.getTi_bene_servizio() != null &&
                            Bene_servizioBulk.SERVIZIO.equalsIgnoreCase(fattura.getTi_bene_servizio())) {
                        fattura.setFl_merce_intra_ue(Boolean.FALSE);
                        if (fattura.isCommerciale()) {
                            fattura.setFl_autofattura(Boolean.TRUE);
                            fattura.setAutoFatturaNeeded(false);
                        }
                    } else {
                        fattura.setFl_autofattura(Boolean.FALSE);
                        //fattura.setAutoFatturaNeeded(false);
                    }
                }
                if (fattura.isCommerciale() && fattura.getFl_intra_ue() != null &&
                        fattura.getFl_intra_ue().booleanValue()) {
                    if (fattura.isFatturaDiServizi()) {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(false);
                        fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    } else {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(true);
                    }
                }
                if (fattura.isCommerciale() && fattura.getFl_san_marino_senza_iva() != null &&
                        fattura.getFl_san_marino_senza_iva().booleanValue()) {
                    if (fattura.isFatturaDiServizi()) {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(false);
                    } else {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(true);
                    }
                }
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                //bp.setModel(context,fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * richiede l'apertura del pannello dell'obbligazione per la modifica della
     * scadenza selezionata
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doOpenObbligazioniWindow(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);

            if (((Fattura_passivaBulk) bp.getModel()).isGenerataDaCompenso())
                throw new it.cnr.jada.comp.ApplicationException("La fattura passiva è stata generata da un compenso. Obbligazione non presente!");

            Obbligazione_scadenzarioBulk scadenza = (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel();
            boolean viewMode = bp.isViewing();
            if (scadenza == null)
                throw new it.cnr.jada.comp.ApplicationException("Selezionare l'impegno da " + (viewMode ? "visualizzare" : "modificare") + " in manuale!");
            if (bp.isDeleting() &&
                    !bp.isViewing() &&
                    !it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext()).equals(scadenza.getEsercizio()))
                throw new it.cnr.jada.comp.ApplicationException("La scadenza selezionata appartiene all'esercizio " + scadenza.getEsercizio().intValue() + "! Operazione annullata.");

            controllaQuadraturaConti(context, (Fattura_passivaBulk) bp.getModel());

            if (!viewMode && bp instanceof IDocumentoAmministrativoBP) {
                IDocumentoAmministrativoBP docAmmBP = (IDocumentoAmministrativoBP) bp;
                viewMode = !docAmmBP.getDocumentoAmministrativoCorrente().isEditable();
                //Nel caso di fp riportate con 1210...
                if (viewMode && bp instanceof CRUDFatturaPassivaIBP)
                    viewMode = !((CRUDFatturaPassivaIBP) docAmmBP).isManualModify();
            }

            //Fattura_passivaBulk fat_pas = (Fattura_passivaBulk)bp.getModel();
            //if ( fat_pas.getEsercizio().intValue() != fat_pas.getEsercizioInScrivania().intValue()){
            //viewMode = true;
            //}

            String status = viewMode ? "V" : "M";
            it.cnr.contab.doccont00.bp.CRUDVirtualObbligazioneBP nbp = it.cnr.contab.doccont00.bp.CRUDVirtualObbligazioneBP.getBusinessProcessFor(context, scadenza.getObbligazione(), status + "RSWTh");
            nbp.edit(context, scadenza.getObbligazione());
            ((ObbligazioneBulk) nbp.getModel()).setFromDocAmm(true);
            nbp.selezionaScadenza(scadenza, context);

            context.addHookForward("bringback", this, "doBringBackOpenObbligazioniWindow");
            HookForward hook = (HookForward) context.findForward("bringback");
            return context.addBusinessProcess(nbp);
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Risponde all'evento di fine cancellazione dei documentio amministrativi di tipo
     * passivo
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doPostConfirmDelete(
            ActionContext context,
            Risultato_eliminazioneVBulk re)
            throws BusinessProcessException {

        it.cnr.jada.util.action.CRUDBP bp = getBusinessProcess(context);
        Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
        String msg = "Cancellazione effettuata!";
        if (fp.isVoidable()) {
            msg = "Annullamento effettuato!";
            bp.edit(context, bp.getModel());
        } else {
            bp.reset(context);
        }

        if (!re.getDocumentiContabiliScollegati().isEmpty())
            msg = msg + " Alcuni documenti contabili creati contestualmente al documento amministrativo sono rimasti inalterati.";
        bp.setMessage(msg);
        return context.findDefaultForward();
    }

    /**
     * Gestisce il comando di aggiunta di un nuovo dettaglio su un CRUDController
     * figlio del ricevente
     */
    public Forward doRemoveFromCRUDMain_Dettaglio(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
            java.util.Vector dettagliInventariatiEliminati = new java.util.Vector();
            for (it.cnr.jada.util.action.SelectionIterator i = bp.getDettaglio().getSelection().iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaBulk dett = (Fattura_passiva_rigaBulk) bp.getDettaglio().getDetails().get(i.nextIndex());
                if (Optional.ofNullable(dett)
                        .filter(fattura_passiva_rigaBulk -> fattura_passiva_rigaBulk.isInventariato())
                        .flatMap(fattura_passiva_rigaBulk-> Optional.ofNullable(fattura_passiva_rigaBulk.getBene_servizio()))
                        .map(bene_servizioBulk ->
                                Optional.ofNullable(bene_servizioBulk.getFl_gestione_inventario()).orElse(Boolean.FALSE) &&
                                        Optional.ofNullable(bene_servizioBulk.getCrudStatus()).orElse(-1) != it.cnr.jada.bulk.OggettoBulk.UNDEFINED)
                        .orElse(Boolean.FALSE)) {
                    dettagliInventariatiEliminati.add(dett);
                }
            }
            bp.getDettaglio().remove(context);
            if (dettagliInventariatiEliminati.size() != 0) {
                for (java.util.Iterator i = dettagliInventariatiEliminati.iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dett = (Fattura_passiva_rigaBulk) i.next();
                    AssociazioniInventarioTable associazioni = fp.getAssociazioniInventarioHash();
                    if (associazioni != null && !associazioni.isEmpty() && dett instanceof Fattura_passiva_rigaIBulk) {
                        Ass_inv_bene_fatturaBulk ass = fp.getAssociationWithInventarioFor(dett);
                        if (ass != null && !ass.isPerAumentoValore()) {
                            Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) dett;
                            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                            h.rimuoviDaAssociazioniInventario(
                                    context.getUserContext(),
                                    dettaglio,
                                    ass);
                            fp.removeFromAssociazioniInventarioHash(ass, dettaglio);

                        } else if (ass != null && ass.isPerAumentoValore()) {
                            BuonoCaricoScaricoComponentSession buono_session = (BuonoCaricoScaricoComponentSession) bp.createComponentSession(
                                    "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                                    BuonoCaricoScaricoComponentSession.class);
                            Buono_carico_scaricoBulk buono = ass.getTest_buono();
                            buono.setToBeDeleted();
                            buono_session.eliminaConBulk(context.getUserContext(), buono);
                            for (java.util.Iterator iter = fp.getFattura_passiva_dettColl().iterator(); iter.hasNext(); ) {
                                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) iter.next();
                                if (riga.isInventariato() && !fp.getHa_beniColl()) riga.setInventariato(false);
                            }
                            Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) dett;
                            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                            h.rimuoviDaAssociazioniInventario(
                                    context.getUserContext(),
                                    dettaglio,
                                    ass);
                            fp.removeFromAssociazioniInventarioHash(ass, dettaglio);
                        }
                    } else if (associazioni != null && !associazioni.isEmpty() && dett instanceof Nota_di_credito_rigaBulk) {
                        Ass_inv_bene_fatturaBulk ass = fp.getAssociationWithInventarioFor(dett);
                        if (ass != null && !ass.isPerAumentoValore()) {
                            Nota_di_credito_rigaBulk dettaglio = (Nota_di_credito_rigaBulk) dett;
                            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                            h.rimuoviDaAssociazioniInventario(
                                    context.getUserContext(),
                                    ass);
                            fp.removeFromAssociazioniInventarioHash(ass, dettaglio);
                        }
                    } else if (associazioni != null && !associazioni.isEmpty() && dett instanceof Nota_di_debito_rigaBulk) {
                        Ass_inv_bene_fatturaBulk ass = fp.getAssociationWithInventarioFor(dett);
                        if (ass != null && !ass.isPerAumentoValore()) {
                            Nota_di_debito_rigaBulk dettaglio = (Nota_di_debito_rigaBulk) dett;
                            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                            h.rimuoviDaAssociazioniInventario(
                                    context.getUserContext(),
                                    ass);
                            fp.removeFromAssociazioniInventarioHash(ass, dettaglio);
                        } else if (ass != null && ass.isPerAumentoValore()) {
                            BuonoCaricoScaricoComponentSession buono_session = (BuonoCaricoScaricoComponentSession) bp.createComponentSession(
                                    "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                                    BuonoCaricoScaricoComponentSession.class);
                            Buono_carico_scaricoBulk buono = ass.getTest_buono();
                            buono.setToBeDeleted();
                            buono_session.eliminaConBulk(context.getUserContext(), buono);
                            for (java.util.Iterator iter = fp.getFattura_passiva_dettColl().iterator(); iter.hasNext(); ) {
                                Nota_di_debito_rigaBulk riga = (Nota_di_debito_rigaBulk) iter.next();
                                if (riga.isInventariato() && !fp.getHa_beniColl()) riga.setInventariato(false);
                            }
                            Nota_di_debito_rigaBulk dettaglio = (Nota_di_debito_rigaBulk) dett;
                            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                            h.rimuoviDaAssociazioniInventario(
                                    context.getUserContext(),
                                    ass);
                            fp.removeFromAssociazioniInventarioHash(ass, dettaglio);
                        }
                    } else {
                        CarichiInventarioTable carichi = fp.getCarichiInventarioHash();
                        if (carichi != null && !carichi.isEmpty()) {
                            BuonoCaricoScaricoComponentSession h = (BuonoCaricoScaricoComponentSession) bp.createComponentSession(
                                    "CNRINVENTARIO01_EJB_BuonoCaricoScaricoComponentSession",
                                    BuonoCaricoScaricoComponentSession.class);
                            for (java.util.Enumeration e = ((CarichiInventarioTable) carichi.clone()).keys(); e.hasMoreElements(); ) {
                                Buono_carico_scaricoBulk buono = (Buono_carico_scaricoBulk) e.nextElement();
                                buono.setToBeDeleted();
                                h.eliminaConBulk(context.getUserContext(), buono);
                                carichi.remove(buono);
                            }
                            for (java.util.Iterator iter = fp.getFattura_passiva_dettColl().iterator(); iter.hasNext(); ) {
                                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) iter.next();
                                if (riga.isInventariato() && !fp.getHa_beniColl()) riga.setInventariato(false);
                            }
                        } else
                            bp.getDettaglio().setInventoriedChildDeleted(true);
                    }
                }
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }


    public Forward doRemoveFromCRUDMain_Ordini(ActionContext context) throws ApplicationException {
        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        Selection selection = bp.getFattureRigaOrdiniController().getSelection();
        Optional.ofNullable(selection)
                .filter(selection1 -> !selection1.isEmpty())
                .orElseThrow(() -> new ApplicationException("Selezionare le consegne che si desidera eliminare!"));


        final List<FatturaOrdineBulk> details = bp.getFattureRigaOrdiniController().getDetails();
        final Iterator<Integer> iterator = selection.iterator();
        List<FatturaOrdineBulk> bulksToRemove = new ArrayList<FatturaOrdineBulk>();
        iterator.forEachRemaining(index -> {
            try {
                final FatturaOrdineBulk fatturaOrdineBulk = details.get(index);
                OrdineAcqConsegnaBulk ordineAcqConsegna = (OrdineAcqConsegnaBulk) bp.createComponentSession()
                        .findByPrimaryKey(context.getUserContext(), fatturaOrdineBulk.getOrdineAcqConsegna());
                ordineAcqConsegna.setStatoFatt(OrdineAcqConsegnaBulk.STATO_FATT_NON_ASSOCIATA);
                ordineAcqConsegna.setToBeUpdated();
                bp.createComponentSession().modificaConBulk(
                        context.getUserContext(),
                        ordineAcqConsegna);
                bulksToRemove.add(fatturaOrdineBulk);
            } catch (ComponentException |RemoteException|BusinessProcessException e) {
                throw new DetailedRuntimeException(e);
            }
        });
        bulksToRemove.stream()
                .forEach(fatturaOrdineBulk -> {
                    final Fattura_passiva_rigaBulk fattura_passiva_rigaBulk = fattura.getFatturaRigaOrdiniHash().getKey(fatturaOrdineBulk);
                    fatturaOrdineBulk.setToBeDeleted();
                    bp.getFattureRigaOrdiniController().getDetails().remove(fatturaOrdineBulk);
                    if (fattura.getFatturaRigaOrdiniHash().get(fattura_passiva_rigaBulk).isEmpty()) {
                        fattura_passiva_rigaBulk.setStato_cofi(Fattura_passiva_IBulk.STATO_INIZIALE);
                    }
                });
        bp.getFattureRigaOrdiniController().getSelection().clear();
        return context.findDefaultForward();
    }
    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di cancellazione dal controller "obbligazioni"
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doRemoveFromCRUDMain_Obbligazioni(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        it.cnr.jada.util.action.Selection selection = bp.getObbligazioniController().getSelection();
        try {
            if (selection.isEmpty())
                throw new it.cnr.jada.comp.ApplicationException("Selezionare le scadenze che si desidera eliminare!");
        } catch (it.cnr.jada.comp.ApplicationException e) {
            return handleException(context, e);
        }
        java.util.List obbligazioni = bp.getObbligazioniController().getDetails();
        for (it.cnr.jada.util.action.SelectionIterator i = selection.iterator(); i.hasNext(); ) {
            Obbligazione_scadenzarioBulk obbligazione = (Obbligazione_scadenzarioBulk) obbligazioni.get(i.nextIndex());
            java.util.Vector models = (java.util.Vector) ((Fattura_passivaBulk) bp.getModel()).getFattura_passiva_obbligazioniHash().get(obbligazione);
            try {
                if (models != null && models.isEmpty()) {
                    Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
                    fattura.getFattura_passiva_obbligazioniHash().remove(obbligazione);
                    fattura.addToDocumentiContabiliCancellati(obbligazione);
                } else {
                    for (java.util.Iterator it = models.iterator(); it.hasNext(); ) {
                        Fattura_passiva_rigaBulk fpr = (Fattura_passiva_rigaBulk) it.next();
                        if (fpr.getTi_associato_manrev() != null && fpr.ASSOCIATO_A_MANDATO.equalsIgnoreCase(fpr.getTi_associato_manrev()))
                            throw new it.cnr.jada.comp.ApplicationException("Impossibile scollegare l'impegno \"" +
                                    +obbligazione.getEsercizio_originale().intValue()
                                    + "/" + obbligazione.getPg_obbligazione().longValue() +
                                    "\" perchè il dettaglio collegato \"" +
                                    ((fpr.getDs_riga_fattura() != null) ?
                                            fpr.getDs_riga_fattura() :
                                            String.valueOf(fpr.getProgressivo_riga().longValue())) +
                                    "\" è associato a mandato.");
                    }
                    scollegaDettagliDaObbligazione(context, (java.util.List) models.clone());
                }
            } catch (it.cnr.jada.comp.ComponentException e) {
                return handleException(context, e);
            }

            doCalcolaTotalePerObbligazione(context, null);

            Fattura_passiva_IBulk fattura = (Fattura_passiva_IBulk) bp.getModel();
            setAndVerifyStatusFor(context, fattura);

            bp.getObbligazioniController().getSelection().clear();
            bp.getObbligazioniController().setModelIndex(context, -1);
            bp.setDirty(true);
        }
        return context.findDefaultForward();
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di cancellazione dal controller "obbligazioni_DettaglioObbligazioni"
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doRemoveFromCRUDMain_Obbligazioni_DettaglioObbligazioni(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        try {
            it.cnr.jada.util.action.Selection selection = bp.getDettaglioObbligazioneController().getSelection();
            if (selection.isEmpty())
                throw new it.cnr.jada.comp.ApplicationException("Selezionare i dettagli che si desidera scollegare!");
            java.util.List models = selection.select(bp.getDettaglioObbligazioneController().getDetails());
            for (java.util.Iterator i = models.iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaBulk fpr = (Fattura_passiva_rigaBulk) i.next();
                if (fpr.getTi_associato_manrev() != null && fpr.ASSOCIATO_A_MANDATO.equalsIgnoreCase(fpr.getTi_associato_manrev()))
                    throw new it.cnr.jada.comp.ApplicationException("Impossibile scollegare il dettaglio \"" +
                            ((fpr.getDs_riga_fattura() != null) ?
                                    fpr.getDs_riga_fattura() :
                                    String.valueOf(fpr.getProgressivo_riga().longValue())) +
                            "\" perchè associato a mandato.");
            }
            scollegaDettagliDaObbligazione(context, models);
        } catch (it.cnr.jada.comp.ComponentException e) {
            return handleException(context, e);
        }

        doCalcolaTotalePerObbligazione(context, (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel());

        Fattura_passiva_IBulk fattura = (Fattura_passiva_IBulk) bp.getModel();
        setAndVerifyStatusFor(context, fattura);

        bp.getDettaglioObbligazioneController().getSelection().clear();
        bp.getDettaglioObbligazioneController().setModelIndex(context, -1);
        java.util.List dettagli = bp.getDettaglioObbligazioneController().getDetails();
        if (dettagli == null || dettagli.isEmpty()) {
            bp.getObbligazioniController().getSelection().clear();
            bp.getObbligazioniController().setModelIndex(context, -1);
        }
        bp.setDirty(true);

        return context.findDefaultForward();
    }

    public Forward doRicercaObbligazione(ActionContext context) {
        return doRicercaObbligazione(context, true);
    }
    /**
     * Ricerca un'obbligazione valida da associare al doc amm
     * richeide la validità delle selezioni effettuate
     */
    public Forward doRicercaObbligazione(ActionContext context, boolean manually) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);
            Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
            Optional<List> models = Optional.ofNullable(bp.getDettaglio().getSelectedModels(context))
                    .map(list -> {
                        final int focus = bp.getDettaglio().getSelection().getFocus();
                        if (list.isEmpty() && Optional.ofNullable(fatturaPassiva.getFlDaOrdini())
                                .filter(isDaOrdini -> isDaOrdini.equals(Boolean.TRUE)).isPresent() && focus != -1) {
                            list.add(bp.getDettaglio().getDetails().get(focus));
                        }
                        return list;
                    })
                    .filter(list -> !list.isEmpty());
            if (!models.isPresent()) {
                bp.setErrorMessage("Per procedere, selezionare i dettagli da contabilizzare!");
                return context.findDefaultForward();
            }
            final Boolean isDaOrdini = Optional.ofNullable(fatturaPassiva.getFlDaOrdini())
                    .filter(daOrdini -> daOrdini.equals(Boolean.TRUE))
                    .orElse(false);

            if (fatturaPassiva.isGestione_doc_ele() && fatturaPassiva.isGenerataDaCompenso())
                throw new it.cnr.jada.comp.ApplicationException("La fattura deve essere associata a compenso, la contabilizzazione verrà fatta direttamente nel compenso!");
            if (fatturaPassiva.getFornitore() == null || fatturaPassiva.getFornitore().getCrudStatus() == it.cnr.jada.bulk.OggettoBulk.UNDEFINED)
                throw new it.cnr.jada.comp.ApplicationException("Per eseguire questa operazione è necessario impostare un fornitore!");
            if (!isDaOrdini) {
                controllaSelezionePerContabilizzazione(context, models.get().iterator());
                try {
                    controllaSelezionePerTitoloCapitoloLista(context, models.get().iterator());
                } catch (ApplicationException e) {
                    throw new it.cnr.jada.comp.ApplicationException(e.getMessage());
                }
            }
            if (isDaOrdini)
                return basicDoRicercaEvasioneOrdine(context, fatturaPassiva, models.get(), manually);
            else
                return basicDoRicercaObbligazione(context, fatturaPassiva, models.get());
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }
    /**
     * Ricerca un'obbligazione valida da associare al doc amm
     * richeide la validità delle selezioni effettuate
     */
    public Forward doContabilzzaRighePerOrdini(ActionContext context) {
        return doRicercaObbligazione(context, false);
    }

    public Forward doRiportaAvanti(ActionContext context) throws java.rmi.RemoteException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();

        try {
            fillModel(context);
            bp.salvaRiportandoAvanti(context);
            bp.getObbligazioniController().setModelIndex(context, -1);
            return context.findDefaultForward();
        } catch (ValidationException e) {
            bp.setErrorMessage(e.getMessage());
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doRiportaIndietro(ActionContext context) throws java.rmi.RemoteException {

        try {
            fillModel(context);
            ((CRUDFatturaPassivaBP) getBusinessProcess(context)).riportaIndietro(context);
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }

    }

    /**
     * Apre il doc amm selezionato.
     * Nel caso di apertura da spesa per fondo economale, viene riportato l'elemento
     * nel fondo
     */
    public Forward doRiportaSelezione(ActionContext context) throws java.rmi.RemoteException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        if (bp instanceof IDocumentoAmministrativoSpesaBP && ((IDocumentoAmministrativoSpesaBP) bp).isSpesaBP()) {
            HookForward caller = (HookForward) context.getCaller();
            it.cnr.jada.bulk.OggettoBulk selezione = (it.cnr.jada.bulk.OggettoBulk) caller.getParameter("focusedElement");
            return basicDoRiportaSelezione(context, selezione);
        }
        return super.doRiportaSelezione(context);
    }

    /**
     * Gestisce una richiesta di salvataggio. Rimplementato
     */
    public Forward doSalva(ActionContext context) throws java.rmi.RemoteException {

        Forward fwd = super.doSalva(context);

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);

        //Azzero la selezione del controller obbligazioni per forzare il calcolo dei dettagli
        //associati all'obbligazione selezionata

        bp.getObbligazioniController().setModelIndex(context, -1);

        return fwd;
    }

    /**
     * Ricerca le banche valide
     */
    public Forward doSearchListabanche(ActionContext context) {

        Fattura_passivaBulk fattura = (Fattura_passivaBulk) getBusinessProcess(context).getModel();
        if (getBusinessProcess(context).isInserting())
            return search(context, getFormField(context, "main.listabanche"), fattura.getModalita_pagamento().getTiPagamentoColumnSet());
        else {
            getBusinessProcess(context).setMessage("Esiste almeno un dettaglio e quindi la Modalità di pagamento deve essere cambiata sul dettaglio stesso.");
            return context.findDefaultForward();
        }
    }

    public Forward doSearchListabanchedett(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passiva_rigaBulk fatturaRiga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();
        return search(context, getFormField(context, "main.Dettaglio.listabanchedett"), fatturaRiga.getModalita_pagamento().getTiPagamentoColumnSet());
    }

    /**
     * Ricerca i sospesi validi per associazione a lettera di pagamento
     */
    public Forward doSearchSospeso(ActionContext context) {

        Fattura_passivaBulk fattura = (Fattura_passivaBulk) getBusinessProcess(context).getModel();
        if (fattura != null && fattura.getLettera_pagamento_estero() != null) {
            Lettera_pagam_esteroBulk lettera = fattura.getLettera_pagamento_estero();
            if (lettera.getSospeso() == null)
                try {
                    doBlankSearchSospeso(context, fattura);
                } catch (Exception e) {
                    return handleException(context, e);
                }
            return search(context, getFormField(context, "main.sospeso"), null);
        }
        return null;
    }

    /**
     * <!-- @TODO: da completare -->
     * Gestisce una richiesta di selezione dal controller "obbligazioni"
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doSelectObbligazioni(ActionContext context) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
        try {
            bp.getObbligazioniController().setSelection(context);
        } catch (Throwable e) {
            return handleException(context, e);
        }

        doCalcolaTotalePerObbligazione(context, (Obbligazione_scadenzarioBulk) bp.getObbligazioniController().getModel());
        return context.findDefaultForward();
    }

    /**
     * Viene richiamato nel momento in cui si seleziona una valuta dal combo Valuta nella
     * testata della fattura.
     * Viene ricercato il cambio valido, vengono ricalcolati i totali e ricalcolato il
     * totale in eur
     */
    public Forward doSelezionaValuta(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            DivisaBulk divisa = fattura.getValuta();
            it.cnr.jada.bulk.PrimaryKeyHashtable vecchiTotali = new it.cnr.jada.bulk.PrimaryKeyHashtable();
            if (fattura instanceof Fattura_passiva_IBulk) {
                for (java.util.Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaIBulk dettaglio = (Fattura_passiva_rigaIBulk) i.next();
                    java.math.BigDecimal vecchioTotale = dettaglio.getIm_imponibile().add(dettaglio.getIm_iva());
                    vecchioTotale = vecchioTotale.add(dettaglio.getIm_totale_addebiti());
                    vecchiTotali.put(dettaglio, vecchioTotale);
                }
            }
            fillModel(context);
            try {
                if (!bp.isSearching()) {
                    FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
                    fattura = h.cercaCambio(context.getUserContext(), fattura);
                    basicDoCalcolaTotaleFatturaFornitoreInEur(fattura);
                    for (java.util.Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                        Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                        if (dettaglio instanceof Fattura_passiva_rigaIBulk) {
                            java.math.BigDecimal vecchioTotale = (java.math.BigDecimal) vecchiTotali.get(dettaglio);
                            if (vecchioTotale == null)
                                vecchioTotale = new java.math.BigDecimal(0).setScale(2, java.math.BigDecimal.ROUND_HALF_UP);
                            basicCalcolaImportoDisponibileNC(context, (Fattura_passiva_rigaIBulk) dettaglio, vecchioTotale);
                        }
                    }

                    bp.setModel(context, fattura);
                    if (fattura.getObbligazioniHash() != null && !fattura.getObbligazioniHash().isEmpty())
                        bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze delle obbligazioni!");
                    if (fattura.getAccertamentiHash() != null && !fattura.getAccertamentiHash().isEmpty())
                        bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze degli accertamenti!");
                }
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setValuta(divisa);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    /**
     * Seleziona la valuta di default
     */
    public Fattura_passivaBulk doSelezionaValutaDefault(ActionContext context, Fattura_passivaBulk fattura)
            throws ComponentException {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();
            fattura = h.selezionaValutaDiDefault(context.getUserContext(), fattura);
            basicDoCalcolaTotaleFatturaFornitoreInEur(fattura);
            if (fattura.getObbligazioniHash() != null && !fattura.getObbligazioniHash().isEmpty())
                bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze delle obbligazioni!");
            if (fattura.getAccertamentiHash() != null && !fattura.getAccertamentiHash().isEmpty())
                bp.setErrorMessage("Attenzione: si ricorda che modificando il valore del cambio è necessario riportare in quadratura le scadenze degli accertamenti!");
            return fattura;
        } catch (BusinessProcessException e) {
            throw new ComponentException(e);
        } catch (java.rmi.RemoteException e) {
            throw new ComponentException(e);
        }
    }

    /**
     * Gestisce un cambiamento di pagina su un controllo tabbed {@link it.cnr.jada.util.jsp.JSPUtils.tabbed}
     */
    public Forward doTab(ActionContext context, String tabName, String pageName) {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
        try {
            if ("tabFatturaPassiva".equalsIgnoreCase(bp.getTab(tabName))) {
                fillModel(context);
//			try {
                if (!bp.isSearching() && !bp.isViewing() && !fattura.isRODateCompetenzaCOGE()){
                    fattura.validaDateCompetenza();
                }
                if (!bp.isSearching() && !bp.isViewing()){
                	if ((((FatturaPassivaComponentSession) bp.createComponentSession()).estraeSezionali(context.getUserContext(), fattura)!= null) && ! (((FatturaPassivaComponentSession) bp.createComponentSession()).estraeSezionali(context.getUserContext(), fattura).isEmpty())){ 
            			boolean trovato=false;
            			for (java.util.Iterator i = ((FatturaPassivaComponentSession) bp.createComponentSession()).estraeSezionali(context.getUserContext(), fattura).iterator(); i.hasNext(); ) {
            				Tipo_sezionaleBulk tipo=(Tipo_sezionaleBulk)i.next();
            				if (tipo.getCd_tipo_sezionale().compareTo(fattura.getCd_tipo_sezionale())==0)
            	 					trovato=true;
            			}
            			if(!trovato)
            	  				throw new it.cnr.jada.comp.ApplicationException("Attenzione: verificare il sezionale selezionato.");
                	}
                }
                //} catch (ValidationException e) {
                //bp.setErrorMessage(e.getMessage());
                //}
            }
            if ("tabFatturaPassivaDettaglio".equalsIgnoreCase(bp.getTab(tabName))) {
                fillModel(context);
                bp.getDettaglio().validate(context);
                try {
                    if (!bp.isSearching())
                        controllaQuadraturaConti(context, fattura);
                } catch (it.cnr.jada.comp.ApplicationException e) {
                    bp.setErrorMessage(e.getMessage());
                }
            }
            if ("tabFatturaPassivaObbligazioni".equalsIgnoreCase(bp.getTab(tabName))) {
                try {
                    fillModel(context);
                    if (!bp.isSearching())
                        controllaQuadraturaObbligazioni(context, fattura);
                } catch (it.cnr.jada.comp.ApplicationException e) {
                    bp.setErrorMessage(e.getMessage());
                }
            }
            if ("tabFatturaPassivaIntrastat".equalsIgnoreCase(bp.getTab(tabName))) {
                fillModel(context);
                bp.getDettaglioIntrastatController().validate(context);
            }
            if (pageName.equalsIgnoreCase("tabFatturaPassivaConsuntivo")) {
                fillModel(context);
                FatturaPassivaComponentSession h = (FatturaPassivaComponentSession) bp.createComponentSession();

                fattura = (Fattura_passivaBulk) h.calcoloConsuntivi(context.getUserContext(), fattura);
                bp.setModel(context, fattura);
            }
            return super.doTab(context, tabName, pageName);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * ricerca le note di credito per la fattura passiva aperta
     */

    private it.cnr.jada.util.RemoteIterator findNoteDiCreditoFor(
            ActionContext context,
            Fattura_passiva_IBulk fatt) throws it.cnr.jada.comp.ComponentException {

        try {
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
            return ((FatturaPassivaComponentSession) bp.createComponentSession()).findNotaDiCreditoFor(context.getUserContext(), fatt);
        } catch (java.rmi.RemoteException e) {
            throw new it.cnr.jada.comp.ComponentException(e);
        } catch (BusinessProcessException e) {
            throw new it.cnr.jada.comp.ComponentException(e);
        }
    }

    /**
     * ricerca le note di debito per la fattura passiva aperta
     */

    private it.cnr.jada.util.RemoteIterator findNoteDiDebitoFor(
            ActionContext context,
            Fattura_passiva_IBulk fatt) throws it.cnr.jada.comp.ComponentException {

        try {
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
            return ((FatturaPassivaComponentSession) bp.createComponentSession()).findNotaDiDebitoFor(context.getUserContext(), fatt);
        } catch (java.rmi.RemoteException e) {
            throw new it.cnr.jada.comp.ComponentException(e);
        } catch (BusinessProcessException e) {
            throw new it.cnr.jada.comp.ComponentException(e);
        }
    }

    /**
     * Restituisce un vettore di dettagli ancora da inventariare
     *
     * @param context  L'ActionContext della richiesta
     * @param dettagli
     * @return
     */
    protected java.util.List getDettagliDaInventariare(
            ActionContext context,
            java.util.Iterator dettagli) {

        java.util.Vector coll = new java.util.Vector();
        if (dettagli != null) {
            while (dettagli.hasNext()) {
                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) dettagli.next();
                if (riga.getBene_servizio() != null && riga.getBene_servizio().getCd_bene_servizio() != null &&
                        riga.getBene_servizio().getFl_gestione_inventario() != null &&
                        riga.getBene_servizio().getFl_gestione_inventario().booleanValue() &&
                        !riga.isInventariato())
                    coll.add(riga);
            }
        }
        return coll;
    }

    /**
     * Restituisce tra i dettagli passati in argomento quelli che sono in uno degli
     * stati specificati in statiDettaglio
     *
     * @param context        L'ActionContext della richiesta
     * @param dettagli
     * @param statiDettaglio
     * @return
     */
    protected java.util.List getDettagliInStato(
            ActionContext context,
            java.util.Iterator dettagli,
            String[] statiDettaglio) {

        java.util.Vector coll = new java.util.Vector();
        if (dettagli != null) {
            while (dettagli.hasNext()) {
                Nota_di_credito_rigaBulk rigaNdC = (Nota_di_credito_rigaBulk) dettagli.next();
                for (int cont = 0; cont < statiDettaglio.length; cont++) {
                    String statoDettaglio = statiDettaglio[cont];
                    if (statoDettaglio.equals(rigaNdC.getRiga_fattura_origine().getStato_cofi()))
                        if (!coll.contains(rigaNdC))
                            coll.add(rigaNdC);
                }
            }
        }
        return coll;
    }

    /**
     * Restituisce l'importo che deve assumere la scadenza nel caso di modifica automatica
     *
     * @param context        L'ActionContext della richiesta
     * @param scadenza
     * @param fatturaPassiva
     * @param delta
     * @return
     */
    protected java.math.BigDecimal getImportoPerAggiornamentoScadenzaInAutomatico(
            ActionContext context,
            Obbligazione_scadenzarioBulk scadenza,
            Fattura_passivaBulk fatturaPassiva,
            java.math.BigDecimal delta) {

        //if (fatturaPassiva instanceof Fattura_passiva_IBulk) {
        //Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk)fatturaPassiva;
        //if (fp.isDoc1210Associato()) {
        //java.math.BigDecimal impLettera = fp.getLettera_pagamento_estero().getIm_pagamento();
        //return (fp.quadraturaInDeroga1210()) ? impLettera.add(fp.getIm_totale_iva()) : impLettera;
        //}
        //}
        return fatturaPassiva.getImportoTotalePerObbligazione();
    }

    /**
     * Restituisce tra i dettagli passati in argomento quelli che sono in uno degli
     * stati specificati in statiDettaglio
     *
     * @param context        L'ActionContext della richiesta
     * @param dettagli
     * @param statiDettaglio
     * @return
     */
    protected it.cnr.jada.util.action.Selection getIndexSelectionOn(
            it.cnr.jada.util.action.Selection selection,
            java.util.List dett,
            String property) {

        int jindex = 0;
        int position = 0;
        it.cnr.jada.util.action.Selection newSelection = new it.cnr.jada.util.action.Selection();
        for (it.cnr.jada.util.action.SelectionIterator i = selection.iterator(); i.hasNext(); ) {
            int index = i.nextIndex();
            do {
                Object obj = null;
                do {
                    obj = dett.get(jindex++);
                } while (it.cnr.jada.util.Introspector.getBoolean(obj, property, true));
            } while (position++ != index);
            newSelection.addToSelection(jindex - 1);
        }
        return newSelection;
    }

    protected Forward handleException(ActionContext context, Throwable ex) {
        try {
            throw ex;
        } catch (it.cnr.contab.doccont00.comp.CheckDisponibilitaCassaFailed e) {
            Fattura_passivaBulk doc = (Fattura_passivaBulk) ((CRUDFatturaPassivaBP) context.getBusinessProcess()).getModel();
            if (doc instanceof Fattura_passiva_IBulk) {
                Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) doc;
                if (fp.isDoc1210Associato()) {
                    String msg = "L'importo della lettera di pagamento 1210 supera la disponiblità di cassa relativa al capitolo! Operazione interrotta.";
                    return super.handleException(context, new it.cnr.jada.comp.ApplicationException(msg));
                }
            }
            return super.handleException(context, e);
        } catch (Throwable e) {
            return super.handleException(context, e);
        }
    }

    /**
     * Ricerca un boolean 'true' se tra i dettagli 'models' ne esiste qualcuno con
     * associati storni o addebiti
     */

    private boolean hasRangeDetailWithDocAmmAssociated(ActionContext context, java.util.List models) {

        if (models != null) {
            for (java.util.Iterator i = models.iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                if (dettaglio instanceof Fattura_passiva_rigaIBulk) {
                    Fattura_passiva_rigaIBulk rigaFP = (Fattura_passiva_rigaIBulk) dettaglio;
                    if (rigaFP.hasStorni() || rigaFP.hasAddebiti())
                        return true;
                }
            }
        }
        return false;
    }

    /**
     * Restituisce un boolean 'true' se tra i dettagli 'details' esiste un dettaglio
     * con chiave primaria uguale a quella di 'rigaNdC'
     */

    private boolean isRigaContainedInDetails(Nota_di_credito_rigaBulk rigaNdC, java.util.List details) {

        if (details == null || details.isEmpty() || rigaNdC == null)
            return false;

        for (java.util.Iterator i = details.iterator(); i.hasNext(); ) {
            Nota_di_credito_rigaBulk dettaglio = (Nota_di_credito_rigaBulk) i.next();
            if (dettaglio.getRiga_fattura_origine().equalsByPrimaryKey(rigaNdC.getRiga_fattura_origine()))
                return true;
        }
        return false;
    }

    /**
     * Restituisce un boolean 'true' se tra i dettagli 'details' esiste un dettaglio
     * con chiave primaria uguale a quella di 'rigaNdD'
     */

    private boolean isRigaContainedInDetails(Nota_di_debito_rigaBulk rigaNdD, java.util.List details) {

        if (details == null || details.isEmpty() || rigaNdD == null)
            return false;

        for (java.util.Iterator i = details.iterator(); i.hasNext(); ) {
            Nota_di_debito_rigaBulk dettaglio = (Nota_di_debito_rigaBulk) i.next();
            if (dettaglio.getRiga_fattura_origine().equalsByPrimaryKey(rigaNdD.getRiga_fattura_origine()))
                return true;
        }
        return false;
    }

    /**
     * Risincronizza la collezione delle obbligazioni (richiamato dopo la modifica di
     * una scadenza associata al doc amm).
     * Se questa collezione contiene in chiave la oldObblig (scadenza vecchia), essa
     * viene eliminata e i dettagli ad essa associati vengono ricontabilizzati sulla
     * newObblig (scadenza modificata dall'utente); se non ha ancora dettagli associati
     * viene semplicemente eliminata
     * ('scollegaDettagliDaObbligazione')
     */

    private void resyncObbligazione(
            ActionContext context,
            Obbligazione_scadenzarioBulk oldObblig,
            Obbligazione_scadenzarioBulk newObblig)
            throws it.cnr.jada.comp.ComponentException {

        CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
        Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
        java.util.Vector models = ((java.util.Vector) fatturaPassiva.getFattura_passiva_obbligazioniHash().get(oldObblig));
        java.util.Vector clone = (java.util.Vector) models.clone();
        if (!clone.isEmpty())
            scollegaDettagliDaObbligazione(context, clone);
        else
            fatturaPassiva.getFattura_passiva_obbligazioniHash().remove(oldObblig);

        basicDoContabilizza(context, newObblig, clone);
    }

    /**
     * Risincronizza la collezione delle obbligazioni (richiamato dopo la modifica di
     * una scadenza associata al doc amm).
     * Se questa collezione contiene in chiave la oldObblig (scadenza vecchia), essa
     * viene eliminata e i dettagli ad essa associati vengono ricontabilizzati sulla
     * newObblig (scadenza modificata dall'utente); se non ha ancora dettagli associati
     * viene semplicemente eliminata
     * Se uno dei dettagli ha un'associazione con note di credito/debito e se non
     * sono in fase di cancellazione della fattura passiva, l'operazione viene interrotta
     */

    private void scollegaDettagliDaObbligazione(ActionContext context, java.util.List models)
            throws it.cnr.jada.comp.ComponentException {

        if (models != null) {
            try {
//			if (!((CRUDFatturaPassivaBP)getBusinessProcess(context)).isDeleting() &&
//				hasRangeDetailWithDocAmmAssociated(context, models))
//				throw new it.cnr.jada.comp.ApplicationException("Uno o più dettagli hanno storni o addebiti collegati! Impossibile scollegare.");

                for (java.util.Iterator i = models.iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaBulk dettaglio = (Fattura_passiva_rigaBulk) i.next();
                    if (!dettaglio.STATO_CONTABILIZZATO.equals(dettaglio.getStato_cofi()))
                        throw new it.cnr.jada.comp.ApplicationException("Non è possibile scollegare il dettaglio \"" + dettaglio.getDs_riga_fattura() + "\". Questa operazione è permessa solo per dettagli in stato \"" + dettaglio.STATO.get(dettaglio.STATO_CONTABILIZZATO) + "\".");
                    dettaglio.getFattura_passiva().removeFromFattura_passiva_obbligazioniHash(dettaglio);
                    dettaglio.setStato_cofi(dettaglio.STATO_INIZIALE);
                    dettaglio.setObbligazione_scadenziario(null);
                    dettaglio.setToBeUpdated();
                }
            } catch (it.cnr.jada.comp.ApplicationException e) {
                try {
                    CRUDVirtualObbligazioneBP.rollbackToSafePoint(context);
                } catch (Throwable t) {
                    throw new ComponentException(t);
                }
                throw e;
            }
        }
    }

    /**
     * Gestisce una richiesta di ricerca su un searchtool
     */
    public Forward search(ActionContext context, FormField field, String columnSet) {

        try {
            if (field != null && "fornitore".equals(field.getField().getName())) {
                CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) context.getBusinessProcess();
                Fattura_passivaBulk fatturaPassiva = (Fattura_passivaBulk) bp.getModel();
                if (!bp.isSearching() && fatturaPassiva != null && fatturaPassiva.getDt_fattura_fornitore() == null)
                    throw new it.cnr.jada.comp.ApplicationException("Impostare la data di emissione del documento del fornitore");
            }
            return super.search(context, field, columnSet);
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    /**
     * Verifica o imposta lo stato della fattura
     */
    protected void setAndVerifyStatusFor(ActionContext context, Fattura_passivaBulk fatturaPassiva) {

        if (fatturaPassiva != null)
            fatturaPassiva.setAndVerifyStatus();
    }

    /**
     * Gestisce il cambiamento del flag Extra UE ricaricando i sezionali
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */

    public Forward doOnFlMerceExtraUEChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            fillModel(context);
            try {
                if (Boolean.TRUE.equals(fattura.getFl_merce_extra_ue())) {
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_merce_intra_ue(Boolean.FALSE);
                    if (!fattura.isPromiscua())
                        fattura.setTi_bene_servizio(fattura.FATTURA_DI_BENI);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(true);
                } else {
                    fattura.setTi_bene_servizio(null);
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                }

                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    public Forward doOnLiquidazioneDifferitaChange(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            if (fattura.getPg_fattura_passiva() != null) {
                it.cnr.jada.util.RemoteIterator ric = findNoteDiCreditoFor(context, (Fattura_passiva_IBulk) bp.getModel());
                ric = it.cnr.jada.util.ejb.EJBCommonServices.openRemoteIterator(context, ric);
                if (ric != null && ric.countElements() != 0) {
                    it.cnr.jada.util.ejb.EJBCommonServices.closeRemoteIterator(context, ric);
                    fattura.setFl_liquidazione_differita((fattura.getFl_liquidazione_differita()) ? Boolean.FALSE : Boolean.TRUE);
                    bp.setModel(context, fattura);
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile effettuare tale modifica poichè esistono note di credito collegate per questa fattura!");
                    //bp.setMessage("Non è possibile effettuare tale modifica poichè esistono note di credito collegate per questa fattura!");
                }
                it.cnr.jada.util.RemoteIterator rid = findNoteDiDebitoFor(context, (Fattura_passiva_IBulk) bp.getModel());
                rid = it.cnr.jada.util.ejb.EJBCommonServices.openRemoteIterator(context, rid);
                if (rid != null && rid.countElements() != 0) {
                    it.cnr.jada.util.ejb.EJBCommonServices.closeRemoteIterator(context, rid);
                    fattura.setFl_liquidazione_differita((fattura.getFl_liquidazione_differita()) ? Boolean.FALSE : Boolean.TRUE);
                    bp.setModel(context, fattura);
                    throw new it.cnr.jada.comp.ApplicationException("Non è possibile effettuare tale modifica poichè esistono note di debito collegate per questa fattura!");
                    //bp.setMessage("Non è possibile effettuare tale modifica poichè esistono note di debito collegate per questa fattura!");
                }
            }

        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    public Forward doOnStatoFondoEconChange(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();

            if (!fattura.getStato_pagamento_fondo_eco().equals(fattura.NO_FONDO_ECO)
                    && Boolean.TRUE.equals(fattura.getFl_liquidazione_differita()))

                fattura.setFl_liquidazione_differita(Boolean.FALSE);

            bp.setModel(context, fattura);
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    public Forward doOnFlMerceIntraUEChange(ActionContext context) {

        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean intraUE = fattura.getFl_intra_ue();
            Boolean extraUE = fattura.getFl_extra_ue();
            Boolean sanMarinoCI = fattura.getFl_san_marino_con_iva();
            Boolean sanMarinoSI = fattura.getFl_san_marino_senza_iva();
            Boolean spedizioniere = fattura.getFl_spedizioniere();
            Boolean bollaDoganale = fattura.getFl_bolla_doganale();
            String spesa = fattura.getStato_pagamento_fondo_eco();
            Boolean autof = fattura.getFl_autofattura();
            String fattServizi = fattura.getTi_bene_servizio();
            Boolean merceextraUE = fattura.getFl_merce_extra_ue();
            Boolean merceintraUE = fattura.getFl_merce_intra_ue();
            fillModel(context);
            try {
                if (Boolean.TRUE.equals(fattura.getFl_merce_intra_ue())) {
                    fattura.setFl_san_marino_con_iva(Boolean.FALSE);
                    fattura.setFl_san_marino_senza_iva(Boolean.FALSE);
                    fattura.setFl_bolla_doganale(Boolean.FALSE);
                    fattura.setFl_spedizioniere(Boolean.FALSE);
                    fattura.setStato_pagamento_fondo_eco(fattura.NO_FONDO_ECO);
                    fattura.setFl_intra_ue(Boolean.FALSE);
                    fattura.setFl_merce_extra_ue(Boolean.FALSE);
                    if (!fattura.isPromiscua())
                        fattura.setTi_bene_servizio(fattura.FATTURA_DI_BENI);
                    if (fattura.isCommerciale()) {
                        fattura.setFl_autofattura(Boolean.TRUE);
                        fattura.setAutoFatturaNeeded(true);
                    }
                } else {
                    fattura.setTi_bene_servizio(null);
                    fattura.setFl_extra_ue(Boolean.FALSE);
                    fattura.setFl_autofattura(Boolean.FALSE);
                    fattura.setAutoFatturaNeeded(false);
                    if (!fattura.isDefaultValuta())
                        fattura = doSelezionaValutaDefault(context, fattura);
                }

                if (fattura instanceof Fattura_passiva_IBulk)
                    ((Fattura_passiva_IBulk) fattura).setFattura_estera(null);
                basicDoOnIstituzionaleCommercialeChange(context, fattura);
                bp.setModel(context, fattura);
                return context.findDefaultForward();
            } catch (it.cnr.jada.comp.ComponentException e) {
                fattura.setFl_intra_ue(intraUE);
                fattura.setFl_extra_ue(extraUE);
                fattura.setFl_san_marino_con_iva(sanMarinoCI);
                fattura.setFl_san_marino_senza_iva(sanMarinoSI);
                fattura.setFl_bolla_doganale(bollaDoganale);
                fattura.setFl_spedizioniere(spedizioniere);
                fattura.setStato_pagamento_fondo_eco(spesa);
                fattura.setFl_autofattura(autof);
                fattura.setTi_bene_servizio(fattServizi);
                fattura.setFl_merce_extra_ue(merceextraUE);
                fattura.setFl_merce_intra_ue(merceintraUE);
                bp.setModel(context, fattura);
                throw e;
            }
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }


    /**
     * Gestisce lo sdoppiamento della riga di dettaglio
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doSdoppiaDettaglio(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);
            Fattura_passiva_rigaIBulk riga = (Fattura_passiva_rigaIBulk) bp.getDettaglio().getModel();
            Forward forward = context.findDefaultForward();
            if (riga == null)
                bp.setErrorMessage("Per procedere, selezionare il dettaglio da sdoppiare!");
            else {
                riga.setIm_riga_sdoppia(Utility.ZERO);
                bp.setDetailDoubling(true);
            }
            return forward;
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    /**
     * Gestisce lo sdoppiamento della riga di dettaglio
     *
     * @param context L'ActionContext della richiesta
     * @return Il Forward alla pagina di risposta
     */
    public Forward doConfirmSdoppiaDettaglio(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            fillModel(context);

            bp.sdoppiaDettaglioInAutomatico(context);

            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();

            if (fattura != null) {
                for (Iterator s = fattura.getFattura_passiva_dettColl().iterator(); s.hasNext(); ) {
                    Fattura_passiva_rigaIBulk riga = (Fattura_passiva_rigaIBulk) s.next();
                    if ((riga.isToBeCreated() || riga.isToBeUpdated()) && riga.getObbligazione_scadenziario() != null)
                        basicDoBringBackOpenObbligazioniWindow(context, riga.getObbligazione_scadenziario());
                }
            }

            bp.setDirty(true);
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doBringBackSearchListabanchedett(ActionContext context, Fattura_passiva_rigaBulk riga, BancaBulk banca) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            FatturaPassivaComponentSession fpcs = (FatturaPassivaComponentSession) bp.createComponentSession();

            if (banca != null) {
                riga.setBanca(banca);
                if (banca.getCd_terzo_delegato() != null)
                    riga.setCessionario(fpcs.findCessionario(context.getUserContext(), riga));
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doBringBackSearchListabanche(ActionContext context, Fattura_passivaBulk fattura, BancaBulk banca) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            FatturaPassivaComponentSession fpcs = (FatturaPassivaComponentSession) bp.createComponentSession();

            if (banca != null) {
                fattura.setBanca(banca);
                if (banca.getCd_terzo_delegato() != null)
                    fattura.setCessionario(fpcs.findCessionario(context.getUserContext(), fattura));
            }
            if ((getBusinessProcess(context).isInserting()) && (fattura.getFattura_passiva_dettColl().size() > 0)) {
                for (Iterator i = fattura.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                    Fattura_passiva_rigaIBulk fattura_riga = (Fattura_passiva_rigaIBulk) i.next();
                    fattura_riga.setBanca(banca);
                    fattura_riga.setCessionario(fpcs.findCessionario(context.getUserContext(), fattura_riga));
                }
            }
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doBlankSearchFind_trovato(ActionContext context, TrovatoBulk trovato) {

        if (trovato != null) {
            TrovatoBulk newt = new TrovatoBulk();
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) bp.getDettaglio().getModel();
            riga.setTrovato(newt);
            riga.setPg_trovato(null);
        }
        return context.findDefaultForward();
    }

    public Forward doOnStatoLiquidazioneChange(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            fillModel(context);
            fattura.setCausale(null);
            fattura.setDt_inizio_sospensione(null);
            bp.setModel(context, fattura);
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    public Forward doOnCausaleChange(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            String oldCausale = fattura.getCausale();
            fillModel(context);
            if (fattura.getStato_liquidazione() != null && fattura.getStato_liquidazione().equals(Fattura_passivaBulk.SOSP)) {
                if (fattura.getCausale() == null) {
                    fattura.setCausale(oldCausale);
                    throw new ApplicationException("Bisogna valorizzare la Causale per la sospensione!");
                }
            }
            bp.setModel(context, fattura);
        } catch (Throwable t) {
            return handleException(context, t);
        }
        return context.findDefaultForward();
    }

    protected java.util.List controllaSelezionePerTitoloCapitoloLista(ActionContext context, java.util.Iterator selectedModels)
            throws ComponentException, PersistencyException, IntrospectionException, RemoteException, BusinessProcessException {

        if (selectedModels != null) {
            java.util.Vector soggettiAInventario = new java.util.Vector();
            java.util.List titoliCapitoli = null;
            java.util.Vector categorieGruppo = new java.util.Vector();
            int count = 0;

            while (selectedModels.hasNext()) {
                count += 1;
                Fattura_passiva_rigaBulk rigaSelected = (Fattura_passiva_rigaBulk) selectedModels.next();
                Bene_servizioBulk beneServizio = rigaSelected.getBene_servizio();
                if (beneServizio == null)
                    throw new it.cnr.jada.comp.ApplicationException("Valorizzare il bene/servizio per il dettaglio " + ((rigaSelected.getDs_riga_fattura() == null) ? "" : "\"" + rigaSelected.getDs_riga_fattura() + "\"") + "! Operazione interrotta.");
                if (beneServizio.getFl_gestione_inventario() != null && beneServizio.getFl_gestione_inventario().booleanValue()) {
                    soggettiAInventario.add(rigaSelected);
                    if (beneServizio.getCategoria_gruppo() == null)
                        throw new it.cnr.jada.comp.ApplicationException("Il bene/servizio \"" + beneServizio.getDs_bene_servizio() + "\" non ha definito alcuna categoria di appartenenza! Operazione interrotta.");
                    else if (categorieGruppo.isEmpty())
                        categorieGruppo.add(beneServizio.getCategoria_gruppo());
                    else
                        for (java.util.Iterator i = ((java.util.Vector) categorieGruppo.clone()).iterator(); i.hasNext(); ) {
                            Categoria_gruppo_inventBulk cat = (Categoria_gruppo_inventBulk) i.next();
                            if (!it.cnr.jada.bulk.BulkCollections.containsByPrimaryKey(categorieGruppo, beneServizio.getCategoria_gruppo()))
                                categorieGruppo.add(beneServizio.getCategoria_gruppo());
                        }

                    CategoriaGruppoInventComponentSession h = (CategoriaGruppoInventComponentSession)
                            context.getBusinessProcess().createComponentSession(
                                    "CNRDOCAMM00_EJB_CategoriaGruppoInventComponentSession",
                                    CategoriaGruppoInventComponentSession.class);
                    titoliCapitoli = h.findAssVoceFList(context.getUserContext(), beneServizio.getCategoria_gruppo());
                    if (titoliCapitoli == null)
                        throw new it.cnr.jada.comp.ApplicationException("Selezione non omogenea: il bene/servizio \"" + beneServizio.getDs_bene_servizio() + "\" non è stato attribuito ad alcuna categoria gruppo per l'inventario!");
                }
            }

            int size = soggettiAInventario.size();
            if (size != 0) {
                if (size != count)
                    throw new it.cnr.jada.comp.ApplicationException("Selezione non omogenea: selezionare solo dettagli non inventariabili o solo dettagli inventariabili");
                else if (categorieGruppo.size() != 1)
                    throw new it.cnr.jada.comp.ApplicationException("Selezione non omogenea: selezionare solo dettagli inventariabili con stesso titolo capitolo!");
            }
            if (titoliCapitoli != null && !titoliCapitoli.isEmpty())
                return titoliCapitoli;
        }
        return null;
    }

    public Forward doCreaCompenso(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();

            Integer esercizioScrivania = it.cnr.contab.utenze00.bp.CNRUserContext.getEsercizio(context.getUserContext());
            //java.math.BigDecimal quotaEsente = new java.math.BigDecimal(0);
            //java.math.BigDecimal quotaEsenteNonImpo = new java.math.BigDecimal(0);
            java.math.BigDecimal imBollo = new java.math.BigDecimal(0);

            Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) bp.getModel();

            if (fp.getCompenso() != null)
                throw new it.cnr.jada.comp.ApplicationException("Esiste già un compenso associato alla fattura!");

            bp.validaFatturaPerCompenso(context);

            V_terzo_per_compensoBulk v_terzo = new V_terzo_per_compensoBulk(fp.getFornitore().getCd_terzo(), new String("A"));
            v_terzo.setTerzo(fp.getFornitore());
            v_terzo.setAnagrafico(fp.getFornitore().getAnagrafico());
            v_terzo.setRagione_sociale(fp.getFornitore().getAnagrafico().getRagione_sociale());
            v_terzo.setCognome(fp.getFornitore().getAnagrafico().getCognome());
            v_terzo.setNome(fp.getFornitore().getAnagrafico().getNome());
            v_terzo.setCodice_fiscale(fp.getFornitore().getAnagrafico().getCodice_fiscale());
            v_terzo.setPartita_iva(fp.getFornitore().getAnagrafico().getPartita_iva());


            context.addHookForward("bringback", this, "doBringBackCompenso");
//		context.addHookForward("close",this,"doBringBackCompenso");

            CRUDCompensoBP compensoBP = (CRUDCompensoBP) creaCompensoBP(context, true);
            try {
                compensoBP.reset(context);
                CompensoBulk compenso = (CompensoBulk) compensoBP.getModel();

                compenso.setV_terzo(v_terzo);

                if (fp.getDocumentoEleTestata() != null && fp.isElettronica()) {
                    //quotaEsente = fp.getDocumentoEleTestata().calcolaImQuotaEsente(fp.getDocumentoEleTestata());
                    //quotaEsenteNonImpo = fp.getDocumentoEleTestata().calcolaImQuotaEsenteNonImpo(fp.getDocumentoEleTestata());
                    if (fp.getDocumentoEleTestata().getImportoBollo() != null)
                        imBollo = fp.getDocumentoEleTestata().getImportoBollo();

                    compenso.setIm_lordo_percipiente(fp.getDocumentoEleTestata().calcolaImLordoPercipiente(fp.getDocumentoEleTestata()));
                    compenso.setQuota_esente(imBollo);
                    compenso.setQuota_esente_no_iva(imBollo);
                /*
				compenso.setIm_lordo_percipiente(fp.getDocumentoEleTestata().calcolaImLordoPercipiente(fp.getDocumentoEleTestata()).add(quotaEsente).add(quotaEsenteNonImpo).add(imBollo));
				compenso.setQuota_esente(quotaEsenteNonImpo.add(imBollo));
				compenso.setQuota_esente_no_iva(quotaEsente.add(quotaEsenteNonImpo).add(imBollo));
				*/
                }

                it.cnr.contab.compensi00.ejb.CompensoComponentSession component = (it.cnr.contab.compensi00.ejb.CompensoComponentSession) bp.createComponentSession("CNRCOMPENSI00_EJB_CompensoComponentSession", it.cnr.contab.compensi00.ejb.CompensoComponentSession.class);
                compenso = component.inizializzaCompensoPerFattura(
                        context.getUserContext(),
                        compenso,
                        fp);
                compensoBP.setModel(context, compenso);
            } catch (Throwable t) {
                compensoBP.rollbackToSavePoint(context, bp.SAVE_POINT_NAME);
                throw t;
            }

            return context.addBusinessProcess(compensoBP);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    private Forward creaCompensoBP(ActionContext context, boolean setSafePoint)
            throws BusinessProcessException {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fp = (Fattura_passivaBulk) bp.getModel();
            if (fp.getDocumentiContabiliCancellati() != null &&
                    !fp.getDocumentiContabiliCancellati().isEmpty()) {
                OptionRequestParameter userConfirmation = new OptionRequestParameter();
                userConfirmation.setCheckDisponibilitaContrattoRequired(Boolean.FALSE);
                userConfirmation.setCheckDisponibilitaDiCassaRequired(Boolean.FALSE);
                ((FatturaPassivaComponentSession) bp.createComponentSession()).
                        aggiornaObblSuCancPerCompenso(context.getUserContext(),
                                fp,
                                fp.getDocumentiContabiliCancellati(),
                                userConfirmation);

                fp.getDocumentiContabiliCancellati().removeAllElements();
                //aggiornaObbligazioni(context.getUserContext(), (Fattura_passivaBulk) bp.getModel(), userConfirmation);
            }
        } catch (RemoteException e) {
            return handleException(context, e);
        } catch (ComponentException e) {
            return handleException(context, e);
        } catch (Throwable e) {
            return handleException(context, e);
        }

        CRUDCompensoBP compensoBP = (CRUDCompensoBP) context.getUserInfo().createBusinessProcess(
                context,
                "CRUDCompensoBP",
                new Object[]{"MRSWTh"}
        );
        if (setSafePoint)
            compensoBP.setSavePoint(context, CRUDFatturaPassivaIBP.SAVE_POINT_NAME);

        return compensoBP;
    }

    /**
     * Al ritorno della creazione di un compenso, associo alle rate selezionate questo documento
     */

    public Forward doBringBackCompenso(ActionContext context) {

        HookForward caller = (HookForward) context.getCaller();
        CompensoBulk compenso = (CompensoBulk) caller.getParameter("bringback");

        CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) getBusinessProcess(context);
        if (compenso == null) {
            try {
                ((CRUDCompensoBP) creaCompensoBP(context, false)).rollbackToSavePoint(context, bp.SAVE_POINT_NAME);
            } catch (BusinessProcessException e) {
                return handleException(context, e);
            }
            return context.findDefaultForward();
        }

        try {

            Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) bp.getModel();

            fp.setFl_fattura_compenso(true);
            fp.setStato_cofi(fp.STATO_CONTABILIZZATO);
            fp.setStato_coge(fp.NON_PROCESSARE_IN_COGE);
            fp.setStato_coan(fp.NON_PROCESSARE_IN_COAN);
            //fp.setStato_liquidazione(fp.LIQ);
            //fp.setCausale(null);
            fp.setStato_pagamento_fondo_eco(fp.NO_FONDO_ECO);
            fp.setCompenso(compenso);
            for (java.util.Iterator i = fp.getFattura_passiva_dettColl().iterator(); i.hasNext(); ) {
                Fattura_passiva_rigaBulk riga = (Fattura_passiva_rigaBulk) i.next();

                riga.setStato_cofi(fp.STATO_CONTABILIZZATO);
            }
            bp.setModel(context, fp);
            bp.setDirty(true);

            bp.setMessage("Associazione terminata con successo.");

            return context.findDefaultForward();

        } catch (Throwable t) {
            try {
                ((CRUDCompensoBP) creaCompensoBP(context, false)).rollbackToSavePoint(context, bp.SAVE_POINT_NAME);
            } catch (BusinessProcessException e) {
                return handleException(context, e);
            }
            return handleException(context, t);
        }
    }

    public Forward doApriCompenso(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaIBP bp = (CRUDFatturaPassivaIBP) context.getBusinessProcess();
            Fattura_passiva_IBulk fp = (Fattura_passiva_IBulk) bp.getModel();

            if (fp == null || fp.getCompenso() == null)
                throw new it.cnr.jada.comp.ApplicationException("Non esiste alcun Compenso da visualizzare!");

            context.addHookForward("bringback", this, "doBringBackApriCompenso");

            CRUDCompensoBP compensoBP = (CRUDCompensoBP) context.createBusinessProcess(
                    "CRUDCompensoBP",
                    new Object[]{"VRSWTh"});
            compensoBP.setSavePoint(context, bp.SAVE_POINT_NAME);

            try {
                compensoBP.edit(context, fp.getCompenso());
            } catch (Throwable t) {
                compensoBP.rollbackToSavePoint(context, bp.SAVE_POINT_NAME);
                throw t;
            }

            return context.addBusinessProcess(compensoBP);
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doBringBackApriCompenso(ActionContext context) {
        try {
            ((CRUDCompensoBP) creaCompensoBP(context, false)).rollbackToSavePoint(
                    context,
                    CRUDFatturaPassivaIBP.SAVE_POINT_NAME);
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doOnFlFatturaCompensoChange(ActionContext context) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            Boolean fatcomp = fattura.getFl_fattura_compenso();
            fillModel(context);
            if (Boolean.TRUE.equals(fatcomp) && fattura.getCompenso() != null) {
                fattura.setFl_fattura_compenso(fatcomp);
                bp.setModel(context, fattura);
                throw new it.cnr.jada.comp.ApplicationException("Non è possibile modificare questa informazione poichè esiste già un compenso collegato!");
            }
            if (Boolean.FALSE.equals(fatcomp) && fattura.hasDettagliContabilizzati()) {
                fattura.setFl_fattura_compenso(fatcomp);
                bp.setModel(context, fattura);
                throw new it.cnr.jada.comp.ApplicationException("Non è possibile modificare questa informazione poichè risultano già contabilizzati i dettagli della fattura!");

            }
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }


    }

    public Forward doConfirmDtScadenza(ActionContext context, it.cnr.jada.util.action.OptionBP option) {
        try {
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();
            if (option.getOption() == it.cnr.jada.util.action.OptionBP.NO_BUTTON) {
                fattura.setDt_scadenza(null);
            }
            return context.findDefaultForward();
        } catch (Exception e) {
            return handleException(context, e);
        }
    }

    public Forward doDisassociaLettera(ActionContext context) {

        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk model = (Fattura_passivaBulk) bp.getModel();
            CNRUserInfo ui = (CNRUserInfo) context.getUserInfo();
            UtenteBulk utente = ui.getUtente();
            if (utente.isSupervisore()) {
                if (model != null) {
                    if (model.getLettera_pagamento_estero() != null) {
                        model = ((FatturaPassivaComponentSession) bp.createComponentSession()).eliminaLetteraPagamentoEstero(context.getUserContext(), model, false);
                        bp.setModel(context, model);
                    }
                }
            } else throw new it.cnr.jada.comp.ApplicationException("Utente non abilitato!");
            return context.findDefaultForward();
        } catch (Throwable e) {
            return handleException(context, e);
        }
    }

    public Forward doOnFlSplitPaymentChange(ActionContext context) {
        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP) getBusinessProcess(context);
            Fattura_passivaBulk fattura = (Fattura_passivaBulk) bp.getModel();

            if (fattura.getFl_split_payment() != null && fattura.getFl_split_payment() && !fattura.isGestioneSplitPayment() && fattura.getDt_fattura_fornitore() != null) {
                fattura.setFl_split_payment(Boolean.FALSE);
                java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd/MM/yyyy");
                throw new ValidationException("Non è possibile registrare una fattura di tipo Split Payment che abbia data di emissione inferiore al " + sdf.format(fattura.getDataInizioSplitPayment()) + "!");
            }
            basicDoOnIstituzionaleCommercialeChange(context, fattura);
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    public Forward doOnFlDaOrdiniChange(ActionContext context) {
        try {
            fillModel(context);
            /**
             * TODO Nascondere la tab di contabilizzaione dell'impegno e mostare la tab ordini
             */
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    public Forward doRettificaConsegna(ActionContext context) {
        try {
            fillModel(context);
            CRUDFatturaPassivaBP bp = Optional.ofNullable(getBusinessProcess(context))
                    .filter(CRUDFatturaPassivaBP.class::isInstance)
                    .map(CRUDFatturaPassivaBP.class::cast)
                    .orElseThrow(() -> new DetailedRuntimeException("Business Process non valido"));
            final List<FatturaOrdineBulk> details = bp.getFattureRigaOrdiniController().getDetails();
            details.stream().forEach(fatturaOrdineBulk -> fatturaOrdineBulk.calcolaRettifiche());
            return context.findDefaultForward();
        } catch (Throwable t) {
            return handleException(context, t);
        }
    }

    public Forward doBringBackSearchVoceIva(ActionContext context,
                                              FatturaOrdineBulk fatturaOrdineBulk,
                                              Voce_ivaBulk voceIva) {
        CRUDFatturaPassivaBP bp = Optional.ofNullable(getBusinessProcess(context))
                .filter(CRUDFatturaPassivaBP.class::isInstance)
                .map(CRUDFatturaPassivaBP.class::cast)
                .orElseThrow(() -> new DetailedRuntimeException("Business Process non valido"));
        Optional.ofNullable(voceIva)
                .ifPresent(voce_ivaBulk -> {
                    fatturaOrdineBulk.setVoceIva(voce_ivaBulk);
                    bp.setDirty(true);
                });
        return doRettificaConsegna(context);
    }

    public Forward doBlankSearchVoceIva(ActionContext context,
                                            FatturaOrdineBulk fatturaOrdineBulk) {
        CRUDFatturaPassivaBP bp = Optional.ofNullable(getBusinessProcess(context))
                .filter(CRUDFatturaPassivaBP.class::isInstance)
                .map(CRUDFatturaPassivaBP.class::cast)
                .orElseThrow(() -> new DetailedRuntimeException("Business Process non valido"));
        fatturaOrdineBulk.setVoceIva(new Voce_ivaBulk());
        fatturaOrdineBulk.calcolaRettifiche();
        bp.setDirty(true);
        return context.findDefaultForward();
    }

    public Forward doToggleOrdiniRettifiche(ActionContext context) {
        CRUDFatturaPassivaBP bp = Optional.ofNullable(getBusinessProcess(context))
                .filter(CRUDFatturaPassivaBP.class::isInstance)
                .map(CRUDFatturaPassivaBP.class::cast)
                .orElseThrow(() -> new DetailedRuntimeException("Business Process non valido"));
        Optional.ofNullable(bp.getFattureRigaOrdiniController())
                .ifPresent(ordiniCRUDController -> ordiniCRUDController.setRettificheCollapse(!ordiniCRUDController.isRettificheCollapse()));
        return context.findDefaultForward();
    }
	public Forward doBringBackCRUDCrea_cig(ActionContext context, Obbligazione_scadenzarioBulk obbl, CigBulk cig) 
	{
		CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP)getBusinessProcess(context);
		try 
		{
			if (cig != null )
			{
				obbl.setCig(cig);
			}	
			return context.findDefaultForward();
		}
		catch(it.cnr.jada.action.MessageToUser e) 
		{
			getBusinessProcess(context).setErrorMessage(e.getMessage());
			return context.findDefaultForward();
		}		
	
		catch(Throwable e) {return handleException(context,e);}
	}
	public Forward doBlankSearchCig(ActionContext context, Obbligazione_scadenzarioBulk obbl) {

		if (obbl!=null){
			CRUDFatturaPassivaBP bp = (CRUDFatturaPassivaBP)getBusinessProcess(context);
			obbl.setCig(null);
			bp.setDirty(true);
		}
		return context.findDefaultForward();

	}
}
