diff --git a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java index b0c477fbc..77bc90a4a 100644 --- a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java +++ b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java @@ -62,736 +62,739 @@ import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; @Service("corridaService") public class CorridaServiceImpl implements CorridaService { - @Autowired - private CorridaDAO corridaDAO; - @Autowired - private EsquemaAsientoService esquemaAsientoService; - @Autowired - private CorridaCtrlService corridaCtrlService; - @Autowired - private RutaService rutaService; - @Autowired - private TramoServicioService tramoServicioService; - @Autowired - private TramoTiempoDAO tramoTiempoDAO; - @Autowired - private AsientoExclusivoService asientoExclusivoService; - @Autowired - private EsquemaTramoService esquemaTramoService; - @Autowired - private EsquemaCorridaService esquemaCorridaService; - @Autowired - private EsquemaCorridaDAO esquemaCorridaDAO; - @Autowired - private ConstanteService constanteService; - private static Logger log = Logger.getLogger(CorridaServiceImpl.class); - private PlatformTransactionManager transactionManager; - @Transient - private int cantCorridaGenerada; - @Transient - private int cantCorridaCommit; - - @Autowired - public CorridaServiceImpl(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) { - this.transactionManager = transactionManager; - } - - public List obtenerTodos() { - return corridaDAO.obtenerTodos(); - } - - public Corrida obtenerID(Corrida.Id id) { - return corridaDAO.obtenerID(id); - } - - @Transactional - public Corrida suscribir(Corrida entidad) { - entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(Boolean.TRUE); - - return corridaDAO.suscribir(entidad); - } - - @Transactional - public Corrida actualizacion(Corrida entidad) { - entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(Boolean.TRUE); - - return corridaDAO.actualizacion(entidad); - } - - @Transactional - public void borrar(Corrida entidad) { - entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(Boolean.FALSE); - - corridaDAO.actualizacion(entidad); - } - - public List buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus) { - return corridaDAO.buscarPorAutobusCorridasFuturas(diagramaAutobus); - } - - public List buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus) { - return corridaDAO.buscarPorRolOperativoCorridasFuturas(diagramaAutobus); - } - - public List buscarFiltro(Parada ori, Parada des, Date hora, ClaseServicio cs) { - return corridaDAO.buscarFiltro(ori, des, hora, cs); - } - - private boolean temCorridaDiaSemana(Integer diaSemana, EsquemaCorrida esquemaCorrida) { - Boolean retorno = Boolean.FALSE; - - switch (diaSemana) { - case 1: { - // diaSemana = "Domingo"; - if (esquemaCorrida.getInddomingo() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getInddomingo()) { - retorno = Boolean.TRUE; - } - break; - } - case 2: { - // diaSemana = "Segunda"; - if (esquemaCorrida.getIndlunes() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndlunes()) { - retorno = Boolean.TRUE; - } - break; - } - case 3: { - // diaSemana = "Terca"; - if (esquemaCorrida.getIndmartes() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndmartes()) { - retorno = Boolean.TRUE; - } - break; - } - case 4: { - // diaSemana = "Quarta"; - if (esquemaCorrida.getIndmiercoles() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndmiercoles()) { - retorno = Boolean.TRUE; - } - break; - } - case 5: { - // diaSemana = "Quinta"; - if (esquemaCorrida.getIndjueves() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndjueves()) { - retorno = Boolean.TRUE; - } - break; - } - case 6: { - // diaSemana = "Sexta"; - if (esquemaCorrida.getIndviernes() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndviernes()) { - retorno = Boolean.TRUE; - } - break; - } - case 7: { - // diaSemana = "Sabado"; - if (esquemaCorrida.getIndsabado() == null) { - retorno = Boolean.FALSE; - } else if (esquemaCorrida.getIndsabado()) { - retorno = Boolean.TRUE; - } - break; - } - } - - return retorno; - - } - - private Date calcularFechorllegada(EsquemaTramo esquemaTramo, ClaseServicio clase, Date dataGeracao, Date horaChegada) { - Tramo tramo = esquemaTramo.getTramo(); - List lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase); - - GregorianCalendar gHoraChegada = new GregorianCalendar(); - gHoraChegada.setTime(horaChegada); - - for (TramoServicio ts : lsTramoServicio) { - - GregorianCalendar gTiemporecorrido = new GregorianCalendar(); - gTiemporecorrido.setTime(ts.getTiemporecorrido()); - - gHoraChegada.set(Calendar.HOUR_OF_DAY, gHoraChegada.get(Calendar.HOUR_OF_DAY) + gTiemporecorrido.get(Calendar.HOUR_OF_DAY)); - - gHoraChegada.set(Calendar.MINUTE, gHoraChegada.get(Calendar.MINUTE) + gTiemporecorrido.get(Calendar.MINUTE)); - } - - return gHoraChegada.getTime(); - } - - private Date calcularFechorsalida(EsquemaTramo esquemaTramo, Date dataGeracao, Date horaChegadaAnterior, java.util.Date tiempoEstanciaAnterior) { - Date horaSaida; - if (horaChegadaAnterior == null) { - horaSaida = truncarDataHora(dataGeracao, esquemaTramo.getEsquemaCorrida().getHorasalida()); - } else { - GregorianCalendar gHoraSaidaProximo = new GregorianCalendar(); - gHoraSaidaProximo.setTime(horaChegadaAnterior); - - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - log.debug("Tempo Recorrido : " + sdf.format(gHoraSaidaProximo.getTime())); - - if (tiempoEstanciaAnterior != null) { - gHoraSaidaProximo.add(Calendar.MINUTE, tiempoEstanciaAnterior.getMinutes()); - gHoraSaidaProximo.add(Calendar.HOUR_OF_DAY, tiempoEstanciaAnterior.getHours()); - System.out.println("Tempo Recorrido + Estancia: " + sdf.format(gHoraSaidaProximo.getTime())); - } - - horaSaida = gHoraSaidaProximo.getTime(); - - } - - GregorianCalendar gHoraSaida = new GregorianCalendar(); - gHoraSaida.setTime(horaSaida); - - return gHoraSaida.getTime(); - } - - /** - * Adiciciona as horas do parametro hora na data dataGeracao. - * - * Al�m disso � zerado os campos segundos e milisegundos. - * - * @param dataGeracao - * @param hora - * @return - */ - private Date truncarDataHora(Date dataGeracao, Date hora) { - Date dataCorreta = new Date(); - - GregorianCalendar gAux = new GregorianCalendar(); - gAux.setTime(hora); - GregorianCalendar gcalendar = new GregorianCalendar(); - gcalendar.setTime(dataGeracao); - gcalendar.set(Calendar.HOUR_OF_DAY, gAux.get(Calendar.HOUR_OF_DAY)); - gcalendar.set(Calendar.MINUTE, gAux.get(Calendar.MINUTE)); - gcalendar.set(Calendar.SECOND, 0); - gcalendar.set(Calendar.MILLISECOND, 0); - - dataCorreta = gcalendar.getTime(); - - return dataCorreta; - } - - /** - * Genera una corrida para el esquemaCorrida informado en el dia y fecha - * informados. - * - * Es validado si la corrida ya existe - * - * @param esquemaCorrida - * @param diaSemana - * @param dataGeracao - * @return - La corrida generada o null si no fue generada. - */ - public Corrida generarCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, boolean isPisoExtra) { - GregorianCalendar calendario = new GregorianCalendar(); - calendario.setTime(dataGeracao); - - Integer diaSemana = calendario.get(Calendar.DAY_OF_WEEK); - Corrida corrida = null; - if ((esquemaCorrida.getStatusCorrida() != null) && (esquemaCorrida.getStatusCorrida().equals("A"))) { - if (temCorridaDiaSemana(diaSemana, esquemaCorrida)) { - try { - Ruta ruta = esquemaCorrida.getRuta(); - ClaseServicio claseServicio = esquemaCorrida.getClaseServicio(); - Marca marca = esquemaCorrida.getMarca(); - Date horario = esquemaCorrida.getHorasalida(); - horario = DateUtil.normalizar(horario); - - if (corridaDAO.existe(ruta, dataGeracao, horario, claseServicio, marca, isPisoExtra)) { - log.debug("corrida existe = " + ruta.getDescruta() + ";" + DateUtil.getStringDate(dataGeracao) + ";" + DateUtil.getStringDate(horario, "HH:mm") + ";" + claseServicio.getDescclase() + ";" + marca.getDescmarca() + " Piso: " + isPisoExtra); - return null; - } - - CorridaCtrl corridaCtrl = corridaCtrlService.buscar(ruta, claseServicio, marca, horario, isPisoExtra); - if (corridaCtrl == null) { - corridaCtrl = new CorridaCtrl(); - - corridaCtrl.setCorridaId(esquemaCorrida.getNumCorrida()); - corridaCtrl.setMarca(marca); - corridaCtrl.setRuta(ruta); - corridaCtrl.setClaseServicio(claseServicio); - corridaCtrl.setHorario(horario); - - // parada origem - Parada origen = rutaService.getOrigem(ruta); - if (origen == null) { - log.debug("origen nao encontrado para a ruta = " + ruta.getRutaId()); - } - corridaCtrl.setNodo((origen == null) ? null : origen.getNodo()); - - corridaCtrl.setActivo(Boolean.TRUE); - corridaCtrl.setFecmodif(Calendar.getInstance().getTime()); - if (UsuarioLogado.getUsuarioLogado() != null) { - corridaCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } - - corridaCtrl.setPisoExtra(isPisoExtra); - corridaCtrl = corridaCtrlService.suscribir(corridaCtrl); - } - - Corrida.Id id = new Corrida.Id(); - id.setCorridaId(corridaCtrl.getCorridaId()); - id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); - - Boolean existeCorrida = corridaDAO.existe(id); - if (!existeCorrida) { - - corrida = new Corrida(); - corrida.setId(id); - corrida.setEsquemaCorrida(esquemaCorrida); - corrida.setCorridaCtrl(corridaCtrl); - corrida.setAutobus(null); - corrida.setClaseServicio(esquemaCorrida.getClaseServicio()); - corrida.setConductor(null); - corrida.setTipoServicio(new Short("1")); - Integer cantparados = esquemaCorrida.getCantparados(); - if (cantparados != null) { - corrida.setCantParados(cantparados.shortValue()); - } - - Parada destino = rutaService.getDestino(ruta); - if (destino == null) { - return null; - } - corrida.setDestino(destino); - - corrida.setEmpresa(esquemaCorrida.getEmpresa()); - corrida.setEmpresa1(esquemaCorrida.getEmpresa1()); - - corrida.setFechorsalida(truncarDataHora(dataGeracao, esquemaCorrida.getHorasalida())); - corrida.setFechorSalidaOriginal(corrida.getFechorsalida()); - corrida.setIndstatuscorrida("H"); - corrida.setMarca(esquemaCorrida.getMarca()); - corrida.setNodo(corridaCtrl.getNodo()); - corrida.setDivision(esquemaCorrida.getDivision()); - - Parada origem = rutaService.getOrigem(ruta); - if (origem == null) { - return null; - } - corrida.setOrigem(origem); - - corrida.setRuta(esquemaCorrida.getRuta()); - corrida.setRolOperativo(esquemaCorrida.getRolOperativo()); - corrida.setZona(null); - - boolean hayCorrida = corridaDAO.count(corrida.getOrigem(), corrida.getDestino(), corrida.getId().getFeccorrida(), corrida.getClaseServicio(), isPisoExtra); - - if (hayCorrida) { - return null; - } - - // corrida Tramo: - List lsCorridaTramo = new ArrayList(); - Integer numSec = 1; - List lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida); - Date horaChegadaAnterior = null; - Date tiempoInstanciaAnterior = null; // indica o tempo - // de instancia - // que fica no - // tramo - // anterior ao - // atual - for (EsquemaTramo esquemaTramo : lsEsquemaTramo) { - CorridaTramo corridaTramo = new CorridaTramo(); - corridaTramo.setAutobus(null); - corridaTramo.setConductor(null); - corridaTramo.setConductor1(null); - corridaTramo.setPlataforma(esquemaTramo.getPlataforma()); - - corridaTramo.setTiempoEstancia(esquemaTramo.getTiempoEstancia()); - - // numSec: 1-2, 2-3, 3-4... - corridaTramo.setNumsecorigen(numSec.shortValue()); - numSec = numSec + 1; - corridaTramo.setNumsecdestino(numSec.shortValue()); - - Date fecHorSalida = calcularFechorsalida(esquemaTramo, dataGeracao, horaChegadaAnterior, tiempoInstanciaAnterior); - fecHorSalida.setSeconds(0); - corridaTramo.setFechorsalida(fecHorSalida); - - Date fecHorallegada = calcularFechorllegada(esquemaTramo, corrida.getClaseServicio(), dataGeracao, fecHorSalida); - fecHorallegada.setSeconds(0); - corridaTramo.setFechorllegada(fecHorallegada); - horaChegadaAnterior = fecHorallegada; - tiempoInstanciaAnterior = esquemaTramo.getTiempoEstancia(); - - corridaTramo.setFechortarjetaviaje(null); - corridaTramo.setNodo(corridaCtrl.getNodo()); - - corridaTramo.setNumsecuencia(esquemaTramo.getNumsecuencia()); - Tramo tramo = esquemaTramo.getTramo(); - if (tramo != null) { - corridaTramo.setOrigem(tramo.getOrigem()); - corridaTramo.setDestino(tramo.getDestino()); - } - corridaTramo.setTramo(tramo); - corridaTramo.setUsuariotarjetaviajeId(null); - - Date excepcionTiempo = arreglaExcepcionTiempo(corridaTramo, corrida.getClaseServicio()); - if (excepcionTiempo != null) { - corridaTramo.setFechorllegada(excepcionTiempo); - horaChegadaAnterior = excepcionTiempo; - } - - corridaTramo.setActivo(Boolean.TRUE); - corridaTramo.setFecmodif(Calendar.getInstance().getTime()); - if (UsuarioLogado.getUsuarioLogado() != null) { - corridaTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } - corridaTramo.setCorrida(corrida); - corridaTramo.setFechorSalidaOriginal(fecHorSalida); - - lsCorridaTramo.add(corridaTramo); - } - corrida.setCorridaTramoList(lsCorridaTramo); - - corrida.setActivo(Boolean.TRUE); - corrida.setFecmodif(Calendar.getInstance().getTime()); - if (UsuarioLogado.getUsuarioLogado() != null) { - corrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } else { - corrida.setUsuarioId(1); - } - corrida.setIndTipoVenta(null); - - corrida = corridaDAO.suscribir(corrida); - cantCorridaGenerada++; - - List lsEsquemaAsiento = esquemaAsientoService.obtenerPorCorrida(esquemaCorrida); - for (EsquemaAsiento ea : lsEsquemaAsiento) { - AsientoExclusivo asientoExclusivo = new AsientoExclusivo(); - asientoExclusivo.setCorrida(corrida); - asientoExclusivo.setMotivobloqueo(null); - asientoExclusivo.setNodo(corrida.getNodo()); - asientoExclusivo.setNumasiento(ea.getNumasiento()); - asientoExclusivo.setVendible(ea.getIndvendible()); - asientoExclusivo.setParada(ea.getParada()); - - asientoExclusivo.setActivo(Boolean.TRUE); - asientoExclusivo.setFecmodif(Calendar.getInstance().getTime()); - if (UsuarioLogado.getUsuarioLogado() != null) { - asientoExclusivo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } - - asientoExclusivo = asientoExclusivoService.suscribir(asientoExclusivo); - } - - }// if (!existeCorrida) - } catch (org.springframework.dao.DataIntegrityViolationException ex) { - log.error(ex); - } - } // if (temCorridaDiaSemana(diaSemana, esquemaCorrida)) - } // if (esquemaCorrida.getStatusCorrida().equals("A")) - - return corrida; - } - - public void generarCorrida(Date dataGeracao, List lsEsquemaCorrida) { - - DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); - - TransactionStatus status = transactionManager.getTransaction(def); - cantCorridaGenerada = 0; - cantCorridaCommit = 1; - - for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { - log.info("esquema=" + esquemaCorrida.getEsquemacorridaId()); - - if (!esquemaCorridaDAO.esHijoRebote(esquemaCorrida)) { - - Corrida corrida = generarCorrida(esquemaCorrida, dataGeracao, false); - Corrida corridaPisoExtra = null; - - if (corrida == null) {// Si no gener� la corrida, no va a - // generar el rebote - log.info("No fue generado corrida. Esquema " + esquemaCorrida.getEsquemacorridaId() + " Data" + dataGeracao); - continue; - } - - // PISO EXTRA - if (esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) { - // Invertendo RolOperativo e Classe de Servi�o para o Piso - // Extra - RolOperativo ro = esquemaCorrida.getRolOperativo(); - ClaseServicio cs = esquemaCorrida.getClaseServicio(); - - esquemaCorrida.setRolOperativo(esquemaCorrida.getRolOperativo2()); - esquemaCorrida.setClaseServicio(esquemaCorrida.getClaseServicio2()); - - corridaPisoExtra = generarCorrida(esquemaCorrida, dataGeracao, true); - if (corrida != null && corridaPisoExtra != null) { - // Voltando RolOperativo e Classe de Servi�o - esquemaCorrida.setRolOperativo(ro); - esquemaCorrida.setClaseServicio(cs); - - // Salvando Referencia da Corrida no piso extra - corridaPisoExtra.setCorridaPiso(corrida); - corridaPisoExtra.setNumPiso(2); - corridaPisoExtra = corridaDAO.actualizacion(corridaPisoExtra); - - // Referencia do Piso extra na Corrida - corrida.setCorridaPiso(corridaPisoExtra); - corrida.setNumPiso(1); - corrida = corridaDAO.actualizacion(corrida); - } - } - - if (esquemaCorrida.getEsquemaCorridaRebote() != null) { - - log.info("Corrida Rebote=" + esquemaCorrida.getEsquemacorridaId()); - - Corrida corridaRebote = generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), dataGeracao, false); - Corrida corridaPisoExtraRebote = null; - - boolean generaReboteDiaSeguinte = false; - - if (corridaRebote != null) { - EsquemaCorrida ecRebote = esquemaCorrida.getEsquemaCorridaRebote(); - if (ecRebote.getPisoExtra() != null && ecRebote.getPisoExtra()) { - // Invertendo RolOperativo e Classe de Servi�o para - // o Piso Extra - RolOperativo ro = ecRebote.getRolOperativo(); - ClaseServicio cs = ecRebote.getClaseServicio(); - - ecRebote.setRolOperativo(ecRebote.getRolOperativo2()); - ecRebote.setClaseServicio(ecRebote.getClaseServicio2()); - - corridaPisoExtraRebote = generarCorrida(ecRebote, dataGeracao, true); - if (corridaRebote != null && corridaPisoExtraRebote != null) { - // Salvando Referencia da Corrida no piso extra - corridaPisoExtraRebote.setCorridaPiso(corridaRebote); - corridaPisoExtraRebote.setNumPiso(2); - corridaPisoExtraRebote = corridaDAO.actualizacion(corridaPisoExtraRebote); - - // Voltando RolOperativo e Classe de Serviço - ecRebote.setRolOperativo(ro); - ecRebote.setClaseServicio(cs); - - // Referencia do Piso extra na Corrida - corridaRebote.setCorridaPiso(corridaPisoExtraRebote); - corridaRebote.setNumPiso(1); - corridaRebote = corridaDAO.actualizacion(corridaRebote); - } - } - // RebotePisoExtra - if (DateUtil.compareDate(corrida.getFechorsalida(), corridaRebote.getFechorsalida()) > 0) { - generaReboteDiaSeguinte = true; // si fue generado - // con una - // fechamenor tienes - // que generar para - // el d�a seguinte - } - } else { - generaReboteDiaSeguinte = true;// si no fue encontrado - // para el d�a de - // hoy,genera para - // ma�ana - } - - if (generaReboteDiaSeguinte) { - log.info("Haciendo la b�squeda por el esquema rebote para el dia seguiente pues ya existe al dia de hoy"); - - corridaRebote = generarReboteDiaSeguinte(esquemaCorrida, dataGeracao); - - if (corridaPisoExtraRebote != null) { - corridaPisoExtraRebote = generarReboteDiaSeguinte(esquemaCorrida, dataGeracao); - } - - if (corridaRebote == null) { - log.info("No fue posible generar la corrida rebote. No fue encontrado esquema para la fecha del dia seguinte a " + dataGeracao); - } - } - if (corridaRebote != null) { - log.info("Rebote generado=" + corridaRebote.getId()); - corrida.setCorridaRebote(corridaRebote); - corridaDAO.actualizacion(corrida); - } - if (corridaPisoExtraRebote != null && corridaPisoExtra != null) { - log.info("Rebote Piso Extra Generado=" + corridaPisoExtraRebote.getId()); - corridaPisoExtra.setCorridaRebote(corridaPisoExtraRebote); - corridaDAO.actualizacion(corridaPisoExtra); - } - } - } - if (cantCorridaGenerada >= cantCorridaCommit) { - cantCorridaGenerada = 0; - transactionManager.commit(status); - status = transactionManager.getTransaction(def); - } - } // for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) - - if (!status.isCompleted()) { - transactionManager.commit(status); - } - - } - - /** - * Verifica se hay una excepcione de tiempo para el tramo informado. - * - * @param corridaTramo - * @param claseServicio - * @return - Si existe una excepcion, regresa la nueva fecLlegada para el - * tramo, sino, regreso null - */ - private Date arreglaExcepcionTiempo(CorridaTramo corridaTramo, ClaseServicio claseServicio) { - Date nuevaFecLlegada = null; - - Tramo tramo = corridaTramo.getTramo(); - - List lsExcepciones = tramoTiempoDAO.buscar(tramo, claseServicio, corridaTramo.getFechorsalida(), corridaTramo.getFechorllegada()); - - if (!lsExcepciones.isEmpty()) { - - TramoTiempo tramoTiempo = lsExcepciones.get(0); - List diasSemana = getDiaDeLaSemana(tramoTiempo); - - Calendar fecCorrida = Calendar.getInstance(); - fecCorrida.setTime(corridaTramo.getFechorllegada()); - - if (diasSemana.contains(fecCorrida.get(Calendar.DAY_OF_WEEK)) || diasSemana.contains(fecCorrida.get(Calendar.DAY_OF_WEEK))) { - log.debug("Hay Excepcione de tiempo"); - Calendar fechorsalida = Calendar.getInstance(); - fechorsalida.setTime(corridaTramo.getFechorsalida()); - - Calendar tmpTiemporecorrido = Calendar.getInstance(); - tmpTiemporecorrido.setTime(tramoTiempo.getTiemporecorrido()); - - fechorsalida.add(Calendar.HOUR, tmpTiemporecorrido.get(Calendar.HOUR)); - fechorsalida.add(Calendar.MINUTE, tmpTiemporecorrido.get(Calendar.MINUTE)); - - nuevaFecLlegada = fechorsalida.getTime(); - } - } - return nuevaFecLlegada; - } - - private Corrida generarReboteDiaSeguinte(EsquemaCorrida esquemaCorrida, Date dataGeracao) { - Calendar tmp = Calendar.getInstance(); - tmp.setTime(dataGeracao); - tmp.add(Calendar.DAY_OF_MONTH, 1); - return generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), tmp.getTime(), false); - } - - private List getDiaDeLaSemana(TramoTiempo tramoTiempo) { - List diasValidos = new ArrayList(); - - if (tramoTiempo.getIndapliclun()) { - diasValidos.add(Calendar.MONDAY); - } - if (tramoTiempo.getIndaplicmar()) { - diasValidos.add(Calendar.TUESDAY); - } - if (tramoTiempo.getIndaplicmie()) { - diasValidos.add(Calendar.WEDNESDAY); - } - if (tramoTiempo.getIndaplicjue()) { - diasValidos.add(Calendar.THURSDAY); - } - if (tramoTiempo.getIndaplicvie()) { - diasValidos.add(Calendar.FRIDAY); - } - if (tramoTiempo.getIndaplicsab()) { - diasValidos.add(Calendar.SATURDAY); - } - if (tramoTiempo.getIndaplicdom()) { - diasValidos.add(Calendar.SUNDAY); - } - - return diasValidos; - } - - public List buscarPorFecCorrida(Date value) { - return corridaDAO.buscarPorFecCorrida(value); - } - - public List buscarPorId(Integer idCorrida) { - return corridaDAO.buscarPorId(idCorrida); - } - - @Override - public Date calcularDataFinalGeneracionCorrida() { - Date dataDe = new Date(); - - Constante constante = constanteService.buscarPorNomeConstante("CANT_DIAS_GENERACION_CORRIDA"); - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataDe); - calendarData.add(Calendar.DATE, Integer.parseInt(constante.getValorconstante())); - Date dataAte = calendarData.getTime(); - - return dataAte; - } - - @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) - public boolean generarCorridaAutomatica() { - - // Date dataDe = new GregorianCalendar(2012, 4, 25).getTime(); - Date dataDe = new java.util.Date(); - Date dataAte = calcularDataFinalGeneracionCorrida(); - // Date dataAte = new GregorianCalendar(2012, 4, 25).getTime(); - - return generarCorridaAutomatica(dataDe, dataAte); - } - - public boolean generarCorridaAutomatica(Date dataDe, Date dataAte) { - - boolean hayError = false; - SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); - - log.debug("** AUTO - Data De: " + sdfData.format(dataDe) + " **Data At�: " + sdfData.format(dataAte)); - - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataAte); - calendarData.add(Calendar.DATE, 1); - dataAte = calendarData.getTime(); - try { - while (dataDe.before(dataAte)) { - - log.debug("*** Data: " + sdfData.format(dataDe)); - - List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigencia(dataDe); - - Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); - if (dentroVigenciaEsquemaOperacional) { - this.generarCorrida(dataDe, lsEsquemaCorrida); - } else { - log.info("No hay esquema vigente para la fecha " + sdfData.format(dataDe)); - } - - calendarData.setTime(dataDe); - calendarData.add(Calendar.DATE, 1); - dataDe = calendarData.getTime(); - } - - } catch (Exception ex) { - log.error("Erro ao gerar corridas: " + ex, ex); - hayError = true; - - } - return hayError; - } - - @Override - public List buscarDistinct(Parada ori, Parada des, Date horaSalidaInicio, Date horaSalidaFin, ClaseServicio cs, Integer corridaId) { - return corridaDAO.buscarDistinct(ori, des, (horaSalidaInicio == null) ? null : DateUtil.getFecInicio(horaSalidaInicio).getTime(), (horaSalidaFin == null) ? null : DateUtil.getFecInicio(horaSalidaFin).getTime(), cs, corridaId); - } + @Autowired + private CorridaDAO corridaDAO; + @Autowired + private EsquemaAsientoService esquemaAsientoService; + @Autowired + private CorridaCtrlService corridaCtrlService; + @Autowired + private RutaService rutaService; + @Autowired + private TramoServicioService tramoServicioService; + @Autowired + private TramoTiempoDAO tramoTiempoDAO; + @Autowired + private AsientoExclusivoService asientoExclusivoService; + @Autowired + private EsquemaTramoService esquemaTramoService; + @Autowired + private EsquemaCorridaService esquemaCorridaService; + @Autowired + private EsquemaCorridaDAO esquemaCorridaDAO; + @Autowired + private ConstanteService constanteService; + private static Logger log = Logger.getLogger(CorridaServiceImpl.class); + private PlatformTransactionManager transactionManager; + @Transient + private int cantCorridaGenerada; + @Transient + private int cantCorridaCommit; + + @Autowired + public CorridaServiceImpl(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) { + this.transactionManager = transactionManager; + } + + public List obtenerTodos() { + return corridaDAO.obtenerTodos(); + } + + public Corrida obtenerID(Corrida.Id id) { + return corridaDAO.obtenerID(id); + } + + @Transactional + public Corrida suscribir(Corrida entidad) { + entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + entidad.setFecmodif(Calendar.getInstance().getTime()); + entidad.setActivo(Boolean.TRUE); + + return corridaDAO.suscribir(entidad); + } + + @Transactional + public Corrida actualizacion(Corrida entidad) { + entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + entidad.setFecmodif(Calendar.getInstance().getTime()); + entidad.setActivo(Boolean.TRUE); + + return corridaDAO.actualizacion(entidad); + } + + @Transactional + public void borrar(Corrida entidad) { + entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + entidad.setFecmodif(Calendar.getInstance().getTime()); + entidad.setActivo(Boolean.FALSE); + + corridaDAO.actualizacion(entidad); + } + + public List buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus) { + return corridaDAO.buscarPorAutobusCorridasFuturas(diagramaAutobus); + } + + public List buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus) { + return corridaDAO.buscarPorRolOperativoCorridasFuturas(diagramaAutobus); + } + + public List buscarFiltro(Parada ori, Parada des, Date hora, ClaseServicio cs) { + return corridaDAO.buscarFiltro(ori, des, hora, cs); + } + + private boolean temCorridaDiaSemana(Integer diaSemana, EsquemaCorrida esquemaCorrida) { + Boolean retorno = Boolean.FALSE; + + switch (diaSemana) { + case 1: { + // diaSemana = "Domingo"; + if (esquemaCorrida.getInddomingo() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getInddomingo()) { + retorno = Boolean.TRUE; + } + break; + } + case 2: { + // diaSemana = "Segunda"; + if (esquemaCorrida.getIndlunes() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndlunes()) { + retorno = Boolean.TRUE; + } + break; + } + case 3: { + // diaSemana = "Terca"; + if (esquemaCorrida.getIndmartes() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndmartes()) { + retorno = Boolean.TRUE; + } + break; + } + case 4: { + // diaSemana = "Quarta"; + if (esquemaCorrida.getIndmiercoles() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndmiercoles()) { + retorno = Boolean.TRUE; + } + break; + } + case 5: { + // diaSemana = "Quinta"; + if (esquemaCorrida.getIndjueves() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndjueves()) { + retorno = Boolean.TRUE; + } + break; + } + case 6: { + // diaSemana = "Sexta"; + if (esquemaCorrida.getIndviernes() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndviernes()) { + retorno = Boolean.TRUE; + } + break; + } + case 7: { + // diaSemana = "Sabado"; + if (esquemaCorrida.getIndsabado() == null) { + retorno = Boolean.FALSE; + } else if (esquemaCorrida.getIndsabado()) { + retorno = Boolean.TRUE; + } + break; + } + } + + return retorno; + + } + + private Date calcularFechorllegada(EsquemaTramo esquemaTramo, ClaseServicio clase, Date dataGeracao, Date horaChegada) { + Tramo tramo = esquemaTramo.getTramo(); + List lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase); + + GregorianCalendar gHoraChegada = new GregorianCalendar(); + gHoraChegada.setTime(horaChegada); + + for (TramoServicio ts : lsTramoServicio) { + + GregorianCalendar gTiemporecorrido = new GregorianCalendar(); + gTiemporecorrido.setTime(ts.getTiemporecorrido()); + + gHoraChegada.set(Calendar.HOUR_OF_DAY, gHoraChegada.get(Calendar.HOUR_OF_DAY) + gTiemporecorrido.get(Calendar.HOUR_OF_DAY)); + + gHoraChegada.set(Calendar.MINUTE, gHoraChegada.get(Calendar.MINUTE) + gTiemporecorrido.get(Calendar.MINUTE)); + } + + return gHoraChegada.getTime(); + } + + private Date calcularFechorsalida(EsquemaTramo esquemaTramo, Date dataGeracao, Date horaChegadaAnterior, java.util.Date tiempoEstanciaAnterior) { + Date horaSaida; + if (horaChegadaAnterior == null) { + horaSaida = truncarDataHora(dataGeracao, esquemaTramo.getEsquemaCorrida().getHorasalida()); + } else { + GregorianCalendar gHoraSaidaProximo = new GregorianCalendar(); + gHoraSaidaProximo.setTime(horaChegadaAnterior); + + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + log.debug("Tempo Recorrido : " + sdf.format(gHoraSaidaProximo.getTime())); + + if (tiempoEstanciaAnterior != null) { + gHoraSaidaProximo.add(Calendar.MINUTE, tiempoEstanciaAnterior.getMinutes()); + gHoraSaidaProximo.add(Calendar.HOUR_OF_DAY, tiempoEstanciaAnterior.getHours()); + System.out.println("Tempo Recorrido + Estancia: " + sdf.format(gHoraSaidaProximo.getTime())); + } + + horaSaida = gHoraSaidaProximo.getTime(); + + } + + GregorianCalendar gHoraSaida = new GregorianCalendar(); + gHoraSaida.setTime(horaSaida); + + return gHoraSaida.getTime(); + } + + /** + * Adiciciona as horas do parametro hora na data dataGeracao. + * + * Al�m disso � zerado os campos segundos e milisegundos. + * + * @param dataGeracao + * @param hora + * @return + */ + private Date truncarDataHora(Date dataGeracao, Date hora) { + Date dataCorreta = new Date(); + + GregorianCalendar gAux = new GregorianCalendar(); + gAux.setTime(hora); + GregorianCalendar gcalendar = new GregorianCalendar(); + gcalendar.setTime(dataGeracao); + gcalendar.set(Calendar.HOUR_OF_DAY, gAux.get(Calendar.HOUR_OF_DAY)); + gcalendar.set(Calendar.MINUTE, gAux.get(Calendar.MINUTE)); + gcalendar.set(Calendar.SECOND, 0); + gcalendar.set(Calendar.MILLISECOND, 0); + + dataCorreta = gcalendar.getTime(); + + return dataCorreta; + } + + /** + * Genera una corrida para el esquemaCorrida informado en el dia y fecha + * informados. + * + * Es validado si la corrida ya existe + * + * @param esquemaCorrida + * @param diaSemana + * @param dataGeracao + * @return - La corrida generada o null si no fue generada. + */ + public Corrida generarCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, boolean isPisoExtra) { + GregorianCalendar calendario = new GregorianCalendar(); + calendario.setTime(dataGeracao); + + Integer diaSemana = calendario.get(Calendar.DAY_OF_WEEK); + Corrida corrida = null; + if ((esquemaCorrida.getStatusCorrida() != null) && (esquemaCorrida.getStatusCorrida().equals("A"))) { + if (temCorridaDiaSemana(diaSemana, esquemaCorrida)) { + try { + Ruta ruta = esquemaCorrida.getRuta(); + ClaseServicio claseServicio = esquemaCorrida.getClaseServicio(); + Marca marca = esquemaCorrida.getMarca(); + Date horario = esquemaCorrida.getHorasalida(); + horario = DateUtil.normalizar(horario); + + if (corridaDAO.existe(ruta, dataGeracao, horario, claseServicio, marca, isPisoExtra)) { + log.debug("corrida existe = " + ruta.getDescruta() + ";" + DateUtil.getStringDate(dataGeracao) + ";" + DateUtil.getStringDate(horario, "HH:mm") + ";" + claseServicio.getDescclase() + ";" + marca.getDescmarca() + " Piso: " + isPisoExtra); + return null; + } + + CorridaCtrl corridaCtrl = corridaCtrlService.buscar(ruta, claseServicio, marca, horario, isPisoExtra); + if (corridaCtrl == null) { + corridaCtrl = new CorridaCtrl(); + if (!isPisoExtra) { + corridaCtrl.setCorridaId(esquemaCorrida.getNumCorrida()); + } else { + corridaCtrl.setCorridaId(esquemaCorrida.getNumCorridaPisoExtra()); + } + corridaCtrl.setMarca(marca); + corridaCtrl.setRuta(ruta); + corridaCtrl.setClaseServicio(claseServicio); + corridaCtrl.setHorario(horario); + + // parada origem + Parada origen = rutaService.getOrigem(ruta); + if (origen == null) { + log.debug("origen nao encontrado para a ruta = " + ruta.getRutaId()); + } + corridaCtrl.setNodo((origen == null) ? null : origen.getNodo()); + + corridaCtrl.setActivo(Boolean.TRUE); + corridaCtrl.setFecmodif(Calendar.getInstance().getTime()); + if (UsuarioLogado.getUsuarioLogado() != null) { + corridaCtrl.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } + + corridaCtrl.setPisoExtra(isPisoExtra); + corridaCtrl = corridaCtrlService.suscribir(corridaCtrl); + } + + Corrida.Id id = new Corrida.Id(); + id.setCorridaId(corridaCtrl.getCorridaId()); + id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); + + Boolean existeCorrida = corridaDAO.existe(id); + if (!existeCorrida) { + + corrida = new Corrida(); + corrida.setId(id); + corrida.setEsquemaCorrida(esquemaCorrida); + corrida.setCorridaCtrl(corridaCtrl); + corrida.setAutobus(null); + corrida.setClaseServicio(esquemaCorrida.getClaseServicio()); + corrida.setConductor(null); + corrida.setTipoServicio(new Short("1")); + Integer cantparados = esquemaCorrida.getCantparados(); + if (cantparados != null) { + corrida.setCantParados(cantparados.shortValue()); + } + + Parada destino = rutaService.getDestino(ruta); + if (destino == null) { + return null; + } + corrida.setDestino(destino); + + corrida.setEmpresa(esquemaCorrida.getEmpresa()); + corrida.setEmpresa1(esquemaCorrida.getEmpresa1()); + + corrida.setFechorsalida(truncarDataHora(dataGeracao, esquemaCorrida.getHorasalida())); + corrida.setFechorSalidaOriginal(corrida.getFechorsalida()); + corrida.setIndstatuscorrida("H"); + corrida.setMarca(esquemaCorrida.getMarca()); + corrida.setNodo(corridaCtrl.getNodo()); + corrida.setDivision(esquemaCorrida.getDivision()); + + Parada origem = rutaService.getOrigem(ruta); + if (origem == null) { + return null; + } + corrida.setOrigem(origem); + + corrida.setRuta(esquemaCorrida.getRuta()); + corrida.setRolOperativo(esquemaCorrida.getRolOperativo()); + corrida.setZona(null); + + boolean hayCorrida = corridaDAO.count(corrida.getOrigem(), corrida.getDestino(), corrida.getId().getFeccorrida(), corrida.getClaseServicio(), isPisoExtra); + + if (hayCorrida) { + return null; + } + + // corrida Tramo: + List lsCorridaTramo = new ArrayList(); + Integer numSec = 1; + List lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida); + Date horaChegadaAnterior = null; + Date tiempoInstanciaAnterior = null; // indica o tempo + // de instancia + // que fica no + // tramo + // anterior ao + // atual + for (EsquemaTramo esquemaTramo : lsEsquemaTramo) { + CorridaTramo corridaTramo = new CorridaTramo(); + corridaTramo.setAutobus(null); + corridaTramo.setConductor(null); + corridaTramo.setConductor1(null); + corridaTramo.setPlataforma(esquemaTramo.getPlataforma()); + + corridaTramo.setTiempoEstancia(esquemaTramo.getTiempoEstancia()); + + // numSec: 1-2, 2-3, 3-4... + corridaTramo.setNumsecorigen(numSec.shortValue()); + numSec = numSec + 1; + corridaTramo.setNumsecdestino(numSec.shortValue()); + + Date fecHorSalida = calcularFechorsalida(esquemaTramo, dataGeracao, horaChegadaAnterior, tiempoInstanciaAnterior); + fecHorSalida.setSeconds(0); + corridaTramo.setFechorsalida(fecHorSalida); + + Date fecHorallegada = calcularFechorllegada(esquemaTramo, corrida.getClaseServicio(), dataGeracao, fecHorSalida); + fecHorallegada.setSeconds(0); + corridaTramo.setFechorllegada(fecHorallegada); + horaChegadaAnterior = fecHorallegada; + tiempoInstanciaAnterior = esquemaTramo.getTiempoEstancia(); + + corridaTramo.setFechortarjetaviaje(null); + corridaTramo.setNodo(corridaCtrl.getNodo()); + + corridaTramo.setNumsecuencia(esquemaTramo.getNumsecuencia()); + Tramo tramo = esquemaTramo.getTramo(); + if (tramo != null) { + corridaTramo.setOrigem(tramo.getOrigem()); + corridaTramo.setDestino(tramo.getDestino()); + } + corridaTramo.setTramo(tramo); + corridaTramo.setUsuariotarjetaviajeId(null); + + Date excepcionTiempo = arreglaExcepcionTiempo(corridaTramo, corrida.getClaseServicio()); + if (excepcionTiempo != null) { + corridaTramo.setFechorllegada(excepcionTiempo); + horaChegadaAnterior = excepcionTiempo; + } + + corridaTramo.setActivo(Boolean.TRUE); + corridaTramo.setFecmodif(Calendar.getInstance().getTime()); + if (UsuarioLogado.getUsuarioLogado() != null) { + corridaTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } + corridaTramo.setCorrida(corrida); + corridaTramo.setFechorSalidaOriginal(fecHorSalida); + + lsCorridaTramo.add(corridaTramo); + } + corrida.setCorridaTramoList(lsCorridaTramo); + + corrida.setActivo(Boolean.TRUE); + corrida.setFecmodif(Calendar.getInstance().getTime()); + if (UsuarioLogado.getUsuarioLogado() != null) { + corrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } else { + corrida.setUsuarioId(1); + } + corrida.setIndTipoVenta(null); + + corrida = corridaDAO.suscribir(corrida); + cantCorridaGenerada++; + + List lsEsquemaAsiento = esquemaAsientoService.obtenerPorCorrida(esquemaCorrida); + for (EsquemaAsiento ea : lsEsquemaAsiento) { + AsientoExclusivo asientoExclusivo = new AsientoExclusivo(); + asientoExclusivo.setCorrida(corrida); + asientoExclusivo.setMotivobloqueo(null); + asientoExclusivo.setNodo(corrida.getNodo()); + asientoExclusivo.setNumasiento(ea.getNumasiento()); + asientoExclusivo.setVendible(ea.getIndvendible()); + asientoExclusivo.setParada(ea.getParada()); + + asientoExclusivo.setActivo(Boolean.TRUE); + asientoExclusivo.setFecmodif(Calendar.getInstance().getTime()); + if (UsuarioLogado.getUsuarioLogado() != null) { + asientoExclusivo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } + + asientoExclusivo = asientoExclusivoService.suscribir(asientoExclusivo); + } + + }// if (!existeCorrida) + } catch (org.springframework.dao.DataIntegrityViolationException ex) { + log.error(ex); + } + } // if (temCorridaDiaSemana(diaSemana, esquemaCorrida)) + } // if (esquemaCorrida.getStatusCorrida().equals("A")) + + return corrida; + } + + public void generarCorrida(Date dataGeracao, List lsEsquemaCorrida) { + + DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); + + TransactionStatus status = transactionManager.getTransaction(def); + cantCorridaGenerada = 0; + cantCorridaCommit = 1; + + for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { + log.info("esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + + if (!esquemaCorridaDAO.esHijoRebote(esquemaCorrida)) { + + Corrida corrida = generarCorrida(esquemaCorrida, dataGeracao, false); + Corrida corridaPisoExtra = null; + + if (corrida == null) {// Si no gener� la corrida, no va a + // generar el rebote + log.info("No fue generado corrida. Esquema " + esquemaCorrida.getEsquemacorridaId() + " Data" + dataGeracao); + continue; + } + + // PISO EXTRA + if (esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) { + // Invertendo RolOperativo e Classe de Servi�o para o Piso + // Extra + RolOperativo ro = esquemaCorrida.getRolOperativo(); + ClaseServicio cs = esquemaCorrida.getClaseServicio(); + + esquemaCorrida.setRolOperativo(esquemaCorrida.getRolOperativo2()); + esquemaCorrida.setClaseServicio(esquemaCorrida.getClaseServicio2()); + + corridaPisoExtra = generarCorrida(esquemaCorrida, dataGeracao, true); + if (corrida != null && corridaPisoExtra != null) { + // Voltando RolOperativo e Classe de Servi�o + esquemaCorrida.setRolOperativo(ro); + esquemaCorrida.setClaseServicio(cs); + + // Salvando Referencia da Corrida no piso extra + corridaPisoExtra.setCorridaPiso(corrida); + corridaPisoExtra.setNumPiso(2); + corridaPisoExtra = corridaDAO.actualizacion(corridaPisoExtra); + + // Referencia do Piso extra na Corrida + corrida.setCorridaPiso(corridaPisoExtra); + corrida.setNumPiso(1); + corrida = corridaDAO.actualizacion(corrida); + } + } + + if (esquemaCorrida.getEsquemaCorridaRebote() != null) { + + log.info("Corrida Rebote=" + esquemaCorrida.getEsquemacorridaId()); + + Corrida corridaRebote = generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), dataGeracao, false); + Corrida corridaPisoExtraRebote = null; + + boolean generaReboteDiaSeguinte = false; + + if (corridaRebote != null) { + EsquemaCorrida ecRebote = esquemaCorrida.getEsquemaCorridaRebote(); + if (ecRebote.getPisoExtra() != null && ecRebote.getPisoExtra()) { + // Invertendo RolOperativo e Classe de Servi�o para + // o Piso Extra + RolOperativo ro = ecRebote.getRolOperativo(); + ClaseServicio cs = ecRebote.getClaseServicio(); + + ecRebote.setRolOperativo(ecRebote.getRolOperativo2()); + ecRebote.setClaseServicio(ecRebote.getClaseServicio2()); + + corridaPisoExtraRebote = generarCorrida(ecRebote, dataGeracao, true); + if (corridaRebote != null && corridaPisoExtraRebote != null) { + // Salvando Referencia da Corrida no piso extra + corridaPisoExtraRebote.setCorridaPiso(corridaRebote); + corridaPisoExtraRebote.setNumPiso(2); + corridaPisoExtraRebote = corridaDAO.actualizacion(corridaPisoExtraRebote); + + // Voltando RolOperativo e Classe de Serviço + ecRebote.setRolOperativo(ro); + ecRebote.setClaseServicio(cs); + + // Referencia do Piso extra na Corrida + corridaRebote.setCorridaPiso(corridaPisoExtraRebote); + corridaRebote.setNumPiso(1); + corridaRebote = corridaDAO.actualizacion(corridaRebote); + } + } + // RebotePisoExtra + if (DateUtil.compareDate(corrida.getFechorsalida(), corridaRebote.getFechorsalida()) > 0) { + generaReboteDiaSeguinte = true; // si fue generado + // con una + // fechamenor tienes + // que generar para + // el d�a seguinte + } + } else { + generaReboteDiaSeguinte = true;// si no fue encontrado + // para el d�a de + // hoy,genera para + // ma�ana + } + + if (generaReboteDiaSeguinte) { + log.info("Haciendo la b�squeda por el esquema rebote para el dia seguiente pues ya existe al dia de hoy"); + + corridaRebote = generarReboteDiaSeguinte(esquemaCorrida, dataGeracao); + + if (corridaPisoExtraRebote != null) { + corridaPisoExtraRebote = generarReboteDiaSeguinte(esquemaCorrida, dataGeracao); + } + + if (corridaRebote == null) { + log.info("No fue posible generar la corrida rebote. No fue encontrado esquema para la fecha del dia seguinte a " + dataGeracao); + } + } + if (corridaRebote != null) { + log.info("Rebote generado=" + corridaRebote.getId()); + corrida.setCorridaRebote(corridaRebote); + corridaDAO.actualizacion(corrida); + } + if (corridaPisoExtraRebote != null && corridaPisoExtra != null) { + log.info("Rebote Piso Extra Generado=" + corridaPisoExtraRebote.getId()); + corridaPisoExtra.setCorridaRebote(corridaPisoExtraRebote); + corridaDAO.actualizacion(corridaPisoExtra); + } + } + } + if (cantCorridaGenerada >= cantCorridaCommit) { + cantCorridaGenerada = 0; + transactionManager.commit(status); + status = transactionManager.getTransaction(def); + } + } // for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) + + if (!status.isCompleted()) { + transactionManager.commit(status); + } + + } + + /** + * Verifica se hay una excepcione de tiempo para el tramo informado. + * + * @param corridaTramo + * @param claseServicio + * @return - Si existe una excepcion, regresa la nueva fecLlegada para el + * tramo, sino, regreso null + */ + private Date arreglaExcepcionTiempo(CorridaTramo corridaTramo, ClaseServicio claseServicio) { + Date nuevaFecLlegada = null; + + Tramo tramo = corridaTramo.getTramo(); + + List lsExcepciones = tramoTiempoDAO.buscar(tramo, claseServicio, corridaTramo.getFechorsalida(), corridaTramo.getFechorllegada()); + + if (!lsExcepciones.isEmpty()) { + + TramoTiempo tramoTiempo = lsExcepciones.get(0); + List diasSemana = getDiaDeLaSemana(tramoTiempo); + + Calendar fecCorrida = Calendar.getInstance(); + fecCorrida.setTime(corridaTramo.getFechorllegada()); + + if (diasSemana.contains(fecCorrida.get(Calendar.DAY_OF_WEEK)) || diasSemana.contains(fecCorrida.get(Calendar.DAY_OF_WEEK))) { + log.debug("Hay Excepcione de tiempo"); + Calendar fechorsalida = Calendar.getInstance(); + fechorsalida.setTime(corridaTramo.getFechorsalida()); + + Calendar tmpTiemporecorrido = Calendar.getInstance(); + tmpTiemporecorrido.setTime(tramoTiempo.getTiemporecorrido()); + + fechorsalida.add(Calendar.HOUR, tmpTiemporecorrido.get(Calendar.HOUR)); + fechorsalida.add(Calendar.MINUTE, tmpTiemporecorrido.get(Calendar.MINUTE)); + + nuevaFecLlegada = fechorsalida.getTime(); + } + } + return nuevaFecLlegada; + } + + private Corrida generarReboteDiaSeguinte(EsquemaCorrida esquemaCorrida, Date dataGeracao) { + Calendar tmp = Calendar.getInstance(); + tmp.setTime(dataGeracao); + tmp.add(Calendar.DAY_OF_MONTH, 1); + return generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), tmp.getTime(), false); + } + + private List getDiaDeLaSemana(TramoTiempo tramoTiempo) { + List diasValidos = new ArrayList(); + + if (tramoTiempo.getIndapliclun()) { + diasValidos.add(Calendar.MONDAY); + } + if (tramoTiempo.getIndaplicmar()) { + diasValidos.add(Calendar.TUESDAY); + } + if (tramoTiempo.getIndaplicmie()) { + diasValidos.add(Calendar.WEDNESDAY); + } + if (tramoTiempo.getIndaplicjue()) { + diasValidos.add(Calendar.THURSDAY); + } + if (tramoTiempo.getIndaplicvie()) { + diasValidos.add(Calendar.FRIDAY); + } + if (tramoTiempo.getIndaplicsab()) { + diasValidos.add(Calendar.SATURDAY); + } + if (tramoTiempo.getIndaplicdom()) { + diasValidos.add(Calendar.SUNDAY); + } + + return diasValidos; + } + + public List buscarPorFecCorrida(Date value) { + return corridaDAO.buscarPorFecCorrida(value); + } + + public List buscarPorId(Integer idCorrida) { + return corridaDAO.buscarPorId(idCorrida); + } + + @Override + public Date calcularDataFinalGeneracionCorrida() { + Date dataDe = new Date(); + + Constante constante = constanteService.buscarPorNomeConstante("CANT_DIAS_GENERACION_CORRIDA"); + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataDe); + calendarData.add(Calendar.DATE, Integer.parseInt(constante.getValorconstante())); + Date dataAte = calendarData.getTime(); + + return dataAte; + } + + @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) + public boolean generarCorridaAutomatica() { + + // Date dataDe = new GregorianCalendar(2012, 4, 25).getTime(); + Date dataDe = new java.util.Date(); + Date dataAte = calcularDataFinalGeneracionCorrida(); + // Date dataAte = new GregorianCalendar(2012, 4, 25).getTime(); + + return generarCorridaAutomatica(dataDe, dataAte); + } + + public boolean generarCorridaAutomatica(Date dataDe, Date dataAte) { + + boolean hayError = false; + SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); + + log.debug("** AUTO - Data De: " + sdfData.format(dataDe) + " **Data At�: " + sdfData.format(dataAte)); + + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataAte); + calendarData.add(Calendar.DATE, 1); + dataAte = calendarData.getTime(); + try { + while (dataDe.before(dataAte)) { + + log.debug("*** Data: " + sdfData.format(dataDe)); + + List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigencia(dataDe); + + Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); + if (dentroVigenciaEsquemaOperacional) { + this.generarCorrida(dataDe, lsEsquemaCorrida); + } else { + log.info("No hay esquema vigente para la fecha " + sdfData.format(dataDe)); + } + + calendarData.setTime(dataDe); + calendarData.add(Calendar.DATE, 1); + dataDe = calendarData.getTime(); + } + + } catch (Exception ex) { + log.error("Erro ao gerar corridas: " + ex, ex); + hayError = true; + + } + return hayError; + } + + @Override + public List buscarDistinct(Parada ori, Parada des, Date horaSalidaInicio, Date horaSalidaFin, ClaseServicio cs, Integer corridaId) { + return corridaDAO.buscarDistinct(ori, des, (horaSalidaInicio == null) ? null : DateUtil.getFecInicio(horaSalidaInicio).getTime(), (horaSalidaFin == null) ? null : DateUtil.getFecInicio(horaSalidaFin).getTime(), cs, corridaId); + } }