/*
 * 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.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.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 br.com.rjconsultores.auditador.annotations.AuditarLista;
import br.com.rjconsultores.auditador.annotations.NaoAuditar;
import br.com.rjconsultores.auditador.interfaces.Auditavel;

@Entity
@SequenceGenerator(name = "EMPRESA_IMPOSTO_SEQ", sequenceName = "EMPRESA_IMPOSTO_SEQ", allocationSize = 1)
@Table(name = "EMPRESA_IMPOSTO")
public class EmpresaImposto implements Serializable,  Auditavel<EmpresaImposto>   {
	private static final long serialVersionUID = 1L;

	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "EMPRESA_IMPOSTO_SEQ")
	@Column(name = "EMPRESAIMPOSTO_ID")
	private Integer empresaImpostoId;

	@Column(name = "ICMS")
	private BigDecimal icms;

	@Column(name = "INDTARIFAMUNICIPAL")
	private Boolean indTarifaMunicipal;
	@Column(name = "INDSEGUROMUNICIPAL")
	private Boolean indSeguroMunicipal;
	@Column(name = "INDTXEMBARQUEMUNICIPAL")
	private Boolean indTxEmbarqueMunicipal;
	@Column(name = "INDPEDAGIOMUNICIPAL")
	private Boolean indPedagioMunicipal;
	@Column(name = "INDTARIFAESTADUAL")
	private Boolean indTarifaEstadual;
	@Column(name = "INDSEGUROESTADUAL")
	private Boolean indSeguroEstadual;
	@Column(name = "INDTXEMBARQUEESTADUAL")
	private Boolean indTxEmbarqueEstadual;
	@Column(name = "INDPEDAGIOESTDUAL")
	private Boolean indPedadioEstdual;

	@Column(name = "PORCREDBASEICMS")
	private BigDecimal porCredBaseIcms;
	@Column(name = "PORCREDBASEICMSIM")
	private BigDecimal porcRedBaseIcmsIM;

	@Column(name = "INDJANEIRO")
	private Boolean indJaneiro;
	@Column(name = "INDFEVEREIRO")
	private Boolean indFevereiro;
	@Column(name = "INDMARCO")
	private Boolean indMarco;
	@Column(name = "INDABRIL")
	private Boolean indAbril;
	@Column(name = "INDMAIO")
	private Boolean indMaio;
	@Column(name = "INDJUNHO")
	private Boolean indJunho;
	@Column(name = "INDJULHO")
	private Boolean indJulho;
	@Column(name = "INDAGOSTO")
	private Boolean indAgosto;
	@Column(name = "INDSETEMBRO")
	private Boolean indSetembro;
	@Column(name = "INDOUTUBRO")
	private Boolean indOutubro;
	@Column(name = "INDNOVEMBRO")
	private Boolean indNovembro;
	@Column(name = "INDDEZEMBRO")
	private Boolean indDezembro;

	@Column(name = "INDOUTROSISENTO")
	private Boolean indOutrosIsento;

	@Column(name = "INDOUTRASUFBLOQUEADAS")
	private Boolean indOutrasUFBloqueadas;

	@Column(name = "ACTIVO")
	private Boolean activo;
	@Basic(optional = false)
	@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 = "ESTADO_ID", referencedColumnName = "ESTADO_ID")
	@ManyToOne
	private Estado estado;

	@Column(name = "INDICEICMSECF")
	private Integer indiceICMSecf;

	@Column(name = "PORCTRIBUTO")
	private BigDecimal porctributo;

	@Column(name = "ICMSIM")
	private BigDecimal icmsIntermunicipal;

	@Column(name = "ICMSIMMATRICIAL")
	private BigDecimal icmsIntermunicipalMatricial;

	@Column(name = "ICMSMATRICIAL")
	private BigDecimal icmsMatricial;

	@Column(name = "INDICEICMSIMECF")
	private BigDecimal indiceICMSIntermunicipal;

	@Column(name = "INDVALIDAECF")
	private Boolean indValidaECF;

	@Column(name = "TRIBUTACAOIMPORTACAO")
	private BigDecimal tributacaoImportacao;
	
	@Column(name = "TRIBUTACAOIMPORTACAOIM")
	private BigDecimal tributacaoImportacaoIM;

	@Column(name = "CODESTABELECIMENTO")
	private String codEstabelecimento;

	@Column(name = "CODIGOCONTABILMUNICIPAL")
	private String codigoContabilMunicipal;

	@Column(name = "CODIGOCONTABILESTADUAL")
	private String codigoContabilEstadual;

	@Column(name = "INDBPE")
	private Boolean isBPe;

	@Column(name = "INDREDBASEICMSBPE")
	private Boolean indRedutorBaseIcmsBPe;
	
	@Column(name = "INDALIQUOTABPEUFDESTINO")
	private Boolean indAliquotaBPeUfDestino;
	
	@Column(name = "INDTRIBVIAGEM")
	private Boolean indTribViagem;
	
	@Column(name = "PORCFECP")
	private BigDecimal porcFECP;
	
	@Transient
	private EmpresaImposto empresaImpostoClone;
	
	
	
	@OneToMany(mappedBy = "empresaImposto", cascade = CascadeType.ALL, orphanRemoval=true)
	@NaoAuditar
	private List<AliquotaEstadoDestino> lsAliquotaEstadoDestino;
	
	

	public EmpresaImposto() {
		super();
		this.indTarifaMunicipal = false;
		this.indSeguroMunicipal = false;
		this.indTxEmbarqueMunicipal = false;
		this.indPedagioMunicipal = false;
		this.indTarifaEstadual = false;
		this.indSeguroEstadual = false;
		this.indTxEmbarqueEstadual = false;
		this.indPedadioEstdual = false;
		this.indJaneiro = false;
		this.indFevereiro = false;
		this.indMarco = false;
		this.indAbril = false;
		this.indMaio = false;
		this.indJunho = false;
		this.indJulho = false;
		this.indAgosto = false;
		this.indSetembro = false;
		this.indOutubro = false;
		this.indNovembro = false;
		this.indDezembro = false;
		this.indOutrosIsento = false;
		this.indOutrasUFBloqueadas = false;
		this.isBPe = false;
		this.indRedutorBaseIcmsBPe = false;
		this.indAliquotaBPeUfDestino = false;
		this.indTribViagem = false;
		this.lsAliquotaEstadoDestino = new ArrayList<AliquotaEstadoDestino>();
	}

	/**
	 * @return the empresaImpostoId
	 */
	public Integer getEmpresaImpostoId() {
		return empresaImpostoId;
	}

	/**
	 * @param empresaImpostoId
	 *            the empresaImpostoId to set
	 */
	public void setEmpresaImpostoId(Integer empresaImpostoId) {
		this.empresaImpostoId = empresaImpostoId;
	}

	/**
	 * @return the icms
	 */
	public BigDecimal getIcms() {
		return icms;
	}

	/**
	 * @param icms
	 *            the icms to set
	 */
	public void setIcms(BigDecimal icms) {
		this.icms = icms;
	}

	/**
	 * @return the indTarifaMunicipal
	 */
	public Boolean getIndTarifaMunicipal() {
		return indTarifaMunicipal;
	}

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

	/**
	 * @return the indSeguroMunicipal
	 */
	public Boolean getIndSeguroMunicipal() {
		return indSeguroMunicipal;
	}

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

	/**
	 * @return the indTxEmbarqueMunicipal
	 */
	public Boolean getIndTxEmbarqueMunicipal() {
		return indTxEmbarqueMunicipal;
	}

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

	/**
	 * @return the indPedagioMunicipal
	 */
	public Boolean getIndPedagioMunicipal() {
		return indPedagioMunicipal;
	}

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

	/**
	 * @return the indTarifaEstadual
	 */
	public Boolean getIndTarifaEstadual() {
		return indTarifaEstadual;
	}

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

	/**
	 * @return the indSeguroEstadual
	 */
	public Boolean getIndSeguroEstadual() {
		return indSeguroEstadual;
	}

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

	/**
	 * @return the indTxEmbarqueEstadual
	 */
	public Boolean getIndTxEmbarqueEstadual() {
		return indTxEmbarqueEstadual;
	}

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

	/**
	 * @return the indPedadioEstdual
	 */
	public Boolean getIndPedadioEstdual() {
		return indPedadioEstdual;
	}

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


	/**
	 * @return the porCredBaseIcms
	 */
	public BigDecimal getPorCredBaseIcms() {
		return porCredBaseIcms;
	}

	/**
	 * @param porCredBaseIcms
	 *            the porCredBaseIcms to set
	 */
	public void setPorCredBaseIcms(BigDecimal porCredBaseIcms) {
		this.porCredBaseIcms = porCredBaseIcms;
	}

	/**
	 * @return the indJaneiro
	 */
	public Boolean getIndJaneiro() {
		return indJaneiro;
	}

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

	/**
	 * @return the indFevereiro
	 */
	public Boolean getIndFevereiro() {
		return indFevereiro;
	}

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

	/**
	 * @return the indMarco
	 */
	public Boolean getIndMarco() {
		return indMarco;
	}

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

	/**
	 * @return the indAbril
	 */
	public Boolean getIndAbril() {
		return indAbril;
	}

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

	/**
	 * @return the indMaio
	 */
	public Boolean getIndMaio() {
		return indMaio;
	}

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

	/**
	 * @return the indJunho
	 */
	public Boolean getIndJunho() {
		return indJunho;
	}

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

	/**
	 * @return the indJulho
	 */
	public Boolean getIndJulho() {
		return indJulho;
	}

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

	/**
	 * @return the indAgosto
	 */
	public Boolean getIndAgosto() {
		return indAgosto;
	}

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

	/**
	 * @return the indSetembro
	 */
	public Boolean getIndSetembro() {
		return indSetembro;
	}

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

	/**
	 * @return the indOutubro
	 */
	public Boolean getIndOutubro() {
		return indOutubro;
	}

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

	/**
	 * @return the indNovembro
	 */
	public Boolean getIndNovembro() {
		return indNovembro;
	}

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

	/**
	 * @return the indDezembro
	 */
	public Boolean getIndDezembro() {
		return indDezembro;
	}

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

	/**
	 * @return the indOutrosIsento
	 */
	public Boolean getIndOutrosIsento() {
		return indOutrosIsento;
	}

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

	/**
	 * @return the activo
	 */
	public Boolean getActivo() {
		return activo;
	}

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

	/**
	 * @return the fecmodif
	 */
	public Date getFecmodif() {
		return fecmodif;
	}

	/**
	 * @param fecmodif
	 *            the fecmodif to set
	 */
	public void setFecmodif(Date fecmodif) {
		this.fecmodif = fecmodif;
	}

	/**
	 * @return the usuarioId
	 */
	public Integer getUsuarioId() {
		return usuarioId;
	}

	/**
	 * @param usuarioId
	 *            the usuarioId to set
	 */
	public void setUsuarioId(Integer usuarioId) {
		this.usuarioId = usuarioId;
	}

	/**
	 * @return the empresa
	 */
	public Empresa getEmpresa() {
		return empresa;
	}

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

	public Estado getEstado() {
		return estado;
	}

	public void setEstado(Estado estado) {
		this.estado = estado;
	}

	public Integer getIndiceICMSecf() {
		return indiceICMSecf;
	}

	public void setIndiceICMSecf(Integer indiceICMSecf) {
		this.indiceICMSecf = indiceICMSecf;
	}

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

	@Override
	public boolean equals(Object object) {
		if (!(object instanceof EmpresaImposto)) {
			return false;
		}
		EmpresaImposto other = (EmpresaImposto) object;
		if ((this.empresaImpostoId == null && other.empresaImpostoId != null) || (this.empresaImpostoId != null && !this.empresaImpostoId.equals(other.empresaImpostoId))) {
			return false;
		}
		return true;
	}

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

	public BigDecimal getPorctributo() {
		return porctributo;
	}

	public void setPorctributo(BigDecimal porctributo) {
		this.porctributo = porctributo;
	}

	/**
	 * @return the indOutrasUFBloqueadas
	 */
	public Boolean getIndOutrasUFBloqueadas() {
		return indOutrasUFBloqueadas;
	}

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

	public BigDecimal getIcmsIntermunicipal() {
		return icmsIntermunicipal;
	}

	public void setIcmsIntermunicipal(BigDecimal icmsIntermunicipal) {
		this.icmsIntermunicipal = icmsIntermunicipal;
	}

	public BigDecimal getIndiceICMSIntermunicipal() {
		return indiceICMSIntermunicipal;
	}

	public void setIndiceICMSIntermunicipal(BigDecimal indiceICMSIntermunicipal) {
		this.indiceICMSIntermunicipal = indiceICMSIntermunicipal;
	}

	public Boolean getIndValidaECF() {
		return indValidaECF;
	}

	public void setIndValidaECF(Boolean indValidaECF) {
		this.indValidaECF = indValidaECF;
	}

	public BigDecimal getIcmsIntermunicipalMatricial() {
		return icmsIntermunicipalMatricial;
	}

	public void setIcmsIntermunicipalMatricial(BigDecimal icmsIntermunicipalMatricial) {
		this.icmsIntermunicipalMatricial = icmsIntermunicipalMatricial;
	}

	public BigDecimal getIcmsMatricial() {
		return icmsMatricial;
	}

	public void setIcmsMatricial(BigDecimal icmsMatricial) {
		this.icmsMatricial = icmsMatricial;
	}

	public BigDecimal getTributacaoImportacao() {
		return tributacaoImportacao;
	}

	public void setTributacaoImportacao(BigDecimal tributacaoImportacao) {
		this.tributacaoImportacao = tributacaoImportacao;
	}

	public String getCodEstabelecimento() {
		return codEstabelecimento;
	}

	public void setCodEstabelecimento(String codEstabelecimento) {
		this.codEstabelecimento = codEstabelecimento;
	}

	public String getCodigoContabilMunicipal() {
		return codigoContabilMunicipal;
	}

	public void setCodigoContabilMunicipal(String codigoContabilMunicipal) {
		this.codigoContabilMunicipal = codigoContabilMunicipal;
	}

	public String getCodigoContabilEstadual() {
		return codigoContabilEstadual;
	}

	public void setCodigoContabilEstadual(String codigoContabilEstadual) {
		this.codigoContabilEstadual = codigoContabilEstadual;
	}

	public Boolean getIsBPe() {
		return isBPe;
	}

	public void setIsBPe(Boolean isBPe) {
		this.isBPe = isBPe;
	}

	public BigDecimal getPorcRedBaseIcmsIM() {
		return porcRedBaseIcmsIM;
	}

	public void setPorcRedBaseIcmsIM(BigDecimal porcRedBaseIcmsIM) {
		this.porcRedBaseIcmsIM = porcRedBaseIcmsIM;
	}

	public Boolean getIndRedutorBaseIcmsBPe() {
		return indRedutorBaseIcmsBPe;
	}

	public void setIndRedutorBaseIcmsBPe(Boolean indRedutorBaseIcmsBPe) {
		this.indRedutorBaseIcmsBPe = indRedutorBaseIcmsBPe;
	}


	public Boolean getIndTribViagem() {
		return indTribViagem;
	}

	public void setIndTribViagem(Boolean indTribViagem) {
		this.indTribViagem = indTribViagem;
	}

	public BigDecimal getTributacaoImportacaoIM() {
		return tributacaoImportacaoIM;
	}

	public void setTributacaoImportacaoIM(BigDecimal tributacaoImportacaoIM) {
		this.tributacaoImportacaoIM = tributacaoImportacaoIM;
	}

	public BigDecimal getPorcFECP() {
		return porcFECP;
	}

	public void setPorcFECP(BigDecimal porcFECP) {
		this.porcFECP = porcFECP;
	}

	public Boolean getIndAliquotaBPeUfDestino() {
		return indAliquotaBPeUfDestino;
	}

	public void setIndAliquotaBPeUfDestino(Boolean indAliquotaBPeUfDestino) {
		this.indAliquotaBPeUfDestino = indAliquotaBPeUfDestino;
	}
	
	public List<AliquotaEstadoDestino> getLsAliquotaEstadoDestino() {
		return lsAliquotaEstadoDestino;
	}

	public void setLsAliquotaEstadoDestino(List<AliquotaEstadoDestino> lsAliquotaEstadoDestino) {
		this.lsAliquotaEstadoDestino = lsAliquotaEstadoDestino;
	}

	@Override
	public void clonar() throws CloneNotSupportedException {
		
		empresaImpostoClone = new EmpresaImposto();
		empresaImpostoClone = (EmpresaImposto) this.clone();
		
		
	}

	@Override
	public EmpresaImposto getCloneObject() throws CloneNotSupportedException {
		return empresaImpostoClone;
	}

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