/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.configuracioneccomerciales;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

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.zhtml.Messagebox;
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.util.Clients;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.api.Timebox;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.CategoriaClase;
import com.rjconsultores.ventaboletos.entidad.CategoriaCorrida;
import com.rjconsultores.ventaboletos.entidad.CategoriaCtrl;
import com.rjconsultores.ventaboletos.entidad.CategoriaDescuento;
import com.rjconsultores.ventaboletos.entidad.CategoriaMarca;
import com.rjconsultores.ventaboletos.entidad.CategoriaMercado;
import com.rjconsultores.ventaboletos.entidad.CategoriaOrgao;
import com.rjconsultores.ventaboletos.entidad.CategoriaPeriodo;
import com.rjconsultores.ventaboletos.entidad.CategoriaRuta;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.CorridaCtrl;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.service.CategoriaCorridaService;
import com.rjconsultores.ventaboletos.service.CategoriaCtrlService;
import com.rjconsultores.ventaboletos.service.CategoriaPeriodoService;
import com.rjconsultores.ventaboletos.service.CategoriaService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.CorridaCtrlService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaClase;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaCorrida;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaDecuento;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaMarca;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaMercado;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaOrgao;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCategoriaRuta;

/**
 * 
 * @author rodrigo
 */
@Controller("editarConfiguracionCategoriaController")
@Scope("prototype")
public class EditarConfiguracionCategoriaController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(EditarConfiguracionCategoriaController.class);
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private CorridaCtrlService corridaCtrlService;
	@Autowired
	private CategoriaService categoriaService;
	@Autowired
	private CategoriaCorridaService categoriaCorridaService;
	@Autowired
	private CategoriaCtrlService categoriaCtrlService;
	@Autowired
	private CategoriaPeriodoService categoriaPeriodoService;
	@Autowired
	private OrgaoConcedenteService orgaoService;
	@Autowired
	private RutaService rutaService;
	private List<Marca> lsMarcas;
	private List<ClaseServicio> lsClaseServicio;
	private List<Empresa> lsEmpresas;
	private List<Corrida> lsCorridas;
	private List<Categoria> lsCategorias;
	private List<OrgaoConcedente> lsOrgao;
	private List<Ruta> lsRuta;
	private CategoriaMercado categoriaMercado;
	private CategoriaMarca categoriaMarca;
	private CategoriaDescuento categoriaDescuento;
	private CategoriaCtrl categoriaCtrl;
	private CategoriaCorrida categoriaCorrida;
	private CategoriaClase categoriaClase;
	private CategoriaOrgao categoriaOrgao;
	private CategoriaRuta categoriaRuta;
	private MyListbox categoriaCtrlList;
	private MyListbox categoriaClaseList;
	private MyListbox categoriaCorridaList;
	private MyListbox categoriaDescuentoList;
	private MyListbox categoriaMarcaList;
	private MyListbox categoriaMercadoList;
	private MyListbox categoriaOrgaoList;
	private MyListbox categoriaRutaList;
	private List<CategoriaClase> lsCategoriaClase;
	private List<CategoriaDescuento> lsCategoriaDescuento;
	private List<CategoriaMarca> lsCategoriaMarca;
	private List<CategoriaMercado> lsCategoriaMercado;
	private List<CategoriaCorrida> lsCategoriaCorrida;
	private List<CategoriaOrgao> lsCategoriaOrgao;
	private List<CategoriaRuta> lsCategoriaRuta;
	private Combobox cmbCategorias;
	private Combobox cmbEmpresas;
	private Combobox cmbMarca;
	private Combobox cmbClase;
	private Combobox cmbParadaOrigem;
	private Combobox cmbParadaDestino;
	private Combobox cmbOrgao;
	private Combobox cmbRuta;
	private Combobox cmbIndGeneraFeriado;
	private Decimalbox descuentoImporte;
	private Decimalbox descuentoPorc;
	private Intbox idCorrida;
	private Intbox cantAutorizada;
	private Radio radioImp;
	private Radio radioImprimePassagem;
	private Radio rdCuotaSi;
	private Radio radioNaoImprimePassagem;
	private Radio rdVendaAntecipadaSi;
	private Radio rdVendaAntecipadaNo;
	private Radio rdVendeAbertoSim;
	private Row rowTrecho;
	private Row rowTiempo;
	private Radio rdTrecho;
	private Timebox timeTempoPermitir;
	private Tab tabEmpresa;
	private Tab tabDesconto;
	private Tab tabMarca;
	private Tab tabMercado;
	private Tab tabClasse;
	private Checkbox chkPrecoTxEmbarque;
	private Checkbox chkPrecoPedagio;
	private Checkbox chkPrecoSeguro;
	private Checkbox chkPrecoOutros;
	private Label lblMsgTiempo;
	private Spinner spnHora;
	private Spinner spnMinuto;
	private Checkbox chkLiberacionSolamenteEnvasado;
	private Textbox asientosReservados;
	private Row linhaLiberarPoltronasQuandoOnibus;
	private Row linhaAssentosReservados;

	
	public List<Categoria> getLsCategorias() {
		return lsCategorias;
	}

	public void setLsCategorias(List<Categoria> lsCategorias) {
		this.lsCategorias = lsCategorias;
	}

	public List<ClaseServicio> getLsClaseServicio() {
		return lsClaseServicio;
	}

	public void setLsClaseServicio(List<ClaseServicio> lsClaseServicio) {
		this.lsClaseServicio = lsClaseServicio;
	}

	public List<Corrida> getLsCorridas() {
		return lsCorridas;
	}

	public void setLsCorridas(List<Corrida> lsCorridas) {
		this.lsCorridas = lsCorridas;
	}

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

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

	public List<Marca> getLsMarcas() {
		return lsMarcas;
	}

	public void setLsMarcas(List<Marca> lsMarcas) {
		this.lsMarcas = lsMarcas;
	}

	public List<OrgaoConcedente> getLsOrgao() {
		return lsOrgao;
	}

	public void setLsOrgao(List<OrgaoConcedente> lsOrgao) {
		this.lsOrgao = lsOrgao;
	}

	public CategoriaCtrl getCategoriaCTRL() {
		return categoriaCtrl;
	}

	public void setCategoriaCTRL(CategoriaCtrl categoriaCTRL) {
		this.categoriaCtrl = categoriaCTRL;
	}

	public CategoriaClase getCategoriaClase() {
		return categoriaClase;
	}

	public void setCategoriaClase(CategoriaClase categoriaClase) {
		this.categoriaClase = categoriaClase;
	}

	public CategoriaCorrida getCategoriaCorrida() {
		return categoriaCorrida;
	}

	public void setCategoriaCorrida(CategoriaCorrida categoriaCorrida) {
		this.categoriaCorrida = categoriaCorrida;
	}

	public CategoriaOrgao getCategoriaOrgao() {
		return categoriaOrgao;
	}

	public void setCategoriaOrgao(CategoriaOrgao categoriaOrgao) {
		this.categoriaOrgao = categoriaOrgao;
	}

	public List<CategoriaOrgao> getLsCategoriaOrgao() {
		return lsCategoriaOrgao;
	}

	public void setLsCategoriaOrgao(List<CategoriaOrgao> lsCategoriaOrgao) {
		this.lsCategoriaOrgao = lsCategoriaOrgao;
	}

	public CategoriaCtrlService getCategoriaCtrlService() {
		return categoriaCtrlService;
	}

	public void setCategoriaCtrlService(CategoriaCtrlService categoriaCtrlService) {
		this.categoriaCtrlService = categoriaCtrlService;
	}

	public CategoriaDescuento getCategoriaDescuento() {
		return categoriaDescuento;
	}

	public void setCategoriaDescuento(CategoriaDescuento categoriaDescuento) {
		this.categoriaDescuento = categoriaDescuento;
	}

	public CategoriaMarca getCategoriaMarca() {
		return categoriaMarca;
	}

	public void setCategoriaMarca(CategoriaMarca categoriaMarca) {
		this.categoriaMarca = categoriaMarca;
	}

	public CategoriaMercado getCategoriaMercado() {
		return categoriaMercado;
	}

	public void setCategoriaMercado(CategoriaMercado categoriaMercado) {
		this.categoriaMercado = categoriaMercado;
	}

	public List<CategoriaClase> getLsCategoriaClase() {
		return lsCategoriaClase;
	}

	public void setLsCategoriaClase(List<CategoriaClase> lsCategoriaClase) {
		this.lsCategoriaClase = lsCategoriaClase;
	}

	public List<CategoriaDescuento> getLsCategoriaDescuento() {
		return lsCategoriaDescuento;
	}

	public void setLsCategoriaDescuento(List<CategoriaDescuento> lsCategoriaDescuento) {
		this.lsCategoriaDescuento = lsCategoriaDescuento;
	}

	public List<CategoriaMarca> getLsCategoriaMarca() {
		return lsCategoriaMarca;
	}

	public void setLsCategoriaMarca(List<CategoriaMarca> lsCategoriaMarca) {
		this.lsCategoriaMarca = lsCategoriaMarca;
	}

	public List<CategoriaMercado> getLsCategoriaMercado() {
		return lsCategoriaMercado;
	}

	public void setLsCategoriaMercado(List<CategoriaMercado> lsCategoriaMercado) {
		this.lsCategoriaMercado = lsCategoriaMercado;
	}

	public List<CategoriaCorrida> getLsCategoriaCorrida() {
		return lsCategoriaCorrida;
	}

	public void setLsCategoriaCorrida(List<CategoriaCorrida> lsCategoriaCorrida) {
		this.lsCategoriaCorrida = lsCategoriaCorrida;
	}
	
	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

	public void setLsRuta(List<Ruta> lsRuta) {
		this.lsRuta = lsRuta;
	}
	
	public CategoriaRuta getCategoriaRuta() {
		return categoriaRuta;
	}

	public void setCategoriaRuta(CategoriaRuta categoriaRuta) {
		this.categoriaRuta = categoriaRuta;
	}

	public MyListbox getCategoriaRutaList() {
		return categoriaRutaList;
	}

	public void setCategoriaRutaList(MyListbox categoriaRutaList) {
		this.categoriaRutaList = categoriaRutaList;
	}

	public List<CategoriaRuta> getLsCategoriaRuta() {
		return lsCategoriaRuta;
	}

	public void setLsCategoriaRuta(List<CategoriaRuta> lsCategoriaRuta) {
		this.lsCategoriaRuta = lsCategoriaRuta;
	}

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

	public void setCmbRuta(Combobox cmbRuta) {
		this.cmbRuta = cmbRuta;
	}

	public void clearCombobox(Combobox combobox) {
		int size = combobox.getItemCount();

		for (int i = size - 1; i >= 0; i--) {
			combobox.removeItemAt(i);
		}
	}

	public void popularCombobox(Combobox cmb) throws Exception {
		clearCombobox(cmb);
		for (CategoriaDescuento.DisponibilidadeFeriado p : CategoriaDescuento.DisponibilidadeFeriado.values()) {
			Comboitem comboItem = new Comboitem(p.descricao());
			comboItem.setValue(p.valor());
			comboItem.setParent(cmb);
		}

		cmb.setSelectedIndex(0);
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsCategorias = categoriaService.obtenerTodasCategoriasVisibles();
		lsClaseServicio = claseServicioService.obtenerTodos();
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsMarcas = marcaService.buscarMarcaPorEmpresa(UsuarioLogado.getUsuarioLogado().getEmpresa());
		lsOrgao = orgaoService.obtenerTodos();
		lsRuta = rutaService.obtenerTodos();
		
		super.doAfterCompose(comp);

		popularCombobox(cmbIndGeneraFeriado);

		categoriaCtrlList = (MyListbox) Executions.getCurrent().getArg().get("categoriaCtrlList");
		categoriaCtrl = (CategoriaCtrl) Executions.getCurrent().getArg().get("categoriaCtrl");

		if (categoriaCtrl == null) {
			categoriaCtrl = new CategoriaCtrl();
		}

		// Desconto
		categoriaDescuentoList.setItemRenderer(new RenderConfiguracionCategoriaDecuento());

		lsCategoriaDescuento = new ArrayList<CategoriaDescuento>();
		// Clase
		categoriaClaseList.setItemRenderer(new RenderConfiguracionCategoriaClase());
		lsCategoriaClase = new ArrayList<CategoriaClase>();
		// Marca
		categoriaMarcaList.setItemRenderer(new RenderConfiguracionCategoriaMarca());
		lsCategoriaMarca = new ArrayList<CategoriaMarca>();
		// Mercado
		categoriaMercadoList.setItemRenderer(new RenderConfiguracionCategoriaMercado());
		lsCategoriaMercado = new ArrayList<CategoriaMercado>();
		// Corrida
		categoriaCorridaList.setItemRenderer(new RenderConfiguracionCategoriaCorrida());
		lsCategoriaCorrida = new ArrayList<CategoriaCorrida>();
		// Orgao
		categoriaOrgaoList.setItemRenderer(new RenderConfiguracionCategoriaOrgao());
		lsCategoriaOrgao = new ArrayList<CategoriaOrgao>();
		// Ruta
		categoriaRutaList.setItemRenderer(new RenderConfiguracionCategoriaRuta());
		lsCategoriaRuta = new ArrayList<CategoriaRuta>();

		// Recarrega Listas
		if (categoriaCtrl.getCategoriactrlId() != null) {
			categoriaCtrl = categoriaCtrlService.obtenerID(categoriaCtrl.getCategoriactrlId());

			lsCategoriaDescuento = categoriaCtrl.getCategoriaDescuentoVisiblesList();
			categoriaDescuentoList.setData(lsCategoriaDescuento);

			lsCategoriaClase = categoriaCtrl.getCategoriaClaseList();
			categoriaClaseList.setData(lsCategoriaClase);

			lsCategoriaMarca = categoriaCtrl.getCategoriaMarcaList();
			categoriaMarcaList.setData(lsCategoriaMarca);

			lsCategoriaOrgao = categoriaCtrl.getCategoriaOrgaoList();
			categoriaOrgaoList.setData(lsCategoriaOrgao);
			
			lsCategoriaRuta = categoriaCtrl.getCategoriaRutaList();
			categoriaRutaList.setData(lsCategoriaRuta);

			lsCategoriaMercado = categoriaCtrl.getCategoriaMercadoList();
			categoriaMercadoList.setData(lsCategoriaMercado);

			lsCategoriaCorrida = categoriaCtrl.getCategoriaCorridaList();
			categoriaCorridaList.setData(lsCategoriaCorrida);
		}
		descuentoImporte.setValue(BigDecimal.ZERO);
		descuentoPorc.setValue(BigDecimal.ZERO);

		descuentoImporte.setDisabled(true);
		descuentoPorc.setDisabled(true);

		radioImp.setChecked(true);
		onClick$radioImp(null);
		cmbEmpresas.focus();
		linhaLiberarPoltronasQuandoOnibus.setVisible(false);
		linhaAssentosReservados.setVisible(false);
		
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void onClick$btnEditarDatosCategoria(Event e) throws InterruptedException {
		CategoriaDescuento cd = (CategoriaDescuento) categoriaDescuentoList.getSelected();
		if (cd == null) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectDescuento"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		Map args = new HashMap();
		args.put("categoriaDescuento", cd);
		args.put("categoriaDescuentoList", categoriaDescuentoList);

		openWindow("/gui/configuraciones_comerciales/editarConfiguracionCategoriasDatosCategoria.zul",
				Labels.getLabel("editarConfiguracionCategoriaDatosCategoriaController.title"), args, MODAL);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verPeriodoDesconto(CategoriaDescuento cd) throws InterruptedException {
		if (cd == null) {
			return;
		}

		/*
		 * Nao deixa editar periodos para novos tipo de pasajero Desa forma nao traslapa os periodos.
		 */
		if (categoriaCtrl.getCategoriactrlId() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCategoriaController.MSG.editarPeriodo"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}

		Map args = new HashMap();
		args.put("categoriaDescuento", cd);
		args.put("categoriaDescuentoList", categoriaDescuentoList);

		openWindow("/gui/configuraciones_comerciales/editarConfiguracionCategoriasPeriodo.zul",
				Labels.getLabel("editarConfiguracionCategoriaControllerPeriodo.window.title"), args, MODAL);
	}

	public boolean validaObligatorios() throws InterruptedException {
		if (categoriaDescuentoList.getData().length == 0) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.necesitaDescuento"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			tabDesconto.setSelected(Boolean.TRUE);
			return false;
		}
		if (categoriaMarcaList.getData().length == 0) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.necesitaMarca"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			tabMarca.setSelected(Boolean.TRUE);
			return false;
		}
		if (categoriaMercadoList.getData().length == 0) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.necesitaMercado"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			tabMercado.setSelected(Boolean.TRUE);
			return false;
		}
		if (categoriaClaseList.getData().length == 0) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.necesitaClase"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			tabClasse.setSelected(Boolean.TRUE);
			return false;
		}
		if (categoriaRutaList.getData().length == 0) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.MSG.necesitaRuta"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			tabClasse.setSelected(Boolean.TRUE);
			return false;
		}
		return true;
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		tabEmpresa.setSelected(Boolean.TRUE);
		cmbEmpresas.getValue();

		if (!validaObligatorios()) {
			return;
		}

		boolean sinPeriodo = false;
		if (categoriaCtrl.getCategoriactrlId() != null) {
			for (CategoriaDescuento cd : lsCategoriaDescuento) {
				if ((cd.getCategoriadescuentoId() != null) && (cd.getActivo())) {
					List<CategoriaPeriodo> obtenerPorCategoriaDescuento = categoriaPeriodoService.obtenerPorCategoriaDescuento(cd);
					if (obtenerPorCategoriaDescuento.isEmpty()) {
						sinPeriodo = true;
					}
				}
			}
			// Deixa salvar sem Vigencia para categorias novas.
			if (sinPeriodo && categoriaCtrl.getCategoriactrlId() != null) {
				tabDesconto.setSelected(true);
				Clients.alert(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.categoriaPeriodoObligatorio"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"), Messagebox.INFORMATION);
				return;
			}
		}
		try {
			categoriaCtrl.setActivo(true);
			categoriaCtrl.setFecmodif(Calendar.getInstance().getTime());
			categoriaCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			if (categoriaCtrl.getCategoriactrlId() == null) {
				categoriaCtrlService.suscribir(categoriaCtrl);
				categoriaCtrlList.addItemNovo(categoriaCtrl);

				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.suscribirOK"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} else {
				// Recarrega os periodos alterados
				List<CategoriaDescuento> lsCategoriaDescuentoNova = new ArrayList<CategoriaDescuento>();

				for (CategoriaDescuento cd : lsCategoriaDescuento) {
					if (!cd.getActivo()) {
						lsCategoriaDescuentoNova.add(cd);
						continue;
					}
					cd.setCategoriaPeriodoList(new ArrayList<CategoriaPeriodo>());
					List<CategoriaPeriodo> listCategoriaPeriodo = categoriaPeriodoService.obtenerPorCategoriaDescuento(categoriaDescuento);
					cd.setCategoriaPeriodoList(listCategoriaPeriodo);
					lsCategoriaDescuentoNova.add(cd);

				}
				categoriaCtrl.setCategoriaDescuentoList(lsCategoriaDescuentoNova);

				categoriaCtrlService.actualizacion(categoriaCtrl);
				categoriaCtrlList.updateItem(categoriaCtrl);

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

				closeWindow();
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

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

			if (resp == Messagebox.YES) {
				categoriaCtrlService.borrar(categoriaCtrl);
				categoriaCtrlList.removeItem(categoriaCtrl);

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

				closeWindow();
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}
	
	private Boolean validarCampoAssentosReservados() throws InterruptedException{
					
		//Verifica se o campo possui números separados por ponto e vírgula.
		//Não permite que outros caracteres sejam digitados.
		if (!asientosReservados.getValue().equals("") && !asientosReservados.getValue().toString().matches("(([1-9]([0-9])+;)|([1-9]([0-9])+)|([1-9];)|([1-9][1-9][1-9])|[1-9])+")){
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoAssentosReservadosPontoeVirgula"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return false;
		}		
		//Verifica se a quantidade de assentos reservados é menor que a quantidade de assentos autorizados.
		String assentosReservados[] = asientosReservados.getValue().toString().split(";");
		if(assentosReservados.length > cantAutorizada.getValue()){		
			Messagebox.show(
				Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoAssentosReservados"),
				Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
				Messagebox.OK, Messagebox.ERROR);
			return false;			
		}		
		
		//Retira possíveis assentos em duplicidade utilizando Set
		if(!asientosReservados.getValue().equals("") && assentosReservados.length > 0){
			Set<String> assentosSemDuplicacao = new HashSet<String>();
			StringBuilder assentos = new StringBuilder();
			assentosSemDuplicacao.addAll(Arrays.asList(assentosReservados));
			assentosReservados = assentosSemDuplicacao.toArray(new String[assentosSemDuplicacao.size()]);
			for(String assento :assentosReservados){
				assentos.append(assento.trim()).append(";");
			}
			assentos.replace(assentos.length()-1, assentos.length(),"");
			asientosReservados.setValue(assentos.toString());
		}	
				
		return true;
	}

	public void onClick$btnAdicionarDesconto(Event ev) throws InterruptedException {
		if (cmbCategorias.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoCategoria"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbCategorias.focus();
			return;
		}

		if (rdVendaAntecipadaSi.isChecked()) {
			int hora = (spnHora.getValue() == null) ? 0 : spnHora.getValue();
			int minuto = (spnMinuto.getValue() == null) ? 0 : spnMinuto.getValue();
			if ((hora + minuto) == 0) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.msg.validacaoVentaAntecipada"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				spnHora.focus();

				return;
			}
		}

		cmbCategorias.getValue();
		cantAutorizada.getValue();
		descuentoPorc.getValue();
		descuentoImporte.getValue();
		asientosReservados.getValue();

		boolean existe = false;
		for (CategoriaDescuento cd : lsCategoriaDescuento) {
			if (cd.getActivo() && cd.getCategoria().equals(cmbCategorias.getSelectedItem().getValue())) {
				existe = true;
			}
		}

		if (!existe) {
			if(validarCampoAssentosReservados()){
				CategoriaDescuento cDescuento = new CategoriaDescuento();
				cDescuento.setCategoriaCtrl(categoriaCtrl);
				cDescuento.setActivo(Boolean.TRUE);
				cDescuento.setFecmodif(Calendar.getInstance().getTime());
				cDescuento.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				cDescuento.setCategoria((Categoria) cmbCategorias.getSelectedItem().getValue());
				cDescuento.setCantautorizada(cantAutorizada.getValue());
				cDescuento.setDescuentoimporte(descuentoImporte.getValue());
				cDescuento.setDescuentoporc(descuentoPorc.getValue());
				cDescuento.setIndImporteOutros(chkPrecoOutros.isChecked());
				cDescuento.setIndImportePedagio(chkPrecoPedagio.isChecked());
				cDescuento.setIndImporteSeguro(chkPrecoSeguro.isChecked());
				cDescuento.setIndImporteTxEmbarque(chkPrecoTxEmbarque.isChecked());
				cDescuento.setIndVentaAbierto(rdVendeAbertoSim.isSelected());
				cDescuento.setIndLiberacionSolamenteEnvasado(chkLiberacionSolamenteEnvasado.isChecked());
				cDescuento.setAsientosReservados(asientosReservados.getValue());

				if (rdVendaAntecipadaSi.isChecked()) {
					cDescuento.setTiempoDesactivar(spnHora.getValue(), spnMinuto.getValue());
				} else {
					cDescuento.setTiempoActivar(spnHora.getValue(), spnMinuto.getValue());
				}

				if (cmbIndGeneraFeriado.getSelectedItem() != null) {
					cDescuento.setIndAplicaFeriado((String) cmbIndGeneraFeriado.getSelectedItem().getValue());
				}

				if (radioImprimePassagem.isSelected()) {
					cDescuento.setIndImprimeBoleto(Boolean.TRUE);
				} else if (radioNaoImprimePassagem.isSelected()) {
					cDescuento.setIndImprimeBoleto(Boolean.FALSE);
				}

				cDescuento.setIndCuota(false);
				cDescuento.setIndCuotaTramo(false);

				if (rdCuotaSi.isChecked()) {
					if (timeTempoPermitir.getValue() == null) {
						throw new WrongValueException(timeTempoPermitir, Labels.getLabel("MSG.CONSTRAINT.CONSTRAINTNUMBERBDOBLIGATORIO"));
					}

					cDescuento.setIndCuota(true);
					cDescuento.setIndCuotaTramo(rdTrecho.isChecked());
					cDescuento.setTiempoCuota(timeTempoPermitir.getValue());
				}

				lsCategoriaDescuento.add(cDescuento);
				categoriaDescuentoList.addItemNovo(cDescuento);
				categoriaCtrl.setCategoriaDescuentoList(lsCategoriaDescuento);

				cmbCategorias.setSelectedItem(null);
				cantAutorizada.setRawValue(null);
				if (radioImp.isChecked()) {
					onClick$radioImp(null);
				} else {
					onClick$radioPor(null);
				}
				onClick$rdVendaAntecipadaNo(null);
				rdVendaAntecipadaNo.setChecked(true);				
			}			
		} else {
			Messagebox.show(
					Labels.getLabel("MSG.Registro.Existe"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void onClick$btnRemoverDesconto(Event ev) {
		try {
			CategoriaDescuento cDescuento = (CategoriaDescuento) categoriaDescuentoList.getSelected();
			if (cDescuento != null) {
				if (!cDescuento.getCategoria().getCategoriaId().equals(1)) {
					lsCategoriaDescuento.remove(cDescuento);
					cDescuento.setFecmodif(Calendar.getInstance().getTime());
					cDescuento.setActivo(Boolean.FALSE);
					cDescuento.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					categoriaDescuentoList.updateItem(cDescuento);
					categoriaDescuentoList.removeItem(cDescuento);
					lsCategoriaDescuento.add(cDescuento);
					categoriaCtrl.setCategoriaDescuentoList(lsCategoriaDescuento);
					// categoriaCtrl.setCategoriaDescuentoList(lsCategoriaDescuento);
				} else {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarMarca(Event ev) throws InterruptedException {
		if (cmbMarca.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbMarca.focus();
			return;
		}

		if (((Marca) cmbMarca.getSelectedItem().getValue()).getMarcaId().equals((short) -1)) {
			if (categoriaMarcaList.getData().length != 0) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.noEsPermitidoTodosMarca"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
		}
		if (lsCategoriaMarca != null) {
			for (CategoriaMarca cm : lsCategoriaMarca) {
				if (!cm.getActivo()) {
					continue;
				}
				if (cm.getMarca().getMarcaId().equals((short) -1)) {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCategoriaController.MSG.noEsPermitidoMarcaTodosExiste"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);

					return;
				}
			}
		}
		try {
			boolean existe = false;
			for (CategoriaMarca cm : lsCategoriaMarca) {
				Marca categoriaMarcaTeste = (Marca) cmbMarca.getSelectedItem().getValue();
				if (cm.getActivo() && cm.getMarca().getMarcaId().equals(categoriaMarcaTeste.getMarcaId())) {
					existe = true;
				}
			}

			if (!existe) {
				CategoriaMarca cMarca = new CategoriaMarca();
				cMarca.setCategoriaCtrl(categoriaCtrl);
				cMarca.setActivo(Boolean.TRUE);
				cMarca.setMarca((Marca) cmbMarca.getSelectedItem().getValue());
				cMarca.setFecmodif(Calendar.getInstance().getTime());
				cMarca.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsCategoriaMarca.add(cMarca);
				categoriaMarcaList.addItemNovo(cMarca);
				categoriaCtrl.setCategoriaMarcaList(lsCategoriaMarca);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverMarca(Event ev) {
		try {
			CategoriaMarca cMarca = (CategoriaMarca) categoriaMarcaList.getSelected();
			if (cMarca != null) {
				// removo o antigo
				lsCategoriaMarca.remove(cMarca);
				cMarca.setFecmodif(Calendar.getInstance().getTime());
				cMarca.setActivo(Boolean.FALSE);
				cMarca.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				categoriaMarcaList.updateItem(cMarca);
				categoriaMarcaList.removeItem(cMarca);
				lsCategoriaMarca.add(cMarca);
				categoriaCtrl.setCategoriaMarcaList(lsCategoriaMarca);

			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarRuta(Event ev) throws InterruptedException {
		if (cmbRuta.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbRuta.focus();
			return;
		}
		
		try {
			boolean existe = false;
			for (CategoriaRuta cm : lsCategoriaRuta) {
				Ruta categoriaRutaTeste = (Ruta) cmbRuta.getSelectedItem().getValue();
				if (cm.getActivo() && cm.getRuta().getRutaId().equals(categoriaRutaTeste.getRutaId())) {
					existe = true;
				}
			}

			if (!existe) {
				CategoriaRuta cRuta = new CategoriaRuta();
				cRuta.setCategoriaCtrl(categoriaCtrl);
				cRuta.setActivo(Boolean.TRUE);
				cRuta.setRuta((Ruta) cmbRuta.getSelectedItem().getValue());
				cRuta.setFecmodif(Calendar.getInstance().getTime());
				cRuta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsCategoriaRuta.add(cRuta);
				categoriaRutaList.addItemNovo(cRuta);
				categoriaCtrl.setCategoriarutaList(lsCategoriaRuta);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}

	}
	
	public void onClick$btnRemoverRuta(Event ev) {
		try {
			CategoriaRuta cRuta = (CategoriaRuta) categoriaRutaList.getSelected();
			int resp = Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.borrarPergunta"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				if (cRuta != null) {
					// removo o antigo
					lsCategoriaRuta.remove(cRuta);
					cRuta.setFecmodif(Calendar.getInstance().getTime());
					cRuta.setActivo(Boolean.FALSE);
					cRuta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					lsCategoriaRuta.add(cRuta);
					categoriaCtrl.setCategoriarutaList(lsCategoriaRuta);
					categoriaRutaList.removeItem(cRuta);
				} else {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}
	
	public void onClick$btnAdicionarOrgao(Event ev) throws InterruptedException {
		if (cmbOrgao.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbOrgao.focus();
			return;
		}

		if (((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue()).getOrgaoConcedenteId().equals((short) -1)) {
			if (categoriaOrgaoList.getData().length != 0) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.noEsPermitidoTodosOrgao"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
		}
		if (lsCategoriaOrgao != null) {
			for (CategoriaOrgao cm : lsCategoriaOrgao) {
				if (!cm.getActivo()) {
					continue;
				}
				if (cm.getOrgao().equals((short) -1)) {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCategoriaController.MSG.noEsPermitidoMarcaTodosExiste"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);

					return;
				}
			}
		}
		try {
			boolean existe = false;
			for (CategoriaOrgao cm : lsCategoriaOrgao) {
				OrgaoConcedente categoriaOrgaoTeste = (OrgaoConcedente) cmbOrgao.getSelectedItem().getValue();
				if (cm.getActivo() && cm.getOrgao().getOrgaoConcedenteId().equals(categoriaOrgaoTeste.getOrgaoConcedenteId())) {
					existe = true;
				}
			}

			if (!existe) {
				CategoriaOrgao cOrgao = new CategoriaOrgao();
				cOrgao.setCategoriaCtrl(categoriaCtrl);
				cOrgao.setActivo(Boolean.TRUE);
				cOrgao.setOrgao((OrgaoConcedente) cmbOrgao.getSelectedItem().getValue());
				cOrgao.setFecmodif(Calendar.getInstance().getTime());
				cOrgao.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsCategoriaOrgao.add(cOrgao);
				categoriaOrgaoList.addItemNovo(cOrgao);
				categoriaCtrl.setCategoriaorgaoList(lsCategoriaOrgao);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverOrgao(Event ev) {
		try {
			CategoriaOrgao cOrgao = (CategoriaOrgao) categoriaOrgaoList.getSelected();
			int resp = Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.borrarPergunta"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
			if (resp == Messagebox.YES) {
				if (cOrgao != null) {
					// removo o antigo
					lsCategoriaOrgao.remove(cOrgao);
					cOrgao.setFecmodif(Calendar.getInstance().getTime());
					cOrgao.setActivo(Boolean.FALSE);
					cOrgao.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					lsCategoriaOrgao.add(cOrgao);
					categoriaCtrl.setCategoriaorgaoList(lsCategoriaOrgao);
					categoriaOrgaoList.removeItem(cOrgao);
				} else {
					Messagebox.show(
							Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarCorrida(Event ev) {
		idCorrida.getValue();

		CorridaCtrl corrida = corridaCtrlService.obtenerID(idCorrida.getValue());
		try {
			if (corrida == null) {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.corrida"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} else {
				boolean existe = false;
				for (CategoriaCorrida cc : lsCategoriaCorrida) {
					if (cc.getActivo() && cc.getCorridaCtrl().equals(corrida)) {
						existe = true;
					}
				}
				if (!existe) {
					CategoriaCorrida cc = new CategoriaCorrida();
					cc.setCategoriaCtrl(categoriaCtrl);
					cc.setActivo(Boolean.TRUE);
					cc.setFecmodif(Calendar.getInstance().getTime());
					cc.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					cc.setCorridaCtrl(corrida);
					lsCategoriaCorrida.add(cc);
					categoriaCorridaList.addItemNovo(cc);
					categoriaCtrl.setCategoriaCorridaList(lsCategoriaCorrida);
				} else {
					Messagebox.show(
							Labels.getLabel("MSG.Registro.Existe"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverCorrida(Event ev) {
		try {
			CategoriaCorrida cCorrida = (CategoriaCorrida) categoriaCorridaList.getSelected();
			if (cCorrida != null) {
				lsCategoriaCorrida.remove(cCorrida);
				cCorrida.setFecmodif(Calendar.getInstance().getTime());
				cCorrida.setActivo(Boolean.FALSE);
				cCorrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				categoriaCorridaList.removeItem(cCorrida);
				categoriaCorridaService.borrar(cCorrida);
				// categoriaCtrl.setCategoriaCorridaList(lsCategoriaCorrida);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarMercado(Event ev) throws InterruptedException {
		if (cmbParadaOrigem.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbParadaOrigem.focus();
			return;
		}
		if (cmbParadaDestino.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbParadaDestino.focus();
			return;
		}
		cmbParadaOrigem.getSelectedItem().getValue();
		cmbParadaDestino.getSelectedItem().getValue();
		try {
			if (cmbParadaOrigem.getSelectedItem().getValue() != cmbParadaDestino.getSelectedItem().getValue()) {

				CategoriaMercado cMercado = new CategoriaMercado();
				cMercado.setCategoriaCtrl(categoriaCtrl);
				cMercado.setActivo(Boolean.TRUE);
				cMercado.setOrigem((Parada) cmbParadaOrigem.getSelectedItem().getValue());
				cMercado.setDestino((Parada) cmbParadaDestino.getSelectedItem().getValue());
				cMercado.setFecmodif(Calendar.getInstance().getTime());
				cMercado.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				boolean existe = false;
				for (CategoriaMercado cc : lsCategoriaMercado) {
					if (cc.getActivo() && cc.getOrigem().equals(cMercado.getOrigem()) && cc.getDestino().equals(cMercado.getDestino())) {
						existe = true;
					}
				}
				if (!existe) {
					lsCategoriaMercado.add(cMercado);
					categoriaMercadoList.addItemNovo(cMercado);
					categoriaCtrl.setCategoriaMercadoList(lsCategoriaMercado);
				} else {
					Messagebox.show(
							Labels.getLabel("MSG.Registro.Existe"),
							Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItemDiferente"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverMercado(Event ev) {
		try {
			CategoriaMercado cMercado = (CategoriaMercado) categoriaMercadoList.getSelected();
			if (cMercado != null) {
				lsCategoriaMercado.remove(cMercado);
				cMercado.setFecmodif(Calendar.getInstance().getTime());
				cMercado.setActivo(Boolean.FALSE);
				cMercado.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				categoriaMercadoList.updateItem(cMercado);
				categoriaMercadoList.removeItem(cMercado);
				lsCategoriaMercado.add(cMercado);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarClase(Event ev) throws InterruptedException {
		if (cmbClase.getSelectedItem() == null) {
			Messagebox.show(
					Labels.getLabel("MSG.Error.combobox"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			cmbClase.focus();
			return;
		}
		cmbClase.getSelectedItem().getValue();
		try {
			boolean existe = false;
			for (CategoriaClase cc : lsCategoriaClase) {
				if (cc.getActivo() && cc.getClaseServicio().equals(cmbClase.getSelectedItem().getValue())) {
					existe = true;
				}
			}
			if (!existe) {
				CategoriaClase cClase = new CategoriaClase();
				cClase.setCategoriaCtrl(categoriaCtrl);
				cClase.setActivo(Boolean.TRUE);
				cClase.setClaseServicio((ClaseServicio) cmbClase.getSelectedItem().getValue());
				cClase.setFecmodif(Calendar.getInstance().getTime());
				cClase.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				lsCategoriaClase.add(cClase);
				categoriaClaseList.addItemNovo(cClase);
				categoriaCtrl.setCategoriaClaseList(lsCategoriaClase);
			} else {
				Messagebox.show(
						Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnRemoverClase(Event ev) {
		try {
			CategoriaClase cClase = (CategoriaClase) categoriaClaseList.getSelected();
			if (cClase != null) {
				lsCategoriaClase.remove(cClase);
				cClase.setFecmodif(Calendar.getInstance().getTime());
				cClase.setActivo(Boolean.FALSE);
				cClase.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				categoriaClaseList.updateItem(cClase);
				categoriaClaseList.removeItem(cClase);
				lsCategoriaClase.add(cClase);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarPeriodo(Event ev) {
		try {
			if (categoriaDescuentoList.getSelectedCount() > 0) {
				CategoriaDescuento cd = (CategoriaDescuento) categoriaDescuentoList.getSelected();
				verPeriodoDesconto(cd);
			} else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionCategoriaController.MSG.selectDescuento"),
						Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("",ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCategoriaController.window.title"),
					Messagebox.ERROR);
		}
	}

	public void onClick$radioImp(Event ev) {
		descuentoPorc.setDisabled(true);
		descuentoImporte.setDisabled(false);

		descuentoPorc.setConstraint("");
		descuentoPorc.setValue(BigDecimal.ZERO);
		descuentoImporte.setConstraint("");
		descuentoImporte.setValue(BigDecimal.ZERO);
		descuentoImporte.setConstraint("no empty, no negative");
	}

	public void onClick$radioPor(Event ev) {
		descuentoImporte.setDisabled(true);
		descuentoPorc.setDisabled(false);

		descuentoImporte.setConstraint("");
		descuentoImporte.setValue(BigDecimal.ZERO);
		descuentoPorc.setConstraint("");
		descuentoPorc.setValue(BigDecimal.ZERO);
		descuentoPorc.setConstraint("no empty, no zero, no negative");
	}

	public void onClick$rdVendaAntecipadaSi(Event ev) {
		spnHora.setValue(0);
		spnMinuto.setValue(0);
		lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoDesactivar.value"));
	}

	public void onClick$rdVendaAntecipadaNo(Event ev) {
		spnHora.setValue(0);
		spnMinuto.setValue(0);
		lblMsgTiempo.setValue(Labels.getLabel("editarConfiguracionCategoriaController.lblVentaAntecipadaTempoActivar.value"));
	}

	public void onClick$rdCuotaSi(Event ev) {
		mudarCamposCuota(true);
	}

	private void mudarCamposCuota(boolean visible) {
		rowTrecho.setVisible(visible);
		rowTiempo.setVisible(visible);
		linhaLiberarPoltronasQuandoOnibus.setVisible(visible);
		linhaAssentosReservados.setVisible(visible);
		timeTempoPermitir.setValue(null);
	}

	public void onClick$rdCuotaNo(Event ev) {
		mudarCamposCuota(false);
	}

	public Row getLinhaLiberarPoltronasQuandoOnibus() {
		return linhaLiberarPoltronasQuandoOnibus;
	}

	public void setLinhaLiberarPoltronasQuandoOnibus(Row linhaLiberarPoltronasQuandoOnibus) {
		this.linhaLiberarPoltronasQuandoOnibus = linhaLiberarPoltronasQuandoOnibus;
	}

	public Row getLinhaAssentosReservados() {
		return linhaAssentosReservados;
	}

	public void setLinhaAssentosReservados(Row linhaAssentosReservados) {
		this.linhaAssentosReservados = linhaAssentosReservados;
	}
		
}
