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

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.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.event.EventListener;
import org.zkoss.zk.ui.event.InputEvent;
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.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timebox;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.dao.ConstanteDAO;
import com.rjconsultores.ventaboletos.entidad.Autobus;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.CorridaTramo;
import com.rjconsultores.ventaboletos.entidad.Division;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.EsquemaAsiento;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorridaEmbarqueDesembarque;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorridaInfo;
import com.rjconsultores.ventaboletos.entidad.EsquemaOperacional;
import com.rjconsultores.ventaboletos.entidad.EsquemaTramo;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.ParadaEsquema;
import com.rjconsultores.ventaboletos.entidad.RolOperativo;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaEmbarqueDesembarque;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoServicio;
import com.rjconsultores.ventaboletos.service.AsientoExclusivoService;
import com.rjconsultores.ventaboletos.service.AutobusService;
import com.rjconsultores.ventaboletos.service.BoletoService;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.CorridaInfoService;
import com.rjconsultores.ventaboletos.service.CorridaService;
import com.rjconsultores.ventaboletos.service.CorridaTramoService;
import com.rjconsultores.ventaboletos.service.DisponibilidadService;
import com.rjconsultores.ventaboletos.service.DivisionService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EsquemaCorridaEmbarqueDesembarqueService;
import com.rjconsultores.ventaboletos.service.EsquemaCorridaInfoService;
import com.rjconsultores.ventaboletos.service.EsquemaCorridaService;
import com.rjconsultores.ventaboletos.service.EsquemaTramoService;
import com.rjconsultores.ventaboletos.service.IntegracaoTotvsService;
import com.rjconsultores.ventaboletos.service.MarcaClaseServicioService;
import com.rjconsultores.ventaboletos.service.MarcaService;
import com.rjconsultores.ventaboletos.service.RolOperativoService;
import com.rjconsultores.ventaboletos.service.RutaCombinacionService;
import com.rjconsultores.ventaboletos.service.RutaEmbarqueDesembarqueService;
import com.rjconsultores.ventaboletos.service.RutaSecuenciaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TramoServicioService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.TarefaGeracaoCorridaVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.MyComboRutaRenderer;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionCorridaTramo;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCorridaInfomacaoTramo;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEsquemaCorridaEmbarqueDesembarque;

/**
 * 
 * @author Rafius
 */
@Controller("editarCorridaController")
@Scope("prototype")
public class EditarCorridaController extends MyGenericForwardComposer {

	private static final int PERIODO_MAXIMO_90_DIAS = 90;
	private static Logger log = LogManager.getLogger(EditarCorridaController.class);
	private static final long serialVersionUID = 1L;
	//Services
	@Autowired
	private EsquemaCorridaService esquemaCorridaService;
	@Autowired
	private EsquemaTramoService esquemaTramoService;
	@Autowired
	private MarcaService marcaService;
	@Autowired
	private ClaseServicioService claseService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private RutaCombinacionService rutaCombinacionService;
	@Autowired
	private RutaSecuenciaService rutaSecuenciaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private MarcaClaseServicioService marcaClaseServicioService;
	@Autowired
	private AutobusService autobusService;	
	@Autowired
	private RolOperativoService rolOperativoService;
	@Autowired
	private BusquedaCorridaController busquedaCorridaController;
	@Autowired
	private TramoServicioService tramoServicioService;
	@Autowired
	CorridaService corridaService;
	@Autowired
	private CorridaInfoService corridaInfoService;
	@Autowired
	private AsientoExclusivoService asientoExclusivoService;
	@Autowired
	private DisponibilidadService disponibilidadService;
	@Autowired
	private IntegracaoTotvsService integracaoTotvsService;
	@Autowired
	BoletoService boletoService;
	@Autowired
	private RutaEmbarqueDesembarqueService rutaEmbarqueDesembarqueService;
	@Autowired
	private EsquemaCorridaEmbarqueDesembarqueService esquemaCorridaEmbarqueDesembarqueService;
	
	private DivisionService divisionService;
	@Autowired
	private EsquemaCorridaInfoService esquemaCorridaInfoService;
	
	@Autowired
	private ConstanteService constanteService;
	@Autowired
	private CorridaTramoService corridaTramoService;
	
	//Radio
	private Radio porBloq;
	private Radio latente;
	private Radio autorizada;
	private Radio cancelada;
	private Radio sentado;
	private Radio emPe;
	private Radio naoVende;
	private Radio fletes;
	private Radio viajesEspeciales;
	private Radio transportePasajeros;
	private Radio rdImprimeBPE;
	private Radio rdNaoImprimeBPE;
	//MyListbox
	private MyListbox esquemaCorridaList;
	private MyListbox esquemaTramoList;
	private MyListbox esquemaCorridaEmbarqueDesembarqueListbox;
	private MyListbox lstTrechosInformacaoCorridaListbox;
	//Datebox
	private Datebox fecniciovigencia;
	private Datebox fecfinvigencia;
	//Spinner
	private Spinner minutos;
	private Spinner txtHorasParaConfirmacao;
	private Spinner txtMinutosParaConfirmacao;
	private Spinner txtHorasAutomacaoDE;
	private Spinner txtMinutosAutomacaoDE;
	private Spinner txtHorasAutomacaoATE;
	private Spinner txtMinutosAutomacaoATE;
	//Intbox
	private Intbox txtNumCorrida;
	private Intbox txtNumCorridaPisoExtra;
	private Intbox txtNumCorridaPisoExtra2;
	private Intbox txtQtdeDiasGeracao;
	private Intbox txtOcupacaoMinima;
	private Intbox txtOcupacaoHorarioExtra;
	private Intbox txtNumCorridaExtraAuto;
	//Combobox
	private Combobox cmbClase;
	private Combobox cmbMarca;
	private Combobox cmbRuta;
	private Combobox cmbEmpresaCorrida;
	private Combobox cmbEmpresaIngresso;
	private Combobox cmbRolOperativo;
	private Combobox cmbStatus;
	private Combobox cmbVia;
	private Combobox cmbTramo;
	private Combobox cmbDivision;
	private Combobox cmbIndGeneraFeriado;
	private Combobox cmbEmbarqueDesembarque;
	private Combobox cmbLocalEmbarqueDesembarque;
	private Combobox cmbRolOperativoServicoExtra;
	private Combobox cmbParadaOrigem;
	private Combobox cmbParadaDestino;
	//Button
	private Button btnAsientos;
	private Button btnApagar;
	//Timebox
	private Timebox horasalida;
	private Timebox de;
	private Timebox hasta;
	private Timebox horaIniNaoImpBpe;
	private Timebox horaFimNaoImpBpe;
	//Label
	private Label horasalidaLabel;
	private Label minutosLabel1;
	private Label minutosLabel2;
	private Label horaLabel1;
	private Label horaLabel2;
	private Label horaLabel21;
	private Label horaLabel22;
	private Label lbDivision;
	private Label lbNumCorridaPisoExtra;
	private Label lbNumCorridaPisoExtra2;
	//Textbox
	private Textbox txtIdCorridaRebote;
	private Textbox txtPlataforma;
	private Textbox txtInfoCorrida;
	private Textbox txtMensagemTrecho;
	//Checkbox
	private Checkbox chkDoblePiso;
	private Checkbox chkCorridaExtra;
	private Checkbox lun;
	private Checkbox mar;
	private Checkbox mie;
	private Checkbox jue;
	private Checkbox vie;
	private Checkbox sab;
	private Checkbox dom;
	private Checkbox cbEmbarque;
	private Checkbox cbDesembarque;
	private Checkbox cbVisualizaNaAPI;
	private Checkbox chkBloqueiaCorridaWebAposSaida;
	private Checkbox diaSimDiaNao;
	//List
	private List<Division> lsDivision;
	private List<Empresa> lsEmpresa;
	private List<Empresa> lsEmpresaIngresso;
	private List<Marca> lsMarca;
	private List<ClaseServicio> lsClase;
	private List<Ruta> lsRuta;
	private List<RutaSecuencia> lsRutaSecuencia;
	private List<EsquemaTramo> lsEsquemaTramo;
	private List<EsquemaTramo> lsEsquemaTramoOriginal;
	private List<Autobus> lsAutoBus;
	private List<RolOperativo> lsRolOperativo;
	private List<RutaSecuencia> lsTramosRutaEsquemaCorrida;
	private List<Parada> lsTramos;
	private List<ParadaEsquema> lsParadaEsquema;
	private List<ParadaEsquema> lsParadaEsquemaOrignal;
	private List<RutaEmbarqueDesembarque> lsRutaEmbarqueDesembarque = new ArrayList<RutaEmbarqueDesembarque>();
	private List<EsquemaCorridaEmbarqueDesembarque> lsEsquemaCorridaEmbarqueDesembarqueSelected = new ArrayList<EsquemaCorridaEmbarqueDesembarque>();
	private List<EsquemaCorridaEmbarqueDesembarque> lsEsquemaCorridaEmbarqueDesembarqueBorrar = new ArrayList<EsquemaCorridaEmbarqueDesembarque>();
	private List<EsquemaCorridaInfo> lsEsquemaCorridaInfoSelected; 
	private List<EsquemaCorridaInfo> lsEsquemaCorridaInfoBorrar;
	private List<Parada> lsEmbarqueDesembarque;
	//boolean
	private boolean isPrimeiraVez = true;
	private Boolean embarqueDesembarqueDisabled = true;
	private Boolean isAlteraCorridaJaGerada;
	private Boolean embarque = Boolean.FALSE;
	private Boolean desembarque = Boolean.FALSE;
	private Boolean isVisualizarNaAPI = Boolean.FALSE;
	//Outros objetos
	private EsquemaCorrida esquemaCorrida;
	private Date dataInicialFiltroCorridaExistente;
	private Date dataFinalFiltroCorridaExistente;
	private Date horaSalidaOriginal;

	@Autowired
	private ConstanteDAO constanteDAO;
	
	private Button btnCancelarRetomar;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		txtNumCorrida.setMaxlength(Boolean.valueOf(constanteDAO.buscarPorNomeConstante(Constantes.NUM_VIAJE_9_DIGITOS).getValorconstante()) ? 9 : 7);
		txtNumCorridaPisoExtra.setMaxlength(Boolean.valueOf(constanteDAO.buscarPorNomeConstante(Constantes.NUM_VIAJE_9_DIGITOS).getValorconstante()) ? 9 : 7);
		txtNumCorridaPisoExtra2.setMaxlength(Boolean.valueOf(constanteDAO.buscarPorNomeConstante(Constantes.NUM_VIAJE_9_DIGITOS).getValorconstante()) ? 9 : 7);
		txtNumCorridaExtraAuto.setMaxlength(Boolean.valueOf(constanteDAO.buscarPorNomeConstante(Constantes.NUM_VIAJE_9_DIGITOS).getValorconstante()) ? 9 : 7);
		
		lsEmbarqueDesembarque = new ArrayList<Parada>();
		isPrimeiraVez = true;
		salvar = true;
		cmbRuta.setItemRenderer(new MyComboRutaRenderer());
		popularCombobox(cmbIndGeneraFeriado);
		esquemaCorridaEmbarqueDesembarqueListbox.setItemRenderer(new RenderEsquemaCorridaEmbarqueDesembarque());
		lstTrechosInformacaoCorridaListbox.setItemRenderer(new RenderCorridaInfomacaoTramo());

		esquemaCorrida = (EsquemaCorrida) Executions.getCurrent().getArg().get("esquemaCorrida");
		if (esquemaCorrida.getEsquemacorridaId() != null) {
			esquemaCorrida = esquemaCorridaService.obtenerID(esquemaCorrida.getEsquemacorridaId());
			esquemaCorrida.getEsquemaTramoList();
		}
		esquemaCorridaList = (MyListbox) Executions.getCurrent().getArg().get("esquemaCorridaList");
		busquedaCorridaController = (BusquedaCorridaController) Executions.getCurrent().getArg().get("busquedaCorridaController");

		Boolean ehEsquemaAgrupacion = (Boolean) Executions.getCurrent().getArg().get("ehEsquemaAgrupacion") == null ? Boolean.FALSE : (Boolean) Executions.getCurrent().getArg().get("ehEsquemaAgrupacion");

		lsParadaEsquema = new ArrayList<ParadaEsquema>();

		lsEmpresa = new ArrayList<Empresa>();
		lsEmpresa.addAll(UsuarioLogado.getUsuarioLogado().getEmpresa());

		lsEmpresaIngresso = new ArrayList<Empresa>();
		lsEmpresaIngresso.addAll(UsuarioLogado.getUsuarioLogado().getEmpresa());

		lsClase = claseService.buscarTodosExceto(-1);

		lsRolOperativo = rolOperativoService.obtenerTodos();
		
		lsAutoBus = autobusService.obtenerTodos();
		
		lsEsquemaCorridaInfoSelected = new ArrayList<EsquemaCorridaInfo>();
		lsEsquemaCorridaInfoBorrar = new ArrayList<EsquemaCorridaInfo>();
		
		if (esquemaCorrida.getEsquemacorridaId() != null) {
			
			// 01 - não se pode mudar dados básicos da corrida.
			// 02 - Segundo a Lety os campos CLASE, MARCA E EMPRESAS...
			// Poderão ser editados pelo usuario.
			// RUTA permanece inalterado.
			
			if (esquemaCorrida.getRuta() != null) {
				lsRutaEmbarqueDesembarque = rutaEmbarqueDesembarqueService.obtenerPorRuta(esquemaCorrida.getRuta());
			}
			lsEsquemaCorridaEmbarqueDesembarqueSelected = esquemaCorridaEmbarqueDesembarqueService.obtenerPorEsquemaCorrida(esquemaCorrida);
			lsEsquemaCorridaInfoSelected = esquemaCorridaInfoService.obtenerPorEsquemaCorrida(esquemaCorrida);

			esquemaCorridaEmbarqueDesembarqueListbox.setData(lsEsquemaCorridaEmbarqueDesembarqueSelected);
			lstTrechosInformacaoCorridaListbox.setData(lsEsquemaCorridaInfoSelected);
			horaSalidaOriginal = esquemaCorrida.getHorasalida();
			if (esquemaCorrida.getRuta() != null) {
				embarqueDesembarqueDisabled = false;
			}
			
			if (ehEsquemaAgrupacion) {
				fecniciovigencia.setDisabled(Boolean.TRUE);
				fecfinvigencia.setDisabled(Boolean.TRUE);
				txtQtdeDiasGeracao.setDisabled(Boolean.TRUE);
				horasalida.setDisabled(Boolean.TRUE);
				cmbIndGeneraFeriado.setDisabled(Boolean.TRUE);
				chkDoblePiso.setDisabled(Boolean.TRUE);

				lun.setDisabled(Boolean.TRUE);
				mar.setDisabled(Boolean.TRUE);
				mie.setDisabled(Boolean.TRUE);
				jue.setDisabled(Boolean.TRUE);
				vie.setDisabled(Boolean.TRUE);
				sab.setDisabled(Boolean.TRUE);
				dom.setDisabled(Boolean.TRUE);

			}

			cmbClase.setDisabled(Boolean.TRUE);
			cmbMarca.setDisabled(Boolean.TRUE);
			cmbRuta.setDisabled(Boolean.TRUE);
			cmbEmpresaCorrida.setDisabled(Boolean.TRUE);
			cmbEmpresaIngresso.setDisabled(Boolean.TRUE);
			txtNumCorrida.setDisabled(Boolean.TRUE);
			chkCorridaExtra.setDisabled(Boolean.TRUE);

			if (esquemaCorrida.getIndGeneraFeriado() != null) {
				if (esquemaCorrida.getIndGeneraFeriado().equals("S")) {
					cmbIndGeneraFeriado.setSelectedIndex(0);
				} else if (esquemaCorrida.getIndGeneraFeriado().equals("F")) {
					cmbIndGeneraFeriado.setSelectedIndex(1);
				} else if (esquemaCorrida.getIndGeneraFeriado().equals("N")) {
					cmbIndGeneraFeriado.setSelectedIndex(2);
				}
			}

			if (esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) {
				chkDoblePiso.setChecked(true);
				lbNumCorridaPisoExtra.setVisible(Boolean.TRUE);
				txtNumCorridaPisoExtra.setVisible(Boolean.TRUE);
				
				lbNumCorridaPisoExtra2.setVisible(Boolean.TRUE);
				txtNumCorridaPisoExtra2.setVisible(Boolean.TRUE);
			}
			
			//FlexBus
			txtHorasParaConfirmacao.setValue(esquemaCorrida.getHorasParaConfirmacao());
			txtMinutosParaConfirmacao.setValue(esquemaCorrida.getMinutosParaConfirmacao());
			txtOcupacaoMinima.setValue(esquemaCorrida.getOcupacaoMinima());
			
			//Automatizacao de horario extra
			txtOcupacaoHorarioExtra.setValue(esquemaCorrida.getTaxaOcupacao());
			txtHorasAutomacaoDE.setValue(esquemaCorrida.getHorasAutomacaoHEDe());
			txtMinutosAutomacaoDE.setValue(esquemaCorrida.getMinutosAutomacaoHEDe());
			txtHorasAutomacaoATE.setValue(esquemaCorrida.getHorasAutomacaoHEAte());
			txtMinutosAutomacaoATE.setValue(esquemaCorrida.getMinutosAutomacaoHEAte());
		}

		// Llena los valores de los combos
		llenarRutasPorClase();
		llenarMarcaPorClaseServicio();

		esquemaTramoList.setItemRenderer(new RenderConfiguracionCorridaTramo(esquemaCorrida.getHorasalida()));
		esquemaTramoList.addEventListener("onDoubleClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				ParadaEsquema pe = (ParadaEsquema) esquemaTramoList.getSelected();
				EsquemaTramo esquemaTramo = null;

				for (EsquemaTramo et : lsEsquemaTramo) {
					Parada origem = et.getTramo().getOrigem();

					if (origem.equals(pe.getParada())) {
						esquemaTramo = et;
						esquemaTramo.setPlataforma(pe.getPlataforma());
					}
				}

				verTempoEstanciaTramo(esquemaTramo, pe, (short) esquemaTramoList.getItemCount());
			}
		});

		try {
			lsEsquemaTramo = new ArrayList<EsquemaTramo>();

			if (esquemaCorrida.getEsquemacorridaId() == null) {
				EsquemaOperacional eo = new EsquemaOperacional();
				eo.setActivo(Boolean.TRUE);
				eo.setFecmodif(Calendar.getInstance().getTime());
				eo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				esquemaCorrida.setEsquemaOperacional(eo);

				transportePasajeros.setChecked(Boolean.TRUE);
			} else {
				esquemaCorridaService.obtenerID(esquemaCorrida.getEsquemacorridaId());

				esquemaCorrida.getEsquemaOperacional();

				porBloq.setVisible(false);

				if (esquemaCorrida.getStatusCorrida() != null) {
					if (esquemaCorrida.getStatusCorrida().equals("L")) {
						latente.setChecked(true);
					} else if (esquemaCorrida.getStatusCorrida().equals("A")) {
						autorizada.setChecked(true);
					} else {
						cancelada.setChecked(true);
					}

					if (esquemaCorrida.getTipocorrida().equals("F")) {
						fletes.setChecked(true);
					} else if (esquemaCorrida.getTipocorrida().equals("S")) {
						viajesEspeciales.setChecked(true);
					} else {
						transportePasajeros.setChecked(true);
					}

				}
				lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida);
				lsEsquemaTramoOriginal = new ArrayList<EsquemaTramo>();
				for (EsquemaTramo esquemaTramo : lsEsquemaTramoOriginal) {
					lsEsquemaTramoOriginal.add(esquemaTramo.clone());
				}
				//lsEsquemaTramoOriginal.addAll(lsEsquemaTramo);
				carregarParadaSecuencia(lsEsquemaTramo);
				lsParadaEsquemaOrignal = new ArrayList<ParadaEsquema>();
				for (ParadaEsquema paradaEsquema : lsParadaEsquema) {
					lsParadaEsquemaOrignal.add(paradaEsquema.clone());
				}
				//lsParadaEsquemaOrignal.addAll(lsParadaEsquema);
				selecionarRutaSequenciaForaEsqCorrida();
			}

			fecniciovigencia.focus();

			horasalida.setVisible(true);
			horasalidaLabel.setVisible(true);
			minutos.setVisible(false);
			minutosLabel1.setVisible(false);
			minutosLabel2.setVisible(false);
			de.setVisible(false);
			horaLabel1.setVisible(false);
			horaLabel2.setVisible(false);
			hasta.setVisible(false);
			horaLabel21.setVisible(false);
			horaLabel22.setVisible(false);

			if (esquemaCorrida.getEsquemacorridaId() == null) {
				btnApagar.setVisible(Boolean.FALSE);
			}

			if (esquemaCorrida.getEsquemaCorridaRebote() != null) {
				txtIdCorridaRebote.setValue(esquemaCorrida.getEsquemaCorridaRebote().getEsquemacorridaId().toString());

			}

			exibirDivision();
			setSelecaoCboBPE();
			alterarBotaoRetomarCancelar();
			
		} catch (Exception ex) {
			log.error("Error al editar una corrida", ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}
	
    public void selecionarHorarioNãoImpBPE() {
        if (rdImprimeBPE.isChecked()) {
        	horaFimNaoImpBpe.setReadonly(true);
        	horaFimNaoImpBpe.setDisabled(true);
        	horaIniNaoImpBpe.setReadonly(true);
        	horaIniNaoImpBpe.setDisabled(true);
        } else if (rdNaoImprimeBPE.isChecked()) {
        	horaFimNaoImpBpe.setReadonly(false);
        	horaFimNaoImpBpe.setDisabled(false);
        	horaIniNaoImpBpe.setReadonly(false);
        	horaIniNaoImpBpe.setDisabled(false);
        }
    }
    
    private void setSelecaoCboBPE() {
        if (esquemaCorrida.getIndNaoImprimeBpe() == null || esquemaCorrida.getIndNaoImprimeBpe().equals("0")) {
        	rdImprimeBPE.setChecked(true);
        } else {
        	rdNaoImprimeBPE.setChecked(true);
        }
        selecionarHorarioNãoImpBPE();
    }
    
    public void onClick$rdgNaoImprimeViaBPE(Event event) {
        String option = rdImprimeBPE.isChecked() ? "0" : "1";
        
        if (option.equals("0")) {
        	esquemaCorrida.setIndNaoImprimeBpe("0");
        } else if (option.equals("1")) {
        	esquemaCorrida.setIndNaoImprimeBpe("1");
        }
        setSelecaoCboBPE();
    }
       
	public void onClick$btnCopiar(Event ev) {
		try {
			if (esquemaCorrida.getEsquemacorridaId() != null) {
				// Carregar campos lazy
				esquemaCorrida = esquemaCorridaService.obtenerID(esquemaCorrida.getEsquemacorridaId());
				esquemaCorrida.clonar();
				esquemaCorrida = esquemaCorrida.getCloneObject();
				
				txtNumCorrida.setConstraint("");
				txtNumCorrida.setDisabled(false);
				txtNumCorrida.setText("");
				txtNumCorrida.setConstraint("no empty");
				chkCorridaExtra.setDisabled(Boolean.FALSE);
				
				esquemaCorrida.setEsquemacorridaId(null);
				esquemaCorrida.setNumCorrida(null);
				for (EsquemaTramo esquemaTramo : esquemaCorrida.getEsquemaTramoList()) {
					esquemaTramo.setEsquematramoId(null);
					esquemaTramo.setEsquemaCorrida(esquemaCorrida);
				}
				
				for (EsquemaAsiento esquemaAsiento : esquemaCorrida.getEsquemaAsientoList()) {
					esquemaAsiento.setEsquemaasientoId(null);
					esquemaAsiento.setEsquemaCorrida(esquemaCorrida);
				}
				
				for (EsquemaCorridaEmbarqueDesembarque esquemaCorridaEmbarqueDesembarque : esquemaCorrida.getLsEsquemaCorridaEmbarqueDesembarque()) {
					esquemaCorridaEmbarqueDesembarque.setEsquemaCorridaEmbarqueDesembarqueId(null);
					esquemaCorridaEmbarqueDesembarque.setEsquemaCorrida(esquemaCorrida);
				}
				
				tratarEsquemaTramoList();
			}
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
	}

	private void tratarEsquemaTramoList() {
		lsEsquemaTramo.clear();
		lsEsquemaTramo.addAll(esquemaCorrida.getEsquemaTramoList());
		Collections.sort(lsEsquemaTramo);
		esquemaCorrida.setEsquemaTramoList(lsEsquemaTramo);
	}

	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 (EsquemaCorrida.GerarFeriado p : EsquemaCorrida.GerarFeriado.values()) {
			Comboitem comboItem = new Comboitem(p.descricao());
			comboItem.setValue(p.valor());
			comboItem.setParent(cmb);
		}

		cmb.setSelectedIndex(0);

	}

	private void exibirDivision() {
		if (ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.EXIBIR_DIVISION_CONFIGURACION_CORRIDA.getDescricao())) {

			lsDivision = divisionService.obtenerTodos();

			lbDivision.setVisible(Boolean.TRUE);
			cmbDivision.setVisible(Boolean.TRUE);

		}
	}

	private void addTramoPardaEsquema(Parada parada, Short numsecuencia, Date tiempoEstancia, String plataforma, Date excepcionRecorrido, Date defautRecorrido, String tipoPassagem) {
		ParadaEsquema ps = new ParadaEsquema();
		ps.setParada(parada);
		ps.setNumsecuencia(numsecuencia);
		ps.setTiempoEstancia(tiempoEstancia);
		ps.setPlataforma(plataforma);
		ps.setExcepcionRecorrido(excepcionRecorrido);
		ps.setPadraoRecorrido(defautRecorrido);
		ps.setTipoPassagem(tipoPassagem);
		
		lsParadaEsquema.add(ps);
	}

	@SuppressWarnings("unused")
	private void carregarParadaSecuencia(List<EsquemaTramo> lsEsquemaTramo) {

		ClaseServicio clase = esquemaCorrida.getClaseServicio();

		lsParadaEsquema.clear();
		if (!lsEsquemaTramo.isEmpty()) {
			List<EsquemaTramo> lsEsquemaTramoTodos = new ArrayList<EsquemaTramo>();
			if (esquemaCorrida.getEsquemacorridaId() != null) {
				lsEsquemaTramoTodos = esquemaTramoService.obtenerAtivosDesativosPorEsquemaCorrida(esquemaCorrida);
			}

			Short numsecuencia = 0;
			
			for (int i = 0; i < lsEsquemaTramo.size(); i++) {

				EsquemaTramo rs = lsEsquemaTramo.get(i);

				Tramo tramo = rs.getTramo();
				numsecuencia = rs.getNumsecuencia();
				Date tiempoEstancia = null;
				if ((i != 0) && (i != (lsEsquemaTramo.size()))) {
					tiempoEstancia = lsEsquemaTramo.get(i).getTiempoEstancia();
				}

				Date excepcionRecorrido = null;
				if (i != (lsEsquemaTramo.size())) {
					excepcionRecorrido = lsEsquemaTramo.get(i).getExcepcionRecorrido();
				}

				Date defautRecorrido = null;
				if (clase != null) {
					List<TramoServicio> lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase);

					if (i != (lsEsquemaTramo.size())) {
						if (!lsTramoServicio.isEmpty()) {
							// soh eh permitido gravar um por classe, get(0):
							defautRecorrido = lsTramoServicio.get(0).getTiemporecorrido();
						}
					}
				}
				String tipoPassagem ="";

				Parada paradaOrigem = tramo.getOrigem();
				tipoPassagem = rs.getTipoPassagem();
				String plataforma = rs.getPlataforma();
				// So adicionar a parada se o EsquemaTramo estiver ativo.
				if (rs.getActivo()) {
					addTramoPardaEsquema(paradaOrigem, numsecuencia, tiempoEstancia, plataforma, excepcionRecorrido, defautRecorrido, tipoPassagem);
				}
			}

			EsquemaTramo esquemaTramoFinal = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1);

			Parada paradaDestino = esquemaTramoFinal.getTramo().getDestino();
			String tipoPassagem = "";
			String plataforma = txtPlataforma.getValue();
			
			if(!isPrimeiraVez){
				if (sentado.isChecked()) {
					tipoPassagem = "S";
				} else if (emPe.isChecked()) {
					tipoPassagem = "P";
				} else if (naoVende.isChecked()) {
					tipoPassagem = "N";					
				} else {
					tipoPassagem = "A";
				}
			}
			isPrimeiraVez = false;
			Integer num = numsecuencia.intValue() + 1;

			addTramoPardaEsquema(paradaDestino, num.shortValue(), null, plataforma, null, null,tipoPassagem);
		}

		esquemaTramoList.setData(lsParadaEsquema);
	}

	Boolean salvar = true;
	
	@SuppressWarnings({ "deprecation", "unchecked" })
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		
		if(!salvar){
			return;
		}

		salvar = false;
		txtNumCorrida.getValue();
		Date dataDeFecInicioVigencia = fecniciovigencia.getValue();
		Date dataAteFecfinvigencia = fecfinvigencia.getValue();
		
		if(!realizaValidacoes()) {
			return;
		}
		
		for (EsquemaCorridaEmbarqueDesembarque esquemaCorridaEmbarqueDesembarque : lsEsquemaCorridaEmbarqueDesembarqueBorrar) {
			if (esquemaCorridaEmbarqueDesembarque.getEsquemaCorridaEmbarqueDesembarqueId() != null) {				
				esquemaCorridaEmbarqueDesembarqueService.borrar(esquemaCorridaEmbarqueDesembarque);
			}
		}
		
		for (EsquemaCorridaInfo esquemaCorridaInfo : lsEsquemaCorridaInfoBorrar) {
			if (esquemaCorridaInfo.getEsquemaCorridaInfoId() != null) {				
				esquemaCorridaInfoService.borrar(esquemaCorridaInfo);
			}
		}
		//Imprimir ou não recibo BPE na embarcada
		validaNaoImprimeBpe(dataAteFecfinvigencia);


		try {

			dataAteFecfinvigencia.setSeconds(59);

			if(!validaEsquemaTramo(dataDeFecInicioVigencia, dataAteFecfinvigencia)) {
				return;
			} else {
				salvaEsquemaCorrida(dataDeFecInicioVigencia);
			}			
			
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error("", ex);
			Messagebox.show(Labels.getLabel("MSG.Error").concat(" - ").concat(ex.toString()),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	private void validaNaoImprimeBpe(Date dataAteFecfinvigencia) {
		boolean isNaoImprimeBPE = esquemaCorrida.getIndNaoImprimeBpe() == null ? false : esquemaCorrida.getIndNaoImprimeBpe().equals("1");
		if(isNaoImprimeBPE) {
			Date dataDeNaoImpBpe = horaIniNaoImpBpe.getValue();
			Date dataAteNaoImpBpe = horaFimNaoImpBpe.getValue();
			boolean isHoraValida = horaIniNaoImpBpe.getValue() == null || horaFimNaoImpBpe.getValue() == null ? false : true;
			if(isHoraValida) {
				dataDeNaoImpBpe.setSeconds(59);
				dataAteFecfinvigencia.setSeconds(59);
				if(dataDeNaoImpBpe.after(dataAteNaoImpBpe)) {
					esquemaCorrida.setHoraIniNaoImpBPE(buscarHora(dataAteNaoImpBpe));
					esquemaCorrida.setHoraFimNaoImpBPE(buscarHora(dataDeNaoImpBpe));
				} else if(dataDeNaoImpBpe.before(dataAteNaoImpBpe)) {
					esquemaCorrida.setHoraIniNaoImpBPE(buscarHora(dataDeNaoImpBpe));
					esquemaCorrida.setHoraFimNaoImpBPE(buscarHora(dataAteNaoImpBpe));
				} else {
					esquemaCorrida.setIndNaoImprimeBpe("0");
					setSelecaoCboBPE();
				}
			} else {
				esquemaCorrida.setIndNaoImprimeBpe("0");
				setSelecaoCboBPE();
			}
		}

		if (chkDoblePiso.isChecked()) {
			txtNumCorridaPisoExtra.getValue();
			txtNumCorridaPisoExtra2.getValue();
		}
	}
	
	private boolean validaEsquemaTramo(Date dataDeFecInicioVigencia, Date dataAteFecfinvigencia ) throws InterruptedException {
		Comboitem ciRuta = cmbRuta.getSelectedItem();
		Ruta ruta = null;
		if (ciRuta != null) {
			ruta = (Ruta) ciRuta.getValue();
		}

		if (chkDoblePiso.isChecked() && !validarPisoExtra()) {
			salvar = true;
			return false;
		}
		
		if (dataDeFecInicioVigencia.after(dataAteFecfinvigencia)) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.busquedaPeriodo"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if(ruta==null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.RutaVazia"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if(lsEsquemaTramo.isEmpty()) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.RutaSemTramos"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;

		}
		
		if (esquemaCorrida.getClaseServicio() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Clase"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		} else if (esquemaCorrida.getMarca() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Marca"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		} else if (esquemaCorrida.getRuta() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Ruta"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
		} else if (esquemaCorrida.getEmpresa() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Empresa"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		} else if (esquemaCorrida.getEmpresa1() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Empresa1"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		} else if (esquemaCorrida.getRolOperativo() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.Rol"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		}
		
		return true;
	}

	private void salvaEsquemaCorrida(Date dataDeFecInicioVigencia) throws InterruptedException {
		//FlexBus
		if(esquemaCorrida.getIsFlexBus()) {
			esquemaCorrida.setHorasParaConfirmacao(txtHorasParaConfirmacao.getValue());
			esquemaCorrida.setMinutosParaConfirmacao(txtMinutosParaConfirmacao.getValue());
			esquemaCorrida.setOcupacaoMinima(txtOcupacaoMinima.getValue());
		} else {
			esquemaCorrida.setHorasParaConfirmacao(null);
			esquemaCorrida.setMinutosParaConfirmacao(null);
			esquemaCorrida.setOcupacaoMinima(null);
		}

		//Automacao Horario Extra
		if(esquemaCorrida.getIsAutomacaoHorarioExtra()) {
			esquemaCorrida.setHorasAutomacaoHEDe(txtHorasAutomacaoDE.getValue() == null ? 0 : txtHorasAutomacaoDE.getValue());
			esquemaCorrida.setMinutosAutomacaoHEDe(txtMinutosAutomacaoDE.getValue()  == null ? 0 : txtMinutosAutomacaoDE.getValue());
			esquemaCorrida.setHorasAutomacaoHEAte(txtHorasAutomacaoATE.getValue() == null ? 0 : txtHorasAutomacaoATE.getValue());
			esquemaCorrida.setMinutosAutomacaoHEAte(txtMinutosAutomacaoATE.getValue() == null ? 0 : txtMinutosAutomacaoATE.getValue());
			esquemaCorrida.setTaxaOcupacao(txtOcupacaoHorarioExtra.getValue() == null ? 0 : txtOcupacaoHorarioExtra.getValue() );
			esquemaCorrida.setNumCorridaServicoExtra(txtNumCorridaExtraAuto.getValue());
			
			esquemaCorrida.setHorasalidaExtra(buscarHora(esquemaCorrida.getHorasalidaExtra()));
		} 

		if (porBloq.isChecked()) {
			de.getValue();
			hasta.getValue();
			minutos.getValue();
		} else {
			horasalida.getValue();
		}

		esquemaCorrida.setInfoCorrida(txtInfoCorrida.getValue());
		esquemaCorrida.setIndCorridaExtra(chkCorridaExtra.isChecked());
		esquemaCorrida.setNumCorrida(txtNumCorrida.getValue());
		esquemaCorrida.setActivo(Boolean.TRUE);
		esquemaCorrida.setFecmodif(Calendar.getInstance().getTime());
		esquemaCorrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		esquemaCorrida.setIndBloqueiaWebAposSaida(chkBloqueiaCorridaWebAposSaida.isChecked());

		esquemaCorrida.setDiagramaAutobusId(esquemaCorrida.getRolOperativo().getDiagramaAutobus().getDiagramaautobusId().intValue());

		if (cmbIndGeneraFeriado.getSelectedItem() != null) {
			esquemaCorrida.setIndGeneraFeriado((String) cmbIndGeneraFeriado.getSelectedItem().getValue());
		}

		if (latente.isChecked()) {
			esquemaCorrida.setStatusCorrida("L");
		} else if (autorizada.isChecked()) {
			esquemaCorrida.setStatusCorrida("A");
		} else {
			esquemaCorrida.setStatusCorrida("C");
		}

		if (fletes.isChecked()) {
			esquemaCorrida.setTipocorrida("F");
		} else if (viajesEspeciales.isChecked()) {
			esquemaCorrida.setTipocorrida("S");
		} else if (transportePasajeros.isChecked()) {
			esquemaCorrida.setTipocorrida("P");
		}

		// nao gravar segundos:
		esquemaCorrida.setHorasalida(buscarHora(esquemaCorrida.getHorasalida()));

		List<EsquemaCorrida> lsEC = Collections.EMPTY_LIST;

		if (esquemaCorrida.getEsquemacorridaId() == null) {
			salvaNovoEsquemaCorrida(dataDeFecInicioVigencia, lsEC);
		} else {
			atualizaDadosEsquemaCorrida(lsEC);
		}
	}

	private void atualizaDadosEsquemaCorrida(List<EsquemaCorrida> lsEC) throws InterruptedException {
		boolean podeSalvar = false;
		if ((lsEC.isEmpty())) {
			podeSalvar = true;
		} else {
			for (EsquemaCorrida ec : lsEC) {
				if (ec.getEsquemacorridaId().equals(esquemaCorrida.getEsquemacorridaId())) {
					podeSalvar = true;
				}
			}
		}
		if (podeSalvar) {
			if (!chkDoblePiso.isChecked()) {
				esquemaCorrida.setNumCorridaPisoExtra(null);
			}
			esquemaCorridaService.actualizacion(esquemaCorrida);
			esquemaCorridaService.actualizaEsquemaTramo(lsParadaEsquema, esquemaCorrida);
			if(Boolean.TRUE.equals(isAlteraCorridaJaGerada)) {
				validaRealizaGeracaoCorrida();
			}

			esquemaCorridaList.updateItem(esquemaCorrida);

		} else {
			Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
		}

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

		closeWindow();
	}

	private void validaRealizaGeracaoCorrida() {
		try {
			LocalDate inicioLocalDate = dataInicialFiltroCorridaExistente.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
			LocalDate fimLocalDate = dataFinalFiltroCorridaExistente.toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(1);
			List<TarefaGeracaoCorridaVO> tarefaSucesso = new ArrayList<TarefaGeracaoCorridaVO>(); 
			List<TarefaGeracaoCorridaVO> tarefaErros = new ArrayList<TarefaGeracaoCorridaVO>(); 
			for (LocalDate date = inicioLocalDate; date.isBefore(fimLocalDate); date = date.plusDays(1)) {
				Date dataIter = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());
				try {
					
					Corrida corrida = corridaService.buscarCorridaAtivaPorId(new Corrida.Id(esquemaCorrida.getNumCorrida(),dataIter ));
					List<ParadaEsquema> lsParadaEsquemaRemovidas = new ArrayList<ParadaEsquema>();
					List<ParadaEsquema> lsParadaEsquemaEditadas =new ArrayList<ParadaEsquema>();
					preencheParadaEsquemaRemovidaEEditada(lsParadaEsquemaRemovidas, lsParadaEsquemaEditadas); 
					
					List<ParadaEsquema> lsParadaEsquemaAdicionadasRemovidasOuEditadas = new ArrayList<ParadaEsquema>() ;
					if(lsParadaEsquemaEditadas!=null) {
						lsParadaEsquemaAdicionadasRemovidasOuEditadas.addAll(lsParadaEsquemaEditadas);						
					}
					if(lsParadaEsquemaRemovidas!=null) {
						lsParadaEsquemaAdicionadasRemovidasOuEditadas.addAll(lsParadaEsquemaRemovidas);
					}
					
					//Criado esta validação temporária, pois o a funcionalidade estava causando o seguinte impacto, 
					//quando se era recriado um tramo, esratava unativando a disponibilidade e com isso a disponibilidade ficava incorreta.
					//TODO - Devrea ser retornado neste ponto e remover esta validação e corrigido o problema da disponibilidade
					if(boletoService.isExisteBoletoPorCorrida(esquemaCorrida.getNumCorrida(), dataIter)) {
						String msgErro = "A corrida não será aletrada. Existem vendas para a corrida:" + esquemaCorrida.getNumCorrida() + " na data:" + DateUtil.getStringDate(dataIter);
						log.error("Geração de corrida via Conf. " + msgErro);
						TarefaGeracaoCorridaVO tarefa = new TarefaGeracaoCorridaVO(msgErro, "ERRO", "ERRO");
						tarefaErros.add(tarefa);
						continue;
					}
					
					List<ParadaEsquema> localidadeComVenda =null;
					for (ParadaEsquema paradaEsquema : lsParadaEsquemaAdicionadasRemovidasOuEditadas) {
						if(boletoService.isExisteBoletoPorCorridaOrigemIdOuDestinoId(esquemaCorrida.getNumCorrida(), dataIter, paradaEsquema.getParada().getParadaId(), paradaEsquema.getParada().getParadaId())) {
							if(localidadeComVenda == null) {
								localidadeComVenda = new ArrayList<ParadaEsquema>();
							}
							localidadeComVenda.add(paradaEsquema);
							String msgErro = "Trecho com origem/destino: " + paradaEsquema.getParada().getDescparada() + " não pode ser alterdo" +  ". Existem vendas para essa localidade da corrida:" + esquemaCorrida.getNumCorrida() + " na data:" + DateUtil.getStringDate(dataIter);
							log.error("Geração de corrida via Conf. " + msgErro);
							TarefaGeracaoCorridaVO tarefa = new TarefaGeracaoCorridaVO(msgErro, "ERRO", "ERRO");
							tarefaErros.add(tarefa);
						}
					}
					List<CorridaTramo> corridaTramoList = null;
					//Se nenhuma localidade editada tem venda, recria todos os corridas tramos da corrida
					if(localidadeComVenda==null || localidadeComVenda.isEmpty()) {
						corridaTramoList = corridaTramoService.recriaCorridaTramo(esquemaCorrida, dataIter, lsEsquemaTramo, corrida, lsEsquemaTramoOriginal, horaSalidaOriginal );
					}else {
						List<EsquemaTramo> lsEsquemaTramoIter = new ArrayList<EsquemaTramo>(); 
						List<ParadaEsquema> localidadeComVendaIter = new ArrayList<ParadaEsquema>();
						localidadeComVendaIter.addAll(lsParadaEsquema);
						for (ParadaEsquema paradaEsquemaComVenda : localidadeComVenda) {
							List<ParadaEsquema> listParadaEsquemaComNovaParada = new ArrayList<ParadaEsquema>();
							lsEsquemaTramoIter = adicionarParadaEsquemaTramo(localidadeComVendaIter,paradaEsquemaComVenda.getParada() , esquemaCorrida, (Ruta) cmbRuta.getSelectedItem().getValue(), paradaEsquemaComVenda.getPlataforma(), paradaEsquemaComVenda.getTipoPassagem(), listParadaEsquemaComNovaParada);
							localidadeComVendaIter = listParadaEsquemaComNovaParada;
						}
						corridaTramoList = corridaTramoService.recriaCorridaTramo(esquemaCorrida, dataIter, lsEsquemaTramoIter, corrida, lsEsquemaTramoOriginal, horaSalidaOriginal );
					}
					
					//Caso retorne corridaTramoId preenchido quer dizer que retornou a lista de corridaTramos antiga e a corridaTramo não poderá ser recriada mas os dados da corrida serão editados.
					if(corridaTramoList !=null && !corridaTramoList.isEmpty() && corridaTramoList.get(0).getCorridatramoId() !=null) {
						String msgErro = "Existem vendas para alguma(s) localidade(s) da corrida:" + esquemaCorrida.getNumCorrida() + " na data:" + DateUtil.getStringDate(dataIter) + " que foi(ram) excluída(s) da linha. Os trechos não podem ser alterados.";
						log.error("Geração de corrida via Conf. " + msgErro);
						TarefaGeracaoCorridaVO tarefa = new TarefaGeracaoCorridaVO(msgErro, "ERRO", "ERRO");
						tarefaErros.add(tarefa);
					}
						
					//Valida e apaga corrida caso exista
					TarefaGeracaoCorridaVO tarefaErro= validaApagaCorridaAgerar(esquemaCorrida.getNumCorrida(), dataIter);
					if(tarefaErro !=null) {
						tarefaErros.add(tarefaErro);
						continue;
					}
					
					//Valida e apaga corrida piso extra caso exista
					if(esquemaCorrida.getNumCorridaPisoExtra()!=null) {
						tarefaErro= validaApagaCorridaAgerar(esquemaCorrida.getNumCorridaPisoExtra(), dataIter);
						if(tarefaErro !=null) {
							tarefaErros.add(tarefaErro);
						}
					}
					
					// Gerar corrida novamente.
					List<EsquemaCorrida> esquemaCorridaList = new ArrayList<EsquemaCorrida>();
					esquemaCorridaList.add(esquemaCorrida);
					boolean isAtualizaCorrida =  corrida!=null;
					corridaService.generarCorrida(dataIter, esquemaCorridaList, false, corridaTramoList, isAtualizaCorrida);					
					String msgSucesso = "Corrida para a data " + DateUtil.getStringDate(dataIter) + " gerada com sucesso";
					TarefaGeracaoCorridaVO tarefa = new TarefaGeracaoCorridaVO(msgSucesso, "OK", "OK" );
					tarefaSucesso.add(tarefa);

					
					
				}catch (Exception e) {
					String msgErro = "Erro ao regerar a corrida:" + esquemaCorrida.getNumCorrida() + " para a data:" + DateUtil.getStringDate(dataIter);
					log.error("Geração de corrida via Conf. " + msgErro, e);
					TarefaGeracaoCorridaVO tarefa = new TarefaGeracaoCorridaVO(msgErro, "ERRO", "ERRO");
					tarefaErros.add(tarefa);
				}
			}
			
			Map args = new HashMap();
			dataInicialFiltroCorridaExistente = new Date();
			dataFinalFiltroCorridaExistente = new Date();
			args.put("tarfaSucesso", tarefaSucesso);
			args.put("tarefaErros", tarefaErros);
			Window dialog = (Window)Executions.createComponents(
			            "/gui/esquema_operacional/logGeracaoCorridaViaConfServico.zul", null, args);
					
			dialog.doModal();
		}catch (InterruptedException e) {
			log.error("Erro ao gerar corrida para a corrida: " + esquemaCorrida.getNumCorrida());
		}
	}

	
	/**
	 * Preenche a lista de paradas removidas e a lista de paradas Editadas
	 * 
	 * @param lsParadaEsquemaRemovidas
	 * @param lsParadaEsquemaEditadas
	 */
	private void preencheParadaEsquemaRemovidaEEditada(List<ParadaEsquema> lsParadaEsquemaRemovidas, List<ParadaEsquema> lsParadaEsquemaEditadas) {
		for (ParadaEsquema paradaEsquemaAntiga : lsParadaEsquemaOrignal) {
			boolean isParadaEsquemaNaoRemovida = false;
			for (ParadaEsquema paradaEsquemaNova : lsParadaEsquema) {
				if(paradaEsquemaNova.equals(paradaEsquemaAntiga)) {
					isParadaEsquemaNaoRemovida = true;
					ParadaEsquema paradaEsquemaEditada = validaParadaEsquemaEditada(paradaEsquemaAntiga, paradaEsquemaNova);
					if(paradaEsquemaEditada !=null) {
						if(lsParadaEsquemaEditadas==null) {
							lsParadaEsquemaEditadas = new ArrayList<ParadaEsquema>();
						}
						lsParadaEsquemaEditadas.add(paradaEsquemaEditada);
					}
					break;
				}
			}
			//Se isParadaEsquemaNaoRemovida=false a parada esquema foi removida, adiciona na lista.
			if(!isParadaEsquemaNaoRemovida) {
				if(lsParadaEsquemaRemovidas == null) {
					lsParadaEsquemaRemovidas = new ArrayList<ParadaEsquema>();
				}
				lsParadaEsquemaRemovidas.add(paradaEsquemaAntiga);
			}
		}
	}

	/**
	 * Se editou retorna a parada se não retorna nulo
	 * @param paradaEsquemaAntiga
	 * @param paradaEsquemaNova
	 * @return
	 */
	private ParadaEsquema validaParadaEsquemaEditada(ParadaEsquema paradaEsquemaAntiga, ParadaEsquema paradaEsquemaNova ) {
		boolean  isParadaEsquemaEditada = false;
		//verifica se editou tiempoEstancia
		if(paradaEsquemaAntiga.getTiempoEstancia()!=null && paradaEsquemaNova.getTiempoEstancia()!=null
				&& !paradaEsquemaAntiga.getTiempoEstancia().equals(paradaEsquemaNova.getTiempoEstancia())) {
			isParadaEsquemaEditada = true;
		}
		//verifica se editou excepcionRecorrido
		if(paradaEsquemaAntiga.getExcepcionRecorrido()!=null && paradaEsquemaNova.getExcepcionRecorrido()!=null
				&& !paradaEsquemaAntiga.getExcepcionRecorrido().equals(paradaEsquemaNova.getExcepcionRecorrido())) {
			isParadaEsquemaEditada = true;
		}
		//Verifica se editou Tipo passagem
		if(paradaEsquemaAntiga.getTipoPassagem()!=null && paradaEsquemaNova.getTipoPassagem()!=null
				&& !paradaEsquemaAntiga.getTipoPassagem().equals(paradaEsquemaNova.getTipoPassagem())) {
			isParadaEsquemaEditada = true;
		}
		//Verifica se editou Tipo PLataforma
		if(paradaEsquemaAntiga.getPlataforma()!=null && paradaEsquemaNova.getPlataforma()!=null
				&& !paradaEsquemaAntiga.getPlataforma().equals(paradaEsquemaNova.getPlataforma())) {
			isParadaEsquemaEditada = true;
		}
		//Se editou retorna a parada se não retorna nulo
		if(isParadaEsquemaEditada) {
			return paradaEsquemaNova;
			
		}
		return null;
	}
	
	private TarefaGeracaoCorridaVO validaApagaCorridaAgerar(Integer corridaId, Date dataIter) {
		
		//2 - Apagar corrida caso não exista venda
		Corrida.Id id = new Corrida.Id(corridaId, dataIter);
		//3 - Gerar nova corrida somente se a corrida estiver ativa
		Corrida corrida = corridaService.buscarCorridaAtivaPorId(id);

		if(corrida!=null) {
			try {
				inativaCorridaETabelasRelacionadas(corrida);
			}catch (Exception e) {
				String msgErro = "Erro ao inativar corrida e tabelas relacionadas. Favor verificar ";
				log.error("Geração de corrida via Conf. " + msgErro, e);
				return new TarefaGeracaoCorridaVO(msgErro, "ERRO", "ERRO");
				
			}			
		}
		return null;
	}

	/**
	 * Inativa a corrida e a realção dela com as seguintes tabelas: Corrida_Info, ASIENTO_EXCLUSIVO, Disponibilidad, INTEGRACAO_TOTVS_CORRIDA e corrida
	 * @param corrida
	 */
	private void inativaCorridaETabelasRelacionadas(Corrida corrida) {
		corridaInfoService.borrarByCorrida(corrida);
		asientoExclusivoService.borrarByCorrida(corrida);
		disponibilidadService.borrarByCorrida(corrida);
		integracaoTotvsService.borrarByCorrida(corrida);			
	}

	private void salvaNovoEsquemaCorrida(Date dataDeFecInicioVigencia, List<EsquemaCorrida> lsEC)
			throws InterruptedException {
		Calendar agora = Calendar.getInstance();
		agora.set(agora.get(Calendar.YEAR), agora.get(Calendar.MONTH), agora.get(Calendar.DATE),
				NumberUtils.INTEGER_ZERO, NumberUtils.INTEGER_ZERO, NumberUtils.INTEGER_ZERO);

		dataDeFecInicioVigencia.setSeconds(01);
		if (dataDeFecInicioVigencia.before(agora.getTime())) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.fecha"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK,
					Messagebox.EXCLAMATION);
			salvar = true;
		} else {
			if (lsEC.isEmpty()) {
				Boolean existeNumCorrida = true;
				
				EsquemaCorrida ecor = esquemaCorridaService.buscarPeloNumCorrida(esquemaCorrida.getNumCorrida());
				existeNumCorrida = ecor != null;

				if ((!existeNumCorrida) && !(esquemaCorrida.getNumCorrida().equals(esquemaCorrida.getNumCorridaPisoExtra()))) {
					if (porBloq.isChecked()) {
						Date des = de.getValue();
						Date has = hasta.getValue();
						has.setSeconds(1);
						EsquemaOperacional eo = new EsquemaOperacional();
						Integer numCorrida = esquemaCorrida.getNumCorrida();
						while (des.before(has)) {
							EsquemaCorrida ec = new EsquemaCorrida();
							eo.setActivo(Boolean.TRUE);
							eo.setFecmodif(Calendar.getInstance().getTime());
							eo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

							Date horaSalida = new Date();
							horaSalida.setHours(des.getHours());
							horaSalida.setMinutes(des.getMinutes());
							horaSalida.setSeconds(0);

							ec.setActivo(Boolean.TRUE);
							ec.setFecmodif(Calendar.getInstance().getTime());
							ec.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
							ec.setClaseServicio(esquemaCorrida.getClaseServicio());
							ec.setEmpresa(esquemaCorrida.getEmpresa());
							ec.setEmpresa1(esquemaCorrida.getEmpresa1());

							eo.setFecniciovigencia(esquemaCorrida.getEsquemaOperacional().getFecniciovigencia());
							eo.setFecfinvigencia(esquemaCorrida.getEsquemaOperacional().getFecfinvigencia());

							ec.setEsquemaOperacional(eo);
							ec.setMarca(esquemaCorrida.getMarca());
							ec.setRolOperativo(esquemaCorrida.getRolOperativo());
							ec.setDiagramaAutobusId(esquemaCorrida.getRolOperativo().getDiagramaAutobus().getDiagramaautobusId().intValue());
							ec.setRuta(esquemaCorrida.getRuta());
							ec.setInddomingo(esquemaCorrida.getInddomingo());
							ec.setIndjueves(esquemaCorrida.getIndjueves());
							ec.setIndlunes(esquemaCorrida.getIndlunes());
							ec.setIndmartes(esquemaCorrida.getIndmartes());
							ec.setIndmiercoles(esquemaCorrida.getIndmiercoles());
							ec.setIndsabado(esquemaCorrida.getIndsabado());
							ec.setIndviernes(esquemaCorrida.getIndviernes());
							ec.setStatusCorrida(esquemaCorrida.getStatusCorrida());
							ec.setTipocorrida(esquemaCorrida.getTipocorrida());
							ec.setCantparados(esquemaCorrida.getCantparados());
							ec.setInfoCorrida(esquemaCorrida.getInfoCorrida());
							ec.setHorasalida(horaSalida);
							ec.setIndGeneraFeriado(esquemaCorrida.getIndGeneraFeriado());

							ec.setPisoExtra(esquemaCorrida.getPisoExtra());


							// Salva
							Boolean existeNumCorridaBloco = true;
							while (existeNumCorridaBloco) {
								existeNumCorridaBloco = esquemaCorridaService.buscarNumCorrida(numCorrida, null,false);
								ec.setNumCorrida(numCorrida);
								numCorrida = numCorrida + 1;
							}
							ec = esquemaCorridaService.suscribir(ec);
							esquemaCorridaService.actualizaEsquemaTramo(lsParadaEsquema, ec);

							// Acrescenta Minutos na Hora
							des.setMinutes(des.getMinutes() + minutos.getValue());
						}
					} else {
						EsquemaOperacional eo = new EsquemaOperacional();
						eo.setFecmodif(new Date());
						eo.setUsuarioId(esquemaCorrida.getEsquemaOperacional().getUsuarioId());
						eo.setActivo(Boolean.TRUE);
						eo.setFecniciovigencia(fecniciovigencia.getValue());
						eo.setFecfinvigencia(fecfinvigencia.getValue());
						esquemaCorrida.setEsquemaOperacional(eo);
						esquemaCorridaService.suscribir(esquemaCorrida);

						esquemaCorridaService.actualizaEsquemaTramo(lsParadaEsquema, esquemaCorrida);
					}
					Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.suscribirOK"),
							Labels.getLabel("editarConfiguracionCorridaController.window.title"),
							Messagebox.OK,
							Messagebox.INFORMATION);
					busquedaCorridaController.refreshLista();
					closeWindow();
				} else {
					Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.NumCorrida"),
							Labels.getLabel("editarConfiguracionCorridaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					salvar = true;
				}
			} else {
				Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK,
						Messagebox.EXCLAMATION);
				salvar = true;
			}
		}
	}

	@SuppressWarnings("unchecked")
	private boolean realizaValidacoes() throws InterruptedException {
		
		if(lsParadaEsquema!=null && !lsParadaEsquema.isEmpty()) {
			int resp = Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.desajaAlterarCorridaJaGeradas"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				//chama poupup com filtro de data
				try {
					@SuppressWarnings("rawtypes")
					Map args = new HashMap();
					dataInicialFiltroCorridaExistente = new Date();
					dataFinalFiltroCorridaExistente = new Date();
					args.put("dataInicial", dataInicialFiltroCorridaExistente);
					args.put("dataFinal", dataFinalFiltroCorridaExistente);
					
					 Window dialog = (Window)Executions.createComponents(
				                "/gui/esquema_operacional/filtroDataEdicaoCorrida.zul", null, args);
							Button okBtn = (Button) dialog.getFellow("okBtn");

							okBtn.addEventListener("onClick", new EventListener() {
								@Override
								public void onEvent(Event event) throws Exception {
									try{
										Datebox fecInicial = (Datebox) dialog.getFellow("fecInicio");
										dataInicialFiltroCorridaExistente = fecInicial.getValue();
										Datebox fecFinal = (Datebox) dialog.getFellow("fecFinal");
										dataFinalFiltroCorridaExistente = fecFinal.getValue();
										if(DateUtil.diferencaEntreDatasEmdias(dataInicialFiltroCorridaExistente, dataFinalFiltroCorridaExistente) > PERIODO_MAXIMO_90_DIAS) {
											String msg = Labels.getLabel("MSG.Error.editarConfiguracionCorridaController.erroValidacaoDataEdicaoPeriodoMaximo");
											Messagebox.show(msg, Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);;
											return;
										}
										if(DateUtil.isMenor(dataFinalFiltroCorridaExistente, dataInicialFiltroCorridaExistente)) {
											String msg = Labels.getLabel("MSG.Error.editarConfiguracionCorridaController.erroValidacaoDataFinalMenorDataInicial");
											Messagebox.show(msg, Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);;
											return;
										}
										isAlteraCorridaJaGerada = Boolean.TRUE;
									}catch(Exception e){
										log.error("Erro ao obter data", e);
									}
									dialog.detach();
								}
							});
				        dialog.doModal();
					
					}catch (Exception e) {
						String msg = Labels.getLabel("MSG.Error.editarConfiguracionCorridaController.erroValidacaoDataEdicaoCorridaExistentes") + e.getMessage();
						Messagebox.show(msg, Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
						log.error(msg, e);
						isAlteraCorridaJaGerada = Boolean.FALSE;
				}
			}else {
				isAlteraCorridaJaGerada = Boolean.FALSE;
			}
	
		}
		
		//Linha Destaivada
		if (esquemaCorrida.getRuta().getIndRutaCancelada()) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.rutaDesativadaId")
					.concat(" " + esquemaCorrida.getRuta().getRutaId()+" ")
					.concat(Labels.getLabel("editarCatalogoDeRutaController.msg.rutaDesativadaIdPt2")));
			salvar = true;
			return false;
		}
		
		
		//FlexBus
		if(esquemaCorrida.getIsFlexBus() && (txtHorasParaConfirmacao.getValue() == null || txtMinutosParaConfirmacao.getValue() == null || txtOcupacaoMinima.getValue() == null)) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.inserirInformacoesFlexBus"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		}
		
		//Automacao Horario Extra
		if(esquemaCorrida.getIsAutomacaoHorarioExtra() && (txtHorasAutomacaoDE.getValue() == null || txtOcupacaoHorarioExtra.getValue() == null )) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.inserirInformacoesAutomacaoHorarioExtra"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			salvar = true;
			return false;
		}
		
		String numCorridaString = txtNumCorrida.getValue().toString();
		Integer maxSizeNumCorrida = Boolean.valueOf(constanteDAO.buscarPorNomeConstante("NUM_VIAJE_9_DIGITOS").getValorconstante()) ? 9 : ApplicationProperties.getInstance().maxSizeNumCorrida();
		if (maxSizeNumCorrida != -1) {
			if (numCorridaString.length() > maxSizeNumCorrida) {
				Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.maxSizeNumCorrida").replace("@size", maxSizeNumCorrida.toString()),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK,
						Messagebox.EXCLAMATION);
				salvar = true;
				return false;
			}
		}
		
		if(esquemaCorrida.getIsAutomacaoHorarioExtra() && !validarCorridaExtraAutomatica()) {
			salvar = true;
			return false;
		}
		return true;
	}

	/**
	 * Valida se foi editada ou removida alguma localidade para mostrar opção de alterar corrida já gerada.
	 * @return
	 */
	private boolean isMostraOpcaoAlteracaoCorridaJaGerada() {
		if( esquemaCorrida.getEsquemacorridaId()!=null && lsParadaEsquema!=null && !lsParadaEsquema.isEmpty()) {
			List<ParadaEsquema> lsParadaEsquemaRemovidas = null;
			List<ParadaEsquema> lsParadaEsquemaEditadas =null;
			preencheParadaEsquemaRemovidaEEditada(lsParadaEsquemaRemovidas, lsParadaEsquemaEditadas); 
			if(lsParadaEsquemaRemovidas !=null || lsParadaEsquemaEditadas !=null ) {
				return true;				
			}
		}
		return false;
	}

	private Date buscarHora(Date horasalidaExtra) {
		if (horasalidaExtra != null) {
			GregorianCalendar gHoraSalida = new GregorianCalendar();
			gHoraSalida.setTime(horasalidaExtra);
			gHoraSalida.set(Calendar.SECOND, 0);
			gHoraSalida.set(Calendar.MILLISECOND, 0);
			gHoraSalida.set(Calendar.MONTH, 01);
			gHoraSalida.set(Calendar.DAY_OF_MONTH, 01);
			gHoraSalida.set(Calendar.YEAR, 1970);
			
			return  gHoraSalida.getTime();
		}
		
		return null;
	}

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

			if (resp == Messagebox.YES) {
				esquemaCorridaService.borrar(esquemaCorrida);
				Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.borrarOK"),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				esquemaCorridaList.removeItem(esquemaCorrida);

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

	public void onClick$btnAdicionarTramo(Event ev) {
		try {
			if (cmbTramo.getSelectedItem() != null) {
				String plataforma = txtPlataforma.getValue();
				String tipoPassagem = null;
				
				if (sentado.isChecked()) {
					tipoPassagem = "S";
				} else if (emPe.isChecked()) {
					tipoPassagem = "P";
				} else if (naoVende.isChecked()) {
					tipoPassagem = "N";	
				} else {
					tipoPassagem = "A";
				}
				
				
				
				// Ruta Secuencia
				Parada paradaAlterada = (Parada) cmbTramo.getSelectedItem().getValue();
				List<ParadaEsquema> listParadaEsquemaComNovaParada = new ArrayList<ParadaEsquema>();
				lsEsquemaTramo = adicionarParadaEsquemaTramo(lsParadaEsquema,paradaAlterada , esquemaCorrida, (Ruta) cmbRuta.getSelectedItem().getValue(), plataforma, tipoPassagem, listParadaEsquemaComNovaParada);
				esquemaCorrida.setEsquemaTramoList(lsEsquemaTramo);
				carregarParadaSecuencia(lsEsquemaTramo);
				cmbTramo.setSelectedItem(null);
				selecionarRutaSequenciaForaEsqCorrida();

				txtPlataforma.setValue("");
				
				
			}
		} catch (Exception e) {
			log.error("ESQ CORRIDA - Erro ao adicionar tramo: " + e, e);
			e.printStackTrace();
			onClick$btnAdicionarTramo(null);
		}
	}

	/**
	 * Selecciona las paradas que no estan en la secuencia de la ruta
	 */
	@SuppressWarnings("unchecked")
	private void selecionarRutaSequenciaForaEsqCorrida() {
		if (lsTramosRutaEsquemaCorrida == null) {
			lsTramosRutaEsquemaCorrida = new ArrayList<RutaSecuencia>();
		}
		lsTramosRutaEsquemaCorrida.clear();

		// Ruta Secuencia
		Ruta ruta = esquemaCorrida.getRuta();
		ruta = rutaService.obtenerID(ruta.getRutaId());
		lsRutaSecuencia = rutaSecuenciaService.buscarSecuenciaOrdenado(ruta);

		// Selecciona solamente la secuencia de paradas de los tramos de la
		// secuencia de la ruta
		List<Parada> lstPardasRuta = new ArrayList<Parada>();
		for (RutaSecuencia rs : lsRutaSecuencia) {
			Tramo tramoRS = rs.getTramo();
			lstPardasRuta.add(tramoRS.getOrigem());
		}
		if (!lsRutaSecuencia.isEmpty()) {
			lstPardasRuta.add(lsRutaSecuencia.get(lsRutaSecuencia.size() - 1).getTramo().getDestino());
		}

		// Selecciona solamente la secuencia de paradas de lo esquemTramo
		List<Parada> lstPardasTramos = new ArrayList<Parada>();
		for (EsquemaTramo et : lsEsquemaTramo) {
			if (et.getTramo() != null) {
				Tramo tramoET = et.getTramo();
				lstPardasTramos.add(tramoET.getOrigem());
			}
		}

		if (!lsEsquemaTramo.isEmpty()) {
			lstPardasTramos.add(lsEsquemaTramo.get(lsEsquemaTramo.size() - 1).getTramo().getDestino());
		}

		if (lsTramos == null) {
			lsTramos = new ArrayList<Parada>();
		}
		lsTramos.clear();

		lsTramos.addAll(CollectionUtils.subtract(lstPardasRuta, lstPardasTramos));
		BindingListModelList listModelTramo = new BindingListModelList(
				lsTramos, true);
		cmbTramo.setModel(listModelTramo);
		cmbParadaOrigem.setModel(new BindingListModelList( lstPardasRuta, true));
		cmbParadaDestino.setModel(new BindingListModelList(	lstPardasRuta, true));
		preencheParadaEsquemaOriginal();
	}

	private void preencheParadaEsquemaOriginal() {
		List<EsquemaTramo> lsEsquemaTramoIter = new ArrayList<EsquemaTramo>();
		List<ParadaEsquema> localidadeComVendaIter = new ArrayList<ParadaEsquema>();
		localidadeComVendaIter.addAll(lsParadaEsquema);
		for (Parada parada : lsTramos) {
			List<ParadaEsquema> listParadaEsquemaComNovaParada = new ArrayList<ParadaEsquema>();
			lsEsquemaTramoIter = adicionarParadaEsquemaTramo(localidadeComVendaIter,parada , esquemaCorrida, esquemaCorrida.getRuta(), null, null, listParadaEsquemaComNovaParada);
			localidadeComVendaIter = listParadaEsquemaComNovaParada;
		}
		lsEsquemaTramoOriginal = new ArrayList<EsquemaTramo>();
		lsEsquemaTramoOriginal.addAll(lsEsquemaTramoIter);
		lsParadaEsquemaOrignal = new ArrayList<ParadaEsquema>();
		lsParadaEsquemaOrignal.addAll(localidadeComVendaIter);
	}
	
	private void selecionarRuta() {
		// Ruta Secuencia
		Comboitem ciRuta = cmbRuta.getSelectedItem();
		Ruta ruta = null;
		if (ciRuta != null) {
			ruta = (Ruta) ciRuta.getValue();
		}

		try {
			if (ruta != null) {
				ruta = rutaService.obtenerID(ruta.getRutaId());
				lsRutaSecuencia = rutaSecuenciaService.buscarSecuenciaOrdenado(ruta);

				lsEsquemaTramo = new ArrayList<EsquemaTramo>();
				esquemaTramoList.setData(lsParadaEsquema);
				
				for (RutaSecuencia rs : lsRutaSecuencia) {
					EsquemaTramo et = new EsquemaTramo();
					et.setActivo(Boolean.TRUE);
					et.setFecmodif(Calendar.getInstance().getTime());
					et.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					et.setNumsecuencia(rs.getNumsecuencia());
					et.setTramo(rs.getTramo());
					et.setEsquemaCorrida(esquemaCorrida);

					// Somente quando muda a seleção da Ruta.
					lsEsquemaTramo.add(et);
				}

				esquemaCorrida.setEsquemaTramoList(lsEsquemaTramo);
				carregarParadaSecuencia(lsEsquemaTramo);
				selecionarRutaSequenciaForaEsqCorrida();
				esquemaTramoList.setData(lsParadaEsquema);
				
				lsRutaEmbarqueDesembarque = rutaEmbarqueDesembarqueService.obtenerPorRuta(ruta);
				if (esquemaCorrida.getEsquemacorridaId() == null) {
					for (RutaEmbarqueDesembarque rutaEmbarqueDesembarque : lsRutaEmbarqueDesembarque) {
						selectEsquemaCorridaEmbarqueDesembarque(rutaEmbarqueDesembarque);
					}
				}
				BindingListModelList listModelParadaEmbarqueDesembarque = new BindingListModelList(
						lsRutaEmbarqueDesembarque, true);
				cmbEmbarqueDesembarque.setModel(listModelParadaEmbarqueDesembarque);
				
			} else {
				Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.RutaVazia"),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("", ex);
		}
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	private void verTempoEstanciaTramo(EsquemaTramo et, ParadaEsquema pe, Short sequenciaSize) {
		if (et == null) {
			return;
		}

		Map args = new HashMap();
		args.put("esquemaTramo", et);
		args.put("paradaEsquema", pe);
		args.put("esquemaTramoList", esquemaTramoList);
		args.put("sequenciaSize", sequenciaSize);
		
		openWindow("/gui/esquema_operacional/tiempoEstanciaTramo.zul",
				Labels.getLabel("editarCatalogoDeRutaController.lhTiempoEstancia"), args, MODAL);
	}

	public void onChange$cmbRuta(Event ev) {
		selecionarRuta();
	}

	public void onClick$btnRemoverTramo(Event ev) {
		try {
			ParadaEsquema pe = new ParadaEsquema();
			try {
				pe = (ParadaEsquema) esquemaTramoList.getSelected();
			} catch (Exception e) {
				log.error("Erro ao aliminar ruta do esquemaTramo: " + e, e);
				Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
			if (pe != null) {
				boolean podeExcluir = false;
				if (lsParadaEsquema.size() > 2) {
					for (int i = 0; i < lsParadaEsquema.size(); i++) {
						if (lsParadaEsquema.get(i).getParada().equals(pe.getParada())) {
							ParadaEsquema paradaEsquema = lsParadaEsquema.get(i);
							lsParadaEsquema.remove(paradaEsquema);
							log.debug("Esquema Tramo Removida: " + paradaEsquema.getNumsecuencia() + " - " + paradaEsquema.getParada().getCveparada());
							esquemaTramoList.setData(lsParadaEsquema);
							podeExcluir = true;
							break;
						}
					}
				}
				if (podeExcluir) {
					String ok = esquemaTramoCorrecto(lsParadaEsquema);
					if (ok != null) {
						Messagebox.show(ok,
								Labels.getLabel("editarConfiguracionCorridaController.window.title"),
								Messagebox.OK, Messagebox.EXCLAMATION);
						return;
					}
				}
			} else {
				Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionCorridaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
			lsEsquemaTramo = generaEsquemaTramoCorrecto(lsParadaEsquema, esquemaCorrida);
			selecionarRutaSequenciaForaEsqCorrida();

		} catch (Exception e) {
			log.error("Erro ao remover secuencia da ruta " + e.getMessage(), e);
		}
	}

	/**
	 * Checo se el nuevo reajuste de secuencia quedo valido. O sea, checo se existe en tramo en la tabla ruta_combinacion
	 * 
	 * @param lsParadaEsquema
	 *            - La nueva lista de secuecia (ya con el cambio hecho)
	 * @return - True se esta correcto False se no esta correcto
	 */
	private String esquemaTramoCorrecto(List<ParadaEsquema> lsParadaEsquema) {
		boolean hayTramo = true;

		Parada paradaOrigen = null;
		Parada paradaDestino = null;

		for (int i = 0; (i < lsParadaEsquema.size() - 1) && hayTramo; i++) {
			paradaOrigen = lsParadaEsquema.get(i).getParada();
			paradaDestino = lsParadaEsquema.get(i + 1).getParada();

			Tramo t = rutaCombinacionService.busqueda((Ruta) cmbRuta.getSelectedItem().getValue(), paradaOrigen, paradaDestino);

			hayTramo = (t == null) ? false : true;
		}

		return (hayTramo) ? null : "No existe el tramo: "
				+ paradaOrigen.getDescparada() + " - "
				+ paradaDestino.getDescparada();
	}

	/**
	 * Hago la combinacion correcta en esquemacorrida asi como esta en la lista de parada
	 * 
	 * @param listParadaEsquema
	 * @param ec
	 */
	private List<EsquemaTramo> generaEsquemaTramoCorrecto(
			List<ParadaEsquema> listParadaEsquema, EsquemaCorrida ec) {
		List<EsquemaTramo> result = new ArrayList<EsquemaTramo>();

		for (int i = 0; (i < listParadaEsquema.size() - 1); i++) {
			Parada paradaOrigen = listParadaEsquema.get(i).getParada();
			Parada paradaDestino = listParadaEsquema.get(i + 1).getParada();

			Tramo t = rutaCombinacionService.busqueda((Ruta) cmbRuta.getSelectedItem().getValue(), paradaOrigen, paradaDestino);

			EsquemaTramo et = new EsquemaTramo();
			et.setActivo(Boolean.TRUE);
			et.setEsquemaCorrida(ec);
			et.setFecmodif(Calendar.getInstance().getTime());
			et.setNumsecuencia((short) (i + 1));
			et.setTiempoEstancia(listParadaEsquema.get(i + 1).getTiempoEstancia());
			et.setTramo(t);
			et.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());

			result.add(et);
		}

		return result;
	}

	private List<EsquemaTramo> adicionarParadaEsquemaTramo(
			List<ParadaEsquema> listParadaEsquema, Parada novaParada,
			EsquemaCorrida ec, Ruta ruta, String plataforma, String tipoPassagem, List<ParadaEsquema> listParadaEsquemaComNovaParada) {
		List<EsquemaTramo> result = new ArrayList<EsquemaTramo>();

		lsRutaSecuencia = rutaSecuenciaService.buscarSecuenciaOrdenado(ruta);

		
		Short secuencia = 0;
		boolean nuevoAgregado = false;
		boolean noExisteTramoAsociado = listParadaEsquema.isEmpty();// es la
		// primera
		// vez
		Integer indiceSecuencia = null;
		for (int i = 0; i < lsRutaSecuencia.size(); i++) {
			RutaSecuencia rutaSecuencia = lsRutaSecuencia.get(i);
			if (rutaSecuencia.getTramo().getOrigem().equals(novaParada)) {
				ParadaEsquema paradaEsquema = new ParadaEsquema();
				paradaEsquema.setActivo(Boolean.TRUE);
				secuencia++;
				paradaEsquema.setNumsecuencia(secuencia);
				paradaEsquema.setParada(novaParada);
				paradaEsquema.setPlataforma(plataforma);
				paradaEsquema.setTipoPassagem(tipoPassagem);
				
				listParadaEsquemaComNovaParada.add(paradaEsquema);					
				
				nuevoAgregado = true;
				indiceSecuencia = i;
			} else {
				if (!listParadaEsquema.isEmpty()) {
					if (rutaSecuencia.getTramo().getOrigem().equals(listParadaEsquema.get(0).getParada())) {
						secuencia++;
						listParadaEsquema.get(0).setNumsecuencia(secuencia);

						listParadaEsquemaComNovaParada.add(listParadaEsquema.get(0));							
						
						listParadaEsquema.remove(0);

					}
				}
			}
		}
		
		if (noExisteTramoAsociado) {
			if (indiceSecuencia != null) {
				if ((lsRutaSecuencia.size() - 1) > indiceSecuencia) {
					RutaSecuencia rutaSecuencia = lsRutaSecuencia.get(indiceSecuencia);
					ParadaEsquema paradaEsquema = new ParadaEsquema();
					paradaEsquema.setActivo(Boolean.TRUE);
					secuencia++;
					paradaEsquema.setNumsecuencia(secuencia);
					paradaEsquema.setParada(rutaSecuencia.getTramo().getDestino());
					paradaEsquema.setPlataforma(plataforma);
					listParadaEsquemaComNovaParada.add(paradaEsquema);
				}
			}
		}
		if (!nuevoAgregado) {
			ParadaEsquema paradaEsquema = new ParadaEsquema();
			paradaEsquema.setActivo(Boolean.TRUE);
			secuencia++;
			paradaEsquema.setNumsecuencia(secuencia);
			paradaEsquema.setParada(novaParada);
			paradaEsquema.setPlataforma(plataforma);
			paradaEsquema.setTipoPassagem(tipoPassagem);

			listParadaEsquemaComNovaParada.add(paradaEsquema);
		}
		if (!listParadaEsquema.isEmpty()) {
			secuencia++;
			listParadaEsquema.get(0).setNumsecuencia(secuencia);
			listParadaEsquemaComNovaParada.add(listParadaEsquema.get(0));
			listParadaEsquema.remove(0);
		}

		for (int i = 0; (i < listParadaEsquemaComNovaParada.size() - 1); i++) {
			Parada paradaOrigen = listParadaEsquemaComNovaParada.get(i).getParada();
			Parada paradaDestino = listParadaEsquemaComNovaParada.get(i + 1).getParada();

			Tramo t = rutaCombinacionService.busqueda((Ruta) ruta, paradaOrigen, paradaDestino);
			
			if(t==null) {
				 List<RutaSecuencia> lsr = rutaSecuenciaService.buscarSecuenciaOrdenado(ruta);
				for(RutaSecuencia s : lsr) {
					if(s.tieneOrigen(paradaOrigen.getParadaId()) && s.tieneDestino(paradaDestino.getParadaId())) {
						t =  s.getTramo();
						break;
					}
				}
			}

			EsquemaTramo et = new EsquemaTramo();
			et.setActivo(Boolean.TRUE);
			et.setEsquemaCorrida(ec);
			et.setFecmodif(Calendar.getInstance().getTime());
			et.setNumsecuencia((short) (i + 1));
			et.setTiempoEstancia(listParadaEsquemaComNovaParada.get(i + 1).getTiempoEstancia());
			et.setTramo(t);
			et.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			et.setPlataforma(listParadaEsquemaComNovaParada.get(i).getPlataforma());
			et.setTipoPassagem(listParadaEsquemaComNovaParada.get(i).getTipoPassagem());

			result.add(et);
		}

		return result;
	}

	public void onChange$cmbClase(InputEvent ev) {

		if (ev.isChangingBySelectBack()) {
			return;
		}

		llenarRutasPorClase();
		llenarMarcaPorClaseServicio();
	}

	private void llenarRutasPorClase() {
		if (esquemaCorrida.getClaseServicio() == null) {
			return;
		}
		cmbMarca.setConstraint("");
		if (cmbMarca.getSelectedItem() == null) {
			lsRuta = rutaService.buscarPorClaseServicio(esquemaCorrida.getClaseServicio());
		} else {
			lsRuta = rutaService.buscarPorClaseServicioEmpresa(esquemaCorrida.getClaseServicio(), ((Marca) cmbMarca.getSelectedItem().getValue()).getEmpresa());
		}
		cmbMarca.setConstraint("no empty");

		// caso o usuario tenha mudado a classeServicio da ruta
		if (esquemaCorrida.getEsquemacorridaId() != null && esquemaCorrida.getRuta() != null && !lsRuta.contains(esquemaCorrida.getRuta())) {
			lsRuta.add(esquemaCorrida.getRuta());
		}

		BindingListModelList l = new BindingListModelList(lsRuta, true);
		cmbRuta.setModel(l);
	}

	private void llenarMarcaPorClaseServicio() {
		if (esquemaCorrida.getClaseServicio() == null) {
			return;
		}
		lsMarca = marcaClaseServicioService.buscarPorEmpresasPermitidas(esquemaCorrida.getClaseServicio(), UsuarioLogado.getUsuarioLogado());
		BindingListModelList l = new BindingListModelList(lsMarca, true);
		cmbMarca.setModel(l);
	}

	public void onChange$cmbMarca(InputEvent ev) {

		if (ev.isChangingBySelectBack()) {
			return;
		}
		llenarRutasPorClaseMarca();
	}

	public void llenarRutasPorClaseMarca() {
		if (esquemaCorrida.getClaseServicio() == null
				|| esquemaCorrida.getMarca() == null) {
			return;
		}
		lsRuta = rutaService.buscarPorClaseServicioEmpresa(esquemaCorrida.getClaseServicio(), esquemaCorrida.getMarca().getEmpresa());
		BindingListModelList l = new BindingListModelList(lsRuta, true);
		cmbRuta.setModel(l);
		lsEmpresa.clear();
		for (Empresa e : UsuarioLogado.getUsuarioLogado().getEmpresa()) {
			if (e.getEmpresaId().equals(((Marca) cmbMarca.getSelectedItem().getValue()).getEmpresa().getEmpresaId())) {
				lsEmpresa.add(e);

				break;
			}
		}
		BindingListModelList lb = new BindingListModelList(lsEmpresa, true);
		cmbEmpresaCorrida.setModel(lb);

	}

	public void onClick$porBloq(Event ev) {
		horasalida.setVisible(false);
		horasalidaLabel.setVisible(false);
		minutos.setVisible(true);
		minutosLabel1.setVisible(true);
		minutosLabel2.setVisible(true);
		de.setVisible(true);
		horaLabel1.setVisible(true);
		horaLabel2.setVisible(true);
		hasta.setVisible(true);
		horaLabel21.setVisible(true);
		horaLabel22.setVisible(true);
	}

	public void onClick$porHora(Event ev) {
		horasalida.setVisible(true);
		horasalidaLabel.setVisible(true);
		minutos.setVisible(false);
		minutosLabel1.setVisible(false);
		minutosLabel2.setVisible(false);
		de.setVisible(false);
		horaLabel1.setVisible(false);
		horaLabel2.setVisible(false);
		hasta.setVisible(false);
		horaLabel21.setVisible(false);
		horaLabel22.setVisible(false);
	}

	public void onClick$btnAsientos(Event ev) throws InterruptedException {
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("esquemaCorrida", esquemaCorrida);

		if (esquemaCorrida.getEsquemacorridaId() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.gravarServico"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		openWindow("/gui/esquema_operacional/editarCorridaAsiento.zul",
				Labels.getLabel("editarConfiguracionCorridaAsientoController.window.title"),
				args, MODAL);

	}

	public void onClick$chkDoblePiso(Event ev) {
		if (chkDoblePiso.isChecked()) {
			esquemaCorrida.setPisoExtra(Boolean.TRUE);
			lbNumCorridaPisoExtra.setVisible(Boolean.TRUE);
			txtNumCorridaPisoExtra.setVisible(Boolean.TRUE);
			
			lbNumCorridaPisoExtra2.setVisible(Boolean.TRUE);
			txtNumCorridaPisoExtra2.setVisible(Boolean.TRUE);
			
		} else {
			esquemaCorrida.setPisoExtra(Boolean.FALSE);
			lbNumCorridaPisoExtra.setVisible(Boolean.FALSE);
			txtNumCorridaPisoExtra.setVisible(Boolean.FALSE);

			lbNumCorridaPisoExtra2.setVisible(Boolean.FALSE);
			txtNumCorridaPisoExtra2.setVisible(Boolean.FALSE);
		}
	}

	public ClaseServicioService getClaseService() {
		return claseService;
	}

	public void setClaseService(ClaseServicioService claseService) {
		this.claseService = claseService;
	}

	public EsquemaCorridaService getEsquemaCorridaService() {
		return esquemaCorridaService;
	}

	public void setEsquemaCorridaService(
			EsquemaCorridaService esquemaCorridaService) {
		this.esquemaCorridaService = esquemaCorridaService;
	}

	public EsquemaCorrida getEsquemaCorrida() {
		return esquemaCorrida;
	}

	public void setEsquemaCorrida(EsquemaCorrida esquemaCorrida) {
		this.esquemaCorrida = esquemaCorrida;
	}

	public MyListbox getEsquemaCorridaList() {
		return esquemaCorridaList;
	}

	public void setEsquemaCorridaList(MyListbox esquemaCorridaList) {
		this.esquemaCorridaList = esquemaCorridaList;
	}

	public List<ClaseServicio> getLsClase() {
		return lsClase;
	}

	public void setLsClase(List<ClaseServicio> lsClase) {
		this.lsClase = lsClase;
	}

	public List<Marca> getLsMarca() {
		return lsMarca;
	}

	public void setLsMarca(List<Marca> lsMarca) {
		this.lsMarca = lsMarca;
	}

	public List<Ruta> getLsRuta() {
		return lsRuta;
	}

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

	public MarcaService getMarcaService() {
		return marcaService;
	}

	public void setMarcaService(MarcaService marcaService) {
		this.marcaService = marcaService;
	}

	public RutaService getRutaService() {
		return rutaService;
	}

	public void setRutaService(RutaService rutaService) {
		this.rutaService = rutaService;
	}

	public Combobox getCmbClase() {
		return cmbClase;
	}

	public void setCmbClase(Combobox cmbClase) {
		this.cmbClase = cmbClase;
	}

	public Combobox getCmbMarca() {
		return cmbMarca;
	}

	public void setCmbMarca(Combobox cmbMarca) {
		this.cmbMarca = cmbMarca;
	}

	public Combobox getCmbRuta() {
		return cmbRuta;
	}

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

	public Datebox getFecfinvigencia() {
		return fecfinvigencia;
	}

	public void setFecfinvigencia(Datebox fecfinvigencia) {
		this.fecfinvigencia = fecfinvigencia;
	}

	public Datebox getFecniciovigencia() {
		return fecniciovigencia;
	}

	public void setFecniciovigencia(Datebox fecniciovigencia) {
		this.fecniciovigencia = fecniciovigencia;
	}

	public Timebox getHora() {
		return de;
	}

	public void setHora(Timebox hora) {
		this.de = hora;
	}

	public Timebox getHora2() {
		return hasta;
	}

	public void setHora2(Timebox hora2) {
		this.hasta = hora2;
	}

	public Timebox getHorasalida() {
		return horasalida;
	}

	public void setHorasalida(Timebox horasalida) {
		this.horasalida = horasalida;
	}

	public Spinner getMinutos() {
		return minutos;
	}

	public void setMinutos(Spinner minutos) {
		this.minutos = minutos;
	}

	public Combobox getCmbEmpresaCorrida() {
		return cmbEmpresaCorrida;
	}

	public void setCmbEmpresaCorrida(Combobox cmbEmpresaCorrida) {
		this.cmbEmpresaCorrida = cmbEmpresaCorrida;
	}

	public Combobox getCmbEmpresaIngresso() {
		return cmbEmpresaIngresso;
	}

	public void setCmbEmpresaIngresso(Combobox cmbEmpresaIngresso) {
		this.cmbEmpresaIngresso = cmbEmpresaIngresso;
	}

	public Combobox getCmbRolOperativo() {
		return cmbRolOperativo;
	}

	public void setCmbRolOperativo(Combobox cmbRolOperativo) {
		this.cmbRolOperativo = cmbRolOperativo;
	}

	public Combobox getCmbStatus() {
		return cmbStatus;
	}

	public void setCmbStatus(Combobox cmbStatus) {
		this.cmbStatus = cmbStatus;
	}

	public EmpresaService getEmpresaService() {
		return empresaService;
	}

	public void setEmpresaService(EmpresaService empresaService) {
		this.empresaService = empresaService;
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public List<RutaSecuencia> getLsRutaSecuencia() {
		return lsRutaSecuencia;
	}

	public void setLsRutaSecuencia(List<RutaSecuencia> lsRutaSecuencia) {
		this.lsRutaSecuencia = lsRutaSecuencia;
	}

	public MyListbox getRutaSecuenciaList() {
		return esquemaTramoList;
	}

	public void setRutaSecuenciaList(MyListbox rutaSecuenciaList) {
		this.esquemaTramoList = rutaSecuenciaList;
	}

	public List<RolOperativo> getLsRolOperativo() {
		return lsRolOperativo;
	}

	public void setLsRolOperativo(List<RolOperativo> lsRolOperativo) {
		this.lsRolOperativo = lsRolOperativo;
	}

	public RolOperativoService getRolOperativoService() {
		return rolOperativoService;
	}

	public void setRolOperativoService(RolOperativoService rolOperativoService) {
		this.rolOperativoService = rolOperativoService;
	}

	public Radio getAutorizada() {
		return autorizada;
	}

	public void setAutorizada(Radio autorizada) {
		this.autorizada = autorizada;
	}

	public Radio getCancelada() {
		return cancelada;
	}

	public void setCancelada(Radio cancelada) {
		this.cancelada = cancelada;
	}

	public Radio getLatente() {
		return latente;
	}

	public void setLatente(Radio latente) {
		this.latente = latente;
	}

	public Combobox getCmbVia() {
		return cmbVia;
	}

	public void setCmbVia(Combobox cmbVia) {
		this.cmbVia = cmbVia;
	}

	public Button getBtnAsientos() {
		return btnAsientos;
	}

	public void setBtnAsientos(Button btnAsientos) {
		this.btnAsientos = btnAsientos;
	}

	public Radio getFletes() {
		return fletes;
	}

	public void setFletes(Radio fletes) {
		this.fletes = fletes;
	}

	public Radio getTransportePasajeros() {
		return transportePasajeros;
	}

	public void setTransportePasajeros(Radio transportePasajeros) {
		this.transportePasajeros = transportePasajeros;
	}

	public Radio getViajesEspeciales() {
		return viajesEspeciales;
	}

	public void setViajesEspeciales(Radio viajesEspeciales) {
		this.viajesEspeciales = viajesEspeciales;
	}

	public Combobox getCmbTramo() {
		return cmbTramo;
	}

	public void setCmbTramo(Combobox cmbTramo) {
		this.cmbTramo = cmbTramo;
	}

	public Timebox getDe() {
		return de;
	}

	public void setDe(Timebox de) {
		this.de = de;
	}

	public MyListbox getEsquemaTramoList() {
		return esquemaTramoList;
	}

	public void setEsquemaTramoList(MyListbox esquemaTramoList) {
		this.esquemaTramoList = esquemaTramoList;
	}

	public EsquemaTramoService getEsquemaTramoService() {
		return esquemaTramoService;
	}

	public void setEsquemaTramoService(EsquemaTramoService esquemaTramoService) {
		this.esquemaTramoService = esquemaTramoService;
	}

	public Timebox getHasta() {
		return hasta;
	}

	public void setHasta(Timebox hasta) {
		this.hasta = hasta;
	}

	public List<EsquemaTramo> getLsEsquemaTramo() {
		return lsEsquemaTramo;
	}

	public void setLsEsquemaTramo(List<EsquemaTramo> lsEsquemaTramo) {
		this.lsEsquemaTramo = lsEsquemaTramo;
	}

	public List<Parada> getLsTramos() {
		return lsTramos;
	}

	public void setLsTramos(List<Parada> lsTramos) {
		this.lsTramos = lsTramos;
	}

	public List<Division> getLsDivision() {
		return lsDivision;
	}

	public void setLsDivision(List<Division> lsDivision) {
		this.lsDivision = lsDivision;
	}

	public Combobox getCmbDivision() {
		return cmbDivision;
	}

	public void setCmbDivision(Combobox cmbDivision) {
		this.cmbDivision = cmbDivision;
	}

	public Label getLbDivision() {
		return lbDivision;
	}

	public void setLbDivision(Label lbDivision) {
		this.lbDivision = lbDivision;
	}

	public List<RutaSecuencia> getLsTramosRutaEsquemaCorrida() {
		return lsTramosRutaEsquemaCorrida;
	}

	public void setLsTramosRutaEsquemaCorrida(
			List<RutaSecuencia> lsTramosRutaEsquemaCorrida) {
		this.lsTramosRutaEsquemaCorrida = lsTramosRutaEsquemaCorrida;
	}

	public Radio getPorBloq() {
		return porBloq;
	}

	public void setPorBloq(Radio porBloq) {
		this.porBloq = porBloq;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	public Checkbox getDiaSimDiaNao() {
		return diaSimDiaNao;
	}

	public void setDiaSimDiaNao(Checkbox diaSimDiaNao) {
		this.diaSimDiaNao = diaSimDiaNao;
	}

	public void onClick$btnApagarRebote(Event e) throws InterruptedException {
		esquemaCorrida.setEsquemaCorridaRebote(null);
		txtIdCorridaRebote.setValue("");
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnAbrirEsquemaCorrida(Event e)
			throws InterruptedException {
		if (esquemaCorrida.getEsquemaCorridaRebote() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.btnAbrirEsquemaCorrida.error"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;

		}

		closeWindow();

		Map args = new HashMap();

		args.put("esquemaCorrida", esquemaCorrida.getEsquemaCorridaRebote());
		args.put("esquemaCorridaList", esquemaCorridaList);

		openWindow(
				"/gui/esquema_operacional/editarCorrida.zul",
				Labels.getLabel("editarConfiguracionCorridaController.window.title"),
				args, MODAL);
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void onClick$btnBuscarEsquemaCorrida(Event e) {
		Map argss = new HashMap();

		argss.put("esquemaCorrida", esquemaCorrida);
		argss.put("txtIdCorridaRebote", txtIdCorridaRebote);

		openWindow(
				"/gui/esquema_operacional/busquedaCorridaRebote.zul",
				Labels.getLabel("busquedaConfiguracionCorridaController.window.title"),
				argss, MODAL);
	}

	public void onChange$horasalida(Event e) {
		((RenderConfiguracionCorridaTramo) esquemaTramoList.getItemRenderer()).alterarDataPartida(horasalida.getValue());
		esquemaCorrida.setEsquemaTramoList(lsEsquemaTramo);
		carregarParadaSecuencia(lsEsquemaTramo);
		selecionarRutaSequenciaForaEsqCorrida();
	}

	

	public void onClick$diaSimDiaNao(Event e) throws InterruptedException {
		habilitaDiasDaSemana(diaSimDiaNao.isChecked());
	}

	public void onClick$lun(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$mar(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$mie(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$jue(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$vie(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$sab(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	public void onClick$dom(Event e) throws InterruptedException {
		habilitarDiaSimDiaNao(lun.isChecked(), mar.isChecked(), mie.isChecked(), jue.isChecked(), vie.isChecked(), sab.isChecked(), dom.isChecked());
	}

	private Boolean validarCorridaExtraAutomatica() throws InterruptedException {
		if(txtNumCorridaExtraAuto.getValue() == null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.necessarioInformarCorridaExtra"), 
					Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		EsquemaCorrida esquemaCorrida = esquemaCorridaService.obtenerByEsquemaCorrida(txtNumCorridaExtraAuto.getValue());
		
		if(esquemaCorrida != null) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.corridaJaExiste"), 
					Labels.getLabel("editarConfiguracionCorridaController.window.title"), Messagebox.OK, Messagebox.ERROR);
			return false;
		}
		
		return true;
	}
	
	private Boolean validarPisoExtra() throws InterruptedException {
		Boolean returnValue = true;
		EsquemaCorrida esquemaCorrida = esquemaCorridaService.obtenerByEsquemaCorrida(txtNumCorridaPisoExtra.getValue());
		
		EsquemaCorrida esquemaCorrida2 = null;
		Boolean isPisoExtra2 = txtNumCorridaPisoExtra2.getValue() != null;
		
		if(txtNumCorridaPisoExtra2.getValue() != null) {
			esquemaCorrida2 = esquemaCorridaService.obtenerByEsquemaCorrida(txtNumCorridaPisoExtra2.getValue());
		}


		if (esquemaCorrida == null || (isPisoExtra2 && esquemaCorrida2 == null)) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraExistente"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if (this.esquemaCorrida.equals(esquemaCorrida) || (isPisoExtra2 && this.esquemaCorrida.equals(esquemaCorrida2))) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraIgualServico"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if ((esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) || (isPisoExtra2 && esquemaCorrida2.getPisoExtra() != null && esquemaCorrida2.getPisoExtra())) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraJaEPisoExtra"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if (!esquemaCorrida.getMarca().equals(this.esquemaCorrida.getMarca()) || (isPisoExtra2 && !esquemaCorrida2.getMarca().equals(this.esquemaCorrida.getMarca()))) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraEmpresaDiferente"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if (!esquemaCorrida.getRuta().getOrgaoConcedente().equals(this.esquemaCorrida.getRuta().getOrgaoConcedente()) 
				|| (isPisoExtra2 && !esquemaCorrida2.getRuta().getOrgaoConcedente().equals(this.esquemaCorrida.getRuta().getOrgaoConcedente()))) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraOrgaoDiferente"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if (validarEsquemaTramo(esquemaCorrida) || (isPisoExtra2 && validarEsquemaTramo(esquemaCorrida2))) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.MSG.servicoPisoExtraLocalidadeDiferente"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		} else if(esquemaCorrida.equals(esquemaCorrida2)) {
			Messagebox.show(Labels.getLabel("editarConfiguracionCorridaController.pisoExtraIguais.label"),
					Labels.getLabel("editarConfiguracionCorridaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			returnValue = false;
		}

		if (!returnValue) {
			txtNumCorridaPisoExtra.setDisabled(false);
			txtNumCorridaPisoExtra2.setDisabled(false);
		}

		return returnValue;
	}

	public void onChange$txtNumCorridaPisoExtra() throws InterruptedException {
		validarPisoExtra();
	}
	
	public void onChange$txtNumCorridaPisoExtra2() throws InterruptedException {
		validarPisoExtra();
	}

	private boolean validarEsquemaTramo(EsquemaCorrida esquemaCorrida) {

		if (this.esquemaCorrida.getEsquemaTramoList().size() != esquemaCorrida.getEsquemaTramoList().size()) {
			return true;
		}
		for (int i = 0; i < this.esquemaCorrida.getEsquemaTramoList().size(); i++) {
			if( this.esquemaCorrida.getEsquemacorridaId() != null ){
				if (!tramoIsEqual(this.esquemaCorrida.getEsquemaTramoList().get(i).getTramo(), esquemaCorrida.getEsquemaTramoList().get(i).getTramo())) {
					return true;
				}
			}else{
				List<EsquemaTramo> ls = ordenaLista( esquemaCorrida.getEsquemaTramoList());
				if (!tramoIsEqual(this.esquemaCorrida.getEsquemaTramoList().get(i).getTramo(), ls.get(i).getTramo())) {
					return true;
				}
			}
		}	
		return false;
	}
	
	private List<EsquemaTramo> ordenaLista(List<EsquemaTramo> ls){
		List<EsquemaTramo> myls = new ArrayList<EsquemaTramo>();
		for(int y = 1 ; y <= ls.size(); y++ ){
			for(int x = 1 ; x <= ls.size(); x++ ){
				if(ls.get(x-1).getNumsecuencia() == y ){
					myls.add(ls.get(x-1));
					break;
				}
			}
		}
		return myls;
	}
	
	public boolean naoValidaEsquemaCorridaVia() {
		Constante contante = constanteService.buscarPorNomeConstante("NAO_VALIDA_ESQUEMA_CORRIDA_VIA");
		String valorConstante = contante == null ? null : contante.getValorconstante();

		if (StringUtils.isBlank(valorConstante)) {
			return false;
		} else {
			if (BooleanUtils.toBoolean(valorConstante)) {
				return true;
			}
			return false;
		}
	}
	
	private boolean tramoIsEqual(Tramo este, Tramo outro) {		
		if(este == null  && outro == null){
			return true;
		}
		if(este == null  && outro != null){
			return false;
		}
		if(este != null  && outro == null){
			return false;
		}
		if (este.getDestino().equals(outro.getDestino()) 
				&& este.getOrigem().equals(outro.getOrigem())) {
			if (naoValidaEsquemaCorridaVia()) {
				return true;
			} else if (este.getDesctramo().equals(outro.getDesctramo()) && este.getKmReal().equals(outro.getKmReal())
					&& este.getVia().equals(outro.getVia())) {
				return true;
			}
		}
		return false;
	}

	private void habilitaDiasDaSemana(Boolean isChecked) {
		if (isChecked) {
			lun.setChecked(!isChecked);
			mar.setChecked(!isChecked);
			mie.setChecked(!isChecked);
			jue.setChecked(!isChecked);
			vie.setChecked(!isChecked);
			sab.setChecked(!isChecked);
			dom.setChecked(!isChecked);

			lun.setDisabled(isChecked);
			mar.setDisabled(isChecked);
			mie.setDisabled(isChecked);
			jue.setDisabled(isChecked);
			vie.setDisabled(isChecked);
			sab.setDisabled(isChecked);
			dom.setDisabled(isChecked);
		} else {
			lun.setChecked(Boolean.FALSE);
			mar.setChecked(Boolean.FALSE);
			mie.setChecked(Boolean.FALSE);
			jue.setChecked(Boolean.FALSE);
			vie.setChecked(Boolean.FALSE);
			sab.setChecked(Boolean.FALSE);
			dom.setChecked(Boolean.FALSE);

			lun.setDisabled(Boolean.FALSE);
			mar.setDisabled(Boolean.FALSE);
			mie.setDisabled(Boolean.FALSE);
			jue.setDisabled(Boolean.FALSE);
			vie.setDisabled(Boolean.FALSE);
			sab.setDisabled(Boolean.FALSE);
			dom.setDisabled(Boolean.FALSE);
		}
	}

	private void habilitarDiaSimDiaNao(Boolean isLun, Boolean isMar, Boolean isMie, Boolean isJue, Boolean isVie, Boolean isSab, Boolean isDom) {
		if (isLun || isMar || isMie || isJue || isVie || isSab || isDom) {
			diaSimDiaNao.setChecked(Boolean.FALSE);
			diaSimDiaNao.setDisabled(Boolean.TRUE);
		} else {
			diaSimDiaNao.setChecked(Boolean.FALSE);
			diaSimDiaNao.setDisabled(Boolean.FALSE);
		}
	}

	public List<Empresa> getLsEmpresaIngresso() {
		return lsEmpresaIngresso;
	}

	public void setLsEmpresaIngresso(List<Empresa> lsEmpresaIngresso) {
		this.lsEmpresaIngresso = lsEmpresaIngresso;
	}

	public List<Autobus> getLsAutoBus() {
		return lsAutoBus;
	}

	public void setLsAutoBus(List<Autobus> lsAutoBus) {
		this.lsAutoBus = lsAutoBus;
	}
	
	public void onClick$btnAdicionarEmbarqueDesembarque(Event ev) {
		
		Comboitem selectedItem = cmbEmbarqueDesembarque.getSelectedItem();
		if (selectedItem == null) {
			return;
		}
		
		RutaEmbarqueDesembarque rutaEmbarqueDesembarque = (RutaEmbarqueDesembarque) selectedItem.getValue();
		
		for (EsquemaCorridaEmbarqueDesembarque esquemaCorridaEmbarqueDesembarque : lsEsquemaCorridaEmbarqueDesembarqueSelected) {
			if (esquemaCorridaEmbarqueDesembarque.getParada().equals(rutaEmbarqueDesembarque)) {
				return;
			}
		}
		
		selectEsquemaCorridaEmbarqueDesembarque(rutaEmbarqueDesembarque);
		
	}
	
	private void selectEsquemaCorridaEmbarqueDesembarque(RutaEmbarqueDesembarque rutaEmbarqueDesembarque) {
		EsquemaCorridaEmbarqueDesembarque esquemaCorridaEmbarqueDesembarque = new EsquemaCorridaEmbarqueDesembarque();
		esquemaCorridaEmbarqueDesembarque.setParada(rutaEmbarqueDesembarque.getParada());
		esquemaCorridaEmbarqueDesembarque.setActivo(true);
		esquemaCorridaEmbarqueDesembarque.setEsquemaCorrida(esquemaCorrida);
		esquemaCorridaEmbarqueDesembarque.setEmbarque(BooleanUtils.isTrue(rutaEmbarqueDesembarque.getEmbarque())); // null safe
		esquemaCorridaEmbarqueDesembarque.setDesembarque(BooleanUtils.isTrue(rutaEmbarqueDesembarque.getDesembarque())); // null safe
		esquemaCorridaEmbarqueDesembarque.setLocalDesembarqueEmbarque(rutaEmbarqueDesembarque.getLocalDesembarqueEmbarque());
		esquemaCorridaEmbarqueDesembarque.setIsVisualizarNaAPI(cbVisualizaNaAPI.isChecked());
		lsEsquemaCorridaEmbarqueDesembarqueSelected.add(esquemaCorridaEmbarqueDesembarque);
		
		esquemaCorrida.setLsEsquemaCorridaEmbarqueDesembarque(lsEsquemaCorridaEmbarqueDesembarqueSelected);
		esquemaCorridaEmbarqueDesembarqueListbox.setData(lsEsquemaCorridaEmbarqueDesembarqueSelected);
	}
	
	public void onClick$btnRemoverEmbarqueDesembarque(Event ev) throws InterruptedException {
		
		EsquemaCorridaEmbarqueDesembarque esquemaCorridaEmbarqueDesembarque = (EsquemaCorridaEmbarqueDesembarque) esquemaCorridaEmbarqueDesembarqueListbox.getSelected();
		
		if (esquemaCorridaEmbarqueDesembarque != null) {
			lsEsquemaCorridaEmbarqueDesembarqueSelected.remove(esquemaCorridaEmbarqueDesembarque);
			lsEsquemaCorridaEmbarqueDesembarqueBorrar.add(esquemaCorridaEmbarqueDesembarque);
			
			esquemaCorrida.setLsEsquemaCorridaEmbarqueDesembarque(lsEsquemaCorridaEmbarqueDesembarqueSelected);
			esquemaCorridaEmbarqueDesembarqueListbox.setData(lsEsquemaCorridaEmbarqueDesembarqueSelected);
		}
		
	}

	public List<RutaEmbarqueDesembarque> getLsRutaEmbarqueDesembarque() {
		return lsRutaEmbarqueDesembarque;
	}

	public void setLsRutaEmbarqueDesembarque(List<RutaEmbarqueDesembarque> lsRutaEmbarqueDesembarque) {
		this.lsRutaEmbarqueDesembarque = lsRutaEmbarqueDesembarque;
	}

	public Boolean getEmbarqueDesembarqueDisabled() {
		return embarqueDesembarqueDisabled;
	}
	
	public Boolean getEmbarque() {
		return embarque;
	}

	public void setEmbarque(Boolean embarque) {
		this.embarque = embarque;
	}

	public Boolean getDesembarque() {
		return desembarque;
	}

	public void setDesembarque(Boolean desembarque) {
		this.desembarque = desembarque;
	}

	public List<Parada> getLsEmbarqueDesembarque() {
		return lsEmbarqueDesembarque;
	}

	public void setLsEmbarqueDesembarque(List<Parada> lsEmbarqueDesembarque) {
		this.lsEmbarqueDesembarque = lsEmbarqueDesembarque;
	}
	
	public void onSelect$cmbEmbarqueDesembarque(Event ev) {
		Comboitem selectedItem = cmbEmbarqueDesembarque.getSelectedItem();
		if (selectedItem == null) {
			return;
		}
		
		preencherLocalEmbarqueDesembarque();
		
		RutaEmbarqueDesembarque rutaEmbarqueDesembarque = (RutaEmbarqueDesembarque) selectedItem.getValue();
		Comboitem ci = new Comboitem(rutaEmbarqueDesembarque.getLocalDesembarqueEmbarque().toString());
		ci.setAttribute("value", rutaEmbarqueDesembarque.getLocalDesembarqueEmbarque());
		ci.setValue(rutaEmbarqueDesembarque.getLocalDesembarqueEmbarque());
		ci.setParent(cmbLocalEmbarqueDesembarque);
		cmbLocalEmbarqueDesembarque.setSelectedItem(ci);
		
		cbEmbarque.setChecked(rutaEmbarqueDesembarque.getEmbarque());
		cbDesembarque.setChecked(rutaEmbarqueDesembarque.getDesembarque());
	}
	
	private void preencherLocalEmbarqueDesembarque(){
		for (RutaEmbarqueDesembarque rutaEmbarqueDesembarque : lsRutaEmbarqueDesembarque) {
			lsEmbarqueDesembarque.add(rutaEmbarqueDesembarque.getLocalDesembarqueEmbarque());
		}
	}

	public Combobox getCmbRolOperativoServicoExtra() {
		return cmbRolOperativoServicoExtra;
	}

	public void setCmbRolOperativoServicoExtra(Combobox cmbRolOperativoServicoExtra) {
		this.cmbRolOperativoServicoExtra = cmbRolOperativoServicoExtra;
	}

	public Boolean getIsVisualizarNaAPI() {
		return isVisualizarNaAPI;
	}

	public void setIsVisualizarNaAPI(Boolean isVisualizarNaAPI) {
		this.isVisualizarNaAPI = isVisualizarNaAPI;
	}
		
	@SuppressWarnings("unchecked")
	public void onClick$btnAdicionarTramoInformacaoCorrida(Event ev) {

		try {
			cmbParadaOrigem.getValue();
			cmbParadaDestino.getValue();
			txtMensagemTrecho.getValue();
			
			Parada origem = (Parada) cmbParadaOrigem.getSelectedItem().getValue();
			Parada destino = (Parada) cmbParadaDestino.getSelectedItem().getValue();
			
				boolean existe = false;
				for (EsquemaCorridaInfo esquemaCorridaInfo : (List<EsquemaCorridaInfo>)lstTrechosInformacaoCorridaListbox.getListData()) {
					if(esquemaCorridaInfo.getOrigem().getDescparada().equals(origem.getDescparada()) && esquemaCorridaInfo.getDestino().getDescparada().equals(destino.getDescparada())) {
						existe = true;
					}
				}
				if(!existe) {
					EsquemaCorridaInfo esquemaCorridaInfo = new EsquemaCorridaInfo();
					esquemaCorridaInfo.setOrigem(origem);
					esquemaCorridaInfo.setDestino(destino);
					esquemaCorridaInfo.setActivo(true);
					esquemaCorridaInfo.setInfoCorrida(txtMensagemTrecho.getValue());
					esquemaCorridaInfo.setEsquemaCorrida(esquemaCorrida);
					esquemaCorridaInfo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					esquemaCorridaInfo.setFecmodif(Calendar.getInstance().getTime());
					esquemaCorridaInfo.setActivo(Boolean.TRUE);
					lsEsquemaCorridaInfoSelected.add(esquemaCorridaInfo);					
					esquemaCorrida.setLsEsquemaCorridaInfo(lsEsquemaCorridaInfoSelected);
					lstTrechosInformacaoCorridaListbox.setData(lsEsquemaCorridaInfoSelected);
					
				}else {
					Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
							Labels.getLabel("editarConfiguracionCorridaController.window.title"),
							Messagebox.OK,
							Messagebox.EXCLAMATION);
				}

								
		} catch (Exception e) {
			log.error("ESQ CORRIDA INFO TRMO - Erro ao adicionar tramo: " + e, e);
			e.printStackTrace();
			onClick$btnAdicionarTramo(null);
		}
	}
	
	public void onClick$btnRemoverEsquemaCorridaInfoTramo(Event ev) throws InterruptedException {
		
		EsquemaCorridaInfo esquemaCorridaInfo = (EsquemaCorridaInfo) lstTrechosInformacaoCorridaListbox.getSelected();
		
		if (esquemaCorridaInfo != null) {
			lsEsquemaCorridaInfoSelected.remove(esquemaCorridaInfo);
			lsEsquemaCorridaInfoBorrar.add(esquemaCorridaInfo);			
			esquemaCorrida.setLsEsquemaCorridaInfo(null);
			lstTrechosInformacaoCorridaListbox.setData(lsEsquemaCorridaInfoSelected);
		}
		
	}
	
	public Button getBtnCancelarRetomar() {
		return btnCancelarRetomar;
	}

	public void setBtnCancelarRetomar(Button btnCancelarRetomar) {
		this.btnCancelarRetomar = btnCancelarRetomar;
	}
	
	private void alterarBotaoRetomarCancelar() {
		if (esquemaCorrida.getIndCorridaDesativada()) {
			btnCancelarRetomar.setTooltiptext(Labels.getLabel("editarCatalogoDeRutaController.btnRetomarCancelar.tooltipRetomar"));
			btnCancelarRetomar.setImage("/gui/img/back.png");
		} else {
			btnCancelarRetomar.setTooltiptext(Labels.getLabel("editarCatalogoDeRutaController.btnRetomarCancelar.tooltipCancelar"));
			btnCancelarRetomar.setImage("/gui/img/forbidden.png");
		}
	}
	
	public void onClick$btnCancelarRetomar(Event ev) throws Exception {
		if (!esquemaCorrida.getIndCorridaDesativada()) {
			esquemaCorrida.setIndCorridaDesativada(true);// cancelar
		} else {
			esquemaCorrida.setIndCorridaDesativada(false);// retomar
		}
		
		if(esquemaCorrida.getEsquemacorridaId() != null) {
			esquemaCorridaService.actualizacion(esquemaCorrida);
		}
		
		alterarBotaoRetomarCancelar();
	}
}