package br.com.centralit.citcorpore.integracao;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.bpm.util.Enumerados.SituacaoInstanciaFluxo;
import br.com.centralit.bpm.util.Enumerados.SituacaoItemTrabalho;
import br.com.centralit.bpm.util.Enumerados.TipoAtribuicao;
import br.com.centralit.citcorpore.bean.CalendarioDTO;
import br.com.centralit.citcorpore.bean.ContratoDTO;
import br.com.centralit.citcorpore.bean.GerenciamentoServicosDTO;
import br.com.centralit.citcorpore.bean.GrupoEmpregadoDTO;
import br.com.centralit.citcorpore.bean.JornadaTrabalhoDTO;
import br.com.centralit.citcorpore.bean.ParamRecuperacaoTarefasDTO;
import br.com.centralit.citcorpore.bean.TarefaUsuarioDTO;
import br.com.centralit.citcorpore.bean.UsuarioDTO;
import br.com.centralit.citcorpore.negocio.CalendarioServiceEjb;
import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citcorpore.util.Util;
import br.com.centralit.citged.bean.ControleGEDDTO;
import br.com.citframework.dto.IDto;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.integracao.CrudDaoDefaultImpl;
import br.com.citframework.integracao.Field;
import br.com.citframework.integracao.core.DataBase;
import br.com.citframework.integracao.core.Page;
import br.com.citframework.integracao.core.PageImpl;
import br.com.citframework.integracao.core.Pageable;
import br.com.citframework.integracao.core.PagingQueryUtil;
import br.com.citframework.util.Assert;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.UtilDatas;
public class TarefaUsuarioDao extends CrudDaoDefaultImpl {
public TarefaUsuarioDao() {
super(Constantes.getValue("DATABASE_ALIAS"), null);
}
@Override
public Collection<TarefaUsuarioDTO> find(final IDto obj) throws PersistenceException {
return null;
}
@Override
public Collection<Field> getFields() {
return null;
}
@Override
public String getTableName() {
return null;
}
@Override
public Collection<TarefaUsuarioDTO> list() throws PersistenceException {
return null;
}
@Override
public Class<TarefaUsuarioDTO> getBean() {
return TarefaUsuarioDTO.class;
}
private StringBuilder userGroupsPiece(final UsuarioDTO usuario) {
final StringBuilder str = new StringBuilder("(");
final Collection<GrupoEmpregadoDTO> gruposEmpregado = usuario.getColGrupoEmpregado();
if (gruposEmpregado != null) {
int i = 0;
for (final GrupoEmpregadoDTO grupoEmpregado : gruposEmpregado) {
if (i > 0) {
str.append(",");
}
str.append(grupoEmpregado.getIdGrupo());
i++;
}
}
str.append(")");
return str;
}
public Page<TarefaUsuarioDTO> recuperaTarefas(final ParamRecuperacaoTarefasDTO param, final Pageable pageable) throws PersistenceException {
Assert.isTrue(param.getUsuarioDto() != null && param.getUsuarioDto().getIdUsuario() != null, "User Id must not be null.");
final List<Object> parametros = new ArrayList<>();
Page<TarefaUsuarioDTO> taskPage;
if (!param.isSomenteTotalizacao()) {
String ordenarPor = "";
if (param.getGerenciamentoServicosDto() != null) {
ordenarPor = param.getGerenciamentoServicosDto().getOrdenarPor() == null ? "" : param.getGerenciamentoServicosDto().getOrdenarPor();
}
if (ordenarPor.equals("NSolicitacao")) {
ordenarPor = " ORDER BY sol.idsolicitacaoservico ";
} else if (ordenarPor.equals("servico")) {
ordenarPor = " ORDER BY s.nomeservico ";
} else if (ordenarPor.equals("responsavel")) {
ordenarPor = " ORDER BY e2.nome ";
} else if (ordenarPor.equals("prioridade")) {
ordenarPor = " ORDER BY sol.idprioridade ";
} else if (ordenarPor.equals("situacao")) {
ordenarPor = " ORDER BY sol.situacao ";
} else if (ordenarPor.equals("descricao")) {
if (MAIN_SGBD.equals(DataBase.MSSQLSERVER)) {
ordenarPor = " ORDER BY CAST(sol.descricao as Varchar(1000)) ";
} else {
ordenarPor = " ORDER BY sol.descricao ";
}
} else if (ordenarPor.equals("dataHoraLimite")) {
ordenarPor = " ORDER BY sol.datahoralimite ";
} else if (ordenarPor.equals("dataHoraLimiteCriacao")) {
ordenarPor = " ORDER BY sol.datahorasolicitacao ";
} else {
ordenarPor = " ORDER BY sol.idresponsavel ";
}
final StringBuilder selectQueryPiece = this.selectQueryPiece(parametros);
final StringBuilder fromWhereQueryPiece = this.fromQueryPiece(param, parametros);
String query;
if (MAIN_SGBD.equals(DataBase.MSSQLSERVER)) {
query = PagingQueryUtil.constructsSQLServerPagingPiece(pageable, selectQueryPiece.toString(), ordenarPor, fromWhereQueryPiece.toString());
} else {
selectQueryPiece.append(fromWhereQueryPiece);
selectQueryPiece.append(ordenarPor);
query = PagingQueryUtil.concatPagingPieceOnQuery(pageable, selectQueryPiece.toString(), MAIN_SGBD);
}
final List<?> lista = this.execSQL(query, parametros.toArray());
List<TarefaUsuarioDTO> result = new ArrayList<>();
if (lista != null && !lista.isEmpty()) {
result = engine.listConvertion(TarefaUsuarioDTO.class, lista, getListRetorno());
}
taskPage = new PageImpl<TarefaUsuarioDTO>(result, pageable, 1L);
} else {
final StringBuilder fromWhereQueryPiece = this.fromQueryPiece(param, parametros);
final StringBuilder sqlCount = this.countQueryPiece(fromWhereQueryPiece);
final Long totalElements = this.countElements(sqlCount.toString(), parametros.toArray());
final List<TarefaUsuarioDTO> result = new ArrayList<>();
taskPage = this.makePage(result, pageable, totalElements);
}
return taskPage;
}
private StringBuilder selectQueryPiece(final List<Object> parametros) {
final StringBuilder selectQueryPiece = new StringBuilder();
selectQueryPiece.append("SELECT sol.idsolicitacaoservico, ");
selectQueryPiece.append(" sol.idbaseconhecimento, ");
selectQueryPiece.append(" sol.idservicocontrato, ");
selectQueryPiece.append(" sol.idsolicitante, ");
selectQueryPiece.append(" sol.iditemconfiguracao, ");
selectQueryPiece.append(" sol.iditemconfiguracaofilho, ");
selectQueryPiece.append(" sol.idtipodemandaservico, ");
selectQueryPiece.append(" sol.idcontatosolicitacaoservico, ");
selectQueryPiece.append(" sol.idorigem, ");
selectQueryPiece.append(" sol.idresponsavel, ");
selectQueryPiece.append(" sol.idtipoproblema, ");
selectQueryPiece.append(" sol.idprioridade, ");
selectQueryPiece.append(" sol.idunidade, ");
selectQueryPiece.append(" sol.idfaseatual, ");
selectQueryPiece.append(" sol.idgrupoatual, ");
selectQueryPiece.append(" sol.datahorasolicitacao, ");
selectQueryPiece.append(" sol.datahoralimite, ");
selectQueryPiece.append(" sol.atendimentopresencial, ");
selectQueryPiece.append(" sol.prazocapturahh, ");
selectQueryPiece.append(" sol.prazocapturamm, ");
selectQueryPiece.append(" sol.prazohh, ");
selectQueryPiece.append(" sol.prazomm, ");
selectQueryPiece.append(" sol.descricao, ");
selectQueryPiece.append(" sol.resposta, ");
selectQueryPiece.append(" sol.datahorainicio, ");
selectQueryPiece.append(" sol.datahorafim, ");
selectQueryPiece.append(" sol.situacao, ");
selectQueryPiece.append(" sol.idsolicitacaopai, ");
selectQueryPiece.append(" sol.detalhamentocausa, ");
selectQueryPiece.append(" sol.idcausaincidente, ");
selectQueryPiece.append(" sol.idcategoriasolucao, ");
selectQueryPiece.append(" sol.seqreabertura, ");
selectQueryPiece.append(" sol.enviaemailcriacao, ");
selectQueryPiece.append(" sol.enviaemailfinalizacao, ");
selectQueryPiece.append(" sol.enviaemailacoes, ");
selectQueryPiece.append(" sol.idgruponivel1, ");
selectQueryPiece.append(" sol.solucaotemporaria, ");
selectQueryPiece.append(" sol.houvemudanca, ");
selectQueryPiece.append(" sol.slaacombinar, ");
selectQueryPiece.append(" sol.prazohhanterior, ");
selectQueryPiece.append(" sol.prazommanterior, ");
selectQueryPiece.append(" sol.idcalendario, ");
selectQueryPiece.append(" sol.tempodecorridohh, ");
selectQueryPiece.append(" sol.tempodecorridomm, ");
selectQueryPiece.append(" sol.datahorasuspensao, ");
selectQueryPiece.append(" sol.datahorareativacao, ");
selectQueryPiece.append(" sol.impacto, ");
selectQueryPiece.append(" sol.urgencia, ");
selectQueryPiece.append(" sol.datahoracaptura, ");
selectQueryPiece.append(" sol.tempocapturahh, ");
selectQueryPiece.append(" sol.tempocapturamm, ");
selectQueryPiece.append(" sol.tempoatrasohh, ");
selectQueryPiece.append(" sol.tempoatrasomm, ");
selectQueryPiece.append(" sol.tempoatendimentohh, ");
selectQueryPiece.append(" sol.tempoatendimentomm, ");
selectQueryPiece.append(" sol.idacordonivelservico, ");
selectQueryPiece.append(" sol.idultimaaprovacao, ");
selectQueryPiece.append(" sol.datahorainiciosla, ");
selectQueryPiece.append(" sol.datahorasuspensaosla, ");
selectQueryPiece.append(" sol.datahorareativacaosla, ");
selectQueryPiece.append(" sol.situacaosla, ");
selectQueryPiece.append(" aprov.aprovacao, ");
selectQueryPiece.append(" s.idservico, ");
selectQueryPiece.append(" s.nomeservico, ");
selectQueryPiece.append(" td.nometipodemandaservico, ");
selectQueryPiece.append(" c.idcontrato, ");
selectQueryPiece.append(" c.numero, ");
selectQueryPiece.append(" e1.nome AS solicitante, ");
selectQueryPiece.append(" u1.nome AS nomeUnidadeSolicitante, ");
selectQueryPiece.append(" e2.nome AS responsavel, ");
selectQueryPiece.append(" u2.nome AS nomeUnidadeResponsavel, ");
selectQueryPiece.append(" oa.descricao AS origem, ");
selectQueryPiece.append(" p.nomeprioridade, ");
selectQueryPiece.append(" fs.nomefase, ");
selectQueryPiece.append(" g1.sigla AS grupoAtual, ");
selectQueryPiece.append(" g2.sigla AS grupoNivel1, ");
selectQueryPiece.append(" cs.nomecontato, ");
selectQueryPiece.append(" cs.emailcontato, ");
selectQueryPiece.append(" cs.telefonecontato, ");
selectQueryPiece.append(" cs.localizacaofisica, ");
selectQueryPiece.append(" cs.idlocalidade, ");
selectQueryPiece.append(" es.idinstanciafluxo, ");
selectQueryPiece.append(" sol.vencendo, ");
selectQueryPiece.append(" item.iditemtrabalho, ");
selectQueryPiece.append(" item.idelemento, ");
selectQueryPiece.append(" item.idresponsavelatual, ");
selectQueryPiece.append(" item.datahoracriacao, ");
selectQueryPiece.append(" item.datahorainicio AS dataHoraInicioTarefa, ");
selectQueryPiece.append(" item.datahorafinalizacao, ");
selectQueryPiece.append(" item.datahoraexecucao, ");
selectQueryPiece.append(" item.situacao AS situacaoTarefa, ");
selectQueryPiece.append(" instancia.idfluxo, ");
selectQueryPiece.append(" fluxo.idtipofluxo, ");
selectQueryPiece.append(" atrib.tipo, ");
selectQueryPiece.append(" usuresp.nome, ");
selectQueryPiece.append(" (SELECT COUNT(*) ");
selectQueryPiece.append(" FROM controleged ");
selectQueryPiece.append(" WHERE idtabela = ? ");
parametros.add(ControleGEDDTO.TABELA_SOLICITACAOSERVICO);
selectQueryPiece.append(" AND id = sol.idsolicitacaoservico) AS qtdeAnexos, ");
selectQueryPiece.append(" (SELECT COUNT(*) ");
selectQueryPiece.append(" FROM solicitacaoservico ");
selectQueryPiece.append(" WHERE idsolicitacaorelacionada = sol.idsolicitacaoservico) AS qtdeFilhas ");
return selectQueryPiece;
}
private StringBuilder fromQueryPiece(final ParamRecuperacaoTarefasDTO param, final List<Object> parametros) {
final StringBuilder strGrupos = this.userGroupsPiece(param.getUsuarioDto());
final StringBuilder fromWhere = new StringBuilder();
fromWhere.append("FROM bpm_itemtrabalhofluxo item ");
fromWhere.append(" INNER JOIN bpm_instanciafluxo instancia ");
fromWhere.append(" ON instancia.idinstancia = item.idinstancia ");
fromWhere.append(" INNER JOIN bpm_fluxo fluxo ");
fromWhere.append(" ON fluxo.idfluxo = instancia.idfluxo ");
fromWhere.append(" INNER JOIN bpm_atribuicaofluxo atrib ");
fromWhere.append(" ON atrib.iditemtrabalho = item.iditemtrabalho ");
fromWhere.append(" INNER JOIN execucaosolicitacao es ");
fromWhere.append(" ON es.idinstanciafluxo = item.idinstancia ");
fromWhere.append(" INNER JOIN solicitacaoservico sol ");
fromWhere.append(" ON sol.idsolicitacaoservico = es.idsolicitacaoservico ");
fromWhere.append(" LEFT JOIN usuario usuresp ");
fromWhere.append(" ON usuresp.idusuario = item.idresponsavelatual ");
fromWhere.append(" LEFT JOIN servicocontrato sc ");
fromWhere.append(" ON sc.idservicocontrato = sol.idservicocontrato ");
fromWhere.append(" LEFT JOIN contratos c ");
fromWhere.append(" ON c.idcontrato = sc.idcontrato ");
fromWhere.append(" LEFT JOIN servico s ");
fromWhere.append(" ON s.idservico = sc.idservico ");
fromWhere.append(" LEFT JOIN tipodemandaservico td ");
fromWhere.append(" ON td.idtipodemandaservico = s.idtipodemandaservico ");
fromWhere.append(" LEFT JOIN empregados e1 ");
fromWhere.append(" ON e1.idempregado = sol.idsolicitante ");
fromWhere.append(" LEFT JOIN unidade u1 ");
fromWhere.append(" ON u1.idunidade = e1.idunidade ");
fromWhere.append(" LEFT JOIN usuario usu ");
fromWhere.append(" ON usu.idusuario = sol.idresponsavel ");
fromWhere.append(" LEFT JOIN empregados e2 ");
fromWhere.append(" ON e2.idempregado = usu.idempregado ");
fromWhere.append(" LEFT JOIN unidade u2 ");
fromWhere.append(" ON u2.idunidade = e2.idunidade ");
fromWhere.append(" LEFT JOIN origematendimento oa ");
fromWhere.append(" ON oa.idorigem = sol.idorigem ");
fromWhere.append(" LEFT JOIN prioridade p ");
fromWhere.append(" ON p.idprioridade = sol.idprioridade ");
fromWhere.append(" LEFT JOIN faseservico fs ");
fromWhere.append(" ON fs.idfase = sol.idfaseatual ");
fromWhere.append(" LEFT JOIN grupo g1 ");
fromWhere.append(" ON g1.idgrupo = sol.idgrupoatual ");
fromWhere.append(" LEFT JOIN grupo g2 ");
fromWhere.append(" ON g2.idgrupo = sol.idgruponivel1 ");
fromWhere.append(" LEFT JOIN contatosolicitacaoservico cs ");
fromWhere.append(" ON cs.idcontatosolicitacaoservico = ");
fromWhere.append(" sol.idcontatosolicitacaoservico ");
fromWhere.append(" LEFT JOIN aprovacaosolicitacaoservico aprov ");
fromWhere.append(" ON aprov.idaprovacaosolicitacaoservico = sol.idultimaaprovacao ");
fromWhere.append("WHERE sol.idsolicitacaopai IS NULL ");
fromWhere.append(" AND item.situacao NOT IN ( ?, ? ) ");
parametros.add(SituacaoItemTrabalho.Executado.name());
parametros.add(SituacaoItemTrabalho.Cancelado.name());
fromWhere.append(" AND instancia.situacao IN ( ?, ? ) ");
parametros.add(SituacaoInstanciaFluxo.Aberta.name());
parametros.add(SituacaoInstanciaFluxo.Suspensa.name());
// Tratamento para elimina��o de duplicidades de atribui��o quando o usu�rio pertence a mais de um grupo com o mesmo tipo de permiss�o
fromWhere.append(" AND atrib.idatribuicao = (SELECT max(a.idatribuicao) FROM bpm_atribuicaofluxo a");
fromWhere.append(" WHERE a.iditemtrabalho = item.iditemtrabalho");
fromWhere.append(" AND a.tipo = atrib.tipo");
fromWhere.append(" AND (a.idusuario = ?");
fromWhere.append(" OR ((a.idusuario is null OR a.idusuario <> ?) AND a.idgrupo IN ").append(strGrupos).append(")))");
parametros.add(param.getUsuarioDto().getIdUsuario());
parametros.add(param.getUsuarioDto().getIdUsuario());
fromWhere.append(" AND ( item.idresponsavelatual = ? ");
parametros.add(param.getUsuarioDto().getIdUsuario());
fromWhere.append(" OR atrib.idusuario = ? ");
parametros.add(param.getUsuarioDto().getIdUsuario());
fromWhere.append(" OR ((atrib.idusuario is null OR atrib.idusuario <> ?) and atrib.idgrupo IN ").append(strGrupos).append("))");
parametros.add(param.getUsuarioDto().getIdUsuario());
if (param.getIdTarefa() != null) {
fromWhere.append(" AND item.iditemtrabalhofluxo = ? ");
parametros.add(param.getIdTarefa());
}
// ********** In�cio tratamento dos tipos de atribui��o
fromWhere.append(" AND (");
// atribui��o autom�tica
fromWhere.append(" atrib.tipo = ? ");
parametros.add(TipoAtribuicao.Automatica.name());
// ou atribui��o por delega��o e n�o exista atribui��o autom�tica p/ o item
fromWhere.append(" OR (atrib.tipo = ? AND 0 = ");
parametros.add(TipoAtribuicao.Delegacao.name());
fromWhere.append(" (SELECT count(*) ");
fromWhere.append(" FROM bpm_atribuicaofluxo a ");
fromWhere.append(" WHERE a.iditemtrabalho = item.iditemtrabalho ");
fromWhere.append(" AND a.tipo IN (?) ");
parametros.add(TipoAtribuicao.Automatica.name());
fromWhere.append(" AND (a.idusuario = ? ");
parametros.add(param.getUsuarioDto().getIdUsuario());
fromWhere.append(" OR a.idgrupo IN ").append(strGrupos).append(")))");
// ou atribui��o por acompanhamento e n�o exista atribui��o autom�tica ou delega��o p/ o item
fromWhere.append(" OR (atrib.tipo = ? AND 0 = ");
parametros.add(TipoAtribuicao.Acompanhamento.name());
fromWhere.append(" (SELECT count(*) ");
fromWhere.append(" FROM bpm_atribuicaofluxo a ");
fromWhere.append(" WHERE a.iditemtrabalho = item.iditemtrabalho ");
fromWhere.append(" AND a.tipo IN (?, ?) ");
parametros.add(TipoAtribuicao.Automatica.name());
parametros.add(TipoAtribuicao.Delegacao.name());
fromWhere.append(" AND (a.idusuario = ? ");
parametros.add(param.getUsuarioDto().getIdUsuario());
fromWhere.append(" OR a.idgrupo IN ").append(strGrupos).append(")))");
// ********** Fim tratamento dos tipos de atribui��o
fromWhere.append(" )");
if (param.getContratosUsuario() != null && !param.getContratosUsuario().isEmpty()) {
fromWhere.append(" AND c.idcontrato in ( ");
boolean first = true;
for (final ContratoDTO contrato : param.getContratosUsuario()) {
if (first) {
fromWhere.append(contrato.getIdContrato());
first = false;
} else {
fromWhere.append(",");
fromWhere.append(contrato.getIdContrato());
}
}
fromWhere.append(" )");
}
this.adicionaFiltroPesquisa(fromWhere, param.getGerenciamentoServicosDto(), parametros);
return fromWhere;
}
/**
* Adiciona o filtro de pesquisa de solicita��o
*
* @param sql
* @param gerenciamento
* @param parametros
*/
private void adicionaFiltroPesquisa(final StringBuilder sql, final GerenciamentoServicosDTO gerenciamento, final List<Object> parametros) {
if (gerenciamento == null) {
return;
}
if (gerenciamento.getIdSolicitacao() != null && !gerenciamento.getIdSolicitacao().equals(new Integer(-1))) {
sql.append(" AND sol.idSolicitacaoServico = ? ");
parametros.add(gerenciamento.getIdSolicitacao());
}
if (gerenciamento.getIdSolicitante() != null && !gerenciamento.getIdSolicitante().equals(new Integer(-1))) {
sql.append(" AND sol.idSolicitante = ? ");
parametros.add(gerenciamento.getIdSolicitante());
}
if (gerenciamento.getIdTipo() != null && !gerenciamento.getIdTipo().equals(new Integer(-1))) {
sql.append(" AND sol.idTipoDemandaServico = ? ");
parametros.add(gerenciamento.getIdTipo());
}
if (gerenciamento.getIdContrato() != null && !gerenciamento.getIdContrato().equals(new Integer(-1))) {
sql.append(" AND c.idcontrato = ? ");
parametros.add(gerenciamento.getIdContrato());
}
if (gerenciamento.getIdGrupoAtual() != null && !gerenciamento.getIdGrupoAtual().equals(new Integer(-1))) {
if (gerenciamento.getIdGrupoAtual().equals(new Integer(0))) {
sql.append(" AND sol.idGrupoAtual is null ");
} else {
sql.append(" AND sol.idGrupoAtual = ? ");
parametros.add(gerenciamento.getIdGrupoAtual());
}
}
if (StringUtils.isNotEmpty(gerenciamento.getPalavraChave())) {
sql.append(" AND ( ");
sql.append(" sol.descricao like ? ");
parametros.add("%" + gerenciamento.getPalavraChave() + "%");
sql.append(" OR s.nomeServico like ? ");
parametros.add("%" + gerenciamento.getPalavraChave() + "%");
sql.append(" OR e1.nome like ? ");
parametros.add("%" + gerenciamento.getPalavraChave() + "%");
sql.append(" OR g1.sigla like ? ");
parametros.add("%" + gerenciamento.getPalavraChave() + "%");
sql.append(") ");
}
if (StringUtils.isNotBlank(gerenciamento.getSituacao())) {
sql.append(" AND sol.situacao = ? ");
parametros.add(gerenciamento.getSituacao());
}
if (StringUtils.isNotEmpty(gerenciamento.getTarefaAtual())) {
sql.append(" AND item.idelemento IN (SELECT idelemento FROM bpm_elementofluxo e WHERE e.documentacao LIKE ? )");
parametros.add("%" + gerenciamento.getTarefaAtual() + "%");
}
final String tipoVisualizacao = gerenciamento.getTipoVisualizacao() == null ? "" : gerenciamento.getTipoVisualizacao();
// tipo de visualiza��o
if (tipoVisualizacao.equalsIgnoreCase("possoExecutar")) {
sql.append(" AND atrib.tipo IN (?, ?) ");
parametros.add(TipoAtribuicao.Delegacao.name());
parametros.add(TipoAtribuicao.Automatica.name());
} else if (tipoVisualizacao.equalsIgnoreCase("possoVisualizar")) {
sql.append(" AND atrib.tipo IN (?) ");
parametros.add(TipoAtribuicao.Acompanhamento.name());
}
this.adicionaFiltroSLA(sql, gerenciamento, parametros);
}
/**
* Adiciona o filtro de pesquisa de SLA
*
* @param sql
* @param gerenciamento
* @param parametros
*/
private void adicionaFiltroSLA(final StringBuilder sql, final GerenciamentoServicosDTO gerenciamento, final List<Object> parametros) {
if (gerenciamento == null || gerenciamento.getSituacaoSla() == null || gerenciamento.getSituacaoSla().trim().equals("")) {
return;
}
final String situacaoSla = gerenciamento.getSituacaoSla() == null ? "" : gerenciamento.getSituacaoSla();
// tipo de Sla
if (situacaoSla.equalsIgnoreCase("vencido")) {
sql.append(" AND sol.situacao <> ? ");
sql.append(" AND sol.situacaoSLA = 'A' ");
sql.append(" AND (sol.slaacombinar IS NULL OR sol.slaacombinar <> 'S') ");
sql.append(" AND sol.prazohh IS NOT NULL AND sol.prazomm IS NOT NULL AND (sol.prazohh + sol.prazomm > 0) ");
sql.append(" AND sol.datahoralimite is not null AND sol.datahoralimite < ? ");
parametros.add(SituacaoSolicitacaoServico.Suspensa.name());
parametros.add(UtilDatas.getDataHoraAtual());
} else if (situacaoSla.equalsIgnoreCase("aguardandoAprovacao")) {
sql.append(" AND item.idelemento IN (SELECT idelemento FROM bpm_elementofluxo e INNER JOIN templatesolicitacaoservico t ON t.identificacao = e.template ");
sql.append(" WHERE t.aprovacao = 'S' )");
} else if (situacaoSla.equalsIgnoreCase("avencerHoje")) {
sql.append(" AND sol.situacao <> ? ");
sql.append(" AND sol.situacaoSLA = 'A' ");
sql.append(" AND (sol.slaacombinar IS NULL OR sol.slaacombinar <> 'S') ");
sql.append(" AND sol.prazohh IS NOT NULL AND sol.prazomm IS NOT NULL AND (sol.prazohh + sol.prazomm > 0) ");
sql.append(" AND sol.datahoralimite is not null AND sol.datahoralimite > ? ");
if (MAIN_SGBD.equals(DataBase.ORACLE)) {
sql.append(" AND TRUNC(sol.datahoralimite) = ? ");
} else if (MAIN_SGBD.equals(DataBase.MSSQLSERVER)) {
sql.append(" AND CAST(sol.datahoralimite AS DATE) = ? ");
} else if (MAIN_SGBD.equals(DataBase.MYSQL)) {
sql.append(" AND DATE(sol.datahoralimite) = ? ");
} else {
sql.append(" AND TRUNC(sol.datahoralimite) = ? ");
}
parametros.add(SituacaoSolicitacaoServico.Suspensa.name());
parametros.add(UtilDatas.getDataHoraAtual());
parametros.add(UtilDatas.getDataAtual());
} else if (situacaoSla.equalsIgnoreCase("avencerProxDiaUtil")) {
final String idCalendarioStr = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_CALENDARIO_PADRAO, "1");
final CalendarioServiceEjb calendarioService = new CalendarioServiceEjb();
Timestamp diaUtilSeguinte = null;
try {
final CalendarioDTO calendarioDto = calendarioService.recuperaCalendario(new Integer(idCalendarioStr));
if (calendarioDto != null) {
JornadaTrabalhoDTO jornadaDtoVerificaSeExiste = null;
int cont = 0;
do {
if (cont == 0) {
cont = 1;
diaUtilSeguinte = calendarioService.incrementaDias(UtilDatas.getDataHoraAtual(), 1);
} else {
diaUtilSeguinte = calendarioService.incrementaDias(diaUtilSeguinte, 1);
}
final Date dataRef = new Date(diaUtilSeguinte.getTime());
jornadaDtoVerificaSeExiste = calendarioService.recuperaJornada(calendarioDto, dataRef, Util.getHoraDbl(UtilDatas.getHoraHHMM(diaUtilSeguinte)));
} while (jornadaDtoVerificaSeExiste == null);
diaUtilSeguinte = new Timestamp(UtilDatas.incrementaDiasEmData(diaUtilSeguinte, 1).getTime());
sql.append(" AND sol.situacao <> ? ");
sql.append(" AND sol.situacaoSLA = 'A' ");
sql.append(" AND (sol.slaacombinar IS NULL OR sol.slaacombinar <> 'S') ");
sql.append(" AND sol.prazohh IS NOT NULL AND sol.prazomm IS NOT NULL AND (sol.prazohh + sol.prazomm > 0) ");
sql.append(" AND sol.datahoralimite is not null AND sol.datahoralimite > ? ");
sql.append(" AND sol.datahoralimite < ? ");
parametros.add(SituacaoSolicitacaoServico.Suspensa.name());
parametros.add(UtilDatas.getDataHoraAtual());
parametros.add(diaUtilSeguinte);
}
} catch (final Exception e) {
e.printStackTrace();
}
} else if (StringUtils.containsIgnoreCase(situacaoSla, "avencer")) {
int horas = 0;
int minutos = 0;
if (situacaoSla.equalsIgnoreCase("avencer30min")) {
minutos = 30;
} else if (situacaoSla.equalsIgnoreCase("avencer60min")) {
horas = 1;
} else if (situacaoSla.equalsIgnoreCase("avencer90min")) {
horas = 1;
minutos = 30;
} else if (situacaoSla.equalsIgnoreCase("avencer2h")) {
horas = 2;
} else if (situacaoSla.equalsIgnoreCase("avencer3h")) {
horas = 3;
}
final Timestamp ts = UtilDatas.somaSegundos(UtilDatas.getDataHoraAtual(), minutos * 60 + horas * 60 * 60);
sql.append(" AND sol.situacao <> ? ");
sql.append(" AND sol.situacaoSLA = 'A' ");
sql.append(" AND (sol.slaacombinar IS NULL OR sol.slaacombinar <> 'S') ");
sql.append(" AND sol.prazohh IS NOT NULL AND sol.prazomm IS NOT NULL AND (sol.prazohh + sol.prazomm > 0) ");
sql.append(" AND sol.datahoralimite is not null AND sol.datahoralimite > ? ");
sql.append(" AND sol.datahoralimite < ? ");
parametros.add(SituacaoSolicitacaoServico.Suspensa.name());
parametros.add(UtilDatas.getDataHoraAtual());
parametros.add(ts);
}
}
private static final List<String> resultList = new ArrayList<>();
private static List<String> getListRetorno() {
if (resultList.isEmpty()) {
resultList.add("idSolicitacaoServico");
resultList.add("idbaseconhecimento");
resultList.add("idServicoContrato");
resultList.add("idSolicitante");
resultList.add("idItemConfiguracao");
resultList.add("idItemConfiguracaoFilho");
resultList.add("idTipodemandaServico");
resultList.add("idContatoSolicitacaoServico");
resultList.add("idOrigem");
resultList.add("idResponsavel");
resultList.add("idTipoProblema");
resultList.add("idPrioridade");
resultList.add("idUnidade");
resultList.add("idFaseAtual");
resultList.add("idGrupoAtual");
resultList.add("dataHoraSolicitacao");
resultList.add("dataHoraLimite");
resultList.add("atendimentoPresencial");
resultList.add("prazoCapturaHH");
resultList.add("prazoCapturaMM");
resultList.add("prazoHH");
resultList.add("prazoMM");
resultList.add("descricao");
resultList.add("resposta");
resultList.add("dataHoraInicio");
resultList.add("dataHoraFim");
resultList.add("situacao");
resultList.add("idSolicitacaoPai");
resultList.add("detalhamentoCausa");
resultList.add("idCausaIncidente");
resultList.add("idCategoriaSolucao");
resultList.add("seqReabertura");
resultList.add("enviaEmailCriacao");
resultList.add("enviaEmailFinalizacao");
resultList.add("enviaEmailAcoes");
resultList.add("idGrupoNivel1");
resultList.add("solucaoTemporaria");
resultList.add("houveMudanca");
resultList.add("slaACombinar");
resultList.add("prazohhAnterior");
resultList.add("prazommAnterior");
resultList.add("idCalendario");
resultList.add("tempoDecorridoHH");
resultList.add("tempoDecorridoMM");
resultList.add("dataHoraSuspensao");
resultList.add("dataHoraReativacao");
resultList.add("impacto");
resultList.add("urgencia");
resultList.add("dataHoraCaptura");
resultList.add("tempoCapturaHH");
resultList.add("tempoCapturaMM");
resultList.add("tempoAtrasoHH");
resultList.add("tempoAtrasoMM");
resultList.add("tempoAtendimentoHH");
resultList.add("tempoAtendimentoMM");
resultList.add("idAcordoNivelServico");
resultList.add("idUltimaAprovacao");
resultList.add("dataHoraInicioSLA");
resultList.add("dataHoraSuspensaoSLA");
resultList.add("dataHoraReativacaoSLA");
resultList.add("situacaoSLA");
resultList.add("aprovacao");
resultList.add("idServico");
resultList.add("servico");
resultList.add("demanda");
resultList.add("idContrato");
resultList.add("contrato");
resultList.add("solicitante");
resultList.add("nomeUnidadeSolicitante");
resultList.add("responsavel");
resultList.add("nomeUnidadeResponsavel");
resultList.add("origem");
resultList.add("prioridade");
resultList.add("faseAtual");
resultList.add("grupoAtual");
resultList.add("grupoNivel1");
resultList.add("nomecontato");
resultList.add("emailcontato");
resultList.add("telefonecontato");
resultList.add("observacao");
resultList.add("idLocalidade");
resultList.add("idInstanciaFluxo");
resultList.add("vencendo");
resultList.add("idTarefa");
resultList.add("idElementoFluxo");
resultList.add("idResponsavelAtual");
resultList.add("dataHoraCriacaoTarefa");
resultList.add("dataHoraInicioTarefa");
resultList.add("dataHoraFinalizacaoTarefa");
resultList.add("dataHoraExecucaoTarefa");
resultList.add("situacaoTarefa");
resultList.add("idFluxo");
resultList.add("idTipoFluxo");
resultList.add("tipoAtribuicao");
resultList.add("nomeUsuarioResponsavelAtual");
resultList.add("qtdeAnexos");
resultList.add("qtdefilhas");
}
return resultList;
}
}