diff --git a/src/com/rjconsultores/ventaboletos/dao/CtrlSerieBPeDAO.java b/src/com/rjconsultores/ventaboletos/dao/CtrlSerieBPeDAO.java index 20646166d..b9972df02 100644 --- a/src/com/rjconsultores/ventaboletos/dao/CtrlSerieBPeDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/CtrlSerieBPeDAO.java @@ -4,4 +4,6 @@ import com.rjconsultores.ventaboletos.entidad.CtrlSerieBPe; public interface CtrlSerieBPeDAO extends GenericDAO { + public CtrlSerieBPe buscarPorEmpresaEstado(Integer empresaId, Integer estadoId); + } diff --git a/src/com/rjconsultores/ventaboletos/dao/CtrlSerieEmbarcadaDAO.java b/src/com/rjconsultores/ventaboletos/dao/CtrlSerieEmbarcadaDAO.java index 0cf42686d..96a7fc0fd 100644 --- a/src/com/rjconsultores/ventaboletos/dao/CtrlSerieEmbarcadaDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/CtrlSerieEmbarcadaDAO.java @@ -6,6 +6,7 @@ import com.rjconsultores.ventaboletos.entidad.CtrlSerieEmbarcada; import com.rjconsultores.ventaboletos.entidad.DispositivoEmbarcada; import com.rjconsultores.ventaboletos.entidad.Empresa; import com.rjconsultores.ventaboletos.entidad.Estado; +import com.rjconsultores.ventaboletos.exception.SerieEmbarcadaNaoDisponivelException; import com.rjconsultores.ventaboletos.vo.embarcada.SerieEmbarcada; public interface CtrlSerieEmbarcadaDAO extends GenericDAO { @@ -14,6 +15,10 @@ public interface CtrlSerieEmbarcadaDAO extends GenericDAO buscarSeriesReaproveitar(final Integer empresaId, final Integer estadoId); + public List buscarSeriesEmbarcadaDisponivel(final Integer empresaId, final Integer estadoId); + public SerieEmbarcada buscarSerieEmbarcadaDisponivel(final Integer empresaId, final Integer estadoId) throws SerieEmbarcadaNaoDisponivelException; + public CtrlSerieEmbarcada buscarCtrlSerieEmbarcada(final Long ctrlSerieEmbarcadaId) throws SerieEmbarcadaNaoDisponivelException; + + public Boolean validaPossuiDispositivo(Integer empresaId, Integer estadoId, String serie); } diff --git a/src/com/rjconsultores/ventaboletos/dao/hibernate/CtrlSerieBPeHibernateDAO.java b/src/com/rjconsultores/ventaboletos/dao/hibernate/CtrlSerieBPeHibernateDAO.java index 7dc805772..17dcc1818 100644 --- a/src/com/rjconsultores/ventaboletos/dao/hibernate/CtrlSerieBPeHibernateDAO.java +++ b/src/com/rjconsultores/ventaboletos/dao/hibernate/CtrlSerieBPeHibernateDAO.java @@ -1,5 +1,6 @@ package com.rjconsultores.ventaboletos.dao.hibernate; +import org.hibernate.Query; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,4 +19,17 @@ public class CtrlSerieBPeHibernateDAO extends GenericHibernateDAO buscarSeriesReaproveitar(final Integer empresaId, final Integer estadoId) { + public List buscarSeriesEmbarcadaDisponivel(final Integer empresaId, final Integer estadoId) { StringBuilder sb = new StringBuilder(); sb.append("select se.ctrlserieembarcada_id as ctrlSerieEmbarcadaId, se.serie as serie, se.numerocorrente + 1 as numero "); sb.append("from ctrl_serie_embarcada se "); sb.append("left join ctrl_serie_embarcada seq on seq.ctrlserieembarcadaseq_id = se.ctrlserieembarcada_id "); - sb.append("where se.activo = 1 and se.ind_baixado = 1 and seq.ctrlserieembarcada_id is null and se.empresa_id = :empresaId and se.estado_id = :estadoId "); + sb.append("where se.activo = 1 and se.ind_baixado = 1 and se.ind_reutilizado = 0 and seq.ctrlserieembarcada_id is null and se.empresa_id = :empresaId and se.estado_id = :estadoId "); sb.append("order by se.serie "); Query query = getSession().createSQLQuery(sb.toString()) @@ -95,4 +101,153 @@ public class CtrlSerieEmbarcadaHibernateDAO extends GenericHibernateDAO list = query.list(); + + if (list != null && list.size() > 0) { + retorno = list.get(0); + + session.getTransaction().begin(); + + retorno.setIndReutilizado(Boolean.TRUE); + retorno.setFecmodif(new Date()); + + session.update(retorno); + + session.getTransaction().commit(); + } else { + throw new SerieEmbarcadaNaoDisponivelException(); + } + + } catch (SerieEmbarcadaNaoDisponivelException e) { + throw new SerieEmbarcadaNaoDisponivelException(); + } catch (Exception e) { + log.error("CtrlSerieEmbarcada: " + e.getMessage(), e); + + } finally { + if (session != null) { + session.flush(); + session.close(); + } + } + + return retorno; + } + + @SuppressWarnings("unchecked") + public SerieEmbarcada buscarSerieEmbarcadaDisponivel(final Integer empresaId, final Integer estadoId) throws SerieEmbarcadaNaoDisponivelException { + SerieEmbarcada retorno = null; + + StringBuilder sb = new StringBuilder(); + sb.append("select se "); + sb.append("from CtrlSerieEmbarcada se "); + sb.append("where se.activo = 1 and se.indReutilizado = 0 and se.indBaixado = 1 and se.ctrlSerieEmbarcadaId in (:list)"); + sb.append("order by se.serie "); + + Session session = null; + + try { + session = getSessionFactory().openSession(); + + Query query = session.createQuery(sb.toString()); + query.setParameterList("list", buscarIdsSeriesEmbarcadaDisponivel(empresaId, estadoId)); + + query.setLockOptions(LockOptions.UPGRADE); + query.setTimeout(20); + + List list = query.list(); + + if (list != null && list.size() > 0) { + CtrlSerieEmbarcada ctrl = list.get(0); + + session.getTransaction().begin(); + + ctrl.setIndReutilizado(Boolean.TRUE); + ctrl.setFecmodif(new Date()); + + session.update(ctrl); + + session.getTransaction().commit(); + + retorno = new SerieEmbarcada(); + retorno.setCtrlSerieEmbarcada(ctrl); + retorno.setSerie(ctrl.getSerie()); + retorno.setNumero(String.valueOf(Long.valueOf(ctrl.getNumeroCorrente()) + 1)); + + } else { + throw new SerieEmbarcadaNaoDisponivelException(); + } + + } catch (SerieEmbarcadaNaoDisponivelException e) { + throw new SerieEmbarcadaNaoDisponivelException(); + } catch (Exception e) { + log.error("CtrlSerieEmbarcada: " + e.getMessage(), e); + } finally { + if (session != null) { + session.flush(); + session.close(); + } + } + + return retorno; + } + + @SuppressWarnings("unchecked") + public Set buscarIdsSeriesEmbarcadaDisponivel(final Integer empresaId, final Integer estadoId) { + StringBuilder sb = new StringBuilder(); + sb.append("select se.ctrlserieembarcada_id as ctrlSerieEmbarcadaId "); + sb.append("from ctrl_serie_embarcada se "); + sb.append("left join ctrl_serie_embarcada seq on seq.ctrlserieembarcadaseq_id = se.ctrlserieembarcada_id "); + sb.append("where se.activo = 1 and se.ind_baixado = 1 and se.ind_reutilizado = 0 and seq.ctrlserieembarcada_id is null and se.empresa_id = :empresaId and se.estado_id = :estadoId "); + sb.append("order by se.serie "); + + Query query = getSession().createSQLQuery(sb.toString()) + .addScalar("ctrlSerieEmbarcadaId", LongType.INSTANCE); + + query.setInteger("empresaId", empresaId); + query.setInteger("estadoId", estadoId); + + return new LinkedHashSet(query.list()); + } + + public Boolean validaPossuiDispositivo(Integer empresaId, Integer estadoId, String serie) { + StringBuilder sql = new StringBuilder("") + .append("SELECT COUNT(*) ") + .append("FROM ctrl_serie_embarcada se ") + .append("WHERE se.activo = 1 AND se.empresa_id = :empresaId AND se.estado_id = :estadoId AND se.serie = :serie"); + + Query query = getSession().createSQLQuery(sql.toString()); + query.setInteger("empresaId", empresaId); + query.setInteger("estadoId", estadoId); + query.setString("serie", serie); + + Number n = (Number) query.uniqueResult(); + + if (n == null) { + return false; + } + + return n.longValue() > 0; + } } diff --git a/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieBPe.java b/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieBPe.java index 00bff22b1..c4211c99e 100644 --- a/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieBPe.java +++ b/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieBPe.java @@ -10,6 +10,7 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.Temporal; @@ -25,8 +26,9 @@ public class CtrlSerieBPe { @Column(name = "CTRLSERIEBPE_ID") private Long ctrlSerieBPeId; - @Column(name = "EMPRESA_ID") - private Long empresaId; + @OneToOne + @JoinColumn(name = "EMPRESA_ID") + private Empresa empresa; @ManyToOne @JoinColumn(name = "ESTADO_ID", referencedColumnName = "ESTADO_ID") @@ -58,12 +60,12 @@ public class CtrlSerieBPe { this.ctrlSerieBPeId = ctrlSerieBPeId; } - public Long getEmpresaId() { - return empresaId; + public Empresa getEmpresa() { + return empresa; } - public void setEmpresaId(Long empresaId) { - this.empresaId = empresaId; + public void setEmpresa(Empresa empresa) { + this.empresa = empresa; } public Estado getEstado() { @@ -105,9 +107,4 @@ public class CtrlSerieBPe { public void setUsuarioId(Integer usuarioId) { this.usuarioId = usuarioId; } - - @Override - public String toString() { - return "CtrlSerieBPe [ctrlSerieBPeId=" + ctrlSerieBPeId + ", empresaId=" + empresaId + ", estado=" + estado + ", serie=" + serie + ", activo=" + activo + ", fecmodif=" + fecmodif + ", usuarioId=" + usuarioId + "]"; - } } diff --git a/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieEmbarcada.java b/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieEmbarcada.java index 79995b7ba..d2fabbc09 100644 --- a/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieEmbarcada.java +++ b/src/com/rjconsultores/ventaboletos/entidad/CtrlSerieEmbarcada.java @@ -1,5 +1,6 @@ package com.rjconsultores.ventaboletos.entidad; +import java.io.Serializable; import java.util.Date; import javax.persistence.Basic; @@ -19,7 +20,9 @@ import javax.persistence.TemporalType; @Entity @SequenceGenerator(name = "CTRL_SERIE_EMBARCADA_SEQ", sequenceName = "CTRL_SERIE_EMBARCADA_SEQ", allocationSize = 1) @Table(name = "CTRL_SERIE_EMBARCADA") -public class CtrlSerieEmbarcada { +public class CtrlSerieEmbarcada implements Serializable { + private static final long serialVersionUID = 3608706761067496642L; + @Id @Basic(optional = false) @GeneratedValue(strategy = GenerationType.AUTO, generator = "CTRL_SERIE_EMBARCADA_SEQ") @@ -42,8 +45,11 @@ public class CtrlSerieEmbarcada { private String numeroCorrente; @Column(name = "IND_BAIXADO") private Boolean indBaixado; - @Column(name = "CTRLSERIEEMBARCADASEQ_ID") - private Long ctrlSerieEmbarcadaSeqId; + @Column(name = "IND_REUTILIZADO") + private Boolean indReutilizado; + @OneToOne + @JoinColumn(name = "CTRLSERIEEMBARCADASEQ_ID", referencedColumnName = "CTRLSERIEEMBARCADA_ID") + private CtrlSerieEmbarcada ctrlSerieEmbarcadaSeq; @Column(name = "ACTIVO") private Boolean activo; @Basic(optional = false) @@ -121,12 +127,20 @@ public class CtrlSerieEmbarcada { this.indBaixado = indBaixado; } - public Long getCtrlSerieEmbarcadaSeqId() { - return ctrlSerieEmbarcadaSeqId; + public Boolean getIndReutilizado() { + return indReutilizado; } - public void setCtrlSerieEmbarcadaSeqId(Long ctrlSerieEmbarcadaSeqId) { - this.ctrlSerieEmbarcadaSeqId = ctrlSerieEmbarcadaSeqId; + public void setIndReutilizado(Boolean indReutilizado) { + this.indReutilizado = indReutilizado; + } + + public CtrlSerieEmbarcada getCtrlSerieEmbarcadaSeq() { + return ctrlSerieEmbarcadaSeq; + } + + public void setCtrlSerieEmbarcadaSeq(CtrlSerieEmbarcada ctrlSerieEmbarcadaSeq) { + this.ctrlSerieEmbarcadaSeq = ctrlSerieEmbarcadaSeq; } public Boolean getActivo() { diff --git a/src/com/rjconsultores/ventaboletos/exception/SerieEmbarcadaNaoDisponivelException.java b/src/com/rjconsultores/ventaboletos/exception/SerieEmbarcadaNaoDisponivelException.java new file mode 100644 index 000000000..cad19a09b --- /dev/null +++ b/src/com/rjconsultores/ventaboletos/exception/SerieEmbarcadaNaoDisponivelException.java @@ -0,0 +1,5 @@ +package com.rjconsultores.ventaboletos.exception; + +public class SerieEmbarcadaNaoDisponivelException extends Exception { + private static final long serialVersionUID = 2798469198513688315L; +} diff --git a/src/com/rjconsultores/ventaboletos/service/impl/ControleSerieEmbarcadaServiceImpl.java b/src/com/rjconsultores/ventaboletos/service/impl/ControleSerieEmbarcadaServiceImpl.java index 0cf23adba..1c89f3ad1 100644 --- a/src/com/rjconsultores/ventaboletos/service/impl/ControleSerieEmbarcadaServiceImpl.java +++ b/src/com/rjconsultores/ventaboletos/service/impl/ControleSerieEmbarcadaServiceImpl.java @@ -1,13 +1,16 @@ package com.rjconsultores.ventaboletos.service.impl; -import java.util.List; +import java.util.Date; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.rjconsultores.ventaboletos.dao.CtrlSerieBPeDAO; import com.rjconsultores.ventaboletos.dao.CtrlSerieEmbarcadaDAO; +import com.rjconsultores.ventaboletos.entidad.CtrlSerieBPe; import com.rjconsultores.ventaboletos.entidad.CtrlSerieEmbarcada; +import com.rjconsultores.ventaboletos.exception.SerieEmbarcadaNaoDisponivelException; import com.rjconsultores.ventaboletos.service.ControleSerieEmbarcadaService; import com.rjconsultores.ventaboletos.vo.embarcada.SerieEmbarcada; @@ -20,19 +23,56 @@ public class ControleSerieEmbarcadaServiceImpl implements ControleSerieEmbarcada private CtrlSerieBPeDAO ctrlSerieBPeDAO; @Override + @Transactional public SerieEmbarcada buscarSerieEmbarcada(CtrlSerieEmbarcada controleSerieEmbarcada) { - SerieEmbarcada retorno = null; + SerieEmbarcada serieembarcada = null; - List listaSeries = ctrlSerieEmbarcadaDAO.buscarSeriesReaproveitar(controleSerieEmbarcada.getEmpresa().getEmpresaId(), - controleSerieEmbarcada.getEstado().getEstadoId()); - - for (SerieEmbarcada disponivel : listaSeries) { - if (retorno == null) { - retorno = disponivel; + // Verificando se há Serie Embarcada disponível para reaproveitamento + int tentativas = 0; + + do { + tentativas++; + + try { + serieembarcada = ctrlSerieEmbarcadaDAO.buscarSerieEmbarcadaDisponivel(controleSerieEmbarcada.getEmpresa().getEmpresaId(), controleSerieEmbarcada.getEstado().getEstadoId()); + } catch (SerieEmbarcadaNaoDisponivelException e) { break; } + + if (tentativas >= 5) { + break; + } + + } while (serieembarcada == null); + + // Caso não haja reaproveitamento de série, devo buscar a próxima série disponível na sequência padrão + if (serieembarcada == null) { + CtrlSerieBPe ctrlSerieBpe = ctrlSerieBPeDAO.buscarPorEmpresaEstado(controleSerieEmbarcada.getEmpresa().getEmpresaId(), controleSerieEmbarcada.getEstado().getEstadoId()); + + if (ctrlSerieBpe == null) { + ctrlSerieBpe = new CtrlSerieBPe(); + ctrlSerieBpe.setEmpresa(controleSerieEmbarcada.getEmpresa()); + ctrlSerieBpe.setEstado(controleSerieEmbarcada.getEstado()); + ctrlSerieBpe.setActivo(Boolean.TRUE); + } + + ctrlSerieBpe.setFecmodif(new Date()); + + Integer serie = 0; + + do { + serie++; + } while (ctrlSerieEmbarcadaDAO.validaPossuiDispositivo(controleSerieEmbarcada.getEmpresa().getEmpresaId(), controleSerieEmbarcada.getEstado().getEstadoId(), serie.toString())); + + ctrlSerieBpe.setSerie(serie.toString()); + + ctrlSerieBpe = ctrlSerieBPeDAO.suscribir(ctrlSerieBpe); + + serieembarcada = new SerieEmbarcada(); + serieembarcada.setSerie(ctrlSerieBpe.getSerie()); + serieembarcada.setNumero("1"); } - return retorno; + return serieembarcada; } } diff --git a/src/com/rjconsultores/ventaboletos/vo/embarcada/SerieEmbarcada.java b/src/com/rjconsultores/ventaboletos/vo/embarcada/SerieEmbarcada.java index 1d6522faf..9d2bb471e 100644 --- a/src/com/rjconsultores/ventaboletos/vo/embarcada/SerieEmbarcada.java +++ b/src/com/rjconsultores/ventaboletos/vo/embarcada/SerieEmbarcada.java @@ -1,7 +1,9 @@ package com.rjconsultores.ventaboletos.vo.embarcada; +import com.rjconsultores.ventaboletos.entidad.CtrlSerieEmbarcada; + public class SerieEmbarcada { - private Long ctrlSerieEmbarcadaId; + private CtrlSerieEmbarcada ctrlSerieEmbarcada; private String serie; private String numero; @@ -9,12 +11,12 @@ public class SerieEmbarcada { } - public Long getCtrlSerieEmbarcadaId() { - return ctrlSerieEmbarcadaId; + public CtrlSerieEmbarcada getCtrlSerieEmbarcada() { + return ctrlSerieEmbarcada; } - public void setCtrlSerieEmbarcadaId(Long ctrlSerieEmbarcadaId) { - this.ctrlSerieEmbarcadaId = ctrlSerieEmbarcadaId; + public void setCtrlSerieEmbarcada(CtrlSerieEmbarcada ctrlSerieEmbarcada) { + this.ctrlSerieEmbarcada = ctrlSerieEmbarcada; } public String getSerie() { @@ -35,6 +37,6 @@ public class SerieEmbarcada { @Override public String toString() { - return "SerieEmbarcada [ctrlSerieEmbarcadaId=" + ctrlSerieEmbarcadaId + ", serie=" + serie + ", numero=" + numero + "]"; + return "SerieEmbarcada [ctrlSerieEmbarcadaId=" + (ctrlSerieEmbarcada == null ? "null" : ctrlSerieEmbarcada.getCtrlSerieEmbarcadaId()) + ", serie=" + serie + ", numero=" + numero + "]"; } }