package br.com.centralit.citcorpore.bi.utils;
import java.net.ConnectException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.ws.rs.core.MediaType;
import org.apache.commons.lang.StringEscapeUtils;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ClientResponse;
import br.com.centralit.citcorpore.bean.BICitsmartResultRotinaDTO;
import br.com.centralit.citcorpore.metainfo.bean.CamposObjetoNegocioDTO;
import br.com.centralit.citcorpore.metainfo.bean.ObjetoNegocioDTO;
import br.com.centralit.citcorpore.metainfo.negocio.CamposObjetoNegocioService;
import br.com.centralit.citcorpore.metainfo.negocio.ObjetoNegocioService;
import br.com.centralit.citcorpore.metainfo.util.DataBaseMetaDadosUtil;
import br.com.centralit.citcorpore.metainfo.util.MetaUtil;
import br.com.centralit.citcorpore.util.Enumerados;
import br.com.centralit.citcorpore.util.ImportInfoField;
import br.com.centralit.citcorpore.util.ImportInfoRecord;
import br.com.centralit.citcorpore.util.ParametroUtil;
import br.com.centralit.citcorpore.util.UtilImportData;
import br.com.centralit.citsmart.rest.schema.CtLoginResp;
import br.com.citframework.excecao.ServiceException;
import br.com.citframework.integracao.JdbcEngine;
import br.com.citframework.service.ServiceLocator;
import br.com.citframework.util.Constantes;
import br.com.citframework.util.UtilStrings;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class BICitsmartUtils {
/**
* Autentica o usu�rio utilizando JSON
*
* @param url
* @param usuario
* @param senha
* @return BICitsmartResultRotinaDTO
* @throws Exception
*/
public static BICitsmartResultRotinaDTO autenticacaoComJSON(String url, String usuario, String senha)
throws Exception {
String input = "{\"userName\":\"" + usuario + "\",\"password\":\"" + senha + "\"}";
BICitsmartResultRotinaDTO resultRotina = new BICitsmartResultRotinaDTO();
resultRotina.setResultado(false);
try {
ClientRequest request = new ClientRequest(url + "services/login");
request.accept(MediaType.APPLICATION_JSON);
request.body(MediaType.APPLICATION_JSON, input);
ClientResponse<String> response = request.post(String.class);
try {
CtLoginResp resp = new Gson().fromJson(response.getEntity(), CtLoginResp.class);
if (response != null && response.getStatus() != 200) {
if (resp != null && resp.getError().getDescription() != null
&& !resp.getError().getDescription().equals("")) {
resultRotina.concatMensagem("- Estabelecimento da conex�o: " + response.getStatus() + " - "
+ resp.getError().getDescription() + " (Falha) ");
} else {
resultRotina.concatMensagem("- Estabelecimento da conex�o HTTP (Falha): Erro "
+ response.getStatus());
}
} else {
resultRotina.concatMensagem("- Autentica��o do usu�rio (OK)");
resultRotina.setResultado(true);
resultRotina.setSessionID(resp.getSessionID());
}
} catch (JsonSyntaxException e) {
resultRotina.concatMensagem("- Estabelecimento da conex�o HTTP (Falha)");
}
return resultRotina;
} catch (ConnectException e) {
System.out.println("- Estabelecimento da conex�o (Falha).");
return resultRotina;
}
}
/**
* Recupera o objeto negocio utilizando o nome da tabela
*
* @param name
* @return ObjetoNegocioDTO
* @throws Exception
*/
protected static ObjetoNegocioDTO restoreByName(String name) throws Exception {
ObjetoNegocioService objetoNegocioService = (ObjetoNegocioService) ServiceLocator.getInstance().getService(
ObjetoNegocioService.class, null);
return objetoNegocioService.findByNomeObjetoNegocio(name);
}
/**
* Recupera o xml do objeto negocio indicado
*
* @param dbName
* @param filterAditional
* @return String
* @throws Exception
* @author rodrigo.acorse
*/
protected static String exportDB(String dbName, String filterAditional, boolean xmlComIdConexao) throws Exception {
ObjetoNegocioDTO objetoNegocioDto = BICitsmartUtils.restoreByName(dbName);
if (objetoNegocioDto != null) {
HashMap<String, String> map = new HashMap<String, String>();
map.put("excluirAoExportar", "N");
map.put("exportarVinculos", "N");
StringBuilder result = BICitsmartUtils.geraExportObjetoNegocio(map, objetoNegocioDto.getIdObjetoNegocio(),
"", "", filterAditional, "", xmlComIdConexao);
return result.toString();
} else {
return "";
}
}
/**
* Gera um IN em SQL com os IDs do xml indicado
*
* @param xml
* @param id
* @return String
* @throws Exception
* @author rodrigo.acorse
*/
protected static String generateSQLIn(String xml, String id) throws Exception {
List colRecordsGeral = new ArrayList();
String glue = "";
String generatedIn = "";
Integer count = 0;
xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<tables origem='0'>\n" + xml + "\n</tables>";
Collection colRecords = UtilImportData.readXMLSource(xml);
if (colRecords != null) {
colRecordsGeral.addAll(colRecords);
}
if (!colRecordsGeral.isEmpty()) {
for (Iterator itRecords = colRecordsGeral.iterator(); itRecords.hasNext();) {
ImportInfoRecord importInfoRecord = (ImportInfoRecord) itRecords.next();
for (Iterator it = importInfoRecord.getColFields().iterator(); it.hasNext();) {
ImportInfoField importInfoField = (ImportInfoField) it.next();
if (importInfoField.getNameField().equalsIgnoreCase(id)) {
if (count == 0 && generatedIn.equals("")) {
generatedIn += id + " IN ( "; // Se � o primeiro item e a v�riavel generatedIn for vazia,
// simplesmente abre o IN.
} else if (count == 0 && !generatedIn.equals("")) {
generatedIn += " OR " + id + " IN ( "; // Se � o primeiro item mas a v�riavel generatedIn
// n�o for vazia, abre o IN adicionando OR no in�cio.
}
generatedIn += glue + importInfoField.getValueField(); // Adiciona o item ao IN
glue = ", "; // Marca a v�rgula para o pr�ximo item
count++; // Soma +1 para o n�mero de itens
if (count == 900) { // Se a soma for igual a 900
generatedIn += " ) "; // Fecha o IN
glue = ""; // Esvazia a v�rgula
count = 0; // Zera a contagem
}
}
}
}
if (count != 0 && !generatedIn.equals("") && !generatedIn.endsWith(" ) ")) {
generatedIn += " ) "; // Fecha o IN
}
}
if (!generatedIn.equals("")) {
return " ( " + generatedIn + " ) ";
} else {
return "";
}
}
/**
* Retorna o xml de todas as tabelas utilizadas no BI do Citsmart
*
* @return String
* @throws Exception
* @author rodrigo.acorse
*/
public static String recuperaXmlTabelasBICitsmart(boolean xmlComIdConexao) throws Exception {
try {
HashMap<String, String> chavesTabelas = new HashMap<String, String>();
HashMap<String, String> xmlTabelas = new HashMap<String, String>();
String db;
// Inicia a string que receber� o xml final
StringBuilder contentXml = new StringBuilder();
// Tabela de Moedas
xmlTabelas.put("moedas", BICitsmartUtils.exportDB("moedas", "", xmlComIdConexao) + "\n");
// Tabela de Clientes
xmlTabelas.put("clientes", BICitsmartUtils.exportDB("clientes", "", xmlComIdConexao) + "\n");
// Tabela de Contratos
db = BICitsmartUtils.exportDB("contratos", "", xmlComIdConexao);
if (!db.equalsIgnoreCase("")) {
xmlTabelas.put("contratos", db + "\n");
chavesTabelas.put("idcontrato", generateSQLIn(db, "IDCONTRATO"));
}
// Tabela de OS
db = BICitsmartUtils.exportDB("os", chavesTabelas.get("idcontrato"), xmlComIdConexao);
if (!db.equalsIgnoreCase("")) {
xmlTabelas.put("os", db + "\n");
chavesTabelas.put("idos", generateSQLIn(db, "IDOS"));
}
// Tabela de Glosa OS
xmlTabelas.put("glosaos", BICitsmartUtils.exportDB("glosaos", chavesTabelas.get("idos"), xmlComIdConexao)
+ "\n");
// Tabela de Fatura
db = BICitsmartUtils.exportDB("fatura", chavesTabelas.get("idcontrato"), xmlComIdConexao);
if (!db.equalsIgnoreCase("")) {
xmlTabelas.put("fatura", db + "\n");
chavesTabelas.put("idfatura", generateSQLIn(db, "IDFATURA"));
}
// Tabela de Fatura OS
if (chavesTabelas.get("idfatura") != null && !chavesTabelas.get("idfatura").equals("")
&& chavesTabelas.get("idos") != null && !chavesTabelas.get("idos").equals("")) {
xmlTabelas.put(
"faturaos",
BICitsmartUtils.exportDB("faturaos",
chavesTabelas.get("idfatura") + " AND " + chavesTabelas.get("idos"), xmlComIdConexao)
+ "\n");
} else {
if (chavesTabelas.get("idfatura") != null && !chavesTabelas.get("idfatura").equals("")) {
xmlTabelas
.put("faturaos",
BICitsmartUtils.exportDB("faturaos", chavesTabelas.get("idfatura"), xmlComIdConexao)
+ "\n");
} else if (chavesTabelas.get("idos") != null && !chavesTabelas.get("idos").equals("")) {
xmlTabelas.put("faturaos",
BICitsmartUtils.exportDB("faturaos", chavesTabelas.get("idos"), xmlComIdConexao) + "\n");
}
}
// Tabela de Fatura Apura��o Ans
xmlTabelas.put("faturaapuracaoans",
BICitsmartUtils.exportDB("faturaapuracaoans", chavesTabelas.get("idfatura"), xmlComIdConexao)
+ "\n");
// Tabela de Atividades OS
xmlTabelas.put("atividadesos",
BICitsmartUtils.exportDB("atividadesos", chavesTabelas.get("idos"), xmlComIdConexao) + "\n");
// Tabela de Servi�o Contrato
if (chavesTabelas.get("idcontrato") != null) {
db = BICitsmartUtils.exportDB("servicocontrato", " IDSERVICO IN (SELECT IDSERVICO FROM SERVICO) AND "
+ chavesTabelas.get("idcontrato"), xmlComIdConexao);
} else {
db = BICitsmartUtils.exportDB("servicocontrato", " IDSERVICO IN (SELECT IDSERVICO FROM SERVICO) ",
xmlComIdConexao);
}
if (!db.equalsIgnoreCase("")) {
xmlTabelas.put("servicocontrato", db + "\n");
chavesTabelas.put("idservicocontrato", generateSQLIn(db, "IDSERVICOCONTRATO"));
chavesTabelas.put("idservico", generateSQLIn(db, "IDSERVICO"));
}
// Tabela de Atividades Servi�o Contrato
xmlTabelas.put(
"atividadesservicocontrato",
BICitsmartUtils.exportDB("atividadesservicocontrato", chavesTabelas.get("idservicocontrato"),
xmlComIdConexao) + "\n");
// Tabela de Servi�o
xmlTabelas.put("servico",
BICitsmartUtils.exportDB("servico", chavesTabelas.get("idservico"), xmlComIdConexao) + "\n");
// Monta XML final
contentXml.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<tables origem='0'>\n");
contentXml.append(xmlTabelas.get("moedas"));
contentXml.append(xmlTabelas.get("clientes"));
contentXml.append(xmlTabelas.get("contratos"));
contentXml.append(xmlTabelas.get("servico"));
contentXml.append(xmlTabelas.get("servicocontrato"));
contentXml.append(xmlTabelas.get("os"));
contentXml.append(xmlTabelas.get("glosaos"));
contentXml.append(xmlTabelas.get("fatura"));
contentXml.append(xmlTabelas.get("faturaos"));
contentXml.append(xmlTabelas.get("faturaapuracaoans"));
contentXml.append(xmlTabelas.get("atividadesservicocontrato"));
contentXml.append(xmlTabelas.get("atividadesos"));
contentXml.append("\n</tables>");
return StringEscapeUtils.escapeHtml(contentXml.toString());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* Gera o XML do objeto negocio indicado
*
* @param hashValores
* @param idObjetoNegocio
* @param sqlDelete
* @param nomeTabela
* @param filterAditional
* @param order
* @param xmlComIdConexao
* @return StringBuilder
* @throws ServiceException
* @throws Exception
*/
protected static StringBuilder geraExportObjetoNegocio(HashMap hashValores, Integer idObjetoNegocio,
String sqlDelete, String nomeTabela, String filterAditional, String order, boolean xmlComIdConexao)
throws ServiceException, Exception {
CamposObjetoNegocioService camposObjetoNegocioService = (CamposObjetoNegocioService) ServiceLocator
.getInstance().getService(CamposObjetoNegocioService.class, null);
ObjetoNegocioService objetoNegocioService = (ObjetoNegocioService) ServiceLocator.getInstance().getService(
ObjetoNegocioService.class, null);
ObjetoNegocioDTO objetoNegocioDTO = new ObjetoNegocioDTO();
objetoNegocioDTO.setIdObjetoNegocio(idObjetoNegocio);
objetoNegocioDTO = (ObjetoNegocioDTO) objetoNegocioService.restore(objetoNegocioDTO);
Collection col = camposObjetoNegocioService.findByIdObjetoNegocio(idObjetoNegocio);
String sqlCondicao = "";
String sqlCampos = "";
String excluirAoExportar = (String) hashValores.get("excluirAoExportar".toUpperCase());
// Antes de fazer a exportacao, faz o sincronismo com o DB, pois pode estar desatualizado!
DataBaseMetaDadosUtil dataBaseMetaDadosUtil = new DataBaseMetaDadosUtil();
dataBaseMetaDadosUtil.sincronizaObjNegDB(objetoNegocioDTO.getNomeTabelaDB(), false);
System.out.println("Sincronizando tabela: " + objetoNegocioDTO.getNomeTabelaDB());
hashValores.put("NOMETABELADB", objetoNegocioDTO.getNomeTabelaDB());
String tabelasTratadas = (String) hashValores.get("TABELASTRATADAS");
tabelasTratadas = UtilStrings.nullToVazio(tabelasTratadas);
tabelasTratadas = tabelasTratadas + "'" + objetoNegocioDTO.getNomeTabelaDB() + "'";
hashValores.put("TABELASTRATADAS", tabelasTratadas);
// nomeTabela = objetoNegocioDTO.getNomeTabelaDB();
if (col != null) {
for (Iterator it = col.iterator(); it.hasNext();) {
CamposObjetoNegocioDTO camposObjetoNegocioDto = (CamposObjetoNegocioDTO) it.next();
if (!sqlCampos.trim().equalsIgnoreCase("")) {
sqlCampos += ",";
}
sqlCampos = sqlCampos + camposObjetoNegocioDto.getNomeDB();
String cond = (String) hashValores.get("COND_" + camposObjetoNegocioDto.getIdCamposObjetoNegocio());
String valor = (String) hashValores.get("VALOR_" + camposObjetoNegocioDto.getIdCamposObjetoNegocio());
if (!UtilStrings.nullToVazio(cond).trim().equalsIgnoreCase("")
&& !UtilStrings.nullToVazio(valor).trim().equalsIgnoreCase("")) {
sqlCondicao = sqlCondicao + " " + camposObjetoNegocioDto.getNomeDB();
if (cond != null && cond.equalsIgnoreCase("1")) {
sqlCondicao = sqlCondicao + " <> ";
} else if (cond != null && cond.equalsIgnoreCase("2")) {
sqlCondicao = sqlCondicao + " > ";
} else if (cond != null && cond.equalsIgnoreCase("3")) {
sqlCondicao = sqlCondicao + " < ";
} else {
sqlCondicao = sqlCondicao + " " + cond + " ";
}
boolean isStringType = MetaUtil.isStringType(camposObjetoNegocioDto.getTipoDB());
if (isStringType) {
if (cond.equalsIgnoreCase("=") || cond.equalsIgnoreCase("1") || cond.equalsIgnoreCase("2")
|| cond.equalsIgnoreCase("3")) {
valor = valor.replaceAll("'", "");
valor = "'" + valor + "'";
}
}
if (cond != null && !cond.trim().equalsIgnoreCase("IS NULL")) {
sqlCondicao = sqlCondicao + valor;
}
}
}
}
String sqlFinal = "SELECT " + sqlCampos + " FROM " + objetoNegocioDTO.getNomeTabelaDB();
sqlDelete = "DELETE FROM " + objetoNegocioDTO.getNomeTabelaDB();
if (!sqlCondicao.trim().equalsIgnoreCase("")) {
if (filterAditional != null && !filterAditional.trim().equalsIgnoreCase("")) {
sqlFinal = sqlFinal + " WHERE " + sqlCondicao + " AND (" + filterAditional + ")";
sqlDelete = sqlDelete + " WHERE " + sqlCondicao + " AND (" + filterAditional + ")";
} else {
sqlFinal = sqlFinal + " WHERE " + sqlCondicao;
sqlDelete = sqlDelete + " WHERE " + sqlCondicao;
}
} else {
if (filterAditional != null && !filterAditional.trim().equalsIgnoreCase("")) {
sqlFinal = sqlFinal + " WHERE (" + filterAditional + ")";
sqlDelete = sqlDelete + " WHERE (" + filterAditional + ")";
}
}
if (order != null && !order.trim().equalsIgnoreCase("")) {
sqlFinal += " ORDER BY " + order;
}
String sqlDeleteAux = (String) hashValores.get("COMMANDDELETE");
String sqlExportAux = (String) hashValores.get("COMMAND");
if (!UtilStrings.nullToVazio(sqlDeleteAux).trim().equalsIgnoreCase("")) {
sqlDeleteAux = sqlDelete + "; " + UtilStrings.nullToVazio(sqlDeleteAux);
} else {
sqlDeleteAux = sqlDelete;
}
if (!UtilStrings.nullToVazio(sqlExportAux).trim().equalsIgnoreCase("")) {
sqlExportAux = sqlFinal + "; " + UtilStrings.nullToVazio(sqlExportAux);
} else {
sqlExportAux = sqlFinal;
}
hashValores.put("COMMANDDELETE", sqlDeleteAux);
hashValores.put("COMMAND", sqlExportAux);
JdbcEngine jdbcEngine = new JdbcEngine(Constantes.getValue("DATABASE_ALIAS"), null);
List lst = null;
try {
lst = jdbcEngine.execSQL(sqlFinal, null, 0);
} catch (Exception e) {
e.printStackTrace();
return new StringBuilder("OCORREU ERRO NA GERACAO DOS DADOS!" + e.getMessage());
}
StringBuilder strXML = new StringBuilder();
strXML.append("<table name='" + objetoNegocioDTO.getNomeTabelaDB() + "'>\n");
strXML.append("<command><![CDATA[" + sqlFinal + "]]></command>\n");
if (excluirAoExportar != null && excluirAoExportar.equalsIgnoreCase("S")) {
strXML.append("<commandDelete><![CDATA[" + sqlDelete + "]]></commandDelete>\n");
} else {
strXML.append("<commandDelete>NONE</commandDelete>\n");
}
String keysProcessed = "";
if (lst != null) {
int j = 0;
for (Iterator itDados = lst.iterator(); itDados.hasNext();) {
Object[] obj = (Object[]) itDados.next();
int i = 0;
j++;
strXML.append("<record number='" + j + "'>\n");
for (Iterator it = col.iterator(); it.hasNext();) {
CamposObjetoNegocioDTO camposObjetoNegocioDto = (CamposObjetoNegocioDTO) it.next();
String key = "n";
boolean isStringType = MetaUtil.isStringType(camposObjetoNegocioDto.getTipoDB());
if (camposObjetoNegocioDto.getPk() != null && camposObjetoNegocioDto.getPk().equalsIgnoreCase("S")) {
key = "y";
if (!keysProcessed.trim().equalsIgnoreCase("")) {
keysProcessed = keysProcessed + ",";
}
if (isStringType) {
keysProcessed = keysProcessed + "'" + obj[i] + "'";
} else {
keysProcessed = keysProcessed + "" + obj[i] + "";
}
}
String sequence = "n";
if (camposObjetoNegocioDto.getSequence() != null
&& camposObjetoNegocioDto.getSequence().equalsIgnoreCase("S")) {
sequence = "y";
}
strXML.append("<field name='" + camposObjetoNegocioDto.getNomeDB() + "' key='" + key
+ "' sequence='" + sequence + "' type='" + camposObjetoNegocioDto.getTipoDB().trim() + "'>");
if (isStringType) {
strXML.append("<![CDATA[");
}
strXML.append(obj[i]);
if (isStringType) {
strXML.append("]]>");
}
strXML.append("</field>\n");
i++;
}
if (xmlComIdConexao) {
// Utilizar o parametro do sistema
Integer idConexaoBI = Integer.parseInt(ParametroUtil.getValorParametroCitSmartHashMap(
Enumerados.ParametroSistema.BICITSMART_ID_CONEXAO, null));
strXML.append("<field name='IDCONEXAOBI' key='y' sequence='n' type='NUMBER'>" + idConexaoBI
+ "</field>\n");
}
strXML.append("</record>\n");
}
}
strXML.append("</table>\n");
hashValores.put("KEYS", keysProcessed);
return strXML;
}
}