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

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.apache.commons.lang.BooleanUtils;

import com.rjconsultores.ventaboletos.enums.ModeloComissaoImpressaoPosterior;

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

/**
 *
 * @author Rafael
 */
@AuditarClasse(nome = "PtovtaComissao", tela = "auditarClasse.PtovtaComissao")
@Entity
@SequenceGenerator(name = "PTOVTA_COMISSAO_SEQ", sequenceName = "PTOVTA_COMISSAO_SEQ", allocationSize = 1)
@Table(name = "PTOVTA_COMISSAO")
public class PtovtaComissao implements Serializable, Auditavel<PtovtaComissao> {
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "PTOVTA_COMISSAO_SEQ")
	@Column(name = "PTOVTACOMISSAO_ID")
	private Integer ptovtaComissaoId;

	@Column(name = "ISSRETIDO")
	private BigDecimal issretido;

	@Column(name = "ROYALTIES")
	private BigDecimal royalties;

	@Column(name = "ENVIARRECIBO")
	private Boolean enviarRecibo;

	@Column(name = "RECEITA")
	private String receita;

	@OneToOne
	@JoinColumn(name = "PTOVTADESCOMISSAO_ID")
	private PuntoVenta descComissaoId;

	@Column(name = "PASSAGEMALTA")
	private BigDecimal passagemAlta;

	@Column(name = "PASSAGEMBAIXA")
	private BigDecimal passagemBaixa;

	@Column(name = "SEGUROALTA")
	private BigDecimal seguroAlta;

	@Column(name = "SEGUROBAIXA")
	private BigDecimal seguroBaixa;

	@Column(name = "OUTROSBAIXA")
	private BigDecimal outrosBaixa;

	@Column(name = " OUTROSALTA")
	private BigDecimal outrosAlta;

	@Column(name = "EXCESSOALTA")
	private BigDecimal excessoAlta;

	@Column(name = "EXCESSOBAIXA")
	private BigDecimal excessoBaixa;

	@Column(name = "TARIFARECEITA")
	private Boolean tarifaReceita;

	@Column(name = " SEGURORECEITA")
	private Boolean seguroReceita;

	@Column(name = "TAXARECEITA")
	private Boolean taxaReceita;

	@Column(name = "PEDAGIORECEITA")
	private Boolean pedagioReceita;

	@Column(name = " TARIFADEV")
	private Boolean tarifaDev;

	@Column(name = " SEGURO_DEV")
	private Boolean seguroDev;

	@Column(name = "TAXADEV")
	private Boolean taxaDev;

	@Column(name = "PEDAGIODEV")
	private Boolean pedagioDev;

	@Column(name = "ACTIVO")
	private Boolean activo;

	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;

	@Column(name = "USUARIO_ID")
	private int usuarioId;

	@Column(name = "INDIMPRESSAOGAPPORC")
	private Boolean indimpressaogapporc;

	@Column(name = "VALOR_IMPRESSAO_GAP")
	private BigDecimal valorImpressaoGap;
	
	@Column(name = "VALOR_IMPRESSAO_GAP_ALTA")
	private BigDecimal valorImpressaoGapAlta;

	@JoinColumn(name = "PUNTOVENTA_ID", referencedColumnName = "PUNTOVENTA_ID")
	@ManyToOne
	private PuntoVenta puntoventaId;

	@JoinColumn(name = "EMPRESA_ID", referencedColumnName = "EMPRESA_ID")
	@ManyToOne
	private Empresa empresaId;

	@Column(name = "INDRETERCOMISSAO")
	private Boolean indretercomissao;
	
	@Column(name = "INDBILHETESDEVCANORIGEM")
	private Boolean indbilhetesdevcanorigem;
	
	@Column(name = "INDPAGACOMISSAOBILHETEOS")
	private Boolean indPagaComissaoBilheteOS;
	
	@Column(name = "COMISSAOIMPPOSTERIOR")
	@Enumerated(EnumType.STRING)
	private ModeloComissaoImpressaoPosterior modeloComissaoImpressaoPosterior;
	
	@Column(name = "VALOR_IMP_GAP_COMP")
	private BigDecimal valorImpGapComp;
	
	@Column(name = "VALOR_IMP_GAP_ALTA_COMP")
	private BigDecimal valorImpGapCompAlta;

	@Column(name = "VALOR_VENDA_GAP_COMP")
	private BigDecimal valorVendaGapComp;
	
	@Column(name = "VALOR_VENDA_GAP_ALTA_COMP")
	private BigDecimal valorVendaGapCompAlta;

	@Column(name = "SEGUROOBRIGATORIOALTA")
	private BigDecimal seguroobrigatorioAlta;

	@Column(name = "SEGUROOBRIGATORIOBAIXA")
	private BigDecimal seguroobrigatorioBaixa;
	
	@Column(name = "RECARGACELULARALTA")
	private BigDecimal recargaCelularAlta;

	@Column(name = "RECARGACELULARBAIXA")
	private BigDecimal recargaCelularBaixa;
	
	@Transient
	@NaoAuditar
	private PtovtaComissao ptovtaComissaoClone;
	
	public PtovtaComissao() {
		super();
		this.tarifaDev = Boolean.TRUE;
		this.tarifaReceita = Boolean.TRUE;
	}

	public enum Receita {
		// Declaração dos enum
		RECEITABRUTA("RECEITA BRUTA", "RB"),

		RECEITALIQUIDA("RECEITA LÍQUIDA ", "RL");

		// Definição das constantes
		public final String valor;
		public final String descricao;

		public String valor() {
			return this.valor;
		}

		public String descricao() {
			return this.descricao;
		}

		private Receita(String descricao, String valor) {
			this.descricao = descricao;
			this.valor = valor;
		}

		public static Receita getByValor(String valor) {
			if (valor == null) {
				return Receita.RECEITABRUTA;
			} else {
				if (valor.equals("RB"))
					return Receita.RECEITABRUTA;
				if (valor.equals("RL"))
					return Receita.RECEITALIQUIDA;
			}

			return null;

		}

	}

	public PtovtaComissao(Integer ptovtaComissaoId) {
		this.ptovtaComissaoId = ptovtaComissaoId;
	}

	public PtovtaComissao(Integer ptovtaComissaoId, BigDecimal issretido, BigDecimal royalties, Boolean enviarrecibo, String receita, BigDecimal passagemAlta, BigDecimal passagemBaixa, BigDecimal seguroAlta, BigDecimal seguroBaixa, BigDecimal outrosBaixa, BigDecimal outrosAlta, BigDecimal excessoAlta, BigDecimal excessoBaixa, Boolean tarifaReceita, Boolean seguroReceita, Boolean taxaReceita, Boolean pedagioReceita, Boolean tarifaDev, Boolean seguroDev, Boolean taxaDev, Boolean pegagioDev, Boolean activo, Date fecmodif, int usuarioId, Boolean indimpressaogapporc, BigDecimal valorImpressaoGap,
			BigDecimal seguroobrigatorioBaixa, BigDecimal seguroobrigatorioAlta) {
		super();
		this.ptovtaComissaoId = ptovtaComissaoId;
		this.issretido = issretido;
		this.royalties = royalties;
		this.enviarRecibo = enviarrecibo;
		this.receita = receita;
		this.passagemAlta = passagemAlta;
		this.passagemBaixa = passagemBaixa;
		this.seguroAlta = seguroAlta;
		this.seguroBaixa = seguroBaixa;
		this.outrosBaixa = outrosBaixa;
		this.outrosAlta = outrosAlta;
		this.excessoAlta = excessoAlta;
		this.excessoBaixa = excessoBaixa;
		this.tarifaReceita = tarifaReceita;
		this.seguroReceita = seguroReceita;
		this.taxaReceita = taxaReceita;
		this.pedagioReceita = pedagioReceita;
		this.tarifaDev = tarifaDev;
		this.seguroDev = seguroDev;
		this.taxaDev = taxaDev;
		this.pedagioDev = pegagioDev;
		this.activo = activo;
		this.fecmodif = fecmodif;
		this.usuarioId = usuarioId;
		this.indimpressaogapporc = indimpressaogapporc;
		this.valorImpressaoGap = valorImpressaoGap;
		this.seguroobrigatorioBaixa = seguroobrigatorioBaixa;
		this.seguroobrigatorioAlta = seguroobrigatorioAlta; 
	}

	public Integer getPtovtaComissaoId() {
		return ptovtaComissaoId;
	}

	public void setPtovtaComissaoId(Integer ptovtaComissaoId) {
		this.ptovtaComissaoId = ptovtaComissaoId;
	}

	public PuntoVenta getDescComissaoId() {
		return descComissaoId;
	}

	public void setDescComissaoId(PuntoVenta descComissaoId) {
		this.descComissaoId = descComissaoId;
	}

	public BigDecimal getIssretido() {
		return issretido;
	}

	public void setIssretido(BigDecimal issretido) {
		this.issretido = issretido;
	}

	public BigDecimal getRoyalties() {
		return royalties;
	}

	public void setRoyalties(BigDecimal royalties) {
		this.royalties = royalties;
	}

	public Boolean getEnviarrecibo() {
		return enviarRecibo;
	}

	public void setEnviarrecibo(Boolean enviarRecibo) {
		this.enviarRecibo = enviarRecibo;
	}

	public String getReceita() {
		return receita;
	}

	public void setReceita(String receita) {
		this.receita = receita;
	}

	public BigDecimal getPassagemAlta() {
		return passagemAlta;
	}

	public void setPassagemAlta(BigDecimal passagemAlta) {
		this.passagemAlta = passagemAlta;
	}

	public BigDecimal getPassagemBaixa() {
		return passagemBaixa;
	}

	public void setPassagemBaixa(BigDecimal passagemBaixa) {
		this.passagemBaixa = passagemBaixa;
	}

	public BigDecimal getSeguroAlta() {
		return seguroAlta;
	}

	public void setSeguroAlta(BigDecimal seguroAlta) {
		this.seguroAlta = seguroAlta;
	}

	public BigDecimal getSeguroBaixa() {
		return seguroBaixa;
	}

	public void setSeguroBaixa(BigDecimal seguroBaixa) {
		this.seguroBaixa = seguroBaixa;
	}

	public BigDecimal getOutrosBaixa() {
		return outrosBaixa;
	}

	public void setOutrosBaixa(BigDecimal outrosBaixa) {
		this.outrosBaixa = outrosBaixa;
	}

	public BigDecimal getOutrosAlta() {
		return outrosAlta;
	}

	public void setOutrosAlta(BigDecimal outrosAlta) {
		this.outrosAlta = outrosAlta;
	}

	public BigDecimal getExcessoAlta() {
		return excessoAlta;
	}

	public void setExcessoAlta(BigDecimal excessoAlta) {
		this.excessoAlta = excessoAlta;
	}

	public BigDecimal getExcessoBaixa() {
		return excessoBaixa;
	}

	public void setExcessoBaixa(BigDecimal excessoBaixa) {
		this.excessoBaixa = excessoBaixa;
	}

	public Boolean getTarifaReceita() {
		return tarifaReceita;
	}

	public void setTarifaReceita(Boolean tarifaReceita) {
		this.tarifaReceita = tarifaReceita;
	}

	public Boolean getSeguroReceita() {
		return seguroReceita != null ? seguroReceita : false;
	}

	public void setSeguroReceita(Boolean seguroReceita) {
		this.seguroReceita = seguroReceita;
	}

	public Boolean getTaxaReceita() {
		return taxaReceita;
	}

	public void setTaxaReceita(Boolean taxaReceita) {
		this.taxaReceita = taxaReceita;
	}

	public Boolean getPedagioReceita() {
		return pedagioReceita;
	}

	public void setPedagioReceita(Boolean pedagioReceita) {
		this.pedagioReceita = pedagioReceita;
	}

	public Boolean getTarifaDev() {
		return tarifaDev;
	}

	public void setTarifaDev(Boolean tarifaDev) {
		this.tarifaDev = tarifaDev;
	}

	public Boolean getSeguroDev() {
		return seguroDev != null ? seguroDev : false;
	}

	public void setSeguroDev(Boolean seguroDev) {
		this.seguroDev = seguroDev;
	}

	public Boolean getTaxaDev() {
		return taxaDev;
	}

	public void setTaxaDev(Boolean taxaDev) {
		this.taxaDev = taxaDev;
	}

	public Boolean getPedagioDev() {
		return pedagioDev;
	}

	public void setPedagioDev(Boolean pegagioDev) {
		this.pedagioDev = pegagioDev;
	}

	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 int getUsuarioId() {
		return usuarioId;
	}

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

	public PuntoVenta getPuntoventaId() {
		return puntoventaId;
	}

	public void setPuntoventaId(PuntoVenta puntoventaId) {
		this.puntoventaId = puntoventaId;
	}

	//

	/**
	 * @return the empresaId
	 */
	public Empresa getEmpresaId() {
		return empresaId;
	}

	/**
	 * @param empresaId
	 *            the empresaId to set
	 */
	public void setEmpresaId(Empresa empresaId) {
		this.empresaId = empresaId;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (ptovtaComissaoId != null ? ptovtaComissaoId.hashCode() : 0);
		return hash;
	}

	@Override
	public boolean equals(Object object) {
		// TODO: Warning - this method won't work in the case the id fields are not set
		if (!(object instanceof PtovtaComissao)) {
			return false;
		}
		PtovtaComissao other = (PtovtaComissao) object;
		if ((this.ptovtaComissaoId == null && other.ptovtaComissaoId != null) || (this.ptovtaComissaoId != null && !this.ptovtaComissaoId.equals(other.ptovtaComissaoId))) {
			return false;
		}
		return true;
	}

	public Boolean getIndimpressaogapporc() {
		return indimpressaogapporc;
	}

	public void setIndimpressaogapporc(Boolean indimpressaogapporc) {
		this.indimpressaogapporc = indimpressaogapporc;
	}

	public BigDecimal getValorImpressaoGap() {
		return valorImpressaoGap;
	}

	public void setValorImpressaoGap(BigDecimal valorImpressaoGap) {
		this.valorImpressaoGap = valorImpressaoGap;
	}

	public Boolean getIndretercomissao() {
		return indretercomissao;
	}

	public void setIndretercomissao(Boolean indretercomissao) {
		this.indretercomissao = indretercomissao;
	}

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

	public Boolean getIndbilhetesdevcanorigem() {
		return indbilhetesdevcanorigem;
	}

	public void setIndbilhetesdevcanorigem(Boolean indbilhetesdevcanorigem) {
		this.indbilhetesdevcanorigem = indbilhetesdevcanorigem;
	}

	public BigDecimal getValorImpressaoGapAlta() {
		return valorImpressaoGapAlta;
	}

	public void setValorImpressaoGapAlta(BigDecimal valorImpressaoGapAlta) {
		this.valorImpressaoGapAlta = valorImpressaoGapAlta;
	}

	public Boolean getIndPagaComissaoBilheteOS() {
		return indPagaComissaoBilheteOS;
	}

	public void setIndPagaComissaoBilheteOS(Boolean indPagaComissaoBilheteOS) {
		this.indPagaComissaoBilheteOS = indPagaComissaoBilheteOS;
	}

	public ModeloComissaoImpressaoPosterior getModeloComissaoImpressaoPosterior() {
		return modeloComissaoImpressaoPosterior;
	}

	public void setModeloComissaoImpressaoPosterior(ModeloComissaoImpressaoPosterior modeloComissaoImpressaoPosterior) {
		this.modeloComissaoImpressaoPosterior = modeloComissaoImpressaoPosterior;
	}

	public BigDecimal getValorImpGapComp() {
		return valorImpGapComp;
	}

	public void setValorImpGapComp(BigDecimal valorImpGapComp) {
		this.valorImpGapComp = valorImpGapComp;
	}

	public BigDecimal getValorImpGapCompAlta() {
		return valorImpGapCompAlta;
	}

	public void setValorImpGapCompAlta(BigDecimal valorImpGapCompAlta) {
		this.valorImpGapCompAlta = valorImpGapCompAlta;
	}

	public BigDecimal getValorVendaGapComp() {
		return valorVendaGapComp;
	}

	public void setValorVendaGapComp(BigDecimal valorVendaGapComp) {
		this.valorVendaGapComp = valorVendaGapComp;
	}

	public BigDecimal getValorVendaGapCompAlta() {
		return valorVendaGapCompAlta;
	}

	public void setValorVendaGapCompAlta(BigDecimal valorVendaGapCompAlta) {
		this.valorVendaGapCompAlta = valorVendaGapCompAlta;
	}

	public BigDecimal getSeguroobrigatorioAlta() {
		return seguroobrigatorioAlta;
	}

	public void setSeguroobrigatorioAlta(BigDecimal seguroobrigatorioAlta) {
		this.seguroobrigatorioAlta = seguroobrigatorioAlta;
	}

	public BigDecimal getSeguroobrigatorioBaixa() {
		return seguroobrigatorioBaixa;
	}

	public void setSeguroobrigatorioBaixa(BigDecimal seguroobrigatorioBaixa) {
		this.seguroobrigatorioBaixa = seguroobrigatorioBaixa;
	}

	public BigDecimal getRecargaCelularAlta() {
		return recargaCelularAlta;
	}

	public void setRecargaCelularAlta(BigDecimal recargaCelularAlta) {
		this.recargaCelularAlta = recargaCelularAlta;
	}

	public BigDecimal getRecargaCelularBaixa() {
		return recargaCelularBaixa;
	}

	public void setRecargaCelularBaixa(BigDecimal recargaCelularBaixa) {
		this.recargaCelularBaixa = recargaCelularBaixa;
	}
	
	@Override
	public void clonar() throws CloneNotSupportedException {
		ptovtaComissaoClone = new PtovtaComissao();
		ptovtaComissaoClone = (PtovtaComissao) this.clone();

		if (this.getPuntoventaId() != null) {
			if (BooleanUtils.isTrue(getPuntoventaId().getActivo())) {
				getPuntoventaId().clonar();
			}
			ptovtaComissaoClone.setPuntoventaId(getPuntoventaId());
		}

	}

	@Override
	public PtovtaComissao getCloneObject() throws CloneNotSupportedException {
		return ptovtaComissaoClone;
	}

	@Override
	public String getTextoInclusaoExclusao() {
		return String.format("ID [%s]", getPtovtaComissaoId());
	}


}
