/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.entidad;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.Hibernate;

import br.com.rjconsultores.auditador.annotations.AuditarClasse;
import br.com.rjconsultores.auditador.annotations.NaoAuditar;
import br.com.rjconsultores.auditador.interfaces.Auditavel;

/**
 *
 * @author Desenvolvimento
 */
@AuditarClasse(nome = "PtovtaEmpresa", tela = "auditarClasse.PtovtaEmpresa")
@Entity
@SequenceGenerator(name = "PTOVTA_EMPRESA_SEQ", sequenceName = "PTOVTA_EMPRESA_SEQ", allocationSize = 1)
@Table(name = "PTOVTA_EMPRESA")
public class PtovtaEmpresa implements Serializable, Auditavel<PtovtaEmpresa>{

    private static final long serialVersionUID = 1L;
    
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "PTOVTA_EMPRESA_SEQ")
    @Column(name = "PTOVTAEMPRESA_ID")
    private Integer ptovtaempresaId;
    
    @Column(name = "ACTIVO")
    private Boolean activo;
    
    @Column(name = "FECMODIF")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecmodif;
    
    @Column(name = "USUARIO_ID")
    private Integer usuarioId;
    
    @JoinColumn(name = "EMPRESA_ID", referencedColumnName = "EMPRESA_ID")
    @ManyToOne
    private Empresa empresa;
    
    @JoinColumn(name = "PUNTOVENTA_ID", referencedColumnName = "PUNTOVENTA_ID")
    @ManyToOne
    private PuntoVenta puntoVenta;
    
    @Column(name = "INDTERCEIRIZADA")
    private Boolean indTerceirizada;
    
    @Column(name = "INDBLOQUEADA")
    private Boolean indBloqueada;
    
    @Column(name = "INDMOSTRARCAJA")
    private Boolean indMostrarCaja;
    
    @Column(name = "NUMSITEF")
    private String numeroSitef;
    
	@Column(name = "MERCHANTSTOREADYEN")
	private String merchantStoreAdyen;	
        
    @NaoAuditar
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@JoinColumn(name = "PTOVTAEMPRESA_ID", referencedColumnName = "PTOVTAEMPRESA_ID")
	private List<PtovtaEmpresaContaBancaria> lsPtovtaEmpresaContaBancaria;
    
//	@JoinColumn(name = "EMPRESACONTABANCARIA_ID", referencedColumnName = "EMPRESACONTABANCARIA_ID")
//	@ManyToOne
//	private EmpresaContaBancaria empresaContaBancaria;    
    
    @Column(name = "INDIMPCOMPCARTAO")
    private Boolean indImpCompCartao;

    @NaoAuditar
    @Transient
	private List<EmpresaContaBancaria> contasBancaria;
    
	@Transient
	@NaoAuditar
	private PtovtaEmpresa ptovtaEmpresaClone;
    
    public PtovtaEmpresa() {
    }

    public PtovtaEmpresa(Integer ptovtaempresaId) {
        this.ptovtaempresaId = ptovtaempresaId;
    }

    public Integer getPtovtaempresaId() {
        return ptovtaempresaId;
    }

    public void setPtovtaempresaId(Integer ptovtaempresaId) {
        this.ptovtaempresaId = ptovtaempresaId;
    }

    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

    public Date getFecmodif() {
        return fecmodif;
    }

    public void setFecmodif(Date fecmodif) {
        this.fecmodif = fecmodif;
    }

    public Integer getUsuarioId() {
        return usuarioId;
    }

    public void setUsuarioId(Integer usuarioId) {
        this.usuarioId = usuarioId;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }

    public PuntoVenta getPuntoVenta() {
        return puntoVenta;
    }

    public void setPuntoVenta(PuntoVenta puntoVenta) {
        this.puntoVenta = puntoVenta;
    }        

//    public EmpresaContaBancaria getEmpresaContaBancaria() {
//		return empresaContaBancaria;
//	}
//
//	public void setEmpresaContaBancaria(EmpresaContaBancaria empresaContaBancaria) {
//		this.empresaContaBancaria = empresaContaBancaria;
//	}

	public Boolean getIndTerceirizada() {
		return indTerceirizada;
	}

	public void setIndTerceirizada(Boolean indTerceirizada) {
		this.indTerceirizada = indTerceirizada;
	}

	public Boolean getIndBloqueada() {
		return indBloqueada;
	}

	public void setIndBloqueada(Boolean indBloqueada) {
		this.indBloqueada = indBloqueada;
	}

	/**
	 * @return the indMostrarCaja
	 */
	public Boolean getIndMostrarCaja() {
		return indMostrarCaja;
	}

	/**
	 * @param indMostrarCaja the indMostrarCaja to set
	 */
	public void setIndMostrarCaja(Boolean indMostrarCaja) {
		this.indMostrarCaja = indMostrarCaja;
	}

	public String getNumeroSitef() {
		return numeroSitef;
	}

	public void setNumeroSitef(String numeroSitef) {
		this.numeroSitef = numeroSitef;
	}

	public Boolean getIndImpCompCartao() {
		return indImpCompCartao;
	}

	public void setIndImpCompCartao(Boolean indImpCompCartao) {
		this.indImpCompCartao = indImpCompCartao;
	}

	public List<PtovtaEmpresaContaBancaria> getLsPtovtaEmpresaContaBancaria() {
		if (lsPtovtaEmpresaContaBancaria == null) {
			lsPtovtaEmpresaContaBancaria = new ArrayList<PtovtaEmpresaContaBancaria>(0); 
		}
		
		return lsPtovtaEmpresaContaBancaria;
	}

	public void setLsPtovtaEmpresaContaBancaria(List<PtovtaEmpresaContaBancaria> lsPtovtaEmpresaContaBancaria) {
		this.lsPtovtaEmpresaContaBancaria = lsPtovtaEmpresaContaBancaria;
	}

	public List<EmpresaContaBancaria> getContasBancaria() {
		if (contasBancaria == null) {
			contasBancaria = new ArrayList<EmpresaContaBancaria>(0);
		}
		
		return contasBancaria;
	}

	public void setContasBancaria(List<EmpresaContaBancaria> contasBancaria) {
		this.contasBancaria = contasBancaria;
	}

	public String getMerchantStoreAdyen() {
		return merchantStoreAdyen;
	}

	public void setMerchantStoreAdyen(String merchantStoreAdyen) {
		this.merchantStoreAdyen = merchantStoreAdyen;
	}

	public String getContasBancariaInfo() {
		if (!getContasBancaria().isEmpty()) {
			StringBuilder sb = new StringBuilder();
			
			for (EmpresaContaBancaria ecb : getContasBancaria()) {
				if (!sb.toString().isEmpty()) {
					sb.append(", ");
				}

				sb.append(ecb.getInstituicaoFinandeira().getNome());
			}
			
			return sb.toString();
		}
		
		return null;
	}

	@Override
	public void clonar() throws CloneNotSupportedException {
		ptovtaEmpresaClone = new PtovtaEmpresa();
		ptovtaEmpresaClone = (PtovtaEmpresa) this.clone();
		Hibernate.initialize(ptovtaEmpresaClone.getPuntoVenta());
		
	}

	@Override
	public PtovtaEmpresa getCloneObject() throws CloneNotSupportedException {
		return ptovtaEmpresaClone;
	}

	@Override
	public String getTextoInclusaoExclusao() {
		return String.format("ID [%s]", getPtovtaempresaId());
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((ptovtaempresaId == null) ? 0 : ptovtaempresaId.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		PtovtaEmpresa other = (PtovtaEmpresa) obj;
		if (ptovtaempresaId == null) {
			if (other.ptovtaempresaId != null)
				return false;
		} else if (!ptovtaempresaId.equals(other.ptovtaempresaId))
			return false;
		return true;
	}

    @Override
    public String toString() {
        return "com.rjconsultores.ventaboletos.entidad.PtovtaEmpresa[ptovtaempresaId=" + ptovtaempresaId + "]";
    }
}