package com.fp.persistence.pgeneral.gene;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.fp.dto.hb.HibernateBean;

/** Clase que implementa la entidad de Hibernate que hace referencia a la tabla TGENESOLICITUDEINSTALLRATES */
@Entity(name = "TgeneSolicitudeInstallRates")
@Table(name = "TGENESOLICITUDEINSTALLRATES")
public class TgeneSolicitudeInstallRates extends com.fp.dto.AbstractDataTransport implements Serializable, HibernateBean, Cloneable {
    /**
     * HashCode asociado con la Instancia
     */
    @Transient
    private int hashValue = 0;

    /**
     * Version de la Clase
     */
    private static final long serialVersionUID = 1L;

    /**
     * Clave primaria de la Entidad TgeneSolicitudeInstallRates
     */
    @EmbeddedId
    private TgeneSolicitudeInstallRatesKey pk;

    @Column(name = "BASERATECATALOG", nullable = true)
    /**
     * Codigo de catalogo  de tasas base, BCE tasa banco central
     */
    private String baseratecatalog;

    @Column(name = "BASERATECATALOGCODE", nullable = true)
    /**
     * Codigo de tabla de catalogo BASERATE
     */
    private String baseratecatalogcode;

    @Column(name = "PRINCIPALBALANCETYPE", nullable = true)
    /**
     * Código de tipo de capital sobre el cual se aplica una tasa y se calcula un valor a provisionar
     */
    private String principalbalancetype;

    @Column(name = "PRINCIPALBALANCEGROUP", nullable = true)
    /**
     * Codigo del grupo de balance 1 Activo, 2 Pasivo, 3 Patrimonio .. 62 contingente deudor 61 por contra deudor 
     */
    private String principalbalancegroup;

    @Column(name = "NEGOTIABLE", nullable = true)
    /**
     * Indica si la tasa se puede negociar con el cliente
     */
    private String negotiable;

    @Column(name = "BASERATE", nullable = true)
    /**
     * Tasa base
     */
    private BigDecimal baserate;

    @Column(name = "MARGIN", nullable = true)
    /**
     * Margen a aplicar dado el operador
     */
    private BigDecimal margin;

    @Column(name = "OPERATOR", nullable = true)
    /**
     * Operador a aplicar sobre la tasa base, +, - , %
     */
    private String operator;

    @Column(name = "RATE", nullable = true)
    /**
     * Tasa total con la cual se calcula provisiones y tabla de pagos
     */
    private BigDecimal rate;

    @Column(name = "READJUSTMENTOPERATOR", nullable = true)
    /**
     * Operador que se utilizara el momento del reajuste
     */
    private String readjustmentoperator;

    @Column(name = "READJUSTMENTMARGIN", nullable = true)
    /**
     * Margen a aplicar en el reajuste
     */
    private BigDecimal readjustmentmargin;

    @Column(name = "EFFECTIVERATE", nullable = true)
    /**
     * Tasa Efectiva
     */
    private BigDecimal effectiverate;

    @Column(name = "ISNOMINALRATE", nullable = true)
    /**
     * Y, Indica que la defincion de la tasa base es efectiva, en este caso se calcula la tasa nominal, N la tasa base es nominal en este caso se calcula la tasa efectiva.
     */
    private String isnominalrate;

    @Column(name = "READJUSTBASERATECATALOG", nullable = true)
    /**
     * Codigo de catalogo  de tasas base de reajuste, BCE tasa banco central
     */
    private String readjustbaseratecatalog;

    @Column(name = "READJUSTBASERATECATALOGCODE", nullable = true)
    /**
     * Codigo de tabla de catalogo BASERATE
     */
    private String readjustbaseratecatalogcode;

    @Column(name = "MAXBASERATECATALOG", nullable = true)
    /**
     * Codigo de catalogo  de tasas base maxima, BCE tasa banco central
     */
    private String maxbaseratecatalog;

    @Column(name = "MAXBASERATECATALOGCODE", nullable = true)
    /**
     * Codigo de tabla de catalogo BASERATE
     */
    private String maxbaseratecatalogcode;

    @Column(name = "MINRATE", nullable = true)
    /**
     * Minimo permitido en la negociacion del prestamo
     */
    private BigDecimal minrate;

    @Column(name = "MAXRATE", nullable = true)
    /**
     * Maximo permitido en la negociacion del prestamo
     */
    private BigDecimal maxrate;

    /** Contructor por defecto */
    public TgeneSolicitudeInstallRates() {
    }

    /**
     * Contructor de TgeneSolicitudeInstallRates
     * 
     * @param pPk Clave Primaria del entity
     */
    public TgeneSolicitudeInstallRates(TgeneSolicitudeInstallRatesKey pPk) {
        this();
        this.pk = pPk;
    }

    /**
     * Metodo que entrega datos de la tabla dada la clave primaria.
     * 
     * @param pEntityManager referencia de la session a obtener datos del bean.
     * @param pKey Caleve primaria del bean.
     * @return TgeneSolicitudeInstallRates
     */
    public static TgeneSolicitudeInstallRates find(EntityManager pEntityManager, TgeneSolicitudeInstallRatesKey pKey) throws Exception {
        TgeneSolicitudeInstallRates obj = pEntityManager.find(TgeneSolicitudeInstallRates.class, pKey);
        return obj;
    }

    /**
     * Entrega la Clave primaria de TgeneSolicitudeInstallRates
     * 
     * @return El objeto que referencia a la Clave primaria de TgeneSolicitudeInstallRates
     */
    public TgeneSolicitudeInstallRatesKey getPk() {
        return this.pk;
    }

    /**
     * Fija un nuevo valor a la Clave primaria de TgeneSolicitudeInstallRates
     * 
     * @param pPk El objeto que referencia a la nueva Clave primaria de TgeneSolicitudeInstallRates
     */
    public void setPk(TgeneSolicitudeInstallRatesKey pPk) {
        this.pk = pPk;
    }

    /**
     * Obtiene el valor de baseratecatalog
     * 
     * @return valor de baseratecatalog
     */
    public String getBaseratecatalog() {
        return this.baseratecatalog;
    }

    /**
     * Fija el valor de baseratecatalog
     * 
     * @param pBaseratecatalog nuevo Valor de baseratecatalog
     */
    public void setBaseratecatalog(String pBaseratecatalog) {
        this.baseratecatalog = pBaseratecatalog;
    }

    /**
     * Obtiene el valor de baseratecatalogcode
     * 
     * @return valor de baseratecatalogcode
     */
    public String getBaseratecatalogcode() {
        return this.baseratecatalogcode;
    }

    /**
     * Fija el valor de baseratecatalogcode
     * 
     * @param pBaseratecatalogcode nuevo Valor de baseratecatalogcode
     */
    public void setBaseratecatalogcode(String pBaseratecatalogcode) {
        this.baseratecatalogcode = pBaseratecatalogcode;
    }

    /**
     * Obtiene el valor de principalbalancetype
     * 
     * @return valor de principalbalancetype
     */
    public String getPrincipalbalancetype() {
        return this.principalbalancetype;
    }

    /**
     * Fija el valor de principalbalancetype
     * 
     * @param pPrincipalbalancetype nuevo Valor de principalbalancetype
     */
    public void setPrincipalbalancetype(String pPrincipalbalancetype) {
        this.principalbalancetype = pPrincipalbalancetype;
    }

    /**
     * Obtiene el valor de principalbalancegroup
     * 
     * @return valor de principalbalancegroup
     */
    public String getPrincipalbalancegroup() {
        return this.principalbalancegroup;
    }

    /**
     * Fija el valor de principalbalancegroup
     * 
     * @param pPrincipalbalancegroup nuevo Valor de principalbalancegroup
     */
    public void setPrincipalbalancegroup(String pPrincipalbalancegroup) {
        this.principalbalancegroup = pPrincipalbalancegroup;
    }

    /**
     * Obtiene el valor de negotiable
     * 
     * @return valor de negotiable
     */
    public String getNegotiable() {
        return this.negotiable;
    }

    /**
     * Fija el valor de negotiable
     * 
     * @param pNegotiable nuevo Valor de negotiable
     */
    public void setNegotiable(String pNegotiable) {
        this.negotiable = pNegotiable;
    }

    /**
     * Obtiene el valor de baserate
     * 
     * @return valor de baserate
     */
    public BigDecimal getBaserate() {
        return this.baserate;
    }

    /**
     * Fija el valor de baserate
     * 
     * @param pBaserate nuevo Valor de baserate
     */
    public void setBaserate(BigDecimal pBaserate) {
        this.baserate = pBaserate;
    }

    /**
     * Obtiene el valor de margin
     * 
     * @return valor de margin
     */
    public BigDecimal getMargin() {
        return this.margin;
    }

    /**
     * Fija el valor de margin
     * 
     * @param pMargin nuevo Valor de margin
     */
    public void setMargin(BigDecimal pMargin) {
        this.margin = pMargin;
    }

    /**
     * Obtiene el valor de operator
     * 
     * @return valor de operator
     */
    public String getOperator() {
        return this.operator;
    }

    /**
     * Fija el valor de operator
     * 
     * @param pOperator nuevo Valor de operator
     */
    public void setOperator(String pOperator) {
        this.operator = pOperator;
    }

    /**
     * Obtiene el valor de rate
     * 
     * @return valor de rate
     */
    public BigDecimal getRate() {
        return this.rate;
    }

    /**
     * Fija el valor de rate
     * 
     * @param pRate nuevo Valor de rate
     */
    public void setRate(BigDecimal pRate) {
        this.rate = pRate;
    }

    /**
     * Obtiene el valor de readjustmentoperator
     * 
     * @return valor de readjustmentoperator
     */
    public String getReadjustmentoperator() {
        return this.readjustmentoperator;
    }

    /**
     * Fija el valor de readjustmentoperator
     * 
     * @param pReadjustmentoperator nuevo Valor de readjustmentoperator
     */
    public void setReadjustmentoperator(String pReadjustmentoperator) {
        this.readjustmentoperator = pReadjustmentoperator;
    }

    /**
     * Obtiene el valor de readjustmentmargin
     * 
     * @return valor de readjustmentmargin
     */
    public BigDecimal getReadjustmentmargin() {
        return this.readjustmentmargin;
    }

    /**
     * Fija el valor de readjustmentmargin
     * 
     * @param pReadjustmentmargin nuevo Valor de readjustmentmargin
     */
    public void setReadjustmentmargin(BigDecimal pReadjustmentmargin) {
        this.readjustmentmargin = pReadjustmentmargin;
    }

    /**
     * Obtiene el valor de effectiverate
     * 
     * @return valor de effectiverate
     */
    public BigDecimal getEffectiverate() {
        return this.effectiverate;
    }

    /**
     * Fija el valor de effectiverate
     * 
     * @param pEffectiverate nuevo Valor de effectiverate
     */
    public void setEffectiverate(BigDecimal pEffectiverate) {
        this.effectiverate = pEffectiverate;
    }

    /**
     * Obtiene el valor de isnominalrate
     * 
     * @return valor de isnominalrate
     */
    public String getIsnominalrate() {
        return this.isnominalrate;
    }

    /**
     * Fija el valor de isnominalrate
     * 
     * @param pIsnominalrate nuevo Valor de isnominalrate
     */
    public void setIsnominalrate(String pIsnominalrate) {
        this.isnominalrate = pIsnominalrate;
    }

    /**
     * Obtiene el valor de readjustbaseratecatalog
     * 
     * @return valor de readjustbaseratecatalog
     */
    public String getReadjustbaseratecatalog() {
        return this.readjustbaseratecatalog;
    }

    /**
     * Fija el valor de readjustbaseratecatalog
     * 
     * @param pReadjustbaseratecatalog nuevo Valor de readjustbaseratecatalog
     */
    public void setReadjustbaseratecatalog(String pReadjustbaseratecatalog) {
        this.readjustbaseratecatalog = pReadjustbaseratecatalog;
    }

    /**
     * Obtiene el valor de readjustbaseratecatalogcode
     * 
     * @return valor de readjustbaseratecatalogcode
     */
    public String getReadjustbaseratecatalogcode() {
        return this.readjustbaseratecatalogcode;
    }

    /**
     * Fija el valor de readjustbaseratecatalogcode
     * 
     * @param pReadjustbaseratecatalogcode nuevo Valor de readjustbaseratecatalogcode
     */
    public void setReadjustbaseratecatalogcode(String pReadjustbaseratecatalogcode) {
        this.readjustbaseratecatalogcode = pReadjustbaseratecatalogcode;
    }

    /**
     * Obtiene el valor de maxbaseratecatalog
     * 
     * @return valor de maxbaseratecatalog
     */
    public String getMaxbaseratecatalog() {
        return this.maxbaseratecatalog;
    }

    /**
     * Fija el valor de maxbaseratecatalog
     * 
     * @param pMaxbaseratecatalog nuevo Valor de maxbaseratecatalog
     */
    public void setMaxbaseratecatalog(String pMaxbaseratecatalog) {
        this.maxbaseratecatalog = pMaxbaseratecatalog;
    }

    /**
     * Obtiene el valor de maxbaseratecatalogcode
     * 
     * @return valor de maxbaseratecatalogcode
     */
    public String getMaxbaseratecatalogcode() {
        return this.maxbaseratecatalogcode;
    }

    /**
     * Fija el valor de maxbaseratecatalogcode
     * 
     * @param pMaxbaseratecatalogcode nuevo Valor de maxbaseratecatalogcode
     */
    public void setMaxbaseratecatalogcode(String pMaxbaseratecatalogcode) {
        this.maxbaseratecatalogcode = pMaxbaseratecatalogcode;
    }

    /**
     * Obtiene el valor de minrate
     * 
     * @return valor de minrate
     */
    public BigDecimal getMinrate() {
        return this.minrate;
    }

    /**
     * Fija el valor de minrate
     * 
     * @param pMinrate nuevo Valor de minrate
     */
    public void setMinrate(BigDecimal pMinrate) {
        this.minrate = pMinrate;
    }

    /**
     * Obtiene el valor de maxrate
     * 
     * @return valor de maxrate
     */
    public BigDecimal getMaxrate() {
        return this.maxrate;
    }

    /**
     * Fija el valor de maxrate
     * 
     * @param pMaxrate nuevo Valor de maxrate
     */
    public void setMaxrate(BigDecimal pMaxrate) {
        this.maxrate = pMaxrate;
    }

    @Override
    public boolean equals(Object rhs) {
        if (rhs == null) {
            return false;
        }
        if (!(rhs instanceof TgeneSolicitudeInstallRates)) {
            return false;
        }
        TgeneSolicitudeInstallRates that = (TgeneSolicitudeInstallRates) rhs;
        if ((this.getPk() == null) || (that.getPk() == null)) {
            return false;
        }
        return (this.getPk().equals(that.getPk()));
    }

    /**
     * Implementacion del metodo hashCode de la la entidad TgeneSolicitudeInstallRates
     * 
     * @return el hashCode la instancia
     */
    @Override
    public int hashCode() {
        if (this.hashValue == 0) {
            int result = 17;
            if (this.getPk() == null) {
                result = super.hashCode();
            } else {
                result = this.getPk().hashCode();
            }
            this.hashValue = result;
        }
        return this.hashValue;
    }

    /** Implementacion toString */
    @Override
    public String toString() {
        Field[] fs = this.getClass().getDeclaredFields();
        String data = "";
        for (Field f : fs) {
            try {
                String name = f.getName();
                if (f.getType().getName().compareTo("java.util.Set") == 0) {
                    continue;
                }
                if ((name.compareTo("hashValue") == 0) || (name.compareTo("serialVersionUID") == 0)) {
                    continue;
                }
                data += name + "=" + f.get(this) + ";";
            } catch (Exception e) {
                continue;
            }
        }
        if (data.compareTo("") == 0) {
            data = super.toString();
        }
        return data;
    }

    /** Implementacion de la creacion de un bean en blanco TgeneSolicitudeInstallRates */
    @Override
    public Object createInstance() {
        TgeneSolicitudeInstallRates instance = new TgeneSolicitudeInstallRates();
        instance.setPk(new TgeneSolicitudeInstallRatesKey());
        return instance;
    }

    /**
     * Clona la entidad TgeneSolicitudeInstallRates
     * 
     * @see com.fp.dto.hb.HibernateBean#cloneMe()
     */
    @Override
    public Object cloneMe() throws CloneNotSupportedException {
        TgeneSolicitudeInstallRates p = (TgeneSolicitudeInstallRates) this.clone();
        p.setPk((TgeneSolicitudeInstallRatesKey) this.pk.cloneMe());
        return p;
    }

    // Metodos manuales.
    /** Sentencia que devuelve la definicion de valores a provisionar asociados de una solicitud. */
    private static final String HQL_SOLICITUDE_INSTALLMENT_RATES = "from TgeneSolicitudeInstallRates tsolinstrate  "
            + " where tsolinstrate.pk.solicitudnumber = :solicitudnumber " + " and tsolinstrate.pk.solicitudsequence = :solicitudsequence ";

    /**
     * Metodo que entrega una lista con los tipos de saldos a calcular tabla de amortizacion para una solicitud.
     * 
     * @param pSolicitudeNumber Numero de solicitud.
     * @param pSolicitudeSequence Secuencia interna de la solicitud.
     * @return List<TgeneSolicitudeInstallRates>
     * @throws Exception
     */
    @SuppressWarnings("unchecked")
    public static List<TgeneSolicitudeInstallRates> find(EntityManager pEntityManager, String pSolicitudeNumber, Integer pSolicitudeSequence)
            throws Exception {
        List<TgeneSolicitudeInstallRates> lObjects = null;
        Query qry = pEntityManager.createQuery(TgeneSolicitudeInstallRates.HQL_SOLICITUDE_INSTALLMENT_RATES);
        qry.setParameter("solicitudnumber", pSolicitudeNumber);
        qry.setParameter("solicitudsequence", pSolicitudeSequence);
        lObjects = qry.getResultList();
        return lObjects;
    }
}
