/*
 * 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 java.math.BigDecimal;
import java.rmi.RemoteException;

import it.cnr.contab.docamm00.ejb.FatturaPassivaComponentSession;
import it.cnr.contab.doccont00.core.bulk.*;
import it.cnr.contab.docamm00.docs.bulk.*;
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.comp.ComponentException;
import it.cnr.jada.persistency.sql.CompoundFindClause;
import it.cnr.jada.util.ObjectReplacer;
import it.cnr.jada.util.RemoteIterator;
import it.cnr.jada.util.action.SearchProvider;
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 CRUDNotaDiCreditoBP 
	extends CRUDFatturaPassivaBP 
	implements ObjectReplacer, TitoloDiCreditoDebitoBP, SearchProvider {

	private final FatturaPassivaRigaCRUDController dettaglio = new FatturaPassivaRigaCRUDController(
	"Dettaglio",Nota_di_credito_rigaBulk.class,"fattura_passiva_dettColl", this) {
			//Modificato a seguito richiesta 423.
			public boolean isGrowable() {
				Nota_di_creditoBulk ndc = (Nota_di_creditoBulk)getParentModel();
				return	super.isGrowable() &&
						ndc.getProtocollo_iva() == null &&
						ndc.getProtocollo_iva_generale() == null;
			}
			public boolean isShrinkable() {
				Nota_di_creditoBulk ndc = (Nota_di_creditoBulk)getParentModel();
				return	super.isShrinkable() && 
						ndc.getProtocollo_iva() == null &&
						ndc.getProtocollo_iva_generale() == null;
			}
			public void validate(ActionContext context, OggettoBulk model) throws ValidationException {
				Nota_di_credito_rigaBulk ndcr = (Nota_di_credito_rigaBulk)getModel();
				Nota_di_creditoBulk ndc = (Nota_di_creditoBulk)getParentModel();
				if (ndc.getFl_split_payment())
					if(ndcr.getIm_iva().compareTo(BigDecimal.ZERO)!=0 && ndcr.getRiga_fattura_origine().getFattura_passivaI().getFl_split_payment() &&
							ndcr.getRiga_fattura_origine().getIm_iva().compareTo(BigDecimal.ZERO)==0)
							throw new ValidationException("L'iva sulla riga di nota credito "+ndcr.getDs_riga_fattura()+" non è compatibile con l'iva della riga di fattura di origine.");
			};
		};

	private final AccertamentiCRUDController accertamentiController = new AccertamentiCRUDController(
		"Accertamenti", Accertamento_scadenzarioBulk.class, "accertamentiHash", this);
	private final SimpleDetailCRUDController dettaglioAccertamentoController = new SimpleDetailCRUDController("DettaglioAccertamenti",Nota_di_credito_rigaBulk.class,"accertamentiHash",accertamentiController) {

			public java.util.List getDetails() {

				Nota_di_creditoBulk notaDiCredito = (Nota_di_creditoBulk)CRUDNotaDiCreditoBP.this.getModel();
				java.util.Vector lista = new java.util.Vector();
				if (notaDiCredito != null) {
					java.util.Hashtable h = notaDiCredito.getAccertamentiHash();
					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 boolean contoEnte;
	private it.cnr.jada.bulk.PrimaryKeyHashMap documentiContabiliModificati = null;
	/**
	 * CRUDNotaDiCreditoBP constructor comment.
	 */
	public CRUDNotaDiCreditoBP() {

		super(Nota_di_credito_rigaBulk.class);
	}
	/**
	 * CRUDNotaDiCreditoBP constructor comment.
	 * @param function java.lang.String
	 * @exception it.cnr.jada.action.BusinessProcessException The exception description.
	 */
	public CRUDNotaDiCreditoBP(String function) throws it.cnr.jada.action.BusinessProcessException {
		super(function, Nota_di_credito_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[3];
		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");
		toolbar[i++] = new it.cnr.jada.util.jsp.Button(it.cnr.jada.util.Config.getHandler().getProperties(getClass()),"CRUDToolbar.beni_coll");
		return toolbar;
	}
	protected it.cnr.jada.util.jsp.Button[] createToolbar() {
		it.cnr.jada.util.jsp.Button[] toolbar = new it.cnr.jada.util.jsp.Button[11];
		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.download");
		return toolbar;
	}
	/**
	 * Insert the method's description here.
	 * Creation date: (11/16/2001 5:31:10 PM)
	 * @return it.cnr.contab.docamm00.bp.AccertamentiCRUDController
	 */
	public final AccertamentiCRUDController getAccertamentiController() {
		return accertamentiController;
	}
	/**
	 * Insert the method's description here.
	 * Creation date: (09/07/2001 14:55:11)
	 * @return it.cnr.jada.util.action.SimpleDetailCRUDController
	 */
	public Accertamento_scadenzarioBulk getAccertamento_scadenziario_corrente() {

		if (getAccertamentiController() == null)
			return null;
		return (Accertamento_scadenzarioBulk)getAccertamentiController().getModel();
	}
	/**
	 * 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 FatturaPassivaRigaCRUDController 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 getDettaglioAccertamentoController() {
		return dettaglioAccertamentoController;
	}
	/**
	 * Insert the method's description here.
	 * Creation date: (5/2/2002 4:51:58 PM)
	 */
	public it.cnr.jada.bulk.PrimaryKeyHashMap getDocumentiContabiliModificati() {

		return documentiContabiliModificati;
	}
	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: (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 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.");
	}
	/**
	 * Effettua un salvataggio del modello corrente.
	 * Valido solo se il ricevente è nello stato di INSERT o EDIT.
	 */
	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.");
		}
	}
	/**
	 * Insert the method's description here.
	 * Creation date: (11/5/2001 2:31:22 PM)
	 * @param newAutoGenereted java.lang.Boolean
	 */
	public void setAutoGenerated(java.lang.Boolean newAutoGenerated) {
		autoGenerated = newAutoGenerated;
	}
	/**
	 * 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 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);
	}
	public boolean isContoEnte() {
		return contoEnte;
	}
	public void setContoEnte(boolean contoEnte) {
		this.contoEnte = contoEnte;
	}
	public boolean isROBank() {
		if(isContoEnte())
			return true;
		return isInputReadonly();
	}

	@Override
	public SearchProvider getSearchProvider(OggettoBulk oggettobulk, String s) {
		if (s.equalsIgnoreCase("nr_fattura_fornitore"))
			return this;
		return super.getSearchProvider(oggettobulk, s);
	}

	@Override
	public RemoteIterator search(ActionContext actioncontext, CompoundFindClause compoundfindclause, OggettoBulk oggettobulk) throws BusinessProcessException {
		try {
			return ((FatturaPassivaComponentSession)createComponentSession()).cercaFatturaPerNdC(actioncontext.getUserContext(), compoundfindclause, (Nota_di_creditoBulk)getModel());
		} catch (ComponentException|RemoteException e) {
			throw handleException(e);
		}
	}
}
