/*
 * 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.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
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.Where;

/**
 * 
 * @author RJ
 */
@Entity
@SequenceGenerator(name = "CLIENTE_SEQ", sequenceName = "CLIENTE_SEQ", allocationSize = 1)
@Table(name = "CLIENTE")

public class Cliente implements Serializable {
	@Column(name="ROWID", updatable=false, insertable=false)
	private String rowId;

	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "CLIENTE_SEQ")
	@Column(name = "CLIENTE_ID")
	private Integer clienteId;
	@Column(name = "NOMBCLIENTE")
	private String nombcliente;
	@Column(name = "APELLIDOPATERNO")
	private String apellidopaterno;
	@Column(name = "APELLIDOMATERNO")
	private String apellidomaterno;
	@Column(name = "FECNACIMIENTO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecnacimiento;
	@Column(name = "NUMRFC")
	private String numrfc;
	@Column(name = "NUMTELEFONO")
	private String numtelefono;
	@Column(name = "NUMTELEFONODOS")
	private String numtelefonodos;
	@Column(name = "NUMFAX")
	private String numfax;
	@Column(name = "NUMEXTENSION")
	private String numextension;
	@Column(name = "NUMEXTENSIONDOS")
	private String numextensiondos;
	@JoinColumn(name = "TIPOOCUPACION_ID")
	@OneToOne(cascade = CascadeType.ALL)
	private TipoOcupacion tipoocupacionId;
	@Column(name = "MEDIOINFORMATIVO_ID")
	private Integer medioinformativoId;
	@JoinColumn(name = "MOTIVOVIAJE_ID")
	@OneToOne(cascade = CascadeType.ALL)
	private MotivoViaje motivoviajeId;
	@Column(name = "INDSEXO")
	private String indsexo;
	@Column(name = "NUMCURP")
	private String numcurp;
	@Column(name = "CANTHIJOS")
	private Integer canthijos;
	@Column(name = "DESCCORREO")
	private String desccorreo;
	@Column(name = "EDAD")
	private Integer edad;
	@Column(name = "ESTADOCIVIL_ID")
	private Integer estadocivilId;
	@Column(name = "GRADOESTUDIO_ID")
	private Integer gradoestudioId;
	@Column(name = "EQUIVALENCIA_ID")
	private String equivalenciaId;
	@Column(name = "ACTIVO")
	private Boolean activo;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@Column(name = "DESCCONTRASENA")
	private String desccontrasena;
	@Column(name = "NUMLADA")
	private String numlada;
	@Column(name = "INDCAMBIOCONTRASENA")
	private Integer indcambiocontrasena;
	@OneToMany(cascade = CascadeType.ALL, mappedBy = "clienteId")
	private List<ClienteDireccion> lsClienteDireccion;
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "CLIENTE_ID", referencedColumnName = "CLIENTE_ID")
	@Where(clause = "activo=1")
	private List<ClienteFidelidad> listClienteFidelidad;
	@Column(name = "NUMIDENTIFICAUNO")
	private String numIdentificaUno;
	@Column(name = "NUMIDENTIFICADOS")
	private String numIdentificaDos;
	@Column(name = "INDBLOQUEO")
	private Boolean indBloqueo;
	@JoinColumn(name = "TIPOIDENTIFICAUNO_ID")
	@OneToOne
	private TipoIdentificacion tipoIdentificacionUno;
	@JoinColumn(name = "TIPOIDENTIFICADOS_ID")
	@OneToOne
	private TipoIdentificacion tipoIdentificacionDos;
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "CLIENTE_ID", referencedColumnName = "CLIENTE_ID")
	private List<ClienteDescuento> lsClienteDescuento;

	@ManyToMany
	@JoinTable(name = "CLIENTE_CURSO", joinColumns = { @JoinColumn(name = "CLIENTE_ID") }, inverseJoinColumns = { @JoinColumn(name = "CURSO_ID") })
	private List<Curso> cursoList;

	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "ESCOLA_ID", referencedColumnName = "ESCOLA_ID")
	private Escola escola;
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "EMPRESA_ID", referencedColumnName = "EMPRESA_ID")
	private Empresa empresaCadastro;
	
	@Column(name = "FECCADASTRO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecCadastro;
	
	@Column(name = "INDCLIENTEPCD")
	private Boolean indClientePcd;
	
	@Column(name = "FECBLOQUEIOPCD")
	@Temporal(TemporalType.DATE)
	private Date fecbloqueiopcd;
	
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "CLIENTE_ID", referencedColumnName = "CLIENTE_ID")
	@Where(clause = "activo=1")
	private List<ReservaEspecialCliente> listReservaEspecialCliente;
	
	public List<ReservaEspecialCliente> getListReservaEspecialCliente() {
		return listReservaEspecialCliente;
	}

	public void setListReservaEspecialCliente(List<ReservaEspecialCliente> listReservaEspecialCliente) {
		this.listReservaEspecialCliente = listReservaEspecialCliente;
	}

	public Cliente() {
	}

	public Cliente(Integer clienteId) {
		this.clienteId = clienteId;
	}

	public Integer getClienteId() {
		return clienteId;
	}

	public void setClienteId(Integer clienteId) {
		this.clienteId = clienteId;
	}

	public String getNombcliente() {
		return nombcliente;
	}

	public void setNombcliente(String nombcliente) {
		this.nombcliente = nombcliente;
	}

	public String getApellidopaterno() {
		return apellidopaterno;
	}

	public void setApellidopaterno(String apellidopaterno) {
		this.apellidopaterno = apellidopaterno;
	}

	public String getApellidomaterno() {
		return apellidomaterno;
	}

	public void setApellidomaterno(String apellidomaterno) {
		this.apellidomaterno = apellidomaterno;
	}

	public Date getFecnacimiento() {
		return fecnacimiento;
	}

	public void setFecnacimiento(Date fecnacimiento) {
		this.fecnacimiento = fecnacimiento;
	}

	public String getNumrfc() {
		return numrfc;
	}

	public void setNumrfc(String numrfc) {
		this.numrfc = numrfc;
	}

	public String getNumtelefono() {
		return numtelefono;
	}

	public void setNumtelefono(String numtelefono) {
		this.numtelefono = numtelefono;
	}

	public String getNumtelefonodos() {
		return numtelefonodos;
	}

	public void setNumtelefonodos(String numtelefonodos) {
		this.numtelefonodos = numtelefonodos;
	}

	public String getNumfax() {
		return numfax;
	}

	public void setNumfax(String numfax) {
		this.numfax = numfax;
	}

	public String getNumextension() {
		return numextension;
	}

	public void setNumextension(String numextension) {
		this.numextension = numextension;
	}

	public String getNumextensiondos() {
		return numextensiondos;
	}

	public void setNumextensiondos(String numextensiondos) {
		this.numextensiondos = numextensiondos;
	}

	public TipoOcupacion getTipoocupacionId() {
		return tipoocupacionId;
	}

	public void setTipoocupacionId(TipoOcupacion tipoocupacionId) {
		this.tipoocupacionId = tipoocupacionId;
	}

	public Integer getMedioinformativoId() {
		return medioinformativoId;
	}

	public void setMedioinformativoId(Integer medioinformativoId) {
		this.medioinformativoId = medioinformativoId;
	}

	public MotivoViaje getMotivoviajeId() {
		return motivoviajeId;
	}

	public void setMotivoviajeId(MotivoViaje motivoviajeId) {
		this.motivoviajeId = motivoviajeId;
	}

	public String getIndsexo() {
		return indsexo;
	}

	public void setIndsexo(String indsexo) {
		this.indsexo = indsexo;
	}

	public String getNumcurp() {
		return numcurp;
	}

	public void setNumcurp(String numcurp) {
		this.numcurp = numcurp;
	}

	public Integer getCanthijos() {
		return canthijos;
	}

	public void setCanthijos(Integer canthijos) {
		this.canthijos = canthijos;
	}

	public String getDesccorreo() {
		return desccorreo;
	}

	public void setDesccorreo(String desccorreo) {
		this.desccorreo = desccorreo;
	}

	public Integer getEdad() {
		return edad;
	}

	public void setEdad(Integer edad) {
		this.edad = edad;
	}

	public Integer getEstadocivilId() {
		return estadocivilId;
	}

	public void setEstadocivilId(Integer estadocivilId) {
		this.estadocivilId = estadocivilId;
	}

	public Integer getGradoestudioId() {
		return gradoestudioId;
	}

	public void setGradoestudioId(Integer gradoestudioId) {
		this.gradoestudioId = gradoestudioId;
	}

	public String getEquivalenciaId() {
		return equivalenciaId;
	}

	public void setEquivalenciaId(String equivalenciaId) {
		this.equivalenciaId = equivalenciaId;
	}

	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 String getDesccontrasena() {
		return desccontrasena;
	}

	public void setDesccontrasena(String desccontrasena) {
		this.desccontrasena = desccontrasena;
	}

	public String getNumlada() {
		return numlada;
	}

	public void setNumlada(String numlada) {
		this.numlada = numlada;
	}

	public Integer getIndcambiocontrasena() {
		return indcambiocontrasena;
	}

	public void setIndcambiocontrasena(Integer indcambiocontrasena) {
		this.indcambiocontrasena = indcambiocontrasena;
	}

	public List<ClienteDireccion> getLsClienteDireccion() {
		return lsClienteDireccion;
	}

	public void setLsClienteDireccion(List<ClienteDireccion> lsClienteDireccion) {
		this.lsClienteDireccion = lsClienteDireccion;
	}

	public List<ClienteFidelidad> getListClienteFidelidad() {
		return listClienteFidelidad;
	}

	public void setListClienteFidelidad(List<ClienteFidelidad> listClienteFidelidad) {
		this.listClienteFidelidad = listClienteFidelidad;
	}

	public String getNumIdentificaUno() {
		return numIdentificaUno;
	}

	public void setNumIdentificaUno(String numIdentificaUno) {
		this.numIdentificaUno = numIdentificaUno;
	}

	public String getNumIdentificaDos() {
		return numIdentificaDos;
	}

	public void setNumIdentificaDos(String numIdentificaDos) {
		this.numIdentificaDos = numIdentificaDos;
	}

	public Boolean getIndBloqueo() {
		return indBloqueo;
	}

	public void setIndBloqueo(Boolean indBloqueo) {
		this.indBloqueo = indBloqueo;
	}

	public TipoIdentificacion getTipoIdentificacionUno() {
		return tipoIdentificacionUno;
	}

	public void setTipoIdentificacionUno(TipoIdentificacion tipoIdentificacionUno) {
		this.tipoIdentificacionUno = tipoIdentificacionUno;
	}

	public TipoIdentificacion getTipoIdentificacionDos() {
		return tipoIdentificacionDos;
	}

	public void setTipoIdentificacionDos(TipoIdentificacion tipoIdentificacionDos) {
		this.tipoIdentificacionDos = tipoIdentificacionDos;
	}

	public List<ClienteDescuento> getLsClienteDescuento() {
		return lsClienteDescuento;
	}

	public void setLsClienteDescuento(List<ClienteDescuento> lsClienteDescuento) {
		this.lsClienteDescuento = lsClienteDescuento;
	}

	public List<Curso> getCursoList() {

		List<Curso> aux = new ArrayList<Curso>();
		if (cursoList == null) {
			return aux;
		}

		for (Curso curso : cursoList) {
			if (curso.getActivo()) {
				aux.add(curso);
			}
		}

		return aux;
	}

	public void setCursoList(List<Curso> cursoList) {
		this.cursoList = cursoList;
	}

	public Escola getEscola() {
		return escola;
	}

	public void setEscola(Escola escola) {
		this.escola = escola;
	}
	
	public Empresa getEmpresaCadastro() {
		return empresaCadastro;
	}

	public void setEmpresaCadastro(Empresa empresaCadastro) {
		this.empresaCadastro = empresaCadastro;
	}

	public Date getFecCadastro() {
		return fecCadastro;
	}

	public void setFecCadastro(Date fecCadastro) {
		this.fecCadastro = fecCadastro;
	}

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

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

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

	//Removida a annotação Trasient pois getListClienteFidelidad() é um persistionbag 
	public List<ClienteFidelidad> getListClienteFidelidadActivos() {
		List<ClienteFidelidad> lsActivos = new ArrayList<ClienteFidelidad>();
		
		if (getListClienteFidelidad() != null)
			for (ClienteFidelidad clienteFidelidad : getListClienteFidelidad()) {
				if (clienteFidelidad.getActivo() && clienteFidelidad.getTarjetaFidelidad().getActivo()) {
					lsActivos.add(clienteFidelidad);
				}
			}
		
		return lsActivos;
	}

	public Boolean getIndClientePcd() {
		return indClientePcd;
	}

	public void setIndClientePcd(Boolean indClientePcd) {
		this.indClientePcd = indClientePcd;
	}

	public Date getFecbloqueiopcd() {
		return fecbloqueiopcd;
	}

	public void setFecbloqueiopcd(Date fecbloqueiopcd) {
		this.fecbloqueiopcd = fecbloqueiopcd;
	}

	public String getRowId() {
		return rowId;
	}

	public void setRowId(String rowId) {
		this.rowId = rowId;
	}
	
	

}
