package br.com.centralit.citcorpore.integracao;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import br.com.centralit.citcorpore.bean.RelatorioSolicitacaoReabertaDTO;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
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.util.Constantes;
import br.com.citframework.util.SQLConfig;
import br.com.citframework.util.UtilDatas;
public class RelatorioSolicitacaoReabertaDAO extends CrudDaoDefaultImpl {
public RelatorioSolicitacaoReabertaDAO() {
super(Constantes.getValue("DATABASE_ALIAS"), null);
}
@Override
public Collection find(IDto obj) throws PersistenceException {
return null;
}
@Override
public Collection<Field> getFields() {
Collection<Field> listFields = new ArrayList<>();
listFields.add(new Field("idSolicitacaoServico", "idSolicitacaoServico", true, true, false, false));
listFields.add(new Field("nomeTipoDemandaServico", "nomeTipoDemandaServico", false, false, false, false));
listFields.add(new Field("situacao", "situacao", false, false, false, false));
listFields.add(new Field("dataHoraCriacao", "dataHoraCriacao", false, false, false, false));
listFields.add(new Field("dataHoraInicioAtendimento", "dataHoraInicioAtendimento", false, false, false, false));
listFields.add(new Field("origem", "origem", false, false, false, false));
listFields.add(new Field("dataReabertura", "dataReabertura", false, false, false, false));
listFields.add(new Field("nomeServico", "nomeServico", false, false, false, false));
listFields.add(new Field("dataHoraFimAtendimento", "dataHoraFimAtendimento", false, false, false, false));
listFields.add(new Field("solicitante", "solicitante", false, false, false, false));
listFields.add(new Field("nomeUnidade", "nomeUnidade", false, false, false, false));
listFields.add(new Field("nomeResponsavel", "nomeResponsavel", false, false, false, false));
listFields.add(new Field("descricaoServico", "descricaoServico", false, false, false, false));
return listFields;
}
@Override
public String getTableName() {
return null;
}
@Override
public Collection list() throws PersistenceException {
return null;
}
@Override
public Class getBean() {
return RelatorioSolicitacaoReabertaDTO.class;
}
public ArrayList<RelatorioSolicitacaoReabertaDTO> listSolicitacaoReaberta(RelatorioSolicitacaoReabertaDTO relatorioSolicitacaoReabertaDTO) {
List result;
try {
List resp = new ArrayList();
List parametro = new ArrayList();
List listRetorno = new ArrayList();
/**
* Checa se h� limite para listagem
*
* @author thyen.chang
*/
boolean seLimita = relatorioSolicitacaoReabertaDTO.getTopList() != 0;
listRetorno.add("idSolicitacaoServico");
listRetorno.add("nomeTipoDemandaServico");
listRetorno.add("situacao");
listRetorno.add("dataHoraCriacao");
listRetorno.add("dataHoraInicioAtendimento");
listRetorno.add("dataReabertura");
listRetorno.add("horaReabertura");
listRetorno.add("origem");
listRetorno.add("nomeServico");
listRetorno.add("dataHoraFimAtendimento");
listRetorno.add("solicitante");
listRetorno.add("nomeUnidade");
listRetorno.add("nomeResponsavel");
listRetorno.add("descricaoServico");
StringBuilder sql = new StringBuilder();
sql.append("SELECT DISTINCT ");
/**
* Limite para SQLServer
*
* @author thyen.chang
*/
if ((seLimita)&&(CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.SQLSERVER))){
sql.append("TOP "+relatorioSolicitacaoReabertaDTO.getTopList().toString()+" ");
}
sql.append(" sc.idsolicitacaoservico, ");
sql.append(" tds.nometipodemandaservico, ");
sql.append(" sc.situacao, ");
sql.append(" sc.datahorasolicitacao AS datahoracriacao, ");
sql.append(" sc.datahorainiciosla AS datahorainicioatendimento, ");
sql.append(" osc.dataregistro AS datareabertura, ");
sql.append(" osc.horaregistro AS horareabertura, ");
sql.append(" ora.descricao AS origem, ");
sql.append(" s.nomeservico, ");
sql.append(" sc.datahorafim AS datahorafimatendimento, ");
sql.append(" e.nome AS solicitante, ");
sql.append(" u.nome AS nomeunidade, ");
sql.append(" responsavel.nome AS nomeresponsavel, ");
if (CITCorporeUtil.SGBD_PRINCIPAL.trim().equalsIgnoreCase("ORACLE")) {
sql.append(" cast(sc.descricao as varchar2(4000)) AS descricaoservico ");
}else if (CITCorporeUtil.SGBD_PRINCIPAL.toUpperCase().equals(SQLConfig.SQLSERVER)) {
sql.append(" cast(sc.descricao as varchar(4000)) AS descricaoservico ");
}else{
sql.append(" sc.descricao AS descricaoservico ");
}
sql.append("FROM solicitacaoservico sc ");
sql.append(" INNER JOIN tipodemandaservico tds ");
sql.append(" ON sc.idtipodemandaservico = tds.idtipodemandaservico ");
sql.append(" INNER JOIN origematendimento ora ");
sql.append(" ON sc.idorigem = ora.idorigem ");
sql.append(" INNER JOIN ocorrenciasolicitacao osc ");
sql.append(" ON sc.idsolicitacaoservico = osc.idsolicitacaoservico ");
sql.append(" INNER JOIN servicocontrato serc ");
sql.append(" ON sc.idservicocontrato = serc.idservicocontrato ");
sql.append(" INNER JOIN servico s ");
sql.append(" ON serc.idservico = s.idservico ");
sql.append(" INNER JOIN empregados e ");
sql.append(" ON sc.idsolicitante = e.idempregado ");
sql.append(" INNER JOIN execucaosolicitacao exs ");
sql.append(" ON sc.idsolicitacaoservico = exs.idsolicitacaoservico ");
sql.append(" INNER JOIN bpm_itemtrabalhofluxo bpmitem ");
sql.append(" ON exs.idinstanciafluxo = bpmitem.idinstancia ");
sql.append(" LEFT JOIN empregados responsavel ");
sql.append(" ON bpmitem.idresponsavelatual = responsavel.idempregado ");
sql.append(" LEFT JOIN unidade u ");
sql.append(" ON sc.idunidade = u.idunidade ");
sql.append("WHERE ");
/**
* Limite para Oracle
*
* @author thyen.chang
*/
if ((seLimita)&&(CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.ORACLE))){
sql.append(" ROWNUM <= ? AND ");
parametro.add(relatorioSolicitacaoReabertaDTO.getTopList());
}
sql.append(" UPPER(osc.categoria) = UPPER('Reabertura') ");
sql.append(" AND sc.seqreabertura > 0 ");
if (CITCorporeUtil.SGBD_PRINCIPAL.trim().equalsIgnoreCase("ORACLE")) {
sql.append(" AND trunc(osc.datainicio) BETWEEN to_date(? ,'yyyy-mm-dd') AND to_date(? ,'yyyy-mm-dd') " );
parametro.add(UtilDatas.dateToSTRWithFormat(relatorioSolicitacaoReabertaDTO.getDataInicialReabertura(),"yyyy-MM-dd"));
parametro.add(UtilDatas.dateToSTRWithFormat(relatorioSolicitacaoReabertaDTO.getDataFinalReabertura(),"yyyy-MM-dd"));
}else{
sql.append(" AND osc.datainicio BETWEEN ? AND ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getDataInicialReabertura());
parametro.add(relatorioSolicitacaoReabertaDTO.getDataFinalReabertura());
}
if (relatorioSolicitacaoReabertaDTO.getIdContrato() != null && relatorioSolicitacaoReabertaDTO.getIdContrato()!= 0){
sql.append(" AND serc.idcontrato = ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getIdContrato());
}
if (relatorioSolicitacaoReabertaDTO.getIdGrupo() != 0){
sql.append(" AND sc.idgrupoatual = ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getIdGrupo());
}
if (!relatorioSolicitacaoReabertaDTO.getSituacao().equals("0")){
sql.append(" AND sc.situacao = ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getSituacao());
}
if (relatorioSolicitacaoReabertaDTO.getIdTipoDemandaServico() != 0){
sql.append(" AND tds.idtipodemandaservico = ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getIdTipoDemandaServico());
}
if (relatorioSolicitacaoReabertaDTO.getDataInicialEncerramento() != null && relatorioSolicitacaoReabertaDTO.getDataFinalEncerramento() != null){
sql.append(" AND sc.datahorafim >= ? AND sc.datahorafim <= ? ");
// para a data final de enconrramento foi necessario fazer este tratamento pois por exemplo, se a pesquisa � at� o dia 10/02, buscava <= 10/02/2014 00:00:00
//ou seja se tivesse sido encerrada no dia 10/02/2014 as 00:01:00 n�o traria pois tava superior a 10/02/2014 00:00:00, portanto fora da faixa. - Thiago Matias
Date dFinal= relatorioSolicitacaoReabertaDTO.getDataFinalEncerramento();
long dFinal2;
dFinal2 = dFinal.getTime();
dFinal2 = dFinal2 + (86400000*1L); //aumentando em um dia a faixa de consulta.
dFinal.setTime(dFinal2);
parametro.add(relatorioSolicitacaoReabertaDTO.getDataInicialEncerramento());
parametro.add(dFinal);
}
/**
* Limite da listagem para Postgres e MySQL
*
* @author thyen.chang
*/
if((seLimita) && ((CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.POSTGRESQL))||(CITCorporeUtil.SGBD_PRINCIPAL.trim().toUpperCase().equalsIgnoreCase(SQLConfig.MYSQL))) ){
sql.append(" LIMIT ? ");
parametro.add(relatorioSolicitacaoReabertaDTO.getTopList());
}
resp = this.execSQL(sql.toString(), parametro.toArray());
result = this.engine.listConvertion(getBean(), resp, listRetorno);
} catch (PersistenceException e) {
e.printStackTrace();
result = null;
} catch (Exception e) {
e.printStackTrace();
result = null;
}
return (ArrayList<RelatorioSolicitacaoReabertaDTO>) (((result == null)||(result.size()<=0)) ? new ArrayList<RelatorioSolicitacaoReabertaDTO>() : result);
}
private Timestamp preparaHoraInicio(Date dataI) throws ParseException {
java.sql.Date data = new java.sql.Date(dataI.getTime());
String dataHora = data + " 00:00:00";
String pattern = "yyyy-MM-dd hh:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
java.util.Date d = sdf.parse(dataHora);
java.sql.Timestamp sqlDate = new java.sql.Timestamp(d.getTime());
return sqlDate;
}
private Timestamp preparaHoraFim(Date dataF) throws ParseException {
java.sql.Date data = new java.sql.Date(dataF.getTime());
String dataHora = data + " 23:59:59";
String pattern = "yyyy-MM-dd hh:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
java.util.Date d = sdf.parse(dataHora);
java.sql.Timestamp sqlDate = new java.sql.Timestamp(d.getTime());
return sqlDate;
}
}