/*
 * 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.Calendar;
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.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Type;

import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;

/**
 * 
 * @author Rafius
 */
@Entity
@Table(name = "TIPO_EVENTO_EXTRA")
@SequenceGenerator(name = "TIPO_EVENTO_EXTRA_SEQ", sequenceName = "TIPO_EVENTO_EXTRA_SEQ", allocationSize = 1)
public class TipoEventoExtra implements Serializable {

	public static short OPERACION_NORMAL = 1;
	public static short OPERACION_AJUSTE = 2;
	public static short OPERACION_CAMBIO_CHEQUE = 3;

	public static String TIPO_CREDITO = "1";
	public static String TIPO_DEBITO = "0";

	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "TIPO_EVENTO_EXTRA_SEQ")
	@Column(name = "TIPOEVENTOEXTRA_ID")
	private Integer tipoeventoextraId;
	// @Column(name = "DESCINGRESO")
	// private String descingreso;
	@Column(name = "INDTIPO")
	private String indtipo;
	@Column(name = "IMPMAX")
	private BigDecimal impmax;
	@Column(name = "INDVALIDACORTE")
	private Boolean indvalidacorte;
	@Column(name = "INDVALIDADOCUMENTO")
	private Boolean indvalidadocumento;
	@Column(name = "INDCONTRAPARTIDA")
	private Boolean indcontrapartida;
	@Column(name = "INDBOLETO")
	private Boolean indboleto;
	// @Column(name = "INDAJUSTE")
	// private Boolean indajuste;
	@Column(name = "INDORDENSERVICIO")
	private Boolean indordenservicio;
	@Column(name = "INDOPERACION")
	private Short indoperacion;
	@Column(name = "PORCIVA")
	private BigDecimal porciva;

	@Column(name = "PROVEEDOR")
	private String proveedor;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "ACTIVO")
	private Boolean activo;
	// @Column(name = "DESCINGRESO2")
	// private String descingreso2;
	@Column(name = "INDTIPO2")
	private String indtipo2;
	@Column(name = "DESCTIPOEVENTO")
	private String descTipoEvento;
	@Column(name = "NATUREZA")
	private String natureza;
	@Column(name = "CONTACONTABIL")
	private String contaContabil;
	@Column(name="INDQUANTVIASIMPRIMIR")
	private Integer indQuantViasImp;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoeventoextra")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<TipoEventoExtraEmpresa> empresas = new ArrayList<TipoEventoExtraEmpresa>();
	@Column(name = "INDCONFERENCIAFISICACOMISSAO")
	private Boolean indconferenciafisicacomissao;
	@Column(name = "INDENVIAEXCESSODEBAGAGEMSEFAZ")
	private Boolean indEnviaExcessoDeBagagemSefaz;
	@Column(name = "INDRECIBOEXCESSOBAGAGEMDET")
	private Boolean indReciboExcessoBagagemDet;

	@Type(type = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate", parameters = {
			@Parameter(name = "type", value = "com.rjconsultores.ventaboletos.constantes.CustomEnumTypeHibernate"),
			@Parameter(name = "class", value = "com.rjconsultores.ventaboletos.constantes.TipoEventoExtra"), 
			@Parameter(name = "sqlType", value = "12")/*Types.VARCHAR*/,
			@Parameter(name = "enumName", value = "true")})
	@Column(name = "CVETIPOEVENTO")
	private com.rjconsultores.ventaboletos.constantes.TipoEventoExtra cvetipoevento;

	@Column(name = "CVESISTEMA")
	private String cveSistema;

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoeventoextra")
	@LazyCollection(LazyCollectionOption.FALSE)
	private List<TipoEventoExtraPtoVta> pontosventa = new ArrayList<TipoEventoExtraPtoVta>();

	@Column(name = "INDVALIDAESTOQUE")
	private Boolean indValidarEstoque;
	
	@OneToOne
	@JoinColumn(name = "IMPRESIONLAYOUTCONFIG_ID")
	private ImpresionLayoutConfig impresionLayoutConfig;
	
	@OneToOne
	@JoinColumn(name = "IMPRESIONLAYOUTEMAILCONFIG_ID")
	private ImpresionLayoutConfig impresionLayoutEmailConfig;

	public TipoEventoExtraEmpresa addEmpresa(Empresa e) {
		TipoEventoExtraEmpresa t = new TipoEventoExtraEmpresa();
		t.setEmpresa(e);
		t.setTipoeventoextra(this);
		t.setActivo(Boolean.TRUE);
		t.setFecmodif(Calendar.getInstance().getTime());
		t.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		this.empresas.add(t);
		return t;
	}

	public void removeEmpresa(TipoEventoExtraEmpresa t) {
		this.empresas.remove(t);
	}

	public TipoEventoExtraPtoVta addPuntoVenta(PuntoVenta p) {
		TipoEventoExtraPtoVta t = new TipoEventoExtraPtoVta();
		t.setPuntoventa(p);
		t.setTipoeventoextra(this);
		t.setActivo(Boolean.TRUE);
		t.setFecmodif(Calendar.getInstance().getTime());
		t.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		this.pontosventa.add(t);
		return t;
	}

	public void removePuntoVenta(PuntoVenta p) {
		for (TipoEventoExtraPtoVta t : this.pontosventa) {
			if (t.getPuntoventa().equals(p)) {
				this.pontosventa.remove(t);
			}
		}
	}

	public void removePuntoVenta(TipoEventoExtraPtoVta t) {
		this.pontosventa.remove(t);
	}

	public String getDescTipoEvento() {
		return descTipoEvento;
	}

	public void setDescTipoEvento(String descTipoEvento) {
		this.descTipoEvento = descTipoEvento;
	}

	@JoinColumn(name = "FORMAPAGO_ID", referencedColumnName = "FORMAPAGO_ID")
	@ManyToOne
	private FormaPago formaPago;
	@JoinColumn(name = "FORMAPAGO2_ID", referencedColumnName = "FORMAPAGO_ID")
	@ManyToOne
	private FormaPago formaPago2;

	@JoinColumn(name = "PARAMARTICULO_ID", referencedColumnName = "PARAMARTICULO_ID")
	@ManyToOne
	private ParamArticulo paramArticulo;

	@JoinColumn(name = "PARAMARTICULO2_ID", referencedColumnName = "PARAMARTICULO_ID")
	@ManyToOne
	private ParamArticulo paramArticulo2;

	public TipoEventoExtra() {
	}

	public TipoEventoExtra(Integer tipoeventoextraId) {
		this.tipoeventoextraId = tipoeventoextraId;
	}

	public Integer getTipoeventoextraId() {
		return tipoeventoextraId;
	}

	public void setTipoeventoextraId(Integer tipoeventoextraId) {
		this.tipoeventoextraId = tipoeventoextraId;
	}

	// public String getDescingreso() {
	// return descingreso;
	// }
	//
	// public void setDescingreso(String descingreso) {
	// this.descingreso = descingreso;
	// }

	public String getIndtipo() {
		return indtipo;
	}

	public void setIndtipo(String indtipo) {
		this.indtipo = indtipo;
	}

	public BigDecimal getImpmax() {
		return impmax;
	}

	public void setImpmax(BigDecimal impmax) {
		this.impmax = impmax;
	}

	public Boolean getIndvalidacorte() {
		return indvalidacorte;
	}

	public void setIndvalidacorte(Boolean indvalidacorte) {
		this.indvalidacorte = indvalidacorte;
	}

	public Boolean getIndvalidadocumento() {
		return indvalidadocumento;
	}

	public void setIndvalidadocumento(Boolean indvalidadocumento) {
		this.indvalidadocumento = indvalidadocumento;
	}

	public Boolean getIndcontrapartida() {
		return indcontrapartida;
	}

	public void setIndcontrapartida(Boolean indcontrapartida) {
		this.indcontrapartida = indcontrapartida;
	}

	public Boolean getIndboleto() {
		return indboleto;
	}

	public void setIndboleto(Boolean indboleto) {
		this.indboleto = indboleto;
	}

	public Boolean getIndordenservicio() {
		return indordenservicio;
	}

	public void setIndordenservicio(Boolean indordenservicio) {
		this.indordenservicio = indordenservicio;
	}

	public BigDecimal getPorciva() {
		return porciva;
	}

	public void setPorciva(BigDecimal porciva) {
		this.porciva = porciva;
	}

	public String getProveedor() {
		return proveedor;
	}

	public void setProveedor(String proveedor) {
		this.proveedor = proveedor;
	}

	public Integer getUsuarioId() {
		return usuarioId;
	}

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

	public Date getFecmodif() {
		return fecmodif;
	}

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

	public Boolean getActivo() {
		return activo;
	}

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

	public String getIndtipo2() {
		return indtipo2;
	}

	public void setIndtipo2(String indtipo2) {
		this.indtipo2 = indtipo2;
	}

	public FormaPago getFormaPago() {
		return formaPago;
	}

	public void setFormaPago(FormaPago formaPago) {
		this.formaPago = formaPago;
	}

	public FormaPago getFormaPago2() {
		return formaPago2;
	}

	public void setFormaPago2(FormaPago formaPago2) {
		this.formaPago2 = formaPago2;
	}

	public ParamArticulo getParamArticulo() {
		return paramArticulo;
	}

	public void setParamArticulo(ParamArticulo paramArticulo) {
		this.paramArticulo = paramArticulo;
	}

	public ParamArticulo getParamArticulo2() {
		return paramArticulo2;
	}

	public void setParamArticulo2(ParamArticulo paramArticulo2) {
		this.paramArticulo2 = paramArticulo2;
	}

	public Short getIndoperacion() {
		return indoperacion;
	}

	public void setIndoperacion(Short indoperacion) {
		this.indoperacion = indoperacion;
	}
	
	public String getNatureza() {
		return natureza;
	}

	public void setNatureza(String natureza) {
		this.natureza = natureza;
	}

	public String getContaContabil() {
		return contaContabil;
	}

	public void setContaContabil(String contaContabil) {
		this.contaContabil = contaContabil;
	}

	public Boolean getIndconferenciafisicacomissao() {
		return indconferenciafisicacomissao;
	}

	public void setIndconferenciafisicacomissao(Boolean indconferenciafisicacomissao) {
		this.indconferenciafisicacomissao = indconferenciafisicacomissao;
	}

	public Boolean getIndReciboExcessoBagagemDet() {
		return indReciboExcessoBagagemDet!= null ? indReciboExcessoBagagemDet : Boolean.FALSE;
	}

	public void setIndReciboExcessoBagagemDet(Boolean indReciboExcessoBagagemDet) {
		this.indReciboExcessoBagagemDet = indReciboExcessoBagagemDet;
	}

	public List<TipoEventoExtraEmpresa> getEmpresas() {
		List<TipoEventoExtraEmpresa> lista = new ArrayList<TipoEventoExtraEmpresa>();
		for (TipoEventoExtraEmpresa t : empresas) {
			if (t.getActivo()) {
				lista.add(t);
			}
		}
		return lista;
	}

	public void setEmpresas(List<TipoEventoExtraEmpresa> empresas) {
		this.empresas = empresas;
	}

	public com.rjconsultores.ventaboletos.constantes.TipoEventoExtra getCvetipoevento() {
		return cvetipoevento;
	}

	public void setCvetipoevento(com.rjconsultores.ventaboletos.constantes.TipoEventoExtra cvetipoevento) {
		this.cvetipoevento = cvetipoevento;
	}

	/**
	 * @return the cveSistema
	 */
	public String getCveSistema() {
		return cveSistema;
	}

	/**
	 * @param cveSistema the cveSistema to set
	 */
	public void setCveSistema(String cveSistema) {
		this.cveSistema = cveSistema;
	}

	public List<TipoEventoExtraPtoVta> getPontosventa() {
		return pontosventa;
	}

	public void setPontosventa(List<TipoEventoExtraPtoVta> pontosventa) {
		this.pontosventa = pontosventa;
	}

	public Boolean getIndValidarEstoque() {
		return indValidarEstoque;
	}

	public void setIndValidarEstoque(Boolean indValidarEstoque) {
		this.indValidarEstoque = indValidarEstoque;
	}

	public Boolean getIndEnviaExcessoDeBagagemSefaz() {
		return indEnviaExcessoDeBagagemSefaz==null?false:indEnviaExcessoDeBagagemSefaz;
	}

	public void setIndEnviaExcessoDeBagagemSefaz(Boolean indEnviaExcessoDeBagagemSefaz) {
		this.indEnviaExcessoDeBagagemSefaz = indEnviaExcessoDeBagagemSefaz;
	}

	public ImpresionLayoutConfig getImpresionLayoutConfig() {
		return impresionLayoutConfig;
	}

	public void setImpresionLayoutConfig(ImpresionLayoutConfig impresionLayoutConfig) {
		this.impresionLayoutConfig = impresionLayoutConfig;
	}

	public Integer getIndQuantViasImp() {
		return indQuantViasImp;
	}

	public void setIndQuantViasImp(Integer indQuantViasImp) {
		this.indQuantViasImp = indQuantViasImp;
	}
	
	public ImpresionLayoutConfig getImpresionLayoutEmailConfig() {
		return impresionLayoutEmailConfig;
	}

	public void setImpresionLayoutEmailConfig(ImpresionLayoutConfig impresionLayoutEmailConfig) {
		this.impresionLayoutEmailConfig = impresionLayoutEmailConfig;
	}

	@Override
	public int hashCode() {
		int hash = 0;
		hash += (tipoeventoextraId != null ? tipoeventoextraId.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 TipoEventoExtra)) {
			return false;
		}
		TipoEventoExtra other = (TipoEventoExtra) object;
		if ((this.tipoeventoextraId == null && other.tipoeventoextraId != null)
				|| (this.tipoeventoextraId != null && !this.tipoeventoextraId
						.equals(other.tipoeventoextraId))) {
			return false;
		}
		return true;
	}

	@Override
	public String toString() {
		return descTipoEvento;
	}

}
