package br.com.centralit.citcorpore.integracao;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import br.com.centralit.bpm.util.Enumerados;
import br.com.centralit.bpm.util.Enumerados.TipoAtribuicao;
import br.com.centralit.citcorpore.bean.GerenciamentoRotasDTO;
import br.com.centralit.citcorpore.bean.SolicitacaoServicoDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.bean.result.GerenciamentoRotasResultDTO;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.TipoSolicitacaoServico;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.integracao.core.DataBase;
import br.com.citframework.integracao.core.Page;
import br.com.citframework.integracao.core.PageRequest;
import br.com.citframework.integracao.core.Pageable;
import br.com.citframework.integracao.core.PagingQueryUtil;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.geo.GeoLocation;
import br.com.citframework.util.geo.GeoUtils;
/**
* DAO para as consultas de {@link SolicitacaoServicoDTO} realizadas pelo mobile V2
*
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @author maycon.fernandes - <a href="mailto:maycon.fernandes@centrait.com.br">maycon.fernandes@centrait.com.br</a>
* @since 09/10/2014
*
*/
public class SolicitacaoServicoForMobileV2Dao extends SolicitacaoServicoDao {
private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd hh:mm:ss";
private static final int DEFAULT_PAGE = 0;
private static final String WHERE_ID_SOLICITACAO = " WHERE sol.idsolicitacaoservico ";
private static final String ORDER_BY_ID_SOLICITACAO = " ORDER BY sol.idsolicitacaoservico DESC, atrSol.dataexecucao, atrSol.priorityOrder ";
public Page<SolicitacaoServicoDTO> listNewest(final Integer newestNumber, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao)
throws PersistenceException {
final List<Object> parametros = new ArrayList<>();
final Pageable pageable = this.getDefaultPageable();
final StringBuilder from = this.fromQueryPiece(usuario, parametros);
final StringBuilder sql = this.montarSQLSolicitacao(from);
final StringBuilder where = new StringBuilder(WHERE_ID_SOLICITACAO);
where.append(" > ? ");
sql.append(where);
parametros.add(newestNumber);
final String filtrarPorTipoAndAprovacao = this.fitrarPorTipoAndAprovacao(parametros, tiposSolicitacao, aprovacao);
sql.append(filtrarPorTipoAndAprovacao);
sql.append(ORDER_BY_ID_SOLICITACAO);
final Object[] parametrosArray = parametros.toArray();
final List<SolicitacaoServicoDTO> result = this.executeQuery(sql.toString(), pageable, parametrosArray, this.getListNamesFieldDB(), this.getBean());
this.setTipoSoliticacaoOnResult(result);
return this.makePage(result, pageable, 0L);
}
public Page<SolicitacaoServicoDTO> listOldest(final Integer oldestNumber, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao)
throws PersistenceException {
final Pageable pageable = this.getDefaultPageable();
final List<Object> parametros = new ArrayList<>();
final StringBuilder from = this.fromQueryPiece(usuario, parametros);
final StringBuilder sql = this.montarSQLSolicitacao(from);
final StringBuilder where = new StringBuilder(WHERE_ID_SOLICITACAO);
where.append(" < ? ");
sql.append(where);
parametros.add(oldestNumber);
final String filtrarPorTipoAndAprovacao = this.fitrarPorTipoAndAprovacao(parametros, tiposSolicitacao, aprovacao);
sql.append(filtrarPorTipoAndAprovacao);
sql.append(ORDER_BY_ID_SOLICITACAO);
final Object[] parametrosArray = parametros.toArray();
final List<SolicitacaoServicoDTO> result = this.executeQuery(sql.toString(), pageable, parametrosArray, this.getListNamesFieldDB(), this.getBean());
this.setTipoSoliticacaoOnResult(result);
return this.makePage(result, pageable, 0L);
}
public Page<SolicitacaoServicoDTO> listByCoordinates(final GeoLocation referencePoint, final GeoLocation[] bounds, final double distanceRadius,
final boolean meridian180WithinDistance, final UsuarioDTO usuario, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao, final Pageable pageable)
throws PersistenceException {
final List<Object> parametros = new ArrayList<>();
final StringBuilder from = this.fromQueryPiece(usuario, parametros);
final StringBuilder sql = this.montarSQLSolicitacao(from);
final StringBuilder where = new StringBuilder(" WHERE ");
switch (MAIN_SGBD) {
case ORACLE:
case POSTGRESQL:
where.append(GeoUtils.getSQLWherePieceForDistanceWithIndex("ender.latitude", "ender.longitude", meridian180WithinDistance));
break;
default:
where.append(GeoUtils.getSQLWherePieceForDistanceWithIndexForMySQLAndMSSQLServer("ender.latitude_radians", "ender.longitude_radians", meridian180WithinDistance));
break;
}
sql.append(where);
parametros.add(bounds[0].getLatitudeInRadians());
parametros.add(bounds[1].getLatitudeInRadians());
parametros.add(bounds[0].getLongitudeInRadians());
parametros.add(bounds[1].getLongitudeInRadians());
parametros.add(referencePoint.getLatitudeInRadians());
parametros.add(referencePoint.getLatitudeInRadians());
parametros.add(referencePoint.getLongitudeInRadians());
parametros.add(distanceRadius);
final String filtrarPorTipoAndAprovacao = this.fitrarPorTipoAndAprovacao(parametros, tiposSolicitacao, aprovacao);
sql.append(filtrarPorTipoAndAprovacao);
sql.append(ORDER_BY_ID_SOLICITACAO);
final Object[] parametrosArray = parametros.toArray();
final List<SolicitacaoServicoDTO> result = this.executeQuery(sql.toString(), pageable, parametrosArray, this.getListNamesFieldDB(), this.getBean());
this.setTipoSoliticacaoOnResult(result);
final StringBuilder sqlCount = this.countQueryPiece(from);
sqlCount.append(where);
sqlCount.append(filtrarPorTipoAndAprovacao);
final Long totalElements = this.countElements(sqlCount.toString(), parametrosArray);
return this.makePage(result, pageable, totalElements);
}
public Page<SolicitacaoServicoDTO> listNotificationByNumberAndUser(final Integer number, final UsuarioDTO user) throws PersistenceException {
final Pageable pageable = this.getDefaultPageable();
final List<Object> parametros = new ArrayList<>();
final StringBuilder from = this.fromQueryPiece(user, parametros);
final StringBuilder sql = this.montarSQLSolicitacao(from);
final StringBuilder where = new StringBuilder(WHERE_ID_SOLICITACAO);
where.append(" = ? ");
sql.append(where);
parametros.add(number);
final Object[] parametrosArray = parametros.toArray();
final List<SolicitacaoServicoDTO> result = this.executeQuery(sql.toString(), pageable, parametrosArray, this.getListNamesFieldDB(), this.getBean());
return this.makePage(result, pageable, 0L);
}
private void setTipoSoliticacaoOnResult(final List<SolicitacaoServicoDTO> result) {
if (result != null) {
for (final SolicitacaoServicoDTO solicitacao : result) {
if (solicitacao.getIdRequisicaoProduto() != null) {
solicitacao.setTipoSolicitacao(TipoSolicitacaoServico.COMPRA);
} else if (solicitacao.getIdRequisicaoViagem() != null) {
solicitacao.setTipoSolicitacao(TipoSolicitacaoServico.VIAGEM);
} else if (solicitacao.getIdRequisicaoPessoal() != null) {
solicitacao.setTipoSolicitacao(TipoSolicitacaoServico.RH);
} else if (solicitacao.getClassificacao() != null && solicitacao.getClassificacao().equalsIgnoreCase("R")) {
solicitacao.setTipoSolicitacao(TipoSolicitacaoServico.REQUISICAO);
} else {
solicitacao.setTipoSolicitacao(TipoSolicitacaoServico.INCIDENTE);
}
}
}
}
public Page<GerenciamentoRotasResultDTO> listarSolicitacoesParaRoteirizacao(final GerenciamentoRotasDTO filter, final Pageable pageable) throws PersistenceException {
final List<Object> params = new ArrayList<>();
final StringBuilder sql = new StringBuilder();
sql.append("SELECT atrSol.id AS idatribuicao, ");
sql.append(" atrSol.datainicioatendimento, ");
sql.append(" atrSol.priorityOrder, ");
sql.append(" sol.idsolicitacaoservico, ");
sql.append(" bpmItem.iditemtrabalho AS idtarefa, ");
sql.append(" contr.numero AS nomeContrato, ");
sql.append(" sol.prazohh, ");
sql.append(" sol.prazomm, ");
sql.append(" tipoDeman.nometipodemandaservico AS tipo, ");
sql.append(" sol.situacao, ");
sql.append(" und.nome AS nomeunidade, ");
sql.append(" ender.latitude, ");
sql.append(" ender.longitude, ");
if (MAIN_SGBD.equals(DataBase.ORACLE)) {
sql.append(" dbms_lob.SUBSTR");
} else {
sql.append(" SUBSTRING");
}
sql.append("(sol.descricao, 1, 100) AS descricao ");
final StringBuilder from = new StringBuilder();
from.append("FROM bpm_atribuicaofluxo bpmAtr ");
from.append(" INNER JOIN bpm_itemtrabalhofluxo bpmItem ");
from.append(" ON bpmAtr.iditemtrabalho = bpmItem.iditemtrabalho ");
from.append(" INNER JOIN bpm_instanciafluxo bpmIstancia ");
from.append(" ON bpmItem.idinstancia = bpmIstancia.idinstancia ");
from.append(" INNER JOIN bpm_elementofluxo bpm_ele ");
from.append(" ON bpmItem.idelemento = bpm_ele.idelemento ");
from.append(" LEFT JOIN templatesolicitacaoservico tem ");
from.append(" ON bpm_ele.template = tem.identificacao ");
from.append(" LEFT JOIN execucaosolicitacao exeSol ");
from.append(" ON bpmIstancia.idinstancia = exeSol.idinstanciafluxo ");
from.append(" LEFT JOIN solicitacaoservico sol ");
from.append(" ON exeSol.idsolicitacaoservico = sol.idsolicitacaoservico ");
from.append(" LEFT JOIN servicocontrato servContrato ");
from.append(" ON servContrato.idservicocontrato = sol.idservicocontrato ");
from.append(" LEFT JOIN contratos contr ");
from.append(" ON contr.idcontrato = servContrato.idcontrato ");
from.append(" LEFT JOIN servico serv ");
from.append(" ON serv.idservico = servContrato.idservico ");
from.append(" LEFT JOIN tipodemandaservico tipoDeman ");
from.append(" ON tipoDeman.idtipodemandaservico = serv.idtipodemandaservico ");
from.append(" LEFT JOIN unidade und ");
from.append(" ON sol.idunidade = und.idunidade ");
from.append(" LEFT JOIN endereco ender ");
from.append(" ON und.idendereco = ender.idendereco ");
from.append(" LEFT JOIN ufs ");
from.append(" ON ender.iduf = ufs.iduf ");
from.append(" LEFT JOIN cidades cid ");
from.append(" ON ender.idcidade = cid.idcidade ");
from.append(" LEFT JOIN requisicaoproduto reqprod ");
from.append(" ON reqprod.idsolicitacaoservico = sol.idsolicitacaoservico ");
from.append(" LEFT JOIN rh_requisicaopessoal reqrh ");
from.append(" ON reqrh.idsolicitacaoservico = sol.idsolicitacaoservico ");
from.append(" LEFT JOIN requisicaoviagem reqviagem ");
from.append(" ON reqviagem.idsolicitacaoservico = sol.idsolicitacaoservico ");
from.append(" LEFT JOIN atribuicaosolicitacao atrSol ");
from.append(" ON sol.idsolicitacaoservico = atrSol.idsolicitacao AND atrSol.active = 1 ");
from.append("WHERE bpmItem.situacao NOT IN ( 'Executado', 'Cancelado' ) ");
from.append(" AND ( bpmAtr.idusuario = ? ");
from.append(" OR bpmAtr.idgrupo IN (SELECT gr.idgrupo ");
from.append(" FROM grupo gr ");
from.append(" INNER JOIN gruposempregados gremp ");
from.append(" ON gr.idgrupo = gremp.idgrupo ");
from.append(" INNER JOIN empregados emp ");
from.append(" ON emp.idempregado = ");
from.append(" gremp.idempregado ");
from.append(" INNER JOIN usuario usu ");
from.append(" ON usu.idempregado = ");
from.append(" emp.idempregado ");
from.append(" WHERE usu.idusuario = ?) ");
from.append(" OR bpmItem.idresponsavelatual = ? ) ");
from.append(" AND ( atrSol.id IN (SELECT MAX(id) ");
from.append(" FROM atribuicaosolicitacao ");
from.append(" GROUP BY idsolicitacao) ");
from.append(" OR atrSol.id IS NULL ) ");
from.append(" AND bpmAtr.tipo = 'Automatica' ");
final Integer idUsuario = filter.getIdUsuario();
params.add(idUsuario);
params.add(idUsuario);
params.add(idUsuario);
final Timestamp dataTimeInicio = filter.getTimestampInicio();
final Timestamp dataTimeFim = filter.getTimestampFim();
if (MAIN_SGBD.equals(DataBase.ORACLE)) {
from.append(" AND TO_CHAR(sol.datahorasolicitacao, 'YYYY-MM-DD HH24:MI:SS') BETWEEN ? AND ? ");
params.add(UtilDatas.dateToSTRWithFormat(dataTimeInicio, YYYY_MM_DD_HH_MM_SS));
params.add(UtilDatas.dateToSTRWithFormat(dataTimeFim, YYYY_MM_DD_HH_MM_SS));
} else {
from.append(" AND sol.datahorasolicitacao BETWEEN ? AND ? ");
params.add(dataTimeInicio);
params.add(dataTimeFim);
}
from.append(" AND cid.idcidade = ? ");
params.add(filter.getIdCidade());
final Integer contrato = filter.getIdContrato();
if (contrato != null && !contrato.equals(0)) {
from.append(" AND contr.idcontrato = ? ");
params.add(contrato);
}
final Integer unidade = filter.getIdUnidade();
if (unidade != null && !unidade.equals(0)) {
from.append(" AND und.idunidade = ? ");
params.add(unidade);
}
final Integer tipo = filter.getIdTipoSolicitacao();
if (tipo != null && !tipo.equals(0)) {
from.append(" AND tipoDeman.idtipodemandaservico = ? ");
params.add(tipo);
}
sql.append(from);
sql.append("ORDER BY sol.idsolicitacaoservico, atrSol.dataexecucao, atrSol.priorityOrder ");
final Object[] paramsArray = params.toArray();
final List<GerenciamentoRotasResultDTO> result = this.executeQuery(sql.toString(), pageable, paramsArray, this.getFieldsRoteirizacao(), GerenciamentoRotasResultDTO.class);
final StringBuilder sqlCount = this.countQueryPiece(from);
final Long totalElements = this.countElements(sqlCount.toString(), paramsArray);
return this.makePage(result, pageable, totalElements);
}
private List<String> listNamesFieldDB;
@Override
public List<String> getListNamesFieldDB() {
if (listNamesFieldDB == null) {
listNamesFieldDB = new ArrayList<>();
listNamesFieldDB.add("idSolicitacaoIndividual");
listNamesFieldDB.add("dataInicioAtendimento");
listNamesFieldDB.add("idSolicitacaoServico");
listNamesFieldDB.add("situacao");
listNamesFieldDB.add("dataHoraLimite");
listNamesFieldDB.add("prazoHH");
listNamesFieldDB.add("prazoMM");
listNamesFieldDB.add("dataHoraSolicitacao");
listNamesFieldDB.add("prazoCapturaHH");
listNamesFieldDB.add("prazoCapturaMM");
listNamesFieldDB.add("dataHoraInicio");
listNamesFieldDB.add("dataHoraFim");
listNamesFieldDB.add("slaACombinar");
listNamesFieldDB.add("prazohhAnterior");
listNamesFieldDB.add("prazommAnterior");
listNamesFieldDB.add("idCalendario");
listNamesFieldDB.add("tempoDecorridoHH");
listNamesFieldDB.add("tempoDecorridoMM");
listNamesFieldDB.add("dataHoraSuspensao");
listNamesFieldDB.add("dataHoraReativacao");
listNamesFieldDB.add("dataHoraCaptura");
listNamesFieldDB.add("tempoCapturaHH");
listNamesFieldDB.add("tempoCapturaMM");
listNamesFieldDB.add("tempoAtrasoHH");
listNamesFieldDB.add("tempoAtrasoMM");
listNamesFieldDB.add("tempoAtendimentoHH");
listNamesFieldDB.add("tempoAtendimentoMM");
listNamesFieldDB.add("dataHoraInicioSLA");
listNamesFieldDB.add("situacaoSLA");
listNamesFieldDB.add("dataHoraSuspensaoSLA");
listNamesFieldDB.add("dataHoraReativacaoSLA");
listNamesFieldDB.add("latitude");
listNamesFieldDB.add("longitude");
listNamesFieldDB.add("idTarefa");
listNamesFieldDB.add("nomeElementoFluxo");
listNamesFieldDB.add("servico");
listNamesFieldDB.add("aprovacao");
listNamesFieldDB.add("tipoAtribuicao");
listNamesFieldDB.add("idResponsavel");
listNamesFieldDB.add("idContrato");
listNamesFieldDB.add("idUnidade");
listNamesFieldDB.add("priorityorder");
listNamesFieldDB.add("identificacaoTemplate");
listNamesFieldDB.add("idFluxo");
listNamesFieldDB.add("idRequisicaoProduto");
listNamesFieldDB.add("idRequisicaoViagem");
listNamesFieldDB.add("idRequisicaoPessoal");
listNamesFieldDB.add("classificacao");
}
return listNamesFieldDB;
}
private List<String> fieldsRoteirizacao;
private List<String> getFieldsRoteirizacao() {
if (fieldsRoteirizacao == null) {
fieldsRoteirizacao = new ArrayList<>();
fieldsRoteirizacao.add("idAtribuicao");
fieldsRoteirizacao.add("dataInicioAtendimento");
fieldsRoteirizacao.add("priorityOrder");
fieldsRoteirizacao.add("idSolicitacao");
fieldsRoteirizacao.add("idTarefa");
fieldsRoteirizacao.add("nomeContrato");
fieldsRoteirizacao.add("prazoHH");
fieldsRoteirizacao.add("prazoMM");
fieldsRoteirizacao.add("tipo");
fieldsRoteirizacao.add("situacao");
fieldsRoteirizacao.add("nomeUnidade");
fieldsRoteirizacao.add("latitude");
fieldsRoteirizacao.add("longitude");
fieldsRoteirizacao.add("descricao");
}
return fieldsRoteirizacao;
}
public StringBuilder montarSQLSolicitacao(final StringBuilder sqlFrom) {
final StringBuilder sql = new StringBuilder();
sql.append("select ");
sql.append(" atrSol.idsolicitacao, ");
sql.append(" atrSol.datainicioatendimento, ");
sql.append(" sol.idsolicitacaoservico, ");
sql.append(" sol.situacao, ");
sql.append(" sol.datahoralimite, ");
sql.append(" sol.prazohh, ");
sql.append(" sol.prazomm, ");
sql.append(" sol.datahorasolicitacao, ");
sql.append(" sol.prazocapturahh, ");
sql.append(" sol.prazocapturamm, ");
sql.append(" sol.datahorainicio, ");
sql.append(" sol.datahorafim, ");
sql.append(" sol.slaacombinar, ");
sql.append(" sol.prazohhanterior, ");
sql.append(" sol.prazommanterior, ");
sql.append(" sol.idcalendario, ");
sql.append(" sol.tempodecorridohh, ");
sql.append(" sol.tempodecorridomm, ");
sql.append(" sol.datahorasuspensao, ");
sql.append(" sol.datahorareativacao, ");
sql.append(" sol.datahoracaptura, ");
sql.append(" sol.tempocapturahh, ");
sql.append(" sol.tempocapturamm, ");
sql.append(" sol.tempoatrasohh, ");
sql.append(" sol.tempoatrasomm, ");
sql.append(" sol.tempoatendimentohh, ");
sql.append(" sol.tempoatendimentomm, ");
sql.append(" sol.datahorainiciosla, ");
sql.append(" sol.situacaosla, ");
sql.append(" sol.datahorasuspensaosla, ");
sql.append(" sol.datahorareativacaosla, ");
sql.append(" ender.latitude, ");
sql.append(" ender.longitude, ");
sql.append(" tarefa.idtarefa, ");
sql.append(" tarefa.nomeElemento, ");
sql.append(" s.nomeservico, ");
sql.append(" tarefa.aprovar, ");
sql.append(" tarefa.tipoAtribuicao, ");
sql.append(" tarefa.idresponsavelatual, ");
sql.append(" c.idcontrato, ");
sql.append(" unidade.idunidade, ");
sql.append(" atrSol.priorityorder, ");
sql.append(" tarefa.identificacao, ");
sql.append(" tarefa.idfluxo, ");
sql.append(" reqprod.idSolicitacaoServico as idrequisicaoproduto, ");
sql.append(" reqviagem.idSolicitacaoServico as idrequisicaoviagem, ");
sql.append(" reqrh.idSolicitacaoServico as idrequisicaopessoal, ");
sql.append(" td.classificacao ");
sql.append(sqlFrom);
return sql;
}
private StringBuilder fromQueryPiece(final UsuarioDTO usuario, final List<Object> parametros) {
final StringBuilder sqlFrom = new StringBuilder();
sqlFrom.append(" from ( ");
sqlFrom.append(" SELECT DISTINCT i.iditemtrabalho idtarefa, ");
sqlFrom.append(" bpm_ele.nome nomeElemento, ");
sqlFrom.append(" tem.aprovacao aprovar, ");
sqlFrom.append(" instancia.idinstancia, ");
sqlFrom.append(" i.idresponsavelatual, ");
sqlFrom.append(" a.tipo tipoAtribuicao, ");
sqlFrom.append(" tem.identificacao, ");
sqlFrom.append(" instancia.idfluxo ");
sqlFrom.append(" FROM bpm_atribuicaofluxo a ");
sqlFrom.append(" INNER JOIN bpm_itemtrabalhofluxo i ON a.iditemtrabalho = i.iditemtrabalho ");
sqlFrom.append(" INNER JOIN bpm_instanciafluxo instancia ON i.idinstancia = instancia.idinstancia ");
sqlFrom.append(" INNER JOIN bpm_elementofluxo bpm_ele ON i.idelemento = bpm_ele.idelemento ");
sqlFrom.append(" LEFT JOIN templatesolicitacaoservico tem ON bpm_ele.template = tem.identificacao ");
sqlFrom.append(" WHERE i.situacao NOT IN ( ?, ? ) ");
parametros.add(Enumerados.SituacaoItemTrabalho.Executado.name());
parametros.add(Enumerados.SituacaoItemTrabalho.Cancelado.name());
sqlFrom.append(" AND ( a.idusuario = ? OR a.idgrupo IN (SELECT gr.idgrupo ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" FROM grupo gr ");
sqlFrom.append(" INNER JOIN gruposempregados gremp ON gr.idgrupo = gremp.idgrupo ");
sqlFrom.append(" INNER JOIN empregados emp ON emp.idempregado = gremp.idempregado ");
sqlFrom.append(" INNER JOIN usuario usu ON usu.idempregado = emp.idempregado WHERE usu.idusuario = ?) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" OR i.idresponsavelatual = ? ) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" AND a.tipo = ? ");
parametros.add(TipoAtribuicao.Automatica.toString());
sqlFrom.append(" UNION ALL ");
sqlFrom.append(" SELECT DISTINCT ");
sqlFrom.append(" i.iditemtrabalho idtarefa, ");
sqlFrom.append(" bpm_ele.nome nomeElemento, ");
sqlFrom.append(" tem.aprovacao aprovar, ");
sqlFrom.append(" instancia.idinstancia, ");
sqlFrom.append(" i.idresponsavelatual, ");
sqlFrom.append(" a.tipo tipoAtribuicao, ");
sqlFrom.append(" tem.identificacao, ");
sqlFrom.append(" instancia.idfluxo ");
sqlFrom.append(" FROM bpm_atribuicaofluxo a ");
sqlFrom.append(" INNER JOIN bpm_itemtrabalhofluxo i ON a.iditemtrabalho = i.iditemtrabalho ");
sqlFrom.append(" INNER JOIN bpm_instanciafluxo instancia ON i.idinstancia = instancia.idinstancia ");
sqlFrom.append(" INNER JOIN bpm_elementofluxo bpm_ele ON i.idelemento = bpm_ele.idelemento ");
sqlFrom.append(" LEFT JOIN templatesolicitacaoservico tem ON bpm_ele.template = tem.identificacao ");
sqlFrom.append(" WHERE i.situacao NOT IN ( ?, ? ) ");
parametros.add(Enumerados.SituacaoItemTrabalho.Executado.name());
parametros.add(Enumerados.SituacaoItemTrabalho.Cancelado.name());
sqlFrom.append(" AND ( a.idusuario = ? ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" OR a.idgrupo IN (SELECT gr.idgrupo ");
sqlFrom.append(" FROM grupo gr ");
sqlFrom.append(" INNER JOIN gruposempregados gremp ON gr.idgrupo = gremp.idgrupo ");
sqlFrom.append(" INNER JOIN empregados emp ON emp.idempregado = gremp.idempregado ");
sqlFrom.append(" INNER JOIN usuario usu ON usu.idempregado = emp.idempregado WHERE usu.idusuario = ?) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" OR i.idresponsavelatual = ? ) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" AND a.tipo = ? ");
parametros.add(TipoAtribuicao.Acompanhamento.toString());
sqlFrom.append(" AND a.iditemtrabalho NOT IN (SELECT a.iditemtrabalho ");
sqlFrom.append(" FROM bpm_atribuicaofluxo a ");
sqlFrom.append(" INNER JOIN bpm_itemtrabalhofluxo i ON a.iditemtrabalho = i.iditemtrabalho ");
sqlFrom.append(" WHERE i.situacao NOT IN (? , ? ) ");
parametros.add(Enumerados.SituacaoItemTrabalho.Executado.name());
parametros.add(Enumerados.SituacaoItemTrabalho.Cancelado.name());
sqlFrom.append(" AND ( a.idusuario = ? OR a.idgrupo IN (SELECT gr.idgrupo FROM grupo gr ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" INNER JOIN gruposempregados gremp ON gr.idgrupo = gremp.idgrupo ");
sqlFrom.append(" INNER JOIN empregados emp ON emp.idempregado = gremp.idempregado ");
sqlFrom.append(" INNER JOIN usuario usu ON usu.idempregado = emp.idempregado WHERE usu.idusuario = ?) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" OR i.idresponsavelatual = ? ) ");
parametros.add(usuario.getIdUsuario());
sqlFrom.append(" AND a.tipo = ? ) ) tarefa ");
parametros.add(TipoAtribuicao.Automatica.toString());
sqlFrom.append(" INNER JOIN execucaosolicitacao exsol ON tarefa.idinstancia = exsol.idinstanciafluxo ");
sqlFrom.append(" INNER JOIN solicitacaoservico sol ON sol.idsolicitacaoservico = exsol.idsolicitacaoservico ");
sqlFrom.append(" LEFT JOIN (SELECT usu.idusuario, ");
sqlFrom.append(" emp.nome nomeempregado ");
sqlFrom.append(" FROM empregados emp INNER JOIN usuario usu ON usu.idempregado = emp.idempregado) empUsu ON tarefa.idresponsavelatual = empUsu.idusuario ");
sqlFrom.append(" LEFT JOIN servicocontrato sc ON sc.idservicocontrato = sol.idservicocontrato ");
sqlFrom.append(" LEFT JOIN contratos c ON c.idcontrato = sc.idcontrato ");
sqlFrom.append(" LEFT JOIN servico s ON s.idservico = sc.idservico ");
sqlFrom.append(" LEFT JOIN tipodemandaservico td ON td.idtipodemandaservico = s.idtipodemandaservico ");
sqlFrom.append(" LEFT JOIN unidade unidade ON unidade.idunidade = sol.idunidade ");
sqlFrom.append(" LEFT JOIN usuario usu ON usu.idusuario = sol.idresponsavel ");
sqlFrom.append(" LEFT JOIN endereco ender on unidade.idendereco = ender.idendereco ");
sqlFrom.append(" LEFT JOIN grupo g1 ON g1.idgrupo = sol.idgrupoatual ");
sqlFrom.append(" LEFT JOIN grupo g2 ON g2.idgrupo = sol.idgruponivel1 ");
sqlFrom.append(" LEFT JOIN contatosolicitacaoservico cs ON cs.idcontatosolicitacaoservico = sol.idcontatosolicitacaoservico ");
sqlFrom.append(" LEFT JOIN aprovacaosolicitacaoservico aprov ON aprov.idaprovacaosolicitacaoservico = sol.idultimaaprovacao ");
sqlFrom.append(" LEFT JOIN requisicaoproduto reqprod ON reqprod.idsolicitacaoservico = sol.idsolicitacaoservico ");
sqlFrom.append(" LEFT JOIN rh_requisicaopessoal reqrh ON reqrh.idsolicitacaoservico = sol.idsolicitacaoservico ");
sqlFrom.append(" LEFT JOIN requisicaoviagem reqviagem ON reqviagem.idsolicitacaoservico = sol.idsolicitacaoservico ");
sqlFrom.append(" LEFT JOIN atribuicaosolicitacao atrSol on sol.idsolicitacaoservico = atrSol.idsolicitacao AND atrSol.idusuario = ? AND atrSol.active = 1 ");
parametros.add(usuario.getIdUsuario());
return sqlFrom;
}
private String fitrarPorTipoAndAprovacao(final List<Object> parametros, final TipoSolicitacaoServico[] tiposSolicitacao, final String aprovacao) {
final StringBuilder sql = new StringBuilder();
boolean bIncidentes = false;
boolean bRequisicoes = false;
boolean bCompras = false;
boolean bViagens = false;
boolean bRH = false;
if (aprovacao != null && aprovacao.trim().equalsIgnoreCase("S")) {
sql.append(" AND tarefa.aprovar = ? ");
parametros.add("S");
}
if (tiposSolicitacao != null) {
for (final TipoSolicitacaoServico tipo : tiposSolicitacao) {
if (!bIncidentes && tipo.equals(TipoSolicitacaoServico.INCIDENTE)) {
bIncidentes = true;
}
if (!bRequisicoes && tipo.equals(TipoSolicitacaoServico.REQUISICAO)) {
bRequisicoes = true;
}
if (!bCompras && tipo.equals(TipoSolicitacaoServico.COMPRA)) {
bCompras = true;
}
if (!bViagens && tipo.equals(TipoSolicitacaoServico.VIAGEM)) {
bViagens = true;
}
if (!bRH && tipo.equals(TipoSolicitacaoServico.RH)) {
bRH = true;
}
}
}
boolean bFiltrouTipos = false;
if (bIncidentes) {
sql.append(" AND (td.classificacao = ? ");
parametros.add("I");
bFiltrouTipos = true;
}
if (bRequisicoes) {
if (bFiltrouTipos) {
sql.append(" OR ");
} else {
sql.append(" AND (");
}
sql.append(" reqprod.idsolicitacaoservico IS NULL AND reqviagem.idsolicitacaoservico IS NULL AND reqrh.idsolicitacaoservico IS NULL AND td.classificacao = ? ");
parametros.add("R");
bFiltrouTipos = true;
}
if (bCompras) {
if (bFiltrouTipos) {
sql.append(" OR ");
} else {
sql.append(" AND (");
}
sql.append(" reqprod.idsolicitacaoservico IS NOT NULL ");
bFiltrouTipos = true;
}
if (bViagens) {
if (bFiltrouTipos) {
sql.append(" OR ");
} else {
sql.append(" AND (");
}
sql.append(" reqviagem.idsolicitacaoservico IS NOT NULL ");
bFiltrouTipos = true;
}
if (bRH) {
if (bFiltrouTipos) {
sql.append(" OR ");
} else {
sql.append(" AND (");
}
sql.append(" reqrh.idsolicitacaoservico IS NOT NULL ");
bFiltrouTipos = true;
}
if (bFiltrouTipos) {
sql.append(") ");
}
return sql.toString();
}
private <E> List<E> executeQuery(final String query, final Pageable pageable, final Object[] params, final List<String> fields, final Class<E> beanClass)
throws PersistenceException {
final String sqlForPaging = PagingQueryUtil.concatPagingPieceOnQuery(pageable, query, DataBase.fromStringId(CITCorporeUtil.SGBD_PRINCIPAL));
final List<?> dados = this.execSQL(sqlForPaging, params);
return this.listConvertion(beanClass, dados, fields);
}
private Pageable getDefaultPageable() {
return new PageRequest(DEFAULT_PAGE, ParametroUtil.getValorParametro(ParametroSistema.REST_SERVICES_DEFAULT_PAGE_SIZE, "10"));
}
}