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

import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
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.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.ForwardEvent;
import org.zkoss.zk.ui.event.KeyEvent;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Row;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Toolbar;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.AliasServico;
import com.rjconsultores.ventaboletos.entidad.CasetaPeaje;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.entidad.GrupoRuta;
import com.rjconsultores.ventaboletos.entidad.ImpresionLayoutConfig;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.OrgaoTramo;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuencia;
import com.rjconsultores.ventaboletos.entidad.ParadaSecuenciaCombinacaoLinha;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaCaseta;
import com.rjconsultores.ventaboletos.entidad.RutaCombinacion;
import com.rjconsultores.ventaboletos.entidad.RutaEmbarqueDesembarque;
import com.rjconsultores.ventaboletos.entidad.RutaEmpresa;
import com.rjconsultores.ventaboletos.entidad.RutaIcmsExcepcion;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoServicio;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.enums.StatusAutorizacaoRuta;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.CorridaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EsquemaCorridaService;
import com.rjconsultores.ventaboletos.service.GrupoRutaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaCombinacionService;
import com.rjconsultores.ventaboletos.service.RutaEmbarqueDesembarqueService;
import com.rjconsultores.ventaboletos.service.RutaEmpresaService;
import com.rjconsultores.ventaboletos.service.RutaIcmsExcepcionService;
import com.rjconsultores.ventaboletos.service.RutaSecuenciaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.service.ViaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.RegistroConDependenciaException;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.RutaTramoVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxImpresionLayoutConfig;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCatalogoDeRutasSecuencia;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRutaEmbarqueDesembarque;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRutaEmpresa;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRutaIcmsExcepcion;

/**
 * 
 * @author Rafius
 */
@Controller("editarCatalogoDeRutaController")
@Scope("prototype")
public class EditarCatalogoDeRutaController extends MyGenericForwardComposer
		implements ListitemRenderer {

	private static final String NAO = "Não";
	private static final String SIM = "Sim";
	private static final long serialVersionUID = 1L;
	private static final Short EMPRESA_OPERADORA = 4;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private EsquemaCorridaService esquemaCorridaService;
	@Autowired
	private ClaseServicioService claseService;
	@Autowired
	private TramoService tramoService;
	@Autowired
	private RutaCombinacionService rutaCombinacionService;
	@Autowired
	private RutaSecuenciaService rutaSecuenciaService;
	@Autowired
	private ViaService viaService;
	@Autowired
	private RutaEmpresaService rutaEmpresaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private GrupoRutaService grupoRutaService;
	@Autowired
	private transient PagedListWrapper<RutaCombinacion> plwRutaCombinacion;
	@Autowired
	private CorridaService corridaService;
	@Autowired
	private RutaEmbarqueDesembarqueService rutaEmbarqueDesembarqueService;
	@Autowired
	private RutaIcmsExcepcionService rutaIcmsExcepcionService;
	@Autowired
	private EmpresaService empresaService;
	
	private Ruta ruta;
	private Ruta rutaComparacao;
	private MyListbox rutaList;
	private MyListbox rutaSecuenciaList;
	private MyListbox rutaCombinacionList;
	private MyListbox rutaEmpresaList;
	private MyListbox rutaEmbarqueDesembarqueListbox;
	private Paging pagingRutaCombinacion;
	private List<GrupoRuta> lsGrupoRuta;
	private List<RutaSecuencia> lsRutaSecuencia;
	private List<RutaCombinacion> lsRutaCombinacion;
	private List<ClaseServicio> lsClase;
	private List<Via> lsVia;
	private List<ParadaSecuencia> lsParadasSequencia;
	private List<Empresa> lsEmpresa;
	private List<Empresa> lsEmpresaAutorizadora;
	private List<RutaEmpresa> lsRutaEmpresa;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private Tramo tramoBandBox;
	private Textbox txtNome;
	private Textbox txtPrefixo;
	private Textbox txtPrefixoAuxiliar;
	private Spinner numSecuencia;
	private Combobox cmbClase;
	private Combobox cmbVia;
	private Combobox cmbEmpresa;
	private Combobox cmbEmpresaAutorizadora;
	private Combobox cmbParada;
	
	private Radio rdNo;
	private Radio rdSi;
	private Radio rdEmbarcadaSi;
	private Radio rdEmbarcadaNo;
	private Radio rdTelSi;
	private Radio rdTelNo;
	private Radio radIda;
	private Radio radVolta;
	private Radio rdNumFidelidadSi;
	private Radio rdNumFidelidadNo;
	private Button btnApagar;
	private Integer ultimaSecuencia;
	private Boolean secuenciaFoiAlterada = Boolean.FALSE;
	private Boolean modificado = Boolean.FALSE;
	private static Logger log = LogManager.getLogger(EditarCatalogoDeRutaController.class);
	private boolean carregouCombinacao;
	private MyTextbox txtNumRuta;
	private Intbox txtCantEixos;
	private Intbox txtCantAsientos;
	private Checkbox chkIndVentaRioCard;
	private MyTextbox txtNumRioCard;
	private Window winEditarRuta;
	private List<ParadaSecuencia> sequenciasInformadas;
	private Button btnCancelarRetomar;
	private Boolean claseAlterada = Boolean.FALSE;
	private Boolean embarque = Boolean.FALSE;
	private Boolean desembarque = Boolean.FALSE;
	
	private Combobox cmbParadaOrigenExcecao;
	private Combobox cmbParadaDestinoExcecao;
	private Checkbox chkIndTribTarifaExcecao;
	private Checkbox chkIndTribTaxaEmbarqueExcecao;
	private Checkbox chkIndTribPedagioExcecao;
	private Checkbox chkIndCST41;
	private List<Parada> lsParadasExcecao;
	private List<RutaIcmsExcepcion> lsRutaIcmsExcepcions;
	private MyListbox rutaIcmsExcepcionsList;


	private List<RutaCombinacion> lsRutacComb;
	private List<RutaEmbarqueDesembarque> lsRutaEmbarqueDesembarque = new ArrayList<RutaEmbarqueDesembarque>();
	private List<RutaEmbarqueDesembarque> lsRutaEmbarqueDesembarqueBorrar = new ArrayList<RutaEmbarqueDesembarque>();
	private String nuevaParada;
	
	private Combobox cmbEmbarqueDesembarque;
	private ParadaSecuencia paradaSecuencia;
	private List<ParadaSecuencia> lsEmbarqueDesembarque;
	
	private Row linhaEmpresaAutorizadora;
	private Row linhaStatus;
	private Row rowIncluirSequencia;
	private Row rowAdicionarRuta;
	private Row rowAddEmbarqueDesembarque;
	private Row rowAddICMS;
	private MyTextbox txtStatus;
	
	private Toolbar barraDeAprovacaoDeLinha;
	private Toolbar barraDeCadastro;
	private Button btModificar;
	private Boolean isBloqueadoParaAlteracao = false;
	private Button btnLiberarRuta;
	private Button btnBloquearRuta;
	private MyComboboxImpresionLayoutConfig cmbImpresionLayoutConfig;
	
	private List<Ruta> lsTodasAsLinhas;
	
	//Utiliza o campo para usar a tela para visualizacao e aprovacao de linhas para empresas Operadoras. Utilize caso seja criado um novo campo
	private Boolean isAprovacaoLinhas;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsClase = claseService.buscarTodosExceto(-1);
		lsVia = viaService.obtenerTodos();
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsGrupoRuta = grupoRutaService.obtenerTodos();
		lsEmpresaAutorizadora = buscarEmpresaOperadora();

		ruta = (Ruta) Executions.getCurrent().getArg().get("ruta");
		
		isAprovacaoLinhas = (Boolean) Executions.getCurrent().getArg().get("isAprovacaoLinhas");
		isAprovacaoLinhas = isAprovacaoLinhas == null ? false : isAprovacaoLinhas;

		if (ruta.getRutaId() != null) {
			ruta = rutaService.obtenerID(ruta.getRutaId());
			ruta.setClaseServicioRutaOrigem(ruta.getClaseServicio());

			lsRutacComb = ruta.getRutaCombinacionList();
		}

		rutaList = (MyListbox) Executions.getCurrent().getArg().get("rutaList");
		
		lsTodasAsLinhas = rutaService.buscarRutasPorEmpresas(lsEmpresa);

		super.doAfterCompose(comp);
		
		barraDeCadastro.setVisible(!isAprovacaoLinhas);
		barraDeAprovacaoDeLinha.setVisible(isAprovacaoLinhas);
		
		if(isAprovacaoLinhas) {
			isBloqueadoParaAlteracao = true;
			desabilitarCadastro();
		}

		// Secuencia
		rutaSecuenciaList.setItemRenderer(new RenderCatalogoDeRutasSecuencia());
		lsRutaSecuencia = new ArrayList<RutaSecuencia>();
		sequenciasInformadas = new ArrayList<ParadaSecuencia>();

		rutaSecuenciaList.addEventListener("onDoubleClick", new EventListener() {

			@SuppressWarnings({ "rawtypes", "unchecked" })
			@Override
			public void onEvent(Event event) throws Exception {
				if (ruta.getRutaId() == null) {
					Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.salvarRutaPrimeiro"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
				}

				Parada parada = null;
				try {
					MyTextbox txtParada = (MyTextbox) ((KeyEvent) event).getTarget();
					nuevaParada = txtParada.getValue();
					parada = (Parada) txtParada.getAttribute("parada");
				} catch (Exception e) {
				}

				if (event instanceof ForwardEvent) {

					Listcell lc = (Listcell) ((ForwardEvent) event).getOrigin().getTarget();
					MyTextbox txtParada = (MyTextbox) lc.getFirstChild();
					txtParada.setReadonly(false);
					txtParada.addEventListener("onOK", this);

				} else {

					if (event.getName().equals("onOK")) {
						try {
							int resp = Messagebox.show(
									Labels.getLabel("editarCatalogoDeRutaController.actionCanbiarParada.tooltiptext"),
									Labels.getLabel("editarEmpresaController.window.title"),
									Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

							if (resp == Messagebox.YES) {

								boolean executaCambioRutaParada = true;

								Parada paradaValida = rutaService.validaParada(nuevaParada, parada);
								if (paradaValida != null) {
									executaCambioRutaParada = false;

									int validaParada = Messagebox.show(
											Labels.getLabel("editarCatalogoDeRutaController.actionCanbiarParada.validaParada"),
											Labels.getLabel("editarEmpresaController.window.title"),
											Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

									if (validaParada == Messagebox.YES)
										executaCambioRutaParada = true;
								}

								if (executaCambioRutaParada) {
									if (rutaService.cambiarParadaRuta(ruta, parada, paradaValida, nuevaParada)) {

										ruta = rutaService.obtenerID(ruta.getRutaId());

										try {
											carregarParadaSecuencia(ruta.getRutaSecuenciaList());
										} catch (Exception e) {
										}

										Messagebox.show(
												Labels.getLabel("editarCatalogoDeRutaController.actionCanbiarParada.sucesso"),
												Labels.getLabel("editarEmpresaController.window.title"),
												Messagebox.OK, Messagebox.EXCLAMATION);
									}
								}
							}

						} catch (Exception e) {
							if (e instanceof BusinessException)
								log.error("", e);

							Messagebox.show(e.getMessage(),
									Labels.getLabel("editarCatalogoDeRutaController.window.title"),
									Messagebox.OK, Messagebox.EXCLAMATION);
						}

					} else {

						ParadaSecuencia psOrigen = (ParadaSecuencia) rutaSecuenciaList.getSelected();
						int indexSelecto = rutaSecuenciaList.getSelectedIndex();
						ParadaSecuencia psDestino = new ParadaSecuencia();

						try {
							psDestino = (ParadaSecuencia) lsParadasSequencia.get(indexSelecto + 1);
						} catch (IndexOutOfBoundsException e) {

							Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.finRuta"),
									Labels.getLabel("editarCatalogoDeRutaController.window.title"),
									Messagebox.OK, Messagebox.EXCLAMATION);
							return;
						}

						if (psOrigen == null) { // lsRutaSecuencia <-- esse objeto ja tem o id da ruta secuencia ....
							return;
						}

						Map args = new HashMap();
						args.put("paradaSecuenciaOrigen", psOrigen);
						args.put("paradaSecuenciaDestino", psDestino);
						args.put("lsRutaSecuencia", lsRutaSecuencia);

						args.put("lsParadasSequencia", lsParadasSequencia);
						args.put("rutaSecuenciaList", rutaSecuenciaList);
						args.put("casetasList", getCasetasPeage(psOrigen.getCasetas()));
						openWindow("/gui/esquema_operacional/editarSecuencia.zul", Labels.getLabel("editarSecuenciaController.window.title"), args, MODAL);
					}
				}
			}
		});

		txtNumRioCard.setDisabled(ruta.getIndVentaRioCard() == null || !ruta.getIndVentaRioCard());
		chkIndVentaRioCard.addEventListener("onClick", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				disableEnableNumRioCard();
			}
		});

		// Combinacion
		rutaCombinacionList.setItemRenderer(this);
		lsRutaCombinacion = new ArrayList<RutaCombinacion>();

		// Ruta Empresa
		rutaEmpresaList.setItemRenderer(new RenderRutaEmpresa());
		lsRutaEmpresa = new ArrayList<RutaEmpresa>();

		rutaEmbarqueDesembarqueListbox.setItemRenderer(new RenderRutaEmbarqueDesembarque());

		lsParadasSequencia = new ArrayList<ParadaSecuencia>();

		if (ruta.getRutaId() != null) {
			ruta = rutaService.obtenerID(ruta.getRutaId());
			if (ruta.getIndNombreObligatorio() != null && ruta.getIndNombreObligatorio()) {
				rdSi.setChecked(true);
			} else {
				rdNo.setChecked(true);
			}
			
			if (ruta.getIndVendaEmbarcada() != null && ruta.getIndVendaEmbarcada()) {
				rdEmbarcadaSi.setChecked(true);
			} else {
				rdEmbarcadaNo.setChecked(true);
			}			
			
			rdTelSi.setChecked(BooleanUtils.isTrue(ruta.getIndTelefoneObrigatorio()));
			rdTelNo.setChecked(!rdTelSi.isChecked());
			
			if (ruta.getIndNumFidelidadObligatorio() != null && ruta.getIndNumFidelidadObligatorio()) {
				rdNumFidelidadSi.setChecked(true);
			} else {
				rdNumFidelidadNo.setChecked(true);
			}
			if (ruta.getIndSentidoIda() != null) {
				if (ruta.getIndSentidoIda()) {
					radIda.setChecked(true);
					radVolta.setChecked(false);
				} else {
					radIda.setChecked(false);
					radVolta.setChecked(true);
				}
			}

			lsRutaEmpresa = ruta.getLsRutaEmpresa();
			rutaEmpresaList.setData(lsRutaEmpresa);

			lsRutaEmbarqueDesembarque = rutaEmbarqueDesembarqueService.obtenerPorRuta(ruta);
			rutaEmbarqueDesembarqueListbox.setData(lsRutaEmbarqueDesembarque);

			carregarParadaSecuencia(rutaSecuenciaService.buscarSecuenciaOrdenado(ruta));
			ruta.setRutaSecuenciaList(lsRutaSecuencia);

			numSecuencia.setValue(lsRutaSecuencia.size() + 2);
			txtNumRioCard.setValue(ruta.getNumRioCard());
			
			cmbImpresionLayoutConfig.setInitialValue(ruta.getImpresionLayoutConfig());
		} else {
			List<RutaCombinacion> combinacion = new ArrayList<RutaCombinacion>();
			ruta.setRutaCombinacionList(combinacion);
			numSecuencia.setValue(1);
		}
		txtNome.focus();

		if (ruta.getRutaId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}
		
		lsRutaIcmsExcepcions = new ArrayList<RutaIcmsExcepcion>();
		if(ruta.getLsRutaIcmsExcepcions() != null) {
			lsRutaIcmsExcepcions = ruta.getLsRutaIcmsExcepcions();
		}
		rutaIcmsExcepcionsList.setItemRenderer(new RenderRutaIcmsExcepcion());
		rutaIcmsExcepcionsList.setData(lsRutaIcmsExcepcions);
		
		carregouCombinacao = false;
		alterarBotaoRetomarCancelar();
		carregarParadasRuta();
		linhaEmpresaAutorizadora.setVisible(false);
		
		validaApresentaLinhaStatus();
	}

	private void desabilitarCadastro() {
		rowIncluirSequencia.setVisible(false);
		btModificar.setVisible(false);
		rowAdicionarRuta.setVisible(false);
		rowAddEmbarqueDesembarque.setVisible(false);
		rowAddICMS.setVisible(false);
	}

	private List<Empresa> buscarEmpresaOperadora() {
		List<Empresa> todasAsEmpresas = empresaService.obtenerTodos();
		List<Empresa> empOperadoras = new ArrayList<Empresa>();
		
		for(Empresa emp : todasAsEmpresas) {
			if(emp.getIndTipo() != EMPRESA_OPERADORA) {
				empOperadoras.add(emp);
			}
		}
		
		return empOperadoras;
	}

	private void alterarBotaoRetomarCancelar() {
		if (ruta.getIndRutaCancelada()) {
			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");
		}
	}

	private List<CasetaPeaje> getCasetasPeage(List<RutaCaseta> casetas) {
		List<CasetaPeaje> casetasPeage = new ArrayList<CasetaPeaje>();

		if (casetas == null || casetas.isEmpty()) {
			return casetasPeage;
		}

		for (RutaCaseta rutaCaseta : casetas) {
			casetasPeage.add(rutaCaseta.getCasetaPeaje());
		}

		return casetasPeage;
	}

	public void onClick$btnCancelarRetomar(Event ev) throws Exception {
		if (!ruta.getIndRutaCancelada()) {
			if (!existeEsquemaCorridaVigente() && !existeCorridaVenda()) {
				ruta.setIndRutaCancelada(true);// cancelar
				salvarRuta(Labels.getLabel("editarCatalogoDeRutaController.msg.rutaCancelada"));
			}
		} else {
			ruta.setIndRutaCancelada(false);// retomar
			alterarBotaoRetomarCancelar();
			salvarRuta(Labels.getLabel("editarCatalogoDeRutaController.msg.rutaReativada"));
		}
	}

	private boolean existeCorridaVenda() throws InterruptedException {
		Corrida corrida = corridaService.buscaCorrridaFutura(ruta, new Date());
		if (corrida != null) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.corridaGeradaVigente")
					+ " " + corrida.getId().getCorridaId()
					+ " "
					+ Labels.getLabel("editarCatalogoDeRutaController.msg.corridaGeradaVigentePt2")
					+ " " + DateUtil.getStringDate(corrida.getId().getFeccorrida(), DateUtil.ddMMaaaa));
			return true;
		}
		return false;
	}

	private Boolean existeEsquemaCorridaVigente() throws InterruptedException {
		EsquemaCorrida esquemaCorrida = esquemaCorridaService.buscaEsquemaPorRuta(ruta);
		if (esquemaCorrida != null) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.existeEsquemaCorridaVigente")
					+ " " + esquemaCorrida.getNumCorrida());
			return true;
		}
		return false;
	}

	protected void disableEnableNumRioCard() {
		if (chkIndVentaRioCard.isChecked()) {
			txtNumRioCard.setDisabled(false);
			txtNumRioCard.setConstraint("no empty");
		} else {
			txtNumRioCard.setDisabled(true);
			txtNumRioCard.setValue("");
			txtNumRioCard.setConstraint((String) null);
		}
	}

	private void paginarCombinacao() {
		if (ruta.getRutaId() != null) {
			HibernateSearchObject<RutaCombinacion> claseServicioBusqueda = new HibernateSearchObject<RutaCombinacion>(RutaCombinacion.class,
					pagingRutaCombinacion.getPageSize());

			claseServicioBusqueda.addFilterEqual("activo", Boolean.TRUE);
			claseServicioBusqueda.addFilterEqual("ruta", ruta);

			plwRutaCombinacion.init(claseServicioBusqueda, rutaCombinacionList, pagingRutaCombinacion);
		}
	}

	private void addTramoPardaSecuencia(Parada parada, Via via, Short numsecuencia) {
		ParadaSecuencia paradaSecuencia = new ParadaSecuencia();
		paradaSecuencia.setParada(parada);
		paradaSecuencia.setSecuencia(numsecuencia);
		paradaSecuencia.setVia(via);
		lsParadasSequencia.add(paradaSecuencia);
	}

	private void addTramoPardaSecuencia(Parada parada, Via via, Short numsecuencia, List<RutaCaseta> lCas, String tempo, String km, String kmEntradaSaida) {
		ParadaSecuencia paradaSecuencia = new ParadaSecuencia();
		paradaSecuencia.setParada(parada);
		paradaSecuencia.setSecuencia(numsecuencia);
		paradaSecuencia.setVia(via);
		paradaSecuencia.setCasetas(lCas);
		paradaSecuencia.setKmReal(km);
		paradaSecuencia.setKmEntradaSaida(kmEntradaSaida);
		paradaSecuencia.setTempoReal(tempo);
		lsParadasSequencia.add(paradaSecuencia);
	}

	private void carregarParadaSecuencia(List<RutaSecuencia> lista) {
		lsParadasSequencia.clear();
		lsRutaSecuencia = lista;
		short numSecuencia = 0;
		lsEmbarqueDesembarque = new ArrayList<ParadaSecuencia>();
		for (int i = 0; i < lsRutaSecuencia.size(); i++) {
			RutaSecuencia rs = lsRutaSecuencia.get(i);
			Tramo tramo = rs.getTramo();
			Via via = tramo.getVia();
			List<RutaCaseta> lcas = rs.getLsRutaCase();
			Short numsecuencia = ++numSecuencia;

			Parada paradaOrigem = tramo.getOrigem();
			BigDecimal kmEntradaSaida = rs.getCantKmEntradaSaida() == null ? tramo.getKmEntradaSaida() : rs.getCantKmEntradaSaida();
			BigDecimal km = rs.getKmOriginal();
			addTramoPardaSecuencia(paradaOrigem, via, numsecuencia, lcas, getTempo(tramo.getTramoServicioList(), ruta), km != null ? km.toString() : "", kmEntradaSaida != null ? kmEntradaSaida.toString() : "");
			if (i == lsRutaSecuencia.size() - 1) {
				Parada paradaDestino = tramo.getDestino();
				Integer ultSecuencia = numsecuencia.intValue() + 1;
				addTramoPardaSecuencia(paradaDestino, via,
						ultSecuencia.shortValue());
			}
		}
		lsEmbarqueDesembarque.addAll(lsParadasSequencia);
		rutaSecuenciaList.setData(lsParadasSequencia);
	}

	private String getTempo(List<TramoServicio> lsTramoServicio, Ruta rutaTempo) {

		for (TramoServicio tramoServicio : lsTramoServicio) {

			if (tramoServicio.getClaseServicio().equals(rutaTempo.getClaseServicio())) {
				Calendar c = Calendar.getInstance();
				c.setTime(tramoServicio.getTiemporecorrido());

				Long tempo = DateUtil.getElapsedMinutos(DateUtil.getFecInicio().getTime(), c.getTime());
				long minutos = (tempo % 60);
				int horas = (tempo.intValue() / 60);

				String sMinutos = String.valueOf(minutos);
				return horas + ":" + ((sMinutos.length() < 2) ? "0" + sMinutos : sMinutos);
			}
		}

		return "";
	}

	public void onClick$btModificar(Event ev) {
		numSecuencia.setDisabled(Boolean.FALSE);
		ultimaSecuencia = numSecuencia.getValue();
		modificado = Boolean.TRUE;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnAdicionarSecuencia(Event ev) throws InterruptedException {
		try {
			// Para uma ruta já existente, so é possivel adicionar paradas
			// entre a origem inicial e destino final.

			if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.IncluirSequenciaRutaCloneError"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
			
			if (!ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.HABILITAR_EXCLUIR_SEQUENCIA_LINHA.getDescricao())) {

				if (ruta.getRutaId() != null && ((numSecuencia.getValue() == 1) || (numSecuencia.getValue() > lsParadasSequencia.size()))) {
					Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.cambioSecuencia"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
				}
			}
			
			cmbParada.getSelectedItem();
			Parada parada = (Parada) cmbParada.getSelectedItem().getValue();

			ParadaSecuencia paradaSecuencia = new ParadaSecuencia();
			paradaSecuencia.setParada(parada);
			paradaSecuencia.setSecuencia(numSecuencia.getValue().shortValue());
			paradaSecuencia.setVia((Via) cmbVia.getSelectedItem().getValue());

			sequenciasInformadas.add(paradaSecuencia);

			Via via = (Via) cmbVia.getSelectedItem().getValue();
			boolean existe = false;

			for (ParadaSecuencia ps : lsParadasSequencia) {

				if (ps.getParada().equals(parada)) {
					existe = true;
				}
			}

			if (!existe) {
				if (!modificado) {
					addTramoPardaSecuencia(parada, via, numSecuencia.getValue().shortValue());
					rutaSecuenciaList.setData(lsParadasSequencia);
					numSecuencia.setValue(numSecuencia.getValue() + 1);
					cmbParada.focus();
					cmbParada.setText("");
				} else {
					Boolean incrementar = Boolean.FALSE;
					for (int i = 0; i < lsParadasSequencia.size(); i++) {
						// Se numero de secuencia inserido marior que os que
						// existem, não faco nada.
						if (lsParadasSequencia.get(i).getSecuencia().intValue() < numSecuencia.getValue()) {
							continue;
							// Se existe uma sequancia igual a ja digitada,
							// incremento +1 nesse secuencia
						} else if (lsParadasSequencia.get(i).getSecuencia().intValue() == numSecuencia.getValue()) {
							Integer novaSecuencia = lsParadasSequencia.get(i).getSecuencia().intValue() + 1;
							lsParadasSequencia.get(i).setSecuencia(new Short(novaSecuencia.toString()));
							incrementar = Boolean.TRUE;

							// So continuo incrementando se ja houver uma
							// secuencia igual
						} else if (incrementar) {
							Integer novaSecuencia = lsParadasSequencia.get(i).getSecuencia().intValue() + 1;
							lsParadasSequencia.get(i).setSecuencia(new Short(novaSecuencia.toString()));
						} else {
							continue;
						}
					}

					addTramoPardaSecuencia(parada, via, numSecuencia.getValue().shortValue());
					// Em ordem crescente do numero da secuencia
					Collections.sort(lsParadasSequencia, new Comparator() {

						public int compare(Object o1, Object o2) {
							ParadaSecuencia p1 = (ParadaSecuencia) o1;
							ParadaSecuencia p2 = (ParadaSecuencia) o2;
							return p1.getSecuencia().intValue() < p2.getSecuencia().intValue() ? -1 : (p1.getSecuencia().intValue() > p2.getSecuencia().intValue() ? +1 : 0);
						}
					});

					rutaSecuenciaList.setData(lsParadasSequencia);
					secuenciaFoiAlterada = Boolean.TRUE;
					numSecuencia.setValue(ultimaSecuencia);
					numSecuencia.setDisabled(Boolean.TRUE);
					cmbParada.focus();
					cmbParada.setText("");
				}
			} else {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.validacion.yaExisteParada"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
		} catch (Exception e) {
			log.error(e);
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.selectItem"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
		}
	}

	public void onClick$btnRemoverSecuencia(Event ev) {
		try {
			ParadaSecuencia paradaSecuencia = (ParadaSecuencia) rutaSecuenciaList.getSelected();
			if (paradaSecuencia != null) {
				if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
					Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.ExcluirSequenciaRutaCloneError"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);

					return;
				}

				if (ruta.getRutaId() != null) {
					List<Integer> lsEsquemas = esquemaCorridaService.existe(ruta, paradaSecuencia.getParada().getParadaId());
					if (!lsEsquemas.isEmpty()) {
						StringBuilder sb = new StringBuilder("");
						for (Integer esquemaCorridaId : lsEsquemas) {
							sb.append(esquemaCorridaId).append(", ");
						}
						sb.delete(sb.length() - 2, sb.length());

						String msg = new MessageFormat(Labels.getLabel("busquedaCatalogoDeRutaController.msg.validactionRemocionParada")).format(new Object[] { paradaSecuencia.getParada().getDescparada(), sb.toString() });

						Messagebox.show(msg, Labels.getLabel("editarCatalogoDeRutaController.window.title"),
								Messagebox.OK, Messagebox.ERROR);

						return;
					}
				}

				Short secuenciaMax = 0;
				for (ParadaSecuencia ps : lsParadasSequencia) {
					if (ps.getSecuencia().compareTo(secuenciaMax) > 0) {
						secuenciaMax = ps.getSecuencia();
					}
				}
				numSecuencia.setValue(secuenciaMax + 1);

				if ((paradaSecuencia.getSecuencia() == 1 || paradaSecuencia.getSecuencia() == secuenciaMax) && 
						!ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.HABILITAR_EXCLUIR_SEQUENCIA_LINHA.getDescricao())) {
					Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.removerSecuencia"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				} else {
					for (ParadaSecuencia ps : lsParadasSequencia) {
						if (ps.getParada().equals(paradaSecuencia.getParada())) {
							lsParadasSequencia.remove(ps);
							rutaSecuenciaList.setData(lsParadasSequencia);
							secuenciaFoiAlterada = Boolean.TRUE;
							log.debug("Sequencia Removida: "
									+ ps.getSecuencia() + " - "
									+ ps.getParada().getCveparada());
							break;
						}
					}
				}
			}
		} catch (Exception e) {
			log.error("Erro ao remover secuencia da ruta" + e.getMessage());
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.ERROR);
		}
	}

	public void onClick$btnAdicionarEmpresaRuta(Event ev) {
		try {
			if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.IncluirEmpresaRutaCloneError"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}

			Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();

			if (cbiEmpresa != null) {
				Empresa empresa = (Empresa) cbiEmpresa.getValue();
				
				Empresa empresaAutorizadora = null;
				
				if(empresa != null && empresa.getIndTipo() == EMPRESA_OPERADORA) {
					
					if(!lsRutaEmpresa.isEmpty()) {
						Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.erroMaisdeUmaEmpresa"), Labels.getLabel("editarCatalogoDeRutaController.window.title"), 
								Messagebox.OK, Messagebox.EXCLAMATION);
						return;
					}
					
					Comboitem cbiEmpresaAutorizadora = cmbEmpresaAutorizadora.getSelectedItem();
					
					empresaAutorizadora =  cbiEmpresaAutorizadora == null ? null : (Empresa) cbiEmpresaAutorizadora.getValue();
					
					if(empresaAutorizadora == null) {
						Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.erroSemEmpresaAutorizadora"), Labels.getLabel("editarCatalogoDeRutaController.window.title"), 
								Messagebox.OK, Messagebox.EXCLAMATION);
						return;
					}
					
					ruta.setStatusAutorizadora(StatusAutorizacaoRuta.EM_ANALISE.getStatus());
				} else {
					if(existeEmpresaOperadora()) {
						Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.erroMaisdeUmaEmpresa"), Labels.getLabel("editarCatalogoDeRutaController.window.title"), 
								Messagebox.OK, Messagebox.EXCLAMATION);
						return;
					}
				}

				Boolean achou = Boolean.FALSE;

				for (RutaEmpresa re : lsRutaEmpresa) {
					if (re.getEmpresa().getEmpresaId().equals(empresa.getEmpresaId())) {
						achou = Boolean.TRUE;
					}
				}

				if (!achou) {
					RutaEmpresa rutaEmpresa = new RutaEmpresa();
					rutaEmpresa.setRuta(ruta);
					rutaEmpresa.setEmpresa(empresa);
					rutaEmpresa.setActivo(Boolean.TRUE);
					rutaEmpresa.setFecmodif(Calendar.getInstance().getTime());
					rutaEmpresa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					rutaEmpresa.setEmpresaAutorizadora(empresaAutorizadora);

					lsRutaEmpresa.add(rutaEmpresa);
					ruta.setLsRutaEmpresa(lsRutaEmpresa);

					rutaEmpresaList.setData(lsRutaEmpresa);
					validaApresentaLinhaStatus();
				} else {
					Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
				}
			}
		} catch (Exception ex) {
			log.debug(ex);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.ERROR);
		}
	}

	private Boolean existeEmpresaOperadora() {
		Boolean existeEmpresaOperadora = false;
		for (RutaEmpresa re : lsRutaEmpresa) {
			if (re.getEmpresa().getIndTipo() == EMPRESA_OPERADORA && re.getEmpresaAutorizadora() != null) {
				existeEmpresaOperadora = true;
			}
		}
		return existeEmpresaOperadora;
	}
	
	public void onChange$cmbEmpresa(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();

		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			
			if(empresa.getIndTipo() == EMPRESA_OPERADORA) {
				linhaEmpresaAutorizadora.setVisible(true);
			} else {
				linhaEmpresaAutorizadora.setVisible(false);
			}
		}
		
	}

	public void onClick$btnRemoverEmpresaRuta(Event ev) throws InterruptedException {
		if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.ExcluirEmpresaRutaCloneError"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		RutaEmpresa rutaEmpresa = (RutaEmpresa) rutaEmpresaList.getSelected();
		if (rutaEmpresa != null) {
			rutaEmpresa.setActivo(Boolean.FALSE);
			rutaEmpresa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			rutaEmpresa.setFecmodif(Calendar.getInstance().getTime());

			rutaEmpresaService.borrar(rutaEmpresa);

			lsRutaEmpresa.remove(rutaEmpresa);
			rutaEmpresaList.setData(lsRutaEmpresa);
		}
		
		validaApresentaLinhaStatus();
	}
	
	private void validaApresentaLinhaStatus(){
		if(existeEmpresaOperadora()) {
			linhaStatus.setVisible(true);
			txtStatus.setText(StatusAutorizacaoRuta.buscarStatus(ruta.getStatusAutorizadora()));
		} else {
			linhaStatus.setVisible(false);
		}
	}

	private boolean validar() throws InterruptedException {
		txtNome.getValue();
		cmbClase.getValue();

		if (lsParadasSequencia.size() < 2) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.validacion.paradas"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return false;
		}

		if (lsRutaEmpresa.isEmpty()) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.validacion.empresa"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);

			return false;
		}
		

		return true;
	}

	// Quando alteramos os tramo em combinacao selecionando uma nova via
	// temos q atualizar os tramos da sequencia para que seja os mesmos
	// tramos em combinacao e sequencia:
	private void atualizarTramosSequencia(RutaCombinacion rc) {

		List<RutaSecuencia> lsRutaSec = ruta.getRutaSecuenciaList();

		Tramo tramoRC = rc.getTramo();
		Parada origemRC = rc.getTramo().getOrigem();
		Parada destinoRC = rc.getTramo().getDestino();
		Via viaRC = rc.getTramo().getVia();
		for (RutaSecuencia rs : lsRutaSec) {
			Parada origemRS = rs.getTramo().getOrigem();
			Parada destinoRS = rs.getTramo().getDestino();
			Via viaRS = rs.getTramo().getVia();

			if ((origemRS.getParadaId().equals(origemRC.getParadaId()))
					&& (destinoRS.getParadaId().equals(destinoRC.getParadaId()))
					&& (!viaRS.getViaId().equals(viaRC.getViaId()))) {
				rs.setTramo(tramoRC);
			}
		}
	}
	
	private void atualizarTramosSequenciaTemporaria(RutaCombinacion rc) {
		List<RutaSecuencia> lsRutaSec = ruta.getRutaSecuenciaList();
		Tramo tramoRC = rc.getTramo();
		Parada origemRC = rc.getTramo().getOrigem();
		Parada destinoRC = rc.getTramo().getDestino();
		Via viaRC = rc.getTramo().getVia();
		for (RutaSecuencia rs : lsRutaSec) {
			Parada origemRS = rs.getTramo().getOrigem();
			Parada destinoRS = rs.getTramo().getDestino();
			Via viaRS = rs.getTramo().getVia();

			if ((origemRS.getParadaId().equals(origemRC.getParadaId()))
					&& (destinoRS.getParadaId().equals(destinoRC.getParadaId()))
					&& (!viaRS.getViaId().equals(viaRC.getViaId()))) {
				List<RutaCombinacion> lsRutaCombinacionTemporaria = new ArrayList<RutaCombinacion>(ruta.getRutaCombinacionTemporariaList());
				for (int i = 0; i < lsRutaCombinacionTemporaria.size(); i++) {
					if (lsRutaCombinacionTemporaria.get(i).getRutacombinacionId() == rc.getRutacombinacionId()) {
						ruta.getRutaCombinacionTemporariaList().get(i).setTramo(tramoRC);
						rs.setTramo(tramoRC);
						break;
					}
				}
			}
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		if (ruta.getIndRutaCancelada()) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.linhaDesativada"));
			return;
		}

		if (ruta.getOrgaoConcedente() == null) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.orgaoConcedenteObrigatorio"));
			return;
		}

		salvarRuta(Labels.getLabel("editarCatalogoDeRutaController.MSG.suscribirOK")
				.concat(" ID: " + ((ruta.getRutaId() == null) ? "" : ruta.getRutaId().toString())));
	}

	private void salvarRuta(String msgRutaSalva) throws InterruptedException {

		for (RutaEmbarqueDesembarque rutaEmbarqueDesembarque : lsRutaEmbarqueDesembarqueBorrar) {
			if (rutaEmbarqueDesembarque.getRutaEmbarqueDesembarqueId() != null) {
				rutaEmbarqueDesembarqueService.borrar(rutaEmbarqueDesembarque);
			}
		}

		txtPrefixo.getValue();
		txtNumRioCard.getValue();
		
		Comboitem cbImpresionLayoutConfig = cmbImpresionLayoutConfig.getSelectedItem();
		ruta.setImpresionLayoutConfig(null);
		if (cbImpresionLayoutConfig != null) {
			ruta.setImpresionLayoutConfig((ImpresionLayoutConfig) cbImpresionLayoutConfig.getValue());
		}
		
		Boolean existeEmpresaOperadora = existeEmpresaOperadora();
		if (existeEmpresaOperadora && StatusAutorizacaoRuta.LIBERADO.getStatus().equals(ruta.getStatusAutorizadora())) {
			
			if(houveAlteracaoParaAnalise()) {
				int resp = Messagebox.show( Labels.getLabel("editarCatalogoDeRutaController.msg.desejaAlterar"), Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);
				
				if (resp == Messagebox.NO) {
					return;
				}
				
				ruta.setStatusAutorizadora(StatusAutorizacaoRuta.EM_ANALISE.getStatus());
			} 
			
		} else if(existeEmpresaOperadora) {
			ruta.setStatusAutorizadora(StatusAutorizacaoRuta.EM_ANALISE.getStatus());
		}

		if (null != txtCantEixos && txtCantEixos.getValue() != null && txtCantEixos.getValue() == 0) {
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeRutaController.lblCantEixosZeroInvalido.value"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (null != txtCantAsientos && txtCantAsientos.getValue() != null && txtCantAsientos.getValue() == 0) {
			Messagebox.show(
					Labels.getLabel("editarCatalogoDeRutaController.lblCantAsientosZeroInvalido.value"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		
		List<Ruta> lsRuta = new ArrayList<Ruta>();
		
		lsRuta = rutaService.buscarNumRuta(txtNumRuta.getValue().toString());

		if (radIda.isChecked()) {
			ruta.setIndSentidoIda(Boolean.TRUE);
		} else if (radVolta.isChecked()) {
			ruta.setIndSentidoIda(Boolean.FALSE);
		}

		if (!lsRuta.isEmpty()) {
			boolean exists = CollectionUtils.exists(lsRuta, new Predicate() {

				@Override
				public boolean evaluate(Object object) {
					return ((Ruta) object).getNumRuta().equals(ruta.getNumRuta()) && ((Ruta) object).getIndSentidoIda().equals(ruta.getIndSentidoIda());
				}
			});

			if (ruta.getRutaId() == null && exists) {
				Messagebox.show(
						Labels.getLabel("editarCatalogoDeRutaController.registroNumRutaExiste"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);

				return;
			}
		}

		if ((ruta.getRutaId() != null) && secuenciaFoiAlterada) {
			int resp = Messagebox.show(
					Labels.getLabel("editarCatalogoDeRutaController.msg.validacionCambionEnCombinaciones"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.NO) {
				return;
			}
		}

		if (!validar()) {
			return;
		}

		try {

			if (lsParadasSequencia.size() == 1) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.sequencia"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			} else {
				ruta.setActivo(Boolean.TRUE);
				ruta.setFecmodif(Calendar.getInstance().getTime());
				ruta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				ruta.setClaseServicio((ClaseServicio) cmbClase.getSelectedItem().getValue());

				if (rdSi.isChecked()) {
					ruta.setIndNombreObligatorio(Boolean.TRUE);
				} else if (rdNo.isChecked()) {
					ruta.setIndNombreObligatorio(Boolean.FALSE);
				}
				
				if (rdEmbarcadaSi.isChecked()) {
					ruta.setIndVendaEmbarcada(Boolean.TRUE);
				} else if (rdEmbarcadaNo.isChecked()) {
					ruta.setIndVendaEmbarcada(Boolean.FALSE);
				}
				
				ruta.setIndTelefoneObrigatorio(rdTelSi.isChecked());
				
				if (rdNumFidelidadSi.isChecked()) {
					ruta.setIndNumFidelidadObligatorio(Boolean.TRUE);
				} else if (rdNumFidelidadNo.isChecked()) {
					ruta.setIndNumFidelidadObligatorio(Boolean.FALSE);
				}

				ruta.setNumRioCard(txtNumRioCard.getValue());

				if (ruta.getRutaId() == null) {

					if (ruta.getIsClone() != null && claseAlterada) {
						gerarCombinacaoTramoRuta(ruta, lsParadasSequencia);
						claseAlterada = Boolean.FALSE;
					} else {
						salvarRuta();
					}
				} else {

					// Gera Secuencia e Combinação Novamente se houve
					// modificação na Secuencia.
					if (secuenciaFoiAlterada || claseAlterada) {
						gerarCombinacaoTramoRuta(ruta, lsParadasSequencia);
						claseAlterada = Boolean.FALSE;
					} else {
						atualizarRuta(msgRutaSalva, null);
					}
				}
			}
		} catch (BusinessException ex) {
			Messagebox.show(ex.getLocalizedMessage(),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		} catch (Exception ex) {
			log.error("Error al dar de alta ruta", ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}

	}

	/***
	 * Verifica se a alteracao na ruta precisa de uma nova analise pela empresa Autorizadora
	 * 
	 * As seguintes alteracoes precisao de revisao:
	 * 
	 * empresas linha - ICMS Exceção - prefixo - prefixo auxiliar - orgao concedente - ICMS preço
	 * 
	 * @return
	 */
	private boolean houveAlteracaoParaAnalise() {
		try {
			rutaComparacao = rutaService.obtenerID(ruta.getRutaId());
			
			if(rutaComparacao == null) {
				return false;
			}
			
			if(ruta.getPrefixo() != null && rutaComparacao.getPrefixo() != null && !ruta.getPrefixo().equals(rutaComparacao.getPrefixo())) {
				return true;
			}
			
			if(ruta.getPrefixoAuxiliar() != null && rutaComparacao.getPrefixoAuxiliar() != null && !ruta.getPrefixoAuxiliar().equals(rutaComparacao.getPrefixoAuxiliar())) {
				return true;
			}
			
			if(ruta.getOrgaoConcedente() != null && !ruta.getOrgaoConcedente().equals(rutaComparacao.getOrgaoConcedente())) {
				return true;
			}
			
			//ICMS PRECO
			if(!ruta.getIndTribTarifa().equals(rutaComparacao.getIndTribTarifa()) 
					|| !ruta.getIndTribPedagio().equals(rutaComparacao.getIndTribPedagio()) 
					|| !ruta.getIndTribTaxaEmbarque().equals(rutaComparacao.getIndTribTaxaEmbarque()) ) {
				return true;
			}
			
			if(houveAlteracaoICMSExcecao()) {
				return true;
			}
			
		} catch (Exception e) {
			log.error("Erro ao analizar diferencas na ruta: ", e);
		}
		
		return false;
	}

	private boolean houveAlteracaoICMSExcecao() {
		if((ruta.getLsRutaIcmsExcepcions() != null && rutaComparacao.getLsRutaIcmsExcepcions() == null) || (ruta.getLsRutaIcmsExcepcions() == null && rutaComparacao.getLsRutaIcmsExcepcions() != null) ) {
			return true;
		}
		
		if(ruta.getLsRutaIcmsExcepcions() != null && rutaComparacao.getLsRutaIcmsExcepcions() != null && ruta.getLsRutaIcmsExcepcions().size() != rutaComparacao.getLsRutaIcmsExcepcions().size() ) {
			return true;
		}
		
		int comparacao = 0;
		for(RutaIcmsExcepcion rExcp : ruta.getLsRutaIcmsExcepcions()) {
			for(RutaIcmsExcepcion rExcp2 : rutaComparacao.getLsRutaIcmsExcepcions()) {
				if(rExcp.equals(rExcp2)) {
					comparacao++;
				}
			}
		}
		
		if(comparacao != rutaComparacao.getLsRutaIcmsExcepcions().size()) {
			return true;
		}
		
		return false;
	}

	private void alteraKmCoeficiente(Tramo tramo, BigDecimal kmEntradaSaidaAnterior, BigDecimal KmEntradaSaidaNovo) {
		tramo.setLsOrgaoTramo(tramoService.getLsOrgaoTramoByTramo(tramo));
		for (OrgaoTramo ot : tramo.getLsOrgaoTramo()) {
			ot.setKmCoeficiente1(ot.getKmCoeficiente1().subtract(kmEntradaSaidaAnterior));
			ot.setKmCoeficiente1(ot.getKmCoeficiente1().add(KmEntradaSaidaNovo));
		}
	}

	private void alteraKmEntradaSaida(BigDecimal KmEntradaSaidaNovo) {
		RutaSecuencia rs = lsRutaSecuencia.get(rutaSecuenciaList.getSelectedIndex());
		lsParadasSequencia.get(rutaSecuenciaList.getSelectedIndex()).setKmEntradaSaida(KmEntradaSaidaNovo.toString().replace(".", ","));

		BigDecimal kmEntradaSaidaAnterior = rs.getCantKmEntradaSaida() == null ? BigDecimal.ZERO : rs.getCantKmEntradaSaida();
		rs.setCantKmEntradaSaida(KmEntradaSaidaNovo);
		List<Tramo> alterados = new ArrayList<Tramo>();

		for (RutaCombinacion rc : lsRutacComb) {
			if (rc.getTramo().getOrigem().equals(rs.getTramo().getOrigem()) || rc.getTramo().getDestino().equals(rs.getTramo().getOrigem())) {
				rc.getTramo().setKmReal(rc.getTramo().getKmReal().subtract(kmEntradaSaidaAnterior));
				rc.getTramo().setKmReal(rc.getTramo().getKmReal().add(KmEntradaSaidaNovo));
				rc.getTramo().setKmEntradaSaida(KmEntradaSaidaNovo);
				alterados.add(rc.getTramo());
				alteraKmCoeficiente(rc.getTramo(), kmEntradaSaidaAnterior, KmEntradaSaidaNovo);
				try {
					tramoService.suscribirActualizar(rc.getTramo());
				} catch (BusinessException be) {
					log.error("", be);
				}
			}
		}
		rutaSecuenciaService.actualizacion(rs);
		rutaSecuenciaList.setData(lsParadasSequencia);

	}

	public void onClick$btnAlterarKmEntradaSaida(Event ev) throws InterruptedException {
		if (rutaSecuenciaList.getSelectedIndex() < 0) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.selecioneumasecuencia"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}
		final Window dialog = (Window) Executions.createComponents("/gui/esquema_operacional/editarKmEntradaSaida.zul", null, null);
		try {
			Button okBtn = (Button) dialog.getFellow("okBtn");

			okBtn.addEventListener("onClick", new EventListener() {
				@Override
				public void onEvent(Event event) throws Exception {
					try{
						MyTextboxDecimal txtKmEntradaSaida = (MyTextboxDecimal) dialog.getFellow("txtKmEntradaSaida");
						txtKmEntradaSaida.getValue();
					
						alteraKmEntradaSaida(txtKmEntradaSaida.getValueDecimal());
						
					}catch(Throwable t){
						if (t instanceof WrongValueException){
							throw (WrongValueException)t;
						}
						
						Messagebox.show(Labels.getLabel("MSG.CONSTRAINT.DECIMALBOXISNOTANUMBER"),
								Labels.getLabel("editarCatalogoDeRutaController.window.title"),
								Messagebox.OK, Messagebox.EXCLAMATION);
					}
					dialog.detach();
				}
			});

			dialog.doModal();

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

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

			if (resp == Messagebox.YES) {
				rutaService.borrar(ruta);
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.borrarOK"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				rutaList.removeItem(ruta);

				closeWindow();
			}
		} catch (RegistroConDependenciaException ex) {
			Clients.alert(ex.getLocalizedMessage(),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.INFORMATION);
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.INFORMATION);
		}
	}

	public void render(Listitem lstm, Object o) throws Exception {
		try {
			RutaCombinacion rutaCombinacion = (RutaCombinacion) o;
			
			if(rutaCombinacion.getTramo() != null ) {
				final Combobox comboVenda = preencherColunaComboVende(lstm, rutaCombinacion);

				preencherColunaLocalidade(lstm, rutaCombinacion);
				
				preencherColunaComboVia(lstm, rutaCombinacion, comboVenda);
				
				preencherColunaComboAlias(lstm, rutaCombinacion, comboVenda);
				
				preencherColunaComboUsaPricing(lstm, rutaCombinacion);				
				
				preencherColunaCodigoDER(lstm, rutaCombinacion);
				
				preencherColunaComboExibeTabela(lstm, rutaCombinacion);

				lstm.setAttribute("data", rutaCombinacion);
			}

		} catch (Exception e) {
			log.error("Erro ao mudar via da ruta combinacion: "
					+ e.getMessage(),e);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.ERROR);
		}

	}

	private void preencherColunaComboAlias(Listitem lstm, RutaCombinacion rutaCombinacion, Combobox comboVenda) {
		Listcell lc;
		lc = new Listcell();

		final Combobox comboAlias = new Combobox();
		comboAlias.setMold("rounded");
		comboAlias.setWidth("90%");
		if (rutaCombinacion.getRutacombinacionId() != null) {
			comboAlias.setTooltip(rutaCombinacion.getRutacombinacionId().toString());
		}
		
		comboAlias.setModel(new ListModelList(lsTodasAsLinhas));
		comboAlias.setAutocomplete(true);
		
		comboAlias.setValue(rutaCombinacion.getAliasRuta() == null ? "" : rutaCombinacion.getAliasRuta().toString() );
		comboAlias.addEventListener("onChange", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				Ruta v = comboAlias.getSelectedItem() == null ? null : ((Ruta) comboAlias.getSelectedItem().getValue());
				String idCombinacion = comboVenda.getTooltip();
				opcionAliasServico(v, idCombinacion);
			}
		});
		lc.appendChild(comboAlias);
		lc.setParent(lstm);
	}
	
	private void opcionAliasServico(Ruta r, String idCombinacion) {
		RutaCombinacion rc = rutaCombinacionService.obtenerID(Integer.parseInt(idCombinacion));
		
		rc.setAliasRuta(r);
		
		if (!ruta.getIsClone()) {
			rutaCombinacionService.actualizacion(rc);
		} 
	}

	private void preencherColunaComboVia(Listitem lstm, RutaCombinacion rutaCombinacion, final Combobox comboVenda) {
		Listcell lc;
		lc = new Listcell();

		final Combobox comboVia = new Combobox();
		comboVia.setMold("rounded");
		comboVia.setWidth("90%");
		if (rutaCombinacion.getRutacombinacionId() != null) {
			comboVia.setTooltip(rutaCombinacion.getRutacombinacionId().toString());
		}
		List<Via> lsViaCombinacion = tramoService.obtenerViasOrigemDestino(
				rutaCombinacion.getTramo().getOrigem(), rutaCombinacion.getTramo().getDestino());

		if (lsViaCombinacion.size() == 1) {
			comboVia.setDisabled(Boolean.TRUE);
		}
		comboVia.setModel(new ListModelList(lsViaCombinacion));
		comboVia.setValue(rutaCombinacion.getTramo().getVia().getNombvia());
		comboVia.addEventListener("onChange", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				Via v = (Via) comboVia.getSelectedItem().getValue();
				String idCombinacion = comboVenda.getTooltip();
				opcionVia(v, idCombinacion);
			}
		});
		lc.appendChild(comboVia);
		lc.setParent(lstm);
	}

	private void preencherColunaLocalidade(Listitem lstm, RutaCombinacion rutaCombinacion) {
		Listcell lc;
		Tramo tramo = rutaCombinacion.getTramo();
		String descTramoDetalhado = tramo.getOrigem().getDescparada() + "|" + tramo.getDestino().getDescparada();

		lc = new Listcell(rutaCombinacion.getTramo().getDesctramo() + "(" + descTramoDetalhado + ")");
		lc.setParent(lstm);
	}

	private Combobox preencherColunaComboVende(Listitem lstm, RutaCombinacion rutaCombinacion) {
		Listcell lc = new Listcell();

		final Combobox comboVenda = new Combobox();
		comboVenda.setMold("rounded");
		comboVenda.setWidth("90%");
		List<String> op = new ArrayList<String>();
		op.add(SIM);
		op.add(NAO);
		comboVenda.setModel(new ListModelList(op));
		comboVenda.setValue(rutaCombinacion.getIndventa() ? SIM : NAO);
		if (rutaCombinacion.getRutacombinacionId() != null) {
			comboVenda.setTooltip(rutaCombinacion.getRutacombinacionId().toString());
		}
		comboVenda.addEventListener("onChange", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				String venda = (String) comboVenda.getSelectedItem().getValue();
				String idCombinacion = comboVenda.getTooltip();
				if(idCombinacion != null) {
					vendeSiNo(venda, idCombinacion);
				}
			}
		});
		lc.appendChild(comboVenda);
		lc.setParent(lstm);
		return comboVenda;
	}
	
	private Combobox preencherColunaComboUsaPricing(Listitem lstm, RutaCombinacion rutaCombinacion) {
		Listcell lc = new Listcell();

		final Combobox comboUsaPricing = new Combobox();
		comboUsaPricing.setMold("rounded");
		comboUsaPricing.setWidth("90%");
		List<String> op = new ArrayList<String>();
		op.add(SIM);
		op.add(NAO);
		comboUsaPricing.setModel(new ListModelList(op));
		comboUsaPricing.setValue(rutaCombinacion.getIndUsaPricing() ? SIM : NAO);
		if (rutaCombinacion.getRutacombinacionId() != null) {
			comboUsaPricing.setTooltip(rutaCombinacion.getRutacombinacionId().toString());
		}
		comboUsaPricing.addEventListener("onChange", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				String usaPricing = (String) comboUsaPricing.getSelectedItem().getValue();
				String idCombinacion = comboUsaPricing.getTooltip();
				if(idCombinacion!= null) {
					defineUsoDoPricing(usaPricing, idCombinacion);
				}
			}
		});
		lc.appendChild(comboUsaPricing);
		lc.setParent(lstm);
		return comboUsaPricing;
	}
	
	private Combobox preencherColunaComboExibeTabela(Listitem lstm, RutaCombinacion rutaCombinacion) {

		Listcell lc = new Listcell();

		final Combobox comboExibeTabela = new Combobox();
		comboExibeTabela.setMold("rounded");
		comboExibeTabela.setWidth("90%");
		List<String> op = new ArrayList<String>();
		op.add(SIM);
		op.add(NAO);
		comboExibeTabela.setModel(new ListModelList(op));
		comboExibeTabela.setValue(rutaCombinacion.isIndExibeTabela() ? SIM : NAO);
		if (rutaCombinacion.getRutacombinacionId() != null) {
			comboExibeTabela.setTooltip(rutaCombinacion.getRutacombinacionId().toString());
		}
		
		comboExibeTabela.addEventListener("onChange", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				String exibeTabela = (String) comboExibeTabela.getSelectedItem().getValue();
				String idCombinacion = comboExibeTabela.getTooltip();
				if(idCombinacion!= null) {
					defineExibeTabela(exibeTabela, idCombinacion);
				}
			}
		});
		
		lc.appendChild(comboExibeTabela);
		lc.setParent(lstm);
		return comboExibeTabela;

	}
	
	private MyTextbox preencherColunaCodigoDER(Listitem lstm, RutaCombinacion rutaCombinacion) {
		Listcell lc = new Listcell();

		final MyTextbox txtCodigoDER = new MyTextbox();
		lc = new Listcell();
		txtCodigoDER.setValue(rutaCombinacion.getCodigoDerPr());
		txtCodigoDER.setWidth("90%");
		txtCodigoDER.setMaxlength(4);
		txtCodigoDER.setStyle(" background: #FFF; color: black; text-transform:uppercase;");
		txtCodigoDER.setTooltip(rutaCombinacion.getRutacombinacionId() == null ? "" :  rutaCombinacion.getRutacombinacionId().toString());
		lc.addForward("onBlur", lstm.getParent(), "onBlur");
		
		txtCodigoDER.addEventListener("onBlur", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				String codigoDER = txtCodigoDER.getValue();
				String rutaCombinacionId = txtCodigoDER.getTooltip();
				if(!StringUtils.isEmpty(codigoDER)) {
					defineSecaoDER(codigoDER, rutaCombinacionId);
				}
			}
		});
		
		lc.appendChild(txtCodigoDER);
		lc.setParent(lstm);
		return txtCodigoDER;
	}

	public Intbox getTxtCantEixos() {
		return txtCantEixos;
	}

	public void setTxtCantEixos(Intbox txtCantEixos) {
		this.txtCantEixos = txtCantEixos;
	}

	public Intbox getTxtCantAsientos() {
		return txtCantAsientos;
	}

	public void setTxtCantAsientos(Intbox txtCantAsientos) {
		this.txtCantAsientos = txtCantAsientos;
	}
	
	public void defineSecaoDER(String secao, String idCombinacion) {
		if(!ruta.getIsClone()) {
		RutaCombinacion rc = carregarRutaCombinacionSelecionada(idCombinacion);
		rc.setCodigoDerPr(secao);
		atualizarRutaCombinacion(rc);
		}else {
			List<RutaCombinacion> lsRutaCombinacionTemporaria = new ArrayList<RutaCombinacion>(ruta.getRutaCombinacionTemporariaList());
			for(int i=0; i < lsRutaCombinacionTemporaria.size(); i ++) {
				if(lsRutaCombinacionTemporaria.get(i).getRutacombinacionId()== Integer.parseInt(idCombinacion)) {
					ruta.getRutaCombinacionTemporariaList().get(i).setCodigoDerPr(secao);;
					break;
				}
			}			
		}
	}

	public void vendeSiNo(String venda, String idCombinacion) {
		if(!ruta.getIsClone()) {
		RutaCombinacion rc = carregarRutaCombinacionSelecionada(idCombinacion);
		rc.setIndventa(venda.equals(SIM));
		atualizarRutaCombinacion(rc);
		}else {	
			List<RutaCombinacion> lsRutaCombinacionTemporaria = new ArrayList<RutaCombinacion>(ruta.getRutaCombinacionTemporariaList());
			for(int i=0; i < lsRutaCombinacionTemporaria.size(); i ++) {
				if(lsRutaCombinacionTemporaria.get(i).getRutacombinacionId()== Integer.parseInt(idCombinacion)) {
					ruta.getRutaCombinacionTemporariaList().get(i).setIndventa(venda.equals(SIM));
					break;
				}
			}			
		}
	}
	
	public void defineUsoDoPricing(String usaPrincing, String idCombinacion) {
		if(!ruta.getIsClone()) {
		RutaCombinacion rc = carregarRutaCombinacionSelecionada(idCombinacion);
		rc.setIndUsaPricing(usaPrincing.equals(SIM));
		atualizarRutaCombinacion(rc);
		}else {		
			List<RutaCombinacion> lsRutaCombinacionTemporaria = new ArrayList<RutaCombinacion>(ruta.getRutaCombinacionTemporariaList());
			for(int i=0; i < lsRutaCombinacionTemporaria.size(); i ++) {
				if(lsRutaCombinacionTemporaria.get(i).getRutacombinacionId()== Integer.parseInt(idCombinacion)) {
					ruta.getRutaCombinacionTemporariaList().get(i).setIndUsaPricing(usaPrincing.equals(SIM));
					break;
				}
			}	
		}
	}
	
	public void defineExibeTabela(String exibeTabela, String idCombinacion) {
		if(!ruta.getIsClone()) {
			RutaCombinacion rc = carregarRutaCombinacionSelecionada(idCombinacion);
			rc.setIndExibeTabela(exibeTabela.equals(SIM));
			atualizarRutaCombinacion(rc);
		}else {		
			List<RutaCombinacion> lsRutaCombinacionTemporaria = new ArrayList<>(ruta.getRutaCombinacionTemporariaList());
			for(int i=0; i < lsRutaCombinacionTemporaria.size(); i ++) {
				if(lsRutaCombinacionTemporaria.get(i).getRutacombinacionId()== Integer.parseInt(idCombinacion)) {
					ruta.getRutaCombinacionTemporariaList().get(i).setIndExibeTabela(exibeTabela.equals(SIM));
					break;
				}
			}	
		}
	}

	private void atualizarRutaCombinacion(RutaCombinacion rc) {
		rc = rutaCombinacionService.actualizacion(rc);
		rutaCombinacionList.clearSelection();
	}

	private RutaCombinacion carregarRutaCombinacionSelecionada(String idCombinacion) {
		RutaCombinacion rc = (RutaCombinacion) rutaCombinacionList.getSelected();
		rc = rutaCombinacionService.obtenerID(Integer.parseInt(idCombinacion));
		return rc;
	}

	public void opcionVia(Via v, String idCombinacion) {
		RutaCombinacion rc = rutaCombinacionService.obtenerID(Integer.parseInt(idCombinacion));
		rc.setTramo(tramoService.obtenerTramotPorOrigemDestinoVia(rc.getTramo().getOrigem(), rc.getTramo().getDestino(), v));
		if (!ruta.getIsClone()) {
			rutaCombinacionService.actualizacion(rc);
			atualizarTramosSequencia(rc);
		} else {
			atualizarTramosSequenciaTemporaria(rc);
		}

	}

	public void onClick$tabCombinacion(Event ev) throws SQLException {
		if (!carregouCombinacao) {
			Clients.showBusy("Cargando combinaciones");
			paginarCombinacao();
			Clients.clearBusy();
		}

		carregouCombinacao = true;
	}

	public Checkbox getChkIndVentaRioCard() {
		return chkIndVentaRioCard;
	}

	public void setChkIndVentaRioCard(Checkbox chkIndVentaRioCard) {
		this.chkIndVentaRioCard = chkIndVentaRioCard;
	}

	public MyTextbox getTxtNumRioCard() {
		return txtNumRioCard;
	}

	public void setTxtNumRioCard(MyTextbox txtNumRioCard) {
		this.txtNumRioCard = txtNumRioCard;
	}

	private boolean clone = false;

	public void onClick$btnCopiar(Event ev) throws CloneNotSupportedException, InterruptedException {
		if (!clone) {
			List<RutaCombinacion> rutaCombinacionsAntiga = rutaCombinacionService.obtenerPorRuta(ruta);
			ruta = Ruta.clone(ruta);
			 if (ruta.getIsClone()) {
					ruta.setRutaCombinacionTemporariaList(new ArrayList<RutaCombinacion>(rutaCombinacionsAntiga));
			}
			ruta.setRutaId(null);

			List<RutaCombinacion> rutaCombinacions = new ArrayList<RutaCombinacion>();

			for (RutaCombinacion rc : rutaCombinacionsAntiga) {
				RutaCombinacion newrc = (RutaCombinacion) rc.clone();
				newrc.setRuta(ruta);
				rutaCombinacions.add(newrc);
			}
			ruta.setRutaCombinacionList(rutaCombinacions);

			carregarParadaSecuencia(ruta.getRutaSecuenciaList());		
		
			
		   ArrayList<RutaEmbarqueDesembarque> lsRutaEmbarqueDesembarqueAux =new ArrayList<RutaEmbarqueDesembarque>(lsRutaEmbarqueDesembarque);
		   lsRutaEmbarqueDesembarque = 	new ArrayList<RutaEmbarqueDesembarque>();		
			for (RutaEmbarqueDesembarque re : lsRutaEmbarqueDesembarqueAux) {
				RutaEmbarqueDesembarque r =new RutaEmbarqueDesembarque();
				r.setParada(re.getParada());
				r.setActivo(true);
				r.setRuta(ruta);
				r.setEmbarque(re.getEmbarque());
				r.setDesembarque(re.getDesembarque());
				r.setLocalDesembarqueEmbarque(re.getLocalDesembarqueEmbarque());
				lsRutaEmbarqueDesembarque.add(r);
			}
			
			ruta.setLsRutaEmbarqueDesembarque(lsRutaEmbarqueDesembarque);
			rutaEmbarqueDesembarqueListbox.setData(lsRutaEmbarqueDesembarque);
			
			
			List<RutaIcmsExcepcion> lsRutaIcmsExcepcionAux =new ArrayList<RutaIcmsExcepcion>(lsRutaIcmsExcepcions);
			lsRutaIcmsExcepcions = 	new ArrayList<RutaIcmsExcepcion>();
			for (RutaIcmsExcepcion rc : lsRutaIcmsExcepcionAux) {
				RutaIcmsExcepcion r =new RutaIcmsExcepcion();
				r.setRuta(ruta);				
				r.setOrigen(rc.getOrigen());
				r.setDestino(rc.getDestino());
				r.setIndTribTarifa(rc.getIndTribTarifa());
				r.setIndTribTaxaEmbarque(rc.getIndTribTaxaEmbarque());
				r.setIndTribPedagio(rc.getIndTribPedagio());
				r.setActivo(Boolean.TRUE);
				r.setFecmodif(Calendar.getInstance().getTime());
				r.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				r.setIndCST41(rc.getIndCST41());
				lsRutaIcmsExcepcions.add(r);
				
			}
			ruta.setLsRutaIcmsExcepcions(lsRutaIcmsExcepcions);
			rutaIcmsExcepcionsList.setData(lsRutaIcmsExcepcions);

			Constraint constNumRuta = txtNumRuta.getConstraint();
			txtNumRuta.setConstraint("");
			ruta.setNumRuta(null);
			txtNumRuta.setValue(null);
			txtNumRuta.setConstraint(constNumRuta);

			Constraint constPrefixo = txtPrefixo.getConstraint();
			txtPrefixo.setConstraint("");
			ruta.setPrefixo("");
			txtPrefixo.setValue("");
			txtPrefixo.setConstraint(constPrefixo);

			Constraint constPrefixoAuxiliar = txtPrefixoAuxiliar.getConstraint();
			txtPrefixoAuxiliar.setConstraint("");
			ruta.setPrefixoAuxiliar("");
			txtPrefixoAuxiliar.setValue("");
			txtPrefixoAuxiliar.setConstraint(constPrefixoAuxiliar);

			Constraint constCantEixos = txtCantEixos.getConstraint();
			txtCantEixos.setConstraint("");
			ruta.setCantEixos(null);
			txtCantEixos.setValue(null);
			txtCantEixos.setConstraint(constCantEixos);

			Constraint constCantAsientos = txtCantAsientos.getConstraint();
			txtCantAsientos.setConstraint("");
			ruta.setCantAsientos(null);
			txtCantAsientos.setValue(null);
			txtCantAsientos.setConstraint(constCantAsientos);

			rutaCombinacionList.setModel(new ListModelList(ruta.getRutaCombinacionList()));
			lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
			clone = true;

			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.cloneOK"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}
	}

	public void onChange$cmbClase(Event ev) throws CloneNotSupportedException, InterruptedException {
		claseAlterada = (cmbClase.getSelectedItem().getValue() != null && (ruta.getRutaId() != null || ruta.getIsClone() != null)) ? Boolean.TRUE : Boolean.FALSE;
	}

	private void gerarCombinacaoTramoRuta(Ruta ruta, List<ParadaSecuencia> sequencias) throws BusinessException, InterruptedException {
		List<ParadaSecuenciaCombinacaoLinha> sequenciasAGerar = rutaService.verificarSeqRutaNaoGerada(ruta, sequencias);

		if (sequenciasAGerar != null && !sequenciasAGerar.isEmpty()) {

			Map<String, Object> params = new LinkedHashMap<String, Object>();

			List<Empresa> empresas = new ArrayList<Empresa>();

			for (RutaEmpresa rutaEmpresa : ruta.getLsRutaEmpresa()) {
				empresas.add(rutaEmpresa.getEmpresa());
			}

			RutaTramoVO rutaTramoVO = new RutaTramoVO();
			rutaTramoVO.setClaseServicio(ruta.getClaseServicio());
			rutaTramoVO.setLsEmpresa(empresas);
			rutaTramoVO.setOrgaoConcedente(ruta.getOrgaoConcedente());
			rutaTramoVO.setSolicitaNombrePasajero(ruta.getIndNombreObligatorio());
			rutaTramoVO.setNumRuta(txtNumRuta.getValue().toString());
			rutaTramoVO.setDescRuta(ruta.getDescruta());
			rutaTramoVO.setPrefixo(txtPrefixo.getValue());
			rutaTramoVO.setIndSentidoIda(radIda.isChecked());
			rutaTramoVO.setClaseServicioRutaOrigem(ruta.getClaseServicioRutaOrigem());

			rutaTramoVO.setLsParadaSecuenciaCombinacaoLinhas(sequenciasAGerar);

			params.put("rutaTramoVO", rutaTramoVO);
			params.put("winEditarRuta", winEditarRuta);
			params.put("ruta", ruta);
			params.put("rutaClone", ruta);
			params.put("clase", (ClaseServicio) cmbClase.getSelectedItem().getValue());
			params.put("rutaList", rutaList);
			params.put("lsSequencias", sequencias);

			this.openWindow("/gui/esquema_operacional/generacion_tramo_ruta/gerarCombinacionTramoRuta.zul",
					Labels.getLabel("gerarCombinacionTramoRutaController.window.title"), params, MODAL);

		} else if (ruta.getRutaId() == null) {
			salvarRuta();
		} else {
			atualizarRuta(Labels.getLabel("editarCatalogoDeRutaController.MSG.suscribirOK")
					.concat(" ID: " + ((ruta.getRutaId() == null) ? "" : ruta.getRutaId().toString())), sequencias);
		}
	}

	public Ruta getRuta() {
		return ruta;
	}

	public void setRuta(Ruta ruta) {
		this.ruta = ruta;
	}

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

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

	public List<RutaCombinacion> getLsRutaCombinacion() {
		return lsRutaCombinacion;
	}

	public void setLsRutaCombinacion(List<RutaCombinacion> lsRutaCombinacion) {
		this.lsRutaCombinacion = lsRutaCombinacion;
	}

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

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

	public List<Via> getLsVia() {
		return lsVia;
	}

	public void setLsVia(List<Via> lsVia) {
		this.lsVia = lsVia;
	}

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

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

	public List<ParadaSecuencia> getLsParadasSequencia() {
		return lsParadasSequencia;
	}

	public void setLsParadasSequencia(List<ParadaSecuencia> lsParadasSequencia) {
		this.lsParadasSequencia = lsParadasSequencia;
	}

	public List<RutaEmpresa> getLsRutaEmpresa() {
		return lsRutaEmpresa;
	}

	public void setLsRutaEmpresa(List<RutaEmpresa> lsRutaEmpresa) {
		this.lsRutaEmpresa = lsRutaEmpresa;
	}

	public Tramo getTramoBandBox() {
		return tramoBandBox;
	}

	public void setTramoBandBox(Tramo tramoBandBox) {
		this.tramoBandBox = tramoBandBox;
	}

	public Integer getUltimaSecuencia() {
		return ultimaSecuencia;
	}

	public void setUltimaSecuencia(Integer ultimaSecuencia) {
		this.ultimaSecuencia = ultimaSecuencia;
	}

	public List<OrgaoConcedente> getLsOrgaoConcedente() {
		return lsOrgaoConcedente;
	}

	public void setLsOrgaoConcedente(List<OrgaoConcedente> lsOrgaoConcedente) {
		this.lsOrgaoConcedente = lsOrgaoConcedente;
	}

	public List<GrupoRuta> getLsGrupoRuta() {
		return lsGrupoRuta;
	}

	public void setLsGrupoRuta(List<GrupoRuta> lsGrupoRuta) {
		this.lsGrupoRuta = lsGrupoRuta;
	}

	private void salvarRuta() throws BusinessException, InterruptedException {
		salvarRuta(true);
	}

	private void salvarRuta(boolean addList) throws BusinessException, InterruptedException {
		ruta = rutaService.suscribir(ruta, lsParadasSequencia);
		// rutaList.addItem(ruta);

		if (addList) {
			rutaList.addItemNovo(ruta);
		}

		Messagebox.show(Labels.getLabel(
				"editarCatalogoDeRutaController.MSG.suscribirOK").concat(
						" ID: "
								+ ruta.getRutaId().toString()),
				Labels.getLabel("editarCatalogoDeRutaController.window.title"),
				Messagebox.OK,
				Messagebox.INFORMATION);

		closeWindow();
	}

	private void atualizarRuta(String msgRutaSalva, List<ParadaSecuencia> sequencias) throws BusinessException, InterruptedException {
		ruta = rutaService.actualizacion(ruta, sequencias);
		rutaList.updateItem(ruta);

		Messagebox.show(msgRutaSalva,
				Labels.getLabel("editarCatalogoDeRutaController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);

		closeWindow();
	}

	public void onClick$btnAdicionarEmbarqueDesembarque(Event ev) {

		Comboitem selectedItem = cmbEmbarqueDesembarque.getSelectedItem();
		if (selectedItem == null) {
			return;
		}

		Parada parada = (Parada) selectedItem.getValue();

		for (RutaEmbarqueDesembarque rutaEmbarqueDesembarque : lsRutaEmbarqueDesembarque) {
			if (rutaEmbarqueDesembarque.getParada().equals(parada)) {
				return;
			}
		}

		if (paradaSecuencia == null) {
			return;
		}
		
		RutaEmbarqueDesembarque rutaEmbarqueDesembarque = new RutaEmbarqueDesembarque();
		rutaEmbarqueDesembarque.setParada(paradaSecuencia.getParada());
		rutaEmbarqueDesembarque.setActivo(true);
		rutaEmbarqueDesembarque.setRuta(ruta);
		rutaEmbarqueDesembarque.setEmbarque(embarque);
		rutaEmbarqueDesembarque.setDesembarque(desembarque);		
		rutaEmbarqueDesembarque.setLocalDesembarqueEmbarque(parada);
		lsRutaEmbarqueDesembarque.add(rutaEmbarqueDesembarque);
		ruta.setLsRutaEmbarqueDesembarque(lsRutaEmbarqueDesembarque);
		rutaEmbarqueDesembarqueListbox.setData(lsRutaEmbarqueDesembarque);

	}

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

		RutaEmbarqueDesembarque rutaEmbarqueDesembarque = (RutaEmbarqueDesembarque) rutaEmbarqueDesembarqueListbox.getSelected();

		if (rutaEmbarqueDesembarque != null) {
			lsRutaEmbarqueDesembarque.remove(rutaEmbarqueDesembarque);
			lsRutaEmbarqueDesembarqueBorrar.add(rutaEmbarqueDesembarque);

			ruta.setLsRutaEmbarqueDesembarque(lsRutaEmbarqueDesembarque);
			rutaEmbarqueDesembarqueListbox.setData(lsRutaEmbarqueDesembarque);
		}

	}

	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;
	}
	
	private void carregarParadasRuta() {
		Set<Parada> lsParadas = new HashSet<Parada>(0);
		if(ruta != null && ruta.getRutaCombinacionList() != null) {
			for (RutaCombinacion rc : ruta.getRutaCombinacionList()) {
				if(rc.getTramo() != null) {
					lsParadas.add(rc.getTramo().getOrigem());
					lsParadas.add(rc.getTramo().getDestino());
				}
			}
		}
		
		lsParadasExcecao = new ArrayList<Parada>(0);
		lsParadasExcecao.addAll(lsParadas);
		
	}

	public List<Parada> getLsParadasExcecao() {
		return lsParadasExcecao;
	}

	public List<RutaIcmsExcepcion> getLsRutaIcmsExcepcions() {
		return lsRutaIcmsExcepcions;
	}
	
	public void onClick$btnAdicionarIcmsExcecao(Event ev) {
		try {
			if(!validarCamposIcmsExcecao()) {
				return;
			}
			
			Parada origen = (Parada) cmbParadaOrigenExcecao.getSelectedItem().getValue();
			Parada destino = (Parada) cmbParadaDestinoExcecao.getSelectedItem().getValue();
			chkIndTribTarifaExcecao.getValue();
			chkIndTribTaxaEmbarqueExcecao.getValue();
			chkIndTribPedagioExcecao.getValue();
			
			RutaIcmsExcepcion rutaIcmsExcepcion = new RutaIcmsExcepcion();
			rutaIcmsExcepcion.setRuta(ruta);
			rutaIcmsExcepcion.setOrigen(origen);
			rutaIcmsExcepcion.setDestino(destino);
			rutaIcmsExcepcion.setIndTribTarifa(chkIndTribTarifaExcecao.isChecked());
			rutaIcmsExcepcion.setIndTribTaxaEmbarque(chkIndTribTaxaEmbarqueExcecao.isChecked());
			rutaIcmsExcepcion.setIndTribPedagio(chkIndTribPedagioExcecao.isChecked());
			rutaIcmsExcepcion.setActivo(Boolean.TRUE);
			rutaIcmsExcepcion.setFecmodif(Calendar.getInstance().getTime());
			rutaIcmsExcepcion.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			rutaIcmsExcepcion.setIndCST41(chkIndCST41.isChecked());
			
			lsRutaIcmsExcepcions.add(rutaIcmsExcepcion);
			ruta.setLsRutaIcmsExcepcions(lsRutaIcmsExcepcions);
			rutaIcmsExcepcionsList.setData(lsRutaIcmsExcepcions);
			
		} catch (Exception ex) {
			log.error(ex.getMessage(), ex);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.ERROR);
		}
	}
	
	private boolean validarCamposIcmsExcecao() throws InterruptedException {
		if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.IncluirRutaImcsExcepcionCloneError"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if(cmbParadaDestinoExcecao.getSelectedIndex() == -1 || cmbParadaOrigenExcecao.getSelectedIndex() == -1) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.RutaImcsExcepcionOrigenDestinoNaoSelecionado"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		Parada origen = (Parada) cmbParadaOrigenExcecao.getSelectedItem().getValue();
		Parada destino = (Parada) cmbParadaDestinoExcecao.getSelectedItem().getValue();
		
		if(origen.equals(destino)) {
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.RutaImcsExcepcionOrigenDestinoIguais"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return false;
		}
		
		if(lsRutaIcmsExcepcions != null) {
			for (RutaIcmsExcepcion rie: lsRutaIcmsExcepcions) {
				if(rie.getDestino().equals(destino) && rie.getOrigen().equals(origen)) {
					Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.RutaImcsExcepcionOrigenDestinoJaAdicionados"),
							Labels.getLabel("editarCatalogoDeRutaController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return false;
				}
			}
		}
		
		return true;
	}

	public void onClick$btnRemoverIcmsExcecao(Event ev) {
		try {
			if (ruta.getRutaId() == null && (ruta.getIsClone() != null && ruta.getIsClone())) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.ExcluirRutaImcsExcepcionCloneError"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return;
			}
			
			if(rutaIcmsExcepcionsList.getSelectedIndex() == -1) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.RutaImcsExcepcionNaoSelecionado"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
				return;
			}
			
			RutaIcmsExcepcion rutaIcmsExcepcion = (RutaIcmsExcepcion) rutaIcmsExcepcionsList.getSelected();
			int idx = rutaIcmsExcepcionsList.getSelectedIndex();
			
			if(rutaIcmsExcepcion.getRutaIcmsExcepcionId() != null) {
				rutaIcmsExcepcionService.borrar(rutaIcmsExcepcion);
			}
			lsRutaIcmsExcepcions.remove(idx);
			rutaIcmsExcepcionsList.setData(lsRutaIcmsExcepcions);
			
		} catch (Exception ex) {
			log.error(ex.getMessage(), ex);
			Clients.alert(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.ERROR);
		}
	}

	public ParadaSecuencia getParadaSecuencia() {
		return paradaSecuencia;
	}

	public void setParadaSecuencia(ParadaSecuencia paradaSecuencia) {
		this.paradaSecuencia = paradaSecuencia;
	}

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

	public void setLsEmbarqueDesembarque(List<ParadaSecuencia> lsEmbarqueDesembarque) {
		this.lsEmbarqueDesembarque = lsEmbarqueDesembarque;
	}

	public Row getLinhaEmpresaAutorizadora() {
		return linhaEmpresaAutorizadora;
	}

	public void setLinhaEmpresaAutorizadora(Row linhaEmpresaAutorizadora) {
		this.linhaEmpresaAutorizadora = linhaEmpresaAutorizadora;
	}

	public List<Empresa> getLsEmpresaAutorizadora() {
		return lsEmpresaAutorizadora;
	}

	public void setLsEmpresaAutorizadora(List<Empresa> lsEmpresaAutorizadora) {
		this.lsEmpresaAutorizadora = lsEmpresaAutorizadora;
	}

	public Combobox getCmbEmpresaAutorizadora() {
		return cmbEmpresaAutorizadora;
	}

	public void setCmbEmpresaAutorizadora(Combobox cmbEmpresaAutorizadora) {
		this.cmbEmpresaAutorizadora = cmbEmpresaAutorizadora;
	}

	public Row getLinhaStatus() {
		return linhaStatus;
	}

	public void setLinhaStatus(Row linhaStatus) {
		this.linhaStatus = linhaStatus;
	}

	public MyTextbox getTxtStatus() {
		return txtStatus;
	}

	public void setTxtStatus(MyTextbox txtStatus) {
		this.txtStatus = txtStatus;
	}

	public Boolean getIsAprovacaoLinhas() {
		return isAprovacaoLinhas;
	}

	public void setIsAprovacaoLinhas(Boolean isAprovacaoLinhas) {
		this.isAprovacaoLinhas = isAprovacaoLinhas;
	}

	public Toolbar getBarraDeAprovacaoDeLinha() {
		return barraDeAprovacaoDeLinha;
	}

	public void setBarraDeAprovacaoDeLinha(Toolbar barraDeAprovacaoDeLinha) {
		this.barraDeAprovacaoDeLinha = barraDeAprovacaoDeLinha;
	}

	public Toolbar getBarraDeCadastro() {
		return barraDeCadastro;
	}

	public void setBarraDeCadastro(Toolbar barraDeCadastro) {
		this.barraDeCadastro = barraDeCadastro;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

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

	public Button getBtnCancelarRetomar() {
		return btnCancelarRetomar;
	}

	public void setBtnCancelarRetomar(Button btnCancelarRetomar) {
		this.btnCancelarRetomar = btnCancelarRetomar;
	}

	public Row getRowIncluirSequencia() {
		return rowIncluirSequencia;
	}

	public void setRowIncluirSequencia(Row rowIncluirSequencia) {
		this.rowIncluirSequencia = rowIncluirSequencia;
	}

	public Row getRowAdicionarRuta() {
		return rowAdicionarRuta;
	}

	public void setRowAdicionarRuta(Row rowAdicionarRuta) {
		this.rowAdicionarRuta = rowAdicionarRuta;
	}

	public Row getRowAddEmbarqueDesembarque() {
		return rowAddEmbarqueDesembarque;
	}

	public void setRowAddEmbarqueDesembarque(Row rowAddEmbarqueDesembarque) {
		this.rowAddEmbarqueDesembarque = rowAddEmbarqueDesembarque;
	}

	public Row getRowAddICMS() {
		return rowAddICMS;
	}

	public void setRowAddICMS(Row rowAddICMS) {
		this.rowAddICMS = rowAddICMS;
	}

	public Button getBtModificar() {
		return btModificar;
	}

	public void setBtModificar(Button btModificar) {
		this.btModificar = btModificar;
	}

	public Boolean getIsBloqueadoParaAlteracao() {
		return isBloqueadoParaAlteracao;
	}

	public void setIsBloqueadoParaAlteracao(Boolean isBloqueadoParaAlteracao) {
		this.isBloqueadoParaAlteracao = isBloqueadoParaAlteracao;
	}

	public Button getBtnLiberarRuta() {
		return btnLiberarRuta;
	}

	public void setBtnLiberarRuta(Button btnLiberarRuta) {
		this.btnLiberarRuta = btnLiberarRuta;
	}

	public Button getBtnBloquearRuta() {
		return btnBloquearRuta;
	}

	public void setBtnBloquearRuta(Button btnBloquearRuta) {
		this.btnBloquearRuta = btnBloquearRuta;
	}
	
	public void onClick$btnLiberarRuta(Event ev) throws InterruptedException {
		try {
			if (ruta.getIndRutaCancelada()) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.linhaDesativada"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
	
			if (StatusAutorizacaoRuta.LIBERADO.getStatus().equals(ruta.getStatusAutorizadora())) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.orgaoLinhaJaLiberada"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}

			ruta.setStatusAutorizadora(StatusAutorizacaoRuta.LIBERADO.getStatus());
			ruta = rutaService.suscribir(ruta, null);
			
			rutaList.removeItem(ruta);
			rutaList.addItemNovo(ruta);

			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.linhaLiberada"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} catch (BusinessException e) {
			log.error("Erro ao liberar Linha: ", e);
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.erroAoLiberarLinha"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnBloquearRuta(Event ev) throws InterruptedException {
		try {
			if (ruta.getIndRutaCancelada()) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.linhaDesativada"), 
						Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
	
			if (StatusAutorizacaoRuta.BLOQUEADO.getStatus().equals(ruta.getStatusAutorizadora())) {
				Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.msg.orgaoLinhaJaBloqueada"),
						Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
			
			if (StatusAutorizacaoRuta.LIBERADO.getStatus().equals(ruta.getStatusAutorizadora())) {
				
				int resp = Messagebox.show( Labels.getLabel("editarCatalogoDeRutaController.bloquearLinhaLiberada"),
						Labels.getLabel("editarEmpresaController.window.title"), Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (resp == Messagebox.NO) {
					return;
				}
			}

			ruta.setStatusAutorizadora(StatusAutorizacaoRuta.BLOQUEADO.getStatus());
			ruta = rutaService.suscribir(ruta, null);
			
			rutaList.removeItem(ruta);
			rutaList.addItemNovo(ruta);

			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.linhaBloqueada"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} catch (BusinessException e) {
			log.error("Erro ao Bloquear Linha: ", e);
			Messagebox.show(Labels.getLabel("editarCatalogoDeRutaController.MSG.erroAoBloquearLinha"),
					Labels.getLabel("editarCatalogoDeRutaController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}	

}