AdmMono/src/com/rjconsultores/ventaboletos/dao/hibernate/EmpresaHibernateDAO.java

408 lines
12 KiB
Java

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.rjconsultores.ventaboletos.dao.hibernate;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.type.BooleanType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;
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.EmpresaDAO;
import com.rjconsultores.ventaboletos.entidad.ComEmpCategoria;
import com.rjconsultores.ventaboletos.entidad.ComEmpConferencia;
import com.rjconsultores.ventaboletos.entidad.ComEmpFormapago;
import com.rjconsultores.ventaboletos.entidad.ComEmpTipoEventoExtra;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.InscricaoEstadual;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.FolioSistemaEnum;
import com.rjconsultores.ventaboletos.vo.busquedapacotes.transformer.DatosEmpresaResultTransformer;
/**
*
* @author Administrador
*/
@Repository("empresaDAO")
public class EmpresaHibernateDAO extends GenericHibernateDAO<Empresa, Integer> implements EmpresaDAO {
private static String FS_BPE = "FS_BPE_";
@Autowired
private DataSource dataSource;
@Autowired
public EmpresaHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
setSessionFactory(factory);
}
@Override
public List<Empresa> obtenerTodos() {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.add(Restrictions.ne("empresaId", -1));
c.addOrder(Order.asc("nombempresa"));
@SuppressWarnings("unchecked")
List<Empresa> retorno =(List<Empresa>) c.list();
for(Empresa empresa : retorno) {
Hibernate.initialize(empresa);
Hibernate.initialize(empresa.getInscricoesEstaduais());
}
return retorno;
}
@SuppressWarnings("unchecked")
public List<Empresa> buscar(String nombempresa, Boolean indExterna, Short indTipo) {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.add(Restrictions.eq("nombempresa", nombempresa));
c.add(Restrictions.eq("indExterna", indExterna));
c.add(Restrictions.eq("indTipo", indTipo));
c.add(Restrictions.ne("empresaId", -1));
return c.list();
}
public List<Empresa> buscarTodosExceto(List<Empresa> empresa, Integer... idEmpresa) {
if (idEmpresa == null || idEmpresa.length == 0) {
return empresa;
}
List<Empresa> empresaList = new ArrayList<Empresa>();
List<Integer> lsEmpresa = Arrays.asList(idEmpresa);
for (Empresa e : empresa) {
if (!lsEmpresa.contains(e.getEmpresaId())) {
empresaList.add(e);
}
}
return empresaList;
}
@SuppressWarnings("unchecked")
public List<Empresa> obtenerIndExternoFalse() {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.add(Restrictions.eq("indExterna", Boolean.FALSE));
c.add(Restrictions.ne("empresaId", -1));
c.addOrder(Order.asc("nombempresa"));
return c.list();
}
@SuppressWarnings("unchecked")
public List<Empresa> obtenerIndTipo2() {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.add(Restrictions.eq("indTipo", new Short("2")));
// Nao Buscar Empresa todas
c.add(Restrictions.ne("empresaId", -1));
c.addOrder(Order.asc("nombempresa"));
return c.list();
}
public List<Empresa> buscarNotInPuntoVtaComissao(PuntoVenta puntoVenta) {
StringBuilder sb = new StringBuilder();
sb.append(" select em ");
sb.append(" from Empresa em ");
sb.append(" where em.activo = 1 ");
sb.append(" and em.empresaId not in ( ");
sb.append(" select pc.empresaId.empresaId from PtovtaComissao pc ");
sb.append(" where pc.activo = 1 and pc.puntoventaId.puntoventaId = :puntoventaId ");
sb.append(" )");
sb.append(" and em.empresaId != -1 ");
sb.append(" order by em.nombempresa");
Query query = getSession().createQuery(sb.toString());
query.setParameter("puntoventaId", puntoVenta.getPuntoventaId());
@SuppressWarnings("unchecked")
List<Empresa> lsEmpresa = query.list();
return lsEmpresa;
}
@SuppressWarnings("unchecked")
@Override
public List<InscricaoEstadual> buscaInscricoesEstaduais(Empresa empresa) {
Criteria c = getSession().createCriteria(InscricaoEstadual.class);
c.add(Restrictions.eq("empresa", empresa));
c.add(Restrictions.eq("activo", Boolean.TRUE));
return c.list();
}
@Override
public void actualizaInscEstadual(InscricaoEstadual inscricaoEstadual) {
Session session = getSessionFactory().getCurrentSession();
session.saveOrUpdate(inscricaoEstadual);
if(inscricaoEstadual.getIndHabilitaIEDescentralizada()) {
gerarSequenceBPeInscricaoEstadual(inscricaoEstadual);
}
session.flush();
}
@SuppressWarnings("unchecked")
@Override
public List<Empresa> buscaLike(String nombempresa) {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.add(Restrictions.like("nombempresa", nombempresa, MatchMode.START));
c.add(Restrictions.ne("empresaId", -1));
c.addOrder(Order.asc("nombempresa"));
return c.list();
}
@Override
public Empresa suscribir(Empresa entity) {
entity = super.suscribir(entity);
getSession().flush();
try {
gerarSeqNumFolioSistema(entity.getEmpresaId());
} catch (SQLException e) {
e.printStackTrace();
}
return entity;
}
@Override
public Empresa actualizacion(Empresa entity) {
entity = super.actualizacion(entity);
try {
gerarSeqNumFolioSistema(entity.getEmpresaId());
} catch (SQLException e) {
e.printStackTrace();
}
return entity;
}
private void gerarSeqNumFolioSistema(Integer idEmpresa) throws SQLException {
final Connection conn = dataSource.getConnection();
try {
geraSequence(conn, idEmpresa);
} finally {
conn.close();
}
}
@SuppressWarnings("unchecked")
private void geraSequence(final Connection conn, final Integer idEmpresa) throws SQLException {
final Statement statement = conn.createStatement();
try {
for (FolioSistemaEnum folioSistemaEnum : FolioSistemaEnum.values()) {
List<String> lista = getSession().createSQLQuery(obtemSqlSequence(idEmpresa, folioSistemaEnum)).list();
for (String instrucao : lista) {
statement.execute(instrucao);
}
}
} finally {
statement.close();
}
}
private String obtemSqlSequence(Integer idEmpresa, FolioSistemaEnum folioSistemaEnum) {
StringBuilder sql = new StringBuilder();
sql.append(
"SELECT 'CREATE SEQUENCE ' || SEQUENCIA || ' INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE' FROM (");
sql.append(" SELECT DISTINCT '" + folioSistemaEnum.getNome()
+ (folioSistemaEnum.isCveEstado() ? "'||CVEESTADO||'_" : "_") + idEmpresa + "_SEQ' SEQUENCIA ");
sql.append(" FROM ESTADO WHERE ACTIVO = 1) TMP ");
sql.append("WHERE TMP.SEQUENCIA NOT IN( ");
sql.append(" SELECT SEQUENCE_NAME FROM USER_SEQUENCES ");
sql.append(" WHERE SEQUENCE_NAME LIKE '" + folioSistemaEnum.getNome() + "%_" + idEmpresa + "_SEQ')");
return sql.toString();
}
@Override
@SuppressWarnings("unchecked")
public List<Empresa> obtenerTodosIncluindoEmpresaTodas() {
Criteria c = getSession().createCriteria(getPersistentClass());
c.add(Restrictions.eq("activo", Boolean.TRUE));
c.addOrder(Order.asc("nombempresa"));
return c.list();
}
@Override
@Transactional
public ComEmpCategoria adicionarComissaoCategoria(ComEmpCategoria comEmpCategoria) {
getSession().save(comEmpCategoria);
return comEmpCategoria;
}
@Override
@Transactional
public void removerComissaoCategoria(ComEmpCategoria comEmpCategoria) {
getSession().merge(comEmpCategoria);
}
@Override
@Transactional
public ComEmpFormapago adicionarComissaoFormapago(ComEmpFormapago comEmpFormapago) {
getSession().save(comEmpFormapago);
return comEmpFormapago;
}
@Override
@Transactional
public void removerComissaoFormapago(ComEmpFormapago comEmpFormapago) {
getSession().merge(comEmpFormapago);
}
@Override
@Transactional
public ComEmpTipoEventoExtra adicionarComissaoTipoEventoExtra(ComEmpTipoEventoExtra comEmpTipoEventoExtra) {
getSession().save(comEmpTipoEventoExtra);
return comEmpTipoEventoExtra;
}
@Override
@Transactional
public void removerComissaoTipoEventoExtra(ComEmpTipoEventoExtra comEmpTipoEventoExtra) {
getSession().merge(comEmpTipoEventoExtra);
}
@Override
public ComEmpConferencia suscribir(ComEmpConferencia comEmpConferencia) {
getSession().save(comEmpConferencia);
return comEmpConferencia;
}
@Override
public ComEmpConferencia actualizacion(ComEmpConferencia comEmpConferencia) {
getSession().merge(comEmpConferencia);
return comEmpConferencia;
}
@Override
public void gerarSeqNumFolioSistema(Integer idEmpresa, String cveEstado) throws RuntimeException {
Connection conn = null;
try {
if(StringUtils.isNotBlank(cveEstado)) {
conn = dataSource.getConnection();
if (!conn.createStatement().executeQuery("select SEQUENCE_NAME from DBA_SEQUENCES where SEQUENCE_NAME like 'FOLIO_SISTEMA_" + cveEstado + "_" + idEmpresa + "_SEQ%'").next()) {
conn.createStatement().execute("CREATE SEQUENCE FOLIO_SISTEMA_" + cveEstado + "_" + idEmpresa + "_SEQ INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE");
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
try {
if(conn != null && !conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
@Override
@SuppressWarnings("unchecked")
public List<Empresa> buscarEmpresaPtoVtaComissao() {
StringBuilder sQuery = new StringBuilder("SELECT DISTINCT em.EMPRESA_ID, em.NOMBEMPRESA, em.ACTIVO ");
sQuery.append("FROM PTOVTA_COMISSAO ptovta ")
.append("JOIN EMPRESA em ON em.empresa_id = ptovta.empresa_id ")
.append("WHERE ptovta.activo = 1 ")
.append("AND em.activo = 1");
Query qr = getSession().createSQLQuery(sQuery.toString())
.addScalar("EMPRESA_ID", IntegerType.INSTANCE)
.addScalar("NOMBEMPRESA", StringType.INSTANCE)
.addScalar("ACTIVO", BooleanType.INSTANCE)
.setResultTransformer(new DatosEmpresaResultTransformer());
return qr.list();
}
private void gerarSequenceBPeInscricaoEstadual(InscricaoEstadual inscricaoEstadual) {
StringBuilder nomeSequence = new StringBuilder(FS_BPE);
nomeSequence.append(inscricaoEstadual.getEstado().getCveestado())
.append("_")
.append(inscricaoEstadual.getEmpresa().getEmpresaId())
.append("_IE_")
.append(inscricaoEstadual.getInscricaoestadualId())
.append("_SEQ");
if(!isSequenceBPeInscricaoEstadualCriada(nomeSequence.toString())) {
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.createStatement().execute("CREATE SEQUENCE " + nomeSequence.toString() + " MINVALUE 1 MAXVALUE 999999999 INCREMENT BY 1 START WITH 1 ORDER NOCACHE CYCLE");
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
try {
if(conn != null && !conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
private boolean isSequenceBPeInscricaoEstadualCriada(String nomeSequence) {
StringBuilder sQuery = new StringBuilder();
sQuery.append("SELECT SEQUENCE_NAME FROM USER_SEQUENCES ")
.append("WHERE SEQUENCE_NAME LIKE :nomeSequence");
Query qr = getSession().createSQLQuery(sQuery.toString());
qr.setParameter("nomeSequence", nomeSequence);
qr.setMaxResults(1);
String result = (String) qr.uniqueResult();
return StringUtils.isNotBlank(result);
}
}