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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.LazyInitializationException;
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.event.CheckEvent;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zkplus.databind.BindingListModelList;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Div;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.constantes.TipoSeguro;
import com.rjconsultores.ventaboletos.entidad.CasetaPeaje;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.RutaCaseta;
import com.rjconsultores.ventaboletos.entidad.RutaEmpresa;
import com.rjconsultores.ventaboletos.entidad.RutaSecuencia;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.CasetaPeajeService;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.RutaEmpresaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.service.TarifaOficialService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.CustomEnum;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParada;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRutaDesc;

/**
 * 
 * @author Gleimar
 */
@Controller("generarTarifaOrgaoController")
@Scope("prototype")
public class GenerarTarifaOrgaoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(GenerarTarifaOrgaoController.class);
	
	@Autowired
	private RutaService rutaService;
	@Autowired
	private RutaEmpresaService rutaEmpresaService;
	@Autowired
	private TarifaOficialService tarifaOficialService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private CasetaPeajeService casetaPeajeService;
	@Autowired
	private ConstanteService constanteService;
	private List<Parada> lsParada;
	private List<Ruta> lsRuta;
	private List<OrgaoConcedente> lsOrgaoConcedente;
	private List<Empresa> lsEmpresa;
	private Combobox cmbRuta;
	private Combobox cmbOrgaoConcedente;
	private Combobox cmbEmpresa;
	private Combobox cmbParada;
	
	private Checkbox chkTarifa;
	private Checkbox chkTaxaEmbarque;
	private Checkbox chkArredondarTaxaEmbarque;
	private Checkbox chkSeguro;
	private Checkbox chkZerarTabela;
	private Checkbox chkPedagio;
	private Checkbox chkGerarTaxaDeEmbarquePorLocalidade;
	private Checkbox chkTipoSeguro;
	private List<Ruta> listSelectedRutas;
	private MyListbox selectedRutasList;
	private List<Parada> listSelectedParadas;
	private MyListbox selectedParadasList;
	private List<Empresa> lsEmpresaSelected;	
	private Combobox cmbCasetaPeaje;
	private List<CasetaPeaje> listSelectedCasetaPeaje;
	private MyListbox selectedCasetaPeajeList;
	private List<CasetaPeaje> lsCasetaPeaje;
	private Boolean esperar = false;
	private Div paradaDiv;
	Set<Integer> lsIdsOrgSemIndice = new HashSet<Integer>();
	private Boolean filtraPorPracaDePedagio=false;
	private Div casetaPeajeDiv;
	
	public static final String FILTRAR_POR_PRACA_DE_PEDAGIO = "FILTRAR_POR_PRACA_DE_PEDAGIO";
	

	public Div getParadaDiv() {
		return paradaDiv;
	}

	public void setParadaDiv(Div paradaDiv) {
		this.paradaDiv = paradaDiv;
	}

	public List<Empresa> getLsEmpresaSelected() {
		return lsEmpresaSelected;
	}

	public void setLsEmpresaSelected(List<Empresa> lsEmpresaSelected) {
		this.lsEmpresaSelected = lsEmpresaSelected;
	}

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

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

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

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsOrgaoConcedente = orgaoConcedenteService.obtenerTodos();
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsRuta = rutaService.buscarRutasPorEmpresas(lsEmpresa);

		

		super.doAfterCompose(comp);
		selectedRutasList.setItemRenderer(new RenderRutaDesc());
		selectedParadasList.setItemRenderer(new RenderParada());		
		listSelectedRutas = new ArrayList<Ruta>();
		lsEmpresaSelected = new ArrayList<Empresa>();
		
		listSelectedParadas = new ArrayList<Parada>();
		paradaDiv.setVisible(false);
		
		if (!ApplicationProperties.getInstance().isCustomHabilitado(CustomEnum.EXIBE_TPP.getDescricao())) {
				chkTipoSeguro.setVisible(false);
		}
		
		lsCasetaPeaje = casetaPeajeService.buscarTodosOrdenadoPorDescricao();
		listSelectedCasetaPeaje = new ArrayList<CasetaPeaje>();
		filtraPorPracaDePedagio=buscarContantefiltrarPorPracaDePedagio();
		casetaPeajeDiv.setVisible(false);
		
		

	  
	}

	public void onClick$chkZerarTabela(Event ev)
	{
		if (chkZerarTabela.isChecked())
		{
			chkTarifa.setChecked(false);
			chkTarifa.setDisabled(true);
			chkTaxaEmbarque.setChecked(false);
			chkTaxaEmbarque.setDisabled(true);
			chkSeguro.setChecked(false);
			chkSeguro.setDisabled(true);
			chkTipoSeguro.setDisabled(true);
			chkPedagio.setChecked(false);
			chkTipoSeguro.setChecked(false);
			chkPedagio.setDisabled(true);
			chkArredondarTaxaEmbarque.setChecked(false);
			chkArredondarTaxaEmbarque.setDisabled(true);			
			paradaDiv.setVisible(true);	
		} else
		{
			chkTarifa.setDisabled(false);
			chkTarifa.setChecked(true);
			chkTaxaEmbarque.setDisabled(false);
			chkSeguro.setDisabled(false);
			chkTipoSeguro.setDisabled(false);
			chkPedagio.setDisabled(false);
			chkArredondarTaxaEmbarque.setDisabled(false);
			chkArredondarTaxaEmbarque.setChecked(true);
			paradaDiv.setVisible(false);
		}
	}
	
	public void onCheck$chkPedagio(CheckEvent ev) {
		if (filtraPorPracaDePedagio) {
			if (chkPedagio.isChecked()) {
				casetaPeajeDiv.setVisible(true);
			} else {
				casetaPeajeDiv.setVisible(false);
				listSelectedCasetaPeaje = new ArrayList<CasetaPeaje>();
				selectedCasetaPeajeList.clear();
			}
		}
	}
	
	public void onCheck$chkGerarTaxaDeEmbarquePorLocalidade(CheckEvent  ev)
	{
		if (chkGerarTaxaDeEmbarquePorLocalidade.isChecked())
		{   
			listSelectedParadas = new ArrayList<Parada>();			
			carregarParadas();
			chkTaxaEmbarque.setChecked(true);
			chkTaxaEmbarque.setDisabled(true);			
			chkTarifa.setChecked(false);
			chkTarifa.setDisabled(true);			
			chkSeguro.setChecked(false);
			chkSeguro.setDisabled(true);
			chkTipoSeguro.setDisabled(true);
			chkPedagio.setChecked(false);
			chkTipoSeguro.setChecked(false);
			chkPedagio.setDisabled(true);
			paradaDiv.setVisible(true);
		} else
		{   
			listSelectedParadas = new ArrayList<Parada>();	
			selectedParadasList.setData(listSelectedParadas);
			chkTarifa.setDisabled(false);
			chkTarifa.setChecked(true);
			chkTaxaEmbarque.setDisabled(false);
			chkTaxaEmbarque.setChecked(false);
			chkSeguro.setDisabled(false);
			chkTipoSeguro.setDisabled(false);
			chkPedagio.setDisabled(false);
			chkArredondarTaxaEmbarque.setDisabled(false);
			chkArredondarTaxaEmbarque.setChecked(true);			
			paradaDiv.setVisible(false);
			lsParada=null;
			
		}
	}

	public void onClick$btnGenerarVigencia(Event ev) throws InterruptedException {
		Boolean limparRutas = false;
		cmbOrgaoConcedente.getValue();
		cmbEmpresa.getValue();

		OrgaoConcedente orgaoConcedente = null;

		if (cmbOrgaoConcedente.getSelectedItem() != null) {
			orgaoConcedente = ((OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue());
		}

		lsEmpresaSelected = Arrays.asList((Empresa) cmbEmpresa.getSelectedItem().getValue());

		
		if (orgaoConcedente == null) {
			int resp = Messagebox.show(
					Labels.getLabel("generarTarifaOrgaoController.MSG.gerarTodosOrgaos"),
					Labels.getLabel("indexController.mniGenerarTarifaOrgao.label"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.NO) {
				return;
			}
		}
		
		if (listSelectedRutas == null || listSelectedRutas.isEmpty()) {
			limparRutas = true;
			if (chkGerarTaxaDeEmbarquePorLocalidade.isChecked()) {
				lsRuta = rutaService.buscarRutasPorEmpresaOrgaoConcedenteParadaIds((Empresa) cmbEmpresa.getSelectedItem().getValue(), orgaoConcedente, converteListIdsEmArrayIds(retornarListParadaIds(listSelectedParadas)));
			} else {
				if(!listSelectedCasetaPeaje.isEmpty()) {
				lsRuta = rutaService.buscarPorOrgaoEcasetaPeaje(orgaoConcedente, converterLiistDeCasetaPeajeEmArrayDeCasetaPeaje(listSelectedCasetaPeaje),(Empresa) cmbEmpresa.getSelectedItem().getValue());
				// orgao = null;
				List<Ruta> lsRutaAux = new ArrayList<Ruta>();
				lsRutaAux.addAll(lsRuta);
				for (Ruta r : lsRutaAux) {
					if (r.getOrgaoConcedente().getIndicePeaje() == null) {
						lsRuta.remove(r);
					}
				}
				}

			}
		    listSelectedRutas = lsRuta;
		    
		} else if (chkPedagio.isChecked() && !validaSeTodasAsRutasPossuiPeloMenosUmaSecuenciaComApracaDePedagio()) {
			return;
		}

		if (!chkZerarTabela.isChecked()) {
			try {
				Usuario usuario = UsuarioLogado.getUsuarioLogado();
				log.info("INICIO DE GERAR TARIFA OFICIAL -- USUARIO: " + usuario.getUsuarioId());
				
				if (chkTarifa.isChecked()) {
					tarifaOficialService.gerarAtualizarTarifa(listSelectedRutas, orgaoConcedente, lsEmpresaSelected,converterLiistDeCasetaPeajeEmArrayDeCasetaPeaje(listSelectedCasetaPeaje));
					log.info("FIM DE GERAR TARIFA OFICIAL -- TARIFA");
				}

				boolean gerarTabelaZerada = !chkTarifa.isChecked();
				List<Integer> lsParadaIds =null;
				if (chkTaxaEmbarque.isChecked()) {
					if(chkGerarTaxaDeEmbarquePorLocalidade.isChecked() && !listSelectedParadas.isEmpty()) {
						lsParadaIds=retornarListParadaIds(listSelectedParadas);
					}
					tarifaOficialService.atualizarTaxaEmbarque(listSelectedRutas, orgaoConcedente.getOrgaoConcedenteId(), gerarTabelaZerada, lsEmpresaSelected,lsParadaIds);
					
					log.info("FIM DE GERAR TARIFA OFICIAL -- TAXA DE EMBARQUE");
				}

				if (chkSeguro.isChecked()) {
					tarifaOficialService.atualizarSeguro(listSelectedRutas, orgaoConcedente.getOrgaoConcedenteId(), TipoSeguro.SEGURO);				
				}

				if (chkTipoSeguro.isChecked()) {
					tarifaOficialService.atualizarSeguro(listSelectedRutas, orgaoConcedente.getOrgaoConcedenteId(), TipoSeguro.TPP);
					log.info("FIM DE GERAR TARIFA OFICIAL -- SEGURO");
				}
				
				if (chkPedagio.isChecked()) {
					if(listSelectedCasetaPeaje.isEmpty()) {
					tarifaOficialService.atualizarPedagio();
					}else {
						tarifaOficialService.atualizarPedagioPorListaDePracaDePagio(listSelectedCasetaPeaje, retornarEmpresaId());
					}
					
					log.info("FIM DE GERAR TARIFA OFICIAL -- PEDAGIO");
				}

				if (chkTipoSeguro.isChecked()) {
					tarifaOficialService.atualizarSeguroTPP(listSelectedRutas, orgaoConcedente.getOrgaoConcedenteId(), TipoSeguro.TPP);
					log.info("FIM DE GERAR TARIFA OFICIAL -- SEGURO OPCIONAL");
				}

				tarifaOficialService.aplicarArredondamentoTarifa(orgaoConcedente.getOrgaoConcedenteId(), chkArredondarTaxaEmbarque.isChecked());

				long l = tarifaOficialService.obtenerCount(lsEmpresaSelected);
				log.info("FIM DE GERAR TARIFA OFICIAL: -- USUARIO: " + usuario.getUsuarioId() + "Foram gerados " + l + " registros.");

				Messagebox.show(Labels.getLabel("generarTarifaOrgaoController.MSG.suscribirOK", new Object[] { l }),
						Labels.getLabel("indexController.mniGenerarTarifaOrgao.label"),
						Messagebox.OK, Messagebox.INFORMATION);

			} catch (BusinessException e) {
				log.error("ERROR AO GERAR TARIFA OFICIAL:", e);
				Messagebox.show(e.getLocalizedMessage(),
						Labels.getLabel("indexController.mniGenerarTarifaOrgao.label"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} else {
			try {
				tarifaOficialService.gerarAtualizarTabelaZerada(listSelectedRutas, orgaoConcedente.getOrgaoConcedenteId(), lsEmpresaSelected,null);

				Messagebox.show(Labels.getLabel("generarTarifaOrgaoController.MSG.suscribirOK"),
						Labels.getLabel("indexController.mniGenerarTarifaOrgao.label"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (BusinessException e) {
				log.error("ERROR AO GERAR TARIFA OFICIAL:", e);
				Messagebox.show(e.getLocalizedMessage(),
						Labels.getLabel("indexController.mniGenerarTarifaOrgao.label"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		}
		if (limparRutas) {
			listSelectedRutas.clear();
		}
	}

	private Integer retornarEmpresaId() {
		Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
        return empresa.getEmpresaId();
	}

	public List<Ruta> getListSelectedRutas() {
		return listSelectedRutas;
	}

	public void setListSelectedRutas(List<Ruta> listSelectedRutas) {
		this.listSelectedRutas = listSelectedRutas;
	}

	public void onClick$btnAddRuta(Event ev) throws InterruptedException {
		if (esperar) {
			cmbRuta.setSelectedItem(null);
			return;
		}
		if (cmbRuta.getSelectedItem() != null) {
			listSelectedRutas.add((Ruta) cmbRuta.getSelectedItem().getValue());
			selectedRutasList.setData(listSelectedRutas);
			cmbRuta.setSelectedItem(null);
			if (chkGerarTaxaDeEmbarquePorLocalidade.isChecked()) {
				carregarParadas();
			}
		}
	}

	public void onClick$btnRemoveRuta(Event ev) throws InterruptedException {
		Ruta ruta = (Ruta) selectedRutasList.getSelected();
		listSelectedRutas.remove(ruta);
		selectedRutasList.setData(listSelectedRutas);
		if (chkGerarTaxaDeEmbarquePorLocalidade.isChecked()) {
			carregarParadas();
		}
	}
	
	
	public void onClick$btnAddParada(Event ev) throws InterruptedException {
		if (esperar) {
			cmbParada.setSelectedItem(null);
			return;
		}
		if (cmbParada.getSelectedItem() != null) {
			listSelectedParadas.add((Parada) cmbParada.getSelectedItem().getValue());
			selectedParadasList.setData(listSelectedParadas);
			cmbParada.setSelectedItem(null);
		}
	}

	public void onClick$btnRemovePArada(Event ev) throws InterruptedException {
		Parada parada = (Parada) selectedParadasList.getSelected();
		listSelectedParadas.remove(parada);
		selectedParadasList.setData(listSelectedParadas);
	}
	
	

	public List<Parada> getLsParada() {
		return lsParada;
	}


	public void onSelect$cmbOrgaoConcedente(Event ev) {
		onSelectEmpresaOrgaoConcedente();
	}

	public void onSelect$cmbEmpresa(Event ev) throws InterruptedException {
		onSelectEmpresaOrgaoConcedente();
	}
	
	

	public void onSelectEmpresaOrgaoConcedente() {
		Constraint constraint = cmbEmpresa.getConstraint();
		cmbEmpresa.setConstraint("");
		Empresa empresaSelected = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
		cmbEmpresa.setConstraint(constraint);
		OrgaoConcedente orgaoSelected = cmbOrgaoConcedente.getSelectedItem() == null ? null : (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();

		esperar = true;

		lsRuta = rutaService.buscarRutasPorEmpresaOrgaoConcedente(empresaSelected, orgaoSelected);
		
		
		BindingListModelList l = new BindingListModelList(lsRuta, true);
		cmbRuta.setModel(l);

		

		int indexToRemove = 0;
		boolean achou = false;
		List<Integer> indexList = new ArrayList<Integer>();

		for (final Ruta ruta : listSelectedRutas) {
			if (orgaoSelected == null || orgaoSelected.getOrgaoConcedenteId() == -1 || ruta.getOrgaoConcedente().equals(orgaoSelected)) {
				try {
					ruta.getLsRutaEmpresa();
				} catch (LazyInitializationException e) {
					ruta.setLsRutaEmpresa(rutaEmpresaService.obtenerPorRuta(ruta));
				}
				for (RutaEmpresa rutaEmpresa : ruta.getLsRutaEmpresa()) {
					if (empresaSelected == null || rutaEmpresa.getEmpresa().equals(empresaSelected)) {
						achou = true;
					}
				}
			}
			if (!achou) {
				indexList.add(indexToRemove);
			}
			indexToRemove++;
			achou = false;
		}

		for (Integer i : indexList) {
			Ruta ruta = listSelectedRutas.get(i);
			listSelectedRutas.remove(ruta);
		}
		if(chkGerarTaxaDeEmbarquePorLocalidade.isChecked()) {
		carregarParadas();		
		}
		selectedRutasList.setData(listSelectedRutas);
		cmbRuta.setSelectedItem(null);
		esperar = false;
	}

	private void carregarParadas() {
		if (!listSelectedRutas.isEmpty()) {
			lsParada = paradaService.obtenerOrigenPorListRutaIds(null, null, converteListIdsEmArrayIds(retornarListRutaIds(listSelectedRutas)));
		} else {
			if (lsRuta.isEmpty()) {
				Constraint constraint = cmbEmpresa.getConstraint();
				cmbEmpresa.setConstraint("");
				Empresa empresaSelected = cmbEmpresa.getSelectedItem() == null ? null : (Empresa) cmbEmpresa.getSelectedItem().getValue();
				cmbEmpresa.setConstraint(constraint);
				OrgaoConcedente orgaoSelected = cmbOrgaoConcedente.getSelectedItem() == null ? null : (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue();
				lsParada = paradaService.obtenerOrigenPorListRutaIds(orgaoSelected == null ? null : orgaoSelected.getOrgaoConcedenteId(), empresaSelected == null ? null : empresaSelected.getEmpresaId(), null);
			} else {
				lsParada = paradaService.obtenerOrigenPorListRutaIds(null, null, converteListIdsEmArrayIds(retornarListRutaIds(lsRuta)));
			}
		}
		
		
		List<Parada> listSelectedParadasAux = new ArrayList<Parada>();
		listSelectedParadasAux.addAll(listSelectedParadas);
		if(!listSelectedParadas.isEmpty()) {
			for(Parada parada :listSelectedParadasAux ) {
				if(!lsParada.contains(parada)) {
					listSelectedParadas.remove(parada);					
				}
			}
		}
		
		BindingListModelList l = new BindingListModelList(lsParada, true);
		cmbParada.setModel(l);
		
		
		selectedParadasList.setData(listSelectedParadas);
	}
	
	
	private Integer[] converteListIdsEmArrayIds(List<Integer> ids) {		
		Integer[] arrayIds = new Integer[ids.size()]; 
		arrayIds = ids.toArray(arrayIds);
		return arrayIds;
	}
	
		private List<Integer> retornarListRutaIds(List<Ruta> lsRutasSelecionadas) {
		List<Integer> listRutasId = new ArrayList<Integer>();
		for (Ruta r : lsRutasSelecionadas) {
			listRutasId.add(r.getRutaId());
		}

		return listRutasId;
	}
		
		
		private List<Integer> retornarListParadaIds(List<Parada> lsParadassSelecionadas) {
			List<Integer> listParadasId = new ArrayList<Integer>();
			for (Parada p : lsParadassSelecionadas) {
				listParadasId.add(p.getParadaId());
			}
			return listParadasId;
		}
		
		
		public void onClick$btnAddCasetaPeaje(Event ev) throws InterruptedException {
			if (cmbCasetaPeaje.getSelectedItem() != null) {
				listSelectedCasetaPeaje.add((CasetaPeaje) cmbCasetaPeaje.getSelectedItem().getValue());
				selectedCasetaPeajeList.setData(listSelectedCasetaPeaje);
				cmbCasetaPeaje.setSelectedItem(null);
			}
		}
		
		public void onClick$btnRemoveCasetaPeaje(Event ev) throws InterruptedException {
			CasetaPeaje  casetaPeaje= (CasetaPeaje) selectedCasetaPeajeList.getSelected();
			listSelectedCasetaPeaje.remove(casetaPeaje);
			selectedCasetaPeajeList.setData(listSelectedCasetaPeaje);
		}
		
		
		private Boolean validaSeTodasAsRutasPossuiPeloMenosUmaSecuenciaComApracaDePedagio() throws InterruptedException {
			if (!listSelectedCasetaPeaje.isEmpty() && !listSelectedRutas.isEmpty()) {
				List<Ruta> lsRutaAuxiliar = new ArrayList<Ruta>();	
				retornarApenasRutaQuePossuiSecuenciasComAsPracas(lsRutaAuxiliar);
				for (Ruta ruta : listSelectedRutas) {
					if (!lsRutaAuxiliar.contains(ruta)) {
						Messagebox.show(Labels.getLabel("calcularPeajeController.MSG.linhaSemPracaDePedagio", new Object[] { ruta }),
								Labels.getLabel("indexController.mniCalculoPeaje.label"), Messagebox.OK, Messagebox.ERROR);
						return false;
					}
				}
			}
			return true;
		}
		
		private void retornarApenasRutaQuePossuiSecuenciasComAsPracas(List<Ruta> lsRutaAuxiliar) {
			List<Ruta> listSelectedRutasAux = recarregarAsRutasComBanco(listSelectedRutas);
			for (CasetaPeaje casetaPeaje : listSelectedCasetaPeaje) {
					for (Ruta r : listSelectedRutasAux) {
						if (!r.getRutaSecuenciaList().isEmpty()) {
							Boolean isRutaSecuencia = false;
							for (RutaSecuencia rutaSecuencia : r.getRutaSecuenciaList()) {
								if (isRutaSecuencia)
									break;
								if (rutaSecuencia.getActivo()) {
									for (RutaCaseta rutaCaseta : rutaSecuencia.getLsRutaCase()) {
										if (rutaCaseta.getActivo() && rutaCaseta.getCasetaPeaje().getCasetaPeajeId().intValue() == casetaPeaje.getCasetaPeajeId().intValue()) {
											lsRutaAuxiliar.add(r);
											isRutaSecuencia = true;
											break;
										}
									}
								}
							}
						}
					}
				}
			}
		
		
		List<Ruta> recarregarAsRutasComBanco(List<Ruta> lsRutasSelecionadas){	
			List<Integer> lsRutaIds=retornarListRutaIds(lsRutasSelecionadas);
			Integer[] arrayDeRutaIds = converteListIdsEmArrayIds(lsRutaIds);
			return rutaService.buscarPorIds(arrayDeRutaIds);		
		}
		
		
		private Integer[] converterLiistDeCasetaPeajeEmArrayDeCasetaPeaje(List<CasetaPeaje> lsCasetaPeaje) {
			if(!lsCasetaPeaje.isEmpty()) {
				return converteListIdsEmArrayIds(retornarListCasetaPeajeIds(lsCasetaPeaje));
			}
			return null;
		}
		
		
		private List<Integer> retornarListCasetaPeajeIds(List<CasetaPeaje> lsCasetaPeaje) {
			List<Integer> listCasetaPeaje= new ArrayList<Integer>();
			for (CasetaPeaje c : lsCasetaPeaje) {
				listCasetaPeaje.add(c.getCasetaPeajeId());
			}
			return listCasetaPeaje;
		}
		
		
		public List<CasetaPeaje> getLsCasetaPeaje() {
			return lsCasetaPeaje;
		}

		public void setLsCasetaPeaje(List<CasetaPeaje> lsCasetaPeaje) {
			this.lsCasetaPeaje = lsCasetaPeaje;
		}
		
		private Boolean buscarContantefiltrarPorPracaDePedagio() {
			Constante constante = constanteService.buscarPorNomeConstante(FILTRAR_POR_PRACA_DE_PEDAGIO);
			if (constante != null) {
				if(constante.getValorconstante().equalsIgnoreCase("true")) {
					return true;
				}
			}
			return false;
			
		}

}
