package com.rjconsultores.ventaboletos.web.gui.componente.esquemaoperacional;

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zkplus.databind.DataBinder;
import org.zkoss.zkplus.spring.SpringUtil;
import org.zkoss.zul.Column;
import org.zkoss.zul.Columns;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Hbox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Menuitem;
import org.zkoss.zul.Menupopup;
import org.zkoss.zul.RendererCtrl;
import org.zkoss.zul.Row;
import org.zkoss.zul.RowRenderer;
import org.zkoss.zul.Spinner;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoServicio;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.service.TramoServicioService;
import com.rjconsultores.ventaboletos.utilerias.HoraSistema;
import com.rjconsultores.ventaboletos.vo.esquemaoperacional.SecuenciaRutaTramoVO;
import com.rjconsultores.ventaboletos.web.utilerias.PantallaUtileria;

/**
 * Grid con la representacion de los tramos y secuencias de la ruta
 * 
 * @author gleimar
 * 
 */
public class GridRutaTramo extends Grid implements RowRenderer, RendererCtrl {

	private static final long serialVersionUID = 1L;
	private List<Via> lsVias;
	private List<SecuenciaRutaTramoVO> lsSecuenciaRutaTramoVO;
	private ClaseServicio claseServicio;
	private DataBinder dataBinder;
	private boolean mostraPopupGrid;
	private static Logger log = Logger.getLogger(GridRutaTramo.class);
	private boolean isPrimeiraVia;

	public GridRutaTramo() {
		lsVias = new ArrayList<Via>();
		lsSecuenciaRutaTramoVO = new ArrayList<SecuenciaRutaTramoVO>();
		this.setRowRenderer(this);
		this.appendChild(generarColumns());
		dataBinder = new DataBinder();
		mostraPopupGrid = true;
	}

	public boolean isMostraPopupGrid() {
		return mostraPopupGrid;
	}

	public void setMostraPopupGrid(boolean mostraPopupGrid) {
		this.mostraPopupGrid = mostraPopupGrid;
	}

	/**
	 * Informa la lista de vias disponibles
	 * 
	 * @param lsVias
	 */
	public void setLsVias(List<Via> lsVias) {
		this.lsVias = lsVias;
	}

	/**
	 * Cuás es la clase de servicio confiugrada
	 * 
	 * @return
	 */
	public ClaseServicio getClaseServicio() {
		return claseServicio;
	}

	/**
	 * Indica cuál es la clase de servicio usada para hacer la búsqueda de los tramos
	 * 
	 * @param claseServicio
	 */
	public void setClaseServicio(ClaseServicio claseServicio) {
		if (!lsSecuenciaRutaTramoVO.isEmpty()) {
			lsSecuenciaRutaTramoVO.clear();
			actualizaModel();
		}

		this.claseServicio = claseServicio;
	}

	private ListModelList getListViaCombobox() {
		return new ListModelList(lsVias);
	}

	/**
	 * Limpia los registros que existen y agrega todos
	 * 
	 * @param lsSecuenciaRutaTramoVO
	 */
	public void agregarTodos(List<SecuenciaRutaTramoVO> lsSecuenciaRutaTramoVO) {
		this.lsSecuenciaRutaTramoVO.clear();
		this.lsSecuenciaRutaTramoVO.addAll(lsSecuenciaRutaTramoVO);

		actualizaModel();
	}

	/**
	 * Agrega un nuevo tramo. Si la origen es la ultima parada, agrega al fin. Sino agrega al medio de la secuencia.
	 * 
	 * La parada destino es la que tienes que agregar.
	 * 
	 * @param origen
	 * @param destino
	 * @throws IllegalArgumentException
	 *             - Los parametros origen y destino son obligatorios
	 * @throws ParadaExisteException
	 *             - Cuándo el destino que se intenta agregar ya está agregado
	 */
	public void agregarSecuencia(Parada origen, Parada destino, Via via) throws IllegalArgumentException, ParadaExisteException {
		
		try {		
			dataBinder.saveAll();
			dataBinder = new DataBinder();
		}catch (Exception e) {
			e.printStackTrace();
			System.out.println("\n\nExecption: " + e.getMessage());			
		}
		
		if ((origen == null) || (destino == null)) {
			throw new IllegalArgumentException(Labels.getLabel("gridRutaSecuencia.agregarSecuencia.exception.origenDestinoObligatorio"));
		}

		if (existe(destino)) {
			MessageFormat mf = new MessageFormat(Labels.getLabel("gridRutaSecuencia.paradaExisteException.msg"));
			Object[] o = { destino.getDescparada() };
			throw new ParadaExisteException(mf.format(o));
		}

		if (lsSecuenciaRutaTramoVO.isEmpty()) {
			SecuenciaRutaTramoVO s = new SecuenciaRutaTramoVO(origen, destino, 1, via);
			llenarTramo(s);
			lsSecuenciaRutaTramoVO.add(s);
		} else if ((getUltimaParada() != null) && (getUltimaParada().equals(origen))) {
			Integer secuence = lsSecuenciaRutaTramoVO.size() + 1;
			SecuenciaRutaTramoVO secuenciaRutaVO = new SecuenciaRutaTramoVO(origen, destino, secuence, via);
			llenarTramo(secuenciaRutaVO);
			lsSecuenciaRutaTramoVO.add(secuenciaRutaVO);
		} else {
			List<Parada> lsParadas = new ArrayList<Parada>();

			for (SecuenciaRutaTramoVO s : lsSecuenciaRutaTramoVO) {
				if (!lsParadas.contains(s.getOrigen())) {
					lsParadas.add(s.getOrigen());
				}
				if (!lsParadas.contains(s.getDestino())) {
					lsParadas.add(s.getDestino());
				}
			}
			int indexOf = lsParadas.indexOf(origen);
			if (indexOf != -1) {
				lsParadas.add(indexOf + 1, destino);
			} else {
				indexOf = lsParadas.indexOf(destino);
				if (indexOf != -1) {
					lsParadas.add(indexOf, origen);
				}
			}

			List<SecuenciaRutaTramoVO> lsSecuenciaRutaTramoNuevoVO = new ArrayList<SecuenciaRutaTramoVO>();
			for (int i = 1; i < lsParadas.size(); i++) {
				Parada origenTramo = lsParadas.get(i - 1);
				Parada destinoTramo = lsParadas.get(i);
				SecuenciaRutaTramoVO s = buscarSecuencia(origenTramo, destinoTramo);

				if (s == null) {
					s = new SecuenciaRutaTramoVO(origenTramo, destinoTramo, i, null);
				}
				s.setSecuencia(i);
				lsSecuenciaRutaTramoNuevoVO.add(s);
			}
			lsSecuenciaRutaTramoVO.clear();
			lsSecuenciaRutaTramoVO.addAll(lsSecuenciaRutaTramoNuevoVO);
		}

		actualizaModel();
	}

	/**
	 * Hace la búsqueda de una secuencia por la origen y destino
	 * 
	 * @param origenTramo
	 * @param destinoTramo
	 * @return
	 */
	private SecuenciaRutaTramoVO buscarSecuencia(Parada origenTramo, Parada destinoTramo) {
		boolean fueEncontrado = false;
		SecuenciaRutaTramoVO s = null;
		for (int j = 0; (j < lsSecuenciaRutaTramoVO.size()) && !fueEncontrado; j++) {
			if (lsSecuenciaRutaTramoVO.get(j).getOrigen().equals(origenTramo)
					&& lsSecuenciaRutaTramoVO.get(j).getDestino().equals(destinoTramo)) {
				s = lsSecuenciaRutaTramoVO.get(j);

				fueEncontrado = true;
			}

		}

		return s;
	}

	/**
	 * Indica si la parada ya esta agregada
	 * 
	 * @param parada
	 * @return
	 */
	public boolean existe(Parada parada) {
		boolean fueEncontrado = false;

		for (int j = 0; (j < lsSecuenciaRutaTramoVO.size()) && !fueEncontrado; j++) {
			if (lsSecuenciaRutaTramoVO.get(j).getOrigen().equals(parada) || lsSecuenciaRutaTramoVO.get(j).getDestino().equals(parada)) {
				fueEncontrado = true;
			}

		}

		return fueEncontrado;
	}

	private Columns generarColumns() {
		Columns columns = new Columns();

		Column columnSecuencia = new Column("#");
		columnSecuencia.setWidth("8%");
		columns.appendChild(columnSecuencia);

		Column columnOrigen = new Column(Labels.getLabel("gridRutaSecuencia.columnOrigen.label"));
		columnOrigen.setWidth("20%");
		columns.appendChild(columnOrigen);

		Column columnDestino = new Column(Labels.getLabel("gridRutaSecuencia.columnDestino.label"));
		columnDestino.setWidth("20%");
		columns.appendChild(columnDestino);

		Column columnVia = new Column(Labels.getLabel("gridRutaSecuencia.columnVia.label"));
		columnVia.setWidth("18%");
		columns.appendChild(columnVia);

		Column kmsReal = new Column(Labels.getLabel("gridRutaSecuencia.columnKmsReal.label"));
		kmsReal.setWidth("12%");
		columns.appendChild(kmsReal);

		Column tiempoRecorrido = new Column(Labels.getLabel("gridRutaSecuencia.columnTiempoRecorrido.label"));
		tiempoRecorrido.setWidth("14%");
		columns.appendChild(tiempoRecorrido);

		Column columnIDTramo = new Column(Labels.getLabel("gridRutaSecuencia.columnIDTramo.label"));
		columnSecuencia.setWidth("6%");
		columns.appendChild(columnIDTramo);

		return columns;
	}

	@Override
	public void render(Row row, Object obj) throws Exception {
		final SecuenciaRutaTramoVO secuenciaRutaTramoVO = (SecuenciaRutaTramoVO) obj;
		// binder row->bean
		dataBinder.bindBean(row.getUuid(), secuenciaRutaTramoVO);

		// Cell secuencia
		Intbox ibxSumSecuencia = new Intbox(secuenciaRutaTramoVO.getSecuencia());
		ibxSumSecuencia.setWidth("70%");
		ibxSumSecuencia.setReadonly(true);
		row.appendChild(ibxSumSecuencia);

		// Cell Origen
		String strOrigem = secuenciaRutaTramoVO.getOrigen().getCveparada() + " - " + secuenciaRutaTramoVO.getOrigen().getDescparada();
		Label lblOrigen = new Label(strOrigem);
		lblOrigen.setWidth("80%");
		Menupopup mnuOrigen = new Menupopup();

		Menuitem mniAgregarDespues = new Menuitem(Labels.getLabel("gridRutaSecuencia.msg.agregarDespues"));
		mniAgregarDespues.addEventListener(Events.ON_CLICK, new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {
				Map<String, Object> params = new LinkedHashMap<String, Object>();
				params.put("gridRutaSecuencia", GridRutaTramo.this);
				params.put("origen", secuenciaRutaTramoVO.getOrigen());

				PantallaUtileria.openWindow("/gui/esquema_operacional/generacion_tramo_ruta/nuevaParada.zul",
						Labels.getLabel("nuevaParadaController.window.title"), params, PantallaUtileria.MODAL, getDesktop());
			}
		});
		mnuOrigen.appendChild(mniAgregarDespues);
		Menuitem mniEliminarPasoOrigen = new Menuitem(Labels.getLabel("gridRutaSecuencia.msg.eliminarPaso"));
		mniEliminarPasoOrigen.addEventListener(Events.ON_CLICK, new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {
				removerParada(secuenciaRutaTramoVO.getOrigen());
			}
		});
		mnuOrigen.appendChild(mniEliminarPasoOrigen);
		mnuOrigen.setPage(getPage());
		if (mostraPopupGrid) {
			lblOrigen.setContext(mnuOrigen);
		}
		row.appendChild(lblOrigen);

		// Cell Destino
		String strDestino = secuenciaRutaTramoVO.getDestino().getCveparada() + " - " + secuenciaRutaTramoVO.getDestino().getDescparada();
		Label lblDestino = new Label(strDestino);
		lblDestino.setWidth("80%");
		Menupopup mnuDestino = new Menupopup();

		Menuitem mniEliminarPasoDestino = new Menuitem(Labels.getLabel("gridRutaSecuencia.msg.eliminarPaso"));
		mniEliminarPasoDestino.addEventListener(Events.ON_CLICK, new EventListener() {

			@Override
			public void onEvent(Event arg0) throws Exception {
				removerParada(secuenciaRutaTramoVO.getDestino());
			}
		});
		mnuDestino.appendChild(mniEliminarPasoDestino);
		mnuDestino.setPage(getPage());
		if (mostraPopupGrid) {
			lblDestino.setContext(mnuDestino);
		}
		row.appendChild(lblDestino);

		// son creados antes pues el cboVia los estan ocupando
		final MyCustomTextboxDecimal dKmsReal = new MyCustomTextboxDecimal((secuenciaRutaTramoVO.getKmReal() == null) ? BigDecimal.ZERO
				: secuenciaRutaTramoVO.getKmReal());
		dKmsReal.setWidth("90%");
//		Trecho faz com nao seja possível salvar o binder uma vez que o km é obrigatório e a 
//		classe MyCustomTextboxDecimal considera vazio como null.		
//		if (secuenciaRutaTramoVO.getKmReal().equals(BigDecimal.ZERO)){
//			dKmsReal.setRawValue("");
//		}

		final Spinner spHora = new Spinner();
		final Spinner spMinuto = new Spinner();
		final Label lblID = new Label("");

		// Cell Via
		final Combobox cboVia = new Combobox();
		cboVia.setId(cboVia.getUuid());
		cboVia.setReadonly(true);
		ListModelList listModelList = getListViaCombobox();
		if (secuenciaRutaTramoVO.getVia() != null) {
			listModelList.addSelection(secuenciaRutaTramoVO.getVia());
		}
		cboVia.setModel(listModelList);
		cboVia.setConstraint("no empty");
		cboVia.addEventListener(Events.ON_CHANGE, new EventListener() {

			@Override
			public void onEvent(Event evt) throws Exception {
				if (cboVia.getSelectedItem() != null) {

					BigDecimal kmRealAntigo = secuenciaRutaTramoVO.getKmReal();
					HoraSistema tiempoRecorridoAntigo = secuenciaRutaTramoVO.getTiempoRecorrido();

					secuenciaRutaTramoVO.setVia((Via) cboVia.getSelectedItem().getValue());
					llenarTramo(secuenciaRutaTramoVO);

					boolean tramoEditable = (secuenciaRutaTramoVO.getTramoId() == null);
					boolean tramoServicioEditable = (secuenciaRutaTramoVO.getTramoServicioId() == null);

					if (!tramoEditable) {// cuando el tramo no es editable, es porque ya existe. Entonces lleno la pantalla con los nuevos valores
						dKmsReal.setValueBigDecimal(secuenciaRutaTramoVO.getKmReal());
					} else {
						secuenciaRutaTramoVO.setKmReal(kmRealAntigo);
					}

					lblID.setValue((secuenciaRutaTramoVO.getTramoId() != null) ? secuenciaRutaTramoVO.getTramoId().toString() : "");

					if (!tramoServicioEditable) {// cuando el tramoServicio no es editable, es porque ya existe. Entonces lleno la pantalla con los nuevos valores
						spHora.setValue(secuenciaRutaTramoVO.getTiempoRecorrido().getHora());
						spMinuto.setValue(secuenciaRutaTramoVO.getTiempoRecorrido().getMinuto());
					} else {
						secuenciaRutaTramoVO.setTiempoRecorrido(tiempoRecorridoAntigo);
					}

					dKmsReal.setReadonly(!tramoEditable);
					spHora.setDisabled(!tramoServicioEditable);
					spHora.setButtonVisible(tramoServicioEditable);
					spHora.setReadonly(!tramoServicioEditable);
					spMinuto.setDisabled(!tramoServicioEditable);
					spMinuto.setButtonVisible(tramoServicioEditable);
					spMinuto.setReadonly(!tramoServicioEditable);

				}
			}
		});
		row.appendChild(cboVia);
		boolean esTramoEditable = (secuenciaRutaTramoVO.getTramoId() == null);
		boolean esTramoServicioEditable = (secuenciaRutaTramoVO.getTramoServicioId() == null);

		// Cell Kms Real
		dKmsReal.setReadonly(!esTramoEditable);
		dataBinder.addBinding(dKmsReal, "value", row.getUuid() + ".kmReal", null, null, "save",
				"com.rjconsultores.ventaboletos.web.utilerias.StringDecimalToDecimalConverter", null, null, null);

		row.appendChild(dKmsReal);

		// Cell Tiempo Recorrido
		Hbox hbox = new Hbox();

		spHora.setWidth("40px");
		spHora.setConstraint("max 99,no negative,no empty");
		spHora.setReadonly(!esTramoServicioEditable);
		spHora.setButtonVisible(esTramoServicioEditable);

		hbox.appendChild(spHora);
		Label lbl = new Label(":");
		hbox.appendChild(lbl);

		spMinuto.setWidth("40px");
		spMinuto.setConstraint("max 59,no negative,no empty");
		spMinuto.setReadonly(!esTramoServicioEditable);
		spMinuto.setButtonVisible(esTramoServicioEditable);
		hbox.appendChild(spMinuto);

		if (secuenciaRutaTramoVO.getTiempoRecorrido() != null) {
			HoraSistema hora = secuenciaRutaTramoVO.getTiempoRecorrido();
			spHora.setValue(hora.getHora());
			spMinuto.setValue(hora.getMinuto());
		}
		dataBinder.addBinding(spHora, "value", row.getUuid() + ".tiempoRecorrido.hora", null, null, "save", null, null, null, null);
		dataBinder.addBinding(spMinuto, "value", row.getUuid() + ".tiempoRecorrido.minuto", null, null, "save", null, null, null, null);
		row.appendChild(hbox);

		// Cell ID Tramo
		if (secuenciaRutaTramoVO.getTramoId() != null) {
			lblID.setValue(secuenciaRutaTramoVO.getTramoId().toString());
		} else {
			lblID.setValue("");
		}
		row.appendChild(lblID);

	}

	/**
	 * Quita la parada de la lista de tramos
	 * 
	 * @param parada
	 */
	private void removerParada(Parada parada) {
		dataBinder.saveAll();
		dataBinder = new DataBinder();

		// ADICIONAR VALIDAÇÃO DO TRAMANHO DA LISTA
		List<Parada> lsParadas = new ArrayList<Parada>();

		BigDecimal totalKmRealRemovido = BigDecimal.ZERO;
		HoraSistema totalTiempoRecorridoRemovido = new HoraSistema();

		for (SecuenciaRutaTramoVO s : lsSecuenciaRutaTramoVO) {
			if (!s.getOrigen().equals(parada)) {
				if (!lsParadas.contains(s.getOrigen())) {
					lsParadas.add(s.getOrigen());
				}
			} else {
				totalKmRealRemovido = totalKmRealRemovido.add(s.getKmReal());
				totalTiempoRecorridoRemovido = totalTiempoRecorridoRemovido.sumar(s.getTiempoRecorrido());
			}
			if (!s.getDestino().equals(parada)) {
				if (!lsParadas.contains(s.getDestino())) {
					lsParadas.add(s.getDestino());
				}
			} else {
				totalKmRealRemovido = totalKmRealRemovido.add(s.getKmReal());
				totalTiempoRecorridoRemovido = totalTiempoRecorridoRemovido.sumar(s.getTiempoRecorrido());
			}
		}

		List<SecuenciaRutaTramoVO> lsSecuenciaRutaTramoNuevoVO = new ArrayList<SecuenciaRutaTramoVO>();

		for (int i = 1; i < lsParadas.size(); i++) {
			Parada origenTramo = lsParadas.get(i - 1);
			Parada destinoTramo = lsParadas.get(i);

			SecuenciaRutaTramoVO s = buscarSecuencia(origenTramo, destinoTramo);
			if (s == null) {
				s = new SecuenciaRutaTramoVO(origenTramo, destinoTramo, i, null);
				// si no existe, es el tramo nuevo. Entonces agrego los valores
				// eliminados
				s.setKmReal(totalKmRealRemovido);
				s.setTiempoRecorrido(totalTiempoRecorridoRemovido);
			}
			s.setSecuencia(i);
			lsSecuenciaRutaTramoNuevoVO.add(s);
		}
		lsSecuenciaRutaTramoVO.clear();
		lsSecuenciaRutaTramoVO.addAll(lsSecuenciaRutaTramoNuevoVO);

		actualizaModel();
	}

	/**
	 * Actualiza el modelo de grid
	 */
	private void actualizaModel() {
		this.setModel(new ListModelList(lsSecuenciaRutaTramoVO, false));
	}

	/**
	 * Indica si hay tramos
	 * 
	 * @return
	 */
	public boolean isEmpty() {
		return lsSecuenciaRutaTramoVO.isEmpty();
	}

	/**
	 * Regresa la primera parada de los tramos
	 * 
	 * @return
	 */
	public Parada getPrimeraParada() {
		if (lsSecuenciaRutaTramoVO.isEmpty()) {
			return null;
		}

		return lsSecuenciaRutaTramoVO.get(0).getOrigen();
	}

	/**
	 * Regresa la ultima parada de los tramos
	 * 
	 * @return
	 */
	public Parada getUltimaParada() {
		if (lsSecuenciaRutaTramoVO.isEmpty()) {
			return null;
		}

		return lsSecuenciaRutaTramoVO.get(lsSecuenciaRutaTramoVO.size() - 1).getDestino();
	}

	/**
	 * Llena el tramo con los datos de un busqueda
	 * 
	 * @param secuenciaRutaTramoVO
	 */
	private void llenarTramo(SecuenciaRutaTramoVO secuenciaRutaTramoVO) {
		TramoServicioService tramoServicioService = (TramoServicioService) SpringUtil.getBean("tramoServicioService");

		Parada destino = secuenciaRutaTramoVO.getDestino();
		Parada origen = secuenciaRutaTramoVO.getOrigen();
		Via via = secuenciaRutaTramoVO.getVia();

		TramoServicio tramoServicio = null;
		if ((destino != null) && (origen != null) && (via != null) && (claseServicio != null)) {
			tramoServicio = tramoServicioService.buscar(origen, destino, via, claseServicio);
		}

		Tramo tramo = null;
		if (tramoServicio != null) {
			tramo = tramoServicio.getTramo();
		} else {
			TramoService tramoService = (TramoService) SpringUtil.getBean("tramoService");
			if ((destino != null) && (origen != null) && (via != null)) {
				tramo = tramoService.buscar(origen, destino, via);
			}
		}

		if (tramoServicio != null) {
			HoraSistema hora = new HoraSistema(tramoServicio.getTiemporecorrido());
			secuenciaRutaTramoVO.setTiempoRecorrido(hora);
			secuenciaRutaTramoVO.setTramoServicioId(tramoServicio.getTramoservicioId());
		} else {
			secuenciaRutaTramoVO.setTiempoRecorrido(null);
			secuenciaRutaTramoVO.setTramoServicioId(null);
		}

		if (tramo != null) {
			secuenciaRutaTramoVO.setKmReal(tramo.getKmReal());
			secuenciaRutaTramoVO.setTramoId(tramo.getTramoId());
		} else {
			secuenciaRutaTramoVO.setKmReal(BigDecimal.ZERO);
			secuenciaRutaTramoVO.setTramoId(null);
		}
	}

	@Override
	public void doCatch(Throwable arg0) throws Throwable {
		throw arg0;
	}

	@Override
	public void doFinally() {
	}

	@Override
	public void doTry() {
	}

	public void debugList() {
		dataBinder.saveAll();
		for (SecuenciaRutaTramoVO s : lsSecuenciaRutaTramoVO) {
			log.debug(s);
		}
	}

	public List<SecuenciaRutaTramoVO> getLsSecuenciaRutaTramoVO() {
		dataBinder.saveAll();
		return lsSecuenciaRutaTramoVO;
	}

	public boolean isPrimeiraVia() {
		return isPrimeiraVia;
	}

	public void setPrimeiraVia(boolean isPrimeiraVia) {
		this.isPrimeiraVia = isPrimeiraVia;
	}	
}