Merge pull request 'fixes bug #AL-2734' (!86) from AL-2734 into master

Reviewed-on: adm/ModelWeb#86
Reviewed-by: Valdir Cordeiro <valdir.cordeiro@totvs.com.br>
master
Valdir Cordeiro 2023-08-02 18:34:12 +00:00
commit 2668b47e78
2 changed files with 442 additions and 381 deletions

View File

@ -443,332 +443,43 @@ public class CorridaServiceImpl implements CorridaService {
@SuppressWarnings("deprecation")
private Corrida generarCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, boolean isPisoExtra, Boolean isFeriado) {
GregorianCalendar calendario = new GregorianCalendar();
calendario.setTime(dataGeracao);
Integer diaSemana = calendario.get(Calendar.DAY_OF_WEEK);
Corrida corrida = null;
if (!vigenciaValida(esquemaCorrida, dataGeracao)) {
log.info("vigencia invalida=" + dataGeracao);
return null;
}
if (!((esquemaCorrida.getStatusCorrida() != null) && (esquemaCorrida.getStatusCorrida().equals("A") || esquemaCorrida.getStatusCorrida().equals("L")))) {
log.info("status corrida invalido=" + esquemaCorrida.getStatusCorrida());
return null;
}
if (esquemaCorrida.getIndDiaSimDiaNao() == null || esquemaCorrida.getIndDiaSimDiaNao() == Boolean.FALSE) {
if (!temCorridaDiaSemana(diaSemana, esquemaCorrida, isFeriado)) {
log.info("dia semana no valido=" + diaSemana);
return null;
}
}
if (!tramoServicioService.existenTiemposTramosEsquema(esquemaCorrida.getEsquemacorridaId())) {
log.info("nao foi cadastrado o tempo de todos os trechos do esquema corrida=" + esquemaCorrida.getEsquemacorridaId());
return 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));
if (esquemaCorrida.getIndDiaSimDiaNao() != null && 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 null;
}
}
if (corridaDAO.existe(id)) {
log.info("corrida existe = " + numCorrida + ";" + ruta.getDescruta() + ";" + DateUtil.getStringDate(dataGeracao) + ";" + DateUtil.getStringDate(horario, "HH:mm") + ";" + claseServicio.getDescclase() + ";" + marca.getDescmarca() + " Piso: " + isPisoExtra);
return null;
}
// 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 = 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);
}
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.setRuta(corridaCtrl.getRuta());
corrida.setRolOperativo(esquemaCorrida.getRolOperativo());
corrida.setZona(null);
// corrida Tramo:
List<CorridaTramo> lsCorridaTramo = new ArrayList<CorridaTramo>();
Integer numSec = 1;
List<EsquemaTramo> lsEsquemaTramo = esquemaTramoService.obtenerPorEsquemaCorridaOrderNumSec(esquemaCorrida);
Date horaChegadaAnterior = null;
Date husoHorVeranoLlegadaAnterior = null;
if (lsEsquemaTramo == null) {
return null;
}
EsquemaTramo primeiro = lsEsquemaTramo.get(0);
Parada origem = primeiro.getTramo().getOrigem();
if (origem == null) {
return null;
}
corrida.setOrigem(origem);
EsquemaTramo ultimo = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1);
Parada destino = ultimo.getTramo().getDestino();
if (destino == null) {
return null;
}
corrida.setDestino(destino);
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());
if(!realizaValidacoesGerais(esquemaCorrida, dataGeracao, diaSemana, isFeriado, ruta, id, numCorrida, horario, claseServicio, marca, isPisoExtra, lsEsquemaTramo)) {
return null;
}
for (EsquemaTramo esquemaTramo : lsEsquemaTramo) {
CorridaTramo corridaTramo = new CorridaTramo();
corridaTramo.setAutobus(esquemaCorrida.getAutoBus()!= null ? esquemaCorrida.getAutoBus() : null);
corridaTramo.setConductor(null);
corridaTramo.setConductor1(null);
corridaTramo.setPlataforma(esquemaTramo.getPlataforma());
corridaTramo.setTipoPassagem(esquemaTramo.getTipoPassagem());
Parada origemCorrida = lsEsquemaTramo.get(0).getTramo().getOrigem();
Parada destinoCorrida = lsEsquemaTramo.get(lsEsquemaTramo.size() - 1).getTramo().getDestino();
corridaTramo.setTiempoEstancia(esquemaTramo.getTiempoEstancia());
/* 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*/
// numSec: 1-2, 2-3, 3-4...
corridaTramo.setNumsecorigen(numSec.shortValue());
numSec = numSec + 1;
corridaTramo.setNumsecdestino(numSec.shortValue());
CorridaCtrl corridaCtrl = criaCorridaCtrl(isPisoExtra, ruta, claseServicio, marca, horario, numCorrida);
Calendar salida = Calendar.getInstance();
Date fecHorSalida = calcularFechorsalida(esquemaTramo, dataGeracao, horaChegadaAnterior, esquemaTramo.getTiempoEstancia());
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);
corridaTramo.setFechorsalida(salida.getTime());
Calendar llegada = Calendar.getInstance();
Date fecHorallegada = calcularFechorllegada(esquemaTramo, corrida.getClaseServicio(), dataGeracao, fecHorSalida);
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);
corridaTramo.setFechorllegada(llegada.getTime());
horaChegadaAnterior = fecHorallegada;
corridaTramo.setFechortarjetaviaje(null);
corridaTramo.setNodo(corridaCtrl.getNodo());
corridaTramo.setNumsecuencia(esquemaTramo.getNumsecuencia());
Tramo tramo = esquemaTramo.getTramo();
if (tramo != null) {
corridaTramo.setOrigem(tramo.getOrigem());
corridaTramo.setDestino(tramo.getDestino());
}
corridaTramo.setTramo(tramo);
corridaTramo.setUsuariotarjetaviajeId(null);
Date excepcionTiempo = arreglaExcepcionTiempo(corridaTramo, corrida.getClaseServicio());
if (excepcionTiempo != null) {
corridaTramo.setFechorllegada(excepcionTiempo);
horaChegadaAnterior = excepcionTiempo;
}
if (esquemaCorrida.getStatusCorrida().equals("A")) {
corridaTramo.setActivo(ActivoUtil.ATIVO);
} else if (esquemaCorrida.getStatusCorrida().equals("L")) {
corridaTramo.setActivo(ActivoUtil.INATIVO);
}
//
corridaTramo.setFecmodif(Calendar.getInstance().getTime());
if (UsuarioLogado.getUsuarioLogado() != null) {
corridaTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
}
corridaTramo.setCorrida(corrida);
corridaTramo.setFechorSalidaOriginal(fecHorSalida);
if (husoHorVeranoLlegadaAnterior == null) {
corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida());
} else {
// Ajusta tambem o tempo de instancia do calculo do horario de verao
if (esquemaTramo.getTiempoEstancia() != null) {
GregorianCalendar tmp = new GregorianCalendar();
tmp.setTime(husoHorVeranoLlegadaAnterior);
tmp.add(Calendar.MINUTE, esquemaTramo.getTiempoEstancia().getMinutes());
tmp.add(Calendar.HOUR_OF_DAY, esquemaTramo.getTiempoEstancia().getHours());
log.debug("Tempo Recorrido H + Estancia: " + sdf.format(tmp.getTime()));
husoHorVeranoLlegadaAnterior = tmp.getTime();
}
corridaTramo.setFechorsalidaH(husoHorVeranoLlegadaAnterior);
}
husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada(esquemaTramo, corridaTramo);
if (husoHorVeranoLlegadaAnterior != null) {
corridaTramo.setFechorllegadaH(husoHorVeranoLlegadaAnterior);
corridaTramo.setFechorSalidaOriginalH(husoHorVeranoLlegadaAnterior);
} else {
corridaTramo.setFechorllegadaH(corridaTramo.getFechorllegada());
corridaTramo.setFechorSalidaOriginalH(corridaTramo.getFechorSalidaOriginal());
}
if (numSec == 1) {
corrida.setFechorSalidaOriginalH(corridaTramo.getFechorsalidaH());
}
lsCorridaTramo.add(corridaTramo);
}
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);
corrida = criaCorrida(esquemaCorrida, dataGeracao, id, lsEsquemaTramo, origemCorrida, destinoCorrida,
corridaCtrl);
cantCorridaGenerada++;
List<EsquemaAsiento> 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);
}
}
criaAssentoExclusivo(esquemaCorrida, corrida);
} catch (Exception ex) {
log.error("", ex);
@ -777,6 +488,354 @@ public class CorridaServiceImpl implements CorridaService {
return corrida;
}
private Corrida criaCorrida(EsquemaCorrida esquemaCorrida, Date dataGeracao, Corrida.Id id,
List<EsquemaTramo> lsEsquemaTramo, Parada origemCorrida, Parada destinoCorrida, CorridaCtrl corridaCtrl) {
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<CorridaTramo> lsCorridaTramo = criaCorridaTramoList(esquemaCorrida, dataGeracao, corrida, lsEsquemaTramo, corridaCtrl);
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 List<CorridaTramo> criaCorridaTramoList(EsquemaCorrida esquemaCorrida, Date dataGeracao, Corrida corrida,
List<EsquemaTramo> lsEsquemaTramo, CorridaCtrl corridaCtrl) {
List<CorridaTramo> lsCorridaTramo = new ArrayList<CorridaTramo>();
Date horaChegadaAnterior = null;
Date husoHorVeranoLlegadaAnterior = null;
Integer numSec = 1;
for (EsquemaTramo esquemaTramo : lsEsquemaTramo) {
CorridaTramo corridaTramo = new CorridaTramo();
corridaTramo.setAutobus(esquemaCorrida.getAutoBus()!= null ? esquemaCorrida.getAutoBus() : null);
corridaTramo.setConductor(null);
corridaTramo.setConductor1(null);
corridaTramo.setPlataforma(esquemaTramo.getPlataforma());
corridaTramo.setTipoPassagem(esquemaTramo.getTipoPassagem());
corridaTramo.setTiempoEstancia(esquemaTramo.getTiempoEstancia());
// numSec: 1-2, 2-3, 3-4...
corridaTramo.setNumsecorigen(numSec.shortValue());
numSec = numSec + 1;
corridaTramo.setNumsecdestino(numSec.shortValue());
Date fecHorSalida = calcularFechorsalida(esquemaTramo, dataGeracao, horaChegadaAnterior, esquemaTramo.getTiempoEstancia());
corridaTramo.setFechorsalida( getCalendarFechorSalida(fecHorSalida).getTime());
Date fecHorallegada = calcularFechorllegada(esquemaTramo, corrida.getClaseServicio(), dataGeracao, fecHorSalida);
corridaTramo.setFechorllegada(getCalendarFechorllegada(fecHorallegada).getTime());
horaChegadaAnterior = fecHorallegada;
corridaTramo.setFechortarjetaviaje(null);
corridaTramo.setNodo(corridaCtrl.getNodo());
corridaTramo.setNumsecuencia(esquemaTramo.getNumsecuencia());
Tramo tramo = esquemaTramo.getTramo();
if (tramo != null) {
corridaTramo.setOrigem(tramo.getOrigem());
corridaTramo.setDestino(tramo.getDestino());
}
corridaTramo.setTramo(tramo);
corridaTramo.setUsuariotarjetaviajeId(null);
Date excepcionTiempo = arreglaExcepcionTiempo(corridaTramo, corrida.getClaseServicio());
if (excepcionTiempo != null) {
corridaTramo.setFechorllegada(excepcionTiempo);
horaChegadaAnterior = excepcionTiempo;
}
if (esquemaCorrida.getStatusCorrida().equals("A")) {
corridaTramo.setActivo(ActivoUtil.ATIVO);
} else if (esquemaCorrida.getStatusCorrida().equals("L")) {
corridaTramo.setActivo(ActivoUtil.INATIVO);
}
//
corridaTramo.setFecmodif(Calendar.getInstance().getTime());
if (UsuarioLogado.getUsuarioLogado() != null) {
corridaTramo.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
}
corridaTramo.setCorrida(corrida);
corridaTramo.setFechorSalidaOriginal(fecHorSalida);
if (husoHorVeranoLlegadaAnterior == null) {
corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida());
} else {
// Ajusta tambem o tempo de instancia do calculo do horario de verao
if (esquemaTramo.getTiempoEstancia() != null) {
GregorianCalendar tmp = new GregorianCalendar();
tmp.setTime(husoHorVeranoLlegadaAnterior);
tmp.add(Calendar.MINUTE, esquemaTramo.getTiempoEstancia().getMinutes());
tmp.add(Calendar.HOUR_OF_DAY, esquemaTramo.getTiempoEstancia().getHours());
log.debug("Tempo Recorrido H + Estancia: " + sdf.format(tmp.getTime()));
husoHorVeranoLlegadaAnterior = tmp.getTime();
}
corridaTramo.setFechorsalidaH(husoHorVeranoLlegadaAnterior);
}
husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada(esquemaTramo, corridaTramo);
if (husoHorVeranoLlegadaAnterior != null) {
corridaTramo.setFechorllegadaH(husoHorVeranoLlegadaAnterior);
corridaTramo.setFechorSalidaOriginalH(husoHorVeranoLlegadaAnterior);
} else {
corridaTramo.setFechorllegadaH(corridaTramo.getFechorllegada());
corridaTramo.setFechorSalidaOriginalH(corridaTramo.getFechorSalidaOriginal());
}
if (numSec == 1) {
corrida.setFechorSalidaOriginalH(corridaTramo.getFechorsalidaH());
}
lsCorridaTramo.add(corridaTramo);
}
return lsCorridaTramo;
}
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<EsquemaTramo> 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<EsquemaAsiento> 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();
@ -898,9 +957,7 @@ public class CorridaServiceImpl implements CorridaService {
corridaPisoExtra = null;
corridaPisoExtra2 = null;
if (corrida == null) {// Si no genera la corrida, no va a
// generar el rebote
log.info("No fue generado corrida. Esquema " + esquemaCorrida.getEsquemacorridaId() + " Data" + dataGeracao);
if (corrida == null) {
corridaGerada = false;
continue;
}
@ -957,78 +1014,8 @@ public class CorridaServiceImpl implements CorridaService {
}
if (esquemaCorrida.getEsquemaCorridaRebote() != null) {
log.info("Corrida Rebote=" + esquemaCorrida.getEsquemacorridaId());
Corrida corridaRebote = generarCorrida(esquemaCorrida.getEsquemaCorridaRebote(), dataGeracao, false, isFeriado);
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);
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);
}
criaCorridaRebote(dataGeracao, corrida, corridaPisoExtra, corridaPisoExtra2, esquemaCorrida,
isFeriado);
}
@ -1039,7 +1026,7 @@ public class CorridaServiceImpl implements CorridaService {
status = transactionManager.getTransaction(def);
}
} // for (EsquemaCorrida esquemaCorrida : lsEsquemaCorrida)
}
} finally {
if ((status != null) && (!status.isCompleted())) {
transactionManager.commit(status);
@ -1055,6 +1042,76 @@ public class CorridaServiceImpl implements CorridaService {
return corridaGerada;
}
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);
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);
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<ReservaEspecialCliente> reservaEspecialClienteList = reservaEspecialClientService.bucarReservaEspecialByCorridaId(corrida.getId().getCorridaId().longValue()) ;

View File

@ -304,7 +304,11 @@ public final class DateUtil {
return null;
}
public static String getStringDate(java.util.Date d) {
return getStringDate(d, "dd/MM/yyyy");
try {
return getStringDate(d, "dd/MM/yyyy");
}catch(Exception e) {
return null;
}
}
public static String getStringDate(java.sql.Date d) {