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

361 lines
16 KiB
Java
Raw Blame History

package com.rjconsultores.ventaboletos.dao.hibernate;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.transform.Transformers;
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 com.rjconsultores.ventaboletos.dao.TarifaOficialDAO;
import com.rjconsultores.ventaboletos.dao.sqlbuilder.SQLBuilder;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.entidad.TarifaOficial;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
@Repository("tarifaOficialDAO")
public class TarifaOficialHibernateDAO extends GenericHibernateDAO<TarifaOficial, Integer> implements TarifaOficialDAO {
private static Logger log = LoggerFactory.getLogger(TarifaOficialHibernateDAO.class);
@Autowired
private SQLBuilder sqlBuilder;
@Autowired
public TarifaOficialHibernateDAO(@Qualifier("sessionFactory") SessionFactory factory) {
setSessionFactory(factory);
}
@Override
public Integer gerarTarifaPorCoeficiente(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas) {
String sql = sqlBuilder.getSQLGerarTarifaOficial(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas);
int qtd = getSession().createSQLQuery(sql).executeUpdate();
return qtd;
}
@Override
public Integer gerarTarifaArtesp(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas) {
String sql = sqlBuilder.getSQLGerarTarifaOficialArtesp(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas);
int qtd = getSession().createSQLQuery(sql).executeUpdate();
return qtd;
}
@Override
public Integer gerarTabelaZerada(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas) {
String sql = sqlBuilder.getSQLGerarTabelaZerada(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas);
int qtd = getSession().createSQLQuery(sql).executeUpdate();
return qtd;
}
@Override
public Integer atualizarTarifaCoeficiente(Integer rutaId, Integer usuarioId, Integer orgaoConcedenteId) {
String sql = sqlBuilder.getSQLAtualizarTarifaOficial(rutaId, usuarioId, orgaoConcedenteId);
int qtd = getSession().createSQLQuery(sql).executeUpdate();
return qtd;
}
public void limparTarifasOficiais(List<Empresa> lsEmpresaSelected) {
String query = "DELETE FROM TarifaOficial ";
if (lsEmpresaSelected != null && !lsEmpresaSelected.isEmpty()) {
query += "WHERE tarifaOficialId IN ( ";
query += " SELECT t.tarifaOficialId FROM TarifaOficial t WHERE t.marca.empresa.empresaId IN (";
for (Empresa e : lsEmpresaSelected) {
query += e.getEmpresaId() + ",";
}
query = query.substring(0, query.length() - 1);
query += "))";
}
Query q = getSession().createQuery(query);
q.executeUpdate();
}
private void apagarTarifasInativas(VigenciaTarifa vigenciaTarifa, Empresa empresa, OrgaoConcedente orgao) {
StringBuilder sb = new StringBuilder("");
sb.append("select ");
sb.append(" tar.tarifaId ");
sb.append("from ");
sb.append(" Tarifa tar,TarifaOficial tao ");
sb.append("where ");
sb.append(" tar.activo=0 ");
sb.append(" and tao.activo = 1 ");
sb.append(" and tar.tramo=tao.tramo ");
sb.append(" and tar.marca=tao.marca ");
sb.append(" and tar.claseServicio =tao.claseServicio ");
sb.append(" and tar.moneda=tao.moneda ");
sb.append(" and tar.orgaoConcedente=tao.orgaoConcedente ");
sb.append(" and tar.ruta=tao.ruta ");
sb.append(" and tar.vigenciaTarifa.vigenciatarifaId = :vigenciaId ");
if (orgao != null) {
sb.append(" and tar.orgaoConcedente = :orgao ");
}
if (empresa != null) {
sb.append(" and tar.marca.empresa = :empresa ");
}
Query query = getSession().createQuery("DELETE FROM TarifaTipoptovta WHERE tarifa.tarifaId in (" + sb.toString() + ")");
query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId());
if (orgao != null) {
query.setParameter("orgao", orgao);
}
if (empresa != null) {
query.setParameter("empresa", empresa);
}
int qtd = query.executeUpdate();
log.info("qtd TarifaTipoptovta apagada = " + qtd);
query = getSession().createQuery("DELETE FROM TarifaCategoria WHERE tarifa.tarifaId in (" + sb.toString() + ")");
query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId());
if (orgao != null) {
query.setParameter("orgao", orgao);
}
if (empresa != null) {
query.setParameter("empresa", empresa);
}
qtd = query.executeUpdate();
log.info("qtd TarifaCategoria apagada = " + qtd);
query = getSession().createQuery("DELETE FROM Tarifa WHERE activo = 0 and tarifaId in (" + sb.toString() + ")");
query.setParameter("vigenciaId", vigenciaTarifa.getVigenciatarifaId());
if (orgao != null) {
query.setParameter("orgao", orgao);
}
if (empresa != null) {
query.setParameter("empresa", empresa);
}
qtd = query.executeUpdate();
log.info("qtd Tarifa apagada = " + qtd);
}
@SuppressWarnings("unchecked")
@Override
public void copiarParaTarifa(VigenciaTarifa vigenciaTarifa, Integer usuarioId, Boolean calculaPegagio, Boolean calculaTarifa, Boolean calculaTaxaEmbarque, Boolean calculaSeguro, Empresa empresa, OrgaoConcedente orgaoConcedente) {
//Apago antes as tarifas que podem estar como activo =0
apagarTarifasInativas(vigenciaTarifa, empresa, orgaoConcedente);
// Insiro as tarifas que n<>o existem
SQLQuery querySQL = getSession().createSQLQuery(sqlBuilder.getSQLInserirTarifaPelaTarifaOficial(vigenciaTarifa.getVigenciatarifaId(), usuarioId, empresa, orgaoConcedente));
querySQL.executeUpdate();
// Atualizo o pre<72>o e o componente dos pre<72>os que j<> existem
querySQL = getSession().createSQLQuery(sqlBuilder.getSQLSelecionarTarifaPorTarifaOficalParaAtualizar(vigenciaTarifa.getVigenciatarifaId(), empresa, orgaoConcedente));
querySQL.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> dados = querySQL.list();
for (Map<String, Object> dado : dados) {
querySQL = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTarifaPorTarifaOfical(dado, usuarioId, calculaPegagio, calculaTarifa, calculaTaxaEmbarque, calculaSeguro));
querySQL.executeUpdate();
}
}
@Override
public void atualizarTaxaEmbarque(List<Ruta> lsRuta, Integer usuarioId, Integer orgaoConcedenteId, List<Integer> idsEmpresas) {
int x = 0;
if (lsRuta != null && !lsRuta.isEmpty()) {
x = lsRuta.size();
}
do {
Integer rutaId = null;
if (lsRuta != null && !lsRuta.isEmpty()) {
rutaId = lsRuta.get(x - 1).getRutaId();
}
// Atualizo a taxa de embarque de acordo a parada e km
SQLQuery query = getSession().createSQLQuery(sqlBuilder.getAtualizarTaxaEmbarquePorKmParada(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas));
query.executeUpdate();
// Atualizo a taxa de embarque de acordo a km do orgao
query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTaxaEmbarquePorKmOrgao(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas));
query.executeUpdate();
// Atualizo a taxa de embarque de acordo a parada e valor fixo
query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarTaxaEmbarquePorParadaFixo(rutaId, usuarioId, orgaoConcedenteId, idsEmpresas));
query.executeUpdate();
x--;
} while (x > 0);
}
@Override
public void atualizarSeguroPorKm(Integer rutaId, Integer orgaoId, Integer usuarioId) {
SQLQuery query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarSeguroPorKm(rutaId, usuarioId, orgaoId));
query.executeUpdate();
}
@Override
public void atualizarSeguroPorTarifa(Integer rutaId, Integer orgaoId, Integer usuarioId) {
SQLQuery query = getSession().createSQLQuery(sqlBuilder.getSQLAtualizarSeguroPorTarifa(rutaId, usuarioId, orgaoId));
query.executeUpdate();
}
@Override
public long obtenerCount(List<Empresa> lsEmpresaSelected){
String query = " select count(*) from TarifaOficial ";
if (lsEmpresaSelected != null && !lsEmpresaSelected.isEmpty()) {
query += "WHERE tarifaOficialId IN ( ";
query += " SELECT t.tarifaOficialId FROM TarifaOficial t WHERE t.marca.empresa.empresaId IN (";
for (Empresa e : lsEmpresaSelected) {
query += e.getEmpresaId() + ",";
}
query = query.substring(0, query.length() - 1);
query += "))";
}
long qtd = 0;
Query q = getSession().createQuery(query);
qtd = (Long) q.list().get(0);
return qtd;
}
@Override
public void aplicarArredondamentoTarifa(Integer orgaoConcedenteId, Integer usuarioId, Boolean taxaEmbarque) {
StringBuilder sql = new StringBuilder();
sql.append(" UPDATE TarifaOficial tao ");
sql.append(" SET tao.precio = FN_ARREDONDAMENTO_TARIFA(tao.precio,tao.orgaoConcedente.orgaoConcedenteId,tao.importeseguro,tao.importetaxaembarque,tao.importepedagio,tao.importeoutros,:txEmbarque), ");
sql.append(" tao.activo = true , ");
sql.append(" tao.fecmodif= CURRENT_TIMESTAMP(), ");
sql.append(" tao.usuarioId =:usuarioId ");
if (orgaoConcedenteId != null) {
sql.append(" WHERE tao.orgaoConcedente.orgaoConcedenteId = :orgao ");
}
Query query = getSession().createQuery(sql.toString());
if (orgaoConcedenteId != null) {
query.setParameter("orgao", orgaoConcedenteId);
}
query.setInteger("txEmbarque", taxaEmbarque ? 1 : 0);
query.setParameter("usuarioId", usuarioId);
query.executeUpdate();
}
@SuppressWarnings("deprecation")
public void atualizarPedagio() {
StringBuilder sql = new StringBuilder();
if (ApplicationProperties.getInstance().artespPedagioIdaVoltaDivPor2()) {
sql.append(" merge into tarifa_oficial ");
sql.append(" using ");
sql.append(" ( ");
sql.append(" WITH tarifas_ofic as ( ");
sql.append(" select tarifaoficial_id, ORGAOCONCEDENTE_ID, ruta_id , origen_id , DESTINO_ID from tarifa_oficial where activo = 1");
sql.append(" ), ");
sql.append(" noArtesp as (select p.destino_id dest, p.origen_id as orig , p.ruta_id as idruta ,p.orgaoconcedente_id as idorgao, ");
sql.append(" p.importepeaje as importe , p.activo as actv from peaje p inner join tarifas_ofic tof on ");
sql.append(" p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID and p.ruta_id = tof.ruta_id ");
sql.append(" and p.ORIGEN_ID = tof.ORIGEN_ID and p.DESTINO_ID = tof.DESTINO_ID and p.activo = 1), ");
sql.append(" linha as ( select * from ruta where ruta_id in (select ruta_id from tarifas_ofic ) ) , ");
sql.append(" linha_voltaId as (select ru.ruta_id rutavolta_id, t_1.ruta_id as ida from ruta ru ");
sql.append(" inner join linha t_1 on ru.prefixo like t_1.prefixo ");
sql.append(" and ru.orgaoconcedente_id = t_1.orgaoconcedente_id ");
sql.append(" and ru.indsentidoIda <> t_1.indsentidoIda ");
sql.append(" and ( (ru.numruta like t_1.numruta) or (ru.numruta like (to_char(to_Number(t_1.numruta)+1))) ) ");
sql.append(" and ru.ruta_id <> t_1.ruta_id ");
sql.append(" and ru.claseservicio_id = t_1.claseservicio_id ");
sql.append(" where ru.activo = 1), ");
sql.append(" artesp as ( ");
sql.append(" SELECT * ");
sql.append(" FROM peaje p ");
sql.append(" INNER JOIN tarifas_ofic tof ");
sql.append(" ON p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID ");
sql.append(" AND p.ruta_id = tof.ruta_id ");
sql.append(" AND p.ORIGEN_ID = tof.ORIGEN_ID ");
sql.append(" AND p.DESTINO_ID = tof.DESTINO_ID ");
sql.append(" AND p.activo = 1 ");
sql.append(" union ");
sql.append(" SELECT * ");
sql.append(" FROM peaje p ");
sql.append(" INNER JOIN tarifas_ofic tof ");
sql.append(" ON p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID ");
sql.append(" AND p.ruta_id = (select rutavolta_id from linha_voltaId where linha_voltaId.ida = tof.ruta_id) ");
sql.append(" AND p.DESTINO_ID = tof.ORIGEN_ID ");
sql.append(" AND p.ORIGEN_ID = tof.DESTINO_ID ");
sql.append(" AND p.activo = 1 ");
sql.append(" AND p.ruta_id = (select rutavolta_id from linha_voltaId where linha_voltaId.ida = tof.ruta_id) ");
sql.append(" ) , ");
sql.append(" resultado as ( ");
sql.append(" select distinct tof.tarifaoficial_id tarifaoficial_id, tof.ruta_id as ruta, ");
sql.append(" ( case tof.orgaoconcedente_id ");
sql.append(" when 21 then ( select (sum(importepeaje)/2) from artesp ar where ar.tarifaoficial_id = tof.tarifaoficial_id ) ");
sql.append(" else ( select distinct sum(noar.importe) from noArtesp noar where noar.idorgao = tof.ORGAOCONCEDENTE_ID and noar.idruta = tof.ruta_id ");
sql.append(" and noar.ORIG = tof.ORIGEN_ID and noar.DEST = tof.DESTINO_ID and noar.actv = 1 ) ");
sql.append(" end ) importepeaje from tarifas_ofic tof ");
sql.append(" ), ");
sql.append(" peaje_tarifas as ( select * from resultado ) ");
sql.append(" select pf.tarifaoficial_id , sum(importepeaje) as soma from peaje_tarifas pf Group by pf.tarifaoficial_id ");
sql.append(" ");
sql.append(" ) tarifa_importe ");
sql.append(" on (tarifa_oficial.tarifaoficial_id = tarifa_importe.tarifaoficial_id) ");
sql.append(" when matched then ");
sql.append(" update set ");
sql.append(" importepedagio = tarifa_importe.soma ");
}else{
sql.append(" merge into tarifa_oficial ");
sql.append(" using ");
sql.append(" ( ");
sql.append(" WITH tarifas_ofic as ( ");
sql.append(" select tarifaoficial_id, ORGAOCONCEDENTE_ID, ruta_id , origen_id , DESTINO_ID from tarifa_oficial ");
sql.append(" ), ");
sql.append(" peaje_tarifas as ( ");
sql.append(" select * from peaje p inner join tarifas_ofic tof on ");
sql.append(" p.ORGAOCONCEDENTE_ID = tof.ORGAOCONCEDENTE_ID and p.ruta_id = tof.ruta_id ");
sql.append(" and p.ORIGEN_ID = tof.ORIGEN_ID and p.DESTINO_ID = tof.DESTINO_ID and p.activo = 1 ");
sql.append(" ) ");
sql.append(" select pf.tarifaoficial_id , sum(importepeaje) as soma from peaje_tarifas pf Group by pf.tarifaoficial_id ");
sql.append(" ");
sql.append(" ) tarifa_importe ");
sql.append(" on (tarifa_oficial.tarifaoficial_id = tarifa_importe.tarifaoficial_id) ");
sql.append(" when matched then ");
sql.append(" update set ");
sql.append(" importepedagio = tarifa_importe.soma ");
}
Connection conn = getSession().connection();
Statement stmt;
try {
stmt = conn.createStatement();
stmt.executeUpdate(sql.toString());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}