/*
 * 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.bp;

import it.cnr.contab.docamm00.docs.bulk.Fattura_passiva_rigaIBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_creditoBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_credito_attivaBulk;
import it.cnr.contab.docamm00.docs.bulk.Nota_di_credito_attiva_rigaBulk;
import it.cnr.contab.doccont00.core.bulk.Obbligazione_scadenzarioBulk;
import it.cnr.jada.action.ActionContext;
import it.cnr.jada.action.BusinessProcessException;
import it.cnr.jada.bulk.OggettoBulk;
import it.cnr.jada.bulk.ValidationException;
import it.cnr.jada.util.ObjectReplacer;
import it.cnr.jada.util.action.SimpleDetailCRUDController;

/**
 * Insert the type's description here.
 * Creation date: (10/25/2001 11:20:49 AM)
 *
 * @author: Roberto Peli
 */
public class CRUDNotaDiCreditoAttivaBP
        extends CRUDFatturaAttivaBP
        implements ObjectReplacer, TitoloDiCreditoDebitoBP {

    private final FatturaAttivaRigaCRUDController dettaglio = new FatturaAttivaRigaCRUDController(
            "Dettaglio", Nota_di_credito_attiva_rigaBulk.class, "fattura_attiva_dettColl", this) {
        //Modificato a seguito richiesta 423.
        public boolean isGrowable() {
            Nota_di_credito_attivaBulk ndc = (Nota_di_credito_attivaBulk) getParentModel();
            return super.isGrowable() &&
                    ndc.getProtocollo_iva() == null &&
                    ndc.getProtocollo_iva_generale() == null;
        }

        public boolean isShrinkable() {
            Nota_di_credito_attivaBulk ndc = (Nota_di_credito_attivaBulk) getParentModel();
            return super.isShrinkable() &&
                    ndc.getProtocollo_iva() == null &&
                    ndc.getProtocollo_iva_generale() == null;
        }
    };

    private final ObbligazioniCRUDController obbligazioniController = new ObbligazioniCRUDController(
            "Obbligazioni", Obbligazione_scadenzarioBulk.class, "obbligazioniHash", this);
    private final SimpleDetailCRUDController dettaglioObbligazioneController = new SimpleDetailCRUDController("DettaglioObbligazioni", Nota_di_credito_attiva_rigaBulk.class, "obbligazioniHash", obbligazioniController) {

        public java.util.List getDetails() {

            Nota_di_credito_attivaBulk notaDiCredito = (Nota_di_credito_attivaBulk) CRUDNotaDiCreditoAttivaBP.this.getModel();
            java.util.Vector lista = new java.util.Vector();
            if (notaDiCredito != null) {
                java.util.Hashtable h = notaDiCredito.getObbligazioniHash();
                if (h != null && getParentModel() != null)
                    lista = (java.util.Vector) h.get(getParentModel());
            }
            return lista;
        }

        public boolean isGrowable() {

            return super.isGrowable() && !((it.cnr.jada.util.action.CRUDBP) getParentController().getParentController()).isSearching();
        }

        public boolean isShrinkable() {

            return super.isShrinkable() && !((it.cnr.jada.util.action.CRUDBP) getParentController().getParentController()).isSearching();
        }
    };

    private java.lang.Boolean autoGenerated = Boolean.FALSE;
    private it.cnr.jada.bulk.PrimaryKeyHashMap documentiContabiliModificati = null;

    /**
     * CRUDNotaDiCreditoBP constructor comment.
     */
    public CRUDNotaDiCreditoAttivaBP() {

        super(Nota_di_credito_attiva_rigaBulk.class);
    }

    /**
     * CRUDNotaDiCreditoBP constructor comment.
     *
     * @param function java.lang.String
     * @throws it.cnr.jada.action.BusinessProcessException The exception description.
     */
    public CRUDNotaDiCreditoAttivaBP(String function) throws it.cnr.jada.action.BusinessProcessException {
        super(function, Nota_di_credito_attiva_rigaBulk.class);
    }

    /**
     * Insert the method's description here.
     * Creation date: (5/2/2002 4:51:58 PM)
     */
    public void addToDocumentiContabiliModificati(it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileBulk scadenza) {

        if (scadenza == null) return;

        if (getDocumentiContabiliModificati() == null)
            setDocumentiContabiliModificati(new it.cnr.jada.bulk.PrimaryKeyHashMap());
        if (!getDocumentiContabiliModificati().containsKey(scadenza))
            getDocumentiContabiliModificati().put(scadenza, Boolean.TRUE);
    }

    protected it.cnr.jada.util.jsp.Button[] createFPInventarioToolbar() {

        it.cnr.jada.util.jsp.Button[] toolbar = new it.cnr.jada.util.jsp.Button[2];
        int i = 0;
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.inventaria");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.associaInventario");
        return toolbar;
    }

    protected it.cnr.jada.util.jsp.Button[] createToolbar() {
        it.cnr.jada.util.jsp.Button[] toolbar = new it.cnr.jada.util.jsp.Button[14];
        int i = 0;
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.search");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.startSearch");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.freeSearch");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.new");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.save");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.delete");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.bringBack");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(it.cnr.jada.util.action.CRUDBP.class), "CRUDToolbar.print");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.riportaIndietro");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.riportaAvanti");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.documento");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.downloadXml");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.downloadFatturaFirmata");
        toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()), "CRUDToolbar.ristampa");

        return toolbar;
    }

    /**
     * Insert the method's description here.
     * Creation date: (11/5/2001 2:31:22 PM)
     *
     * @return java.lang.Boolean
     */
    public java.lang.Boolean getAutoGenerated() {
        return autoGenerated;
    }

    /**
     * Insert the method's description here.
     * Creation date: (09/07/2001 14:55:11)
     *
     * @return it.cnr.jada.util.action.SimpleDetailCRUDController
     */
    public FatturaAttivaRigaCRUDController getDettaglio() {

        return dettaglio;
    }

    /**
     * Insert the method's description here.
     * Creation date: (11/16/2001 5:31:10 PM)
     *
     * @return it.cnr.jada.util.action.SimpleDetailCRUDController
     */
    public final it.cnr.jada.util.action.SimpleDetailCRUDController getDettaglioObbligazioneController() {
        return dettaglioObbligazioneController;
    }

    /**
     * Insert the method's description here.
     * Creation date: (5/2/2002 4:51:58 PM)
     */
    public it.cnr.jada.bulk.PrimaryKeyHashMap getDocumentiContabiliModificati() {

        return documentiContabiliModificati;
    }

    /**
     * Insert the method's description here.
     * Creation date: (5/2/2002 4:51:58 PM)
     */
    public void setDocumentiContabiliModificati(it.cnr.jada.bulk.PrimaryKeyHashMap aMap) {

        documentiContabiliModificati = aMap;
    }

    public Obbligazione_scadenzarioBulk getObbligazione_scadenziario_corrente() {

        if (getObbligazioniController() == null)
            return null;
        return (Obbligazione_scadenzarioBulk) getObbligazioniController().getModel();
    }

    /**
     * Insert the method's description here.
     * Creation date: (11/16/2001 5:31:10 PM)
     *
     * @return it.cnr.contab.docamm00.bp.AccertamentiCRUDController
     */
    public final ObbligazioniCRUDController getObbligazioniController() {
        return obbligazioniController;
    }

    public OggettoBulk initializeModelForEdit(ActionContext context, OggettoBulk bulk) throws BusinessProcessException {

        setDocumentiContabiliModificati(null);
        return super.initializeModelForEdit(context, bulk);
    }

    /**
     * Insert the method's description here.
     * Creation date: (11/5/2001 2:31:22 PM)
     *
     * @return java.lang.Boolean
     */
    public boolean isAutoGenerated() {
        return autoGenerated.booleanValue();
    }

    /**
     * Insert the method's description here.
     * Creation date: (11/5/2001 2:31:22 PM)
     *
     * @param newAutoGenerated java.lang.Boolean
     */
    public void setAutoGenerated(java.lang.Boolean newAutoGenerated) {
        autoGenerated = newAutoGenerated;
    }

    /**
     * Insert the method's description here.
     * Creation date: (5/2/2002 4:58:24 PM)
     */
    public boolean isDocumentoContabileModificato(it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileBulk scadenza) {

        if (scadenza == null || getDocumentiContabiliModificati() == null)
            return false;
        return getDocumentiContabiliModificati().get(scadenza) != null;
    }

    public boolean isInventariaButtonEnabled() {

        return getModel() != null &&
                !getDettaglio().getDetails().isEmpty();
    }

    public boolean isInventariaButtonHidden() {

        return true;//isSearching();
    }

    public boolean isNewButtonHidden() {
        return true;
    }

    /**
     * Insert the method's description here.
     * Creation date: (5/2/2002 4:51:58 PM)
     */
    public void removeFromDocumentiContabiliModificati(it.cnr.contab.doccont00.core.bulk.IScadenzaDocumentoContabileBulk scadenza) {

        if (scadenza == null || getDocumentiContabiliModificati() == null)
            return;
        if (getDocumentiContabiliModificati().containsKey(scadenza))
            getDocumentiContabiliModificati().remove(scadenza);
    }

    /**
     * Insert the method's description here.
     * Creation date: (09/07/2001 14:55:11)
     *
     * @return it.cnr.jada.util.action.SimpleDetailCRUDController
     */
    public Object replaceObject(Object obj) {

        if (getModel() != null && obj != null) {
            Fattura_passiva_rigaIBulk riga = (Fattura_passiva_rigaIBulk) obj;

            Nota_di_creditoBulk ndc = (Nota_di_creditoBulk) getModel();
            if (ndc.getFattura_passiva_obbligazioniHash() != null) {
                Obbligazione_scadenzarioBulk obbl = ndc.getFattura_passiva_obbligazioniHash().getKey(riga.getObbligazione_scadenziario());
                if (obbl != null)
                    riga.setObbligazione_scadenziario(obbl);
                return riga;
            }
        }
        return obj;
    }

    public void salvaRiportandoAvanti(ActionContext context)
            throws ValidationException, BusinessProcessException {

        completeSearchTools(context, this);
        validate(context);
        saveChildren(context);

        update(context);
        if (getMessage() == null)
            setMessage("Salvataggio e riporto all'esercizio successivo eseguito in modo corretto.");
    }

    public void save(it.cnr.jada.action.ActionContext context)
            throws it.cnr.jada.bulk.ValidationException, it.cnr.jada.action.BusinessProcessException {

        completeSearchTools(context, this);
        validate(context);
        saveChildren(context);

        if (isInserting()) {
            create(context);
            setMessage("Creazione eseguita in modo corretto.");
        } else if (isEditing()) {
            update(context);
            setMessage("Salvataggio eseguito in modo corretto.");
        }
    }

    public void writeFPInventarioToolbar(javax.servlet.jsp.JspWriter writer) throws java.io.IOException, javax.servlet.ServletException {

        if (!isSearching() && !isDeleting()) {
            openToolbar(writer);
            it.cnr.jada.util.jsp.JSPUtils.toolbar(writer, createFPInventarioToolbar(), this, this.getParentRoot().isBootstrap());
            closeToolbar(writer);
        }
    }

    public void writeToolbar(javax.servlet.jsp.JspWriter writer) throws java.io.IOException, javax.servlet.ServletException {

        super.writeToolbar(writer);
        //writeFPInventarioToolbar(writer);
    }
}
