package br.com.centralit.citgerencial.generateservices.incidentes;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import br.com.centralit.citcorpore.util.CITCorporeUtil;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.Enumerados.SituacaoSolicitacaoServico;
import br.com.centralit.citcorpore.util.Enumerados.TipoDate;
import br.com.centralit.citgerencial.bean.GerencialGenerateService;
import br.com.citframework.excecao.PersistenceException;
import br.com.citframework.integracao.JdbcEngine;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.SQLConfig;
import br.com.citframework.util.UtilDatas;
import br.com.citframework.util.UtilFormatacao;
import br.com.citframework.util.UtilI18N;
import br.com.citframework.util.UtilNumbersAndDecimals;
@SuppressWarnings({ "rawtypes", "unchecked", "unused" })
public class GenerateSLA extends GerencialGenerateService {
public List execute(HashMap parametersValues, Collection paramtersDefinition) throws ParseException {
String datainicial = (String) parametersValues.get("PARAM.dataInicial");
String datafinal = (String) parametersValues.get("PARAM.dataFinal");
List parametersValuesBusca = new ArrayList();
List lstRetorno = new ArrayList();
Date datafim = UtilDatas.convertStringToSQLDate(TipoDate.DATE_DEFAULT, datafinal, super.getLanguage(paramtersDefinition));
Date datainicio = UtilDatas.convertStringToSQLDate(TipoDate.DATE_DEFAULT, datainicial, super.getLanguage(paramtersDefinition));
Calendar calendar = Calendar.getInstance();
if (datafim != null) {
calendar.setTime(datafim);
}
calendar.add(GregorianCalendar.DATE, 1);
datafim = new java.sql.Date(calendar.getTime().getTime());
/*
* Desenvolvedor: Rodrigo Pecci - Data: 31/10/2013 - Hor�rio: 17h40min - ID Citsmart: 120770 Motivo/Coment�rio: O servicocontrato no select foi alterado para inner join.
*/
StringBuilder sql = new StringBuilder();
sql.append("select ");
sql.append("sol.idsolicitacaoservico as valor1, ");
sql.append("emp.nome as valor2, ");
sql.append("cont.numero as valor3, ");
sql.append("sol.datahorasolicitacao as valor4, ");
sql.append("sol.datahorafim as valor5, ");
sql.append("sol.datahoralimite as valor6, ");
sql.append("sol.prazohh as valor7, ");
sql.append("sol.prazomm as valor8, ");
sql.append("sol.seqreabertura as valor9, ");
sql.append("sol.tempoCapturaHH as valor10, ");
sql.append("sol.tempoCapturaMM as valor11, ");
sql.append("sol.tempoAtrasoHH as valor12, ");
sql.append("sol.tempoAtrasoMM as valor13, ");
sql.append("sol.tempoAtendimentoHH as valor14, ");
sql.append("sol.tempoAtendimentoMM as valor15, ");
sql.append("sol.dataHoraCaptura as valor16, ");
sql.append("slaACombinar as valor17, ");
sql.append("idprioridade as valor18, ");
sql.append("sol.situacao as valor19, ");
sql.append("sol.situacaosla as valor20, ");
sql.append("sol.datahorasuspensaosla as valor21 ");
sql.append("from solicitacaoservico sol ");
sql.append("inner join execucaosolicitacao es on es.idsolicitacaoservico = sol.idsolicitacaoservico ");
sql.append("left outer join empregados emp on emp.idempregado = sol.idsolicitante inner join servicocontrato serc on serc.idservicocontrato = sol.idservicocontrato ");
sql.append("left outer join servico serv on serv.idservico = serc.idservicocontrato left outer join tiposervico tipos ON serv.idtiposervico = tipos.idtiposervico ");
sql.append("left outer join contratos cont on cont.idcontrato = serc.idcontrato left outer join tipodemandaservico tpdem on tpdem.idtipodemandaservico = serv.idtipodemandaservico ");
sql.append("WHERE 1 = 1 ");
String classificacao = (String) parametersValues.get("PARAM.classificacao");
if (classificacao != null && !classificacao.equalsIgnoreCase("*")) {
sql.append("AND tpdem.classificacao = '" + classificacao + "' ");
}
String noPrazoInfo = (String) parametersValues.get("PARAM.noPrazo");
if (noPrazoInfo == null) {
noPrazoInfo = "*";
}
sql.append("AND (serc.idservico = ? OR ? = -1) ");
sql.append("AND (serc.idcontrato = ? OR ? = -1) ");
sql.append("AND (tipos.idtiposervico = ? OR ? = -1) ");
sql.append("AND (sol.idprioridade = ? OR ? = -1) ");
sql.append("AND (sol.idorigem = ? OR ? = -1) ");
sql.append("AND (sol.idunidade = ? OR ? = -1) ");
sql.append("AND (sol.situacao = ? OR ? = '*') ");
sql.append("AND (sol.datahorasolicitacao BETWEEN ? AND ?) ");
sql.append("AND (sol.idtipodemandaservico is not null) ");
JdbcEngine jdbcEngine = new JdbcEngine(Constantes.getValue("DATABASE_ALIAS"), null);
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idServico")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idServico")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idContrato")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idContrato")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idTipoServico")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idTipoServico")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idPrioridade")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idPrioridade")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idOrigem")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idOrigem")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idUnidade")));
parametersValuesBusca.add(Integer.parseInt((String) parametersValues.get("PARAM.idUnidade")));
parametersValuesBusca.add(parametersValues.get("PARAM.situacao"));
parametersValuesBusca.add(parametersValues.get("PARAM.situacao"));
parametersValuesBusca.add(datainicio);
parametersValuesBusca.add(datafim);
this.acrescentarNaSqlOLimitadorDeRegistros(sql, this.obterValorParametroNumeroMaximoDeRegistros(parametersValues));
sql.append("order by valor7, valor8, valor4, valor1 ");
HttpServletRequest request = null;
try {
List listaDados = jdbcEngine.execSQL(sql.toString(), parametersValuesBusca.toArray(), 0);
if (listaDados != null) {
for (int i = 0; i < listaDados.size(); i++) {
Object[] row = (Object[]) listaDados.get(i);
Timestamp dataHoraSol = (Timestamp) row[3];
Timestamp dataHoraFim = (Timestamp) row[4];
String dataHoraFimStr = "--";
if (dataHoraFim != null) {
dataHoraFimStr = UtilDatas.convertDateToString(TipoDate.TIMESTAMP_WITH_SECONDS, dataHoraFim, super.getLanguage(paramtersDefinition));
}
Timestamp dataHoraLimite = (Timestamp) row[5];
String dataHoraLimiteStr = "--";
if (dataHoraFim != null) {
dataHoraLimiteStr = UtilDatas.convertDateToString(TipoDate.TIMESTAMP_WITH_SECONDS, dataHoraLimite, super.getLanguage(paramtersDefinition));
}
String slaComb = (String) row[16];
if (slaComb == null) {
slaComb = "N";
}
String sla = "";
Integer slaHH = null;
if (BigDecimal.class.isInstance(row[6])) {
BigDecimal auxBig = (BigDecimal) row[6];
slaHH = new Integer(auxBig.intValue());
} else {
slaHH = Integer.parseInt(row[6].toString());
}
Integer slaMM = null;
if (BigDecimal.class.isInstance(row[7])) {
BigDecimal auxBig = (BigDecimal) row[7];
slaMM = new Integer(auxBig.intValue());
} else {
slaMM = Integer.parseInt(row[7].toString());
}
if (slaHH != null && slaHH.intValue() > 0) {
sla = slaHH + "h";
}
if (slaMM != null && slaMM.intValue() > 0) {
sla += " " + slaMM + "m";
}
// Pega o request dos par�metros
for (Iterator iterator = paramtersDefinition.iterator(); iterator.hasNext();) {
Object parametro = (Object) iterator.next();
if (parametro != null && "org.apache.catalina.connector.RequestFacade".equals(parametro.getClass().getName())) {
request = (HttpServletRequest) parametro;
break;
}
}
boolean slaACombinar = (slaHH == null || slaHH.intValue() == 0) && (slaMM == null || slaMM.intValue() == 0);
if (slaACombinar) {
sla = UtilI18N.internacionaliza(request, "citcorpore.comum.aCombinar");
slaComb = "S";
} else {
slaComb = "N";
}
String captura = "";
Integer capturaHH = null;
if (BigDecimal.class.isInstance(row[9])) {
BigDecimal auxBig = (BigDecimal) row[9];
capturaHH = new Integer(auxBig.intValue());
} else {
if (row[9] != null) {
capturaHH = Integer.parseInt(row[9].toString());
}
}
Integer capturaMM = null;
if (BigDecimal.class.isInstance(row[10])) {
BigDecimal auxBig = (BigDecimal) row[10];
capturaMM = new Integer(auxBig.intValue());
} else {
if (row[10] != null) {
capturaMM = Integer.parseInt(row[10].toString());
}
}
if (capturaHH != null && capturaHH.intValue() > 0) {
captura = capturaHH + "h";
}
if (capturaMM != null && capturaMM.intValue() > 0) {
captura += " " + capturaMM + "m";
}
String atraso = "";
String noPrazo = UtilI18N.internacionaliza(request, "citcorpore.comum.sim");
String noPrazoComp = "N";
String situacao = (String) row[18];
if (situacao == null) {
situacao = "";
}
if (situacao.equalsIgnoreCase("EmAndamento")) {
situacao = UtilI18N.internacionaliza(request, "requisitosla.andamento");
}
if (situacao.equalsIgnoreCase("Cancelada")) {
situacao = UtilI18N.internacionaliza(request, "citcorpore.comum.cancelada");
}
if (situacao.equalsIgnoreCase("ReClassificada")) {
situacao = UtilI18N.internacionaliza(request, "citcorpore.comum.reclassificada");
}
if (situacao.equalsIgnoreCase("ReClassificada")) {
situacao = UtilI18N.internacionaliza(request, "citcorpore.comum.reclassificada");
}
if (slaComb.equalsIgnoreCase("N")) {
Integer atrasoHH = null;
Integer atrasoMM = null;
if (BigDecimal.class.isInstance(row[11])) {
BigDecimal auxBig = (BigDecimal) row[11];
atrasoHH = new Integer(auxBig.intValue());
} else if (Short.class.isInstance(row[11])) {
Short sh = (Short) row[11];
atrasoHH = new Integer(sh.intValue());
} else {
atrasoHH = (Integer) row[11];
}
if (BigDecimal.class.isInstance(row[12])) {
BigDecimal auxBig = (BigDecimal) row[12];
atrasoMM = new Integer(auxBig.intValue());
} else if (Short.class.isInstance(row[12])) {
Short sh = (Short) row[12];
atrasoHH = new Integer(sh.intValue());
} else {
atrasoMM = (Integer) row[12];
}
long atrasoSLA = 0;
Timestamp dataHoraSuspensao = (Timestamp) row[20];
String situacaoSLA = (String) row[19];
if (dataHoraLimite != null) {
boolean bCalcula = true;
if (situacao.equals(SituacaoSolicitacaoServico.Suspensa.name())) {
if (dataHoraSuspensao != null && dataHoraSuspensao.compareTo(dataHoraLimite) > 0) {
bCalcula = true;
} else {
bCalcula = false;
}
} else if (situacaoSLA != null && situacaoSLA.equalsIgnoreCase("S")) {
if (dataHoraSuspensao != null && dataHoraSuspensao.compareTo(dataHoraLimite) > 0) {
bCalcula = true;
} else {
bCalcula = false;
}
}
if (bCalcula) {
Timestamp dataHoraComparacao = UtilDatas.getDataHoraAtual();
if (situacao != null && (situacao.equalsIgnoreCase(Enumerados.SituacaoSolicitacaoServico.Fechada.name())))
dataHoraComparacao = dataHoraFim;
if (dataHoraComparacao != null) {
if (dataHoraComparacao.compareTo(dataHoraLimite) > 0) {
try {
atrasoSLA = UtilDatas.calculaDiferencaTempoEmMilisegundos(dataHoraComparacao, dataHoraLimite) / 1000;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
* if (atrasoHH != null && atrasoHH.intValue() > 0) { atraso = atrasoHH + "h"; } if (atrasoMM != null && atrasoMM.intValue() > 0) { atraso += " " + atrasoMM + "m"; }
*/
if (atrasoSLA == 0) {
noPrazo = UtilI18N.internacionaliza(request, "citcorpore.comum.sim");
noPrazoComp = "N";
} else {
atraso = "";
long hours = atrasoSLA / 3600;
long minutes = (atrasoSLA - 3600 * hours) / 60;
if (hours > 0) {
atraso = hours + "h";
}
if (minutes > 0) {
atraso += " " + minutes + "m";
}
noPrazo = UtilI18N.internacionaliza(request, "citcorpore.comum.nao");
noPrazoComp = "F";
}
} else if(slaComb.equalsIgnoreCase("S")){
noPrazo = UtilI18N.internacionaliza(request, "citcorpore.comum.sim");
dataHoraLimiteStr = "";
}
if(situacao.equalsIgnoreCase("Cancelada")){
noPrazo = "";
}
String atend = "";
Integer atendHH = UtilNumbersAndDecimals.convertToInteger(row[13]);
Integer atendMM = UtilNumbersAndDecimals.convertToInteger(row[14]);
if (atendHH != null && atendHH.intValue() > 0) {
atend = atendHH + "h";
}
if (atendMM != null && atendMM.intValue() > 0) {
atend += " " + atendMM + "m";
}
Integer prioridade = UtilNumbersAndDecimals.convertToInteger(row[17]);
String prioridadeStr = "";
if (prioridade == null) {
prioridadeStr = "--";
} else {
prioridadeStr = "" + prioridade;
}
if (noPrazoInfo.equalsIgnoreCase("*") || noPrazoInfo.equalsIgnoreCase(noPrazoComp)) {
lstRetorno.add(new Object[] { sla, row[0] + "", row[1], row[2], UtilDatas.convertDateToString(TipoDate.TIMESTAMP_WITH_SECONDS, dataHoraSol, super.getLanguage(paramtersDefinition)), dataHoraLimiteStr, dataHoraFimStr, prioridadeStr, captura, atraso,
situacao, atend, noPrazo });
}
}
}
HashMap mapAux1 = new HashMap();
HashMap mapAux2 = new HashMap();
int qtdeTotal = 0;
for (Iterator itAux = lstRetorno.iterator(); itAux.hasNext();) {
Object[] obj = (Object[]) itAux.next();
Double qtdeDentroPrazo = (double) 0;
Double qtdeForaPrazo = (double) 0;
if (mapAux1.get(obj[0]) != null) {
qtdeDentroPrazo = (Double) mapAux1.get(obj[0]);
}
if (mapAux2.get(obj[0]) != null) {
qtdeForaPrazo = (Double) mapAux2.get(obj[0]);
}
if ((((String) obj[12]).equalsIgnoreCase(UtilI18N.internacionaliza(request, "citcorpore.comum.sim"))||((String)obj[12]).equalsIgnoreCase(""))) {
qtdeDentroPrazo = qtdeDentroPrazo + 1;
} else {
qtdeForaPrazo = qtdeForaPrazo + 1;
}
mapAux1.put(obj[0], qtdeDentroPrazo);
mapAux2.put(obj[0], qtdeForaPrazo);
qtdeTotal++;
}
for (Iterator itAux = lstRetorno.iterator(); itAux.hasNext();) {
Object[] obj = (Object[]) itAux.next();
Double qtdeDentroPrazo = (double) 0;
Double qtdeForaPrazo = (double) 0;
if (mapAux1.get(obj[0]) != null) {
qtdeDentroPrazo = (Double) mapAux1.get(obj[0]);
}
if (mapAux2.get(obj[0]) != null) {
qtdeForaPrazo = (Double) mapAux2.get(obj[0]);
}
if (qtdeDentroPrazo == null) {
qtdeDentroPrazo = (double) 0;
}
if (qtdeForaPrazo == null) {
qtdeForaPrazo = (double) 0;
}
double perc1 = 0;
try {
perc1 = ((qtdeDentroPrazo / (qtdeDentroPrazo + qtdeForaPrazo)) * 100);
} catch (Exception e) {
}
double perc2 = 0;
try {
perc2 = ((qtdeForaPrazo / (qtdeDentroPrazo + qtdeForaPrazo)) * 100);
} catch (Exception e) {
}
obj[0] = obj[0] + " - " + UtilI18N.internacionaliza(request, "citcorpore.comum.dentroPrazo") + ": " + UtilFormatacao.formatDouble(qtdeDentroPrazo, 0) + " ("
+ UtilFormatacao.formatDouble(perc1, 2) + "%)";
obj[0] = obj[0] + " " + UtilI18N.internacionaliza(request, "citcorpore.comum.foraPrazo") + ": " + UtilFormatacao.formatDouble(qtdeForaPrazo, 0) + " ("
+ UtilFormatacao.formatDouble(perc2, 2) + "%)";
}
if (lstRetorno == null || lstRetorno.size() == 0) {
lstRetorno = new ArrayList();
// lstRetorno.add(new Object[] { "", "", "", "", "", "", "", "", "", "", "", "", "" });
/**
* Foi adicionado comentado o Item acima pois, ao gerar o relat�rio com a lista vazia o relat�rio estava sendo mostrado. Bruno.Aquino
*/
}
for (Iterator iterator = paramtersDefinition.iterator(); iterator.hasNext();) {
Object parametro = (Object) iterator.next();
if (parametro != null && "org.apache.catalina.connector.RequestFacade".equals(parametro.getClass().getName())) {
iterator.remove();
break;
}
}
return lstRetorno;
} catch (PersistenceException e) {
e.printStackTrace();
return null;
}
}
/**
* Retorna o N�mero M�ximo de registros que dever� ser retornado na consulta.
*
* @param parametros
* @return N�mero M�ximo de Registros
* @author valdoilo.damasceno
*/
private Integer obterValorParametroNumeroMaximoDeRegistros(HashMap parametros) {
String valor = (String) parametros.get("PARAM.topList");
if (StringUtils.isNotBlank(valor) && !valor.trim().equals("*")) {
try {
return new Integer(valor);
} catch (NumberFormatException e) {
return null;
}
} else {
return null;
}
}
/**
* Acrescenta no SQL a condi��o para limitar o retorno de registros de acordo com o valor selecionado.
*
* @param sql
* - String SQL.
* @param maximoRegistros
* - N�mero m�ximo de registros.
* @author valdoilo.damasceno
*/
private void acrescentarNaSqlOLimitadorDeRegistros(StringBuilder sql, Integer maximoRegistros) {
String valores = " valor1, valor2, valor3, valor4, valor5, valor6, valor7, valor8, valor9, valor10, valor11, valor12, valor13, valor14, valor15, valor16, valor17, valor18, valor19, valor20, valor21 ";
if (maximoRegistros == null)
return;
if (CITCorporeUtil.SGBD_PRINCIPAL.toUpperCase().equals(SQLConfig.ORACLE)) {
sql.insert(0, "SELECT " + valores + "FROM (");
sql.insert(sql.length(), ") where rownum <= " + maximoRegistros);
} else if (CITCorporeUtil.SGBD_PRINCIPAL.toUpperCase().equals(SQLConfig.SQLSERVER)) {
sql.replace(0, 6, " select " + valores + " from (select ROW_NUMBER() OVER(order by (select 1)) rownum, ");
sql.append(" ) as teste where rownum between 0 and " + maximoRegistros);
} else {
sql.append(" LIMIT " + maximoRegistros);
}
}
}