/*
 * 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.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.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.zul.Button;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Spinner;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Timebox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.CoeficienteTarifa;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.OrgaoTramo;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoKm;
import com.rjconsultores.ventaboletos.entidad.TramoServicio;
import com.rjconsultores.ventaboletos.entidad.TramoTiempo;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.CoeficienteTarifaService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EsquemaCorridaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.RutaCombinacionService;
import com.rjconsultores.ventaboletos.service.TramoService;
import com.rjconsultores.ventaboletos.service.ViaService;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.ConstraintNumberBD;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderOrgaoTramo;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTramoKm;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTramoServicio;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTramoTiempo;

/**
 * 
 * @author Administrador
 */
@Controller("editarTramosController")
@Scope("prototype")
public class EditarTramosController extends MyGenericForwardComposer {

	private static Logger log = Logger.getLogger(EditarTramosController.class);

	private static final long serialVersionUID = 1L;

	@Autowired
	private TramoService tramoService;
	@Autowired
	private ViaService viaService;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private EsquemaCorridaService esquemaCorridaService;
	@Autowired
	private RutaCombinacionService rutaCombinacionService;
	@Autowired
	private CoeficienteTarifaService coeficienteTarifaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;
	private List<Via> lsVias;
	private List<ClaseServicio> lsClaseServicio;
	private List<CoeficienteTarifa> lsCoeficienteTarifas;
	private List<OrgaoConcedente> lsOrgaoConcedentes;
	private List<TramoServicio> listaTramoServicio;
	private List<TramoTiempo> listaTramosTiempo;
	private List<TramoKm> listaTramosKm;
	private List<Empresa> lsEmpresa;
	private List<OrgaoTramo> lsOrgamoTramo;
	private Tramo tramo;
	private MyListbox tramosList;
	private MyListbox tiempoList;
	private MyListbox tramoKmEmpresaList;
	private MyListbox servicioList;
	private MyListbox tramoCoeficientesList;
	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParada cmbParadaDestino;
	private Combobox cmbClaseServicioTiempo;
	private Combobox cmbClaseServicio;
	private Combobox cmbVia;
	private Combobox cmbEmpresa;
	private Combobox cmbCoeficiente1;
	private Combobox cmbCoeficiente2;
	private Combobox cmbCoeficiente3;
	private Combobox cmbOrgaoConcedente;
	private Combobox cmbClaseServicioCoeficiente;
	private MyTextboxDecimal txKmReal;
	private Textbox txtNome;
	private Intbox itxCantkmpagoconductor;
	private MyTextboxDecimal txtKMCoeficiente1;
	private MyTextboxDecimal txtKMCoeficiente2;
	private MyTextboxDecimal txtKMCoeficiente3;
	private Timebox horainicio;
	private Timebox horafin;
	private Checkbox lun;
	private Checkbox mar;
	private Checkbox mie;
	private Checkbox jue;
	private Checkbox vie;
	private Checkbox sab;
	private Checkbox dom;
	private Spinner spHora;
	private Spinner spMinuto;
	private Spinner spHoraTiempo;
	private Spinner spMinutoTiempo;
	private Button btnApagar;
	private ConstraintNumberBD constraintTarifa;
	private Tab tabExcepcionesKm;

	private boolean existeRutaOcupaTramo;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		existeRutaOcupaTramo = false;
		lsVias = viaService.obtenerTodos();
		lsEmpresa = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsClaseServicio = claseServicioService.buscarTodosExceto(-1);
		lsCoeficienteTarifas = coeficienteTarifaService.obtenerTodos();
		lsOrgaoConcedentes = orgaoConcedenteService.obtenerTodos();

		super.doAfterCompose(comp);

		servicioList.setItemRenderer(new RenderTramoServicio());
		tiempoList.setItemRenderer(new RenderTramoTiempo());
		tramoKmEmpresaList.setItemRenderer(new RenderTramoKm());
		tramoCoeficientesList.setItemRenderer(new RenderOrgaoTramo());

		listaTramoServicio = new ArrayList<TramoServicio>();
		listaTramosTiempo = new ArrayList<TramoTiempo>();
		listaTramosKm = new ArrayList<TramoKm>();
		lsOrgamoTramo = new ArrayList<OrgaoTramo>();

		tramo = (Tramo) Executions.getCurrent().getArg().get("tramo");
		if (tramo.getTramoId() != null) {
			existeRutaOcupaTramo = rutaCombinacionService.existeTramo(tramo);
			tramo = tramoService.obtenerID(tramo.getTramoId());

			for (TramoServicio ta : tramo.getTramoServicioList()) {
				listaTramoServicio.add(ta);
			}
			servicioList.setData(listaTramoServicio);

			for (TramoTiempo tt : tramo.getLsTramoTiempo()) {
				listaTramosTiempo.add(tt);
			}
			tiempoList.setData(listaTramosTiempo);

			for (TramoKm tk : tramo.getTramoKms()) {
				listaTramosKm.add(tk);
			}
			tramoKmEmpresaList.setData(listaTramosKm);

			for (OrgaoTramo ot : tramo.getLsOrgaoTramo()) {
				lsOrgamoTramo.add(ot);
			}
			tramoCoeficientesList.setData(lsOrgamoTramo);

			txKmReal.setValue(maskKmReal(tramo.getKmReal()));
		}
		tramosList = (MyListbox) Executions.getCurrent().getArg().get("tramosList");

		if (tramo.getTramoId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}

		txtNome.focus();
		tabExcepcionesKm.setVisible(ApplicationProperties.getInstance().exhibirExcepcionesTramoKm());

	}

	private String maskKmReal(BigDecimal kmReal) {
		try {
			String resp = kmReal.toString();
			resp = resp.replaceAll("\\.", ",");
			return resp;
		} catch (Exception e) {
		}
		return StringUtils.EMPTY;
	}

	public void onClick$btnSalvarServicio(Event ev) throws InterruptedException {
		spHora.getValue();
		spMinuto.getValue();

		if (cmbClaseServicio.getSelectedItem() == null) {
			Messagebox.show(Labels.getLabel("editarTramosController.MSG.tipoServicio"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
					Messagebox.EXCLAMATION);
			return;
		}

		try {
			ClaseServicio claseServicio = (ClaseServicio) cmbClaseServicio.getSelectedItem().getValue();

			boolean existe = false;
			for (TramoServicio tt : listaTramoServicio) {
				if (tt.getClaseServicio().equals(claseServicio)) {
					existe = true;
				}
			}

			if (!existe) {
				TramoServicio ts = new TramoServicio();
				ts.setClaseServicio((ClaseServicio) cmbClaseServicio.getSelectedItem().getValue());
				ts.setTiemporecorrido(DateUtil.getFecInicio(spHora.getValue(), spMinuto.getValue()).getTime());
				ts.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				ts.setFecmodif(Calendar.getInstance().getTime());
				ts.setActivo(Boolean.TRUE);

				listaTramoServicio.add(ts);
				servicioList.setData(listaTramoServicio);

				cmbClaseServicio.setSelectedItem(null);

				spHora.setText("00");
				spMinuto.setText("00");
			} else {
				Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarTramosController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnSalvarTiempo(Event ev) throws InterruptedException {
		spHoraTiempo.getValue();
		spMinutoTiempo.getValue();

		if (!lun.isChecked() && !mar.isChecked() && !mie.isChecked() && !jue.isChecked() && !vie.isChecked() && !sab.isChecked() && !dom.isChecked()) {
			Messagebox.show(Labels.getLabel("editarTramosController.MSG.obligatorioTramoTiempoDia"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

			return;
		}
		try {
			ClaseServicio claseServicio = (ClaseServicio) cmbClaseServicioTiempo.getSelectedItem().getValue();

			boolean existe = false;
			for (TramoTiempo tt : listaTramosTiempo) {
				if (tt.getClaseServicio().equals(claseServicio)) {
					existe = true;
				}
			}

			if (!existe) {
				TramoTiempo tramoTiempo = new TramoTiempo();
				tramoTiempo.setClaseServicio(claseServicio);

				tramoTiempo.setHorafin(DateUtil.getFecInicio(horafin.getValue()).getTime());
				tramoTiempo.setHorainicio(DateUtil.getFecInicio(horainicio.getValue()).getTime());
				tramoTiempo.setIndapliclun(lun.isChecked());
				tramoTiempo.setIndaplicmar(mar.isChecked());
				tramoTiempo.setIndaplicmie(mie.isChecked());
				tramoTiempo.setIndaplicjue(jue.isChecked());
				tramoTiempo.setIndaplicvie(vie.isChecked());
				tramoTiempo.setIndaplicsab(sab.isChecked());
				tramoTiempo.setIndaplicdom(dom.isChecked());
				tramoTiempo.setTiemporecorrido(DateUtil.getFecInicio(spHoraTiempo.getValue(), spMinutoTiempo.getValue()).getTime());

				tramoTiempo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				tramoTiempo.setFecmodif(Calendar.getInstance().getTime());
				tramoTiempo.setActivo(Boolean.TRUE);

				listaTramosTiempo.add(tramoTiempo);
				tiempoList.setData(listaTramosTiempo);

				spHoraTiempo.setText("00");
				spMinutoTiempo.setText("00");
			} else {
				Messagebox.show(Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarTramosController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnSalvarExceptioneKm(Event ev) throws InterruptedException {
		itxCantkmpagoconductor.getValue();
		cmbEmpresa.getValue();

		Empresa empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();

		boolean existe = false;
		for (TramoKm tk : listaTramosKm) {
			if (tk.getEmpresa().equals(empresa)) {
				existe = true;
			}
		}

		if (!existe) {
			TramoKm tramoKm = new TramoKm();
			tramoKm.setEmpresa(empresa);
			tramoKm.setCantkmpagoconductor(itxCantkmpagoconductor.getValue());

			tramoKm.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			tramoKm.setFecmodif(Calendar.getInstance().getTime());
			tramoKm.setActivo(Boolean.TRUE);

			listaTramosKm.add(tramoKm);
			tramoKmEmpresaList.setData(listaTramosKm);

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

	public void onClick$btnApagarServicio(Event ev) throws InterruptedException {
		try {
			TramoServicio tramoAtributo = (TramoServicio) servicioList.getSelected();

			if (tramoAtributo != null) {
				int opcao = Messagebox.show(Labels.getLabel("editarTramosController.MSG.borrarTramoServicio"),
						Labels.getLabel("editarTramosController.window.title"),
						Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

				if (opcao == Messagebox.YES) {
					tramoAtributo.setFecmodif(Calendar.getInstance().getTime());
					tramoAtributo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					tramoAtributo.setActivo(Boolean.FALSE);

					listaTramoServicio.remove(tramoAtributo);
					servicioList.setData(listaTramoServicio);
				}
			} else {
				Messagebox.show(Labels.getLabel("editarTramosController.MSG.selecioneTramoServicio"),
						Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnApagarTiempo(Event ev) throws InterruptedException {
		try {
			TramoTiempo tramoTiempo = (TramoTiempo) tiempoList.getSelected();

			if (tramoTiempo != null) {
				int opcao = Messagebox.show(Labels.getLabel("editarTramosController.MSG.borrarTramoTiempo"),
						Labels.getLabel("editarTramosController.window.title"), Messagebox.YES
								| Messagebox.NO, Messagebox.QUESTION);

				if (opcao == Messagebox.YES) {
					tramoTiempo.setFecmodif(Calendar.getInstance().getTime());
					tramoTiempo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					tramoTiempo.setActivo(Boolean.FALSE);

					listaTramosTiempo.remove(tramoTiempo);
					tiempoList.setData(listaTramosTiempo);
				}
			} else {
				Messagebox.show(Labels.getLabel("editarTramosController.MSG.selecioneTramoTiempo"),
						Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
						Messagebox.EXCLAMATION);
			}
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnApagarExcepcioneKm(Event ev) throws InterruptedException {
		TramoKm tramoKm = (TramoKm) tramoKmEmpresaList.getSelected();

		if (tramoKm != null) {
			int opcao = Messagebox.show(Labels.getLabel("editarTramosController.MSG.borrarTramoKm"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.YES
							| Messagebox.NO, Messagebox.QUESTION);

			if (opcao == Messagebox.YES) {
				tramoKm.setFecmodif(Calendar.getInstance().getTime());
				tramoKm.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				tramoKm.setActivo(Boolean.FALSE);

				listaTramosKm.remove(tramoKm);
				tramoKmEmpresaList.setData(listaTramosKm);
			}
		} else {
			Messagebox.show(Labels.getLabel("editarTramosController.MSG.selecioneTramoKm"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
					Messagebox.EXCLAMATION);
		}
	}

	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		cmbParadaOrigem.getValue(true);
		cmbParadaDestino.getValue(true);

		if (listaTramoServicio.isEmpty()) {
			Messagebox.show(Labels.getLabel("editarTramosController.MSG.obligatorioTramoTiempo"), Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
					Messagebox.INFORMATION);
			return;
		}

		if (txKmReal.getValueDecimal() == null) {
			Messagebox.show(Labels.getLabel("editarTramosController.MSG.kmReal"), Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
					Messagebox.INFORMATION);
			return;
		}
		
		try {
			tramo.setVia((Via) cmbVia.getSelectedItem().getValue());

			BigDecimal kmReal = txKmReal.getValueDecimal();
			tramo.setKmReal(kmReal);

			tramo.setLsOrgaoTramo(lsOrgamoTramo);
			tramo.setLsTramoTiempo(listaTramosTiempo);
			tramo.setTramoServicioList(listaTramoServicio);
			tramo.setTramoKms(listaTramosKm);

			tramo = tramoService.suscribirActualizar(tramo);
			tramosList.updateItem(tramo);

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

			closeWindow();

		} catch (BusinessException ex) {
			Messagebox.show(ex.getLocalizedMessage(), Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

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

			if (resp == Messagebox.YES) {
				boolean existeCombinacion = rutaCombinacionService.buscarRutaCombinacionExisteTramo(tramo);
				boolean existeEsquemaCorrida = esquemaCorridaService.buscarEsquemaCorridaExisteTramo(tramo);
				if (existeCombinacion == false && existeEsquemaCorrida == false) {
					tramoService.borrar(tramo);

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

					tramosList.removeItem(tramo);

					closeWindow();
				} else {
					Messagebox.show(Labels.getLabel("editarTramosController.MSG.borrarFalse"),
							Labels.getLabel("editarTramosController.window.title"), Messagebox.OK,
							Messagebox.EXCLAMATION);

				}
			}
		} catch (WrongValueException ex) {
			throw (WrongValueException) ex;
		} catch (Exception ex) {
			log.error(ex);
			Messagebox.show(Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.ERROR);
		}
	}

	public void onClick$btnApagarCoeficiente(Event ev) {
		OrgaoTramo orgaoTramo = (OrgaoTramo) tramoCoeficientesList.getSelected();
		if (orgaoTramo != null) {
			orgaoTramo.setActivo(Boolean.FALSE);

			tramoCoeficientesList.removeItem(orgaoTramo);
		}
	}

	public void onClick$btnSalvarCoeficiente(Event ev) throws InterruptedException {
		if (lsOrgamoTramo == null) {
			lsOrgamoTramo = new ArrayList<OrgaoTramo>();
		}

		Comboitem cbiCoeficiente1 = cmbCoeficiente1.getSelectedItem();
		CoeficienteTarifa coeficienteTarifa1 = null;
		if (cbiCoeficiente1 != null) {
			coeficienteTarifa1 = (CoeficienteTarifa) cbiCoeficiente1.getValue();
		}

		Comboitem cbiCoeficiente2 = cmbCoeficiente2.getSelectedItem();
		CoeficienteTarifa coeficienteTarifa2 = null;
		if (cbiCoeficiente2 != null) {
			coeficienteTarifa2 = (CoeficienteTarifa) cbiCoeficiente2.getValue();
		}

		Comboitem cbiCoeficiente3 = cmbCoeficiente3.getSelectedItem();
		CoeficienteTarifa coeficienteTarifa3 = null;
		if (cbiCoeficiente3 != null) {
			coeficienteTarifa3 = (CoeficienteTarifa) cbiCoeficiente3.getValue();
		}

		Comboitem cbiOrgaoConcedente = cmbOrgaoConcedente.getSelectedItem();
		final OrgaoConcedente orgaoConcedente;
		if (cbiOrgaoConcedente == null) {
			Messagebox.show(Labels.getLabel("editarTramosController.msg.orgaoObligatorio"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

			return;
		}

		Comboitem cbiClaseServicio = cmbClaseServicioCoeficiente.getSelectedItem();
		final ClaseServicio claseServicio;
		if (cbiClaseServicio == null) {
			Messagebox.show(Labels.getLabel("editarTramosController.msg.tipoClaseObligatorio"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.INFORMATION);

			return;
		}
		orgaoConcedente = (OrgaoConcedente) cbiOrgaoConcedente.getValue();
		claseServicio = (ClaseServicio) cbiClaseServicio.getValue();

		BigDecimal kmCoeficiente1 = txtKMCoeficiente1.getValueDecimal();
		BigDecimal kmCoeficiente2 = txtKMCoeficiente2.getValueDecimal();
		BigDecimal kmCoeficiente3 = txtKMCoeficiente3.getValueDecimal();

		if ((coeficienteTarifa1 == null) && (kmCoeficiente1 == null)) {

			Messagebox.show(Labels.getLabel("editarTramosController.msg.coeficiente1Obligatorio"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}

		if (((coeficienteTarifa1 != null) && (kmCoeficiente1 == null)) || ((coeficienteTarifa1 == null) && (kmCoeficiente1 != null))) {

			Messagebox.show(Labels.getLabel("editarTramosController.msg.coeficiente1ObligatorioDados"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}
		if (((coeficienteTarifa2 != null) && (kmCoeficiente2 == null)) || ((coeficienteTarifa2 == null) && (kmCoeficiente2 != null))) {

			Messagebox.show(Labels.getLabel("editarTramosController.msg.coeficiente2ObligatorioDados"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}
		if (((coeficienteTarifa3 != null) && (kmCoeficiente3 == null)) || ((coeficienteTarifa3 == null) && (kmCoeficiente3 != null))) {

			Messagebox.show(Labels.getLabel("editarTramosController.msg.coeficiente3ObligatorioDados"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}
		boolean orgaoClaseJahInformado = CollectionUtils.exists(lsOrgamoTramo, new Predicate() {

			@Override
			public boolean evaluate(Object obj) {
				OrgaoTramo ot = (OrgaoTramo) obj;
				return (ot.getActivo() && ot.getOrgaoConcedente().equals(orgaoConcedente) && ot.getClaseServicio().equals(claseServicio));
			}
		});

		if (orgaoClaseJahInformado) {
			Messagebox.show(Labels.getLabel("editarTramosController.msg.orgaoJahInformado"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);

			return;
		}
		
		if(!isOrgaoTramoValid(orgaoConcedente, claseServicio)) {
			Messagebox.show(Labels.getLabel("editarTramosController.msg.orgaoJahInformado"),
					Labels.getLabel("editarTramosController.window.title"), Messagebox.OK, Messagebox.EXCLAMATION);			
			return;
		}

		OrgaoTramo orgaoTramo = new OrgaoTramo();
		orgaoTramo.setCoeficienteTarifa1(coeficienteTarifa1);
		orgaoTramo.setCoeficienteTarifa2(coeficienteTarifa2);
		orgaoTramo.setCoeficienteTarifa3(coeficienteTarifa3);
		orgaoTramo.setKmCoeficiente1(kmCoeficiente1);
		orgaoTramo.setKmCoeficiente2(kmCoeficiente2);
		orgaoTramo.setKmCoeficiente3(kmCoeficiente3);
		orgaoTramo.setOrgaoConcedente(orgaoConcedente);
		orgaoTramo.setTramo(tramo);
		orgaoTramo.setActivo(Boolean.TRUE);
		orgaoTramo.setFecmodif(Calendar.getInstance().getTime());
		orgaoTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		orgaoTramo.setClaseServicio(claseServicio);		
		
		lsOrgamoTramo.add(orgaoTramo);

		tramoCoeficientesList.setData(lsOrgamoTramo);

		cmbCoeficiente1.setSelectedItem(null);
		cmbCoeficiente2.setSelectedItem(null);
		cmbCoeficiente3.setSelectedItem(null);
		cmbOrgaoConcedente.setSelectedItem(null);
		cmbClaseServicioCoeficiente.setSelectedItem(null);
		txtKMCoeficiente1.setValue(null);
		txtKMCoeficiente2.setValue(null);
		txtKMCoeficiente3.setValue(null);
	}

	private boolean isOrgaoTramoValid(OrgaoConcedente orgaoConcedente, ClaseServicio claseServicio) {				
		
		for (OrgaoTramo orgao : lsOrgamoTramo) {
			if(orgao.getOrgaoConcedente().equals(orgaoConcedente) && orgao.getClaseServicio().equals(claseServicio)) {
				return false;
			}
		}
		
		return true;
	}

	public boolean isExisteRutaOcupaTramo() {
		return existeRutaOcupaTramo;
	}

	public Tramo getTramo() {
		return tramo;
	}

	public void setTramo(Tramo tramo) {
		this.tramo = tramo;
	}

	public List<Via> getLsVias() {
		return lsVias;
	}

	public void setLsVias(List<Via> lsVias) {
		this.lsVias = lsVias;
	}

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

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

	public List<TramoServicio> getListaTramoServicio() {
		return listaTramoServicio;
	}

	public void setListaTramoServicio(List<TramoServicio> listaTramoServicio) {
		this.listaTramoServicio = listaTramoServicio;
	}

	public List<TramoTiempo> getListaTramosTiempo() {
		return listaTramosTiempo;
	}

	public void setListaTramosTiempo(List<TramoTiempo> listaTramosTiempo) {
		this.listaTramosTiempo = listaTramosTiempo;
	}

	public List<TramoKm> getListaTramosKm() {
		return listaTramosKm;
	}

	public void setListaTramosKm(List<TramoKm> listaTramosKm) {
		this.listaTramosKm = listaTramosKm;
	}

	public ConstraintNumberBD getConstraintTarifa() {
		return constraintTarifa;
	}

	public void setConstraintTarifa(ConstraintNumberBD constraintTarifa) {
		this.constraintTarifa = constraintTarifa;
	}

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

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

	public List<CoeficienteTarifa> getLsCoeficienteTarifas() {
		return lsCoeficienteTarifas;
	}

	public void setLsCoeficienteTarifas(List<CoeficienteTarifa> lsCoeficienteTarifas) {
		this.lsCoeficienteTarifas = lsCoeficienteTarifas;
	}

	public List<OrgaoConcedente> getLsOrgaoConcedentes() {
		return lsOrgaoConcedentes;
	}

	public void setLsOrgaoConcedentes(List<OrgaoConcedente> lsOrgaoConcedentes) {
		this.lsOrgaoConcedentes = lsOrgaoConcedentes;
	}

	private void generarDescripcionTramo() {
		cmbParadaOrigem.getValue(true);
		cmbParadaDestino.getValue(true);
		cmbVia.getValue();

		Via via = (Via) cmbVia.getSelectedItem().getValue();

		txtNome.setText(tramoService.gerarDescripcionTramo(tramo.getOrigem(), tramo.getDestino(), via));
	}

	public void onSelect$cmbParadaOrigem() {
		generarDescripcionTramo();
	}

	public void onSelect$cmbParadaDestino() {
		generarDescripcionTramo();
	}

	public void onSelect$cmbVia() {
		generarDescripcionTramo();
	}

}
