package com.fp.persistence.pgeneral.gene;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;

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

import org.hibernate.SQLQuery;
import org.hibernate.Session;

import com.fp.common.helper.Constant;
import com.fp.dto.hb.HibernateBean;
import com.fp.teller.exception.TellerException;

/** Clase que implementa la entidad de Hibernate que hace referencia a la tabla TGENETELLERTRANSFERHEADER */
@Entity(name = "TgeneTellerTransferHeader")
@Table(name = "TGENETELLERTRANSFERHEADER")
public class TgeneTellerTransferHeader 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 TgeneTellerTransferHeader
	 */
	@EmbeddedId
	private TgeneTellerTransferHeaderKey pk;
	@Column(name = "DATEFROM", nullable = true)
	/**
	 * Numero de mensaje con el que se procersa el financiero.
	 */
	private Timestamp datefrom;

	@Column(name = "CURRENCYCODE", nullable = false)
	/**
	 * Codigo de moneda
	 */
	private String currencycode;

	@Column(name = "OFFICECODE", nullable = false)
	/**
	 * Codigo de oficina origen
	 */
	private Integer officecode;

	@Column(name = "BRANCHCODE", nullable = false)
	/**
	 * Codigo de sucursal origen
	 */
	private Integer branchcode;

	@Column(name = "COMPANYCODE", nullable = false)
	/**
	 * Codigo de compania al que pertenece la oficina
	 */
	private Integer companycode;

	@Column(name = "DESTINYUSERCODE", nullable = true)
	/**
	 * Codigo de usuario destino
	 */
	private String destinyusercode;

	@Column(name = "DESTINYOFFICECODE", nullable = true)
	/**
	 * Codigo de oficina destino
	 */
	private Integer destinyofficecode;

	@Column(name = "DESTINYBRANCHCODE", nullable = true)
	/**
	 * Codigo de sucursal destino
	 */
	private Integer destinybranchcode;

	@Column(name = "STATUSCATALOG", nullable = true)
	/**
	 * Codigo de catalogo  01 Natural, 02 Juridico
	 */
	private String statuscatalog;

	@Column(name = "STATUSCATALOGCODE", nullable = true)
	/**
	 * Codigo de tabla de catalogo 01 Codigo de tabla de tipos de persona
	 */
	private String statuscatalogcode;

	@Column(name = "ISVAULT", nullable = true)
	/**
	 * Y indica que la transferencia de saldos en de Boveda
	 */
	private String isvault;

	@Column(name = "TOTAL", nullable = true)
	/**
	 * Monto total de la transaccion
	 */
	private BigDecimal total;

	@Column(name = "JOURNALID", nullable = true)
	/**
	 * Numero de mensaje con el que se procersa el financiero.
	 */
	private String journalid;

	@Column(name = "OLDJOURNALID", nullable = true)
	/**
	 * Numero de mensaje anterior se utiliza en los reversos.
	 */
	private String oldjournalid;


	/** Contructor por defecto */
	public TgeneTellerTransferHeader() {
	}
	/**
	 * Contructor de TgeneTellerTransferHeader
	 * 
	 * @param pPk Clave Primaria del entity
	 * @param pCurrencycode Codigo de moneda
	 * @param pOfficecode Codigo de oficina origen
	 * @param pBranchcode Codigo de sucursal origen
	 * @param pCompanycode Codigo de compania al que pertenece la oficina
	 */
	public TgeneTellerTransferHeader(TgeneTellerTransferHeaderKey pPk, String pCurrencycode, Integer pOfficecode,
			Integer pBranchcode, Integer pCompanycode) {
		this();
		pk = pPk;
		currencycode = pCurrencycode;
		officecode = pOfficecode;
		branchcode = pBranchcode;
		companycode = pCompanycode;
	}
	/**
	 * 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 TgeneTellerTransferHeader
	 */
	public static TgeneTellerTransferHeader find(EntityManager pEntityManager, TgeneTellerTransferHeaderKey pKey)
			throws Exception {
		TgeneTellerTransferHeader obj = pEntityManager.find(TgeneTellerTransferHeader.class, pKey);
		return obj;
	}
	/**
	 * Entrega la Clave primaria de TgeneTellerTransferHeader
	 * 
	 * @return El objeto que referencia a la Clave primaria de TgeneTellerTransferHeader
	 */
	public TgeneTellerTransferHeaderKey getPk() {
		return pk;
	}
	/**
	 * Fija un nuevo valor a la Clave primaria de TgeneTellerTransferHeader
	 * 
	 * @param pPk El objeto que referencia a la nueva Clave primaria de TgeneTellerTransferHeader
	 */
	public void setPk(TgeneTellerTransferHeaderKey pPk) {
		pk = pPk;
	}
	/**
	 * Obtiene el valor de datefrom
	 * 
	 * @return valor de datefrom
	 */
	public Timestamp getDatefrom() {
		return datefrom;
	}
	/**
	 * Fija el valor de datefrom
	 * 
	 * @param pDatefrom nuevo Valor de datefrom
	 */
	public void setDatefrom(Timestamp pDatefrom) {
		datefrom = pDatefrom;
	}

	/**
	 * Obtiene el valor de currencycode
	 * 
	 * @return valor de currencycode
	 */
	public String getCurrencycode() {
		return currencycode;
	}
	/**
	 * Fija el valor de currencycode
	 * 
	 * @param pCurrencycode nuevo Valor de currencycode
	 */
	public void setCurrencycode(String pCurrencycode) {
		currencycode = pCurrencycode;
	}

	/**
	 * Obtiene el valor de officecode
	 * 
	 * @return valor de officecode
	 */
	public Integer getOfficecode() {
		return officecode;
	}
	/**
	 * Fija el valor de officecode
	 * 
	 * @param pOfficecode nuevo Valor de officecode
	 */
	public void setOfficecode(Integer pOfficecode) {
		officecode = pOfficecode;
	}

	/**
	 * Obtiene el valor de branchcode
	 * 
	 * @return valor de branchcode
	 */
	public Integer getBranchcode() {
		return branchcode;
	}
	/**
	 * Fija el valor de branchcode
	 * 
	 * @param pBranchcode nuevo Valor de branchcode
	 */
	public void setBranchcode(Integer pBranchcode) {
		branchcode = pBranchcode;
	}

	/**
	 * Obtiene el valor de companycode
	 * 
	 * @return valor de companycode
	 */
	public Integer getCompanycode() {
		return companycode;
	}
	/**
	 * Fija el valor de companycode
	 * 
	 * @param pCompanycode nuevo Valor de companycode
	 */
	public void setCompanycode(Integer pCompanycode) {
		companycode = pCompanycode;
	}

	/**
	 * Obtiene el valor de destinyusercode
	 * 
	 * @return valor de destinyusercode
	 */
	public String getDestinyusercode() {
		return destinyusercode;
	}
	/**
	 * Fija el valor de destinyusercode
	 * 
	 * @param pDestinyusercode nuevo Valor de destinyusercode
	 */
	public void setDestinyusercode(String pDestinyusercode) {
		destinyusercode = pDestinyusercode;
	}

	/**
	 * Obtiene el valor de destinyofficecode
	 * 
	 * @return valor de destinyofficecode
	 */
	public Integer getDestinyofficecode() {
		return destinyofficecode;
	}
	/**
	 * Fija el valor de destinyofficecode
	 * 
	 * @param pDestinyofficecode nuevo Valor de destinyofficecode
	 */
	public void setDestinyofficecode(Integer pDestinyofficecode) {
		destinyofficecode = pDestinyofficecode;
	}

	/**
	 * Obtiene el valor de destinybranchcode
	 * 
	 * @return valor de destinybranchcode
	 */
	public Integer getDestinybranchcode() {
		return destinybranchcode;
	}
	/**
	 * Fija el valor de destinybranchcode
	 * 
	 * @param pDestinybranchcode nuevo Valor de destinybranchcode
	 */
	public void setDestinybranchcode(Integer pDestinybranchcode) {
		destinybranchcode = pDestinybranchcode;
	}

	/**
	 * Obtiene el valor de statuscatalog
	 * 
	 * @return valor de statuscatalog
	 */
	public String getStatuscatalog() {
		return statuscatalog;
	}
	/**
	 * Fija el valor de statuscatalog
	 * 
	 * @param pStatuscatalog nuevo Valor de statuscatalog
	 */
	public void setStatuscatalog(String pStatuscatalog) {
		statuscatalog = pStatuscatalog;
	}

	/**
	 * Obtiene el valor de statuscatalogcode
	 * 
	 * @return valor de statuscatalogcode
	 */
	public String getStatuscatalogcode() {
		return statuscatalogcode;
	}
	/**
	 * Fija el valor de statuscatalogcode
	 * 
	 * @param pStatuscatalogcode nuevo Valor de statuscatalogcode
	 */
	public void setStatuscatalogcode(String pStatuscatalogcode) {
		statuscatalogcode = pStatuscatalogcode;
	}

	/**
	 * Obtiene el valor de isvault
	 * 
	 * @return valor de isvault
	 */
	public String getIsvault() {
		return isvault;
	}
	/**
	 * Fija el valor de isvault
	 * 
	 * @param pIsvault nuevo Valor de isvault
	 */
	public void setIsvault(String pIsvault) {
		isvault = pIsvault;
	}

	/**
	 * Obtiene el valor de total
	 * 
	 * @return valor de total
	 */
	public BigDecimal getTotal() {
		return total;
	}
	/**
	 * Fija el valor de total
	 * 
	 * @param pTotal nuevo Valor de total
	 */
	public void setTotal(BigDecimal pTotal) {
		total = pTotal;
	}

	/**
	 * Obtiene el valor de journalid
	 * 
	 * @return valor de journalid
	 */
	public String getJournalid() {
		return journalid;
	}
	/**
	 * Fija el valor de journalid
	 * 
	 * @param pJournalid nuevo Valor de journalid
	 */
	public void setJournalid(String pJournalid) {
		journalid = pJournalid;
	}

	/**
	 * Obtiene el valor de oldjournalid
	 * 
	 * @return valor de oldjournalid
	 */
	public String getOldjournalid() {
		return oldjournalid;
	}
	/**
	 * Fija el valor de oldjournalid
	 * 
	 * @param pOldjournalid nuevo Valor de oldjournalid
	 */
	public void setOldjournalid(String pOldjournalid) {
		oldjournalid = pOldjournalid;
	}

	public boolean equals(Object rhs) {
		if (rhs == null)
			return false;
		if (!(rhs instanceof TgeneTellerTransferHeader))
			return false;
		TgeneTellerTransferHeader that = (TgeneTellerTransferHeader) 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 TgeneTellerTransferHeader
	 * 
	 * @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 TgeneTellerTransferHeader */
	public Object createInstance() {
		TgeneTellerTransferHeader instance = new TgeneTellerTransferHeader();
		instance.setPk(new TgeneTellerTransferHeaderKey());
		return instance;
	}
	/**
	 * Clona la entidad TgeneTellerTransferHeader
	 * 
	 * @see com.fp.dto.hb.HibernateBean#cloneMe()
	 */
	public Object cloneMe() throws CloneNotSupportedException {
		TgeneTellerTransferHeader p = (TgeneTellerTransferHeader) this.clone();
		p.setPk((TgeneTellerTransferHeaderKey) this.pk.cloneMe());
		return p;
	}
	public Object getId() {
		return this.pk;
	}

	// metodos manuales.
	/** Sentencia que entrega la los datos de TgeneTellerTransferHeader */
	private static final String HQL_TELLER_TRANSFER_HEADER_JID = " from TgeneTellerTransferHeader tgth"
			+ " where tgth.pk.workingdate = :workingdate" + " and tgth.journalid = :journalid";

	/**
	 * Metodo que entrega los datos de TgeneTellerTransferHeader, dada la fecha de trabajo y el journalid.
	 * @param pEntityManager Referecia a la session de la base de datos.
	 * @param pWorkingdate Fecha de trabajo.
	 * @param pJournalid Numero de journal.
	 * @param isold Indica si obtiene el registro de journalid o de oldjournalid.
	 * @return TgeneTellerTransferHeader
	 * @throws Exception
	 */
	public static TgeneTellerTransferHeader find(EntityManager pEntityManager,Date pWorkingdate, String pJournalid)
			throws Exception {
		TgeneTellerTransferHeader tgeneTellerTransferHeader = null;
		Query qry = pEntityManager.createQuery(HQL_TELLER_TRANSFER_HEADER_JID);
		qry.setParameter("workingdate", pWorkingdate);
		qry.setParameter("journalid", pJournalid);
		try {
			tgeneTellerTransferHeader = (TgeneTellerTransferHeader)qry.getSingleResult();
		} catch (NoResultException e) {
			return tgeneTellerTransferHeader;
		}
		return tgeneTellerTransferHeader;
	}
	
	
	
    /**sentencia que elimina TgeneTellerTransferHeader*/
    private static final String DEL_TRANSF_HEAD =
            " delete from TGENETELLERTRANSFERHEADER t "
            + " where t.WORKINGDATE = :workingdate "
            + " and t.USERCODE = :usercode "
            + " and t.TRANSFERNUMBER = :transfernumber";
    
    /**
     * Elimina un registro de la tabla para el usuario, fecha de trabajo y numero de transferencia.
     * @param pEntityManager  Referencia la session de la base de datos.
     * @param pWorkingdate  Fecha de trabajo.
     * @param pUser  Codigo de usuario.
     * @param pTransfernumber  Numero de transferencia. 
     * @throws Exception
     */
    public static void delete(EntityManager pEntityManager,Date pWorkingdate,String pUser,Integer pTransfernumber) throws Exception {
        //Elimina TgeneTellerTransferHeader
    	Session s =  (Session)pEntityManager.getDelegate();
        SQLQuery sqldet = s.createSQLQuery(DEL_TRANSF_HEAD);
        sqldet.setDate("workingdate", pWorkingdate);
        sqldet.setString("usercode", pUser);
        sqldet.setInteger("transfernumber", pTransfernumber);
        sqldet.executeUpdate();
    }
    
    
    
    /**Sentencia que entrega la los datos de TgeneTellerTransferHeader*/
    private static final String JPQL_TELLER_TRANSFER_HEADER =
            " from TgeneTellerTransferHeader tgth"
            + " where tgth.pk.workingdate = :workingdate"
            + " and tgth.pk.usercode = :usercode"
            + " and tgth.pk.transfernumber = :transfernumber";
    /**
     * Metodo que entrega los datos de TgeneTellerTransferHeader, dada la fecha de trabajo, usuario y numero de transferencia.´
     * 
     * @param pEntityManager  Session de la base de datos.
     * @param workingdate  Fecha de trabajo.
     * @param usercode  Codigo de usuario.
     * @param transfernumber  Numero de transferencia.
     * @return  TgeneTellerTransferHeader
     * @throws Exception
     */
    public static TgeneTellerTransferHeader find(EntityManager pEntityManager, Date workingdate, String usercode, Integer transfernumber) throws Exception{
        TgeneTellerTransferHeader tgeneTellerTransferHeader = null;
        Query qry = pEntityManager.createQuery(TgeneTellerTransferHeader.JPQL_TELLER_TRANSFER_HEADER);
        qry.setParameter(Constant.VWORKINGDATE, workingdate);
        qry.setParameter("usercode", usercode);
        qry.setParameter("transfernumber", transfernumber);
        try {
        	tgeneTellerTransferHeader = (TgeneTellerTransferHeader) qry.getSingleResult();
		} catch (NoResultException e) {
			throw new TellerException("TELLER-0001", "TRANSFERENCIA NO DEFINIDA EN TGENETELLERTRANSFERHEADER TRANSFERNUMBER:{0} USERCODE:{1} WORKINGDATE:{2}", transfernumber, usercode, workingdate);
		}
        return tgeneTellerTransferHeader;
    }
    
}
