package com.rjconsultores.ventaboletos.web.gui.controladores.sendaAmigo;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Longbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Cliente;
import com.rjconsultores.ventaboletos.entidad.ClienteCurso;
import com.rjconsultores.ventaboletos.entidad.ClienteDescuento;
import com.rjconsultores.ventaboletos.entidad.ClienteDireccion;
import com.rjconsultores.ventaboletos.entidad.ClienteFidelidad;
import com.rjconsultores.ventaboletos.entidad.Curso;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Escola;
import com.rjconsultores.ventaboletos.entidad.MotivoViaje;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TarjetaFidelidad;
import com.rjconsultores.ventaboletos.entidad.TipoDomicilio;
import com.rjconsultores.ventaboletos.entidad.TipoOcupacion;
import com.rjconsultores.ventaboletos.service.ClienteCursoService;
import com.rjconsultores.ventaboletos.service.ClienteDescuentoService;
import com.rjconsultores.ventaboletos.service.ClienteService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EscolaService;
import com.rjconsultores.ventaboletos.service.MotivoViajeService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarjetaFidelidadService;
import com.rjconsultores.ventaboletos.service.TipoDomicilioService;
import com.rjconsultores.ventaboletos.service.TipoOcupacionService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClienteDescuento;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderClienteFidelidade;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCurso;

@Controller("editarClienteController")
@Scope("prototype")
public class EditarClienteController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(EditarClienteController.class);
	private static final Short TIPO_OCUPACION_ESTUDANTE = Short.valueOf("22");

	private ClienteService clienteService;
	private MotivoViajeService motivoViajeService;
	private TipoOcupacionService tipoOcupacionService;
	private TipoDomicilioService tipoDomicilioService;
	@Autowired
	private EscolaService escolaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private ClienteDescuentoService clienteDescuentoService;
	@Autowired
	private ClienteCursoService clienteCursoService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private TarjetaFidelidadService tarjetaFidelidadService;

	private Cliente cliente;
	private MyListbox clienteList;
	private MyTextbox txtNombCliente;
	private MyTextbox txtApellidoPaterno;
	private MyTextbox txtApellidoMaterno;
	private MyTextbox txtNumRfc;
	private MyTextbox txtDescorreo;
	private MyTextbox txtNumCurp;
	private MyTextbox numtelefonouno;
	private MyTextbox numtelefonodos;
	private MyTextbox txtNumFax;
	private MyTextbox txtDireccionCalle;
	private MyTextbox txtDireccionNumero;
	private MyTextbox txtDireccionCompl;
	private MyTextbox txtDescCiudad;
	private MyTextbox txtDescColonia;
	private MyTextbox txtDescEstado;
	private MyTextbox txtCP;

	private Datebox dateFecNacimiento;
	private Intbox txtCanthijos;
	private Longbox txtNumFidelidade;
	private Intbox txtEdad;
	private Button btnApagar;
	private Button btnSalvar;
	private Button btnRemoverFidelidade;
	private Button btnAdicionarFidelidade;
	private Radio radFeminino;
	private Radio radMasculino;
	private Combobox cmbDomicilio;
	private Combobox cmbOcupacion;
	private Combobox cmbMotivacionViaje;
	private Combobox cmbEscola;
	private Combobox cmbEmpresa;

	private List<MotivoViaje> lsMotivoViaje;
	private List<TipoOcupacion> lsTipoOcupacion;
	private List<ClienteDireccion> lsClienteDireccion;
	private List<TipoDomicilio> lsTipoDomicilio;
	private List<Escola> lsEscola;
	private List<Ruta> lsLinhas;
	private List<Empresa> lsEmpresas;

	private Radiogroup indFormaValidacao;
	private Radio radFechaCompra;
	private Radio radFechaViaje;
	
	private Checkbox chkBloqueo;
	private MyComboboxEstandar cmbLinha;
	private Ruta linha;
	private Empresa empresa;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;
	private Parada origem;
	private MyComboboxParada cmbParadaDestino;
	private MyComboboxParadaCve cmbParadaDestinoCve;
	private Parada destino;
	private Checkbox chkINDLUNES;
	private Boolean boolINDLUNES;
	private Checkbox chkINDMARTES;
	private Boolean boolINDMARTES;
	private Checkbox chkINDMIERCOLES;
	private Boolean boolINDMIERCOLES;
	private Checkbox chkINDJUEVES;
	private Boolean boolINDJUEVES;
	private Checkbox chkINDVIERNES;
	private Boolean boolINDVIERNES;
	private Checkbox chkINDSABADO;
	private Boolean boolINDSABADO;
	private Checkbox chkINDDOMINGO;
	private Boolean boolINDDOMINGO;
	private Intbox cantMaxMes;
	private Datebox datInicial;
	private Datebox datFinal;
	private Integer cantMaxMesInt;
	private Boolean estudanteComDesconto;
	private Checkbox chkEstudanteComDesconto;

	private MyListbox clienteDescuentoMyListBox;
	private List<ClienteDescuento> lsClienteDescuento;
		
	private MyListbox cursoList;
	private Tab tabCurso;
	private List<ClienteFidelidad> lsClienteFidelidad;
	private MyListbox clienteFidelidadeMyListBox;
	
	public void aplicarMascara() {
		Clients.evalJavaScript("jQuery('#" + txtNumFax.getUuid()
				+ "').mask('(999)9999-9999?9');jQuery('#" + numtelefonodos.getUuid()
				+ "').mask('(999)9999-9999?9');jQuery('#" + numtelefonouno.getUuid()
				+ "').mask('(999)9999-9999?9')");
	}

	private void desabilitarComponentes(Boolean desabilitar) {
		txtNombCliente.setDisabled(desabilitar);
		txtApellidoPaterno.setDisabled(desabilitar);
		txtApellidoMaterno.setDisabled(desabilitar);
		txtNumRfc.setDisabled(desabilitar);
		txtDescorreo.setDisabled(desabilitar);
		txtNumCurp.setDisabled(desabilitar);
		numtelefonouno.setDisabled(desabilitar);
		numtelefonodos.setDisabled(desabilitar);
		txtNumFax.setDisabled(desabilitar);
		txtDireccionCalle.setDisabled(desabilitar);
		txtDireccionNumero.setDisabled(desabilitar);
		txtDireccionCompl.setDisabled(desabilitar);
		txtDescCiudad.setDisabled(desabilitar);
		txtDescColonia.setDisabled(desabilitar);
		txtDescEstado.setDisabled(desabilitar);
		txtCP.setDisabled(desabilitar);
		dateFecNacimiento.setDisabled(desabilitar);
		txtCanthijos.setDisabled(desabilitar);
		txtEdad.setDisabled(desabilitar);
		btnApagar.setDisabled(desabilitar);
		btnSalvar.setDisabled(desabilitar);
		radFeminino.setDisabled(desabilitar);
		radMasculino.setDisabled(desabilitar);
		cmbDomicilio.setDisabled(desabilitar);
		cmbOcupacion.setDisabled(desabilitar);
		cmbMotivacionViaje.setDisabled(desabilitar);
		cmbEscola.setDisabled(desabilitar);
		cmbEmpresa.setDisabled(desabilitar);
		txtNumFidelidade.setDisabled(desabilitar);
		btnRemoverFidelidade.setDisabled(desabilitar);
		btnAdicionarFidelidade.setDisabled(desabilitar);		
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsLinhas = rutaService.obtenerTodos();
		lsEmpresas = empresaService.obtenerTodos();	

		cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});

		cmbParadaDestinoCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});

		aplicarMascara();
		lsTipoOcupacion = tipoOcupacionService.obtenerTodos();
		lsMotivoViaje = motivoViajeService.obtenerTodos();
		lsTipoDomicilio = tipoDomicilioService.obtenerTodos();
		lsEscola = escolaService.obtenerTodos();

		estudanteComDesconto = false;
		try {
			cliente = (Cliente) Executions.getCurrent().getArg().get("cliente");
			clienteList = (MyListbox) Executions.getCurrent().getArg().get("clienteList");

			if (cliente.getClienteId() == null) {
				btnApagar.setVisible(Boolean.FALSE);
				tabCurso.setVisible(Boolean.FALSE);
				lsClienteFidelidad = new ArrayList<ClienteFidelidad>();
				
				clienteDescuentoMyListBox.setItemRenderer(new RenderClienteDescuento());
				clienteDescuentoMyListBox.addEventListener("onDoubleClick", new EventListener() {

					@Override
					public void onEvent(Event arg0) throws Exception {
						ClienteDescuento cd = (ClienteDescuento) clienteDescuentoMyListBox.getSelected();
						exibeClienteDescuento(cd);
						lsClienteDescuento.remove(cd);
						clienteDescuentoMyListBox.setData(lsClienteDescuento);
					}
				});
				
				clienteFidelidadeMyListBox.setItemRenderer(new RenderClienteFidelidade());
				clienteFidelidadeMyListBox.addEventListener("onDoubleClick", new EventListener() {
					@Override
					public void onEvent(Event arg0) throws Exception {
						ClienteFidelidad clienteFidelidad = (ClienteFidelidad) clienteFidelidadeMyListBox.getSelected();
						exibeClienteFidelidade(clienteFidelidad);
						lsClienteFidelidad.remove(clienteFidelidad);
						clienteFidelidadeMyListBox.setData(lsClienteFidelidad);
					}
				});	
				
			} else {
				cliente = clienteService.obtenerID(cliente.getClienteId());
				lsClienteFidelidad = cliente.getListClienteFidelidadActivos();

				if (cliente.getMotivoviajeId() != null) {
					cmbMotivacionViaje.setText(cliente.getMotivoviajeId().getDescMotivoViaje());
				}

				if (cliente.getTipoocupacionId() != null) {
					cmbOcupacion.setText(cliente.getTipoocupacionId().getDesctipo());
				}

				cursoList.setItemRenderer(new RenderCurso());
				if (!cliente.getCursoList().isEmpty()) {
					cursoList.setData(cliente.getCursoList());
				}

				if (cliente.getEscola() != null) {
					cmbEscola.setText(cliente.getEscola().getNombescola());
				}

				if (cliente.getIndsexo() != null) {
					if (cliente.getIndsexo().equals("F")) {
						radFeminino.setChecked(true);
					} else if (cliente.getIndsexo().equals("M")) {
						radMasculino.setChecked(true);
					}
				}

				if (null != cliente.getIndBloqueo() && cliente.getIndBloqueo()) {
					chkBloqueo.setChecked(Boolean.TRUE);
				} else {
					chkBloqueo.setChecked(Boolean.FALSE);
				}

				if ((cliente.getLsClienteDireccion() != null) && (!cliente.getLsClienteDireccion().isEmpty())) {
					if (cliente.getLsClienteDireccion().get(0) != null) {
						ClienteDireccion direccion = cliente.getLsClienteDireccion().get(0);
						if (direccion.getTipodomicilioId() != null) {
							cmbDomicilio.setText(direccion.getTipodomicilioId().getDesctipo());
						}
						if (direccion.getDesccalle() != null) {
							txtDireccionCalle.setText(direccion.getDesccalle());
						}
						if (direccion.getNumexterior() != null) {
							txtDireccionNumero.setText(direccion.getNumexterior());
						}
						if (direccion.getDesccallecomp() != null) {
							txtDireccionCompl.setText(direccion.getDesccallecomp());
						}
						if (direccion.getDesccolonia() != null) {
							txtDescColonia.setText(direccion.getDesccolonia());
						}
						if (direccion.getDesciudad() != null) {
							txtDescCiudad.setText(direccion.getDesciudad());
						}
						if (direccion.getDesestado() != null) {
							txtDescEstado.setText(direccion.getDesestado());
						}

						if (direccion.getCodpostal() != null) {
							txtCP.setText(direccion.getCodpostal());
						}
						if (direccion.getTipodomicilioId() != null) {
							cmbDomicilio.setText(direccion.getTipodomicilioId().getDesctipo());
						}
					}
				}
				clienteDescuentoMyListBox.setItemRenderer(new RenderClienteDescuento());
				clienteDescuentoMyListBox.addEventListener("onDoubleClick", new EventListener() {

					@Override
					public void onEvent(Event arg0) throws Exception {
						ClienteDescuento cd = (ClienteDescuento) clienteDescuentoMyListBox.getSelected();
						exibeClienteDescuento(cd);
						lsClienteDescuento.remove(cd);
						clienteDescuentoMyListBox.setData(lsClienteDescuento);

					}
				});

				clienteDescuentoMyListBox.setData(new ArrayList<ClienteDescuento>());

				if ((cliente.getLsClienteDescuento() != null) && (!cliente.getLsClienteDescuento().isEmpty())) {
					lsClienteDescuento = cliente.getLsClienteDescuento();
					clienteDescuentoMyListBox.setData(lsClienteDescuento);
					estudanteComDesconto = true;
					chkEstudanteComDesconto.setChecked(true);
				}
				
				clienteFidelidadeMyListBox.setItemRenderer(new RenderClienteFidelidade());
				if (ApplicationProperties.getInstance().podeEditarClienteFidelidade()){
					clienteFidelidadeMyListBox.addEventListener("onDoubleClick", new EventListener() {
						@Override
						public void onEvent(Event arg0) throws Exception {
							ClienteFidelidad clienteFidelidad = (ClienteFidelidad) clienteFidelidadeMyListBox.getSelected();
							exibeClienteFidelidade(clienteFidelidad);
							lsClienteFidelidad.remove(clienteFidelidad);
							clienteFidelidadeMyListBox.setData(lsClienteFidelidad);
						}
					});	
				}

				if ((cliente.getListClienteFidelidadActivos() != null) && (!cliente.getListClienteFidelidadActivos().isEmpty())) {
					lsClienteFidelidad = cliente.getListClienteFidelidadActivos();
					clienteFidelidadeMyListBox.setData(lsClienteFidelidad);
				}

				// if ((cliente.getLsClienteDescuento() != null) && (!cliente.getLsClienteDescuento().isEmpty())) {
				// if (null != cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1) &&
				// cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1).getActivo() == 1) {
				// estudanteComDesconto = true;
				// chkEstudanteComDesconto.setChecked(true);
				// ClienteDescuento cd = cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1);
				// cmbLinha.setText(cd.getRuta().getDescruta());
				// linha = cd.getRuta();
				// cmbParadaOrigem.setText(cd.getOrigem().getDescparada());
				// cmbParadaOrigem.setInitialValue(cd.getOrigem());
				// cmbParadaOrigemCve.setText(cd.getOrigem().getCveparada());
				// origem = cd.getOrigem();
				// cmbParadaDestino.setText(cd.getDestino().getDescparada());
				// cmbParadaDestino.setInitialValue(cd.getDestino());
				// cmbParadaDestinoCve.setText(cd.getDestino().getCveparada());
				// destino = cd.getDestino();
				// chkINDLUNES.setChecked(cd.getINDLUNES());
				// chkINDMARTES.setChecked(cd.getINDMARTES());
				// chkINDMIERCOLES.setChecked(cd.getINDMIERCOLES());
				// chkINDJUEVES.setChecked(cd.getINDJUEVES());
				// chkINDVIERNES.setChecked(cd.getINDVIERNES());
				// chkINDSABADO.setChecked(cd.getINDSABADO());
				// chkINDDOMINGO.setChecked(cd.getINDDOMINGO());
				// cantMaxMesInt = cd.getCantMaxMes();
				// datInicial.setValue(cd.getFecIni());
				// datFinal.setValue(cd.getFecFin());
				// boolINDLUNES = cd.getINDLUNES();
				// boolINDMARTES = cd.getINDMARTES();
				// boolINDMIERCOLES = cd.getINDMIERCOLES();
				// boolINDJUEVES = cd.getINDJUEVES();
				// boolINDVIERNES = cd.getINDVIERNES();
				// boolINDSABADO = cd.getINDSABADO();
				// boolINDDOMINGO = cd.getINDDOMINGO();
				//
				// }
				// }
			}

			if (cliente.getNumfax() != null) {
				txtNumFax.setValue(cliente.getNumfax());
			}

			if (cliente.getNumtelefono() != null) {
				numtelefonouno.setValue(cliente.getNumtelefono());
			}

			if (cliente.getNumtelefonodos() != null) {
				numtelefonodos.setValue(cliente.getNumtelefonodos());
			}

			if (cliente.getLsClienteDireccion() == null) {
				cliente.setLsClienteDireccion(new ArrayList<ClienteDireccion>());
			}

			lsClienteDireccion = cliente.getLsClienteDireccion();
			txtNombCliente.focus();
			txtDireccionCalle.focus();
			if(cliente.getListClienteFidelidadActivos() != null && cliente.getListClienteFidelidadActivos().size()>0){
				if (!ApplicationProperties.getInstance().podeEditarClienteFidelidade()) {
					desabilitarComponentes(Boolean.TRUE);
					Messagebox.show(Labels.getLabel("editarClienteController.msg.edicao.nao.permitida"),
							Labels.getLabel("editarClienteController.window.title"),
							Messagebox.OK, Messagebox.INFORMATION);
				}
			}			
			// onClick$chkEstudanteComDesconto(new Event("evento"));
			verificaCheckEstudanteComDescuento();
		} catch (Exception e) {
			log.error("Cliente: " + e,e);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void novoClienteCurso() {

		Map args = new HashMap();
		args.put("cliente", cliente);
		args.put("cursoList", cursoList);

		openWindow("gui/senda_amigo/editarClienteCurso.zul",
				Labels.getLabel("editarCursoController.window.title"), args, MODAL);
	}

	public void onClick$btnNovoCurso(Event ev) throws InterruptedException {
		novoClienteCurso();
	}

	public void onClick$btnApagarCurso(Event ev) throws InterruptedException {

		Curso curso = (Curso) cursoList.getSelected();

		if (curso != null) {
			int resp = Messagebox.show(
					Labels.getLabel("editarCursoController.MSG.borrarPergunta"),
					Labels.getLabel("editarCursoController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {

				ClienteCurso clienteCurso = clienteCursoService.buscarClienteCurso(cliente, curso);
				if (clienteCurso != null) {
					clienteCursoService.borrar(clienteCurso);
					cursoList.removeItem(curso);
					cursoList.clearSelection();
				}
			}
		} else {
			Messagebox.show(Labels.getLabel("editarPricingController.MSG.selectItem"), Labels.getLabel("editarPricingController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void setClienteDireccion() {
		ClienteDireccion direccion;
		if (lsClienteDireccion.isEmpty()) {
			direccion = new ClienteDireccion();
		} else {
			direccion = lsClienteDireccion.get(0);
			lsClienteDireccion.remove(0);
		}

		cmbDomicilio.getValue();
		direccion.setDesccalle(txtDireccionCalle.getValue());
		direccion.setNumexterior(txtDireccionNumero.getValue());
		direccion.setDesccallecomp(txtDireccionCompl.getValue());
		direccion.setDesccolonia(txtDescColonia.getValue());
		direccion.setDesciudad(txtDescCiudad.getValue());
		direccion.setDesestado(txtDescEstado.getValue());
		direccion.setCodpostal(txtCP.getValue());
		direccion.setClienteId(cliente);

		if (cmbDomicilio.getSelectedItem() != null) {
			direccion.setTipodomicilioId((TipoDomicilio) cmbDomicilio.getSelectedItem().getValue());
		}

		lsClienteDireccion.add(direccion);
	}

	public String replaceTextbox(Textbox textbox) {
		String getString = textbox.getValue();
		getString = getString.replace("(", "");
		getString = getString.replaceAll("_", "");
		getString = getString.replace(")", "");
		getString = getString.replace("-", "");

		return getString;
	}

	public void onClick$chkEstudanteComDesconto(Event ev) throws InterruptedException {

		if (chkEstudanteComDesconto.isChecked()) {
			cmbLinha.setConstraint("");
			cmbLinha.setDisabled(false);
			cmbParadaOrigem.setConstraint("");
			cmbParadaOrigem.setDisabled(false);
			cmbParadaOrigemCve.setConstraint("");
			cmbParadaOrigemCve.setDisabled(false);
			cmbParadaDestino.setConstraint("");
			cmbParadaDestino.setDisabled(false);
			cmbParadaDestinoCve.setConstraint("");
			cmbParadaDestinoCve.setDisabled(false);
			chkINDLUNES.setDisabled(false);
			chkINDMARTES.setDisabled(false);
			chkINDMIERCOLES.setDisabled(false);
			chkINDJUEVES.setDisabled(false);
			chkINDVIERNES.setDisabled(false);
			chkINDSABADO.setDisabled(false);
			chkINDDOMINGO.setDisabled(false);
			datInicial.setConstraint("");
			datInicial.setDisabled(false);
			datFinal.setConstraint("");
			datFinal.setDisabled(false);
			cantMaxMes.setConstraint("no zero, no negative");
			cantMaxMes.setDisabled(false);
			radFechaCompra.setDisabled(false);
			radFechaViaje.setDisabled(false);

		} else {
			cmbLinha.setConstraint("");
			cmbLinha.setValue("");
			cmbLinha.setDisabled(true);
			linha = null;
			cmbParadaOrigem.setConstraint("");
			cmbParadaOrigem.setValue("");
			cmbParadaOrigem.setDisabled(true);
			cmbParadaOrigemCve.setConstraint("");
			cmbParadaOrigemCve.setValue("");
			cmbParadaOrigemCve.setDisabled(true);
			cmbParadaDestino.setConstraint("");
			cmbParadaDestino.setValue("");
			cmbParadaDestino.setDisabled(true);
			cmbParadaDestinoCve.setConstraint("");
			cmbParadaDestinoCve.setValue("");
			cmbParadaDestinoCve.setDisabled(true);
			chkINDLUNES.setChecked(false);
			chkINDLUNES.setDisabled(true);
			boolINDLUNES = null;
			chkINDMARTES.setChecked(false);
			chkINDMARTES.setDisabled(true);
			boolINDMARTES = null;
			chkINDMIERCOLES.setChecked(false);
			chkINDMIERCOLES.setDisabled(true);
			boolINDMIERCOLES = null;
			chkINDJUEVES.setChecked(false);
			chkINDJUEVES.setDisabled(true);
			boolINDJUEVES = null;
			chkINDVIERNES.setChecked(false);
			chkINDVIERNES.setDisabled(true);
			boolINDVIERNES = null;
			chkINDSABADO.setChecked(false);
			chkINDSABADO.setDisabled(true);
			boolINDSABADO = null;
			chkINDDOMINGO.setChecked(false);
			chkINDDOMINGO.setDisabled(true);
			boolINDDOMINGO = null;
			datInicial.setConstraint("");
			datInicial.setValue(null);
			datInicial.setDisabled(true);
			datFinal.setConstraint("");
			datFinal.setValue(null);
			datFinal.setDisabled(true);
			cantMaxMes.setConstraint("");
			cantMaxMes.setValue(null);
			cantMaxMes.setDisabled(true);
			radFechaCompra.setDisabled(true);
			radFechaViaje.setDisabled(true);
			
			cantMaxMesInt = null;

			if (cliente.getLsClienteDescuento() != null && cliente.getLsClienteDescuento().size() > 0) {
				int resp = Messagebox.show(
						Labels.getLabel("editarClienteController.msg.confirmarRemoverLsDescuento"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (resp == Messagebox.YES) {
					cliente.setLsClienteDescuento(new ArrayList<ClienteDescuento>());
					lsClienteDescuento = cliente.getLsClienteDescuento();
					clienteDescuentoMyListBox.setData(lsClienteDescuento);

				}
			}

		}
	}

	private void verificaCheckEstudanteComDescuento() {
		if (chkEstudanteComDesconto.isChecked()) {
			cmbLinha.setConstraint("");
			cmbLinha.setDisabled(false);
			cmbParadaOrigem.setConstraint("");
			cmbParadaOrigem.setDisabled(false);
			cmbParadaOrigemCve.setConstraint("");
			cmbParadaOrigemCve.setDisabled(false);
			cmbParadaDestino.setConstraint("");
			cmbParadaDestino.setDisabled(false);
			cmbParadaDestinoCve.setConstraint("");
			cmbParadaDestinoCve.setDisabled(false);
			chkINDLUNES.setDisabled(false);
			chkINDMARTES.setDisabled(false);
			chkINDMIERCOLES.setDisabled(false);
			chkINDJUEVES.setDisabled(false);
			chkINDVIERNES.setDisabled(false);
			chkINDSABADO.setDisabled(false);
			chkINDDOMINGO.setDisabled(false);
			datInicial.setConstraint("");
			datInicial.setDisabled(false);
			datFinal.setConstraint("");
			datFinal.setDisabled(false);
			cantMaxMes.setConstraint("no zero, no negative");
			cantMaxMes.setDisabled(false);
			radFechaCompra.setDisabled(false);
			radFechaViaje.setDisabled(false);

		} else {
			cmbLinha.setConstraint("");
			cmbLinha.setValue("");
			cmbLinha.setDisabled(true);
			linha = null;
			cmbParadaOrigem.setConstraint("");
			cmbParadaOrigem.setValue("");
			cmbParadaOrigem.setDisabled(true);
			cmbParadaOrigemCve.setConstraint("");
			cmbParadaOrigemCve.setValue("");
			cmbParadaOrigemCve.setDisabled(true);
			cmbParadaDestino.setConstraint("");
			cmbParadaDestino.setValue("");
			cmbParadaDestino.setDisabled(true);
			cmbParadaDestinoCve.setConstraint("");
			cmbParadaDestinoCve.setValue("");
			cmbParadaDestinoCve.setDisabled(true);
			chkINDLUNES.setChecked(false);
			chkINDLUNES.setDisabled(true);
			boolINDLUNES = null;
			chkINDMARTES.setChecked(false);
			chkINDMARTES.setDisabled(true);
			boolINDMARTES = null;
			chkINDMIERCOLES.setChecked(false);
			chkINDMIERCOLES.setDisabled(true);
			boolINDMIERCOLES = null;
			chkINDJUEVES.setChecked(false);
			chkINDJUEVES.setDisabled(true);
			boolINDJUEVES = null;
			chkINDVIERNES.setChecked(false);
			chkINDVIERNES.setDisabled(true);
			boolINDVIERNES = null;
			chkINDSABADO.setChecked(false);
			chkINDSABADO.setDisabled(true);
			boolINDSABADO = null;
			chkINDDOMINGO.setChecked(false);
			chkINDDOMINGO.setDisabled(true);
			boolINDDOMINGO = null;
			datInicial.setConstraint("");
			datInicial.setValue(null);
			datInicial.setDisabled(true);
			datFinal.setConstraint("");
			datFinal.setValue(null);
			datFinal.setDisabled(true);
			cantMaxMes.setConstraint("");
			cantMaxMes.setValue(null);
			cantMaxMes.setDisabled(true);
			cantMaxMesInt = null;
			radFechaCompra.setDisabled(true);
			radFechaViaje.setDisabled(true);

			cliente.setLsClienteDescuento(new ArrayList<ClienteDescuento>());
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		txtNombCliente.getValue();
		txtApellidoPaterno.getValue();
		txtApellidoMaterno.getValue();
		txtNumRfc.getValue();
		txtEdad.getValue();
		txtCanthijos.getValue();
		txtDescorreo.getValue();
		txtNumCurp.getValue();
		txtNumFax.getValue();
		dateFecNacimiento.getValue();
		numtelefonouno.getValue();
		numtelefonodos.getValue();
		cmbMotivacionViaje.getValue();
		cmbOcupacion.getValue();

		if (cliente.getClienteId() == null) {
			List<Cliente> lsCliente = clienteService.buscarPorDocumento(txtNumCurp.getValue());
			if (!lsCliente.isEmpty()) {
				Messagebox.show(
						Labels.getLabel("editarClienteController.MSG.documentoexiste"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
		}

		setClienteDireccion();
		cliente.setLsClienteDescuento(lsClienteDescuento);
		try {
			if (cliente.getClienteId() == null) {
				if (cmbMotivacionViaje.getSelectedItem() != null) {
					cliente.setMotivoviajeId((MotivoViaje) cmbMotivacionViaje.getSelectedItem().getValue());
				}

				if (cmbOcupacion.getSelectedItem() != null) {
					cliente.setTipoocupacionId((TipoOcupacion) cmbOcupacion.getSelectedItem().getValue());
				}

				if (radFeminino.isChecked()) {
					cliente.setIndsexo("F");
				} else if (radMasculino.isChecked()) {
					cliente.setIndsexo("M");
				}

				cliente.setLsClienteDireccion(lsClienteDireccion);

				// if(estudantePreenchido()){
				// setarManagedDescuentoInCliente();
				// }

				clienteService.suscribir(cliente);
				clienteList.addItemNovo(cliente);
			} else {
				// setarManagedDescuentoInCliente();

				cliente = clienteService.actualizacion(cliente);
				clienteList.updateItem(cliente);
			}

			String getString = null;
			if (!txtNumFax.getValue().equals("")) {
				getString = this.replaceTextbox(txtNumFax);
				if (getString.length() >= 11) {
					cliente.setNumfax(txtNumFax.getValue().replace("_", ""));
				}
			}

			if (!numtelefonouno.getValue().equals("")) {
				getString = this.replaceTextbox(numtelefonouno);
				if (getString.length() >= 11) {
					cliente.setNumtelefono(numtelefonouno.getValue().replace("_", ""));
				}
			}

			if (!numtelefonodos.getValue().equals("")) {
				getString = this.replaceTextbox(numtelefonodos);
				if (getString.length() >= 11) {
					cliente.setNumtelefonodos(numtelefonodos.getValue().replace("_", ""));
				}
			}

			Messagebox.show(Labels.getLabel("editarClienteController.MSG.suscribirOK"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} catch (WrongValueException ex) {
			log.error("editarClienteController: " + ex);
			Messagebox.show(Labels.getLabel("MSG.Error.ClienteAbaEstudante"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		} catch (Exception ex) {
			log.error("editarClienteController: " + ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public MyComboboxEstandar getCmbLinha() {
		return cmbLinha;
	}

	public void setCmbLinha(MyComboboxEstandar cmbLinha) {
		this.cmbLinha = cmbLinha;
	}

	public List<Ruta> getLsLinhas() {
		return lsLinhas;
	}

	public void setLsLinhas(List<Ruta> lsLinhas) {
		this.lsLinhas = lsLinhas;
	}

	public void onSelect$cmbParadaOrigemCve(Event ev) {
		if (cmbParadaOrigemCve.getSelectedItem() != null) {
			cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaOrigem(Event ev) {
		if (cmbParadaOrigem.getSelectedItem() != null)
			cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue());
	}

	public void onSelect$cmbParadaDestinoCve(Event ev) {
		if (cmbParadaDestinoCve.getSelectedItem() != null) {
			cmbParadaDestino.setComboItemByParada((Parada) cmbParadaDestinoCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaDestino(Event ev) {
		if (cmbParadaDestino.getSelectedItem() != null) {
			cmbParadaDestinoCve.setComboItemByParada((Parada) cmbParadaDestino.getSelectedItem().getValue());
		}
	}

	public void onClick$btnApagar(Event ev) {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarClienteController.MSG.borrarPergunta"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				if (null != cliente.getLsClienteDescuento() && 0 != cliente.getLsClienteDescuento().size() - 1 && null != cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1)) {
					cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1).setActivo(0);
				}
				clienteService.borrar(cliente);

				Messagebox.show(
						Labels.getLabel("editarClienteController.MSG.borrarOK"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				clienteList.removeItem(cliente);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
		}
	}

	public Intbox getCantMaxMes() {
		return cantMaxMes;
	}

	public void setCantMaxMes(Intbox cantMaxMes) {
		this.cantMaxMes = cantMaxMes;
	}

	private void setarManagedDescuentoInCliente() throws InterruptedException {
		// caso chkEstudanteComDesconto não esteja checkado e o cliente ja tenha tido algum desconto no passado,
		// entende-se que o cliente nao esteja estudando ou nao tenha mais direito à nenhum desconto
		if (!chkEstudanteComDesconto.isChecked() && cliente.getLsClienteDescuento() != null && cliente.getLsClienteDescuento().size() > 0) {
			cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1).setActivo(0);
		}
		// Caso todos os dias da semana forem false, significa que, não foi determinado nenhum dia da semana para ter desconto,
		// assim nunca será possível aplicar o desconto
		if (chkEstudanteComDesconto.isChecked() && !chkINDDOMINGO.isChecked() && !chkINDLUNES.isChecked() &&
				!chkINDMARTES.isChecked() && !chkINDMIERCOLES.isChecked() &&
				!chkINDJUEVES.isChecked() && !chkINDVIERNES.isChecked() && !chkINDSABADO.isChecked()) {
			throw new WrongValueException();
		} else if (chkEstudanteComDesconto.isChecked()) {
			try {
				ClienteDescuento cd = new ClienteDescuento();
				cd.setRuta((Ruta) cmbLinha.getSelectedItem().getValue());
				cd.setOrigem((Parada) cmbParadaOrigem.getSelectedItem().getValue());
				cd.setDestino((Parada) cmbParadaDestino.getSelectedItem().getValue());
				cd.setINDDOMINGO(chkINDDOMINGO.isChecked());
				cd.setINDLUNES(chkINDLUNES.isChecked());
				cd.setINDMARTES(chkINDMARTES.isChecked());
				cd.setINDMIERCOLES(chkINDMIERCOLES.isChecked());
				cd.setINDJUEVES(chkINDJUEVES.isChecked());
				cd.setINDVIERNES(chkINDVIERNES.isChecked());
				cd.setINDSABADO(chkINDSABADO.isChecked());
				cd.setCantMaxMes(cantMaxMes.getValue());
				cd.setFecIni(datInicial.getValue());
				cd.setFecFin(datFinal.getValue());
				if(radFechaCompra.isChecked()){
					cd.setIndFormaValidacionEstudiante("C");
					}else if(radFechaViaje.isChecked()){
						cd.setIndFormaValidacionEstudiante("V");
					}
				

				cd.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				cd.setFecmodif(Calendar.getInstance().getTime());
				cd.setActivo(1);

				if (null == cliente.getLsClienteDescuento() || 0 == cliente.getLsClienteDescuento().size()) {
					cliente.setLsClienteDescuento(new ArrayList<ClienteDescuento>());
					cliente.getLsClienteDescuento().add(cd);
				} else {
					cliente.getLsClienteDescuento().get(cliente.getLsClienteDescuento().size() - 1).setActivo(0);
					cliente.getLsClienteDescuento().add(cd);
				}
			} catch (Exception ex) {
				if (ex instanceof WrongValueException) {
					throw (WrongValueException) ex;
				}
				log.error("editarClienteController: " + ex);
				Messagebox.show(
						Labels.getLabel("MSG.Error"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.OK, Messagebox.ERROR);
			}
		}

	}

	public Boolean getBoolINDLUNES() {
		return boolINDLUNES;
	}

	public void setBoolINDLUNES(Boolean boolINDLUNES) {
		this.boolINDLUNES = boolINDLUNES;
	}

	public Boolean getBoolINDMARTES() {
		return boolINDMARTES;
	}

	public void setBoolINDMARTES(Boolean boolINDMARTES) {
		this.boolINDMARTES = boolINDMARTES;
	}

	public Boolean getBoolINDMIERCOLES() {
		return boolINDMIERCOLES;
	}

	public void setBoolINDMIERCOLES(Boolean boolINDMIERCOLES) {
		this.boolINDMIERCOLES = boolINDMIERCOLES;
	}

	public Boolean getBoolINDJUEVES() {
		return boolINDJUEVES;
	}

	public void setBoolINDJUEVES(Boolean boolINDJUEVES) {
		this.boolINDJUEVES = boolINDJUEVES;
	}

	public Boolean getBoolINDVIERNES() {
		return boolINDVIERNES;
	}

	public void setBoolINDVIERNES(Boolean boolINDVIERNES) {
		this.boolINDVIERNES = boolINDVIERNES;
	}

	public Boolean getBoolINDSABADO() {
		return boolINDSABADO;
	}

	public void setBoolINDSABADO(Boolean boolINDSABADO) {
		this.boolINDSABADO = boolINDSABADO;
	}

	public Boolean getBoolINDDOMINGO() {
		return boolINDDOMINGO;
	}

	public void setBoolINDDOMINGO(Boolean boolINDDOMINGO) {
		this.boolINDDOMINGO = boolINDDOMINGO;
	}

	public Integer getCantMaxMesInt() {
		return cantMaxMesInt;
	}

	public void setCantMaxMesInt(Integer cantMaxMesInt) {
		this.cantMaxMesInt = cantMaxMesInt;
	}

	public Boolean getEstudanteComDesconto() {
		return estudanteComDesconto;
	}

	public void setEstudanteComDesconto(Boolean estudanteComDesconto) {
		this.estudanteComDesconto = estudanteComDesconto;
	}

	public Ruta getLinha() {
		return linha;
	}

	public void setLinha(Ruta linha) {
		this.linha = linha;
	}

	public Parada getOrigem() {
		return origem;
	}

	public void setOrigem(Parada origem) {
		this.origem = origem;
	}

	public Parada getDestino() {
		return destino;
	}

	public void setDestino(Parada destino) {
		this.destino = destino;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<MotivoViaje> getLsMotivoViaje() {
		return lsMotivoViaje;
	}

	public void setLsMotivoViaje(List<MotivoViaje> lsMotivoViaje) {
		this.lsMotivoViaje = lsMotivoViaje;
	}

	public List<TipoOcupacion> getLsTipoOcupacion() {
		return lsTipoOcupacion;
	}

	public void setLsTipoOcupacion(List<TipoOcupacion> lsTipoOcupacion) {
		this.lsTipoOcupacion = lsTipoOcupacion;
	}

	public List<Escola> getLsEscola() {
		return lsEscola;
	}

	public void setLsEscola(List<Escola> lsEscola) {
		this.lsEscola = lsEscola;
	}

	public MotivoViajeService getMotivoViajeService() {
		return motivoViajeService;
	}

	public void setMotivoViajeService(MotivoViajeService motivoViajeService) {
		this.motivoViajeService = motivoViajeService;
	}

	public TipoOcupacionService getTipoOcupacionService() {
		return tipoOcupacionService;
	}

	public void setTipoOcupacionService(TipoOcupacionService tipoOcupacionService) {
		this.tipoOcupacionService = tipoOcupacionService;
	}

	public TipoDomicilioService getTipoDomicilioService() {
		return tipoDomicilioService;
	}

	public void setTipoDomicilioService(TipoDomicilioService tipoDomicilioService) {
		this.tipoDomicilioService = tipoDomicilioService;
	}

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

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

	public List<TipoDomicilio> getLsTipoDomicilio() {
		return lsTipoDomicilio;
	}

	public void setLsTipoDomicilio(List<TipoDomicilio> lsTipoDomicilio) {
		this.lsTipoDomicilio = lsTipoDomicilio;
	}

	public MyListbox getClienteDescuentoMyListBox() {
		return clienteDescuentoMyListBox;
	}

	public void setClienteDescuentoMyListBox(MyListbox clienteDescuentoMyListBox) {
		this.clienteDescuentoMyListBox = clienteDescuentoMyListBox;
	}

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

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

	public void onClick$btnRemoverDesconto(Event ev) {
		ClienteDescuento c = (ClienteDescuento) clienteDescuentoMyListBox.getSelected();
		if (c != null) {
			c.setActivo(0);
			c.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			c.setFecmodif(Calendar.getInstance().getTime());
			// if (null != c.getClienteDescuentoId()) {
			// clienteDescuentoService.actualizacion(c);
			// }

			lsClienteDescuento.remove(c);
			clienteDescuentoMyListBox.setData(new ArrayList<ClienteDescuento>(lsClienteDescuento));
		}
	}

	public void onClick$btnAdicionarDesconto(Event ev) throws InterruptedException {

		ClienteDescuento clienteDescuento = new ClienteDescuento();

		if (null != cmbLinha.getSelectedItem()) {
			clienteDescuento.setRuta((Ruta) cmbLinha.getSelectedItem().getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noRuta"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}

		if (null != cmbParadaOrigem.getSelectedItem()) {
			clienteDescuento.setOrigem((Parada) cmbParadaOrigem.getSelectedItem().getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noParadaOrigen"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}

		if (null != cmbParadaDestino.getSelectedItem()) {
			clienteDescuento.setDestino((Parada) cmbParadaDestino.getSelectedItem().getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noParadaDestino"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}

		if (!chkINDDOMINGO.isChecked() && !chkINDLUNES.isChecked() && !chkINDMARTES.isChecked() && !chkINDMIERCOLES.isChecked()
				&& !chkINDJUEVES.isChecked() && !chkINDVIERNES.isChecked() && !chkINDSABADO.isChecked()) {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noDiaSelecto"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		} else {
			clienteDescuento.setINDDOMINGO(chkINDDOMINGO.isChecked());
			clienteDescuento.setINDLUNES(chkINDLUNES.isChecked());
			clienteDescuento.setINDMARTES(chkINDMARTES.isChecked());
			clienteDescuento.setINDMIERCOLES(chkINDMIERCOLES.isChecked());
			clienteDescuento.setINDJUEVES(chkINDJUEVES.isChecked());
			clienteDescuento.setINDVIERNES(chkINDVIERNES.isChecked());
			clienteDescuento.setINDSABADO(chkINDSABADO.isChecked());
		}

		if (null != cantMaxMes.getValue()) {
			clienteDescuento.setCantMaxMes(cantMaxMes.getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noCantMaxMes"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}

		if (null != datInicial.getValue()) {
			clienteDescuento.setFecIni(datInicial.getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noFechaIni"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}

		if (null != datFinal.getValue()) {
			clienteDescuento.setFecFin(datFinal.getValue());
		} else {
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noFechaFin"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}
		
		if(radFechaCompra.isChecked()){
			clienteDescuento.setIndFormaValidacionEstudiante("C");
			}else if(radFechaViaje.isChecked()){
				clienteDescuento.setIndFormaValidacionEstudiante("V");
			}
		
		if(isFecFimBeforeFecIni(clienteDescuento)){
			try {
				Messagebox.show(Labels.getLabel("editarClienteController.msg.fecFinBeforeFecIni"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} catch (InterruptedException e) {
				log.error(e);
				return;
			}
			return;
		}
		
		clienteDescuento.setActivo(1);
		clienteDescuento.setFecmodif(Calendar.getInstance().getTime());
		clienteDescuento.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

		if (lsClienteDescuento == null) {
			lsClienteDescuento = new ArrayList<ClienteDescuento>();
			lsClienteDescuento.add(clienteDescuento);
			clienteDescuentoMyListBox.setData(lsClienteDescuento);
			limparInput();
		} else {
			if(!isVigenciaConflitante(clienteDescuento)){
				lsClienteDescuento.add(clienteDescuento);
				clienteDescuentoMyListBox.setData(lsClienteDescuento);
				limparInput();
			}
		}
	}
	
	private boolean isFecFimBeforeFecIni(ClienteDescuento clienteDescuento){
		if(clienteDescuento.getFecFin().before(clienteDescuento.getFecIni())){
			return true;
		}
		return false;
	}
	
	private boolean isVigenciaConflitante(ClienteDescuento clienteDescuento) {
		if(lsClienteDescuento.size() > 0){
			for(ClienteDescuento cd : lsClienteDescuento){
				if((cd.getRuta().getRutaId().intValue() == clienteDescuento.getRuta().getRutaId().intValue() || clienteDescuento.getRuta().getRutaId().intValue() == -1 || cd.getRuta().getRutaId().intValue() == -1 )
						&& cd.getOrigem().getParadaId().intValue() == clienteDescuento.getOrigem().getParadaId().intValue() 
						&& cd.getDestino().getParadaId().intValue() == clienteDescuento.getDestino().getParadaId().intValue()){
					
					if((DateUtil.inicioFecha(clienteDescuento.getFecIni()).after(DateUtil.inicioFecha(cd.getFecIni())))
							&&(DateUtil.inicioFecha(clienteDescuento.getFecIni()).before(DateUtil.fimFecha( cd.getFecFin())))
							||
							(DateUtil.fimFecha(clienteDescuento.getFecFin()).before(DateUtil.fimFecha(cd.getFecFin())))
							&&(DateUtil.fimFecha(clienteDescuento.getFecFin()).after(DateUtil.inicioFecha( cd.getFecIni())))
							){
						try {
							if(cd.getClienteDescuentoId() != null){
								Messagebox.show(
										Labels.getLabel("editarClienteController.msg.conflitoVigencia", new Object[] { cd.getClienteDescuentoId().intValue() }),
										Labels.getLabel("editarClienteController.window.title"),
										Messagebox.OK, Messagebox.EXCLAMATION);
							}else{
								Messagebox.show(
										Labels.getLabel("editarClienteController.msg.conflitoVigenciaNaoSalvo"),
										Labels.getLabel("editarClienteController.window.title"),
										Messagebox.OK, Messagebox.EXCLAMATION);
							}
							return true;
						} catch (InterruptedException e) {
							log.error(e);
							return true;
						}
					}
				}
			}
		}
		return false;
	}
	
	public void onClick$btnAdicionarFidelidade(Event ev) throws InterruptedException {		
		if (validarDadosFidelidade(empresa)){
			ClienteFidelidad clienteFidelidad = new ClienteFidelidad();	
			TarjetaFidelidad tarjetaFidelidad = new TarjetaFidelidad();
			
			tarjetaFidelidad.setNumTarjeta(txtNumFidelidade.getValue());
			tarjetaFidelidad.setActivo(true);
			tarjetaFidelidad.setFecmodif(Calendar.getInstance().getTime());
			tarjetaFidelidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());		
			
			clienteFidelidad.setEmpresa(empresa);		
			clienteFidelidad.setActivo(true);
			clienteFidelidad.setFecmodif(Calendar.getInstance().getTime());
			clienteFidelidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());	
			clienteFidelidad.setTarjetaFidelidad(tarjetaFidelidad);	
			
			lsClienteFidelidad.add(clienteFidelidad);
			cliente.setListClienteFidelidad(lsClienteFidelidad);		
			clienteFidelidadeMyListBox.setData(new ArrayList<ClienteFidelidad>(lsClienteFidelidad));
			limparInputAbaFidelidade();			
		}		
	}

	private Boolean validarDadosFidelidade(Empresa empresa) throws InterruptedException {		
				
		if(txtNumFidelidade.getValue() == null && empresa == null ){
			return false;
		}
		
		if(txtNumFidelidade.getValue() != null && empresa == null ){
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noEmpresa"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		if(empresa != null && txtNumFidelidade.getValue() == null){
			Messagebox.show(Labels.getLabel("editarClienteController.msg.noFidelidade"),
					Labels.getLabel("editarClienteController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		for(ClienteFidelidad clienteF : lsClienteFidelidad){
			if(empresa != null && clienteF.getEmpresa().equals(empresa)){
				Messagebox.show(Labels.getLabel("editarClienteController.msg.empresa.cadastrada"),
						Labels.getLabel("editarClienteController.window.title"),
						Messagebox.OK, Messagebox.ERROR);
				return false;
			}
		}	
		return true;
	}
	
	public void onClick$btnRemoverFidelidade(Event ev) {
		ClienteFidelidad c = (ClienteFidelidad) clienteFidelidadeMyListBox.getSelected();
		if (c != null) {
			c.setActivo(false);
			c.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			c.setFecmodif(Calendar.getInstance().getTime());
			lsClienteFidelidad.remove(c);
			clienteFidelidadeMyListBox.setData(new ArrayList<ClienteFidelidad>(lsClienteFidelidad));
		}
	}

	
	private void limparInputAbaFidelidade() {
		cmbEmpresa.setSelectedItem(null);
		txtNumFidelidade.setValue(null);
	}

	private void limparInput() {
		cmbLinha.setSelectedItem(null);
		cmbParadaOrigem.setSelectedItem(null);
		cmbParadaOrigem.setModel(new BindingListModelList(new ArrayList<Parada>(), true));
		cmbParadaOrigemCve.setSelectedItem(null);
		cmbParadaOrigemCve.setModel(new BindingListModelList(new ArrayList<Parada>(), true));
		cmbParadaDestino.setSelectedItem(null);
		cmbParadaDestino.setModel(new BindingListModelList(new ArrayList<Parada>(), true));
		cmbParadaDestinoCve.setSelectedItem(null);
		cmbParadaDestinoCve.setModel(new BindingListModelList(new ArrayList<Parada>(), true));
		chkINDLUNES.setChecked(false);
		chkINDMARTES.setChecked(false);
		chkINDMIERCOLES.setChecked(false);
		chkINDJUEVES.setChecked(false);
		chkINDVIERNES.setChecked(false);
		chkINDSABADO.setChecked(false);
		chkINDDOMINGO.setChecked(false);
		cantMaxMes.setValue(null);
		cantMaxMesInt = null;
		datInicial.setValue(null);
		datFinal.setValue(null);
		radFechaCompra.setChecked(true);
		radFechaViaje.setChecked(false);
	}

	private void exibeClienteDescuento(ClienteDescuento cd) {
		estudanteComDesconto = true;
		chkEstudanteComDesconto.setChecked(true);
		cmbLinha.setText(cd.getRuta().getDescruta());
		linha = cd.getRuta();
		cmbLinha.setSelectedItem(cmbLinha.getItemAtIndex(lsLinhas.indexOf(cd.getRuta())));
		// cmbLinha.setSelectedItem(linha);
		cmbParadaOrigem.setText(cd.getOrigem().getDescparada());
		cmbParadaOrigem.setInitialValue(cd.getOrigem());
		cmbParadaOrigemCve.setText(cd.getOrigem().getCveparada());
		origem = cd.getOrigem();
		cmbParadaDestino.setText(cd.getDestino().getDescparada());
		cmbParadaDestino.setInitialValue(cd.getDestino());
		cmbParadaDestinoCve.setText(cd.getDestino().getCveparada());
		destino = cd.getDestino();
		chkINDLUNES.setChecked(cd.getINDLUNES());
		chkINDMARTES.setChecked(cd.getINDMARTES());
		chkINDMIERCOLES.setChecked(cd.getINDMIERCOLES());
		chkINDJUEVES.setChecked(cd.getINDJUEVES());
		chkINDVIERNES.setChecked(cd.getINDVIERNES());
		chkINDSABADO.setChecked(cd.getINDSABADO());
		chkINDDOMINGO.setChecked(cd.getINDDOMINGO());
		cantMaxMesInt = cd.getCantMaxMes();
		cantMaxMes.setValue(cantMaxMesInt);
		datInicial.setValue(cd.getFecIni());
		datFinal.setValue(cd.getFecFin());
		boolINDLUNES = cd.getINDLUNES();
		boolINDMARTES = cd.getINDMARTES();
		boolINDMIERCOLES = cd.getINDMIERCOLES();
		boolINDJUEVES = cd.getINDJUEVES();
		boolINDVIERNES = cd.getINDVIERNES();
		boolINDSABADO = cd.getINDSABADO();
		boolINDDOMINGO = cd.getINDDOMINGO();
		if(cd.getIndFormaValidacionEstudiante().equals("V")){
			radFechaViaje.setChecked(true);
			radFechaCompra.setChecked(false);
		}else if(cd.getIndFormaValidacionEstudiante().equals("C")){
			radFechaViaje.setChecked(false);
			radFechaCompra.setChecked(true);
		}
	}
	
	private void exibeClienteFidelidade(ClienteFidelidad cliente){
		cmbEmpresa.setText(cliente.getEmpresa().getNombempresa());
		empresa = cliente.getEmpresa();
		cmbEmpresa.setSelectedItem(cmbEmpresa.getItemAtIndex(lsEmpresas.indexOf(cliente.getEmpresa())));
		txtNumFidelidade.setText(cliente.getTarjetaFidelidad().getNumTarjeta().toString());	
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

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

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}	
	
	
}
