diff --git a/src/com/rjconsultores/ventaboletos/dao/hibernate/CorridaHibernateDAO.java b/src/com/rjconsultores/ventaboletos/dao/hibernate/CorridaHibernateDAO.java index ec3461125..f7c25781f 100644 --- a/src/com/rjconsultores/ventaboletos/dao/hibernate/CorridaHibernateDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/hibernate/CorridaHibernateDAO.java @@ -26,12 +26,14 @@ import com.rjconsultores.ventaboletos.dao.sqlbuilder.SQLBuilder; import com.rjconsultores.ventaboletos.entidad.ClaseServicio; import com.rjconsultores.ventaboletos.entidad.Corrida; import com.rjconsultores.ventaboletos.entidad.Corrida.Id; +import com.rjconsultores.ventaboletos.entidad.CorridaTramo; import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus; import com.rjconsultores.ventaboletos.entidad.Estado; import com.rjconsultores.ventaboletos.entidad.Marca; import com.rjconsultores.ventaboletos.entidad.Parada; import com.rjconsultores.ventaboletos.entidad.Ruta; import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties; +import com.rjconsultores.ventaboletos.utilerias.DateUtil; /** * @@ -46,6 +48,7 @@ public class CorridaHibernateDAO extends GenericHibernateDAO corridas) { - - List> corridaIdList = new ArrayList>(); - List> fecorridaList = new ArrayList>(); - - ArrayList corridaIds = new ArrayList(); - ArrayList fecorridas = new ArrayList(); - - Integer cont = NumberUtils.INTEGER_ONE; - for (Corrida corrida : corridas) { - - if (cont < MAX_ARRAY) { - corridaIds.add(corrida.getId().getCorridaId()); - fecorridas.add(corrida.getId().getFeccorrida()); - cont++; - } else { - cont = NumberUtils.INTEGER_ONE; - corridaIdList.add(corridaIds); - fecorridaList.add(fecorridas); - - corridaIds = new ArrayList(); - fecorridas = new ArrayList(); - - corridaIds.add(corrida.getId().getCorridaId()); - fecorridas.add(corrida.getId().getFeccorrida()); - - } - } + List tramos = null; - corridaIdList.add(corridaIds); - fecorridaList.add(fecorridas); - - if (corridaIdList.size() == fecorridaList.size()) { - for (int i = 0; i < corridaIdList.size(); i++) { - - try { - Query queryCorrida = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaFecHusoFecVerano()); - queryCorrida.setParameterList("corridaId", corridaIdList.get(i)); - queryCorrida.setParameterList("feccorrida", fecorridaList.get(i)); - queryCorrida.executeUpdate(); - - Query queryCorridaTramo = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaTramoFecHusoFecVerano()); - queryCorridaTramo.setParameterList("corridaId", corridaIdList.get(i)); - queryCorridaTramo.setParameterList("feccorrida", fecorridaList.get(i)); - queryCorridaTramo.executeUpdate(); - - } catch (Exception e) { - e.printStackTrace(); + Integer corridatramoId = 0; + Date fechorSalidaOriginal = null; + Date fechorsalida = null; + Date fechorllegada = null; + Integer tiempoHorHusoOrigem = Integer.valueOf(0); + Integer tiempoHorVeranoOrigem = Integer.valueOf(0); + Integer tiempoHorHusoDestino = Integer.valueOf(0); + Integer tiempoHorVeranoDestino = Integer.valueOf(0); + + Date husoHorVeranoLlegadaAnterior = null; + + Date fechorSalidaOriginalUpdate = null; + Date fechorsalidaUpdate = null; + Date fechorllegadaUpdate = null; + + for (Corrida corrida : corridas) { + tramos = buscarTramosCorrida(corrida); + + husoHorVeranoLlegadaAnterior = null; + + for (Object[] objeto : tramos) { + corridatramoId = Integer.valueOf(objeto[0].toString()); + fechorSalidaOriginal = (Date) objeto[2]; + fechorsalida = (Date) objeto[3]; + fechorllegada = (Date) objeto[4]; + tiempoHorHusoOrigem = Integer.valueOf(objeto[5].toString()); + tiempoHorVeranoOrigem = Integer.valueOf(objeto[6].toString()); + tiempoHorHusoDestino = Integer.valueOf(objeto[7].toString()); + tiempoHorVeranoDestino = Integer.valueOf(objeto[8].toString()); + + if (husoHorVeranoLlegadaAnterior == null){ + fechorSalidaOriginalUpdate = fechorSalidaOriginal; + fechorsalidaUpdate = fechorsalida; + }else{ + fechorSalidaOriginalUpdate = husoHorVeranoLlegadaAnterior; + fechorsalidaUpdate = husoHorVeranoLlegadaAnterior; } + + husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada( + fechorsalida, + fechorllegada, + fechorsalidaUpdate, + tiempoHorHusoOrigem + tiempoHorVeranoOrigem, + tiempoHorHusoDestino + tiempoHorVeranoDestino); + + if (husoHorVeranoLlegadaAnterior != null){ + fechorllegadaUpdate = husoHorVeranoLlegadaAnterior; + }else{ + fechorllegadaUpdate = fechorllegada; + } + + Query queryCorridaTramo = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaTramoFecHusoFecVerano()); + queryCorridaTramo.setTimestamp("fechorSalidaOriginalH", fechorSalidaOriginalUpdate); + queryCorridaTramo.setTimestamp("fechorsalidaH", fechorsalidaUpdate); + queryCorridaTramo.setTimestamp("fechorllegadaH", fechorllegadaUpdate); + queryCorridaTramo.setInteger("corridatramoId", corridatramoId); + queryCorridaTramo.executeUpdate(); } } } + private Date calcularHusoHorVeranoLlegada(Date fechorsalida, Date fechorllegada, Date fechorsalidaH, int tiempoOrigen, int tiempoDestino) { + Calendar horLlegada = null; + + // Si los tiempos son distintos, hube cambio de huso horario/horario de verano + if (tiempoOrigen != tiempoDestino) { + long elapsedHoras = DateUtil.getElapsedHoras(fechorsalida,fechorllegada); + + horLlegada = Calendar.getInstance(); + horLlegada.setTime(fechorsalidaH); + + horLlegada.add(Calendar.HOUR, (int)elapsedHoras); + horLlegada.add(Calendar.HOUR, difHuso(tiempoOrigen,tiempoDestino)); + + } + + return (horLlegada == null) ? null : horLlegada.getTime(); + } + + private int difHuso(int a,int b){ + int mult=0; + + if ( (a < b) && (b<=0) ){ + mult = -1; + }else if ( (a=0) ){ + mult = -1; + }else if (a> b){ + mult = -1; + }else{ + mult = 1; + } + + return ((Math.abs(a)-Math.abs(b)) * mult); + } + @Override public List buscarPorEstado(final Estado estado, final Date dataInicial) { - StringBuilder hql = new StringBuilder(); hql.append(" select "); @@ -544,4 +591,42 @@ public class CorridaHibernateDAO extends GenericHibernateDAO buscarTramosCorrida(final Corrida corrida) { + StringBuilder hql = new StringBuilder(); + + hql.append(" select "); + hql.append(" ct.corridatramoId, "); + hql.append(" ct.numsecuencia,"); + hql.append(" ct.fechorSalidaOriginal,"); + hql.append(" ct.fechorsalida,"); + hql.append(" ct.fechorllegada,"); + hql.append(" nvl(ct.origem.ciudad.estado.tiempoHorHuso, 0) as tiempoHorHusoOrigem,"); + hql.append(" nvl( case when "); + hql.append(" ct.fechorSalidaOriginal between "); + hql.append(" ct.origem.ciudad.estado.fecInicioHorVerano "); + hql.append(" and ct.origem.ciudad.estado.fecFinoHorVerano "); + hql.append(" then (ct.origem.ciudad.estado.tiempoHorVerano)"); + hql.append(" else 0 end, 0) as tiempoHorVeranoOrigem,"); + hql.append(" nvl(ct.destino.ciudad.estado.tiempoHorHuso, 0) as tiempoHorHusoDestino,"); + hql.append(" nvl( case when "); + hql.append(" ct.fechorSalidaOriginal between "); + hql.append(" ct.destino.ciudad.estado.fecInicioHorVerano "); + hql.append(" and ct.destino.ciudad.estado.fecFinoHorVerano "); + hql.append(" then (ct.destino.ciudad.estado.tiempoHorVerano)"); + hql.append(" else 0 end, 0) as tiempoHorVeranoDestino"); + hql.append(" from CorridaTramo ct "); + hql.append(" where ct.corrida.activo = :isActivo "); + hql.append(" and ct.corrida.id.corridaId = :corridaId "); + hql.append(" and ct.corrida.id.feccorrida = :feccorrida "); + hql.append(" order by "); + hql.append(" ct.numsecuencia "); + + Query query = getSession().createQuery(hql.toString()); + query.setBoolean("isActivo", Boolean.TRUE); + query.setDate("feccorrida", corrida.getId().getFeccorrida()); + query.setInteger("corridaId", corrida.getId().getCorridaId()); + + return query.list(); + } } diff --git a/src/com/rjconsultores/ventaboletos/dao/sqlbuilder/impl/SQLBuilderOracle.java b/src/com/rjconsultores/ventaboletos/dao/sqlbuilder/impl/SQLBuilderOracle.java index dd09951ec..5a07ce93f 100644 --- a/src/com/rjconsultores/ventaboletos/dao/sqlbuilder/impl/SQLBuilderOracle.java +++ b/src/com/rjconsultores/ventaboletos/dao/sqlbuilder/impl/SQLBuilderOracle.java @@ -537,65 +537,8 @@ public class SQLBuilderOracle implements SQLBuilder { StringBuilder sb = new StringBuilder(); sb.append(" update CorridaTramo ctq "); - sb.append(" set ctq.fechorSalidaOriginalH = "); - sb.append(" ( "); - sb.append(" select "); - sb.append(" ct.fechorSalidaOriginal "); - sb.append(" + nvl((ct.origem.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) "); - sb.append(" + nvl( case when "); - sb.append(" ct.fechorSalidaOriginal between "); - sb.append(" ct.origem.ciudad.estado.fecInicioHorVerano "); - sb.append(" and ct.origem.ciudad.estado.fecFinoHorVerano "); - sb.append(" then (ct.origem.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") "); - sb.append(" else 0 end, 0) "); - sb.append(" from CorridaTramo ct "); - sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) "); - sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) "); - sb.append(" and ctq.corridatramoId = ct.corridatramoId "); - sb.append(" ) "); - - sb.append(" , "); - - sb.append(" ctq.fechorsalidaH = "); - - sb.append(" ( "); - sb.append(" select "); - sb.append(" ct.fechorsalida "); - sb.append(" + nvl((ct.origem.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) "); - sb.append(" + nvl( case when "); - sb.append(" ct.fechorsalida between "); - sb.append(" ct.origem.ciudad.estado.fecInicioHorVerano "); - sb.append(" and ct.origem.ciudad.estado.fecFinoHorVerano "); - sb.append(" then (ct.origem.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") "); - sb.append(" else 0 end, 0) "); - sb.append(" from CorridaTramo ct "); - sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) "); - sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) "); - sb.append(" and ctq.corridatramoId = ct.corridatramoId "); - sb.append(" ) "); - - sb.append(" , "); - - sb.append(" ctq.fechorllegadaH = "); - - sb.append(" ( "); - sb.append(" select "); - sb.append(" ct.fechorllegada "); - sb.append(" + nvl((ct.destino.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) "); - sb.append(" + nvl( case when "); - sb.append(" ct.fechorllegada between "); - sb.append(" ct.destino.ciudad.estado.fecInicioHorVerano "); - sb.append(" and ct.destino.ciudad.estado.fecFinoHorVerano "); - sb.append(" then (ct.destino.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") "); - sb.append(" else 0 end, 0) "); - sb.append(" from CorridaTramo ct "); - sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) "); - sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) "); - sb.append(" and ctq.corridatramoId = ct.corridatramoId "); - sb.append(" ) "); - - sb.append(" where ctq.corrida.id.corridaId in ( :corridaId ) "); - sb.append(" and ctq.corrida.id.feccorrida in ( :feccorrida ) "); + sb.append(" set ctq.fechorSalidaOriginalH = :fechorSalidaOriginalH, ctq.fechorsalidaH = :fechorsalidaH, ctq.fechorllegadaH = :fechorllegadaH"); + sb.append(" where ctq.corridatramoId = :corridatramoId "); return sb.toString(); } diff --git a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java index 2b4e331c9..a3bcf4ca0 100644 --- a/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java +++ b/src/com/rjconsultores/ventaboletos/service/impl/CorridaServiceImpl.java @@ -528,7 +528,6 @@ public class CorridaServiceImpl implements CorridaService { Date husoHorVeranoLlegadaAnterior = null; for (EsquemaTramo esquemaTramo : lsEsquemaTramo) { - CorridaTramo corridaTramo = new CorridaTramo(); corridaTramo.setAutobus(null); corridaTramo.setConductor(null); @@ -585,6 +584,21 @@ public class CorridaServiceImpl implements CorridaService { corridaTramo.setCorrida(corrida); corridaTramo.setFechorSalidaOriginal(fecHorSalida); + if (husoHorVeranoLlegadaAnterior == null){ + corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida()); + }else{ + corridaTramo.setFechorsalidaH(husoHorVeranoLlegadaAnterior); + } + + husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada(esquemaTramo, corridaTramo); + + if (husoHorVeranoLlegadaAnterior != null){ + corridaTramo.setFechorllegadaH(husoHorVeranoLlegadaAnterior); + }else{ + corridaTramo.setFechorllegadaH(corridaTramo.getFechorllegada()); + } + + if (husoHorVeranoLlegadaAnterior == null){ corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida()); }else{ @@ -1126,6 +1140,7 @@ public class CorridaServiceImpl implements CorridaService { public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial) { try { List corridas = corridaDAO.buscarPorEstado(estado, dataInicial); + corridaDAO.actualizaFecHusoFecVerano(corridas); return Boolean.TRUE;