package com.fp.persistence.pgeneral.acco;

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.common.helper.Constant;
import com.fp.dto.hb.HibernateBean;

/** Clase que implementa la entidad de Hibernate que hace referencia a la tabla TGENEACCOUNTFORCREDIT */
@Entity(name = "TgeneAccountForCredit")
@Table(name = "TGENEACCOUNTFORCREDIT")
public class TgeneAccountForCredit 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 TgeneAccountForCredit
	 */
	@EmbeddedId
	private TgeneAccountForCreditKey pk;
	@Column(name = "CASH", nullable = true)
	/**
	 * Indica que el pago se realiaza en efectivo.
	 */
	private String cash;

	@Column(name = "CHECKS", nullable = true)
	/**
	 * Indica que el pago se realiaza en cheque.
	 */
	private String checks;

	@Column(name = "CREDIT", nullable = true)
	/**
	 * Indica que el pago se realiaza con credito a una cuenta.
	 */
	private String credit;

	@Column(name = "CREDITACCOUNT", nullable = true)
	/**
	 * Numero de cuenta a acreditar cuando el cargo se cobra con debito a la cuenta.
	 */
	private String creditaccount;

	@Column(name = "CREDITACCOUNTINGCODE", nullable = true)
	/**
	 * Codigo contable a acreditar cuando el cargo se cobra con debito a la cuenta.
	 */
	private String creditaccountingcode;

	@Column(name = "CURRENCY", nullable = true)
	/**
	 * Codigo de moneda de la cuenta de la operacion.
	 */
	private String currency;

	@Column(name = "VALUE", nullable = true)
	/**
	 * El valor esta expresado en la moneda de la cuenta, del prestamo, plazo fijo etc..
	 */
	private BigDecimal value;

	@Column(name = "PERSONCODE", nullable = true)
	/**
	 * Si el valor se entrega en efectivo o cheque y el benefiniciario esta en las tablas de clientes, en el campo va el codigo de persona asociado.
	 */
	private Integer personcode;

	@Column(name = "IDBENEFICIARY", nullable = true)
	/**
	 * Si el beneficiario no esta registrado en la tabla de personas, en el campo va la identificacion del venceficiario.
	 */
	private String idbeneficiary;

	@Column(name = "BENEFICIARYNAME", nullable = true)
	/**
	 * Nombre del beneficiario.
	 */
	private String beneficiaryname;

	/** Contructor por defecto */
	public TgeneAccountForCredit() {
	}
	/**
	 * Contructor de TgeneAccountForCredit
	 * 
	 * @param pPk Clave Primaria del entity
	 */
	public TgeneAccountForCredit(TgeneAccountForCreditKey pPk) {
		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 TgeneAccountForCredit
	 */
	public static TgeneAccountForCredit find(EntityManager pEntityManager, TgeneAccountForCreditKey pKey)
			throws Exception {
		TgeneAccountForCredit obj = pEntityManager.find(TgeneAccountForCredit.class, pKey);
		return obj;
	}
	/**
	 * Entrega la Clave primaria de TgeneAccountForCredit
	 * 
	 * @return El objeto que referencia a la Clave primaria de TgeneAccountForCredit
	 */
	public TgeneAccountForCreditKey getPk() {
		return pk;
	}
	/**
	 * Fija un nuevo valor a la Clave primaria de TgeneAccountForCredit
	 * 
	 * @param pPk El objeto que referencia a la nueva Clave primaria de TgeneAccountForCredit
	 */
	public void setPk(TgeneAccountForCreditKey pPk) {
		pk = pPk;
	}
	/**
	 * Obtiene el valor de cash
	 * 
	 * @return valor de cash
	 */
	public String getCash() {
		return cash;
	}
	/**
	 * Fija el valor de cash
	 * 
	 * @param pCash nuevo Valor de cash
	 */
	public void setCash(String pCash) {
		cash = pCash;
	}

	/**
	 * Obtiene el valor de checks
	 * 
	 * @return valor de checks
	 */
	public String getChecks() {
		return checks;
	}
	/**
	 * Fija el valor de checks
	 * 
	 * @param pChecks nuevo Valor de checks
	 */
	public void setChecks(String pChecks) {
		checks = pChecks;
	}

	/**
	 * Obtiene el valor de credit
	 * 
	 * @return valor de credit
	 */
	public String getCredit() {
		return credit;
	}
	/**
	 * Fija el valor de credit
	 * 
	 * @param pCredit nuevo Valor de credit
	 */
	public void setCredit(String pCredit) {
		credit = pCredit;
	}

	/**
	 * Obtiene el valor de creditaccount
	 * 
	 * @return valor de creditaccount
	 */
	public String getCreditaccount() {
		return creditaccount;
	}
	/**
	 * Fija el valor de creditaccount
	 * 
	 * @param pCreditaccount nuevo Valor de creditaccount
	 */
	public void setCreditaccount(String pCreditaccount) {
		creditaccount = pCreditaccount;
	}

	/**
	 * Obtiene el valor de creditaccountingcode
	 * 
	 * @return valor de creditaccountingcode
	 */
	public String getCreditaccountingcode() {
		return creditaccountingcode;
	}
	/**
	 * Fija el valor de creditaccountingcode
	 * 
	 * @param pCreditaccountingcode nuevo Valor de creditaccountingcode
	 */
	public void setCreditaccountingcode(String pCreditaccountingcode) {
		creditaccountingcode = pCreditaccountingcode;
	}

	/**
	 * Obtiene el valor de currency
	 * 
	 * @return valor de currency
	 */
	public String getCurrency() {
		return currency;
	}
	/**
	 * Fija el valor de currency
	 * 
	 * @param pCurrency nuevo Valor de currency
	 */
	public void setCurrency(String pCurrency) {
		currency = pCurrency;
	}

	/**
	 * Obtiene el valor de value
	 * 
	 * @return valor de value
	 */
	public BigDecimal getValue() {
		return value;
	}
	/**
	 * Fija el valor de value
	 * 
	 * @param pValue nuevo Valor de value
	 */
	public void setValue(BigDecimal pValue) {
		value = pValue;
	}

	/**
	 * Obtiene el valor de personcode
	 * 
	 * @return valor de personcode
	 */
	public Integer getPersoncode() {
		return personcode;
	}
	/**
	 * Fija el valor de personcode
	 * 
	 * @param pPersoncode nuevo Valor de personcode
	 */
	public void setPersoncode(Integer pPersoncode) {
		personcode = pPersoncode;
	}

	/**
	 * Obtiene el valor de idbeneficiary
	 * 
	 * @return valor de idbeneficiary
	 */
	public String getIdbeneficiary() {
		return idbeneficiary;
	}
	/**
	 * Fija el valor de idbeneficiary
	 * 
	 * @param pIdbeneficiary nuevo Valor de idbeneficiary
	 */
	public void setIdbeneficiary(String pIdbeneficiary) {
		idbeneficiary = pIdbeneficiary;
	}

	/**
	 * Obtiene el valor de beneficiaryname
	 * 
	 * @return valor de beneficiaryname
	 */
	public String getBeneficiaryname() {
		return beneficiaryname;
	}
	/**
	 * Fija el valor de beneficiaryname
	 * 
	 * @param pBeneficiaryname nuevo Valor de beneficiaryname
	 */
	public void setBeneficiaryname(String pBeneficiaryname) {
		beneficiaryname = pBeneficiaryname;
	}

	public boolean equals(Object rhs) {
		if (rhs == null)
			return false;
		if (!(rhs instanceof TgeneAccountForCredit))
			return false;
		TgeneAccountForCredit that = (TgeneAccountForCredit) rhs;
		if (this.getPk() == null || that.getPk() == null)
			return false;
		return (this.getPk().equals(that.getPk()));
	}
	/**
	 * Implementación del metodo hashCode de la la entidad TgeneAccountForCredit
	 * 
	 * @return el hashCode la instancia
	 */
	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;
	}
	/** Implementación toString */
	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;
	}
	/** Implementación de la creación de un bean en blanco TgeneAccountForCredit */
	public Object createInstance() {
		TgeneAccountForCredit instance = new TgeneAccountForCredit();
		instance.setPk(new TgeneAccountForCreditKey());
		return instance;
	}
	/**
	 * Clona la entidad TgeneAccountForCredit
	 * 
	 * @see com.fp.dto.hb.HibernateBean#cloneMe()
	 */
	public Object cloneMe() throws CloneNotSupportedException {
		TgeneAccountForCredit p = (TgeneAccountForCredit) this.clone();
		p.setPk((TgeneAccountForCreditKey) this.pk.cloneMe());
		return p;
	}
	
	//Metodos manuales.
	/** Sentencia que devuelve datos de la tabla TgeneAccountForCredit.*/
	private static final String HQL_ACCOUNT_FOR_CREDIT =
	"from TgeneAccountForCredit tafc  " +
	" where tafc.pk.account = :account "+
	" and tafc.pk.company = :company "+
	" order by tafc.pk.creditsequence ";
	
	/**
	 * Entrega datos de cuentas a acreditar ejemplo definicion de la forma de pago de certificado de deposito. 
	 * @param pAccount	Numero de cuenta.
	 * @param pCompany	Codigo de compania.
	 * @return	List<TgeneAccountForCredit>
	 * @throws Exception
	 */
	@SuppressWarnings(Constant.VUNCHECKED)
	public static List<TgeneAccountForCredit> find(EntityManager pEntityManager,
			String pAccount,Integer pCompany) throws Exception {
		List<TgeneAccountForCredit> lcredit = null;
		Query qry = pEntityManager.createQuery(HQL_ACCOUNT_FOR_CREDIT);
		qry.setParameter("account", pAccount);
		qry.setParameter("company", pCompany);
		lcredit = qry.getResultList();
		return lcredit;
	}
}
