From de597ffae5332ce0f77243905cb4c1b18aa98a31 Mon Sep 17 00:00:00 2001 From: valdevir Date: Fri, 23 Feb 2024 18:32:45 -0300 Subject: [PATCH] fixes bug #AL-3879 --- pom.xml | 2 +- .../service/impl/CorridaServiceImpl.java | 3599 +++++++++-------- .../ventaboletos/utilerias/DateUtil.java | 1749 ++++---- 3 files changed, 2713 insertions(+), 2637 deletions(-) diff --git a/pom.xml b/pom.xml index 6f642e3ea..f3e930e77 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 br.com.rjconsultores ModelWeb - 1.40.1 + 1.40.2 diff --git a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java index 6cd200f5f..f8906dfd6 100644 --- a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java +++ b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java @@ -1,1768 +1,1831 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.rjconsultores.ventaboletos.service.impl; - -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.List; - -import javax.persistence.Transient; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.math.NumberUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; -import org.springframework.transaction.PlatformTransactionManager; -import org.springframework.transaction.TransactionStatus; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.DefaultTransactionDefinition; - -import com.rjconsultores.ventaboletos.dao.CorridaDAO; -import com.rjconsultores.ventaboletos.dao.EsquemaCorridaDAO; -import com.rjconsultores.ventaboletos.dao.TramoTiempoDAO; -import com.rjconsultores.ventaboletos.entidad.AsientoExclusivo; -import com.rjconsultores.ventaboletos.entidad.Ciudad; -import com.rjconsultores.ventaboletos.entidad.ClaseServicio; -import com.rjconsultores.ventaboletos.entidad.Cliente; -import com.rjconsultores.ventaboletos.entidad.Constante; -import com.rjconsultores.ventaboletos.entidad.Corrida; -import com.rjconsultores.ventaboletos.entidad.Corrida.Id; -import com.rjconsultores.ventaboletos.entidad.CorridaCtrl; -import com.rjconsultores.ventaboletos.entidad.CorridaInfo; -import com.rjconsultores.ventaboletos.entidad.CorridaTramo; -import com.rjconsultores.ventaboletos.entidad.DetDiagramaAutobus; -import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus; -import com.rjconsultores.ventaboletos.entidad.Empresa; -import com.rjconsultores.ventaboletos.entidad.EsquemaAsiento; -import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida; -import com.rjconsultores.ventaboletos.entidad.EsquemaCorridaInfo; -import com.rjconsultores.ventaboletos.entidad.EsquemaTramo; -import com.rjconsultores.ventaboletos.entidad.Estado; -import com.rjconsultores.ventaboletos.entidad.Marca; -import com.rjconsultores.ventaboletos.entidad.Moneda; -import com.rjconsultores.ventaboletos.entidad.Parada; -import com.rjconsultores.ventaboletos.entidad.ReservaEspecialCliente; -import com.rjconsultores.ventaboletos.entidad.Ruta; -import com.rjconsultores.ventaboletos.entidad.RutaCombinacion; -import com.rjconsultores.ventaboletos.entidad.RutaSecuencia; -import com.rjconsultores.ventaboletos.entidad.Tarifa; -import com.rjconsultores.ventaboletos.entidad.Tramo; -import com.rjconsultores.ventaboletos.entidad.TramoServicio; -import com.rjconsultores.ventaboletos.entidad.TramoTiempo; -import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa; -import com.rjconsultores.ventaboletos.enums.StatusFlexBus; -import com.rjconsultores.ventaboletos.exception.BusinessException; -import com.rjconsultores.ventaboletos.service.AsientoExclusivoService; -import com.rjconsultores.ventaboletos.service.BoletoService; -import com.rjconsultores.ventaboletos.service.ClienteService; -import com.rjconsultores.ventaboletos.service.ConstanteService; -import com.rjconsultores.ventaboletos.service.CorridaCtrlService; -import com.rjconsultores.ventaboletos.service.CorridaInfoService; -import com.rjconsultores.ventaboletos.service.CorridaService; -import com.rjconsultores.ventaboletos.service.CorridaTramoService; -import com.rjconsultores.ventaboletos.service.DetDiagramaAutobusService; -import com.rjconsultores.ventaboletos.service.EsquemaAsientoService; -import com.rjconsultores.ventaboletos.service.EsquemaCorridaInfoService; -import com.rjconsultores.ventaboletos.service.EsquemaCorridaService; -import com.rjconsultores.ventaboletos.service.EsquemaTramoService; -import com.rjconsultores.ventaboletos.service.ReservaEspecialClienteService; -import com.rjconsultores.ventaboletos.service.RutaSecuenciaService; -import com.rjconsultores.ventaboletos.service.RutaService; -import com.rjconsultores.ventaboletos.service.TarifaService; -import com.rjconsultores.ventaboletos.service.TramoService; -import com.rjconsultores.ventaboletos.service.TramoServicioService; -import com.rjconsultores.ventaboletos.service.VigenciaTarifaService; -import com.rjconsultores.ventaboletos.utilerias.ActivoUtil; -import com.rjconsultores.ventaboletos.utilerias.DateUtil; -import com.rjconsultores.ventaboletos.utilerias.FeriadoCache; -import com.rjconsultores.ventaboletos.utilerias.HoraSistema; -import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; -import com.rjconsultores.ventaboletos.utilerias.UtiliteriasFiscal; - -/** - * - * @author rodrigo - */ -@Service("corridaService") -public class CorridaServiceImpl implements CorridaService { - - private static final Logger log = LogManager.getLogger(CorridaServiceImpl.class); - private static int CANT_MAX_CORRIDA_GERA_MANUAL = 40; - - // Tipo de venda Reserva - private static final Integer TPV_RESERVA_NORMAL = 15; - - @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 DetDiagramaAutobusService detDiagramaAutobusService; - @Autowired - private ConstanteService constanteService; - @Autowired - private RutaSecuenciaService rutaSecuenciaService; - private PlatformTransactionManager transactionManager; - @Transient - private int cantCorridaGenerada; - @Transient - private int cantCorridaCommit; - @Autowired - private FeriadoCache feriadoCache; - @Autowired - private BoletoService boletoService; - @Autowired - private ReservaEspecialClienteService reservaEspecialClientService; - @Autowired - private TarifaService tarifaService; - @Autowired - TramoService tramoService; - @Autowired - VigenciaTarifaService vigenciaTarifaService; - @Autowired - ClienteService clienteService; - @Autowired - private CorridaInfoService corridaInfoService; - @Autowired - private EsquemaCorridaInfoService esquemaCorridaInfoService; - @Autowired - private CorridaTramoService corridaTramosService; - - @Autowired - public CorridaServiceImpl(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) { - this.transactionManager = transactionManager; - } - - @Override - public List obtenerTodos() { - return corridaDAO.obtenerTodos(); - } - - @Override - public Corrida obtenerID(Corrida.Id id) { - return corridaDAO.obtenerID(id); - } - - @Override - public List buscarPorFecCorrida(Date value) { - return corridaDAO.buscarPorFecCorrida(value); - } - - @Override - public List buscarPorId(Integer idCorrida) { - return corridaDAO.buscarPorId(idCorrida); - } - - @Override - public List verificarCorridaId(Integer corridaId) { - return corridaDAO.verificarCorridaId(corridaId); - } - - @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); - } - - @Transactional - public Corrida suscribir(Corrida entidad) { - entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(ActivoUtil.ATIVO); - - return corridaDAO.suscribir(entidad); - } - - @Transactional - public Corrida actualizacion(Corrida entidad) { - entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - entidad.setFecmodif(Calendar.getInstance().getTime()); - entidad.setActivo(ActivoUtil.ATIVO); - - return corridaDAO.actualizacion(entidad); - } - - - @Transactional - public void borrar(Corrida entidad) { - corridaDAO.borrar(entidad); - } - - @Override - public List buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus) { - return corridaDAO.buscarPorAutobusCorridasFuturas(diagramaAutobus); - } - - @Override - public List buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus) { - return corridaDAO.buscarPorRolOperativoCorridasFuturas(diagramaAutobus); - } - - @Override - public List buscarFiltro(Parada ori, Parada des, Date hora, ClaseServicio cs) { - return corridaDAO.buscarFiltro(ori, des, hora, cs); - } - - public Boolean existeCorrida(Long id){ - return corridaDAO.existeCorrida(id); - } - - private Boolean geraDiaSemana(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 boolean temCorridaDiaSemana(Integer diaSemana, EsquemaCorrida esquemaCorrida, Boolean isFeriado) { - Boolean retorno = Boolean.FALSE; - - if (esquemaCorrida.getIndGeneraFeriado() != null) { - if (esquemaCorrida.getIndGeneraFeriado().equals("S")) { - retorno = geraDiaSemana(diaSemana, esquemaCorrida); - } else if (isFeriado) { - if (esquemaCorrida.getIndGeneraFeriado().equals("F")) { - retorno = geraDiaSemana(diaSemana, esquemaCorrida); - } - } else if (esquemaCorrida.getIndGeneraFeriado().equals("N")) { - retorno = geraDiaSemana(diaSemana, esquemaCorrida); - } - } else { - retorno = geraDiaSemana(diaSemana, esquemaCorrida); - } - - return retorno; - } - - private Date calcularFechorllegada(EsquemaTramo esquemaTramo, ClaseServicio clase, Date dataGeracao, Date horaChegada) { - GregorianCalendar gHoraChegada = new GregorianCalendar(); - gHoraChegada.setTime(horaChegada); - HoraSistema hs = null; - - if (esquemaTramo.getExcepcionRecorrido() != null) { - hs = new HoraSistema(esquemaTramo.getExcepcionRecorrido()); - - gHoraChegada.add(Calendar.HOUR_OF_DAY, hs.getHora()); - gHoraChegada.add(Calendar.MINUTE, hs.getMinuto()); - } else { - Tramo tramo = esquemaTramo.getTramo(); - List lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase); - - for (TramoServicio ts : lsTramoServicio) { - hs = new HoraSistema(ts.getTiemporecorrido()); - - gHoraChegada.add(Calendar.HOUR_OF_DAY, hs.getHora()); - gHoraChegada.add(Calendar.MINUTE, hs.getMinuto()); - } - } - - return gHoraChegada.getTime(); - } - - @SuppressWarnings("deprecation") - 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()); - - log.debug("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. - * - * Alem disso eh 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; - } - - private boolean isFeriado(java.sql.Date data, EsquemaCorrida esquemaCorrida) { - Empresa empresa = esquemaCorrida.getEmpresa(); - - Estado estadoOrigem = null; - List lsRutaSequencia = rutaSecuenciaService.buscarSecuenciaOrdenado(esquemaCorrida.getRuta()); - if (!lsRutaSequencia.isEmpty()) { - Tramo tramoOrigem = lsRutaSequencia.get(0).getTramo(); - Parada origem = tramoOrigem.getOrigem(); - estadoOrigem = origem.getCiudad().getEstado(); - } - - return feriadoCache.ehFeriado(data, empresa, estadoOrigem); - } - - /** - * Indica si el esquemaCorrida informado tiene una vigencia válida para la data de generacion - * - * @param esquemaCorrida - * @param dataGeracao - * @return - */ - private boolean vigenciaValida(EsquemaCorrida esquemaCorrida, Date dataGeracao) { - if ((DateUtil.compareOnlyDate(dataGeracao, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) <= 0) && - (DateUtil.compareOnlyDate(dataGeracao, esquemaCorrida.getEsquemaOperacional().getFecniciovigencia()) >= 0)) { - - return true; - } - return false; - } - - /** - * Genera una corrida para el esquemaCorrida informado en la fecha informada.
- * - * Cuando la corrida no es generada :
- * - corrida ya existe : eso es checado por el numCorrida e dataGeneracion
- * - la fecha de generacion no tiene una vigencia válida
- * - el status del esquema corrida no es autorizado ("A")
- * - * - * @param esquemaCorrida - * @param diaSemana - * @param dataGeracao - * @return - La corrida generada o null si no fue generada. - */ - @SuppressWarnings("deprecation") - private Corrida generarCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, boolean isPisoExtra, Boolean isFeriado, List corridaTramoList) { - - - Corrida corrida = null; - try { - - GregorianCalendar calendario = new GregorianCalendar(); - calendario.setTime(dataGeracao); - Integer diaSemana = calendario.get(Calendar.DAY_OF_WEEK); - Ruta ruta = esquemaCorrida.getRuta(); - ClaseServicio claseServicio = esquemaCorrida.getClaseServicio(); - Marca marca = esquemaCorrida.getMarca(); - Date horario = esquemaCorrida.getHorasalida(); - horario = DateUtil.normalizar(horario); - Integer numCorrida = esquemaCorrida.getNumCorrida(); - Corrida.Id id = new Corrida.Id(); - id.setCorridaId(numCorrida); - id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); - List lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida); - - if(!realizaValidacoesGerais(esquemaCorrida, dataGeracao, diaSemana, isFeriado, ruta, id, numCorrida, horario, claseServicio, marca, isPisoExtra, lsEsquemaTramo)) { - return null; - } - - Parada origemCorrida = lsEsquemaTramo.get(0).getTramo().getOrigem(); - - Parada destinoCorrida = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1).getTramo().getDestino(); - - /* Como o numCorrida corresponde ao corrida_id do corridaCtrl, ou seja, é chave primaria, temos que buscar somente por esse campo - Caso o registro já exista, atualizamos os dados dele. Sendo assim, o que vai indicar a "duplicidade" de uma corrida será apenas o número dela e não mais o conjunto : clase + marca + horario + ruta*/ - - CorridaCtrl corridaCtrl = criaCorridaCtrl(isPisoExtra, ruta, claseServicio, marca, horario, numCorrida); - - corrida = criaCorrida(esquemaCorrida, dataGeracao, id, lsEsquemaTramo, origemCorrida, destinoCorrida, - corridaCtrl, corridaTramoList); - - cantCorridaGenerada++; - - criaAssentoExclusivo(esquemaCorrida, corrida); - - } catch (Exception ex) { - log.error("", ex); - } - - return corrida; - } - - private Corrida criaCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, Corrida.Id id, - List lsEsquemaTramo, Parada origemCorrida, Parada destinoCorrida, CorridaCtrl corridaCtrl, List corridaTramoList) { - Corrida corrida; - corrida = new Corrida(); - corrida.setId(id); - corrida.setEsquemaCorrida(esquemaCorrida); - corrida.setCorridaCtrl(corridaCtrl); - corrida.setAutobus(esquemaCorrida.getAutoBus()!= null ? esquemaCorrida.getAutoBus() : null); - corrida.setClaseServicio(corridaCtrl.getClaseServicio()); - corrida.setConductor(null); - if (esquemaCorrida.getIndCorridaExtra()) { - corrida.setTipoServicio(new Short("2")); - } else { - corrida.setTipoServicio(new Short("1")); - } - corrida.setInfoCorrida(esquemaCorrida.getInfoCorrida()); - Integer cantparados = esquemaCorrida.getCantparados(); - if (cantparados != null) { - corrida.setCantParados(cantparados.shortValue()); - } - - corrida.setEsquemaAgrupacionId(esquemaCorrida.getEsquemaAgrupacionId()); - - corrida.setEmpresa(esquemaCorrida.getEmpresa()); - corrida.setEmpresa1(esquemaCorrida.getEmpresa1()); - - corrida.setFechorsalida(truncarDataHora(dataGeracao, esquemaCorrida.getHorasalida())); - corrida.setFechorSalidaOriginal(corrida.getFechorsalida()); - - if (esquemaCorrida.getStatusCorrida().equals("A")) { - corrida.setIndstatuscorrida("H"); - corrida.setActivo(ActivoUtil.ATIVO); - } else if (esquemaCorrida.getStatusCorrida().equals("L")) { - corrida.setIndstatuscorrida("P"); - corrida.setActivo(ActivoUtil.INATIVO); - } - - corrida.setMarca(esquemaCorrida.getMarca()); - corrida.setNodo(corridaCtrl.getNodo()); - corrida.setDivision(esquemaCorrida.getDivision()); - corrida.setRuta(esquemaCorrida.getRuta()); - corrida.setRolOperativo(esquemaCorrida.getRolOperativo()); - corrida.setZona(null); - corrida.setOrigem(origemCorrida); - corrida.setDestino(destinoCorrida); - - validaFlexBus(esquemaCorrida, corrida); - List lsCorridaTramo = null; - Date fechorSalidaOriginalH = null; - if(corridaTramoList!=null && !corridaTramoList.isEmpty()) { - lsCorridaTramo = corridaTramoList; - }else { - lsCorridaTramo = corridaTramosService.criaCorridaTramoList(esquemaCorrida.getAutoBus(), dataGeracao, fechorSalidaOriginalH, lsEsquemaTramo, corridaCtrl.getNodo(), corrida.getClaseServicio(), esquemaCorrida.getStatusCorrida()); - for (CorridaTramo corridaTramo : lsCorridaTramo) { - corridaTramo.setCorrida(corrida); - } - } - - corrida.setCorridaTramoList(lsCorridaTramo); - - corrida.setFecmodif(Calendar.getInstance().getTime()); - - if (UsuarioLogado.getUsuarioLogado() != null) { - corrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } else { - corrida.setUsuarioId(1); - } - corrida.setIndTipoVenta(null); - corrida.setCodProdutoFiscal(UtiliteriasFiscal.defineCodigoProduto(corrida.getOrigem().getParadaId(), corrida.getDestino().getParadaId(), corrida.getRuta().getRutaId())); - corrida = corridaDAO.suscribir(corrida); - return corrida; - } - - private CorridaCtrl criaCorridaCtrl(boolean isPisoExtra, Ruta ruta, ClaseServicio claseServicio, Marca marca, - Date horario, Integer numCorrida) { - CorridaCtrl corridaCtrl = corridaCtrlService.obtenerID(numCorrida); - - boolean novoRegistro = false; - - if (corridaCtrl == null) { - corridaCtrl = new CorridaCtrl(); - novoRegistro = true; - } - - corridaCtrl.setCorridaId(numCorrida); - corridaCtrl.setMarca(marca); - corridaCtrl.setRuta(ruta); - corridaCtrl.setClaseServicio(claseServicio); - corridaCtrl.setHorario(horario); - - // parada origem - Parada origen = rutaService.getOrigem(ruta); - if (origen == null) { - log.info("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); - - if (novoRegistro) { - corridaCtrl = corridaCtrlService.suscribir(corridaCtrl); - } else { - corridaCtrl = corridaCtrlService.actualizacion(corridaCtrl); - } - return corridaCtrl; - } - - - - private void validaFlexBus(EsquemaCorrida esquemaCorrida, Corrida corrida) { - if(esquemaCorrida.getIsFlexBus()) { - corrida.setOcupacaoMinima(esquemaCorrida.getOcupacaoMinima()); - corrida.setHorasParaConfirmacao(esquemaCorrida.getHorasParaConfirmacao()); - corrida.setMinutosParaConfirmacao(esquemaCorrida.getMinutosParaConfirmacao()); - corrida.setIsFlexBus(Boolean.TRUE); - - corrida.setStatusFlexBus(StatusFlexBus.EM_RESERVA.getStatus()); - } - } - - private Boolean realizaValidacoesGerais(EsquemaCorrida esquemaCorrida, Date dataGeracao, Integer diaSemana, Boolean isFeriado, - Ruta ruta, Corrida.Id id, Integer numCorrida, Date horario, ClaseServicio claseServicio, Marca marca, Boolean isPisoExtra, List lsEsquemaTramo){ - Integer corridaId = esquemaCorrida.getNumCorrida(); - String fecCorrida = DateUtil.getStringDate(horario); - if (!vigenciaValida(esquemaCorrida, dataGeracao)) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + " vigencia invalida=" + dataGeracao); - return Boolean.FALSE; - } - - if (!((esquemaCorrida.getStatusCorrida() != null) && (esquemaCorrida.getStatusCorrida().equals("A") || esquemaCorrida.getStatusCorrida().equals("L")))) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + "status corrida invalido=" + esquemaCorrida.getStatusCorrida()); - return Boolean.FALSE; - } - - if (esquemaCorrida.getIndDiaSimDiaNao() == null || esquemaCorrida.getIndDiaSimDiaNao() == Boolean.FALSE) { - if (!temCorridaDiaSemana(diaSemana, esquemaCorrida, isFeriado)) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + "dia semana no valido=" + diaSemana); - return Boolean.FALSE; - } - } - - if (!tramoServicioService.existenTiemposTramosEsquema(esquemaCorrida.getEsquemacorridaId())) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida +". Nao foi cadastrado o tempo de todos os trechos do esquema corrida=" + esquemaCorrida.getEsquemacorridaId()); - return Boolean.FALSE; - } - - if(!validaCorridaDiaSimDiaNao(esquemaCorrida, dataGeracao, numCorrida)) { - return Boolean.FALSE; - } - - if (corridaDAO.existe(id)) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". corrida existe = " + numCorrida + ";" + ruta.getDescruta() + ";" + DateUtil.getStringDate(dataGeracao) + ";" + DateUtil.getStringDate(horario, "HH:mm") + ";" + claseServicio.getDescclase() + ";" + marca.getDescmarca() + " Piso: " + isPisoExtra); - return Boolean.FALSE; - } - - if (lsEsquemaTramo == null || lsEsquemaTramo.isEmpty()) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Não contem trechos (EsquemaTramo nulo ou vazio)"); - return Boolean.FALSE; - } - - EsquemaTramo primeiroTrechoCorrida = lsEsquemaTramo.get(0); - Parada origemCorrida = primeiroTrechoCorrida.getTramo().getOrigem(); - if (origemCorrida == null) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Origem não preenchido (Primeiro trecho EsquemaTramo)"); - return Boolean.FALSE; - } - - EsquemaTramo ultimoTrechoCorrida = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1); - Parada destinoCorrida = ultimoTrechoCorrida.getTramo().getDestino(); - if (destinoCorrida == null) { - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Destino não preenchido (Último trecho EsquemaTramo)"); - return Boolean.FALSE; - } - - if(marca !=null && Boolean.FALSE.equals(marca.getActivo())){ - log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". MarcaId=" + marca.getMarcaId() +" inativa, corrida não pode ser gerada"); - return Boolean.FALSE; - } - - return Boolean.TRUE; - } - - private Boolean validaCorridaDiaSimDiaNao(EsquemaCorrida esquemaCorrida, Date dataGeracao, Integer numCorrida ){ - if (Boolean.TRUE.equals(esquemaCorrida.getIndDiaSimDiaNao())) { - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataGeracao); - calendarData.add(Calendar.DATE, -1); - - Corrida.Id corridaOntem = new Corrida.Id(); - - corridaOntem.setCorridaId(numCorrida); - corridaOntem.setFeccorrida(DateUtil.normalizarToFecha(calendarData.getTime())); - - if (corridaDAO.existe(corridaOntem)) { - log.info("Esquema configurado para gerar dia sim dia não e já possui corrida gerado no dia anterior, por isso não está data: " + DateUtil.getStringDate(dataGeracao)); - return Boolean.FALSE; - } - } - return Boolean.TRUE; - } - - private Calendar getCalendarFechorllegada(Date fecHorallegada) { - Calendar llegada = Calendar.getInstance(); - llegada.setTime(fecHorallegada); - llegada.set(llegada.get(Calendar.YEAR), llegada.get(Calendar.MONTH), llegada.get(Calendar.DATE), - llegada.get(Calendar.HOUR_OF_DAY), llegada.get(Calendar.MINUTE), NumberUtils.INTEGER_ZERO); - return llegada; - } - - private Calendar getCalendarFechorSalida(Date fecHorSalida) { - Calendar salida = Calendar.getInstance(); - salida.setTime(fecHorSalida); - salida.set(salida.get(Calendar.YEAR), salida.get(Calendar.MONTH), salida.get(Calendar.DATE), - salida.get(Calendar.HOUR_OF_DAY), salida.get(Calendar.MINUTE), NumberUtils.INTEGER_ZERO); - return salida; - } - - private void criaAssentoExclusivo(EsquemaCorrida esquemaCorrida, Corrida corrida) { - List lsEsquemaAsiento = esquemaAsientoService.obtenerPorCorrida(esquemaCorrida); - for (EsquemaAsiento ea : lsEsquemaAsiento) { - DetDiagramaAutobus detDiagramaAutobus = detDiagramaAutobusService.obtenerPorDiagramaAutobusAsiento(esquemaCorrida.getDiagramaAutobusId(), ea.getNumasiento()); - if (detDiagramaAutobus != null && detDiagramaAutobus.getVendible()) { - 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.setTiempoLiberacion(ea.getTiempoLiberacion()); - if (ea.getIndvendible()) { - asientoExclusivo.setMotivobloqueo(null); - } else { - asientoExclusivo.setMotivobloqueo(ea.getMotivobloqueo()); - asientoExclusivo.setDestino(ea.getDestino()); - } - - asientoExclusivo.setActivo(Boolean.TRUE); - asientoExclusivo.setFecmodif(Calendar.getInstance().getTime()); - if (UsuarioLogado.getUsuarioLogado() != null) { - asientoExclusivo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); - } - - asientoExclusivo = asientoExclusivoService.suscribir(asientoExclusivo); - } - } - } - - private Date calcularHusoHorVeranoLlegada(EsquemaTramo esquemaTramo, CorridaTramo corridaTramo) { - - Ciudad ciudadOrigen = esquemaTramo.getTramo().getOrigem().getCiudad(); - Estado estadoOrigen = ciudadOrigen.getEstado(); - - int tiempoOrigen = estadoOrigen.getTiempoHorHuso() == null ? 0 : estadoOrigen.getTiempoHorHuso(); - - Date fecInicioHorVerano = estadoOrigen.getFecInicioHorVerano(); - Date fecFinHorVerano = estadoOrigen.getFecFinoHorVerano(); - - - - if ((fecInicioHorVerano != null) && (fecFinHorVerano != null)) { - if ((DateUtil.compareOnlyDate(fecInicioHorVerano, corridaTramo.getFechorsalida()) <= 0) && (DateUtil.compareOnlyDate(fecFinHorVerano, corridaTramo.getFechorsalida()) >= 0)) { - tiempoOrigen += estadoOrigen.getTiempoHorVerano(); - } - } - // 21688 - Ciudad ciudadDestino = esquemaTramo.getTramo().getDestino().getCiudad(); - Estado estadoDestino = ciudadDestino.getEstado(); - int tiempoDestino = 0; - - if (!estadoDestino.equals(estadoOrigen)) { - tiempoDestino = estadoDestino.getTiempoHorHuso() == null ? 0 : estadoDestino.getTiempoHorHuso(); - - - - Date fecInicioHorVeranoDestino = estadoDestino.getFecInicioHorVerano(); - Date fecFinHorVeranDestino = estadoDestino.getFecFinoHorVerano(); - - if ((fecInicioHorVeranoDestino != null) && (fecFinHorVeranDestino != null)) { - if ((DateUtil.compareOnlyDate(fecInicioHorVeranoDestino, corridaTramo.getFechorllegada()) <= 0) && (DateUtil.compareOnlyDate(fecFinHorVeranDestino, corridaTramo.getFechorllegada()) >= 0)) { - tiempoDestino += estadoDestino.getTiempoHorVerano(); - } - } - } else { - tiempoDestino =0; - tiempoOrigen=0; - } - - //Consideração do fuso por cidade. - //Nesse caso, é mandatório em relação ao estado.Ou seja, equanto que no fuso do estado, - //tem que haver Mudança de estado, para a cidade NÃO, pois pode-se considerar cada cidade - //como um único estado. Sendo assim, devendo ser considerado sempre quando preenchido - if ( (ciudadOrigen.getZonaHoraria() != null) && (ciudadOrigen.getZonaHoraria() != 0 )){ - log.info("Fuso da cidade origem " + ciudadOrigen.getNombciudad() + " : " + ciudadOrigen.getZonaHoraria()); - - tiempoOrigen += ciudadOrigen.getZonaHoraria(); - } - - if ( (ciudadDestino.getZonaHoraria() != null) && (ciudadDestino.getZonaHoraria() != 0 )){ - log.info("Fuso da cidade destino " + ciudadDestino.getNombciudad() + " : " + ciudadDestino.getZonaHoraria()); - - tiempoDestino += ciudadDestino.getZonaHoraria(); - } - //Fim consideração fuso por cidade - - Calendar horLlegada = null; - - long elapsedMinutes = DateUtil.getElapsedMinutos(corridaTramo.getFechorsalida(), corridaTramo.getFechorllegada()); - - horLlegada = Calendar.getInstance(); - horLlegada.setTime(corridaTramo.getFechorsalidaH()); - - horLlegada.add(Calendar.MINUTE, (int) elapsedMinutes); - - // Si los tiempos son distintos, hube cambio de huso horario/horario de verano - if (tiempoOrigen != tiempoDestino) { - horLlegada.add(Calendar.HOUR, difHuso(tiempoOrigen, tiempoDestino)); - - } - - return (horLlegada == null) ? null : horLlegada.getTime(); - } - - private int difHuso(int a, int b) { - return b - a; - } - - public Boolean generarCorrida(Date dataGeracao, List lsEsquemaCorrida, boolean isGeracaoAutomaticaCorrida, List corridaTramoList) { - - DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); - - // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc - TransactionStatus status = transactionManager.getTransaction(def); - cantCorridaGenerada = 0; - cantCorridaCommit = 1; - java.sql.Date data = new java.sql.Date(dataGeracao.getTime()); - - Integer unUsuarioId = constanteService.buscarValorConstantePorNomeConstante("USUARIO_RESERVA_CLIENTES"); - Integer unPuntoVenta= constanteService.buscarValorConstantePorNomeConstante("PUNTOVENTA_RESERVA_CLIENTES"); - Integer estacionId = constanteService.buscarValorConstantePorNomeConstante("ESTACION_RESERVA_CLIENTES"); - - boolean corridaGerada = true; - - Corrida corrida = null; - Corrida corridaPisoExtra = null; - Corrida corridaPisoExtra2 = null; - try { - - for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { - log.info("esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - - //Usado para validar se deve buscar o primeiro piso e vincular com o segungo/terceiro caso ele ja esteja criado - boolean isSegundoOuTerceiroPiso = false; - - if (isGeracaoAutomaticaCorrida) { - boolean esHijoRebote = esquemaCorridaDAO.esHijoRebote(esquemaCorrida); - boolean esSegundoPiso = esquemaCorridaDAO.esSegundoPiso(esquemaCorrida); - - //Nessas duas condições, o "filho" só é gerado a partir do esquema corrida "pai" - if (esHijoRebote || esSegundoPiso) { - log.info(String.format("Esquema nao gerado. esHijoRebote:%s ; esSegundoPiso: %s",esHijoRebote,esSegundoPiso)); - corridaGerada = false; - continue; - } - } else { - // Caso nao seja automatico e o segundo piso seja enviado, busca o primeiro piso e geram os dois (ou tres pisos), - // caso o primeiro piso ja exista, o segundo e gerado e os dois sao vinculados - boolean esHijoRebote = esquemaCorridaDAO.esHijoRebote(esquemaCorrida); - - //Nessas tres condições, o "filho" só é gerado a partir do esquema corrida "pai" - if (esHijoRebote) { - log.info("E segundo HijoRebote, procurando a corrida Pai. "); - - esquemaCorrida = esquemaCorridaDAO.buscarEsquemaPeloHijoRebote(esquemaCorrida); - - if(esquemaCorrida == null) { - log.info(String.format("Esquema nao gerado. esHijoRebote:%s ; ",esHijoRebote)); - corridaGerada = false; - continue; - } - log.info("Corrida Pai esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - } - - boolean esSegundoPiso = esquemaCorridaDAO.esSegundoPiso(esquemaCorrida); - - if(esSegundoPiso) { - isSegundoOuTerceiroPiso = true; - log.info("E segundo Piso, procurando o primeiro piso para gerar. "); - esquemaCorrida = esquemaCorridaDAO.buscarPrimeiroPisoPeloSegundo(esquemaCorrida); - - if(esquemaCorrida == null) { - log.info("Primeiro piso nao encontrado, nao ira gerar o servico: " ); - corridaGerada = false; - continue; - } - - log.info("Primeiro Piso esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - } - - boolean esTerceiroPiso = esquemaCorridaDAO.esTerceiroPiso(esquemaCorrida); - - if(esTerceiroPiso) { - isSegundoOuTerceiroPiso = true; - log.info("E terceiro Piso, procurando o primeiro piso para gerar. "); - esquemaCorrida = esquemaCorridaDAO.buscarPrimeiroPisoPeloTerceiro(esquemaCorrida); - - if(esquemaCorrida == null) { - log.info("Primeiro piso nao encontrado, nao ira gerar o servico: " ); - corridaGerada = false; - continue; - } - log.info("Primeiro Piso esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - } - } - - if(esquemaCorrida.getIndCorridaDesativada()) { - log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - corridaGerada = false; - continue; - } - - Boolean isFeriado = this.isFeriado(data, esquemaCorrida); - corrida = generarCorrida(esquemaCorrida, dataGeracao, false, isFeriado, corridaTramoList); - - - corridaPisoExtra = null; - corridaPisoExtra2 = null; - - if (corrida == null && !isSegundoOuTerceiroPiso) { - corridaGerada = false; - continue; - - } else if(corrida == null && isSegundoOuTerceiroPiso) { - log.info(" Primeiro piso ja existe, buscando corrida para vincular ao piso extra"); - corrida = corridaDAO.buscarPorId(criarIdCorrida(dataGeracao, esquemaCorrida)); - - if (corrida == null) { - log.info("Nao foi encontrada corrida original, nao sera gerado o segundo/terceiro piso"); - corridaGerada = false; - continue; - } - } - - // PISO EXTRA - if (esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) { - - EsquemaCorrida esquemaCorridaSegundoPiso = esquemaCorridaDAO.buscarPeloNumCorrida(esquemaCorrida.getNumCorridaPisoExtra()); - - String mensagemLog = String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida segundo piso: %s/%s ",esquemaCorrida.getEsquemacorridaId(),esquemaCorrida.getNumCorrida(), esquemaCorridaSegundoPiso.getEsquemacorridaId(),esquemaCorridaSegundoPiso.getNumCorrida() ); - log.info(mensagemLog); - - if(esquemaCorridaSegundoPiso.getIndCorridaDesativada()) { - log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - corridaGerada = false; - continue; - } - - corridaPisoExtra = generarCorrida(esquemaCorridaSegundoPiso, dataGeracao, true, isFeriado, null); - Boolean atualizarPisoExtra = false; - - // caso corrida segundo piso for gerada antes, atualizar - atualizarPisoExtra = atualizarCorridaPisoExtra(corridaPisoExtra, esquemaCorridaSegundoPiso, data, mensagemLog, atualizarPisoExtra); - - alterarNumPisoCorridaPisoExtra(corrida, corridaPisoExtra, mensagemLog, atualizarPisoExtra, false); - - //Valida se existe configuração de reserva para o cliente e crria Cria reserva para 2º piso - if(corridaPisoExtra !=null) { - if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { - validaCriaReservaCliente(corridaPisoExtra, unUsuarioId, unPuntoVenta, estacionId); - } - } - - if(esquemaCorrida.getNumCorridaPisoExtra2() != null) { - - EsquemaCorrida esquemaCorridaTerceiroPiso = esquemaCorridaDAO.buscarPeloNumCorrida(esquemaCorrida.getNumCorridaPisoExtra2()); - - if(esquemaCorridaTerceiroPiso != null) { - - mensagemLog = String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida terceiro piso: %s/%s ",esquemaCorrida.getEsquemacorridaId(),esquemaCorrida.getNumCorrida(), esquemaCorridaTerceiroPiso.getEsquemacorridaId(),esquemaCorridaTerceiroPiso.getNumCorrida() ); - log.info(mensagemLog); - - if(esquemaCorridaTerceiroPiso.getIndCorridaDesativada()) { - log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); - corridaGerada = false; - continue; - } - - corridaPisoExtra2 = generarCorrida(esquemaCorridaTerceiroPiso, dataGeracao, true, isFeriado, null); - atualizarPisoExtra = false; - - // caso corrida segundo piso for gerada antes, atualizar - atualizarPisoExtra = atualizarCorridaPisoExtra(corridaPisoExtra2, esquemaCorridaTerceiroPiso, data, mensagemLog, atualizarPisoExtra); - - // caso corrida segundo piso for gerada antes, atualizar - alterarNumPisoCorridaPisoExtra(corrida, corridaPisoExtra2, mensagemLog, atualizarPisoExtra, true); - - //Valida se existe configuração de reserva para o cliente e crria Cria reserva para 2º piso - if(corridaPisoExtra !=null) { - if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { - validaCriaReservaCliente(corridaPisoExtra, unUsuarioId, unPuntoVenta, estacionId); - } - } - } - } - } - - if (esquemaCorrida.getEsquemaCorridaRebote() != null) { - criaCorridaRebote(dataGeracao, corrida, corridaPisoExtra, corridaPisoExtra2, esquemaCorrida, - isFeriado); - } - - if(corrida != null) { - generarCorridaInfo(corrida, esquemaCorrida); - } - - if (cantCorridaGenerada >= cantCorridaCommit) { - cantCorridaGenerada = 0; - transactionManager.commit(status); - status = transactionManager.getTransaction(def); - } - - } - }catch (Exception e) { - log.error("Erro ao gerar corrida", e ); - } - finally { - if ((status != null) && (!status.isCompleted())) { - transactionManager.commit(status); - } - } - //Valida se existe configuração de reserva para o cliente e cria Cria reserva - if(corrida !=null) { - if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { - validaCriaReservaCliente(corrida, unUsuarioId, unPuntoVenta, estacionId); - } - } - - return corridaGerada; - } - - private Id criarIdCorrida(Date dataGeracao, EsquemaCorrida esquemaCorrida) { - Corrida.Id id = new Corrida.Id(); - id.setCorridaId(esquemaCorrida.getNumCorrida()); - id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); - - return id; - } - - private void criaCorridaRebote(Date dataGeracao, Corrida corrida, Corrida corridaPisoExtra, - Corrida corridaPisoExtra2, EsquemaCorrida esquemaCorrida, Boolean isFeriado) { - log.info("Corrida Rebote=" + esquemaCorrida.getEsquemacorridaId()); - - Corrida corridaRebote = generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), dataGeracao, false, isFeriado, null); - Corrida corridaPisoExtraRebote = null; - boolean generaReboteDiaSeguinte = false; - - if (corridaRebote != null) { - EsquemaCorrida ecRebote = esquemaCorrida.getEsquemaCorridaRebote(); - if (ecRebote.getPisoExtra() != null && ecRebote.getPisoExtra()) { - - EsquemaCorrida esquemaCorridaSegundoPiso = esquemaCorridaDAO.buscarPeloNumCorrida(ecRebote.getNumCorridaPisoExtra()); - - log.info(String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida segundo piso: %s/%s ",ecRebote.getEsquemacorridaId(),ecRebote.getNumCorrida(), esquemaCorridaSegundoPiso.getEsquemacorridaId(),esquemaCorridaSegundoPiso.getNumCorrida() )); - - corridaPisoExtraRebote = generarCorrida(esquemaCorridaSegundoPiso, dataGeracao, true, isFeriado, null); - - if (corridaRebote != null && corridaPisoExtraRebote != null) { - // Salvando Referencia da Corrida no piso extra - corridaPisoExtraRebote.setCorridaPiso(corridaRebote); - corridaPisoExtraRebote.setNumPiso(2); - corridaPisoExtraRebote = corridaDAO.actualizacion(corridaPisoExtraRebote); - - // 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 dia seguinte - } - } else { - generaReboteDiaSeguinte = true;// si no fue encontrado para el dia de hoy,genera para manhana - } - - if (generaReboteDiaSeguinte) { - log.info("Haciendo la busqueda 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 (corridaPisoExtraRebote != null && corridaPisoExtra2 != null) { - log.info("Rebote Piso Extra Generado=" + corridaPisoExtraRebote.getId()); - corridaPisoExtra2.setCorridaRebote(corridaPisoExtraRebote); - corridaDAO.actualizacion(corridaPisoExtra2); - } - } - - private void validaCriaReservaCliente(Corrida corrida, Integer unUsuarioId, Integer unPuntoVenta, Integer estacionId) { - try { - List reservaEspecialClienteList = reservaEspecialClientService.bucarReservaEspecialByCorridaId(corrida.getId().getCorridaId().longValue()) ; - if(reservaEspecialClienteList !=null) { - for (ReservaEspecialCliente reservaEspecialCliente : reservaEspecialClienteList) { - Date dataAtual = new Date (); - //Valida se esta dentro da vigência - if(DateUtil.isMenor(reservaEspecialCliente.getFecinicio(), dataAtual) && DateUtil.isMaior(reservaEspecialCliente.getFecfinal(), dataAtual)){ - Integer unoTerminalOrigenId = reservaEspecialCliente.getOrigem().getParadaId(); - Integer unoTerminalDestinoId = reservaEspecialCliente.getDestino().getParadaId(); - String unoAsientoSelec = reservaEspecialCliente.getNumAsentoCorrida().toString(); - Integer unaCorridaId =corrida.getId().getCorridaId().intValue(); - Date unaFecCorrida= corrida.getId().getFeccorrida(); - Integer unoTipoVenta= TPV_RESERVA_NORMAL; - Integer unaCategoriaSelec= 1 ; - String unoNumeOperacion= null ; - Tramo tramo = null; - Date fecViaje = corrida.getFechorsalida(); - Ruta ruta = rutaService.obtenerID(corrida.getRuta().getRutaId()); - for(RutaCombinacion rutaCombinacion :ruta.getRutaCombinacionList()) { - if((rutaCombinacion.getTramo().getOrigem().getParadaId().intValue()==unoTerminalOrigenId.intValue()) - && (rutaCombinacion.getTramo().getDestino().getParadaId().intValue()==unoTerminalDestinoId.intValue()) ) { - tramo = rutaCombinacion.getTramo(); - break; - } - } - - for (CorridaTramo corridaTramo : corrida.getCorridaTramoList()) { - //(Se origem corridatramo = origem cadastrada && destino corridatramo = destino cadastrado) - // ou (se origem corridatramo = destino do cadastrado), tendo em vista que corridatramo são as sequencias e não as combinações - if(corridaTramo.getOrigem()!=null && corridaTramo.getOrigem().getParadaId().intValue()==unoTerminalOrigenId.intValue() - && corridaTramo.getDestino()!=null && corridaTramo.getDestino().getParadaId().intValue()==unoTerminalDestinoId.intValue()) { - fecViaje = corridaTramo.getFechorsalidaH(); - break; - } - } - - if(tramo==null) { - log.error("Reserva não será realizada. não foi encontrado trecho com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); - continue; - } - List vigenciaTarifaList = vigenciaTarifaService.buscarVigenciasIntervalo(new VigenciaTarifa(corrida.getFechorSalidaOriginal(), corrida.getFechorSalidaOriginal())); - if(vigenciaTarifaList==null || vigenciaTarifaList.isEmpty()) { - log.error("Reserva não será realizada. não foi encontrado Vigência Tarifa com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); - continue; - } - Tarifa tarifa = tarifaService.buscar(tramo, corrida.getMarca(), corrida.getClaseServicio(), vigenciaTarifaList!=null ? vigenciaTarifaList.get(0) : null, new Moneda(1), corrida.getRuta()); - if(tarifa==null ) { - log.error("Reserva não será realizada. não foi encontrado Tarifa com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); - continue; - } - BigDecimal valorTarifa= tarifa!=null ? tarifa.getPrecio() : null ; - BigDecimal valorSeguro= tarifa!=null ? tarifa.getImporteseguro() : null ; - BigDecimal valorTaxaEmbarque= tarifa!=null ? tarifa.getImportetaxaembarque() : null ; - BigDecimal valorPedagio = tarifa!=null ? tarifa.getImportepedagio() : null ; - Long tempoReserva = null; - if(reservaEspecialCliente.getClienteId() ==null) { - log.error("Cliente id não foi cadastrado (null) para reservaId=" + reservaEspecialCliente.getReservaEspecialClienteId() + " da corrida_id =" + reservaEspecialCliente.getCorridaId() ); - continue; - } - Cliente cliente = clienteService.obtenerID(reservaEspecialCliente.getClienteId().intValue()); - if(cliente ==null || !Boolean.TRUE.equals(cliente.getActivo())) { - continue; - } - String clienteFidelidadId = null; - try { - clienteFidelidadId = cliente.getListClienteFidelidad().get(0).getClienteFidelidadId().toString(); - } catch (Exception e) { - log.error("Boleto Reserva não gerado. Erro ao obter cliente fidelidade para o clienteId:" + cliente.getClienteId(), e ); - continue; - } - boletoService.criaBoletoReserva(unoAsientoSelec, unaCorridaId, unaFecCorrida, unoTerminalOrigenId, - unoTerminalDestinoId, unoTipoVenta, unaCategoriaSelec, unoNumeOperacion, unUsuarioId, unPuntoVenta, - reservaEspecialCliente.getClienteId().intValue(), corrida.getRuta().getRutaId(), valorTarifa, tempoReserva, - estacionId, cliente.getNumIdentificaUno(), clienteFidelidadId, - corrida.getClaseServicio().getClaseservicioId(), corrida.getMarca().getMarcaId(), fecViaje, corrida.getEmpresa().getEmpresaId(), - cliente.getNombcliente(), valorSeguro, valorTaxaEmbarque, valorPedagio); - } - } - } - } catch (Exception e) { - log.error("Erro ao validar/criar reserva especial de clientes para corridaId: " + corrida.getId().getCorridaId() , e); - } - } - - private void alterarNumPisoCorridaPisoExtra(Corrida corrida, Corrida corridaPisoExtra, String mensagemLog, Boolean atualizarPisoExtra, boolean isPiso3) { - if (corrida != null && corridaPisoExtra != null) { - log.info(mensagemLog + "; atualizando as corridas do piso 1 e 2"); - // Salvando Referencia da Corrida no piso extra - corridaPisoExtra.setCorridaPiso(corrida); - corridaPisoExtra.setNumPiso(isPiso3 ? 3 : 2); - corridaPisoExtra = corridaDAO.actualizacion(corridaPisoExtra); - // Referencia do Piso extra na Corrida - corrida.setCorridaPiso(corridaPisoExtra); - corrida.setNumPiso(1); - corrida = corridaDAO.actualizacion(corrida); - - if(atualizarPisoExtra) { - corridaDAO.actualizacion(corridaPisoExtra); - } - } else { - log.info(mensagemLog + "; nao foram atualizadas as corridas do piso 1 e 2"); - } - } - - private Boolean atualizarCorridaPisoExtra(Corrida corridaPisoExtra, EsquemaCorrida esquemaCorridaSegundoPiso, java.sql.Date data, String mensagemLog, Boolean atualizarPisoExtra) { - // caso corrida segundo piso for gerada antes, atualizar - if(corridaPisoExtra == null) { - Id id = new Id(); - id.setCorridaId(esquemaCorridaSegundoPiso.getNumCorrida()); - id.setFeccorrida(data); - - corridaPisoExtra = corridaDAO.buscarPorId(id); - - atualizarPisoExtra = corridaPisoExtra == null ? false : true; - log.info(mensagemLog + "; atualizarPisoExtra=" + atualizarPisoExtra); - } - - return atualizarPisoExtra; - } - - /** - * 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))) { - - Calendar fechorsalida = Calendar.getInstance(); - fechorsalida.setTime(corridaTramo.getFechorsalida()); - - HoraSistema horaSistema = new HoraSistema(tramoTiempo.getTiemporecorrido()); - - fechorsalida.add(Calendar.HOUR, horaSistema.getHora()); - fechorsalida.add(Calendar.MINUTE, horaSistema.getMinuto()); - - 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); - java.sql.Date data = new java.sql.Date(dataGeracao.getTime()); - Boolean isFeriado = this.isFeriado(data, esquemaCorrida); - - return generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), tmp.getTime(), false, isFeriado, null); - } - - 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; - } - - @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; - } - - private boolean generaCorridaAprimorada() { - try { - Constante constante = constanteService.buscarPorNomeConstante("GENERACION_CORRIDA_APRIMORADA"); - return (constante != null && StringUtils.isNotBlank(constante.getValorconstante()) - && Boolean.valueOf(constante.getValorconstante())) ? Boolean.TRUE : Boolean.FALSE; - } catch (Exception e) { - } - - return Boolean.FALSE; - } - - @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) - public boolean generarCorridaAutomatica() { - - if (generaCorridaAprimorada()) { - return generarCorridaAutomaticaAprimorada(); - } else { - return generarCorridaAutomaticaPadrao(); - } - } - - private boolean generarCorridaAutomaticaPadrao() { - feriadoCache.limpar(); - - Date dataDe = Calendar.getInstance().getTime(); - - Date dataAteConstante = calcularDataFinalGeneracionCorrida(); - Boolean hayErroConstante = !generarCorridaAutomaticaConstanteDias(dataDe, dataAteConstante); - - log.debug("corrida generadas por la constante. hayError=" + hayErroConstante); - - Boolean hayErroQtdeDias = !generarCorridaAutomaticaQtdeDias(dataDe); - - log.debug("corrida generadas por la cant de dias.hayError=" + hayErroQtdeDias); - - return hayErroConstante && hayErroQtdeDias; - } - - private boolean generarCorridaAutomaticaAprimorada() { - feriadoCache.limpar(); - - Date dataDe = Calendar.getInstance().getTime(); - - Date dataAteConstante = calcularDataFinalGeneracionCorrida(); - Boolean hayErroConstante = !generarCorridaAutomaticaAprimorada(dataDe, dataAteConstante); - - log.debug("corrida generadas aprimorada por la cant de dias.hayError=" + hayErroConstante); - - return hayErroConstante; - } - - private boolean generarCorridaAutomaticaQtdeDias(Date dataDeOriginal) { - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); - - log.debug(" Generacion cant dias " + sdf.format(dataDeOriginal)); - - // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc - DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); - TransactionStatus status = transactionManager.getTransaction(def); - - List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigenciaQtdeDiasNotNull(dataDeOriginal); - for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { - log.debug("esquemaCorrida=" + esquemaCorrida.getEsquemacorridaId()); - - Integer qtdeDiasGerar = esquemaCorrida.getCantDiasGeneracion(); - - if (qtdeDiasGerar <= 0) { - log.debug("cant dias <=0"); - - continue; - } - - log.debug("cantDiasGenerar=" + qtdeDiasGerar); - - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataDeOriginal); - calendarData.add(Calendar.DATE, qtdeDiasGerar - 1); - - Date dataAte = calendarData.getTime(); - Date dataDe = new Date(dataDeOriginal.getTime()); - - log.debug("Periodo generacion = " + sdf.format(dataDe) + " hasta " + sdf.format(dataAte)); - - if (DateUtil.compareOnlyDate(dataAte, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) > 0) { - log.info("Cant dias excede final de la vigencia"); - dataAte = esquemaCorrida.getEsquemaOperacional().getFecfinvigencia(); - } - - try { - while (DateUtil.compareOnlyDate(dataDe, dataAte) <= 0) { - - - List lsTmp = new ArrayList(); - lsTmp.add(esquemaCorrida); - - this.generarCorrida(dataDe, lsTmp, true, null); - - calendarData.setTime(dataDe); - calendarData.add(Calendar.DATE, 1); - dataDe = calendarData.getTime(); - } - log.info("commit bloco corridas"); - transactionManager.commit(status); - status = transactionManager.getTransaction(def); - } catch (Exception ex) { - log.error("", ex); - log.error(" Erro ao gerar corrida = " + esquemaCorrida.getNumCorrida() + " esquemaCorrida = " + esquemaCorrida.getEsquemacorridaId()); - transactionManager.rollback(status); - status = transactionManager.getTransaction(def); - } - } - - if (!status.isCompleted()) { - log.info("commit bloco final"); - transactionManager.commit(status); - } - - return Boolean.TRUE; - } - - private boolean generarCorridaAutomaticaConstanteDias(Date dataDe, Date dataAte) { - boolean generacionExitosa = true; - SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); - - log.debug("** AUTO - Data De: " + sdfData.format(dataDe) + " **Data Ateh: " + 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.buscaDentroVigenciaQtdeDiasNull(dataDe); - - Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); - if (dentroVigenciaEsquemaOperacional) { - log.debug("Geracao de servicos sem cant dias especifico. Adotando o padrao"); - - this.generarCorrida(dataDe, lsEsquemaCorrida, true, null); - - } 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); - generacionExitosa = false; - } - - return generacionExitosa; - } - - private boolean generarCorridaAutomaticaAprimorada(final Date dataInico, final Date dataConstanteFim) { - boolean generacionExitosa = true; - SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); - - log.debug("** AUTO - Data De: " + sdfData.format(dataInico) + " **Data Ateh: " + sdfData.format(dataConstanteFim)); - - // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc - DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); - TransactionStatus status = transactionManager.getTransaction(def); - - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataConstanteFim); - - - Date dataAte = calendarData.getTime(); - - try { - log.info("*** Data: " + sdfData.format(dataAte)); - List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigencia(dataInico); - - Date dataInicial = DateUtil.normalizarToFecha(dataInico); - - Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); - if (dentroVigenciaEsquemaOperacional) { - - for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { - log.debug("esquemaCorrida=" + esquemaCorrida.getEsquemacorridaId()); - - Integer qtdeDiasGerar = esquemaCorrida.getCantDiasGeneracion(); - - if (qtdeDiasGerar != null && qtdeDiasGerar >= 0) { - log.info("cantDiasGenerar=" + qtdeDiasGerar); - - Calendar calendarDiasGenerar = Calendar.getInstance(); - calendarDiasGenerar.setTime(dataInicial); - calendarDiasGenerar.add(Calendar.DATE, qtdeDiasGerar); - dataAte = DateUtil.normalizarToFecha(calendarDiasGenerar.getTime()); - } else { - calendarData.setTime(dataConstanteFim); - dataAte = DateUtil.normalizarToFecha(calendarData.getTime()); - } - SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); - log.debug("Periodo generacion = " + sdf.format(dataInicial) + " hasta " + sdf.format(dataAte)); - - if (DateUtil.compareOnlyDate(dataAte, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) > 0) { - log.info("Cant dias excede final de la vigencia"); - dataAte = esquemaCorrida.getEsquemaOperacional().getFecfinvigencia(); - } - - try { - while (DateUtil.compareOnlyDate(dataAte, dataInicial) >= 0) { - - boolean corridaExiste = corridaDAO.existe(new Corrida.Id(esquemaCorrida.getNumCorrida(), dataAte)); - String strDataGeracao = DateUtil.getStringDate(dataAte); - - log.info(String.format("Corrida existe = %s [%s - %s]",corridaExiste,esquemaCorrida.getNumCorrida() ,strDataGeracao)); - - //A corrida já existir é a única condição para parar de gerar. - //Se a corrida não for gerada (rotina mais abaixo), podem haver várias condições: o dia da semana, feriado, etc - if (corridaExiste){ - log.info(String.format("Corrida do dia já gerada ", esquemaCorrida.getNumCorrida(), strDataGeracao)); - - break; - } - - boolean corridaGerada = this.generarCorrida(dataAte, Arrays.asList(esquemaCorrida), false, null); - - log.info(String.format("Corrida gerada = %s [%s - %s]",corridaGerada,esquemaCorrida.getNumCorrida() ,strDataGeracao)); - - calendarData.setTime(dataAte); - calendarData.add(Calendar.DATE, -1); - dataAte = calendarData.getTime(); - } - - log.info("commit bloco corridas"); - - transactionManager.commit(status); - status = transactionManager.getTransaction(def); - } catch (Exception ex) { - log.error("", ex); - log.error(" Erro ao gerar corrida = " + esquemaCorrida.getNumCorrida() + " esquemaCorrida = " + esquemaCorrida.getEsquemacorridaId()); - transactionManager.rollback(status); - status = transactionManager.getTransaction(def); - } - } - - } else { - log.info("No hay esquema vigente para la fecha " + sdfData.format(dataInicial)); - } - - } catch (Exception ex) { - log.error("Erro ao gerar corridas: " + ex, ex); - generacionExitosa = false; - } - - return generacionExitosa; - } - - private int cantDiasMaxGerarCorridasManual() { - - Constante constante = constanteService.buscarPorNomeConstante("CANT_MAX_CORRIDA_GERA_MANUAL"); - - if ((constante == null) || (StringUtils.isBlank(constante.getValorconstante()))) { - return CANT_MAX_CORRIDA_GERA_MANUAL; - } - - return Integer.valueOf(constante.getValorconstante()); - - } - - public Long generarCorridasSelecionadas(List lsEsquemaCorrida, Date dataDe, Date dataAte) throws BusinessException { - - int cantDiasGeneracion = DateUtil.getElapsedDias(dataDe, dataAte); - - int cantDiasMaxGerarCorridasManual = cantDiasMaxGerarCorridasManual(); - - log.info("cantDiasGeneracion=" + cantDiasGeneracion); - log.info("cantDiasMaxGerarCorridasManual=" + cantDiasMaxGerarCorridasManual); - - if (cantDiasGeneracion > cantDiasMaxGerarCorridasManual()) { - throw new BusinessException("corridaServiceImpl.geracaoCorrida.cantDiasManual", new Object[] { cantDiasMaxGerarCorridasManual }); - } - - SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); - - log.info("** SELECIONADOS - Data De: " + sdfData.format(dataDe) + " **Data Ateh: " + sdfData.format(dataAte)); - - Calendar calendarData = Calendar.getInstance(); - calendarData.setTime(dataDe); - - Long cantInicio = corridaDAO.cantCorridaGeneradasHoy(); - - while (DateUtil.compareOnlyDate(dataDe, dataAte) <= 0) { - log.info("*** Data: " + sdfData.format(dataDe)); - - this.generarCorrida(dataDe, lsEsquemaCorrida, false, null); - - calendarData.add(Calendar.DATE, 1); - dataDe = calendarData.getTime(); - } - - Long cantFim = corridaDAO.cantCorridaGeneradasHoy(); - - return cantFim - cantInicio; - } - - public List buscarGroupCorrridaId(Integer corridaId, Date dateInicio, Date dateFin) { - GregorianCalendar gCalendarDe = new GregorianCalendar(); - gCalendarDe.setTime(dateInicio); - gCalendarDe.set(Calendar.HOUR_OF_DAY, 0); - gCalendarDe.set(Calendar.MINUTE, 0); - gCalendarDe.set(Calendar.SECOND, 0); - gCalendarDe.set(Calendar.MILLISECOND, 0); - - GregorianCalendar gCalendarAte = new GregorianCalendar(); - gCalendarAte.setTime(dateFin); - gCalendarAte.set(Calendar.HOUR_OF_DAY, 0); - gCalendarAte.set(Calendar.MINUTE, 0); - gCalendarAte.set(Calendar.SECOND, 0); - gCalendarAte.set(Calendar.MILLISECOND, 0); - - return corridaDAO.buscarGroupCorrridaId(corridaId, gCalendarDe.getTime(), gCalendarAte.getTime()); - } - - @Override - public List buscarGroupCorrridaId(Integer corridaId, Integer origem, Integer destino, Integer ruta, Integer numRuta, Date dateInicio, Date dateFin) { - GregorianCalendar gCalendarDe = new GregorianCalendar(); - gCalendarDe.setTime(dateInicio); - gCalendarDe.set(Calendar.HOUR_OF_DAY, 0); - gCalendarDe.set(Calendar.MINUTE, 0); - gCalendarDe.set(Calendar.SECOND, 0); - gCalendarDe.set(Calendar.MILLISECOND, 0); - - GregorianCalendar gCalendarAte = new GregorianCalendar(); - gCalendarAte.setTime(dateFin); - gCalendarAte.set(Calendar.HOUR_OF_DAY, 0); - gCalendarAte.set(Calendar.MINUTE, 0); - gCalendarAte.set(Calendar.SECOND, 0); - gCalendarAte.set(Calendar.MILLISECOND, 0); - - return corridaDAO.buscarGroupCorrridaId(corridaId, origem, destino, ruta, numRuta, gCalendarDe.getTime(), gCalendarAte.getTime()); - } - - @Override - public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial, Integer corridaId) { - try { - List corridas = corridaDAO.buscarPorEstado(estado, dataInicial, corridaId); - corridaDAO.actualizaFecHusoFecVerano(corridas); - return Boolean.TRUE; - - } catch (Exception ex) { - log.error("Erro ao atualizar corridas FecHuso FecVerano: " + ex, ex); - } - return Boolean.FALSE; - - } - - @Override - public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial) { - return atualizarCorridaFecHusoFecVerano(estado, dataInicial, null); - } - - @Override - public List buscarCorridaRelAproveitamento(Parada origem, Parada destino, - Date feccorrida, Integer corridaId) { - - List ls = new ArrayList(); - ls =corridaDAO.buscarCorridaRelAproveitamento(origem, destino, feccorrida, corridaId); - return ls; - - } - - @Override - public Corrida buscaCorrridaFutura(Ruta ruta, Date fecInicio) { - return corridaDAO.buscaCorrridaFutura(ruta, fecInicio); - } - - @Override - @Transactional - public Boolean editarCorridaPorOutraCorrida(Estado estado, Date dataInicial, Integer corridaId, Date dataPadrao) { - List corridas = corridaDAO.buscarPorEstado(estado, dataInicial, corridaId); - - if (corridas == null || corridas.isEmpty()){ - return false; - } - - Corrida corrida = corridaDAO.buscarPorId(new Corrida(corridaId, dataPadrao).getId()); - if(corrida != null){ - corridaDAO.editarCorridaPorOutraCorrida(corridas,corrida); - }else { - return false; - } - return true; - } - - public Integer buscarOcupacaoCorrida(Corrida corrida) { - return corridaDAO.buscarOcupacaoCorrida(corrida); - } - - @Override - public Corrida buscarPorId(Id id) { - // TODO Auto-generated method stub - return corridaDAO.buscarPorId(id); - } - - @Override - public Corrida buscarCorridaAtivaPorId(Id id) { - return corridaDAO.buscarCorridaAtivaPorId(id); - } - - private void generarCorridaInfo(Corrida corrida, EsquemaCorrida esquemaCorrida) { - - if(corrida != null && corrida.getId() != null && corrida.getId().getFeccorrida() != null && corrida.getId().getCorridaId() != null) { - - if(esquemaCorrida != null) { - - List lsEsquemaCorridaInfo = esquemaCorridaInfoService.obtenerPorEsquemaCorrida(esquemaCorrida); - - if(lsEsquemaCorridaInfo != null) { - - for (EsquemaCorridaInfo esquemaCorridaInfo : lsEsquemaCorridaInfo) { - - CorridaInfo corridaInfo = new CorridaInfo(); - corridaInfo.setOrigem(esquemaCorridaInfo.getOrigem()); - corridaInfo.setDestino(esquemaCorridaInfo.getDestino()); - corridaInfo.setCorrida(corrida); - corridaInfo.setInfoCorrida(esquemaCorridaInfo.getInfoCorrida()); - corridaInfoService.suscribir(corridaInfo); - } - } - - } - } - } - - -} +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.service.impl; + +import java.math.BigDecimal; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.Locale; + +import javax.persistence.Transient; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.DefaultTransactionDefinition; + +import com.rjconsultores.ventaboletos.dao.CorridaDAO; +import com.rjconsultores.ventaboletos.dao.EsquemaCorridaDAO; +import com.rjconsultores.ventaboletos.dao.TramoTiempoDAO; +import com.rjconsultores.ventaboletos.entidad.AsientoExclusivo; +import com.rjconsultores.ventaboletos.entidad.Ciudad; +import com.rjconsultores.ventaboletos.entidad.ClaseServicio; +import com.rjconsultores.ventaboletos.entidad.Cliente; +import com.rjconsultores.ventaboletos.entidad.Constante; +import com.rjconsultores.ventaboletos.entidad.Corrida; +import com.rjconsultores.ventaboletos.entidad.Corrida.Id; +import com.rjconsultores.ventaboletos.entidad.CorridaCtrl; +import com.rjconsultores.ventaboletos.entidad.CorridaInfo; +import com.rjconsultores.ventaboletos.entidad.CorridaTramo; +import com.rjconsultores.ventaboletos.entidad.DetDiagramaAutobus; +import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus; +import com.rjconsultores.ventaboletos.entidad.Empresa; +import com.rjconsultores.ventaboletos.entidad.EsquemaAsiento; +import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida; +import com.rjconsultores.ventaboletos.entidad.EsquemaCorridaInfo; +import com.rjconsultores.ventaboletos.entidad.EsquemaTramo; +import com.rjconsultores.ventaboletos.entidad.Estado; +import com.rjconsultores.ventaboletos.entidad.Marca; +import com.rjconsultores.ventaboletos.entidad.Moneda; +import com.rjconsultores.ventaboletos.entidad.Parada; +import com.rjconsultores.ventaboletos.entidad.ReservaEspecialCliente; +import com.rjconsultores.ventaboletos.entidad.Ruta; +import com.rjconsultores.ventaboletos.entidad.RutaCombinacion; +import com.rjconsultores.ventaboletos.entidad.RutaSecuencia; +import com.rjconsultores.ventaboletos.entidad.Tarifa; +import com.rjconsultores.ventaboletos.entidad.Tramo; +import com.rjconsultores.ventaboletos.entidad.TramoServicio; +import com.rjconsultores.ventaboletos.entidad.TramoTiempo; +import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa; +import com.rjconsultores.ventaboletos.enums.StatusFlexBus; +import com.rjconsultores.ventaboletos.exception.BusinessException; +import com.rjconsultores.ventaboletos.service.AsientoExclusivoService; +import com.rjconsultores.ventaboletos.service.BoletoService; +import com.rjconsultores.ventaboletos.service.ClienteService; +import com.rjconsultores.ventaboletos.service.ConstanteService; +import com.rjconsultores.ventaboletos.service.CorridaCtrlService; +import com.rjconsultores.ventaboletos.service.CorridaInfoService; +import com.rjconsultores.ventaboletos.service.CorridaService; +import com.rjconsultores.ventaboletos.service.CorridaTramoService; +import com.rjconsultores.ventaboletos.service.DetDiagramaAutobusService; +import com.rjconsultores.ventaboletos.service.EsquemaAsientoService; +import com.rjconsultores.ventaboletos.service.EsquemaCorridaInfoService; +import com.rjconsultores.ventaboletos.service.EsquemaCorridaService; +import com.rjconsultores.ventaboletos.service.EsquemaTramoService; +import com.rjconsultores.ventaboletos.service.ReservaEspecialClienteService; +import com.rjconsultores.ventaboletos.service.RutaSecuenciaService; +import com.rjconsultores.ventaboletos.service.RutaService; +import com.rjconsultores.ventaboletos.service.TarifaService; +import com.rjconsultores.ventaboletos.service.TramoService; +import com.rjconsultores.ventaboletos.service.TramoServicioService; +import com.rjconsultores.ventaboletos.service.VigenciaTarifaService; +import com.rjconsultores.ventaboletos.utilerias.ActivoUtil; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; +import com.rjconsultores.ventaboletos.utilerias.FeriadoCache; +import com.rjconsultores.ventaboletos.utilerias.HoraSistema; +import com.rjconsultores.ventaboletos.utilerias.LocaleUtil; +import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado; +import com.rjconsultores.ventaboletos.utilerias.UtiliteriasFiscal; +import com.rjconsultores.ventaboletos.vo.esquemaoperacional.TarefaGeracaoCorridaVO; + +/** + * + * @author rodrigo + */ +@Service("corridaService") +public class CorridaServiceImpl implements CorridaService { + + private static final Logger log = LogManager.getLogger(CorridaServiceImpl.class); + private static int CANT_MAX_CORRIDA_GERA_MANUAL = 40; + + // Tipo de venda Reserva + private static final Integer TPV_RESERVA_NORMAL = 15; + + @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 DetDiagramaAutobusService detDiagramaAutobusService; + @Autowired + private ConstanteService constanteService; + @Autowired + private RutaSecuenciaService rutaSecuenciaService; + private PlatformTransactionManager transactionManager; + @Transient + private int cantCorridaGenerada; + @Transient + private int cantCorridaCommit; + @Autowired + private FeriadoCache feriadoCache; + @Autowired + private BoletoService boletoService; + @Autowired + private ReservaEspecialClienteService reservaEspecialClientService; + @Autowired + private TarifaService tarifaService; + @Autowired + TramoService tramoService; + @Autowired + VigenciaTarifaService vigenciaTarifaService; + @Autowired + ClienteService clienteService; + @Autowired + private CorridaInfoService corridaInfoService; + @Autowired + private EsquemaCorridaInfoService esquemaCorridaInfoService; + @Autowired + private CorridaTramoService corridaTramosService; + + @Autowired + public CorridaServiceImpl(@Qualifier("transactionManager") PlatformTransactionManager transactionManager) { + this.transactionManager = transactionManager; + } + + @Override + public List obtenerTodos() { + return corridaDAO.obtenerTodos(); + } + + @Override + public Corrida obtenerID(Corrida.Id id) { + return corridaDAO.obtenerID(id); + } + + @Override + public List buscarPorFecCorrida(Date value) { + return corridaDAO.buscarPorFecCorrida(value); + } + + @Override + public List buscarPorId(Integer idCorrida) { + return corridaDAO.buscarPorId(idCorrida); + } + + @Override + public List verificarCorridaId(Integer corridaId) { + return corridaDAO.verificarCorridaId(corridaId); + } + + @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); + } + + @Transactional + public Corrida suscribir(Corrida entidad) { + entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + entidad.setFecmodif(Calendar.getInstance().getTime()); + entidad.setActivo(ActivoUtil.ATIVO); + + return corridaDAO.suscribir(entidad); + } + + @Transactional + public Corrida actualizacion(Corrida entidad) { + entidad.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + entidad.setFecmodif(Calendar.getInstance().getTime()); + entidad.setActivo(ActivoUtil.ATIVO); + + return corridaDAO.actualizacion(entidad); + } + + + @Transactional + public void borrar(Corrida entidad) { + corridaDAO.borrar(entidad); + } + + @Override + public List buscarPorAutobusCorridasFuturas(DiagramaAutobus diagramaAutobus) { + return corridaDAO.buscarPorAutobusCorridasFuturas(diagramaAutobus); + } + + @Override + public List buscarPorRolOperativoCorridasFuturas(DiagramaAutobus diagramaAutobus) { + return corridaDAO.buscarPorRolOperativoCorridasFuturas(diagramaAutobus); + } + + @Override + public List buscarFiltro(Parada ori, Parada des, Date hora, ClaseServicio cs) { + return corridaDAO.buscarFiltro(ori, des, hora, cs); + } + + public Boolean existeCorrida(Long id){ + return corridaDAO.existeCorrida(id); + } + + private Boolean geraDiaSemana(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 boolean temCorridaDiaSemana(Integer diaSemana, EsquemaCorrida esquemaCorrida, Boolean isFeriado) { + Boolean retorno = Boolean.FALSE; + + if (esquemaCorrida.getIndGeneraFeriado() != null) { + if (esquemaCorrida.getIndGeneraFeriado().equals("S")) { + retorno = geraDiaSemana(diaSemana, esquemaCorrida); + } else if (isFeriado) { + if (esquemaCorrida.getIndGeneraFeriado().equals("F")) { + retorno = geraDiaSemana(diaSemana, esquemaCorrida); + } + } else if (esquemaCorrida.getIndGeneraFeriado().equals("N")) { + retorno = geraDiaSemana(diaSemana, esquemaCorrida); + } + } else { + retorno = geraDiaSemana(diaSemana, esquemaCorrida); + } + + return retorno; + } + + private Date calcularFechorllegada(EsquemaTramo esquemaTramo, ClaseServicio clase, Date dataGeracao, Date horaChegada) { + GregorianCalendar gHoraChegada = new GregorianCalendar(); + gHoraChegada.setTime(horaChegada); + HoraSistema hs = null; + + if (esquemaTramo.getExcepcionRecorrido() != null) { + hs = new HoraSistema(esquemaTramo.getExcepcionRecorrido()); + + gHoraChegada.add(Calendar.HOUR_OF_DAY, hs.getHora()); + gHoraChegada.add(Calendar.MINUTE, hs.getMinuto()); + } else { + Tramo tramo = esquemaTramo.getTramo(); + List lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase); + + for (TramoServicio ts : lsTramoServicio) { + hs = new HoraSistema(ts.getTiemporecorrido()); + + gHoraChegada.add(Calendar.HOUR_OF_DAY, hs.getHora()); + gHoraChegada.add(Calendar.MINUTE, hs.getMinuto()); + } + } + + return gHoraChegada.getTime(); + } + + @SuppressWarnings("deprecation") + 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()); + + log.debug("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. + * + * Alem disso eh 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; + } + + private boolean isFeriado(java.sql.Date data, EsquemaCorrida esquemaCorrida) { + Empresa empresa = esquemaCorrida.getEmpresa(); + + Estado estadoOrigem = null; + List lsRutaSequencia = rutaSecuenciaService.buscarSecuenciaOrdenado(esquemaCorrida.getRuta()); + if (!lsRutaSequencia.isEmpty()) { + Tramo tramoOrigem = lsRutaSequencia.get(0).getTramo(); + Parada origem = tramoOrigem.getOrigem(); + estadoOrigem = origem.getCiudad().getEstado(); + } + + return feriadoCache.ehFeriado(data, empresa, estadoOrigem); + } + + /** + * Indica si el esquemaCorrida informado tiene una vigencia válida para la data de generacion + * + * @param esquemaCorrida + * @param dataGeracao + * @return + */ + private boolean vigenciaValida(EsquemaCorrida esquemaCorrida, Date dataGeracao) { + if ((DateUtil.compareOnlyDate(dataGeracao, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) <= 0) && + (DateUtil.compareOnlyDate(dataGeracao, esquemaCorrida.getEsquemaOperacional().getFecniciovigencia()) >= 0)) { + + return true; + } + return false; + } + + /** + * Genera una corrida para el esquemaCorrida informado en la fecha informada.
+ * + * Cuando la corrida no es generada :
+ * - corrida ya existe : eso es checado por el numCorrida e dataGeneracion
+ * - la fecha de generacion no tiene una vigencia válida
+ * - el status del esquema corrida no es autorizado ("A")
+ * + * + * @param esquemaCorrida + * @param diaSemana + * @param dataGeracao + * @return - La corrida generada o null si no fue generada. + */ + @SuppressWarnings("deprecation") + private Corrida generarCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, boolean isPisoExtra, Boolean isFeriado, List corridaTramoList) { + + + Corrida corrida = null; + try { + + GregorianCalendar calendario = new GregorianCalendar(); + calendario.setTime(dataGeracao); + Integer diaSemana = calendario.get(Calendar.DAY_OF_WEEK); + Ruta ruta = esquemaCorrida.getRuta(); + ClaseServicio claseServicio = esquemaCorrida.getClaseServicio(); + Marca marca = esquemaCorrida.getMarca(); + Date horario = esquemaCorrida.getHorasalida(); + horario = DateUtil.normalizar(horario); + Integer numCorrida = esquemaCorrida.getNumCorrida(); + Corrida.Id id = new Corrida.Id(); + id.setCorridaId(numCorrida); + id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); + List lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida); + + if(!realizaValidacoesGerais(esquemaCorrida, dataGeracao, diaSemana, isFeriado, ruta, id, numCorrida, horario, claseServicio, marca, isPisoExtra, lsEsquemaTramo)) { + return null; + } + + Parada origemCorrida = lsEsquemaTramo.get(0).getTramo().getOrigem(); + + Parada destinoCorrida = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1).getTramo().getDestino(); + + /* Como o numCorrida corresponde ao corrida_id do corridaCtrl, ou seja, é chave primaria, temos que buscar somente por esse campo + Caso o registro já exista, atualizamos os dados dele. Sendo assim, o que vai indicar a "duplicidade" de uma corrida será apenas o número dela e não mais o conjunto : clase + marca + horario + ruta*/ + + CorridaCtrl corridaCtrl = criaCorridaCtrl(isPisoExtra, ruta, claseServicio, marca, horario, numCorrida); + + corrida = criaCorrida(esquemaCorrida, dataGeracao, id, lsEsquemaTramo, origemCorrida, destinoCorrida, + corridaCtrl, corridaTramoList); + + cantCorridaGenerada++; + + criaAssentoExclusivo(esquemaCorrida, corrida); + + } catch (Exception ex) { + log.error("", ex); + } + + return corrida; + } + + private Corrida criaCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, Corrida.Id id, + List lsEsquemaTramo, Parada origemCorrida, Parada destinoCorrida, CorridaCtrl corridaCtrl, List corridaTramoList) { + Corrida corrida; + corrida = new Corrida(); + corrida.setId(id); + corrida.setEsquemaCorrida(esquemaCorrida); + corrida.setCorridaCtrl(corridaCtrl); + corrida.setAutobus(esquemaCorrida.getAutoBus()!= null ? esquemaCorrida.getAutoBus() : null); + corrida.setClaseServicio(corridaCtrl.getClaseServicio()); + corrida.setConductor(null); + if (esquemaCorrida.getIndCorridaExtra()) { + corrida.setTipoServicio(new Short("2")); + } else { + corrida.setTipoServicio(new Short("1")); + } + corrida.setInfoCorrida(esquemaCorrida.getInfoCorrida()); + Integer cantparados = esquemaCorrida.getCantparados(); + if (cantparados != null) { + corrida.setCantParados(cantparados.shortValue()); + } + + corrida.setEsquemaAgrupacionId(esquemaCorrida.getEsquemaAgrupacionId()); + + corrida.setEmpresa(esquemaCorrida.getEmpresa()); + corrida.setEmpresa1(esquemaCorrida.getEmpresa1()); + + corrida.setFechorsalida(truncarDataHora(dataGeracao, esquemaCorrida.getHorasalida())); + corrida.setFechorSalidaOriginal(corrida.getFechorsalida()); + + if (esquemaCorrida.getStatusCorrida().equals("A")) { + corrida.setIndstatuscorrida("H"); + corrida.setActivo(ActivoUtil.ATIVO); + } else if (esquemaCorrida.getStatusCorrida().equals("L")) { + corrida.setIndstatuscorrida("P"); + corrida.setActivo(ActivoUtil.INATIVO); + } + + corrida.setMarca(esquemaCorrida.getMarca()); + corrida.setNodo(corridaCtrl.getNodo()); + corrida.setDivision(esquemaCorrida.getDivision()); + corrida.setRuta(esquemaCorrida.getRuta()); + corrida.setRolOperativo(esquemaCorrida.getRolOperativo()); + corrida.setZona(null); + corrida.setOrigem(origemCorrida); + corrida.setDestino(destinoCorrida); + + validaFlexBus(esquemaCorrida, corrida); + List lsCorridaTramo = null; + Date fechorSalidaOriginalH = null; + if(corridaTramoList!=null && !corridaTramoList.isEmpty()) { + lsCorridaTramo = corridaTramoList; + }else { + lsCorridaTramo = corridaTramosService.criaCorridaTramoList(esquemaCorrida.getAutoBus(), dataGeracao, fechorSalidaOriginalH, lsEsquemaTramo, corridaCtrl.getNodo(), corrida.getClaseServicio(), esquemaCorrida.getStatusCorrida()); + for (CorridaTramo corridaTramo : lsCorridaTramo) { + corridaTramo.setCorrida(corrida); + } + } + + corrida.setCorridaTramoList(lsCorridaTramo); + + corrida.setFecmodif(Calendar.getInstance().getTime()); + + if (UsuarioLogado.getUsuarioLogado() != null) { + corrida.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } else { + corrida.setUsuarioId(1); + } + corrida.setIndTipoVenta(null); + corrida.setCodProdutoFiscal(UtiliteriasFiscal.defineCodigoProduto(corrida.getOrigem().getParadaId(), corrida.getDestino().getParadaId(), corrida.getRuta().getRutaId())); + corrida = corridaDAO.suscribir(corrida); + return corrida; + } + + private CorridaCtrl criaCorridaCtrl(boolean isPisoExtra, Ruta ruta, ClaseServicio claseServicio, Marca marca, + Date horario, Integer numCorrida) { + CorridaCtrl corridaCtrl = corridaCtrlService.obtenerID(numCorrida); + + boolean novoRegistro = false; + + if (corridaCtrl == null) { + corridaCtrl = new CorridaCtrl(); + novoRegistro = true; + } + + corridaCtrl.setCorridaId(numCorrida); + corridaCtrl.setMarca(marca); + corridaCtrl.setRuta(ruta); + corridaCtrl.setClaseServicio(claseServicio); + corridaCtrl.setHorario(horario); + + // parada origem + Parada origen = rutaService.getOrigem(ruta); + if (origen == null) { + log.info("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); + + if (novoRegistro) { + corridaCtrl = corridaCtrlService.suscribir(corridaCtrl); + } else { + corridaCtrl = corridaCtrlService.actualizacion(corridaCtrl); + } + return corridaCtrl; + } + + + + private void validaFlexBus(EsquemaCorrida esquemaCorrida, Corrida corrida) { + if(esquemaCorrida.getIsFlexBus()) { + corrida.setOcupacaoMinima(esquemaCorrida.getOcupacaoMinima()); + corrida.setHorasParaConfirmacao(esquemaCorrida.getHorasParaConfirmacao()); + corrida.setMinutosParaConfirmacao(esquemaCorrida.getMinutosParaConfirmacao()); + corrida.setIsFlexBus(Boolean.TRUE); + + corrida.setStatusFlexBus(StatusFlexBus.EM_RESERVA.getStatus()); + } + } + + private Boolean realizaValidacoesGerais(EsquemaCorrida esquemaCorrida, Date dataGeracao, Integer diaSemana, Boolean isFeriado, + Ruta ruta, Corrida.Id id, Integer numCorrida, Date horario, ClaseServicio claseServicio, Marca marca, Boolean isPisoExtra, List lsEsquemaTramo){ + Integer corridaId = esquemaCorrida.getNumCorrida(); + String fecCorrida = DateUtil.getStringDate(horario); + if (!vigenciaValida(esquemaCorrida, dataGeracao)) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + " vigencia invalida=" + dataGeracao); + return Boolean.FALSE; + } + + if (!((esquemaCorrida.getStatusCorrida() != null) && (esquemaCorrida.getStatusCorrida().equals("A") || esquemaCorrida.getStatusCorrida().equals("L")))) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + "status corrida invalido=" + esquemaCorrida.getStatusCorrida()); + return Boolean.FALSE; + } + + if (esquemaCorrida.getIndDiaSimDiaNao() == null || esquemaCorrida.getIndDiaSimDiaNao() == Boolean.FALSE) { + if (!temCorridaDiaSemana(diaSemana, esquemaCorrida, isFeriado)) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + "dia semana no valido=" + diaSemana); + return Boolean.FALSE; + } + } + + if (!tramoServicioService.existenTiemposTramosEsquema(esquemaCorrida.getEsquemacorridaId())) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida +". Nao foi cadastrado o tempo de todos os trechos do esquema corrida=" + esquemaCorrida.getEsquemacorridaId()); + return Boolean.FALSE; + } + + if(!validaCorridaDiaSimDiaNao(esquemaCorrida, dataGeracao, numCorrida)) { + return Boolean.FALSE; + } + + if (corridaDAO.existe(id)) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". corrida existe = " + numCorrida + ";" + ruta.getDescruta() + ";" + DateUtil.getStringDate(dataGeracao) + ";" + DateUtil.getStringDate(horario, "HH:mm") + ";" + claseServicio.getDescclase() + ";" + marca.getDescmarca() + " Piso: " + isPisoExtra); + return Boolean.FALSE; + } + + if (lsEsquemaTramo == null || lsEsquemaTramo.isEmpty()) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Não contem trechos (EsquemaTramo nulo ou vazio)"); + return Boolean.FALSE; + } + + EsquemaTramo primeiroTrechoCorrida = lsEsquemaTramo.get(0); + Parada origemCorrida = primeiroTrechoCorrida.getTramo().getOrigem(); + if (origemCorrida == null) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Origem não preenchido (Primeiro trecho EsquemaTramo)"); + return Boolean.FALSE; + } + + EsquemaTramo ultimoTrechoCorrida = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1); + Parada destinoCorrida = ultimoTrechoCorrida.getTramo().getDestino(); + if (destinoCorrida == null) { + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". Destino não preenchido (Último trecho EsquemaTramo)"); + return Boolean.FALSE; + } + + if(marca !=null && Boolean.FALSE.equals(marca.getActivo())){ + log.error("CorridaId:" + corridaId + " FecCorrida:" + fecCorrida + ". MarcaId=" + marca.getMarcaId() +" inativa, corrida não pode ser gerada"); + return Boolean.FALSE; + } + + return Boolean.TRUE; + } + + private Boolean validaCorridaDiaSimDiaNao(EsquemaCorrida esquemaCorrida, Date dataGeracao, Integer numCorrida ){ + if (Boolean.TRUE.equals(esquemaCorrida.getIndDiaSimDiaNao())) { + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataGeracao); + calendarData.add(Calendar.DATE, -1); + + Corrida.Id corridaOntem = new Corrida.Id(); + + corridaOntem.setCorridaId(numCorrida); + corridaOntem.setFeccorrida(DateUtil.normalizarToFecha(calendarData.getTime())); + + if (corridaDAO.existe(corridaOntem)) { + log.info("Esquema configurado para gerar dia sim dia não e já possui corrida gerado no dia anterior, por isso não está data: " + DateUtil.getStringDate(dataGeracao)); + return Boolean.FALSE; + } + } + return Boolean.TRUE; + } + + private Calendar getCalendarFechorllegada(Date fecHorallegada) { + Calendar llegada = Calendar.getInstance(); + llegada.setTime(fecHorallegada); + llegada.set(llegada.get(Calendar.YEAR), llegada.get(Calendar.MONTH), llegada.get(Calendar.DATE), + llegada.get(Calendar.HOUR_OF_DAY), llegada.get(Calendar.MINUTE), NumberUtils.INTEGER_ZERO); + return llegada; + } + + private Calendar getCalendarFechorSalida(Date fecHorSalida) { + Calendar salida = Calendar.getInstance(); + salida.setTime(fecHorSalida); + salida.set(salida.get(Calendar.YEAR), salida.get(Calendar.MONTH), salida.get(Calendar.DATE), + salida.get(Calendar.HOUR_OF_DAY), salida.get(Calendar.MINUTE), NumberUtils.INTEGER_ZERO); + return salida; + } + + private void criaAssentoExclusivo(EsquemaCorrida esquemaCorrida, Corrida corrida) { + List lsEsquemaAsiento = esquemaAsientoService.obtenerPorCorrida(esquemaCorrida); + for (EsquemaAsiento ea : lsEsquemaAsiento) { + DetDiagramaAutobus detDiagramaAutobus = detDiagramaAutobusService.obtenerPorDiagramaAutobusAsiento(esquemaCorrida.getDiagramaAutobusId(), ea.getNumasiento()); + if (detDiagramaAutobus != null && detDiagramaAutobus.getVendible()) { + 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.setTiempoLiberacion(ea.getTiempoLiberacion()); + if (ea.getIndvendible()) { + asientoExclusivo.setMotivobloqueo(null); + } else { + asientoExclusivo.setMotivobloqueo(ea.getMotivobloqueo()); + asientoExclusivo.setDestino(ea.getDestino()); + } + + asientoExclusivo.setActivo(Boolean.TRUE); + asientoExclusivo.setFecmodif(Calendar.getInstance().getTime()); + if (UsuarioLogado.getUsuarioLogado() != null) { + asientoExclusivo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId()); + } + + asientoExclusivo = asientoExclusivoService.suscribir(asientoExclusivo); + } + } + } + + private Date calcularHusoHorVeranoLlegada(EsquemaTramo esquemaTramo, CorridaTramo corridaTramo) { + + Ciudad ciudadOrigen = esquemaTramo.getTramo().getOrigem().getCiudad(); + Estado estadoOrigen = ciudadOrigen.getEstado(); + + int tiempoOrigen = estadoOrigen.getTiempoHorHuso() == null ? 0 : estadoOrigen.getTiempoHorHuso(); + + Date fecInicioHorVerano = estadoOrigen.getFecInicioHorVerano(); + Date fecFinHorVerano = estadoOrigen.getFecFinoHorVerano(); + + + + if ((fecInicioHorVerano != null) && (fecFinHorVerano != null)) { + if ((DateUtil.compareOnlyDate(fecInicioHorVerano, corridaTramo.getFechorsalida()) <= 0) && (DateUtil.compareOnlyDate(fecFinHorVerano, corridaTramo.getFechorsalida()) >= 0)) { + tiempoOrigen += estadoOrigen.getTiempoHorVerano(); + } + } + // 21688 + Ciudad ciudadDestino = esquemaTramo.getTramo().getDestino().getCiudad(); + Estado estadoDestino = ciudadDestino.getEstado(); + int tiempoDestino = 0; + + if (!estadoDestino.equals(estadoOrigen)) { + tiempoDestino = estadoDestino.getTiempoHorHuso() == null ? 0 : estadoDestino.getTiempoHorHuso(); + + + + Date fecInicioHorVeranoDestino = estadoDestino.getFecInicioHorVerano(); + Date fecFinHorVeranDestino = estadoDestino.getFecFinoHorVerano(); + + if ((fecInicioHorVeranoDestino != null) && (fecFinHorVeranDestino != null)) { + if ((DateUtil.compareOnlyDate(fecInicioHorVeranoDestino, corridaTramo.getFechorllegada()) <= 0) && (DateUtil.compareOnlyDate(fecFinHorVeranDestino, corridaTramo.getFechorllegada()) >= 0)) { + tiempoDestino += estadoDestino.getTiempoHorVerano(); + } + } + } else { + tiempoDestino =0; + tiempoOrigen=0; + } + + //Consideração do fuso por cidade. + //Nesse caso, é mandatório em relação ao estado.Ou seja, equanto que no fuso do estado, + //tem que haver Mudança de estado, para a cidade NÃO, pois pode-se considerar cada cidade + //como um único estado. Sendo assim, devendo ser considerado sempre quando preenchido + if ( (ciudadOrigen.getZonaHoraria() != null) && (ciudadOrigen.getZonaHoraria() != 0 )){ + log.info("Fuso da cidade origem " + ciudadOrigen.getNombciudad() + " : " + ciudadOrigen.getZonaHoraria()); + + tiempoOrigen += ciudadOrigen.getZonaHoraria(); + } + + if ( (ciudadDestino.getZonaHoraria() != null) && (ciudadDestino.getZonaHoraria() != 0 )){ + log.info("Fuso da cidade destino " + ciudadDestino.getNombciudad() + " : " + ciudadDestino.getZonaHoraria()); + + tiempoDestino += ciudadDestino.getZonaHoraria(); + } + //Fim consideração fuso por cidade + + Calendar horLlegada = null; + + long elapsedMinutes = DateUtil.getElapsedMinutos(corridaTramo.getFechorsalida(), corridaTramo.getFechorllegada()); + + horLlegada = Calendar.getInstance(); + horLlegada.setTime(corridaTramo.getFechorsalidaH()); + + horLlegada.add(Calendar.MINUTE, (int) elapsedMinutes); + + // Si los tiempos son distintos, hube cambio de huso horario/horario de verano + if (tiempoOrigen != tiempoDestino) { + horLlegada.add(Calendar.HOUR, difHuso(tiempoOrigen, tiempoDestino)); + + } + + return (horLlegada == null) ? null : horLlegada.getTime(); + } + + private int difHuso(int a, int b) { + return b - a; + } + + public Boolean generarCorrida(Date dataGeracao, List lsEsquemaCorrida, boolean isGeracaoAutomaticaCorrida, List corridaTramoList) { + + DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); + + // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc + TransactionStatus status = transactionManager.getTransaction(def); + cantCorridaGenerada = 0; + cantCorridaCommit = 1; + java.sql.Date data = new java.sql.Date(dataGeracao.getTime()); + + Integer unUsuarioId = constanteService.buscarValorConstantePorNomeConstante("USUARIO_RESERVA_CLIENTES"); + Integer unPuntoVenta= constanteService.buscarValorConstantePorNomeConstante("PUNTOVENTA_RESERVA_CLIENTES"); + Integer estacionId = constanteService.buscarValorConstantePorNomeConstante("ESTACION_RESERVA_CLIENTES"); + + boolean corridaGerada = true; + + Corrida corrida = null; + Corrida corridaPisoExtra = null; + Corrida corridaPisoExtra2 = null; + try { + + for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { + log.info("esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + + //Usado para validar se deve buscar o primeiro piso e vincular com o segungo/terceiro caso ele ja esteja criado + boolean isSegundoOuTerceiroPiso = false; + + if (isGeracaoAutomaticaCorrida) { + boolean esHijoRebote = esquemaCorridaDAO.esHijoRebote(esquemaCorrida); + boolean esSegundoPiso = esquemaCorridaDAO.esSegundoPiso(esquemaCorrida); + + //Nessas duas condições, o "filho" só é gerado a partir do esquema corrida "pai" + if (esHijoRebote || esSegundoPiso) { + log.info(String.format("Esquema nao gerado. esHijoRebote:%s ; esSegundoPiso: %s",esHijoRebote,esSegundoPiso)); + corridaGerada = false; + continue; + } + } else { + // Caso nao seja automatico e o segundo piso seja enviado, busca o primeiro piso e geram os dois (ou tres pisos), + // caso o primeiro piso ja exista, o segundo e gerado e os dois sao vinculados + boolean esHijoRebote = esquemaCorridaDAO.esHijoRebote(esquemaCorrida); + + //Nessas tres condições, o "filho" só é gerado a partir do esquema corrida "pai" + if (esHijoRebote) { + log.info("E segundo HijoRebote, procurando a corrida Pai. "); + + esquemaCorrida = esquemaCorridaDAO.buscarEsquemaPeloHijoRebote(esquemaCorrida); + + if(esquemaCorrida == null) { + log.info(String.format("Esquema nao gerado. esHijoRebote:%s ; ",esHijoRebote)); + corridaGerada = false; + continue; + } + log.info("Corrida Pai esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + } + + boolean esSegundoPiso = esquemaCorridaDAO.esSegundoPiso(esquemaCorrida); + + if(esSegundoPiso) { + isSegundoOuTerceiroPiso = true; + log.info("E segundo Piso, procurando o primeiro piso para gerar. "); + esquemaCorrida = esquemaCorridaDAO.buscarPrimeiroPisoPeloSegundo(esquemaCorrida); + + if(esquemaCorrida == null) { + log.info("Primeiro piso nao encontrado, nao ira gerar o servico: " ); + corridaGerada = false; + continue; + } + + log.info("Primeiro Piso esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + } + + boolean esTerceiroPiso = esquemaCorridaDAO.esTerceiroPiso(esquemaCorrida); + + if(esTerceiroPiso) { + isSegundoOuTerceiroPiso = true; + log.info("E terceiro Piso, procurando o primeiro piso para gerar. "); + esquemaCorrida = esquemaCorridaDAO.buscarPrimeiroPisoPeloTerceiro(esquemaCorrida); + + if(esquemaCorrida == null) { + log.info("Primeiro piso nao encontrado, nao ira gerar o servico: " ); + corridaGerada = false; + continue; + } + log.info("Primeiro Piso esquema=" + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + } + } + + if(esquemaCorrida.getIndCorridaDesativada()) { + log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + corridaGerada = false; + continue; + } + + Boolean isFeriado = this.isFeriado(data, esquemaCorrida); + corrida = generarCorrida(esquemaCorrida, dataGeracao, false, isFeriado, corridaTramoList); + + + corridaPisoExtra = null; + corridaPisoExtra2 = null; + + if (corrida == null && !isSegundoOuTerceiroPiso) { + corridaGerada = false; + continue; + + } else if(corrida == null && isSegundoOuTerceiroPiso) { + log.info(" Primeiro piso ja existe, buscando corrida para vincular ao piso extra"); + corrida = corridaDAO.buscarPorId(criarIdCorrida(dataGeracao, esquemaCorrida)); + + if (corrida == null) { + log.info("Nao foi encontrada corrida original, nao sera gerado o segundo/terceiro piso"); + corridaGerada = false; + continue; + } + } + + // PISO EXTRA + if (esquemaCorrida.getPisoExtra() != null && esquemaCorrida.getPisoExtra()) { + + EsquemaCorrida esquemaCorridaSegundoPiso = esquemaCorridaDAO.buscarPeloNumCorrida(esquemaCorrida.getNumCorridaPisoExtra()); + + String mensagemLog = String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida segundo piso: %s/%s ",esquemaCorrida.getEsquemacorridaId(),esquemaCorrida.getNumCorrida(), esquemaCorridaSegundoPiso.getEsquemacorridaId(),esquemaCorridaSegundoPiso.getNumCorrida() ); + log.info(mensagemLog); + + if(esquemaCorridaSegundoPiso.getIndCorridaDesativada()) { + log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + corridaGerada = false; + continue; + } + + corridaPisoExtra = generarCorrida(esquemaCorridaSegundoPiso, dataGeracao, true, isFeriado, null); + Boolean atualizarPisoExtra = false; + + // caso corrida segundo piso for gerada antes, atualizar + atualizarPisoExtra = atualizarCorridaPisoExtra(corridaPisoExtra, esquemaCorridaSegundoPiso, data, mensagemLog, atualizarPisoExtra); + + alterarNumPisoCorridaPisoExtra(corrida, corridaPisoExtra, mensagemLog, atualizarPisoExtra, false); + + //Valida se existe configuração de reserva para o cliente e crria Cria reserva para 2º piso + if(corridaPisoExtra !=null) { + if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { + validaCriaReservaCliente(corridaPisoExtra, unUsuarioId, unPuntoVenta, estacionId); + } + } + + if(esquemaCorrida.getNumCorridaPisoExtra2() != null) { + + EsquemaCorrida esquemaCorridaTerceiroPiso = esquemaCorridaDAO.buscarPeloNumCorrida(esquemaCorrida.getNumCorridaPisoExtra2()); + + if(esquemaCorridaTerceiroPiso != null) { + + mensagemLog = String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida terceiro piso: %s/%s ",esquemaCorrida.getEsquemacorridaId(),esquemaCorrida.getNumCorrida(), esquemaCorridaTerceiroPiso.getEsquemacorridaId(),esquemaCorridaTerceiroPiso.getNumCorrida() ); + log.info(mensagemLog); + + if(esquemaCorridaTerceiroPiso.getIndCorridaDesativada()) { + log.info("Corrida desativada nao sera gerada. " + esquemaCorrida.getEsquemacorridaId() + " numCorrida=" + esquemaCorrida.getNumCorrida()); + corridaGerada = false; + continue; + } + + corridaPisoExtra2 = generarCorrida(esquemaCorridaTerceiroPiso, dataGeracao, true, isFeriado, null); + atualizarPisoExtra = false; + + // caso corrida segundo piso for gerada antes, atualizar + atualizarPisoExtra = atualizarCorridaPisoExtra(corridaPisoExtra2, esquemaCorridaTerceiroPiso, data, mensagemLog, atualizarPisoExtra); + + // caso corrida segundo piso for gerada antes, atualizar + alterarNumPisoCorridaPisoExtra(corrida, corridaPisoExtra2, mensagemLog, atualizarPisoExtra, true); + + //Valida se existe configuração de reserva para o cliente e crria Cria reserva para 2º piso + if(corridaPisoExtra !=null) { + if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { + validaCriaReservaCliente(corridaPisoExtra, unUsuarioId, unPuntoVenta, estacionId); + } + } + } + } + } + + if (esquemaCorrida.getEsquemaCorridaRebote() != null) { + criaCorridaRebote(dataGeracao, corrida, corridaPisoExtra, corridaPisoExtra2, esquemaCorrida, + isFeriado); + } + + if(corrida != null) { + generarCorridaInfo(corrida, esquemaCorrida); + } + + if (cantCorridaGenerada >= cantCorridaCommit) { + cantCorridaGenerada = 0; + transactionManager.commit(status); + status = transactionManager.getTransaction(def); + } + + } + }catch (Exception e) { + log.error("Erro ao gerar corrida", e ); + } + finally { + if ((status != null) && (!status.isCompleted())) { + transactionManager.commit(status); + } + } + //Valida se existe configuração de reserva para o cliente e cria Cria reserva + if(corrida !=null) { + if(unUsuarioId!=null && unPuntoVenta!=null && estacionId!=null) { + validaCriaReservaCliente(corrida, unUsuarioId, unPuntoVenta, estacionId); + } + } + + return corridaGerada; + } + + private Id criarIdCorrida(Date dataGeracao, EsquemaCorrida esquemaCorrida) { + Corrida.Id id = new Corrida.Id(); + id.setCorridaId(esquemaCorrida.getNumCorrida()); + id.setFeccorrida(DateUtil.normalizarToFecha(dataGeracao)); + + return id; + } + + private void criaCorridaRebote(Date dataGeracao, Corrida corrida, Corrida corridaPisoExtra, + Corrida corridaPisoExtra2, EsquemaCorrida esquemaCorrida, Boolean isFeriado) { + log.info("Corrida Rebote=" + esquemaCorrida.getEsquemacorridaId()); + + Corrida corridaRebote = generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), dataGeracao, false, isFeriado, null); + Corrida corridaPisoExtraRebote = null; + boolean generaReboteDiaSeguinte = false; + + if (corridaRebote != null) { + EsquemaCorrida ecRebote = esquemaCorrida.getEsquemaCorridaRebote(); + if (ecRebote.getPisoExtra() != null && ecRebote.getPisoExtra()) { + + EsquemaCorrida esquemaCorridaSegundoPiso = esquemaCorridaDAO.buscarPeloNumCorrida(ecRebote.getNumCorridaPisoExtra()); + + log.info(String.format("Esquema/Corrida primeiro piso: %s/%s ; Esquema/Corrida segundo piso: %s/%s ",ecRebote.getEsquemacorridaId(),ecRebote.getNumCorrida(), esquemaCorridaSegundoPiso.getEsquemacorridaId(),esquemaCorridaSegundoPiso.getNumCorrida() )); + + corridaPisoExtraRebote = generarCorrida(esquemaCorridaSegundoPiso, dataGeracao, true, isFeriado, null); + + if (corridaRebote != null && corridaPisoExtraRebote != null) { + // Salvando Referencia da Corrida no piso extra + corridaPisoExtraRebote.setCorridaPiso(corridaRebote); + corridaPisoExtraRebote.setNumPiso(2); + corridaPisoExtraRebote = corridaDAO.actualizacion(corridaPisoExtraRebote); + + // 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 dia seguinte + } + } else { + generaReboteDiaSeguinte = true;// si no fue encontrado para el dia de hoy,genera para manhana + } + + if (generaReboteDiaSeguinte) { + log.info("Haciendo la busqueda 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 (corridaPisoExtraRebote != null && corridaPisoExtra2 != null) { + log.info("Rebote Piso Extra Generado=" + corridaPisoExtraRebote.getId()); + corridaPisoExtra2.setCorridaRebote(corridaPisoExtraRebote); + corridaDAO.actualizacion(corridaPisoExtra2); + } + } + + private void validaCriaReservaCliente(Corrida corrida, Integer unUsuarioId, Integer unPuntoVenta, Integer estacionId) { + try { + List reservaEspecialClienteList = reservaEspecialClientService.bucarReservaEspecialByCorridaId(corrida.getId().getCorridaId().longValue()) ; + if(reservaEspecialClienteList !=null) { + for (ReservaEspecialCliente reservaEspecialCliente : reservaEspecialClienteList) { + Date dataAtual = new Date (); + //Valida se esta dentro da vigência + if(DateUtil.isMenor(reservaEspecialCliente.getFecinicio(), dataAtual) && DateUtil.isMaior(reservaEspecialCliente.getFecfinal(), dataAtual)){ + Integer unoTerminalOrigenId = reservaEspecialCliente.getOrigem().getParadaId(); + Integer unoTerminalDestinoId = reservaEspecialCliente.getDestino().getParadaId(); + String unoAsientoSelec = reservaEspecialCliente.getNumAsentoCorrida().toString(); + Integer unaCorridaId =corrida.getId().getCorridaId().intValue(); + Date unaFecCorrida= corrida.getId().getFeccorrida(); + Integer unoTipoVenta= TPV_RESERVA_NORMAL; + Integer unaCategoriaSelec= 1 ; + String unoNumeOperacion= null ; + Tramo tramo = null; + Date fecViaje = corrida.getFechorsalida(); + Ruta ruta = rutaService.obtenerID(corrida.getRuta().getRutaId()); + for(RutaCombinacion rutaCombinacion :ruta.getRutaCombinacionList()) { + if((rutaCombinacion.getTramo().getOrigem().getParadaId().intValue()==unoTerminalOrigenId.intValue()) + && (rutaCombinacion.getTramo().getDestino().getParadaId().intValue()==unoTerminalDestinoId.intValue()) ) { + tramo = rutaCombinacion.getTramo(); + break; + } + } + + for (CorridaTramo corridaTramo : corrida.getCorridaTramoList()) { + //(Se origem corridatramo = origem cadastrada && destino corridatramo = destino cadastrado) + // ou (se origem corridatramo = destino do cadastrado), tendo em vista que corridatramo são as sequencias e não as combinações + if(corridaTramo.getOrigem()!=null && corridaTramo.getOrigem().getParadaId().intValue()==unoTerminalOrigenId.intValue() + && corridaTramo.getDestino()!=null && corridaTramo.getDestino().getParadaId().intValue()==unoTerminalDestinoId.intValue()) { + fecViaje = corridaTramo.getFechorsalidaH(); + break; + } + } + if(fecViaje!=null) { + if(!isDiaSemnanaOK(reservaEspecialCliente, fecViaje)) { + log.error("Reserva não será realizada. Dia da semana desta corrida não corresponde ao dia da semana configurado na resserva epecial para o clienteId:" + + reservaEspecialCliente.getClienteId() + " reservaEspecialClienteId:" + reservaEspecialCliente.getReservaEspecialClienteId() + " para a corrida:" + corrida.getId().getCorridaId() + "na data" + fecViaje); + continue; + } + } + + if(tramo==null) { + log.error("Reserva não será realizada. não foi encontrado trecho com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); + continue; + } + List vigenciaTarifaList = vigenciaTarifaService.buscarVigenciasIntervalo(new VigenciaTarifa(corrida.getFechorSalidaOriginal(), corrida.getFechorSalidaOriginal())); + if(vigenciaTarifaList==null || vigenciaTarifaList.isEmpty()) { + log.error("Reserva não será realizada. não foi encontrado Vigência Tarifa com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); + continue; + } + Tarifa tarifa = tarifaService.buscar(tramo, corrida.getMarca(), corrida.getClaseServicio(), vigenciaTarifaList!=null ? vigenciaTarifaList.get(0) : null, new Moneda(1), corrida.getRuta()); + if(tarifa==null ) { + log.error("Reserva não será realizada. não foi encontrado Tarifa com Origem:" + unoTerminalOrigenId + " Destino:" +unoTerminalDestinoId + " para a corrida:" + corrida.getId().getCorridaId()); + continue; + } + BigDecimal valorTarifa= tarifa!=null ? tarifa.getPrecio() : null ; + BigDecimal valorSeguro= tarifa!=null ? tarifa.getImporteseguro() : null ; + BigDecimal valorTaxaEmbarque= tarifa!=null ? tarifa.getImportetaxaembarque() : null ; + BigDecimal valorPedagio = tarifa!=null ? tarifa.getImportepedagio() : null ; + Long tempoReserva = null; + if(reservaEspecialCliente.getClienteId() ==null) { + log.error("Cliente id não foi cadastrado (null) para reservaId=" + reservaEspecialCliente.getReservaEspecialClienteId() + " da corrida_id =" + reservaEspecialCliente.getCorridaId() ); + continue; + } + Cliente cliente = clienteService.obtenerID(reservaEspecialCliente.getClienteId().intValue()); + if(cliente ==null || !Boolean.TRUE.equals(cliente.getActivo())) { + continue; + } + String clienteFidelidadId = null; + try { + clienteFidelidadId = cliente.getListClienteFidelidad().get(0).getClienteFidelidadId().toString(); + } catch (Exception e) { + log.error("Boleto Reserva não gerado. Erro ao obter cliente fidelidade para o clienteId:" + cliente.getClienteId(), e ); + continue; + } + boletoService.criaBoletoReserva(unoAsientoSelec, unaCorridaId, unaFecCorrida, unoTerminalOrigenId, + unoTerminalDestinoId, unoTipoVenta, unaCategoriaSelec, unoNumeOperacion, unUsuarioId, unPuntoVenta, + reservaEspecialCliente.getClienteId().intValue(), corrida.getRuta().getRutaId(), valorTarifa, tempoReserva, + estacionId, cliente.getNumIdentificaUno(), clienteFidelidadId, + corrida.getClaseServicio().getClaseservicioId(), corrida.getMarca().getMarcaId(), fecViaje, corrida.getEmpresa().getEmpresaId(), + cliente.getNombcliente(), valorSeguro, valorTaxaEmbarque, valorPedagio); + } + } + } + } catch (Exception e) { + log.error("Erro ao validar/criar reserva especial de clientes para corridaId: " + corrida.getId().getCorridaId() , e); + } + } + + /** + * Valida se o dia da semana desta corrida está configurado para gerar reserva especial de clientes + * @param reservaEspecialCliente + * @param fecViaje + * @return + */ + private boolean isDiaSemnanaOK(ReservaEspecialCliente reservaEspecialCliente, Date fecViaje) { + int diaSemanaInt = DateUtil.getDiaDaSemana(fecViaje); + boolean isDiaSemanaOK = false; + switch (diaSemanaInt) { + case 1: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndDomingo()) ? true :false ; + break; + case 2: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndSegunda()) ? true :false ; + break; + case 3: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndTerca()) ? true :false ; + break; + case 4: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndQuarta()) ? true :false ; + break; + case 5: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndQuinta()) ? true :false ; + break; + case 6: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndSexta()) ? true :false ; + break; + case 7: + isDiaSemanaOK = Boolean.TRUE.equals(reservaEspecialCliente.getIndSabado()) ? true :false ; + break; + default: + break; + } + return isDiaSemanaOK; + } + + private void alterarNumPisoCorridaPisoExtra(Corrida corrida, Corrida corridaPisoExtra, String mensagemLog, Boolean atualizarPisoExtra, boolean isPiso3) { + if (corrida != null && corridaPisoExtra != null) { + log.info(mensagemLog + "; atualizando as corridas do piso 1 e 2"); + // Salvando Referencia da Corrida no piso extra + corridaPisoExtra.setCorridaPiso(corrida); + corridaPisoExtra.setNumPiso(isPiso3 ? 3 : 2); + corridaPisoExtra = corridaDAO.actualizacion(corridaPisoExtra); + // Referencia do Piso extra na Corrida + corrida.setCorridaPiso(corridaPisoExtra); + corrida.setNumPiso(1); + corrida = corridaDAO.actualizacion(corrida); + + if(atualizarPisoExtra) { + corridaDAO.actualizacion(corridaPisoExtra); + } + } else { + log.info(mensagemLog + "; nao foram atualizadas as corridas do piso 1 e 2"); + } + } + + private Boolean atualizarCorridaPisoExtra(Corrida corridaPisoExtra, EsquemaCorrida esquemaCorridaSegundoPiso, java.sql.Date data, String mensagemLog, Boolean atualizarPisoExtra) { + // caso corrida segundo piso for gerada antes, atualizar + if(corridaPisoExtra == null) { + Id id = new Id(); + id.setCorridaId(esquemaCorridaSegundoPiso.getNumCorrida()); + id.setFeccorrida(data); + + corridaPisoExtra = corridaDAO.buscarPorId(id); + + atualizarPisoExtra = corridaPisoExtra == null ? false : true; + log.info(mensagemLog + "; atualizarPisoExtra=" + atualizarPisoExtra); + } + + return atualizarPisoExtra; + } + + /** + * 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))) { + + Calendar fechorsalida = Calendar.getInstance(); + fechorsalida.setTime(corridaTramo.getFechorsalida()); + + HoraSistema horaSistema = new HoraSistema(tramoTiempo.getTiemporecorrido()); + + fechorsalida.add(Calendar.HOUR, horaSistema.getHora()); + fechorsalida.add(Calendar.MINUTE, horaSistema.getMinuto()); + + 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); + java.sql.Date data = new java.sql.Date(dataGeracao.getTime()); + Boolean isFeriado = this.isFeriado(data, esquemaCorrida); + + return generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), tmp.getTime(), false, isFeriado, null); + } + + 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; + } + + @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; + } + + private boolean generaCorridaAprimorada() { + try { + Constante constante = constanteService.buscarPorNomeConstante("GENERACION_CORRIDA_APRIMORADA"); + return (constante != null && StringUtils.isNotBlank(constante.getValorconstante()) + && Boolean.valueOf(constante.getValorconstante())) ? Boolean.TRUE : Boolean.FALSE; + } catch (Exception e) { + } + + return Boolean.FALSE; + } + + @Transactional(readOnly = true, propagation = Propagation.SUPPORTS) + public boolean generarCorridaAutomatica() { + + if (generaCorridaAprimorada()) { + return generarCorridaAutomaticaAprimorada(); + } else { + return generarCorridaAutomaticaPadrao(); + } + } + + private boolean generarCorridaAutomaticaPadrao() { + feriadoCache.limpar(); + + Date dataDe = Calendar.getInstance().getTime(); + + Date dataAteConstante = calcularDataFinalGeneracionCorrida(); + Boolean hayErroConstante = !generarCorridaAutomaticaConstanteDias(dataDe, dataAteConstante); + + log.debug("corrida generadas por la constante. hayError=" + hayErroConstante); + + Boolean hayErroQtdeDias = !generarCorridaAutomaticaQtdeDias(dataDe); + + log.debug("corrida generadas por la cant de dias.hayError=" + hayErroQtdeDias); + + return hayErroConstante && hayErroQtdeDias; + } + + private boolean generarCorridaAutomaticaAprimorada() { + feriadoCache.limpar(); + + Date dataDe = Calendar.getInstance().getTime(); + + Date dataAteConstante = calcularDataFinalGeneracionCorrida(); + Boolean hayErroConstante = !generarCorridaAutomaticaAprimorada(dataDe, dataAteConstante); + + log.debug("corrida generadas aprimorada por la cant de dias.hayError=" + hayErroConstante); + + return hayErroConstante; + } + + private boolean generarCorridaAutomaticaQtdeDias(Date dataDeOriginal) { + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); + + log.debug(" Generacion cant dias " + sdf.format(dataDeOriginal)); + + // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc + DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); + TransactionStatus status = transactionManager.getTransaction(def); + + List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigenciaQtdeDiasNotNull(dataDeOriginal); + for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { + log.debug("esquemaCorrida=" + esquemaCorrida.getEsquemacorridaId()); + + Integer qtdeDiasGerar = esquemaCorrida.getCantDiasGeneracion(); + + if (qtdeDiasGerar <= 0) { + log.debug("cant dias <=0"); + + continue; + } + + log.debug("cantDiasGenerar=" + qtdeDiasGerar); + + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataDeOriginal); + calendarData.add(Calendar.DATE, qtdeDiasGerar - 1); + + Date dataAte = calendarData.getTime(); + Date dataDe = new Date(dataDeOriginal.getTime()); + + log.debug("Periodo generacion = " + sdf.format(dataDe) + " hasta " + sdf.format(dataAte)); + + if (DateUtil.compareOnlyDate(dataAte, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) > 0) { + log.info("Cant dias excede final de la vigencia"); + dataAte = esquemaCorrida.getEsquemaOperacional().getFecfinvigencia(); + } + + try { + while (DateUtil.compareOnlyDate(dataDe, dataAte) <= 0) { + + + List lsTmp = new ArrayList(); + lsTmp.add(esquemaCorrida); + + this.generarCorrida(dataDe, lsTmp, true, null); + + calendarData.setTime(dataDe); + calendarData.add(Calendar.DATE, 1); + dataDe = calendarData.getTime(); + } + log.info("commit bloco corridas"); + transactionManager.commit(status); + status = transactionManager.getTransaction(def); + } catch (Exception ex) { + log.error("", ex); + log.error(" Erro ao gerar corrida = " + esquemaCorrida.getNumCorrida() + " esquemaCorrida = " + esquemaCorrida.getEsquemacorridaId()); + transactionManager.rollback(status); + status = transactionManager.getTransaction(def); + } + } + + if (!status.isCompleted()) { + log.info("commit bloco final"); + transactionManager.commit(status); + } + + return Boolean.TRUE; + } + + private boolean generarCorridaAutomaticaConstanteDias(Date dataDe, Date dataAte) { + boolean generacionExitosa = true; + SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); + + log.debug("** AUTO - Data De: " + sdfData.format(dataDe) + " **Data Ateh: " + 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.buscaDentroVigenciaQtdeDiasNull(dataDe); + + Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); + if (dentroVigenciaEsquemaOperacional) { + log.debug("Geracao de servicos sem cant dias especifico. Adotando o padrao"); + + this.generarCorrida(dataDe, lsEsquemaCorrida, true, null); + + } 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); + generacionExitosa = false; + } + + return generacionExitosa; + } + + private boolean generarCorridaAutomaticaAprimorada(final Date dataInico, final Date dataConstanteFim) { + boolean generacionExitosa = true; + SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); + + log.debug("** AUTO - Data De: " + sdfData.format(dataInico) + " **Data Ateh: " + sdfData.format(dataConstanteFim)); + + // TODO: Melhorar o tratamento às transações manuais em caso de erro,etc + DefaultTransactionDefinition def = new DefaultTransactionDefinition(DefaultTransactionDefinition.PROPAGATION_REQUIRES_NEW); + TransactionStatus status = transactionManager.getTransaction(def); + + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataConstanteFim); + + + Date dataAte = calendarData.getTime(); + + try { + log.info("*** Data: " + sdfData.format(dataAte)); + List lsEsquemaCorrida = esquemaCorridaService.buscaDentroVigencia(dataInico); + + Date dataInicial = DateUtil.normalizarToFecha(dataInico); + + Boolean dentroVigenciaEsquemaOperacional = !lsEsquemaCorrida.isEmpty(); + if (dentroVigenciaEsquemaOperacional) { + + for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida) { + log.debug("esquemaCorrida=" + esquemaCorrida.getEsquemacorridaId()); + + Integer qtdeDiasGerar = esquemaCorrida.getCantDiasGeneracion(); + + if (qtdeDiasGerar != null && qtdeDiasGerar >= 0) { + log.info("cantDiasGenerar=" + qtdeDiasGerar); + + Calendar calendarDiasGenerar = Calendar.getInstance(); + calendarDiasGenerar.setTime(dataInicial); + calendarDiasGenerar.add(Calendar.DATE, qtdeDiasGerar); + dataAte = DateUtil.normalizarToFecha(calendarDiasGenerar.getTime()); + } else { + calendarData.setTime(dataConstanteFim); + dataAte = DateUtil.normalizarToFecha(calendarData.getTime()); + } + SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); + log.debug("Periodo generacion = " + sdf.format(dataInicial) + " hasta " + sdf.format(dataAte)); + + if (DateUtil.compareOnlyDate(dataAte, esquemaCorrida.getEsquemaOperacional().getFecfinvigencia()) > 0) { + log.info("Cant dias excede final de la vigencia"); + dataAte = esquemaCorrida.getEsquemaOperacional().getFecfinvigencia(); + } + + try { + while (DateUtil.compareOnlyDate(dataAte, dataInicial) >= 0) { + + boolean corridaExiste = corridaDAO.existe(new Corrida.Id(esquemaCorrida.getNumCorrida(), dataAte)); + String strDataGeracao = DateUtil.getStringDate(dataAte); + + log.info(String.format("Corrida existe = %s [%s - %s]",corridaExiste,esquemaCorrida.getNumCorrida() ,strDataGeracao)); + + //A corrida já existir é a única condição para parar de gerar. + //Se a corrida não for gerada (rotina mais abaixo), podem haver várias condições: o dia da semana, feriado, etc + if (corridaExiste){ + log.info(String.format("Corrida do dia já gerada ", esquemaCorrida.getNumCorrida(), strDataGeracao)); + + break; + } + + boolean corridaGerada = this.generarCorrida(dataAte, Arrays.asList(esquemaCorrida), false, null); + + log.info(String.format("Corrida gerada = %s [%s - %s]",corridaGerada,esquemaCorrida.getNumCorrida() ,strDataGeracao)); + + calendarData.setTime(dataAte); + calendarData.add(Calendar.DATE, -1); + dataAte = calendarData.getTime(); + } + + log.info("commit bloco corridas"); + + transactionManager.commit(status); + status = transactionManager.getTransaction(def); + } catch (Exception ex) { + log.error("", ex); + log.error(" Erro ao gerar corrida = " + esquemaCorrida.getNumCorrida() + " esquemaCorrida = " + esquemaCorrida.getEsquemacorridaId()); + transactionManager.rollback(status); + status = transactionManager.getTransaction(def); + } + } + + } else { + log.info("No hay esquema vigente para la fecha " + sdfData.format(dataInicial)); + } + + } catch (Exception ex) { + log.error("Erro ao gerar corridas: " + ex, ex); + generacionExitosa = false; + } + + return generacionExitosa; + } + + private int cantDiasMaxGerarCorridasManual() { + + Constante constante = constanteService.buscarPorNomeConstante("CANT_MAX_CORRIDA_GERA_MANUAL"); + + if ((constante == null) || (StringUtils.isBlank(constante.getValorconstante()))) { + return CANT_MAX_CORRIDA_GERA_MANUAL; + } + + return Integer.valueOf(constante.getValorconstante()); + + } + + public Long generarCorridasSelecionadas(List lsEsquemaCorrida, Date dataDe, Date dataAte) throws BusinessException { + + int cantDiasGeneracion = DateUtil.getElapsedDias(dataDe, dataAte); + + int cantDiasMaxGerarCorridasManual = cantDiasMaxGerarCorridasManual(); + + log.info("cantDiasGeneracion=" + cantDiasGeneracion); + log.info("cantDiasMaxGerarCorridasManual=" + cantDiasMaxGerarCorridasManual); + + if (cantDiasGeneracion > cantDiasMaxGerarCorridasManual()) { + throw new BusinessException("corridaServiceImpl.geracaoCorrida.cantDiasManual", new Object[] { cantDiasMaxGerarCorridasManual }); + } + + SimpleDateFormat sdfData = new SimpleDateFormat("dd/MM/yyyy"); + + log.info("** SELECIONADOS - Data De: " + sdfData.format(dataDe) + " **Data Ateh: " + sdfData.format(dataAte)); + + Calendar calendarData = Calendar.getInstance(); + calendarData.setTime(dataDe); + + Long cantInicio = corridaDAO.cantCorridaGeneradasHoy(); + + while (DateUtil.compareOnlyDate(dataDe, dataAte) <= 0) { + log.info("*** Data: " + sdfData.format(dataDe)); + + this.generarCorrida(dataDe, lsEsquemaCorrida, false, null); + + calendarData.add(Calendar.DATE, 1); + dataDe = calendarData.getTime(); + } + + Long cantFim = corridaDAO.cantCorridaGeneradasHoy(); + + return cantFim - cantInicio; + } + + public List buscarGroupCorrridaId(Integer corridaId, Date dateInicio, Date dateFin) { + GregorianCalendar gCalendarDe = new GregorianCalendar(); + gCalendarDe.setTime(dateInicio); + gCalendarDe.set(Calendar.HOUR_OF_DAY, 0); + gCalendarDe.set(Calendar.MINUTE, 0); + gCalendarDe.set(Calendar.SECOND, 0); + gCalendarDe.set(Calendar.MILLISECOND, 0); + + GregorianCalendar gCalendarAte = new GregorianCalendar(); + gCalendarAte.setTime(dateFin); + gCalendarAte.set(Calendar.HOUR_OF_DAY, 0); + gCalendarAte.set(Calendar.MINUTE, 0); + gCalendarAte.set(Calendar.SECOND, 0); + gCalendarAte.set(Calendar.MILLISECOND, 0); + + return corridaDAO.buscarGroupCorrridaId(corridaId, gCalendarDe.getTime(), gCalendarAte.getTime()); + } + + @Override + public List buscarGroupCorrridaId(Integer corridaId, Integer origem, Integer destino, Integer ruta, Integer numRuta, Date dateInicio, Date dateFin) { + GregorianCalendar gCalendarDe = new GregorianCalendar(); + gCalendarDe.setTime(dateInicio); + gCalendarDe.set(Calendar.HOUR_OF_DAY, 0); + gCalendarDe.set(Calendar.MINUTE, 0); + gCalendarDe.set(Calendar.SECOND, 0); + gCalendarDe.set(Calendar.MILLISECOND, 0); + + GregorianCalendar gCalendarAte = new GregorianCalendar(); + gCalendarAte.setTime(dateFin); + gCalendarAte.set(Calendar.HOUR_OF_DAY, 0); + gCalendarAte.set(Calendar.MINUTE, 0); + gCalendarAte.set(Calendar.SECOND, 0); + gCalendarAte.set(Calendar.MILLISECOND, 0); + + return corridaDAO.buscarGroupCorrridaId(corridaId, origem, destino, ruta, numRuta, gCalendarDe.getTime(), gCalendarAte.getTime()); + } + + @Override + public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial, Integer corridaId) { + try { + List corridas = corridaDAO.buscarPorEstado(estado, dataInicial, corridaId); + corridaDAO.actualizaFecHusoFecVerano(corridas); + return Boolean.TRUE; + + } catch (Exception ex) { + log.error("Erro ao atualizar corridas FecHuso FecVerano: " + ex, ex); + } + return Boolean.FALSE; + + } + + @Override + public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial) { + return atualizarCorridaFecHusoFecVerano(estado, dataInicial, null); + } + + @Override + public List buscarCorridaRelAproveitamento(Parada origem, Parada destino, + Date feccorrida, Integer corridaId) { + + List ls = new ArrayList(); + ls =corridaDAO.buscarCorridaRelAproveitamento(origem, destino, feccorrida, corridaId); + return ls; + + } + + @Override + public Corrida buscaCorrridaFutura(Ruta ruta, Date fecInicio) { + return corridaDAO.buscaCorrridaFutura(ruta, fecInicio); + } + + @Override + @Transactional + public Boolean editarCorridaPorOutraCorrida(Estado estado, Date dataInicial, Integer corridaId, Date dataPadrao) { + List corridas = corridaDAO.buscarPorEstado(estado, dataInicial, corridaId); + + if (corridas == null || corridas.isEmpty()){ + return false; + } + + Corrida corrida = corridaDAO.buscarPorId(new Corrida(corridaId, dataPadrao).getId()); + if(corrida != null){ + corridaDAO.editarCorridaPorOutraCorrida(corridas,corrida); + }else { + return false; + } + return true; + } + + public Integer buscarOcupacaoCorrida(Corrida corrida) { + return corridaDAO.buscarOcupacaoCorrida(corrida); + } + + @Override + public Corrida buscarPorId(Id id) { + // TODO Auto-generated method stub + return corridaDAO.buscarPorId(id); + } + + @Override + public Corrida buscarCorridaAtivaPorId(Id id) { + return corridaDAO.buscarCorridaAtivaPorId(id); + } + + private void generarCorridaInfo(Corrida corrida, EsquemaCorrida esquemaCorrida) { + + if(corrida != null && corrida.getId() != null && corrida.getId().getFeccorrida() != null && corrida.getId().getCorridaId() != null) { + + if(esquemaCorrida != null) { + + List lsEsquemaCorridaInfo = esquemaCorridaInfoService.obtenerPorEsquemaCorrida(esquemaCorrida); + + if(lsEsquemaCorridaInfo != null) { + + for (EsquemaCorridaInfo esquemaCorridaInfo : lsEsquemaCorridaInfo) { + + CorridaInfo corridaInfo = new CorridaInfo(); + corridaInfo.setOrigem(esquemaCorridaInfo.getOrigem()); + corridaInfo.setDestino(esquemaCorridaInfo.getDestino()); + corridaInfo.setCorrida(corrida); + corridaInfo.setInfoCorrida(esquemaCorridaInfo.getInfoCorrida()); + corridaInfoService.suscribir(corridaInfo); + } + } + + } + } + } + + public static void main(String[] args) { + Date dataInicialFiltroCorridaExistente = new Date(); + Date dataFinalFiltroCorridaExistente = DateUtil.somarDias(dataInicialFiltroCorridaExistente, 7); + + LocalDate inicioLocalDate = dataInicialFiltroCorridaExistente.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate fimLocalDate = dataFinalFiltroCorridaExistente.toInstant().atZone(ZoneId.systemDefault()).toLocalDate().plusDays(1); + for (LocalDate date = inicioLocalDate; date.isBefore(fimLocalDate); date = date.plusDays(1)) { + Date dataIter = Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()); + DateFormat formatter = new SimpleDateFormat("EEE", new Locale("pt", "BR")); + String dia = formatter.format(dataIter); + System.out.println("Teste dia:" + dia); + } + } + +} diff --git a/src/com/rjconsultores/ventaboletos/utilerias/DateUtil.java b/src/com/rjconsultores/ventaboletos/utilerias/DateUtil.java index d7f5a1c65..593fc3541 100644 --- a/src/com/rjconsultores/ventaboletos/utilerias/DateUtil.java +++ b/src/com/rjconsultores/ventaboletos/utilerias/DateUtil.java @@ -1,869 +1,882 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package com.rjconsultores.ventaboletos.utilerias; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.commons.lang.StringUtils; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; - -public final class DateUtil { - - public static Integer DIA = Integer.valueOf(1000 * 60 * 60 * 24); - public static Integer UM_DIA = Integer.valueOf(1); - - /** - * Formato 24Hs - */ - public static String ddMMaaHH24mm = "dd/MM/yyyy HH:mm"; - public static String ddMMaaHH24mmss = "dd/MM/yyyy HH:mm:ss"; - - /** - * Formato 12hs - */ - public static String ddMMaaHHmm = "dd/MM/yyyy hh:mm"; - public static String ddMMaaaa = "dd/MM/yyyy"; - public static String ddMMaa_anodoisdigitos = "dd/MM/yy"; - public static String ddMMaa_sembarra = "ddMMyy"; - public static String HHmm = "HH:mm"; - public static String formatGMT = "yyyy-MM-dd'T'HH:mm:ss"; - public static String formatJson = "yyyy-MM-dd'T'HH:mm:ss.SSS"; - public static String formatExp = "yyyyMMdd"; - public static String YYYY_MM_DD_T_HH_MM_SS_Z = "yyyy-MM-dd'T'HH:mm:ssZ"; - - /** - * No need for an instance - */ - private DateUtil() { - } - - /** - * Elapsed days based on current time - * - * @param date - * Date - * - * @return int number of days - */ - public static int getElapsedDias(Date date) { - return elapsed(date, Calendar.DATE); - } - - /** - * Elapsed days based on two Date objects - * - * @param d1 - * Date - * @param d2 - * Date - * - * @return int number of days - */ - public static int getElapsedDias(Date d1, Date d2) { - return elapsed(d1, d2, Calendar.DATE); - } - - /** - * Elapsed months based on current time - * - * @param date - * Date - * - * @return int number of months - */ - public static int getElapsedMeses(Date date) { - return elapsed(date, Calendar.MONTH); - } - - /** - * Elapsed months based on two Date objects - * - * @param d1 - * Date - * @param d2 - * Date - * - * @return int number of months - */ - public static int getElapsedMeses(Date d1, Date d2) { - return elapsed(d1, d2, Calendar.MONTH); - } - - /** - * Elapsed years based on current time - * - * @param date - * Date - * - * @return int number of years - */ - public static int getElapsedAnos(Date date) { - return elapsed(date, Calendar.YEAR); - } - - /** - * Elapsed years based on two Date objects - * - * @param d1 - * Date - * @param d2 - * Date - * - * @return int number of years - */ - public static int getElapsedAnos(Date d1, Date d2) { - return elapsed(d1, d2, Calendar.YEAR); - } - - /** - * All elaspsed types - * - * @param g1 - * GregorianCalendar - * @param g2 - * GregorianCalendar - * @param type - * int (Calendar.FIELD_NAME) - * - * @return int number of elapsed "type" - */ - private static int elapsed(GregorianCalendar g1, GregorianCalendar g2, int type) { - GregorianCalendar gc1, gc2; - int elapsed = 0; - // Create copies since we will be clearing/adding - if (g2.after(g1)) { - gc2 = (GregorianCalendar) g2.clone(); - gc1 = (GregorianCalendar) g1.clone(); - } else { - gc2 = (GregorianCalendar) g1.clone(); - gc1 = (GregorianCalendar) g2.clone(); - } - if (type == Calendar.MONTH || type == Calendar.YEAR) { - gc1.clear(Calendar.DATE); - gc2.clear(Calendar.DATE); - } - if (type == Calendar.YEAR) { - gc1.clear(Calendar.MONTH); - gc2.clear(Calendar.MONTH); - } - while (gc1.before(gc2)) { - gc1.add(type, 1); - elapsed++; - } - return elapsed; - } - - /** - * All elaspsed types based on date and current Date - * - * @param date - * Date - * @param type - * int (Calendar.FIELD_NAME) - * - * @return int number of elapsed "type" - */ - private static int elapsed(Date date, int type) { - return elapsed(date, new Date(), type); - } - - /** - * All elaspsed types - * - * @param d1 - * Date - * @param d2 - * Date - * @param type - * int (Calendar.FIELD_NAME) - * - * @return int number of elapsed "type" - */ - private static int elapsed(Date d1, Date d2, int type) { - Calendar cal = Calendar.getInstance(); - cal.setTime(d1); - GregorianCalendar g1 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); - cal.setTime(d2); - GregorianCalendar g2 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); - return elapsed(g1, g2, type); - } - - public static Date getDateFromString(String data, String formato) throws java.text.ParseException { - Date d = new Date(); - DateFormat df = new SimpleDateFormat(formato); - - d = df.parse(data); - return d; - } - - public static java.sql.Timestamp getTimestampFromString(String data, String formato) throws java.text.ParseException { - Date d = new Date(); - DateFormat df = new SimpleDateFormat(formato); - - d = df.parse(data); - return new java.sql.Timestamp(d.getTime()); - } - - - - public static int compareDate(java.util.Date d1) { - return compareDate(d1, new java.util.Date()); - } - - /** - * Compara a data atual com d1 de forma que a chama fica compareOnlyDate(d1, new java.util.Date()); - * - * {@link #compareOnlyDate(Date, Date)} - */ - public static int compareOnlyDate(java.util.Date d1) { - return compareOnlyDate(d1, new java.util.Date()); - } - - /** - * não leva em consideração os segundos/minutos. Só é considerado o dia/mes/ano
- * - * Retorno igual a {@link #compareDate(Date, Date)} - */ - public static int compareOnlyDate(java.util.Date d1, java.util.Date d2) { - java.util.Calendar cal = Calendar.getInstance(); - cal.setTime(d1); - GregorianCalendar g1 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); - - java.util.Calendar cal2 = Calendar.getInstance(); - cal2.setTime(d2); - GregorianCalendar g2 = new GregorianCalendar(cal2.get(Calendar.YEAR), cal2.get(Calendar.MONTH), cal2.get(Calendar.DATE)); - return g1.compareTo(g2); - // return cal.compareTo(cal2); - } - - /** - * Retorna : - 0 se igual
- * - < 0 se d1 < d2
- * - > 0 se d1 > d2
- */ - public static int compareDate(java.util.Date d1, java.util.Date d2) { - java.util.Calendar cal = Calendar.getInstance(); - cal.setTime(d1); - java.util.Calendar cal2 = Calendar.getInstance(); - cal2.setTime(d2); - - return cal.compareTo(cal2); - } - - public static Integer getIntegerDate(java.util.Date d, String formato) { - if (formato.contains("/")) { - throw new IllegalArgumentException("O formato não deve conter o simbolo \\ "); - } - - String s = getStringDate(d, formato); - return Integer.parseInt(s); - } - - public static String getStringDate(java.util.Date d, String formato) { - if (d != null) { - DateFormat df = new SimpleDateFormat(formato); - return df.format(d); - } - return null; - } - - /** - * Formato 12 horas - * @param d - * @return - */ - public static String getStringDateHour(java.util.Date d) { - if (d != null) { - DateFormat df = new SimpleDateFormat(ddMMaaHHmm); - return df.format(d); - } - return null; - } - - /** - * Formato 24 horas - * @param d - * @return - */ - public static String getStringDate24Hour(java.util.Date d) { - if (d != null) { - DateFormat df = new SimpleDateFormat(ddMMaaHH24mm); - return df.format(d); - } - return null; - } - public static String getStringDate(java.util.Date d) { - try { - return getStringDate(d, "dd/MM/yyyy"); - }catch(Exception e) { - return null; - } - } - - public static String getStringDate(java.sql.Date d) { - return getStringDate(new java.util.Date(d.getTime())); - } - - public static String getStringCurrentDate(String formato) { - return getStringDate(new java.util.Date(), formato); - } - - public static String changeFormatStringDate(String date, String currentFormat, String newFormat) { - - try { - return DateUtil.getStringDate(DateUtil.getDateFromString(date, currentFormat), newFormat); - } catch (ParseException ex) { - LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); - } - return null; - } - - public static Integer changeFormatIntDate(Integer date, String currentFormat, String newFormat) { - - try { - return DateUtil.getIntegerDate(DateUtil.getDateFromString(String.valueOf(date), currentFormat), newFormat); - } catch (ParseException ex) { - LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); - } - return null; - } - - /** - * Retorna uma array onde [0] é hora, [1] é minuto - * - * @param hora - * @return - */ - private static int[] getArrayHora(Integer hora) { - - String strHora = String.valueOf(hora); - - int[] array = new int[2]; - - if (strHora.length() <= 2) { - array[0] = 0; - array[1] = Integer.parseInt(strHora); - } else if (strHora.length() == 3) { - array[0] = Integer.parseInt(strHora.substring(0, 1)); - array[1] = Integer.parseInt(strHora.substring(1)); - } else if (strHora.length() == 4) { - array[0] = Integer.parseInt(strHora.substring(0, 2)); - array[1] = Integer.parseInt(strHora.substring(2)); - } - - return array; - } - - public static java.util.Date changeFormatIntDate(Integer date, String currentFormat, Integer hora) { - - try { - if (currentFormat.equals("yMMdd") || currentFormat.equals("yyMMdd")) { - - currentFormat = "yyyyMMdd"; - String strData = String.valueOf(date); - - if (strData.length() == 5) { - strData = "200" + strData; - } else if (strData.length() == 6) { - strData = "20" + strData; - } - - date = Integer.parseInt(strData); - } - Date data = DateUtil.getDateFromString(String.valueOf(date), currentFormat); - - if (hora == null) { - return data; - } - - int horaArray[] = DateUtil.getArrayHora(hora); - Calendar c = Calendar.getInstance(); - c.setTime(data); - c.set(Calendar.HOUR_OF_DAY, horaArray[0]); - c.set(Calendar.MINUTE, horaArray[1]); - - return c.getTime(); - - } catch (ParseException ex) { - LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); - } - return null; - } - - public static java.util.Date changeFormatStringDate(String date, String currentFormat, Integer hora) { - - try { - if (currentFormat.equals("yMMdd") || currentFormat.equals("yyMMdd")) { - - currentFormat = "yyyyMMdd"; - - if (date.length() == 5) { - date = "200" + date; - } else if (date.length() == 6) { - date = "20" + date; - } - } - Date data = DateUtil.getDateFromString(String.valueOf(date), currentFormat); - - if (hora == null) { - return data; - } - - int horaArray[] = DateUtil.getArrayHora(hora); - Calendar c = Calendar.getInstance(); - c.setTime(data); - c.set(Calendar.HOUR_OF_DAY, horaArray[0]); - c.set(Calendar.MINUTE, horaArray[1]); - - return c.getTime(); - - } catch (ParseException ex) { - LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); - } - return null; - } - - public static int getIntHoraSRVP(Date data) { - Calendar c = Calendar.getInstance(); - c.setTime(data); - - String hora = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); - hora = (hora.length() < 2) ? "0" + hora : hora; - - String minuto = String.valueOf(c.get(Calendar.MINUTE)); - minuto = (minuto.length() < 2) ? "0" + minuto : minuto; - - return Integer.parseInt(hora + minuto); - } - - public static long getElapsedHoras(Date dtInic, Date dtFim) { - return (dtFim.getTime() - dtInic.getTime()) / (1000 * 60 * 60); - } - - public static long getElapsedMinutos(Date dtInic, Date dtFim) { - return (dtFim.getTime() - dtInic.getTime()) / (1000 * 60); - } - - /** - * Regresa los minutos pela hora inicial del sistema - * - * @param dtInic - * @param dtFim - * @return - */ - public static HoraSistema getHorasMinutosByInicio(Date dtFim) { - return new HoraSistema(dtFim); - } - - /** - * Verifica se o intervalo de datas dtStartCompare e dtEndCompare estão dentro do intervalo dtStart dtEnd - * - * @param dtStart - * @param dtEnd - * @param dtStartCompare - * @param dtEndCompare - * @return - */ - public static boolean intersectDate(Date dtStart, Date dtEnd, Date dtStartCompare, Date dtEndCompare) { - return TraslaparUtil.intersectDate(dtStart, dtEnd, dtStartCompare, dtEndCompare); - } - - public static void main(String ar[]) { - System.out.println(Arrays.asList(1,2,3,4,5).toString().replaceAll("[\\]\\[]", "")); - } - - public static void main2(String args[]) { - java.util.Date agora = new java.util.Date(); - - System.out.println(agora); - - Calendar c = Calendar.getInstance(); - c.setTime(agora); - - System.out.println(DateUtil.getIntHoraSRVP(agora)); - // c.add(Calendar.MINUTE, 60); - - System.out.println("final " + c.getTime()); - System.out.println("1 " + c.get(Calendar.HOUR_OF_DAY)); - - } - - /** - * Es la fecInicial del sistema para campos de horas - * - * @return - */ - public static Calendar getFecInicio() { - Calendar c = Calendar.getInstance(); - c.set(Calendar.YEAR, 1970); - c.set(Calendar.DAY_OF_MONTH, 1); - c.set(Calendar.MONTH, 0); - c.set(Calendar.HOUR_OF_DAY, 0); - c.set(Calendar.MINUTE, 0); - c.set(Calendar.MILLISECOND, 0); - c.set(Calendar.SECOND, 0); - - return c; - } - - /** - * Es la fecInicial del sistema con los campos de hora y minutos del parametro informado - * - * @return - */ - public static Calendar getFecInicio(Date horaMinuto) { - Calendar tmp = Calendar.getInstance(); - tmp.setTime(horaMinuto); - Calendar c = getFecInicio(); - c.set(Calendar.HOUR_OF_DAY, tmp.get(Calendar.HOUR_OF_DAY)); - c.set(Calendar.MINUTE, tmp.get(Calendar.MINUTE)); - - return c; - } - - /** - * Es la fecInicial del sistema con los campos de hora y minutos del parametro informado - * - * @return - */ - public static Calendar getFecInicio(Integer hora, Integer minuto) { - - Calendar c = getFecInicio(); - c.add(Calendar.HOUR_OF_DAY, hora); - c.add(Calendar.MINUTE, minuto); - - return c; - } - - /** - * Quita los segundos y milesegundos de la fecha - * - * @param fecha - * @return - */ - public static Date normalizar(Date fecha) { - GregorianCalendar gcalendar = new GregorianCalendar(); - gcalendar.setTime(fecha); - gcalendar.set(Calendar.SECOND, 0); - gcalendar.set(Calendar.MILLISECOND, 0); - - return gcalendar.getTime(); - } - - /** - * Quita los segundos, milesegundos, hora y minuto de la fecha - * - * @param fecha - * @return - */ - public static Date normalizarToFecha(Date fecha) { - GregorianCalendar gcalendar = new GregorianCalendar(); - gcalendar.setTime(fecha); - gcalendar.set(Calendar.SECOND, 0); - gcalendar.set(Calendar.MILLISECOND, 0); - gcalendar.set(Calendar.HOUR_OF_DAY, 0); - gcalendar.set(Calendar.MINUTE, 0); - - return gcalendar.getTime(); - } - - public static Date inicioFechaPeriodoMeses(Date periodo) { - return inicioFecha(periodo, true); - } - - public static Date fimFechaPeriodoMeses(Date periodo) { - return fimFecha(periodo, true); - } - - private static Date inicioFecha(Date fecha, boolean diaInicial) { - GregorianCalendar gcalendar = new GregorianCalendar(); - gcalendar.setTime(fecha); - int date = gcalendar.get(Calendar.DATE); - if (diaInicial) { - date = gcalendar.getActualMinimum(Calendar.DAY_OF_MONTH); - } - int month = gcalendar.get(Calendar.MONTH); - int year = gcalendar.get(Calendar.YEAR); - int hourOfDay = 00; - int minute = 00; - int second = 00; - - gcalendar.set(year, month, date, hourOfDay, minute, second); - return gcalendar.getTime(); - } - - private static Date fimFecha(Date fecha, boolean diaFinal) { - GregorianCalendar gcalendar = new GregorianCalendar(); - gcalendar.setTime(fecha); - - int date = gcalendar.get(Calendar.DATE); - if (diaFinal) { - date = gcalendar.getActualMaximum(Calendar.DAY_OF_MONTH); - } - int month = gcalendar.get(Calendar.MONTH); - int year = gcalendar.get(Calendar.YEAR); - int hourOfDay = 23; - int minute = 59; - int second = 59; - - gcalendar.set(year, month, date, hourOfDay, minute, second); - return gcalendar.getTime(); - } - - public static Date inicioFecha(Date fecha) { - return inicioFecha(fecha, false); - } - - public static Date fimFecha(Date fecha) { - return fimFecha(fecha, false); - } - - public static java.sql.Date inicioFechaSql(Date fecha) { - return new java.sql.Date(inicioFecha(fecha, false).getTime()); - } - - public static java.sql.Date fimFechaSql(Date fecha) { - return new java.sql.Date(fimFecha(fecha, false).getTime()); - } - - public static Date somarDias(Date data, int quantidadeDias) { - Integer dias = UM_DIA * quantidadeDias; - Calendar c = Calendar.getInstance(); - c.setTime(data); - c.add(Calendar.DAY_OF_MONTH, dias); - return c.getTime(); - } - - public static Date somarMinutos(Date data, int quantidadeMinutos) { - Calendar c = Calendar.getInstance(); - c.setTime(data); - c.add(Calendar.MINUTE, quantidadeMinutos); - return c.getTime(); - } - - /** - * Formato competencia: MM/YYYY - * - * @param competencia - * @return - */ - public static Set carregarDiasCompetencia(String competencia, Date dataMovimento) { - Set diasCompetencia = new TreeSet(); - if (competencia == null && dataMovimento != null) { - Integer diaInteger = new Integer(getStringDate(dataMovimento).split("/")[0]); - diasCompetencia.add(diaInteger); - } else { - String[] vetCompetencia = competencia.split("/"); - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.MONTH, Integer.valueOf(vetCompetencia[0]) - 1); - cal.set(Calendar.YEAR, Integer.valueOf(vetCompetencia[1])); - - for (int i = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) { - diasCompetencia.add(i); - } - } - return diasCompetencia; - } - - public static Set carregarDiasCompetencia(Date dataInicial, Date dataFinal) { - Set diasCompetencia = new TreeSet(); - - Calendar cal = Calendar.getInstance(); - - cal.setTime(dataInicial); - Integer diaInicial = cal.get(Calendar.DAY_OF_MONTH); - - cal.setTime(dataFinal); - Integer diaFinal = cal.get(Calendar.DAY_OF_MONTH); - - for (int i = diaInicial; i <= diaFinal; i++) { - diasCompetencia.add(i); - } - - return diasCompetencia; - } - - public static boolean isCompetenciaValida(String competencia) { - if (StringUtils.isNotBlank(competencia)) { - String mesString = competencia.split("/")[0].replaceAll("_", ""); - if (StringUtils.isNotBlank(mesString)) { - Integer mes = Integer.valueOf(competencia.split("/")[0]); - Integer minMes = Calendar.JANUARY + 1; - Integer maxMes = Calendar.DECEMBER + 1; - return mes >= minMes && mes <= maxMes; - } - } - - return false; - } - - public static Date getDataFinalCompetencia(String competencia) throws ParseException { - if (isCompetenciaValida(competencia)) { - Date dataInicio = getDateFromString("01/" + competencia, "dd/MM/yyyy"); - Calendar cal = Calendar.getInstance(LocaleUtil.getLocale()); - cal.setTime(dataInicio); - return getDateFromString(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + competencia, "dd/MM/yyyy"); - } - return null; - } - - public static Date getDataInicialCompetencia(String competencia) throws ParseException { - if (isCompetenciaValida(competencia)) { - return getDateFromString("01/" + competencia, "dd/MM/yyyy"); - } - return null; - } - - public static Date getYesterdayDate() { - Calendar calendar = Calendar.getInstance(); - calendar.add(Calendar.DATE, -1); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - Date yesterday = calendar.getTime(); - return yesterday; - } - - public static String getYesterdayDateString() { - DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); - Calendar cal = Calendar.getInstance(); - cal.add(Calendar.DATE, -1); - return dateFormat.format(cal.getTime()); - } - - public static Date getDataTempoDecorrido(String tempo) { - String[] tempoDecorrido = tempo.split(":"); - - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR, Integer.parseInt(tempoDecorrido[0].isEmpty() ? "0" : tempoDecorrido[0])); - calendar.set(Calendar.MINUTE, Integer.parseInt(tempoDecorrido[1].isEmpty() ? "0" : tempoDecorrido[1])); - - return calendar.getTime(); - } - - public static int diferencaEntreDatasEmdias(Date inicio, Date fim) { - long quantidadeHoras = ((fim.getTime() - inicio.getTime())); - return (int) (quantidadeHoras / DIA); - } - - public static String dataFormatoBPe(Date data){ - SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_T_HH_MM_SS_Z) { - private static final long serialVersionUID = 1L; - public StringBuffer format(Date date, StringBuffer toAppendTo, java.text.FieldPosition pos) { - StringBuffer toFix = super.format(date, toAppendTo, pos); - return toFix.insert(toFix.length()-2, ':'); - }; - }; - - return dateFormat.format(data); - } - - public static Date dateFormatBPe(final String data) { - try { - SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_T_HH_MM_SS_Z); - - String value = data; - - if (value.substring(value.length()-3,value.length()-2).equals(":")) { - StringBuilder dx = new StringBuilder(value); - dx = dx.delete(dx.length() - 3, dx.length() - 2); - value = dx.toString(); - } - - return sdf.parse(value); - } catch (ParseException e) { - return null; - } - } - - /** - * Verifica se a data1 é igual a data2 - * @param data1 - * @param data2 - * @return - */ - public static boolean isIgual(final Date data1, final Date data2) { - if(data1 == null || data2 == null) { - return false; - } - - Calendar c1 = Calendar.getInstance(); - c1.setTime(data1); - - Calendar c2 = Calendar.getInstance(); - c2.setTime(data2); - - return c1.equals(c2); - } - - /** - * Verifica se a data1 é igual ou menor que a data2 - * @param data1 - * @param data2 - * @return - */ - public static boolean isIgualORMenor(final Date data1, final Date data2) { - return isIgual(data1, data2) || isMenor(data1, data2); - } - - /** - * Verifica se a data1 é menor que a data2 - * @param data1 - * @param data2 - * @return - */ - public static boolean isMenor(final Date data1, final Date data2) { - if(data1 == null || data2 == null) { - return false; - } - - Calendar c1 = Calendar.getInstance(); - c1.setTime(data1); - - Calendar c2 = Calendar.getInstance(); - c2.setTime(data2); - - return c1.before(c2); - } - - /** - * Verifica se a data1 é igual ou maior que a data2 - * @param data1 - * @param data2 - * @return - */ - public static boolean isIgualORMaior(final Date data1, final Date data2) { - return isIgual(data1, data2) || isMaior(data1, data2); - } - - /** - * Verifica se a data1 é maior que a data2 - * @param data1 - * @param data2 - * @return - */ - public static boolean isMaior(final Date data1, final Date data2) { - if(data1 == null || data2 == null) { - return false; - } - - Calendar c1 = Calendar.getInstance(); - c1.setTime(data1); - - Calendar c2 = Calendar.getInstance(); - c2.setTime(data2); - - return c1.after(c2); - } - +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.rjconsultores.ventaboletos.utilerias; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.commons.lang.StringUtils; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; + +public final class DateUtil { + + public static Integer DIA = Integer.valueOf(1000 * 60 * 60 * 24); + public static Integer UM_DIA = Integer.valueOf(1); + + /** + * Formato 24Hs + */ + public static String ddMMaaHH24mm = "dd/MM/yyyy HH:mm"; + public static String ddMMaaHH24mmss = "dd/MM/yyyy HH:mm:ss"; + + /** + * Formato 12hs + */ + public static String ddMMaaHHmm = "dd/MM/yyyy hh:mm"; + public static String ddMMaaaa = "dd/MM/yyyy"; + public static String ddMMaa_anodoisdigitos = "dd/MM/yy"; + public static String ddMMaa_sembarra = "ddMMyy"; + public static String HHmm = "HH:mm"; + public static String formatGMT = "yyyy-MM-dd'T'HH:mm:ss"; + public static String formatJson = "yyyy-MM-dd'T'HH:mm:ss.SSS"; + public static String formatExp = "yyyyMMdd"; + public static String YYYY_MM_DD_T_HH_MM_SS_Z = "yyyy-MM-dd'T'HH:mm:ssZ"; + + /** + * No need for an instance + */ + private DateUtil() { + } + + /** + * Elapsed days based on current time + * + * @param date + * Date + * + * @return int number of days + */ + public static int getElapsedDias(Date date) { + return elapsed(date, Calendar.DATE); + } + + /** + * Elapsed days based on two Date objects + * + * @param d1 + * Date + * @param d2 + * Date + * + * @return int number of days + */ + public static int getElapsedDias(Date d1, Date d2) { + return elapsed(d1, d2, Calendar.DATE); + } + + /** + * Elapsed months based on current time + * + * @param date + * Date + * + * @return int number of months + */ + public static int getElapsedMeses(Date date) { + return elapsed(date, Calendar.MONTH); + } + + /** + * Elapsed months based on two Date objects + * + * @param d1 + * Date + * @param d2 + * Date + * + * @return int number of months + */ + public static int getElapsedMeses(Date d1, Date d2) { + return elapsed(d1, d2, Calendar.MONTH); + } + + /** + * Elapsed years based on current time + * + * @param date + * Date + * + * @return int number of years + */ + public static int getElapsedAnos(Date date) { + return elapsed(date, Calendar.YEAR); + } + + /** + * Elapsed years based on two Date objects + * + * @param d1 + * Date + * @param d2 + * Date + * + * @return int number of years + */ + public static int getElapsedAnos(Date d1, Date d2) { + return elapsed(d1, d2, Calendar.YEAR); + } + + /** + * All elaspsed types + * + * @param g1 + * GregorianCalendar + * @param g2 + * GregorianCalendar + * @param type + * int (Calendar.FIELD_NAME) + * + * @return int number of elapsed "type" + */ + private static int elapsed(GregorianCalendar g1, GregorianCalendar g2, int type) { + GregorianCalendar gc1, gc2; + int elapsed = 0; + // Create copies since we will be clearing/adding + if (g2.after(g1)) { + gc2 = (GregorianCalendar) g2.clone(); + gc1 = (GregorianCalendar) g1.clone(); + } else { + gc2 = (GregorianCalendar) g1.clone(); + gc1 = (GregorianCalendar) g2.clone(); + } + if (type == Calendar.MONTH || type == Calendar.YEAR) { + gc1.clear(Calendar.DATE); + gc2.clear(Calendar.DATE); + } + if (type == Calendar.YEAR) { + gc1.clear(Calendar.MONTH); + gc2.clear(Calendar.MONTH); + } + while (gc1.before(gc2)) { + gc1.add(type, 1); + elapsed++; + } + return elapsed; + } + + /** + * All elaspsed types based on date and current Date + * + * @param date + * Date + * @param type + * int (Calendar.FIELD_NAME) + * + * @return int number of elapsed "type" + */ + private static int elapsed(Date date, int type) { + return elapsed(date, new Date(), type); + } + + /** + * All elaspsed types + * + * @param d1 + * Date + * @param d2 + * Date + * @param type + * int (Calendar.FIELD_NAME) + * + * @return int number of elapsed "type" + */ + private static int elapsed(Date d1, Date d2, int type) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d1); + GregorianCalendar g1 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); + cal.setTime(d2); + GregorianCalendar g2 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); + return elapsed(g1, g2, type); + } + + public static Date getDateFromString(String data, String formato) throws java.text.ParseException { + Date d = new Date(); + DateFormat df = new SimpleDateFormat(formato); + + d = df.parse(data); + return d; + } + + public static java.sql.Timestamp getTimestampFromString(String data, String formato) throws java.text.ParseException { + Date d = new Date(); + DateFormat df = new SimpleDateFormat(formato); + + d = df.parse(data); + return new java.sql.Timestamp(d.getTime()); + } + + + + public static int compareDate(java.util.Date d1) { + return compareDate(d1, new java.util.Date()); + } + + /** + * Compara a data atual com d1 de forma que a chama fica compareOnlyDate(d1, new java.util.Date()); + * + * {@link #compareOnlyDate(Date, Date)} + */ + public static int compareOnlyDate(java.util.Date d1) { + return compareOnlyDate(d1, new java.util.Date()); + } + + /** + * não leva em consideração os segundos/minutos. Só é considerado o dia/mes/ano
+ * + * Retorno igual a {@link #compareDate(Date, Date)} + */ + public static int compareOnlyDate(java.util.Date d1, java.util.Date d2) { + java.util.Calendar cal = Calendar.getInstance(); + cal.setTime(d1); + GregorianCalendar g1 = new GregorianCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE)); + + java.util.Calendar cal2 = Calendar.getInstance(); + cal2.setTime(d2); + GregorianCalendar g2 = new GregorianCalendar(cal2.get(Calendar.YEAR), cal2.get(Calendar.MONTH), cal2.get(Calendar.DATE)); + return g1.compareTo(g2); + // return cal.compareTo(cal2); + } + + /** + * Retorna : - 0 se igual
+ * - < 0 se d1 < d2
+ * - > 0 se d1 > d2
+ */ + public static int compareDate(java.util.Date d1, java.util.Date d2) { + java.util.Calendar cal = Calendar.getInstance(); + cal.setTime(d1); + java.util.Calendar cal2 = Calendar.getInstance(); + cal2.setTime(d2); + + return cal.compareTo(cal2); + } + + public static Integer getIntegerDate(java.util.Date d, String formato) { + if (formato.contains("/")) { + throw new IllegalArgumentException("O formato não deve conter o simbolo \\ "); + } + + String s = getStringDate(d, formato); + return Integer.parseInt(s); + } + + public static String getStringDate(java.util.Date d, String formato) { + if (d != null) { + DateFormat df = new SimpleDateFormat(formato); + return df.format(d); + } + return null; + } + + /** + * Formato 12 horas + * @param d + * @return + */ + public static String getStringDateHour(java.util.Date d) { + if (d != null) { + DateFormat df = new SimpleDateFormat(ddMMaaHHmm); + return df.format(d); + } + return null; + } + + /** + * Formato 24 horas + * @param d + * @return + */ + public static String getStringDate24Hour(java.util.Date d) { + if (d != null) { + DateFormat df = new SimpleDateFormat(ddMMaaHH24mm); + return df.format(d); + } + return null; + } + public static String getStringDate(java.util.Date d) { + try { + return getStringDate(d, "dd/MM/yyyy"); + }catch(Exception e) { + return null; + } + } + + public static String getStringDate(java.sql.Date d) { + return getStringDate(new java.util.Date(d.getTime())); + } + + public static String getStringCurrentDate(String formato) { + return getStringDate(new java.util.Date(), formato); + } + + public static String changeFormatStringDate(String date, String currentFormat, String newFormat) { + + try { + return DateUtil.getStringDate(DateUtil.getDateFromString(date, currentFormat), newFormat); + } catch (ParseException ex) { + LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); + } + return null; + } + + public static Integer changeFormatIntDate(Integer date, String currentFormat, String newFormat) { + + try { + return DateUtil.getIntegerDate(DateUtil.getDateFromString(String.valueOf(date), currentFormat), newFormat); + } catch (ParseException ex) { + LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); + } + return null; + } + + /** + * Retorna uma array onde [0] é hora, [1] é minuto + * + * @param hora + * @return + */ + private static int[] getArrayHora(Integer hora) { + + String strHora = String.valueOf(hora); + + int[] array = new int[2]; + + if (strHora.length() <= 2) { + array[0] = 0; + array[1] = Integer.parseInt(strHora); + } else if (strHora.length() == 3) { + array[0] = Integer.parseInt(strHora.substring(0, 1)); + array[1] = Integer.parseInt(strHora.substring(1)); + } else if (strHora.length() == 4) { + array[0] = Integer.parseInt(strHora.substring(0, 2)); + array[1] = Integer.parseInt(strHora.substring(2)); + } + + return array; + } + + public static java.util.Date changeFormatIntDate(Integer date, String currentFormat, Integer hora) { + + try { + if (currentFormat.equals("yMMdd") || currentFormat.equals("yyMMdd")) { + + currentFormat = "yyyyMMdd"; + String strData = String.valueOf(date); + + if (strData.length() == 5) { + strData = "200" + strData; + } else if (strData.length() == 6) { + strData = "20" + strData; + } + + date = Integer.parseInt(strData); + } + Date data = DateUtil.getDateFromString(String.valueOf(date), currentFormat); + + if (hora == null) { + return data; + } + + int horaArray[] = DateUtil.getArrayHora(hora); + Calendar c = Calendar.getInstance(); + c.setTime(data); + c.set(Calendar.HOUR_OF_DAY, horaArray[0]); + c.set(Calendar.MINUTE, horaArray[1]); + + return c.getTime(); + + } catch (ParseException ex) { + LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); + } + return null; + } + + public static java.util.Date changeFormatStringDate(String date, String currentFormat, Integer hora) { + + try { + if (currentFormat.equals("yMMdd") || currentFormat.equals("yyMMdd")) { + + currentFormat = "yyyyMMdd"; + + if (date.length() == 5) { + date = "200" + date; + } else if (date.length() == 6) { + date = "20" + date; + } + } + Date data = DateUtil.getDateFromString(String.valueOf(date), currentFormat); + + if (hora == null) { + return data; + } + + int horaArray[] = DateUtil.getArrayHora(hora); + Calendar c = Calendar.getInstance(); + c.setTime(data); + c.set(Calendar.HOUR_OF_DAY, horaArray[0]); + c.set(Calendar.MINUTE, horaArray[1]); + + return c.getTime(); + + } catch (ParseException ex) { + LogManager.getLogger(DateUtil.class.getName()).log(Level.ERROR, "", ex); + } + return null; + } + + public static int getIntHoraSRVP(Date data) { + Calendar c = Calendar.getInstance(); + c.setTime(data); + + String hora = String.valueOf(c.get(Calendar.HOUR_OF_DAY)); + hora = (hora.length() < 2) ? "0" + hora : hora; + + String minuto = String.valueOf(c.get(Calendar.MINUTE)); + minuto = (minuto.length() < 2) ? "0" + minuto : minuto; + + return Integer.parseInt(hora + minuto); + } + + public static long getElapsedHoras(Date dtInic, Date dtFim) { + return (dtFim.getTime() - dtInic.getTime()) / (1000 * 60 * 60); + } + + public static long getElapsedMinutos(Date dtInic, Date dtFim) { + return (dtFim.getTime() - dtInic.getTime()) / (1000 * 60); + } + + /** + * Regresa los minutos pela hora inicial del sistema + * + * @param dtInic + * @param dtFim + * @return + */ + public static HoraSistema getHorasMinutosByInicio(Date dtFim) { + return new HoraSistema(dtFim); + } + + /** + * Verifica se o intervalo de datas dtStartCompare e dtEndCompare estão dentro do intervalo dtStart dtEnd + * + * @param dtStart + * @param dtEnd + * @param dtStartCompare + * @param dtEndCompare + * @return + */ + public static boolean intersectDate(Date dtStart, Date dtEnd, Date dtStartCompare, Date dtEndCompare) { + return TraslaparUtil.intersectDate(dtStart, dtEnd, dtStartCompare, dtEndCompare); + } + + public static void main(String ar[]) { + System.out.println(Arrays.asList(1,2,3,4,5).toString().replaceAll("[\\]\\[]", "")); + } + + public static void main2(String args[]) { + java.util.Date agora = new java.util.Date(); + + System.out.println(agora); + + Calendar c = Calendar.getInstance(); + c.setTime(agora); + + System.out.println(DateUtil.getIntHoraSRVP(agora)); + // c.add(Calendar.MINUTE, 60); + + System.out.println("final " + c.getTime()); + System.out.println("1 " + c.get(Calendar.HOUR_OF_DAY)); + + } + + /** + * Es la fecInicial del sistema para campos de horas + * + * @return + */ + public static Calendar getFecInicio() { + Calendar c = Calendar.getInstance(); + c.set(Calendar.YEAR, 1970); + c.set(Calendar.DAY_OF_MONTH, 1); + c.set(Calendar.MONTH, 0); + c.set(Calendar.HOUR_OF_DAY, 0); + c.set(Calendar.MINUTE, 0); + c.set(Calendar.MILLISECOND, 0); + c.set(Calendar.SECOND, 0); + + return c; + } + + /** + * Es la fecInicial del sistema con los campos de hora y minutos del parametro informado + * + * @return + */ + public static Calendar getFecInicio(Date horaMinuto) { + Calendar tmp = Calendar.getInstance(); + tmp.setTime(horaMinuto); + Calendar c = getFecInicio(); + c.set(Calendar.HOUR_OF_DAY, tmp.get(Calendar.HOUR_OF_DAY)); + c.set(Calendar.MINUTE, tmp.get(Calendar.MINUTE)); + + return c; + } + + /** + * Es la fecInicial del sistema con los campos de hora y minutos del parametro informado + * + * @return + */ + public static Calendar getFecInicio(Integer hora, Integer minuto) { + + Calendar c = getFecInicio(); + c.add(Calendar.HOUR_OF_DAY, hora); + c.add(Calendar.MINUTE, minuto); + + return c; + } + + /** + * Quita los segundos y milesegundos de la fecha + * + * @param fecha + * @return + */ + public static Date normalizar(Date fecha) { + GregorianCalendar gcalendar = new GregorianCalendar(); + gcalendar.setTime(fecha); + gcalendar.set(Calendar.SECOND, 0); + gcalendar.set(Calendar.MILLISECOND, 0); + + return gcalendar.getTime(); + } + + /** + * Quita los segundos, milesegundos, hora y minuto de la fecha + * + * @param fecha + * @return + */ + public static Date normalizarToFecha(Date fecha) { + GregorianCalendar gcalendar = new GregorianCalendar(); + gcalendar.setTime(fecha); + gcalendar.set(Calendar.SECOND, 0); + gcalendar.set(Calendar.MILLISECOND, 0); + gcalendar.set(Calendar.HOUR_OF_DAY, 0); + gcalendar.set(Calendar.MINUTE, 0); + + return gcalendar.getTime(); + } + + public static Date inicioFechaPeriodoMeses(Date periodo) { + return inicioFecha(periodo, true); + } + + public static Date fimFechaPeriodoMeses(Date periodo) { + return fimFecha(periodo, true); + } + + private static Date inicioFecha(Date fecha, boolean diaInicial) { + GregorianCalendar gcalendar = new GregorianCalendar(); + gcalendar.setTime(fecha); + int date = gcalendar.get(Calendar.DATE); + if (diaInicial) { + date = gcalendar.getActualMinimum(Calendar.DAY_OF_MONTH); + } + int month = gcalendar.get(Calendar.MONTH); + int year = gcalendar.get(Calendar.YEAR); + int hourOfDay = 00; + int minute = 00; + int second = 00; + + gcalendar.set(year, month, date, hourOfDay, minute, second); + return gcalendar.getTime(); + } + + private static Date fimFecha(Date fecha, boolean diaFinal) { + GregorianCalendar gcalendar = new GregorianCalendar(); + gcalendar.setTime(fecha); + + int date = gcalendar.get(Calendar.DATE); + if (diaFinal) { + date = gcalendar.getActualMaximum(Calendar.DAY_OF_MONTH); + } + int month = gcalendar.get(Calendar.MONTH); + int year = gcalendar.get(Calendar.YEAR); + int hourOfDay = 23; + int minute = 59; + int second = 59; + + gcalendar.set(year, month, date, hourOfDay, minute, second); + return gcalendar.getTime(); + } + + public static Date inicioFecha(Date fecha) { + return inicioFecha(fecha, false); + } + + public static Date fimFecha(Date fecha) { + return fimFecha(fecha, false); + } + + public static java.sql.Date inicioFechaSql(Date fecha) { + return new java.sql.Date(inicioFecha(fecha, false).getTime()); + } + + public static java.sql.Date fimFechaSql(Date fecha) { + return new java.sql.Date(fimFecha(fecha, false).getTime()); + } + + public static Date somarDias(Date data, int quantidadeDias) { + Integer dias = UM_DIA * quantidadeDias; + Calendar c = Calendar.getInstance(); + c.setTime(data); + c.add(Calendar.DAY_OF_MONTH, dias); + return c.getTime(); + } + + public static Date somarMinutos(Date data, int quantidadeMinutos) { + Calendar c = Calendar.getInstance(); + c.setTime(data); + c.add(Calendar.MINUTE, quantidadeMinutos); + return c.getTime(); + } + + /** + * Formato competencia: MM/YYYY + * + * @param competencia + * @return + */ + public static Set carregarDiasCompetencia(String competencia, Date dataMovimento) { + Set diasCompetencia = new TreeSet(); + if (competencia == null && dataMovimento != null) { + Integer diaInteger = new Integer(getStringDate(dataMovimento).split("/")[0]); + diasCompetencia.add(diaInteger); + } else { + String[] vetCompetencia = competencia.split("/"); + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.MONTH, Integer.valueOf(vetCompetencia[0]) - 1); + cal.set(Calendar.YEAR, Integer.valueOf(vetCompetencia[1])); + + for (int i = 1; i <= cal.getActualMaximum(Calendar.DAY_OF_MONTH); i++) { + diasCompetencia.add(i); + } + } + return diasCompetencia; + } + + public static Set carregarDiasCompetencia(Date dataInicial, Date dataFinal) { + Set diasCompetencia = new TreeSet(); + + Calendar cal = Calendar.getInstance(); + + cal.setTime(dataInicial); + Integer diaInicial = cal.get(Calendar.DAY_OF_MONTH); + + cal.setTime(dataFinal); + Integer diaFinal = cal.get(Calendar.DAY_OF_MONTH); + + for (int i = diaInicial; i <= diaFinal; i++) { + diasCompetencia.add(i); + } + + return diasCompetencia; + } + + public static boolean isCompetenciaValida(String competencia) { + if (StringUtils.isNotBlank(competencia)) { + String mesString = competencia.split("/")[0].replaceAll("_", ""); + if (StringUtils.isNotBlank(mesString)) { + Integer mes = Integer.valueOf(competencia.split("/")[0]); + Integer minMes = Calendar.JANUARY + 1; + Integer maxMes = Calendar.DECEMBER + 1; + return mes >= minMes && mes <= maxMes; + } + } + + return false; + } + + public static Date getDataFinalCompetencia(String competencia) throws ParseException { + if (isCompetenciaValida(competencia)) { + Date dataInicio = getDateFromString("01/" + competencia, "dd/MM/yyyy"); + Calendar cal = Calendar.getInstance(LocaleUtil.getLocale()); + cal.setTime(dataInicio); + return getDateFromString(cal.getActualMaximum(Calendar.DAY_OF_MONTH) + "/" + competencia, "dd/MM/yyyy"); + } + return null; + } + + public static Date getDataInicialCompetencia(String competencia) throws ParseException { + if (isCompetenciaValida(competencia)) { + return getDateFromString("01/" + competencia, "dd/MM/yyyy"); + } + return null; + } + + public static Date getYesterdayDate() { + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DATE, -1); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + Date yesterday = calendar.getTime(); + return yesterday; + } + + public static String getYesterdayDateString() { + DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); + Calendar cal = Calendar.getInstance(); + cal.add(Calendar.DATE, -1); + return dateFormat.format(cal.getTime()); + } + + public static Date getDataTempoDecorrido(String tempo) { + String[] tempoDecorrido = tempo.split(":"); + + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR, Integer.parseInt(tempoDecorrido[0].isEmpty() ? "0" : tempoDecorrido[0])); + calendar.set(Calendar.MINUTE, Integer.parseInt(tempoDecorrido[1].isEmpty() ? "0" : tempoDecorrido[1])); + + return calendar.getTime(); + } + + public static int diferencaEntreDatasEmdias(Date inicio, Date fim) { + long quantidadeHoras = ((fim.getTime() - inicio.getTime())); + return (int) (quantidadeHoras / DIA); + } + + public static String dataFormatoBPe(Date data){ + SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_T_HH_MM_SS_Z) { + private static final long serialVersionUID = 1L; + public StringBuffer format(Date date, StringBuffer toAppendTo, java.text.FieldPosition pos) { + StringBuffer toFix = super.format(date, toAppendTo, pos); + return toFix.insert(toFix.length()-2, ':'); + }; + }; + + return dateFormat.format(data); + } + + public static Date dateFormatBPe(final String data) { + try { + SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD_T_HH_MM_SS_Z); + + String value = data; + + if (value.substring(value.length()-3,value.length()-2).equals(":")) { + StringBuilder dx = new StringBuilder(value); + dx = dx.delete(dx.length() - 3, dx.length() - 2); + value = dx.toString(); + } + + return sdf.parse(value); + } catch (ParseException e) { + return null; + } + } + + /** + * Verifica se a data1 é igual a data2 + * @param data1 + * @param data2 + * @return + */ + public static boolean isIgual(final Date data1, final Date data2) { + if(data1 == null || data2 == null) { + return false; + } + + Calendar c1 = Calendar.getInstance(); + c1.setTime(data1); + + Calendar c2 = Calendar.getInstance(); + c2.setTime(data2); + + return c1.equals(c2); + } + + /** + * Verifica se a data1 é igual ou menor que a data2 + * @param data1 + * @param data2 + * @return + */ + public static boolean isIgualORMenor(final Date data1, final Date data2) { + return isIgual(data1, data2) || isMenor(data1, data2); + } + + /** + * Verifica se a data1 é menor que a data2 + * @param data1 + * @param data2 + * @return + */ + public static boolean isMenor(final Date data1, final Date data2) { + if(data1 == null || data2 == null) { + return false; + } + + Calendar c1 = Calendar.getInstance(); + c1.setTime(data1); + + Calendar c2 = Calendar.getInstance(); + c2.setTime(data2); + + return c1.before(c2); + } + + /** + * Verifica se a data1 é igual ou maior que a data2 + * @param data1 + * @param data2 + * @return + */ + public static boolean isIgualORMaior(final Date data1, final Date data2) { + return isIgual(data1, data2) || isMaior(data1, data2); + } + + /** + * Verifica se a data1 é maior que a data2 + * @param data1 + * @param data2 + * @return + */ + public static boolean isMaior(final Date data1, final Date data2) { + if(data1 == null || data2 == null) { + return false; + } + + Calendar c1 = Calendar.getInstance(); + c1.setTime(data1); + + Calendar c2 = Calendar.getInstance(); + c2.setTime(data2); + + return c1.after(c2); + } + + /*** + * retorna dia da semana da data Domingo 1, até sábado 7 + * + * @param dataCobranca + * @return + */ + public static int getDiaDaSemana(Date dataCobranca) { + Calendar cal = Calendar.getInstance(); + cal.setTime(dataCobranca); + + return cal.get(Calendar.DAY_OF_WEEK); + } + } \ No newline at end of file