Índice

Objetivo

O objetivo deste guia é apresentar as características e a configuração da integração do Fluig com o ERP RM.

Fluig acessando ERP RM

O processo de integração do Fluig com o ERP RM possui duas formas: uma utilizando os Web Services padrão SOA hospedados diretamente no serviço de HOST da aplicação e outra utilizando os Web Services dentro do IIS (Internet Information Services).

O uso dos Web Services hospedados dentro do IIS exige a instalação do aplicativo “TOTVS Business Connect (TBC)” de acordo com o descrito aqui e pode ser obtido dentro do “Portal do Cliente. Todavia, apesar de mantermos esta integração, sugerimos que utilizem apenas os Web services disponibilizados pelo Host da aplicação por entendermos que são mais seguros e rápidos, além disto, não exge nenhuma instalação complementar, basta seguir os passos descritos aqui.

 

OBS: Para testar os webservices deve-se utilizar um aplicativo que utilize protocolo SOAP nas chamadas. Indicamos o SoapUI ou o “WS TOTVS Client” disponibilizado na pasta de instalação do RM.

 

Após instalação dos Webservices do RM hospedados no Host, podemos utilizar a opção de “aceleradores fluigs” disponibilizado no aplicativo “TOTVS WS Client” para gerar classes e arquivos necessário para montar um Processo dentro do fluig. Para isto, seguir os passos abaixo:

Configurar o WS TOTVS Client

     Para que o TOTVS WS Client consiga acessar os WebServices do RM, é necessário que os mesmos estejam ativos e que o DefaultDB esteja configurado. Para saber como configurar o DefaultDB acesse o link: http://tdn.totvs.com/x/sQSqC

      Para uso do sistema "TOTVS WS Client" é necessário copiar os arquivos: "TotvsWSClient.exe" e "TotvsWSClient.exe.config" para a pasta RM.Net do seu ambiente configurado.

      Em seguida, basta editar o arquivo "TotvsWSClient.exe.config" alterando as Tag's "Host", "Port" e "WS-Server" para as configurações do ambiente desejado. Conforme exemplo abaixo:

 

TotvsWSClient.exe.config

<?xml version="1.0"?>

<configuration>

  <appSettings>

    <add key="Host" value="localhost" />

    <add key="Port" value="1180" />

    <add key="EnableCompression" value="False" />

    <add key="WS-Server" value="http://localhost:8051" />

    <add key="WS-UserName" value="mestre" />

    <add key="WS-DataServerName" value="GlbUsuarioData" />

    <add key="WS-ProcessName" value="GlbAcessoData" />

    <add key="WS-CodColigadaSQL" value="" />

    <add key="WS-CodSistemaSQL" value="" />

 </appSettings>

</configuration>

Localizando o serviço RM que deseja integrar

Os serviços do RM são disponibilizados por três formas:

DataServers: Todos os CRUDS dos cadastros desenvolvidos na tecnologia .NET do RM são disponibilizados através do Web Services WsDataServer.  Basicamente, oferece quatro métodos principais:

  1. GetSchema: responsável por retornar o schema (XSD) do XML necessário para salvar um registro (saverecord).
  2. ReadView: responsável por efetuar a leitura do cadastro do RM e retornar um XML contendo registros de acordo com o contexto e o filtro informado.
  3. ReadRecord: responsável por efetuar a leitura do cadastro do RM e retornar um XML contendo registros de acordo com a chave primária e o contexto informado.
  4. SaveRecord:  responsável por efetuar alterações de registros do cadastro do RM de acordo com o XML informado.

A lista de dataservers (com o ID) disponíveis pode ser obtido aqui ou usando a opção de localizar do aplicativo “TOTVS WS Client

 

Importante: o passo 4 marca o nome do ID que deverá ser passado no parâmetro “DataServer” dos Web Services acima.

Processos: Expõe no wsProcess serviços do RM. Permite consumi-los através de uma requisição webservice padrão SOAP, respeitando os parâmetros de cada serviço que podem ser obtidos seguindo os passos abaixo:

 

http://tdn.totvs.com.br/display/public/rm/TBC+-+Web+Service+Process

ConsultaSQL: Retorna o resultado de uma consulta SQL cadastrada no RM. Detalhes de como criar um consulta sql podem ser obtidos clicando aqui.

http://tdn.totvs.com.br/display/public/rm/TBC+-+Web+Service+ConsultaSQL 

  

Passo 3:

Importando os arquivos dos aceleradores para o Fluig:

 

 

Após salvar os arquivos, basta importar o arquivo “*.fluigprj” para dentro do seu projeto.

 

 

Caso deseje fazer a integração manualmente, pode se fazer da seguinte forma:

 

Fazendo a comunicação via “Web Services SOAP” do aplicativo.

Neste tipo de integração utilizando Web Service padrão SOAP disponibilizado pelo ERP, o acesso do Fluig a estes serviços é direto.

A seguir são apresentadas as configurações do Fluig para acesso ao Web Service padrão SOAP:

 

Passo 1:

Cadastrar um serviço do tipo Web Services dentro do Fluig pelo Fluig Studio (opção Incluir Serviços na aba Visualizar Serviços) apontando para WSDL doWeb Service SAP disponibilizado para integração.

 

Nota: A criação de DataSets que consomem WebServices do RM pode ser obtidos modificando o template abaixo:

Obs: o campo “NOME_DATASERVER” é o ID obtido de acordo com o passo 2 “Localizando o serviço RM que deseja integrar

function createDataset(fields, constraints, sortFields)
{
	var NOME_DATASERVER = "FisEtdDataBR";
	try
	{
		// carrega o webservice...
		var authService = getWebService();
		// monta o filtro...
		var parsedConstraints = parseConstraints(constraints, true);
		// faz a leitura...
		var result = authService.readView(NOME_DATASERVER, parsedConstraints.filter, parsedConstraints.context);
		// carrega o xml...
		var xmlResultados = new XML(result);
		// verifica se a tabela é válida...
		if(xmlResultados.GETD == null){
			return logError("A tabela GETD nao foi encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO);
		}
		// inicializa o dataset do resultado...
		var dataset = DatasetBuilder.newDataset();
		dataset.addColumn("DESCRICAO");
		dataset.addColumn("CODETD");
		// preenche o dataset...
		for each(item in xmlResultados.GETD)
		{
			dataset.addRow(new Array(
				item.DESCRICAO.toString()
				, item.CODETD.toString()
			));
		}
		// retorna...
		return dataset;
	}
	catch (e)
	{
		if (e == null)	e = "Erro desconhecido!";
		var mensagemErro = "Ocorreu um erro ao ler dados do RM: " + e;
		return logError(mensagemErro);
	}
}
function logError(mensagemErro)
{
	var dataset = DatasetBuilder.newDataset();
	dataset.addColumn("erro");
	dataset.addRow(new Array(mensagemErro));
	log.error(mensagemErro);
	return dataset;
}
// carrega o web service
function getWebService(){
	var NOME_SERVICO = "WSDATASERVER";
	var CAMINHO_SERVICO = "com.totvs.WsDataServer";
	var dataServerService = ServiceManager.getServiceInstance(NOME_SERVICO);
	if(dataServerService == null){
		throw "Servico nao encontrado: " + NOME_SERVICO;
	}
	
	var serviceLocator = dataServerService.instantiate(CAMINHO_SERVICO);
	if(serviceLocator == null){
		throw "Instancia do servico nao encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
	}
	var service = serviceLocator.getRMIwsDataServer();	
	if(service == null){
		throw "Instancia do dataserver do invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
	}
	var serviceHelper = dataServerService.getBean();
	if(serviceHelper == null){
		throw "Instancia do service helper invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
	}
	var authService = serviceHelper.getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", 'mestre', 'totvs');	  
	if(serviceHelper == null){
		throw "Instancia do auth service invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
	}
	
	return authService;
}
//Transforma o conceito de constraints do Fluig para o Filtro do TBC.
function parseConstraints(constraints, filterRequired)
{
	// inicializa o resultado...
	var result = [];
	result.context = "";
	
	// inicializa o filtro...
	var filter = "";
	
	// varre as contraints...
    for	each(con in constraints) {
    	var fieldName = con.getFieldName().toUpperCase();
    	if (fieldName == "RMSCONTEXT")
    	{
    		result.context = con.getInitialValue();
    		continue;
    	}
    	
    	filter += "(";
    	
    	if (fieldName == "RMSFILTER")
		{
    		filter += con.getInitialValue();
		}
    	else
		{
    		if (con.getInitialValue() == con.getFinalValue() || isEmpty(con.getFinalValue()))
			{
				filter += con.getFieldName();
				var isLike = false;
				switch(con.getConstraintType())
				{
					case ConstraintType.MUST:
						filter += " = ";
					break;
					case ConstraintType.MUST_NOT:
						filter += " = ";
					break;
					case ConstraintType.SHOULD:
						filter += " LIKE ";
						isLike = true;
					break;
					case ConstraintType.SHOULD_NOT:
						filter += " NOT LIKE ";
						isLike = true;
					break;
				}
				filter += getFormattedValue(con.getInitialValue(), isLike);
			}
    		else
			{
    			filter += con.getFieldName();
    			filter += " BETWEEN ";
    			filter += getFormattedValue(con.getInitialValue(), false);
    			filter += " AND ";
    			filter += getFormattedValue(con.getFinalValue(), false);
			}
		}
    	
		filter += ") AND ";
	}
    
    if (filter.length == 0)
    {
    	if(filterRequired){
    	  filter = "1=2";
    	}
    	else{
      	  filter = "1=1";
    	}
    }
    else
    	filter = filter.substring(0, filter.length-5);
    
    // guarda o filtro...
    result.filter = filter;
    
    // retorna o resultado...
    return result;
}
function isEmpty(str) {
    return (!str || 0 === str.length);
}
function getFormattedValue(value, isLike){
	if(isLike){
	  return "'%" + value + "%'";
	}
	else{
	  return "'" + value + "'";
	}
}

 

 

Passo 2

 

Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração.

Exemplo: eventos de formulário, eventos de workflow e datasets.

 

Nota

Mais informações sobre customização Fluig podem ser obtidas em Customização de Workflow.

ERP RM acessando Fluig

O processo de integração do RM com o Fluig ocorre por chamada dos Web Services Fluig padrão SOA.

 

Nota

Mais informações sobre os Web Services Fluig podem ser obtidas em Utilização de Web Services.