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; import org.hibernate.type.StringType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.rjconsultores.ventaboletos.dao.CtrlSerieEmbarcadaDAO; 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") public class CtrlSerieEmbarcadaHibernateDAO extends GenericHibernateDAO implements CtrlSerieEmbarcadaDAO { private static final Logger log = LoggerFactory.getLogger(CtrlSerieEmbarcadaHibernateDAO.class); @Autowired public CtrlSerieEmbarcadaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) { setSessionFactory(factory); } @Override @Transactional public CtrlSerieEmbarcada suscribir(CtrlSerieEmbarcada entity) { try { this.getHibernateTemplate().save(entity); getHibernateTemplate().flush(); return entity; } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } @Override @Transactional public CtrlSerieEmbarcada actualizacion(CtrlSerieEmbarcada entity) { entity = getHibernateTemplate().merge(entity); getHibernateTemplate().flush(); return entity; } public Boolean validaDispositivoEmpresaEstadoCadastrado(DispositivoEmbarcada dispositivo, Empresa empresa, Estado estado) { StringBuilder sb = new StringBuilder(); sb.append("select count(se.ctrlSerieEmbarcadaId) "); sb.append("from CtrlSerieEmbarcada se "); sb.append("where se.activo = 1 and se.indBaixado = 0 "); sb.append("and se.dispositivoEmbarcada.dispositivoEmbarcadaId = :dispositivoEmbarcadaId "); sb.append("and se.empresa.empresaId = :empresaId "); sb.append("and se.estado.estadoId = :estadoId "); Query qry = getSession().createQuery(sb.toString()); qry.setLong("dispositivoEmbarcadaId", dispositivo.getDispositivoEmbarcadaId()); qry.setLong("empresaId", empresa.getEmpresaId()); qry.setLong("estadoId", estado.getEstadoId()); Number n = (Number) qry.uniqueResult(); if (n == null) { return false; } return n.longValue() > 0; } @SuppressWarnings("unchecked") 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 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) .addScalar("serie", StringType.INSTANCE) .addScalar("numero", StringType.INSTANCE) .setResultTransformer(new AliasToBeanResultTransformer(SerieEmbarcada.class)); query.setInteger("empresaId", empresaId); query.setInteger("estadoId", estadoId); 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 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; } }