Série para venda embarcada

bug#13748
dev:trevezani
qua:

git-svn-id: http://desenvolvimento.rjconsultores.com.br/repositorio/sco/AdmVenta/Model/trunk/modelWeb@91284 d1611594-4594-4d17-8e1d-87c2c4800839
master
alberto 2019-03-27 21:59:21 +00:00
parent fa89b8a1ec
commit eac9317d1d
9 changed files with 270 additions and 36 deletions

View File

@ -4,4 +4,6 @@ import com.rjconsultores.ventaboletos.entidad.CtrlSerieBPe;
public interface CtrlSerieBPeDAO extends GenericDAO<CtrlSerieBPe, Long> {
public CtrlSerieBPe buscarPorEmpresaEstado(Integer empresaId, Integer estadoId);
}

View File

@ -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<CtrlSerieEmbarcada, Long> {
@ -14,6 +15,10 @@ public interface CtrlSerieEmbarcadaDAO extends GenericDAO<CtrlSerieEmbarcada, L
public CtrlSerieEmbarcada actualizacion(CtrlSerieEmbarcada entity);
public Boolean validaDispositivoEmpresaEstadoCadastrado(DispositivoEmbarcada dispositivo, Empresa empresa, Estado estado);
public List<SerieEmbarcada> buscarSeriesReaproveitar(final Integer empresaId, final Integer estadoId);
public List<SerieEmbarcada> 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);
}

View File

@ -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<CtrlSerieBPe,
public CtrlSerieBPeHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
setSessionFactory(factory);
}
public CtrlSerieBPe buscarPorEmpresaEstado(Integer empresaId, Integer estadoId) {
StringBuilder sb = new StringBuilder();
sb.append("SELECT ctrl ");
sb.append("FROM CtrlSerieBpe ctrl ");
sb.append("WHERE ctrl.activo = 1 AND ctrl.empresa.empresaId = :empresaId AND ctrl.estado.estadoId = :estadoId ");
Query qr = getSession().createQuery(sb.toString());
qr.setParameter("empresaId", empresaId);
qr.setParameter("estadoId", estadoId);
return (CtrlSerieBPe) qr.uniqueResult();
}
}

View File

@ -1,9 +1,14 @@
package com.rjconsultores.ventaboletos.dao.hibernate;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.hibernate.HibernateException;
import org.hibernate.LockOptions;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.transform.AliasToBeanResultTransformer;
import org.hibernate.type.LongType;
@ -20,6 +25,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;
@Repository("ctrlSerieEmbarcadaDAO")
@ -76,12 +82,12 @@ public class CtrlSerieEmbarcadaHibernateDAO extends GenericHibernateDAO<CtrlSer
}
@SuppressWarnings("unchecked")
public List<SerieEmbarcada> buscarSeriesReaproveitar(final Integer empresaId, final Integer estadoId) {
public List<SerieEmbarcada> 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<CtrlSer
return query.list();
}
@SuppressWarnings("unchecked")
public CtrlSerieEmbarcada buscarCtrlSerieEmbarcada(final Long ctrlSerieEmbarcadaId) throws SerieEmbarcadaNaoDisponivelException {
CtrlSerieEmbarcada 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.ctrlSerieEmbarcadaId = :ctrlSerieEmbarcadaId");
Session session = null;
try {
session = getSessionFactory().openSession();
Query query = session.createQuery(sb.toString());
query.setLong("ctrlSerieEmbarcadaId", ctrlSerieEmbarcadaId);
query.setMaxResults(1);
query.setLockOptions(LockOptions.UPGRADE);
query.setTimeout(20);
List<CtrlSerieEmbarcada> 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<CtrlSerieEmbarcada> 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<Long> 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<Long>(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;
}
}

View File

@ -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 + "]";
}
}

View File

@ -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() {

View File

@ -0,0 +1,5 @@
package com.rjconsultores.ventaboletos.exception;
public class SerieEmbarcadaNaoDisponivelException extends Exception {
private static final long serialVersionUID = 2798469198513688315L;
}

View File

@ -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<SerieEmbarcada> listaSeries = ctrlSerieEmbarcadaDAO.buscarSeriesReaproveitar(controleSerieEmbarcada.getEmpresa().getEmpresaId(),
controleSerieEmbarcada.getEstado().getEstadoId());
// Verificando se há Serie Embarcada disponível para reaproveitamento
int tentativas = 0;
for (SerieEmbarcada disponivel : listaSeries) {
if (retorno == null) {
retorno = disponivel;
do {
tentativas++;
try {
serieembarcada = ctrlSerieEmbarcadaDAO.buscarSerieEmbarcadaDisponivel(controleSerieEmbarcada.getEmpresa().getEmpresaId(), controleSerieEmbarcada.getEstado().getEstadoId());
} catch (SerieEmbarcadaNaoDisponivelException e) {
break;
}
if (tentativas >= 5) {
break;
}
return retorno;
} 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 serieembarcada;
}
}

View File

@ -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 + "]";
}
}