package com.rjconsultores.ventaboletos.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.zkoss.util.resource.Labels; import com.rjconsultores.ventaboletos.dao.OrgaoTramoDAO; import com.rjconsultores.ventaboletos.dao.RutaDAO; import com.rjconsultores.ventaboletos.dao.TramoDAO; import com.rjconsultores.ventaboletos.dao.TramoServicioDAO; import com.rjconsultores.ventaboletos.entidad.ClaseServicio; import com.rjconsultores.ventaboletos.entidad.Empresa; 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.RutaCombinacion; import com.rjconsultores.ventaboletos.entidad.RutaEmpresa; 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.exception.BusinessException; import com.rjconsultores.ventaboletos.service.RutaCombinacionService; import com.rjconsultores.ventaboletos.service.RutaEmpresaService; import com.rjconsultores.ventaboletos.service.RutaSecuenciaService; import com.rjconsultores.ventaboletos.service.RutaService; import com.rjconsultores.ventaboletos.service.TramoRutaService; import com.rjconsultores.ventaboletos.service.TramoService; import com.rjconsultores.ventaboletos.service.TramoServicioService; import com.rjconsultores.ventaboletos.utilerias.DateUtil; import com.rjconsultores.ventaboletos.utilerias.HoraSistema; import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; import com.rjconsultores.ventaboletos.vo.esquemaoperacional.RutaTramoVO; import com.rjconsultores.ventaboletos.vo.esquemaoperacional.SecuenciaRutaTramoCoeficienteVO; import com.rjconsultores.ventaboletos.vo.esquemaoperacional.SecuenciaRutaTramoVO; @Service("tramoRutaService") public class TramoRutaServiceImpl implements TramoRutaService { private static Logger log = Logger.getLogger(TramoRutaServiceImpl.class); @Autowired private RutaCombinacionService rutaCombinacionService; @Autowired private RutaSecuenciaService rutaSecuenciaService; @Autowired private RutaEmpresaService rutaEmpresaService; @Autowired private RutaService rutaService; @Autowired private TramoService tramoService; @Autowired private TramoServicioService tramoServicioService; @Autowired private RutaDAO rutaDAO; @Autowired private OrgaoTramoDAO orgaoTramoDAO; @Autowired private TramoServicioDAO tramoServicioDAO; @Autowired private TramoDAO tramoDAO; /** * Hace la validación de los datos del rutaTramoVO * * @param rutaTramoVO * @throws BusinessException */ private void validarGenerarTramosRutas(RutaTramoVO rutaTramoVO) throws BusinessException { if (rutaTramoVO.getLsSecuenciaRutaTramoVO().isEmpty()) { throw new BusinessException("tramoRutaServiceImpl.msg.secuenciaObligatorio"); } if ((rutaTramoVO.getPrefixo() == null) || (rutaTramoVO.getPrefixo().isEmpty())) { throw new BusinessException("tramoRutaServiceImpl.msg.prefixoObligatorio"); } if (rutaTramoVO.getLsEmpresa().isEmpty()) { throw new BusinessException("tramoRutaServiceImpl.msg.empresaObligatoria"); } if (rutaTramoVO.getLsCombinacionRutaTramoVO().isEmpty()) { throw new BusinessException("tramoRutaServiceImpl.msg.combinacionObligatorio"); } for (SecuenciaRutaTramoCoeficienteVO s : rutaTramoVO.getLsCombinacionRutaTramoVO()) { if (s.getTramoId() != null) { continue; } if ((s.getOrigen() == null) || (s.getDestino() == null) || (s.getVia() == null) || (s.getKmReal() == null) || (s.getSecuencia() == null) || (s.getTiempoRecorrido() == null) || ((rutaTramoVO.getOrgaoConcedente() == null || !rutaTramoVO.getOrgaoConcedente().getOrgaoConcedenteId().equals(21) && ((s.getCoeficienteTarifa1() == null) || (s.getKmCoeficiente1() == null) || (s.getKmCoeficiente1() == BigDecimal.ZERO))))) { throw new BusinessException("tramoRutaServiceImpl.msg.cambosObligatoriosCombinacion", new Object[] { s.getOrigen(), s.getDestino() }); } } for (SecuenciaRutaTramoVO s : rutaTramoVO.getLsSecuenciaRutaTramoVO()) { if (s.getTramoId() != null) { continue; } if ((s.getOrigen() == null) || (s.getDestino() == null) || (s.getVia() == null) || (s.getKmReal() == null) || (s.getSecuencia() == null) || (s.getTiempoRecorrido() == null)) { throw new BusinessException("tramoRutaServiceImpl.msg.cambosObligatoriosSecuencia", new Object[] { s.getOrigen(), s.getDestino() }); } } } @Transactional(rollbackFor = BusinessException.class) @Override public Ruta generarTramosRutas(RutaTramoVO rutaTramoVO, Boolean isRegreso) throws BusinessException { this.validarGenerarTramosRutas(rutaTramoVO); // Genero los tramos y tramos servicios de la combinacion que no existen // Aqui si genera tambien los tramos de la secuencia for (SecuenciaRutaTramoCoeficienteVO s : rutaTramoVO.getLsCombinacionRutaTramoVO()) { log.debug("Origen:" + s.getOrigen() + ";Destino:" + s.getDestino() + ";Via:" + s.getVia()); boolean fueGenerado = generarDatos(s, rutaTramoVO.getClaseServicio(), rutaTramoVO.getOrgaoConcedente()); log.debug("Fue Generado:" + fueGenerado); } // Genero la ruta Ruta ruta = new Ruta(); ruta.setDescruta(rutaTramoVO.getDescRuta()); ruta.setClaseServicio(rutaTramoVO.getClaseServicio()); ruta.setOrgaoConcedente(rutaTramoVO.getOrgaoConcedente()); ruta.setIndNombreObligatorio(rutaTramoVO.getSolicitaNombrePasajero()); ruta.setIndSentidoIda(rutaTramoVO.getIndSentidoIda()); if (rutaTramoVO.getVentaHandHeld() == null) { ruta.setVentaOffLine(false); } else { ruta.setVentaOffLine(rutaTramoVO.getVentaHandHeld()); } ruta.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); ruta.setActivo(Boolean.TRUE); ruta.setFecmodif(new java.util.Date()); ruta.setPrefixo(rutaTramoVO.getPrefixo()); ruta.setNumRuta(rutaTramoVO.getNumRuta()); //valores de tributação para ecf ruta.setIndTribPedagio(Boolean.FALSE); ruta.setIndTribTarifa(Boolean.TRUE); ruta.setIndTribTaxaEmbarque(Boolean.FALSE); ruta.setIndRutaInternacional(Boolean.FALSE); ruta = rutaDAO.suscribir(ruta); Map kmEntradaSaida = rutaTramoVO.getParadasComKmEntradaSaida(); // Genero la secuencia de la ruta for (SecuenciaRutaTramoVO s : rutaTramoVO.getLsSecuenciaRutaTramoVO()) { RutaSecuencia rutaSecuencia = new RutaSecuencia(); rutaSecuencia.setNumsecuencia(s.getSecuencia().shortValue()); rutaSecuencia.setTramo(tramoService.obtenerTramotPorOrigemDestinoVia(s.getOrigen(), s.getDestino(), s.getVia())); rutaSecuencia.setCantKmEntradaSaida(s.getKmEntradaSaida()); rutaSecuencia.setKmOriginal(s.getKmReal().subtract(s.getKmEntradaSaida())); BigDecimal KmES = BigDecimal.ZERO; if (kmEntradaSaida.containsKey(s.getOrigen())){ KmES = kmEntradaSaida.get(s.getOrigen()); } if (kmEntradaSaida.containsKey(s.getDestino())){ KmES = kmEntradaSaida.get(s.getDestino()); } if(rutaSecuencia.getTramo() == null ){ Tramo tramo = new Tramo(); tramo.setDesctramo(tramoService.gerarDescripcionTramo(s.getOrigen(), s.getDestino(), s.getVia())); tramo.setOrigem(s.getOrigen()); tramo.setDestino(s.getDestino()); tramo.setKmReal(KmES != null || KmES != BigDecimal.ZERO ? s.getKmReal().add(KmES) : s.getKmReal()); tramo.setKmEntradaSaida(KmES); tramo.setVia(s.getVia()); tramo.setActivo(Boolean.TRUE); tramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); tramo.setFecmodif(new java.util.Date()); tramo = tramoDAO.suscribir(tramo); rutaSecuencia.setTramo(tramo); } else { Tramo tramo = rutaSecuencia.getTramo(); tramo.setKmEntradaSaida(KmES); tramo = tramoDAO.actualizacion(tramo); } rutaSecuencia.setRuta(ruta); rutaSecuencia = rutaSecuenciaService.suscribir(rutaSecuencia); } for (SecuenciaRutaTramoCoeficienteVO s : rutaTramoVO.getLsCombinacionRutaTramoVO()) { RutaCombinacion rutaCombinacion = new RutaCombinacion(); rutaCombinacion.setIndventa(s.getPermiteVenda() == null ? true : s.getPermiteVenda()); rutaCombinacion.setRuta(ruta); rutaCombinacion.setTramo(tramoService.obtenerTramotPorOrigemDestinoVia(s.getOrigen(), s.getDestino(), s.getVia())); rutaCombinacion = rutaCombinacionService.suscribir(rutaCombinacion); } for (Empresa e : rutaTramoVO.getLsEmpresa()) { RutaEmpresa rutaEmpresa = new RutaEmpresa(); rutaEmpresa.setEmpresa(e); rutaEmpresa.setActivo(Boolean.TRUE); rutaEmpresa.setFecmodif(Calendar.getInstance().getTime()); rutaEmpresa.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); rutaEmpresa.setRuta(ruta); rutaEmpresa = rutaEmpresaService.suscribir(rutaEmpresa); } return ruta; } @Override public RutaTramoVO generarRutaRegreso(RutaTramoVO rutaTramoVO) { RutaTramoVO rutaTramoRegresoVO = new RutaTramoVO(); rutaTramoRegresoVO.setClaseServicio(rutaTramoVO.getClaseServicio()); rutaTramoRegresoVO.setOrgaoConcedente(rutaTramoVO.getOrgaoConcedente()); rutaTramoRegresoVO.setSolicitaNombrePasajero(rutaTramoVO.getSolicitaNombrePasajero()); rutaTramoRegresoVO.setVentaHandHeld(rutaTramoVO.getVentaHandHeld() == null ? true : rutaTramoVO.getVentaHandHeld()); rutaTramoRegresoVO.setLsEmpresa(rutaTramoVO.getLsEmpresa()); if (rutaTramoVO.getIndSentidoIda()) { rutaTramoRegresoVO.setIndSentidoIda(Boolean.FALSE); } else { rutaTramoRegresoVO.setIndSentidoIda(Boolean.TRUE); } rutaTramoRegresoVO.setNumRuta(rutaTramoVO.getNumRuta()); rutaTramoRegresoVO.setPrefixo(rutaTramoVO.getPrefixo()); if (rutaTramoVO.getDescRuta() != null) { rutaTramoRegresoVO.setDescRuta(rutaTramoVO.getDescRuta()); } else { rutaTramoRegresoVO.setDescRuta("-"); } List lsSecuenciaRutaTramoRegresoVO = new ArrayList(); List lsSecuenciaRutaTramoIdaVO = new ArrayList(rutaTramoVO.getLsSecuenciaRutaTramoVO()); // Reordena a lista Collections.sort(lsSecuenciaRutaTramoIdaVO, new Comparator() { @Override public int compare(SecuenciaRutaTramoVO o1, SecuenciaRutaTramoVO o2) { return o2.getSecuencia().compareTo(o1.getSecuencia()); } }); int secuencia = 0; Map kmEntradaSaida = rutaTramoVO.getParadasComKmEntradaSaida(); for (SecuenciaRutaTramoVO s : lsSecuenciaRutaTramoIdaVO) { TramoServicio tramoServicio = tramoServicioService.buscar(s.getDestino(), s.getOrigen(), s.getVia(), rutaTramoVO.getClaseServicio()); if (tramoServicio != null) { s.setTramoId(tramoServicio.getTramo().getTramoId()); s.setTramoServicioId(tramoServicio.getTramoservicioId()); lsSecuenciaRutaTramoRegresoVO.add(new SecuenciaRutaTramoVO(s.getDestino(), s.getOrigen(), s.getVia(), ++secuencia, s.getKmReal(), s.getTiempoRecorrido(), s.getTramoId(), s.getTramoServicioId(), rutaTramoRegresoVO.getNumRuta(), rutaTramoRegresoVO.getIndSentidoIda(), kmEntradaSaida.containsKey(s.getDestino()) ? kmEntradaSaida.get(s.getDestino()) : BigDecimal.ZERO ));//;s.getKmEntradaSaida())); } else { lsSecuenciaRutaTramoRegresoVO.add(new SecuenciaRutaTramoVO(s.getDestino(), s.getOrigen(), s.getVia(), ++secuencia, s.getKmReal(), s.getTiempoRecorrido(), rutaTramoRegresoVO.getNumRuta(), rutaTramoRegresoVO.getIndSentidoIda(),kmEntradaSaida.containsKey(s.getDestino()) ? kmEntradaSaida.get(s.getDestino()) : BigDecimal.ZERO )); } } rutaTramoRegresoVO.setLsSecuenciaRutaTramoVO(lsSecuenciaRutaTramoRegresoVO); List lsCombinacionRutaTramoRegresoVO = new ArrayList(); List lsCombinacionTramoIdaVO = new ArrayList(rutaTramoVO.getLsCombinacionRutaTramoVO()); Collections.sort(lsCombinacionTramoIdaVO, new Comparator() { @Override public int compare(SecuenciaRutaTramoCoeficienteVO o1, SecuenciaRutaTramoCoeficienteVO o2) { return o2.getSecuencia().compareTo(o1.getSecuencia()); } }); secuencia = 0; for (SecuenciaRutaTramoCoeficienteVO s : lsCombinacionTramoIdaVO) { TramoServicio tramoServicio = tramoServicioService.buscar(s.getDestino(), s.getOrigen(), s.getVia(), rutaTramoVO.getClaseServicio()); if (tramoServicio != null) { s.setTramoId(tramoServicio.getTramo().getTramoId()); s.setTramoServicioId(tramoServicio.getTramoservicioId()); SecuenciaRutaTramoCoeficienteVO secuenciaRutaTramoCoeficienteVO = new SecuenciaRutaTramoCoeficienteVO(s.getDestino(), s.getOrigen(), s.getVia(), ++secuencia, s.getKmReal(), s.getTiempoRecorrido(), s.getTramoId(), s.getTramoServicioId(), rutaTramoRegresoVO.getNumRuta(), s.getKmEntradaSaida()); OrgaoTramo orgaoTramo = orgaoTramoDAO.buscar(s.getDestino().getParadaId(), s.getOrigen().getParadaId(), s.getVia().getViaId(), rutaTramoVO.getOrgaoConcedente().getOrgaoConcedenteId(), rutaTramoVO.getClaseServicio().getClaseservicioId()); if (orgaoTramo != null) { secuenciaRutaTramoCoeficienteVO.setOrgaoTramoId(orgaoTramo.getOrgaoTramoId()); secuenciaRutaTramoCoeficienteVO.setCoeficienteTarifa1(orgaoTramo.getCoeficienteTarifa1()); secuenciaRutaTramoCoeficienteVO.setKmCoeficiente1(orgaoTramo.getKmCoeficiente1()); if (orgaoTramo.getCoeficienteTarifa2() != null) { secuenciaRutaTramoCoeficienteVO.setCoeficienteTarifa2(orgaoTramo.getCoeficienteTarifa2()); secuenciaRutaTramoCoeficienteVO.setKmCoeficiente2(orgaoTramo.getKmCoeficiente2()); } } secuenciaRutaTramoCoeficienteVO.setPermiteVenda(s.getPermiteVenda()); lsCombinacionRutaTramoRegresoVO.add(secuenciaRutaTramoCoeficienteVO); } else { SecuenciaRutaTramoCoeficienteVO secuenciaRutaTramoCoeficienteVO = new SecuenciaRutaTramoCoeficienteVO(s.getDestino(), s.getOrigen(), s.getVia(), ++secuencia, s.getKmReal(), s.getTiempoRecorrido(), rutaTramoRegresoVO.getNumRuta(), s.getKmEntradaSaida()); secuenciaRutaTramoCoeficienteVO.setCoeficienteTarifa1(s.getCoeficienteTarifa1()); secuenciaRutaTramoCoeficienteVO.setKmCoeficiente1(s.getKmCoeficiente1()); secuenciaRutaTramoCoeficienteVO.setCoeficienteTarifa2(s.getCoeficienteTarifa2()); secuenciaRutaTramoCoeficienteVO.setKmCoeficiente2(s.getKmCoeficiente2()); secuenciaRutaTramoCoeficienteVO.setPermiteVenda(s.getPermiteVenda()); lsCombinacionRutaTramoRegresoVO.add(secuenciaRutaTramoCoeficienteVO); } } rutaTramoRegresoVO.setLsCombinacionRutaTramoVO(lsCombinacionRutaTramoRegresoVO); return rutaTramoRegresoVO; } @Override public List generarCombinacion(RutaTramoVO rutaTramoVO) { // una nueva lista que va a ser ordenada. Con eso, no afecta la lista original rutaTramoVO.getLsCombinacionRutaTramoVO(); List lsSecuenciaRutaTramoVO = new ArrayList(rutaTramoVO.getLsSecuenciaRutaTramoVO()); List lsSecuenciaCombinacionRutaTramoVO = new ArrayList(); Collections.sort(lsSecuenciaRutaTramoVO, new Comparator() { @Override public int compare(SecuenciaRutaTramoVO o1, SecuenciaRutaTramoVO o2) { return o1.getSecuencia().compareTo(o2.getSecuencia()); } }); int qtdTramos = lsSecuenciaRutaTramoVO.size(); int secuencia = 0; Map kmEntradaSaida = rutaTramoVO.getParadasComKmEntradaSaida(); for (int i = 0; i < qtdTramos; i++) { SecuenciaRutaTramoVO secuenciaInicial = lsSecuenciaRutaTramoVO.get(i); Parada origen = secuenciaInicial.getOrigen(); BigDecimal totalKmsReal = secuenciaInicial.getKmReal(); if (kmEntradaSaida.containsKey(origen)){ totalKmsReal = totalKmsReal.add(kmEntradaSaida.get(origen)); } HoraSistema totalTiempoRecorrido = secuenciaInicial.getTiempoRecorrido(); int j = i + 1; for (; j < (qtdTramos); j++) { Parada destino = lsSecuenciaRutaTramoVO.get(j).getOrigen(); if (kmEntradaSaida.containsKey(destino)){ totalKmsReal = totalKmsReal.add(kmEntradaSaida.get(destino)); } Via via = secuenciaInicial.getVia(); SecuenciaRutaTramoCoeficienteVO nuevaSecuencia = new SecuenciaRutaTramoCoeficienteVO(origen, destino, via, ++secuencia, totalKmsReal, totalTiempoRecorrido, rutaTramoVO.getNumRuta()); if (via != null) { TramoServicio tramoServicio = tramoServicioService.buscar(origen, destino, via, rutaTramoVO.getClaseServicio()); if (tramoServicio != null) { log.debug("TRAMO EXISTE"); nuevaSecuencia.setKmReal(tramoServicio.getTramo().getKmReal()); nuevaSecuencia.setTiempoRecorrido(new HoraSistema(tramoServicio.getTiemporecorrido())); nuevaSecuencia.setTramoId(tramoServicio.getTramo().getTramoId()); nuevaSecuencia.setTramoServicioId(tramoServicio.getTramoservicioId()); } OrgaoTramo orgaoTramo = orgaoTramoDAO.buscar(origen.getParadaId(), destino.getParadaId(), via.getViaId(), rutaTramoVO.getOrgaoConcedente().getOrgaoConcedenteId(), rutaTramoVO.getClaseServicio().getClaseservicioId()); if (orgaoTramo != null) { nuevaSecuencia.setCoeficienteTarifa1(orgaoTramo.getCoeficienteTarifa1()); nuevaSecuencia.setKmCoeficiente1(orgaoTramo.getKmCoeficiente1()); nuevaSecuencia.setCoeficienteTarifa2(orgaoTramo.getCoeficienteTarifa2()); nuevaSecuencia.setKmCoeficiente2(orgaoTramo.getKmCoeficiente2()); nuevaSecuencia.setOrgaoTramoId(orgaoTramo.getOrgaoTramoId()); } } if (nuevaSecuencia.getKmCoeficiente1() == null) { nuevaSecuencia.setKmCoeficiente1(nuevaSecuencia.getKmReal()); } nuevaSecuencia.setKmEntradaSaida(kmEntradaSaida.get(destino)); lsSecuenciaCombinacionRutaTramoVO.add(nuevaSecuencia); // se somou o kmEntradaSaida tem que tirar agora para o novo trecho ser calculado corretamente. if (kmEntradaSaida.containsKey(destino)){ totalKmsReal = totalKmsReal.subtract(kmEntradaSaida.get(destino)).add(lsSecuenciaRutaTramoVO.get(j).getKmReal()); } else { totalKmsReal = totalKmsReal.add(lsSecuenciaRutaTramoVO.get(j).getKmReal()); } // if (kmEntradaSaida.containsKey(destino)){ // totalKmsReal = totalKmsReal.add(kmEntradaSaida.get(destino)); // } totalTiempoRecorrido = totalTiempoRecorrido.sumar(lsSecuenciaRutaTramoVO.get(j).getTiempoRecorrido()); log.debug("Origen:" + nuevaSecuencia.getOrigen() + ";Destino:" + nuevaSecuencia.getDestino() + ";Via:" + nuevaSecuencia.getVia() + ";KmsReal:" + nuevaSecuencia.getKmReal() + ";hora:" + nuevaSecuencia.getTiempoRecorrido()); } Parada destino = lsSecuenciaRutaTramoVO.get(qtdTramos - 1).getDestino(); if (kmEntradaSaida.containsKey(destino)){ totalKmsReal = totalKmsReal.add(kmEntradaSaida.get(destino)); } Via via = secuenciaInicial.getVia(); SecuenciaRutaTramoCoeficienteVO nuevaSecuencia = new SecuenciaRutaTramoCoeficienteVO(origen, destino, via, ++secuencia, totalKmsReal, totalTiempoRecorrido, rutaTramoVO.getNumRuta()); if (via != null) { TramoServicio tramoServicio = tramoServicioService.buscar(origen, destino, via, rutaTramoVO.getClaseServicio()); if (tramoServicio != null) { log.debug("TRAMO EXISTE"); nuevaSecuencia.setKmReal(tramoServicio.getTramo().getKmReal()); nuevaSecuencia.setTiempoRecorrido(new HoraSistema(tramoServicio.getTiemporecorrido())); nuevaSecuencia.setTramoId(tramoServicio.getTramo().getTramoId()); nuevaSecuencia.setTramoServicioId(tramoServicio.getTramoservicioId()); } OrgaoTramo orgaoTramo = orgaoTramoDAO.buscar(origen.getParadaId(), destino.getParadaId(), via.getViaId(), rutaTramoVO.getOrgaoConcedente().getOrgaoConcedenteId(), rutaTramoVO.getClaseServicio().getClaseservicioId()); if (orgaoTramo != null) { nuevaSecuencia.setCoeficienteTarifa1(orgaoTramo.getCoeficienteTarifa1()); nuevaSecuencia.setKmCoeficiente1(orgaoTramo.getKmCoeficiente1()); nuevaSecuencia.setCoeficienteTarifa2(orgaoTramo.getCoeficienteTarifa2()); nuevaSecuencia.setKmCoeficiente2(orgaoTramo.getKmCoeficiente2()); nuevaSecuencia.setOrgaoTramoId(orgaoTramo.getOrgaoTramoId()); } } if (nuevaSecuencia.getKmCoeficiente1() == null) { nuevaSecuencia.setKmCoeficiente1(nuevaSecuencia.getKmReal()); } nuevaSecuencia.setNumRuta(rutaTramoVO.getNumRuta()); lsSecuenciaCombinacionRutaTramoVO.add(nuevaSecuencia); log.debug("Origen:" + nuevaSecuencia.getOrigen() + ";Destino:" + nuevaSecuencia.getDestino() + ";Via:" + nuevaSecuencia.getVia() + ";KmsReal:" + nuevaSecuencia.getKmReal() + ";hora:" + nuevaSecuencia.getTiempoRecorrido()); } return lsSecuenciaCombinacionRutaTramoVO; } @Override public List generarCombinacionTrechoRuta(RutaTramoVO rutaTramoVO, List secuenciasDestino) { // una nueva lista que va a ser ordenada. Con eso, no afecta la lista original List lsSecuenciaCombinacionRutaTramoVO = new ArrayList(); List secuencias = rutaTramoVO.getLsParadaSecuenciaCombinacaoLinhas(); for (ParadaSecuenciaCombinacaoLinha secuencia: secuencias){ Parada origem = secuencia.getOrigem().getParada(); Via via = secuencia.getVia(); BigDecimal totalKmsReal = new BigDecimal(0); BigDecimal kmsRealOrigem = secuencia.getKmReal() == null || secuencia.getKmReal().isEmpty() ? new BigDecimal("0.0") : new BigDecimal(secuencia.getKmReal()); totalKmsReal = totalKmsReal.add(kmsRealOrigem); HoraSistema tempoTotalOrigemDestino = secuencia.getTempoReal().isEmpty() ? new HoraSistema() : new HoraSistema(DateUtil.getDataTempoDecorrido(secuencia.getTempoReal()));; for (ParadaSecuencia secuenciaDestino : secuenciasDestino) { //O processo não é realizado na ordem inversa (em que a sequencia da origem é maior que a sequencia de seus destinos), considerando que esse é o processo inversa a ida ou a volta. if (secuencia.getOrigem().getSecuencia() >= secuenciaDestino.getSecuencia()){ continue; } Parada destino = secuenciaDestino.getParada(); //A primeira seguencia sempre será a origem //A segunda sequencia sempre recebe a km e o tempo da origem if (secuenciaDestino.getSecuencia() > 2) { tempoTotalOrigemDestino = calcularTempoTotalDestino(secuencia, secuenciaDestino.getSecuencia()); totalKmsReal = calcularKmDestino(secuencia, secuenciaDestino.getSecuencia()); } SecuenciaRutaTramoCoeficienteVO nuevaSecuencia = new SecuenciaRutaTramoCoeficienteVO(origem, destino, via, secuencia.getOrigem().getSecuencia().intValue(), totalKmsReal, tempoTotalOrigemDestino, rutaTramoVO.getNumRuta()); if (via != null) { TramoServicio tramoServicio = tramoServicioService.buscar(origem, destino, via, rutaTramoVO.getClaseServicio()); if (tramoServicio != null) { log.debug("TRAMO EXISTE"); nuevaSecuencia.setKmReal(tramoServicio.getTramo().getKmReal()); nuevaSecuencia.setTiempoRecorrido(new HoraSistema(tramoServicio.getTiemporecorrido())); nuevaSecuencia.setTramoId(tramoServicio.getTramo().getTramoId()); nuevaSecuencia.setTramoServicioId(tramoServicio.getTramoservicioId()); } OrgaoTramo orgaoTramo = orgaoTramoDAO.buscar(origem.getParadaId(), destino.getParadaId(), via.getViaId(), rutaTramoVO.getOrgaoConcedente().getOrgaoConcedenteId(), rutaTramoVO.getClaseServicio().getClaseservicioId()); if (orgaoTramo != null) { nuevaSecuencia.setCoeficienteTarifa1(orgaoTramo.getCoeficienteTarifa1()); nuevaSecuencia.setKmCoeficiente1(orgaoTramo.getKmCoeficiente1()); nuevaSecuencia.setCoeficienteTarifa2(orgaoTramo.getCoeficienteTarifa2()); nuevaSecuencia.setKmCoeficiente2(orgaoTramo.getKmCoeficiente2()); nuevaSecuencia.setOrgaoTramoId(orgaoTramo.getOrgaoTramoId()); } } if (nuevaSecuencia.getKmCoeficiente1() == null) { nuevaSecuencia.setKmCoeficiente1(nuevaSecuencia.getKmReal()); } nuevaSecuencia.setNumRuta(rutaTramoVO.getNumRuta()); lsSecuenciaCombinacionRutaTramoVO.add(nuevaSecuencia); } } return lsSecuenciaCombinacionRutaTramoVO; } /** * Genera los datos de tramo, tramo tiempo e coeficiente tarifa sino existen los datos * * @param secuencia * @param claseServicio * @param orgaoConcedente * @return */ private boolean generarDatos(SecuenciaRutaTramoCoeficienteVO secuencia, ClaseServicio claseServicio, OrgaoConcedente orgaoConcedente) { TramoServicio tramoServicio = tramoServicioDAO.buscar(secuencia.getOrigen(), secuencia.getDestino(), secuencia.getVia(), claseServicio); Tramo tramo = null; if (tramoServicio == null) { tramo = tramoService.buscar(secuencia.getOrigen(), secuencia.getDestino(), secuencia.getVia()); if (tramo == null) { if(secuencia.getTramoId() != null){ tramo = tramoService.obtenerID(secuencia.getTramoId()); }else{ tramo = new Tramo(); tramo.setDesctramo(tramoService.gerarDescripcionTramo(secuencia.getOrigen(), secuencia.getDestino(), secuencia.getVia())); tramo.setOrigem(secuencia.getOrigen()); tramo.setDestino(secuencia.getDestino()); tramo.setKmReal(secuencia.getKmReal()); tramo.setKmEntradaSaida(secuencia.getKmEntradaSaida() == null ? BigDecimal.ZERO : secuencia.getKmEntradaSaida()); tramo.setVia(secuencia.getVia()); tramo.setActivo(Boolean.TRUE); tramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); tramo.setFecmodif(new java.util.Date()); tramo = tramoDAO.suscribir(tramo); } } tramoServicio = new TramoServicio(); tramoServicio.setClaseServicio(claseServicio); tramoServicio.setTramo(tramo); tramoServicio.setTiemporecorrido(secuencia.getTiempoRecorrido().getFecha()); tramoServicio = tramoServicioService.suscribir(tramoServicio); if (secuencia.getOrgaoTramoId() == null && secuencia.getCoeficienteTarifa1() != null) { OrgaoTramo orgaoTramo = new OrgaoTramo(); orgaoTramo.setClaseServicio(claseServicio); orgaoTramo.setOrgaoConcedente(orgaoConcedente); orgaoTramo.setTramo(tramo); orgaoTramo.setActivo(Boolean.TRUE); orgaoTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); orgaoTramo.setFecmodif(new java.util.Date()); orgaoTramo.setCoeficienteTarifa1(secuencia.getCoeficienteTarifa1()); orgaoTramo.setKmCoeficiente1(secuencia.getKmCoeficiente1()); if (secuencia.getCoeficienteTarifa2() != null) { orgaoTramo.setCoeficienteTarifa2(secuencia.getCoeficienteTarifa2()); orgaoTramo.setKmCoeficiente2(secuencia.getKmCoeficiente2()); } orgaoTramo = orgaoTramoDAO.suscribir(orgaoTramo); } return true; } return false; } @Transactional(rollbackFor = BusinessException.class) @Override public void generarTramosRutaExistente(RutaTramoVO rutaTramoVO, Ruta ruta) throws BusinessException { this.validarGenerarTramosRutas(rutaTramoVO); // Genero los tramos y tramos servicios de la combinacion que no existen // Aqui si genera tambien los tramos de la secuencia for (SecuenciaRutaTramoCoeficienteVO s : rutaTramoVO.getLsCombinacionRutaTramoVO()) { log.debug("Origen:" + s.getOrigen() + ";Destino:" + s.getDestino() + ";Via:" + s.getVia()); boolean fueGenerado = generarDatos(s, rutaTramoVO.getClaseServicio(), rutaTramoVO.getOrgaoConcedente()); log.debug("Fue Generado:" + fueGenerado); } // Genero la secuencia de la ruta for (SecuenciaRutaTramoVO s : rutaTramoVO.getLsSecuenciaRutaTramoVO()) { RutaSecuencia rutaSecuencia = new RutaSecuencia(); rutaSecuencia.setNumsecuencia(s.getSecuencia().shortValue()); rutaSecuencia.setTramo(tramoService.obtenerTramotPorOrigemDestinoVia(s.getOrigen(), s.getDestino(), s.getVia())); rutaSecuencia.setRuta(ruta); rutaSecuencia.setKmOriginal(rutaSecuencia.getTramo().getKmReal().subtract(rutaSecuencia.getTramo().getKmEntradaSaida())); if (rutaSecuencia.getRuta() == null && rutaSecuencia.getRuta().getRutaId() == null) { rutaService.suscribir(rutaSecuencia.getRuta(), null); } rutaSecuencia = rutaSecuenciaService.suscribir(rutaSecuencia); if (rutaSecuencia.getRutasecuenciaId() == null){ throw new BusinessException(Labels.getLabel("gerarCombinacionTramoRutaController.MSG.error.rutaSecuencia")); } } for (SecuenciaRutaTramoCoeficienteVO s : rutaTramoVO.getLsCombinacionRutaTramoVO()) { RutaCombinacion rutaCombinacion = new RutaCombinacion(); rutaCombinacion.setIndventa(s.getPermiteVenda() == null ? true : s.getPermiteVenda()); rutaCombinacion.setRuta(ruta); rutaCombinacion.setTramo(tramoService.obtenerTramotPorOrigemDestinoVia(s.getOrigen(), s.getDestino(), s.getVia())); rutaCombinacion = rutaCombinacionService.suscribir(rutaCombinacion); if (rutaCombinacion.getRutacombinacionId() == null){ throw new BusinessException(Labels.getLabel("gerarCombinacionTramoRutaController.MSG.error.rutaCombinacion")); } } } //calculo do tempo sempre considerando que o calculo deve ser feito desconsiderando o valor do tempo, //inicializando com o tempo da origem e incrementando as sequencias anteriores private HoraSistema calcularTempoTotalDestino(ParadaSecuenciaCombinacaoLinha sequenciaOrigem, int numSeqAtual) { HoraSistema horaSistema = sequenciaOrigem.getTempoReal().isEmpty() ? new HoraSistema() : new HoraSistema(DateUtil.getDataTempoDecorrido(sequenciaOrigem.getTempoReal())); for (ParadaSecuencia destino: sequenciaOrigem.getDestinos()) { HoraSistema horaSistemaDestino = destino.getTempoReal().isEmpty() ? new HoraSistema() : new HoraSistema(DateUtil.getDataTempoDecorrido(destino.getTempoReal())); //desconsidera o tempo para os destinos com sequencia inferior a origem, já que estes já foram calculados if (sequenciaOrigem.getOrigem().getSecuencia() > destino.getSecuencia()) { continue; } //faz o calculo para a sequencia do destino para qual o tempo está sendo calculado if (destino.getSecuencia() == numSeqAtual){ break; } horaSistema = horaSistema.sumar(horaSistemaDestino); } return horaSistema; } //calculo da km sempre considerando que o calculo deve ser feito desconsiderando o valor da km, //inicializando com o valor da km da origem e incrementando as sequencias anteriores private BigDecimal calcularKmDestino(ParadaSecuenciaCombinacaoLinha sequenciaOrigem, int numSeqAtual) { BigDecimal kmTotal= sequenciaOrigem.getKmReal() == null || sequenciaOrigem.getKmReal().isEmpty() ? new BigDecimal("0.0") : new BigDecimal(sequenciaOrigem.getKmReal()); for (ParadaSecuencia destino: sequenciaOrigem.getDestinos()) { //desconsidera a km para os destinos com sequencia inferior a origem, já que estes já foram calculados if (sequenciaOrigem.getOrigem().getSecuencia() > destino.getSecuencia()) { continue; } //faz o calculo para a sequencia do destino para qual a km está sendo calculada if (destino.getSecuencia() == numSeqAtual){ break; } BigDecimal kmDestino= destino.getKmReal() == null || destino.getKmReal().isEmpty() ? new BigDecimal("0.0") : new BigDecimal(destino.getKmReal()); kmTotal = kmTotal.add(kmDestino); } return kmTotal; } }