package br.com.centralit.citcorpore.integracao;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import br.com.centralit.citcorpore.bean.HistoricoAtendimentoDTO;
import br.com.centralit.citcorpore.bean.result.HistoricoAtendimentoSearchResultDTO;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServicoNaRota;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.integracao.JdbcEngine;
import br.com.citframework.integracao.core.DataBase;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.UtilDatas;
/**
* DAO para recupera��o de informa��o de {@link HistoricoAtendimentoDTO}
*
* @author bruno.ribeiro - <a href="mailto:bruno.ribeiro@centrait.com.br">bruno.ribeiro@centrait.com.br</a>
* @since 12/11/2014
*
*/
public class HistoricoAtendimentoDAO {
private static final String YYYY_MM_DD = "yyyy-MM-dd";
private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd hh:mm:ss";
private final JdbcEngine engine = new JdbcEngine(Constantes.getValue("DATABASE_ALIAS"), null);
public List<HistoricoAtendimentoSearchResultDTO> listHistoricoAtendimentoWithSolicitationInfo(final HistoricoAtendimentoDTO historicoAtendimento) throws PersistenceException {
List<HistoricoAtendimentoSearchResultDTO> historicos = new ArrayList<>();
final List<Object> parametros = new ArrayList<>();
final String query = this.getSQLListagem(historicoAtendimento, parametros).toString();
final Object[] parametrosArray = parametros.toArray();
final List<?> result = engine.execSQL(query, parametrosArray, 0);
if (result.size() > 0) {
historicos = engine.listConvertion(HistoricoAtendimentoSearchResultDTO.class, result, this.getFieldsToReturn());
}
return historicos;
}
private StringBuilder getSQLListagem(final HistoricoAtendimentoDTO historico, final List<Object> parametros) {
final DataBase db = DataBase.fromStringId(CITCorporeUtil.SGBD_PRINCIPAL);
final Integer idGrupo = historico.getIdGrupo();
final Integer idUnidade = historico.getIdUnidade();
final Integer idSituacao = historico.getIdSituacao();
final Integer idAtendente = historico.getIdAtendente();
final Date dataInicio = historico.getDataInicio();
final Date dataFim = historico.getDataFim();
final Timestamp dataTimeInicio = historico.getTimestampInicio();
final Timestamp dataTimeFim = historico.getTimestampFim();
final boolean hasIdGrupo = idGrupo != null && idGrupo.intValue() > 0;
final boolean hasIdUnidade = idUnidade != null && idUnidade.intValue() > 0;
final boolean hasIdSituacao = idSituacao != null && idSituacao.intValue() > 0;
final boolean hasIdAtendente = idAtendente != null && idAtendente.intValue() > 0;
final StringBuilder sql = new StringBuilder();
sql.append("SELECT DISTINCT usr.idusuario AS atendenteId, ");
sql.append(" emp.nome AS atendenteNome, ");
sql.append(" sol.idsolicitacaoservico AS solicitacaoNumero, ");
if (db.equals(DataBase.ORACLE)) {
sql.append(" dbms_lob.SUBSTR");
} else {
sql.append(" SUBSTRING");
}
sql.append("(sol.descricao, 1, 100) AS solicitacaoDescricao, ");
sql.append(" serv.nomeservico AS solicitacaoServico, ");
sql.append(" sol.situacao AS solicitacaoSituacao, ");
sql.append(" solic.nome AS solicitacaoSolicitante, ");
sql.append(" sol.prazohh AS solicitacaoPrazoHH, ");
sql.append(" sol.prazomm AS solicitacaoPrazoMM, ");
sql.append(" ender.latitude AS solicitacaoLatitude, ");
sql.append(" ender.longitude AS solicitacaoLongitude, ");
sql.append(" und.nome AS unidadeNome, ");
sql.append(" pos.latitude AS posicaoLatitude, ");
sql.append(" pos.longitude AS posicaoLongitude, ");
sql.append(" atr.id AS atribuicaoId, ");
sql.append(" atr.datainicioatendimento AS atribuicaoDatetime, ");
sql.append(" pos.datetime ");
sql.append("FROM solicitacaoservico sol ");
sql.append(" INNER JOIN atribuicaosolicitacao atr ");
sql.append(" ON sol.idsolicitacaoservico = atr.idsolicitacao ");
sql.append(" INNER JOIN usuario usr ");
sql.append(" ON atr.idusuario = usr.idusuario ");
sql.append(" LEFT JOIN posatendentehistorico pos ");
sql.append(" ON pos.idusuario = usr.idusuario ");
sql.append(" INNER JOIN empregados emp ");
sql.append(" ON usr.idempregado = emp.idempregado ");
sql.append(" INNER JOIN empregados solic ");
sql.append(" ON sol.idsolicitante = solic.idempregado ");
if (hasIdGrupo) {
sql.append(" LEFT JOIN gruposempregados gemp ");
sql.append(" ON gemp.idempregado = emp.idempregado ");
}
sql.append(" INNER JOIN servicocontrato servContrato ");
sql.append(" ON sol.idservicocontrato = servContrato.idservicocontrato ");
sql.append(" INNER JOIN servico serv ");
sql.append(" ON servContrato.idservico = serv.idservico ");
sql.append(" LEFT JOIN checkin checkin ");
sql.append(" ON sol.idsolicitacaoservico = checkin.idsolicitacao ");
sql.append(" INNER JOIN unidade und ");
sql.append(" ON sol.idunidade = und.idunidade ");
sql.append(" LEFT JOIN contratosunidades contunid ");
sql.append(" ON contunid.idunidade = und.idunidade ");
sql.append(" LEFT JOIN contratos con ");
sql.append(" ON con.idcontrato = contunid.idcontrato ");
sql.append(" INNER JOIN endereco ender ");
sql.append(" ON und.idendereco = ender.idendereco ");
sql.append("WHERE servContrato.idcontrato = ? ");
parametros.add(historico.getIdContrato());
if (db.equals(DataBase.ORACLE)) {
sql.append(" AND TO_CHAR(pos.datetime, 'YYYY-MM-DD HH24:MI:SS') BETWEEN ? AND ? ");
sql.append(" AND TO_CHAR(atr.dataexecucao, 'YYYY-MM-DD') BETWEEN ? AND ? ");
parametros.add(UtilDatas.dateToSTRWithFormat(dataTimeInicio, YYYY_MM_DD_HH_MM_SS));
parametros.add(UtilDatas.dateToSTRWithFormat(dataTimeFim, YYYY_MM_DD_HH_MM_SS));
parametros.add(UtilDatas.dateToSTRWithFormat(dataInicio, YYYY_MM_DD));
parametros.add(UtilDatas.dateToSTRWithFormat(dataFim, YYYY_MM_DD));
} else {
sql.append(" AND pos.datetime BETWEEN ? AND ? ");
sql.append(" AND ( atr.dataexecucao BETWEEN ? AND ? ");
sql.append(" OR (atr.datainicioatendimento BETWEEN ? AND ? ) ) ");
parametros.add(dataTimeInicio);
parametros.add(dataTimeFim);
parametros.add(dataInicio);
parametros.add(dataFim);
parametros.add(dataTimeInicio);
parametros.add(dataTimeFim);
}
if (hasIdGrupo) {
sql.append(" AND gemp.idgrupo = ? ");
parametros.add(idGrupo);
}
if (hasIdUnidade) {
sql.append(" AND und.idunidade = ? ");
parametros.add(idUnidade);
}
if (hasIdAtendente) {
sql.append(" AND emp.idempregado = ? ");
parametros.add(idAtendente);
}
if (hasIdSituacao) {
final SituacaoSolicitacaoServicoNaRota situacao = SituacaoSolicitacaoServicoNaRota.fromId(idSituacao);
switch (situacao) {
case ATENDIDA_FINALIZADA:
sql.append(" AND ( sol.situacao = 'Resolvida' OR sol.situacao = 'Fechada') ");
break;
case NAO_ATENDIDA:
sql.append(" AND sol.situacao = 'EmAndamento' ");
sql.append(" AND atr.id IS NOT NULL ");
sql.append(" AND atr.datainicioatendimento IS NULL ");
break;
case EM_ATENDIMENTO:
sql.append(" AND sol.situacao = 'EmAndamento' ");
sql.append(" AND atr.id IS NOT NULL ");
sql.append(" AND atr.datainicioatendimento IS NOT NULL ");
break;
case ATENDIDA_COM_PENDENCIA:
sql.append(" AND sol.situacao = 'Suspensa' ");
sql.append(" AND atr.id IS NOT NULL ");
break;
}
}
sql.append("ORDER BY sol.idsolicitacaoservico, ");
sql.append(" pos.datetime, ");
sql.append(" usr.idusuario");
return sql;
}
private List<String> fields;
private List<String> getFieldsToReturn() {
if (fields == null) {
fields = new ArrayList<>();
fields.add("atendenteId");
fields.add("atendenteNome");
fields.add("solicitacaoNumero");
fields.add("solicitacaoDescricao");
fields.add("solicitacaoServico");
fields.add("solicitacaoSituacao");
fields.add("solicitacaoSolicitante");
fields.add("solicitacaoPrazoHH");
fields.add("solicitacaoPrazoMM");
fields.add("solicitacaoLatitude");
fields.add("solicitacaoLongitude");
fields.add("unidadeNome");
fields.add("posicaoLatitude");
fields.add("posicaoLongitude");
fields.add("atribuicaoId");
fields.add("atribuicaoDatetime");
}
return fields;
}
}