Anda di halaman 1dari 19

Integrao TOTVS Microsiga Protheus e Fluig ECM

08/2013

Integrao TOTVS Microsiga Protheus e Fluig ECM

Sumrio
Sumrio ......................................................................................................................................................... 2

Objetivo ....................................................................................................................................... 3

Integrao manual ...................................................................................................................... 3

2.1

Formulrio ................................................................................................................................... 3
2.1.1
2.1.2
2.1.3
2.1.4

ECM ................................................................................................................................................................ 3
Protheus.......................................................................................................................................................... 4
MVC ................................................................................................................................................................ 5
Rotina Automtica (Modelo 1) ....................................................................................................................... 6

2.2

Processo ...................................................................................................................................... 7

2.3

Validao do formulrio .............................................................................................................. 8


2.3.1
2.3.2
2.3.3
2.3.4

2.4

Script do evento no ECM ................................................................................................................................. 8


Protheus.......................................................................................................................................................... 8
WebService ..................................................................................................................................................... 9
MVC ................................................................................................................................................................ 10

Atualizao do Protheus ............................................................................................................. 13


2.4.1
2.4.2

MVC ................................................................................................................................................................ 14
Rotina Automtica (Modelo 1) ....................................................................................................................... 16

2
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

Objetivo

Integrar rotinas do MVC e automticas da linha Microsiga Protheus com o Fluig ECM para criao processos permitindo ao cliente
trabalhar com a rotina como uma solicitao com atribuio de responsveis por atividade (baseada no dicionrio de pastas), utilizando o
workflow do Fluig ECM para controle de prazo de consluso, acompanhamento notificao de responsvel e requisitante, sendo as
informaes enviadas no final do processo para a linha de produtos Microsiga Protheus para persistncia.

2.1
2.1.1

Integrao manual

Formulrio

ECM
1. Criar um arquivo HTML com os campos com o mesmo nome utilizado no Protheus como o exemplo abaixo:

<HTML>
<HEAD>
<TITLE>Exemplo - Cliente</TITLE>
<LINK REL=STYLESHEET HREF="/webdesk203/wdk/global.css">
</HEAD>
<BODY scroll=yes>
<span class="NumSecao">
<strong>&nbsp;Cadastro</strong></span>
<HR>
<br>
<form>
<table>
<tr>
<td align="right" width="150" class="Labels"><b>Cdigo:</b></td>
<td class="Normal"><strong><input type="text" size="6" name="A1_COD"></strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Loja:</b></td>
<td class="Normal"><strong><input type="text" size="2" name="A1_LOJA"></strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Fsica/Jurdica:</b></td>
<td class="Normal"><strong>
<select name="A1_PESSOA">
<option value="F">Fsica</option>
<option value="J">Jurdica</option>
</select>
</strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Nome:</b></td>
<td class="Normal"><strong><input type="text" size="40" name="A1_NOME"></strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Nome Fantasia:</b></td>
<td class="Normal"><strong><input type="text" size="20" name="A1_NREDUZ"></strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Endereo:</b></td>
<td class="Normal"><strong><input type="text" size="40" name="A1_END"></strong></td>
</tr>

3
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

<tr>
<td align="right" width="150" class="Labels"><b>Tipo:</b></td>
<td class="Normal"><strong>
<select name="A1_TIPO">
<option value="F">Cons. Final</option>
<option value="L">Produtor Rural</option>
<option value="R">Revendedor</option>
<option value="S">Solidario</option>
<option value="X">Exportacao</option>
</select>
</strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Municpio:</b></td>
<td class="Normal"><strong><input type="text" size="60" name="A1_MUN"></strong></td>
</tr>
<tr>
<td align="right" width="150" class="Labels"><b>Estado:</b></td>
<td class="Normal"><strong><input type="text" size="2" name="A1_EST"></strong></td>
</tr>
</table>
</form>
</BODY>
</HTML>

2. Adicionar o arquivo .html como um Novo Fichrio nos Documentos do ECM e verificar o Cdigo que foi gerado que ser
utilizado para criar o Processo utilizar esse fichrio.

2.1.2

Protheus

1. Configurar a integrao para GED entre o Protheus e o ECM no Configurador na opo Ambiente > Totvs ECM > Wizard do GED
2. Utilizar a funo FWECMPutCard para enviar o formulrio para o ECM conforme o exemplo abaixo (o fichrio sera criado na
pasta ERP_MP \ <empresas> \ MP_CARDS no ECM):
#include "totvs.ch"
User Function FormCliente()
Local cProcessId := "CLIENTE" // se informado atualiza o formulrio relacionado ao processo seno cria um
novo
Local cDescription := "Formulrio do cadastro de cliente"
Local cCardDescription := ""
Local aHTML := Array(1,2) // arquivos do formulario
Local aEvents := Array(1,2) // eventos que sero customizados para o formulario
Local nFormId
Local aError
aHTML[1][1] := "cliente.html" // nome do arquivo
aHTML[1][2] := '<HTML>'+; // contedo do arquivo
'<HEAD>'+;
' <TITLE>Exemplo - Cliente</TITLE>'+;
' <LINK REL=STYLESHEET HREF="/webdesk203/wdk/global.css">'+;
'</HEAD>'+;
'<BODY scroll=yes>'+;
'<span class="NumSecao">'+;
'<strong>&nbsp;Cadastro</strong></span>'+;
'<HR>'+;
'<br>'+;
'<form>'+;
'<table>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Cdigo:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="6" name="A1_COD"></strong></td>'+;
' </tr>'+;
' <tr> '+;

4
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

'
<td align="right" width="150" class="Labels"><b>Loja:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="2" name="A1_LOJA"></strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Fsica/Jurdica:</b></td>'+;
'
<td class="Normal"><strong>'+;
'
<select name="A1_PESSOA">'+;
'
<option value="F">Fsica</option>'+;
'
<option value="J">Jurdica</option>'+;
'
</select>'+;
'
</strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Nome:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="40" name="A1_NOME"></strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Nome Fantasia:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="20" name="A1_NREDUZ"></strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Endereo:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="40" name="A1_END"></strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Tipo:</b></td>'+;
'
<td class="Normal"><strong>'+;
'
<select name="A1_TIPO">'+;
'
<option value="F">Cons. Final</option>'+;
'
<option value="L">Produtor Rural</option>'+;
'
<option value="R">Revendedor</option>'+;
'
<option value="S">Solidario</option>'+;
'
<option value="X">Exportacao</option>'+;
'
</select>'+;
'
</strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Municpio:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="60" name="A1_MUN"></strong></td>'+;
' </tr>'+;
' <tr> '+;
'
<td align="right" width="150" class="Labels"><b>Estado:</b></td>'+;
'
<td class="Normal"><strong><input type="text" size="2" name="A1_EST"></strong></td>'+;
' </tr>'+;
' </table>'+;
'</form>'+;
'</BODY>'+;
'</HTML>'
aEvents[1][1] := "setEnable" // nome do evento
aEvents[1][2] := 'function setEnable() {'+; // script na linguagem JavaScript
'log.info("Teste de chamada de funo");'+;
'}'
nFormId := FWECMPutCard(cProcessId,cDescription,cCardDescription,aHTML,aEvents) // retorna o codigo do fichrio no
ECM
If FWWFIsError()
aError := FWWFGetError()
MsgStop(aError[2])
Else
MsgInfo("Fichrio atualizado com sucesso")
EndIf
Return

2.1.3

MVC
1. Configurar a integrao para GED entre o Protheus e o ECM no Configurador na opo Ambiente > Totvs ECM > Wizard do GED

5
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

2. Utilizar o mtodo GetXMLLayout do View para gerar o HTML . Somente os componentes Fields e Grid sero convertidos para
HTML
#include "totvs.ch"
User Function FormView()
Local oView := FWLoadView("MATA030_MVC")
Local cProcessId := "CLIENTE" // se informado atualiza o formulrio relacionado ao processo seno cria um
novo
Local cDescription := "Formulrio do cadastro de cliente"
Local cCardDescription := ""
Local aEvents := Array(1,2) // eventos que sero customizados para o formulario
Local nFormId
Local aError
Local aFiles
Local lHtm := .T.
Local lEmbedded := .F.
Local lDocType := .T.
oView:setOperation(3)
aFiles := oView:GetXMLLayOut(lHtm,lEmbedded,lDocType)
aEvents[1][1] := "setEnable" // nome do evento
aEvents[1][2] := 'function setEnable() {'+; // script na linguagem JavaScript
'log.info("Teste de chamada de funo");'+;
'}'
nFormId := FWECMPutCard(cProcessId,cDescription,cCardDescription,aFiles,aEvents) // retorna o codigo do
fichrio no ECM
If FWWFIsError()
aError := FWWFGetError()
MsgStop(aError[2])
Else
MsgInfo("Fichrio atualizado com sucesso")
EndIf
Return

2.1.4

Rotina Automtica (Modelo 1)

Para rotinas automticas do tipo Modelo 1 (CRUD) que usam somente campos do Dicionrio de Dados pode-se utilizar o exemplo
abaixo para criar o formulrio:
#include "totvs.ch"
User Function FormTable()
Local cTable := "SA1"
Local cProcessId := "MATA030"
Local cDescription := "Cliente (rotina automatica)"
Local oView
Local aEvents := Array(1,2) // eventos que sero customizados para o formulario
Local nFormId
Local aError
Local aFiles
Local lHtm := .T.
Local lEmbedded := .F.
Local lDocType := .T.

FwAliasMVC(cTable,cProcessId,cDescription)
oView := FwLoadView("PROTHEUSMVC")
oView:setOperation(3)
aFiles := oView:GetXMLLayOut(lHtm,lEmbedded,lDocType)
aEvents[1][1] := "setEnable" // nome do evento
aEvents[1][2] := 'function setEnable() {'+; // script na linguagem JavaScript
'log.info("Teste de chamada de funo");'+;

6
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

'}'
nFormId := FWECMPutCard(cProcessId,cDescription,cCardDescription,aFiles,aEvents) // retorna o codigo do
fichrio no ECM
If FWWFIsError()
aError := FWWFGetError()
MsgStop(aError[2])
Else
MsgInfo("Fichrio atualizado com sucesso")
EndIf
Return

2.2

Processo
1. Configurar a integrao para workflow entre o Protheus e o ECM no Configurador na opo Ambiente > Totvs ECM > Wizard do

WF

2. Utilizar a funo FWECMProcess para criar e/ou atualizar o processo no ECM conforme o exemplo abaixo:
#include "totvs.ch"
User Function ProcCliente()
Local cProcessId := "CLIENTE"
Local cDescription := "Cadastro de cliente"
Local cInstruction := "Instrues de uso do processo"
Local nFormId := 22 // id do fichrio adicionado no ECM no passo anterior
Local aStates := Array(4,6) // atividades do processo em sequencia para criao automtica dos fluxos
Local aEvents := Array(1,2) // eventos que sero customizados para o processo
Local aProperties := Array(1,2) // propriedades que sero utilizadas nos scripts dos eventos do processo
Local aError
aStates[1][1]
aStates[1][2]
aStates[1][3]
aStates[1][4]
aStates[1][5]
aStates[1][6]
zero

:=
:=
:=
:=
:=
:=

"Incio" // atividade
"" // descrio
"" // instrues
60 //prazo de concluso em segundos
0 // mecanismo de atribuio (zero para nenhum, 1 para grupo ou 2 para usurio)
"" // cdigo do grupo ou usurio no ECM caso o mecanismo de atribuio seja diferente de

aStates[2][1]
aStates[2][2]
aStates[2][3]
aStates[2][4]
aStates[2][5]
aStates[2][6]
zero

:=
:=
:=
:=
:=
:=

"Reviso" // atividade
"Reviso do cadastro do cliente" // descrio
"Revise as informaes do cadastro" // instrues
60 //prazo de concluso em segundos
0 // mecanismo de atribuio (zero para nenhum, 1 para grupo ou 2 para usurio)
"" // cdigo do grupo ou usurio no ECM caso o mecanismo de atribuio seja diferente de

aStates[3][1]
aStates[3][2]
aStates[3][3]
aStates[3][4]
aStates[3][5]
aStates[3][6]
zero

:=
:=
:=
:=
:=
:=

"Fim" // atividade
"Confirmar cadastro" // descrio
"" // instrues
60 //prazo de concluso em segundos
0 // mecanismo de atribuio (zero para nenhum, 1 para grupo ou 2 para usurio)
"" // cdigo do grupo ou usurio no ECM caso o mecanismo de atribuio seja diferente de

aEvents[1][1] := "beforeTaskSave"
// script na linguagem JavaScript
aEvents[1][2] := 'function beforeTaskSave(colleagueId,nextSequenceId,userList){'+;
'var A1_COD = hAPI.getCardValue("A1_COD");'+;
'if (A1_COD == ""){'+;
'
throw "O campo Cdigo obrigatrio"'+;
'}'+;
'}'
aProperties[1][1] := "TABLE" // nome da propriedade
aProperties[1][2] := "SA1" // valor

7
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

FWECMProcess(cProcessId, cDescription, cInstruction, nFormId, aStates, aEvents, aProperties)


If FWWFIsError()
aError := FWWFGetError()
MsgStop(aError[2])
Else
MsgInfo("Processo atualizado com sucesso")
EndIf
Return

2.3

Validao do formulrio

A validao do formulrio dos processos no ECM realizada atravs da customizao dos eventos dos fichrios e processos
utilizando scripts na linguagem JavaScript. Os eventos podem ser implementados no prprio ECM ou enviados pelo Protheus como
parmetro das funes utilizadas nos exemplos anteriores.
Para validar os campos informados pelo usurio utilizar o evento beforeTaskSave do processo que executado em cada
confirmao de tarefa para enviar para a prxima etapa do workflow.
Para acessar o valor de um campo do formulrio utilizar a API do workflow hAPI. getCardValue(<nomeCampo>) e para o
tratamento de exees utilizar o comando throw <mensagem> que apresentar a mensagem para o usurio impendindo que prossiga
enquanto no corrigir as informaes digitadas.

2.3.1

Script do evento no ECM

Validaes simples podem ser realizadas no script do evento para evitar a comunicao desnecessrio ao Protheus retornando
imediatamente uma mensagem ao usurio.
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var A1_COD = hAPI.getCardValue("A1_COD");
if (A1_COD == ""){
throw "O campo Cdigo obrigatrio"
}
}

2.3.2

Protheus

A validao nos scripts dos eventos utilizando aplicaes externas realizada atraves de WebServices que devem ser cadastradas
como servio no ECM na opo Painel de Controle > Servios > Adicionar. Quando qualquer definio do WebService for alterada ou
includa ser necessrio atualizar o ECM na opo Painel de Controle > Servios > Editar > Atualizar.
O WebService pode ser cadastrado atravs do Painel de Controle do ECM ou pelo Protheus utilizando a funo FWWFPutService
como no exemplo abaixo.
#include "totvs.ch"
User Function WSCliente()
Local cName := "WSCLIENTE"
Local cURL := "http://hostname:8080/ws/exemplo.apw?wsdl"
Local cDescription := "Servio para validao e atualizao do cadastro de cliente"
If FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Servio cadastrado com sucesso")
EndIf
Return

8
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

2.3.3

WebService
Exemplo de WebService do Protheus:

#include "totvs.ch"
#include "apwebsrv.ch"
WSSERVICE WSCLIENTE DESCRIPTION "Exemplo cadastro de cliente"
WSDATA A1_COD AS STRING
WSDATA A1_LOJA AS STRING
WSDATA XML AS Base64Binary
WSDATA RETEXISTCOD AS BOOLEAN
WSDATA RETINCLUIR AS BOOLEAN
WSMETHOD ExistCod DESCRIPTION "Verifica se codigo do cliente ja existe"
WSMETHOD Incluir DESCRIPTION "Inclui cliente"
ENDWSSERVICE
WSMETHOD ExistCod WSRECEIVE A1_COD,A1_LOJA WSSEND RETEXISTCOD WSSERVICE WSCLIENTE
Private INCLUI := .T.
::RETEXISTCOD := existchav("SA1",::A1_COD+::A1_LOJA)
Return .T.
WSMETHOD Incluir WSRECEIVE XML WSSEND RETINCLUIR WSSERVICE WSCLIENTE
Local oXML := tXMLManager():New()
Local lRet := .T.
Local aDadosCli := {}
If oXML:Parse(::XML)
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {
aAdd( aDadosCli, {

"A1_COD"
"A1_LOJA"
"A1_TIPO"
"A1_PESSOA"
"A1_NOME"
"A1_NREDUZ"
"A1_END"
"A1_MUN"
"A1_EST"

,
,
,
,
,
,
,
,
,

oXML:XPathGetNodeValue("/SA1/A1_COD")
,
oXML:XPathGetNodeValue("/SA1/A1_LOJA") ,
oXML:XPathGetNodeValue("/SA1/A1_TIPO") ,
oXML:XPathGetNodeValue("/SA1/A1_PESSOA"),
oXML:XPathGetNodeValue("/SA1/A1_NOME") ,
oXML:XPathGetNodeValue("/SA1/A1_NREDUZ"),
oXML:XPathGetNodeValue("/SA1/A1_END")
,
oXML:XPathGetNodeValue("/SA1/A1_MUN")
,
oXML:XPathGetNodeValue("/SA1/A1_EST")
,

NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL
NIL

}
}
}
}
}
}
}
}
}

)
)
)
)
)
)
)
)
)

lMsErroAuto := .F.
MSExecAuto( { | x, y | MATA030( x, y ) } , aDadosCli, 3 )
If lMsErroAuto
If __lSX8
RollBackSX8()
EndIf
::RETINCLUIR := .F.
Else
If __lSX8
ConFirmSX8()
EndIf
::RETINCLUIR := .T.
EndIf
Else
SetSoapFault("WSCLIENTE:INCLUIR",oXML:LastError())
lRet := .F.
EndIf
Return lRet

9
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

Validao no script do evento beforeTaskSave:


1. Invocar a carga do servio com o mtodo ServiceManager.getService
2. Utilizar o mtodo getBean para retornar o utilitrio para acesso as classes do servio atravs do mtodo instantiate enviando
como parmetro a classe Locator que esta descrita no ECM em Painel de Controle > Servios, selecionar o servio e clicar em Visualizar
3. Invocar o mtodo para instanciar o servio (no exemplo getWSCLIENTESOAP) que tambm esta descrito na opo Painel de
Controle > Servios > Visualizar
4. Invocar o mtodo do servio (no exemplo ExistCod)
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var A1_COD = hAPI.getCardValue("A1_COD");
if (A1_COD == ""){
throw "O campo Cdigo obrigatrio"
}
var wsService = ServiceManager.getService("WSCLIENTE");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("localhost.WSCLIENTELocator");
var service = serviceLocator.getWSCLIENTESOAP();
var ret = false;
try {
ret = service.EXISTCOD(A1_COD);
}
catch(erro){
throw erro.message
}
if (!ret) {
throw "Cliente j existe";
}
}

2.3.4

MVC

A validao do processo de uma rotina MVC realizada utilizando o WebService FWWSMODEL


(http://hostexemplo:8080/ws/fwwsmodel.apw?wsdl) com a invocao do mtodo GETXMLDATADETAIL que retorna o XML do model
para popular os dados e do mtodo VLDXMLDATA que validar o XML.
#include "totvs.ch"
User Function WSMVC()
Local cName := "TOTVS_FWMVC"
Local cURL := "http://hostname:8080/ws/fwwsmodel.apw?wsdl "
Local cDescription := "Servio do TOTVS MVC para integrao de rotinas/programas com ECM"
Local aService := FWWFGetService(cName)
If Empty(aService) .and. FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Servio cadastrado com sucesso")
EndIf
Return

Validao no script do evento beforeTaskSave:


function beforeTaskSave(colleagueId,nextSequenceId,userList){
var wsService = ServiceManager.getService("TOTVS_FWMVC");
var serviceHelper = wsService.getBean();

10
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

var
serviceLocator
serviceHelper.instantiate("br.com.totvs.webservices.fwwsmodel_apw.FWWSMODELLocator");
var service = serviceLocator.getFWWSMODELSOAP();
var err = {message:"", empty:true};
var ret, xml;

try {
ret = service.GETXMLDATADETAIL([],"MATA030_MVC");
xml = new XML(new String(new java.lang.String(ret)).replace(/<\?.*\?>/g,""));
}
catch(erro){
throw erro.message;
return;
}
updateXMLFields(xml,err);
if (err.message.length > 0){
throw err.message;
}
else if (err.empty){
throw "Preencha o formulrio";
}
else{
eval("xml.@Operation = 3");
try{
service.VLDXMLDATA([],"MATA030_MVC",new java.lang.String(xml.toXMLString()).getBytes());
} catch(e){
throw e.message;
}
}
}
function updateXMLFields(node,err){
var list = node.children();
var name,value;
for (var i=0;i<list.length();i++){
switch (Trim(eval("list[i].@modeltype.toString()"))){
case "FIELDS":
updateXMLFields(list[i],err);
break;
default:
name = list[i].name().localName;
value = hAPI.getCardValue(name);
if (value != null)
list[i].value = convertValue(name,list[i],value,err);
break;
}
if (err.message.length > 0)
break;
}
}
function convertValue(name,struct,value,err){
var y,m,d,n,len,str,reg
var setYear = new Date().getFullYear().toString().substring(0,2);
var setDate = "dd/mm/yyyy";
var yCount = setDate.match(/yyyy/) ? 4 : 2;
var hasErr = false;

11
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

value = value.trim();
switch (eval("struct.@datatype.toString()")){
case "D":
if (value.replace("/","").trim() != ""){
len = value.length();
d = setDate.indexOf("d");
m = setDate.indexOf("m");
y = setDate.indexOf("y");
if (d + 2 > len || m + 2 > len || y + yCount > len){
hasErr = true;
}
else{
str = value.substr(m,2) + value.substr(d,2);
if (yCount == 4)
str = value.substr(y,4) + str;
else
str = setYear + value.substr(y,2) + str;
if (str.match(/((((19|20)(([02468][048])|([13579][26]))0229))|((19|20)[0-9][0-9])((((0[19])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))31)|(((0[1,3-9])|(1[0-2]))(29|30)))))/g))
value = new java.lang.String(str);
else
hasErr = true;
}
if (hasErr)
err.message = "O campo "+eval("struct.@info")+" ("+name+") contm uma data invlida";
else
err.empty = false;
}
break;
case "N":
len = eval("struct.@len.toString().split(',')");
if (len[1] == "0"){
reg = new RegExp("^[0-9]{1,"+len[0]+"}$");
str = value.replace(",","");
if(!reg.test(str)){
str = value.replace(".","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+"
tamanho) invlido"
hasErr = true;
break;
}
}

("+name+")

contm

um

nmero

(valor

ou

if (!hasErr){
n = parseInt(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
else{
reg = new RegExp("^0$|^0\.[0-9]{1,"+len[1]+"}$|^[0-9]{0,"+len[0]+"}(\.[0-9]{1,"+len[1]+"})?$");
str = value.replace(".","").replace(",",".");

12
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

if(!reg.test(str)){
str = value.replace(",","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+"
tamanho) invlido"
hasErr = true;
break;
}
}

("+name+")

contm

um

nmero

(valor

ou

if (!hasErr){
n = parseFloat(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
break;
default:
if (value != "")
err.empty = false;
break;
}
return value;
}
function Trim(str){return str.replace(/^\s+|\s+$/g,"");}

2.4

Atualizao do Protheus

A atualizao dos dados no Protheus tambm realizada atraves de WebServices como visto na validao utilizando o evento do
processo afterProcessFinish que executado na finalizao da solicitao.
function afterProcessFinish(processId){
var wsService = ServiceManager.getService("WSCLIENTE");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("localhost.WSCLIENTELocator");
var service = serviceLocator.getWSCLIENTESOAP();
var SA1 = new XML("<SA1/>");
SA1.A1_COD = hAPI.getCardValue("A1_COD");
SA1.A1_LOJA = hAPI.getCardValue("A1_LOJA");
SA1.A1_TIPO = hAPI.getCardValue("A1_TIPO");
SA1.A1_PESSOA = hAPI.getCardValue("A1_PESSOA");
SA1.A1_NOME = hAPI.getCardValue("A1_NOME");
SA1.A1_NREDUZ = hAPI.getCardValue("A1_NREDUZ");
SA1.A1_END = hAPI.getCardValue("A1_END");
SA1.A1_MUN = hAPI.getCardValue("A1_MUN");
SA1.A1_EST = hAPI.getCardValue("A1_EST");
try {
ret = service.INCLUIR(new java.lang.String(SA1.toXMLString()).getBytes());
}
catch(erro){
throw erro.message
}

13
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

2.4.1

MVC

A validao do processo de uma rotina MVC tambm realizada utilizando o WebService FWWSMODEL
(http://hostexemplo:8080/ws/fwwsmodel.apw?wsdl) com a invocao do mtodo GETXMLDATADETAIL que retorna o XML do model
para popular os dados e do mtodo PUTXMLDATA que gravar o XML.
function afterProcessFinish(processId){
var wsService = ServiceManager.getService("TOTVS_FWMVC");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsmodel_apw.FWWSMODELLocator");
var service = serviceLocator.getFWWSMODELSOAP();
var err = {message:"", empty:true};
var ret, xml;
try {
ret = service.GETXMLDATADETAIL([],"MATA030_MVC");
xml = new XML(new String(new java.lang.String(ret)).replace(/<\?.*\?>/g,""));
}
catch(erro){
throw erro.message;
return;
}
updateXMLFields(xml,err);
eval("xml.@Operation = 3");
try{
service.PUTXMLDATA([],"MATA030_MVC",new java.lang.String(xml.toXMLString()).getBytes());
} catch(e){
throw e.message;
}
}
function updateXMLFields(node,err){
var list = node.children();
var name,value;
for (var i=0;i<list.length();i++){
switch (Trim(eval("list[i].@modeltype.toString()"))){
case "FIELDS":
updateXMLFields(list[i],err);
break;
default:
name = list[i].name().localName;
value = hAPI.getCardValue(name);
if (value != null)
list[i].value = convertValue(name,list[i],value,err);
break;
}
if (err.message.length > 0)
break;
}
}
function convertValue(name,struct,value,err){
var y,m,d,n,len,str,reg
var setYear = new Date().getFullYear().toString().substring(0,2);

14
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

var setDate = "dd/mm/yyyy";


var yCount = setDate.match(/yyyy/) ? 4 : 2;
var hasErr = false;
value = value.trim();
switch (eval("struct.@datatype.toString()")){
case "D":
if (value.replace("/","").trim() != ""){
len = value.length();
d = setDate.indexOf("d");
m = setDate.indexOf("m");
y = setDate.indexOf("y");
if (d + 2 > len || m + 2 > len || y + yCount > len){
hasErr = true;
}
else{
str = value.substr(m,2) + value.substr(d,2);
if (yCount == 4)
str = value.substr(y,4) + str;
else
str = setYear + value.substr(y,2) + str;
if (str.match(/((((19|20)(([02468][048])|([13579][26]))0229))|((19|20)[0-9][0-9])((((0[19])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))31)|(((0[1,3-9])|(1[0-2]))(29|30)))))/g))
value = new java.lang.String(str);
else
hasErr = true;
}
if (hasErr)
err.message = "O campo "+eval("struct.@info")+" ("+name+") contm uma data invlida";
else
err.empty = false;
}
break;
case "N":
len = eval("struct.@len.toString().split(',')");
if (len[1] == "0"){
reg = new RegExp("^[0-9]{1,"+len[0]+"}$");
str = value.replace(",","");
if(!reg.test(str)){
str = value.replace(".","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+"
tamanho) invlido"
hasErr = true;
break;
}
}

("+name+")

contm

um

nmero

(valor

ou

if (!hasErr){
n = parseInt(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}

15
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

else{
reg = new RegExp("^0$|^0\.[0-9]{1,"+len[1]+"}$|^[0-9]{0,"+len[0]+"}(\.[0-9]{1,"+len[1]+"})?$");
str = value.replace(".","").replace(",",".");
if(!reg.test(str)){
str = value.replace(",","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+" ("+name+") contm um nmero (valor
tamanho) invlido"
hasErr = true;
break;
}
}

ou

if (!hasErr){
n = parseFloat(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
break;
default:
if (value != "")
err.empty = false;
break;
}
return value;
}
function Trim(str){return str.replace(/^\s+|\s+$/g,"");}

2.4.2

Rotina Automtica (Modelo 1)

Como as rotinas automticas aps validarem executam a atualizao ao invs de utilizar o evento afterProcessFinish utilizar o
evento beforeTaskSave quando o processo estiver na atividade fim. Alm do WebService do MVC utilizar tambm o FWWSMODEL
(http://hostexemplo:8080/ws/fwwsecm.apw?wsdl) com a invocao do mtodo PUTDATA.
#include "totvs.ch"
User Function WSMVC()
Local cName := "TOTVS_FWWSECM"
Local cURL := "http://hostname:8080/ws/fwwsecm.apw?wsdl"
Local cDescription := "Servio do TOTVS Microsiga Protheus para integrao de rotinas automticas com
ECM"
Local aService := FWWFGetService(cName)
If Empty(aService) .and. FWWFPutService(cName,cUrl,cDescription)
MsgInfo("Servio cadastrado com sucesso")
EndIf
Return

Evento beforeTaskSave:
function beforeTaskSave(colleagueId,nextSequenceId,userList){
var wsService = ServiceManager.getService("TOTVS_FWMVC");
var serviceHelper = wsService.getBean();
var serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsmodel_apw.FWWSMODELLocator");
var service = serviceLocator.getFWWSMODELSOAP();
var err = {message:"", empty:true};

16
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

var ret, xml;


try {
ret = service.GETXMLDATADETAIL([],"MATA030_MVC");
xml = new XML(new String(new java.lang.String(ret)).replace(/<\?.*\?>/g,""));
}
catch(erro){
throw erro.message;
return;
}
updateXMLFields(xml,err);
if (err.message.length > 0){
throw err.message;
}
else if (err.empty){
throw "Preencha o formulrio";
}
else{
wsService = ServiceManager.getService("TOTVS_FWWSECM");
serviceHelper = wsService.getBean();
serviceLocator = serviceHelper.instantiate("br.com.totvs.webservices.fwwsecm_apw.FWWSECMLocator");
service = serviceLocator.getFWWSMODELSOAP();
eval("xml.@Operation = 3");
try{
service.PUTDATA([],"SA1","MATA030",new java.lang.String(xml.toXMLString()).getBytes());;
} catch(e){
throw e.message;
}
}
}
function updateXMLFields(node,err){
var list = node.children();
var name,value;
for (var i=0;i<list.length();i++){
switch (Trim(eval("list[i].@modeltype.toString()"))){
case "FIELDS":
updateXMLFields(list[i],err);
break;
default:
name = list[i].name().localName;
value = hAPI.getCardValue(name);
if (value != null)
list[i].value = convertValue(name,list[i],value,err);
break;
}
if (err.message.length > 0)
break;
}
}
function convertValue(name,struct,value,err){
var y,m,d,n,len,str,reg
var setYear = new Date().getFullYear().toString().substring(0,2);
var setDate = "dd/mm/yyyy";
var yCount = setDate.match(/yyyy/) ? 4 : 2;

17
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

var hasErr = false;


value = value.trim();
switch (eval("struct.@datatype.toString()")){
case "D":
if (value.replace("/","").trim() != ""){
len = value.length();
d = setDate.indexOf("d");
m = setDate.indexOf("m");
y = setDate.indexOf("y");
if (d + 2 > len || m + 2 > len || y + yCount > len){
hasErr = true;
}
else{
str = value.substr(m,2) + value.substr(d,2);
if (yCount == 4)
str = value.substr(y,4) + str;
else
str = setYear + value.substr(y,2) + str;
if (str.match(/((((19|20)(([02468][048])|([13579][26]))0229))|((19|20)[0-9][0-9])((((0[19])|(1[0-2]))((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))31)|(((0[1,3-9])|(1[0-2]))(29|30)))))/g))
value = new java.lang.String(str);
else
hasErr = true;
}
if (hasErr)
err.message = "O campo "+eval("struct.@info")+" ("+name+") contm uma data invlida";
else
err.empty = false;
}
break;
case "N":
len = eval("struct.@len.toString().split(',')");
if (len[1] == "0"){
reg = new RegExp("^[0-9]{1,"+len[0]+"}$");
str = value.replace(",","");
if(!reg.test(str)){
str = value.replace(".","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+"
tamanho) invlido"
hasErr = true;
break;
}
}

("+name+")

contm

um

nmero

(valor

ou

if (!hasErr){
n = parseInt(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
else{
reg = new RegExp("^0$|^0\.[0-9]{1,"+len[1]+"}$|^[0-9]{0,"+len[0]+"}(\.[0-9]{1,"+len[1]+"})?$");

18
Verso 1.0

Integrao TOTVS Microsiga Protheus e Fluig ECM

str = value.replace(".","").replace(",",".");
if(!reg.test(str)){
str = value.replace(",","");
if(!reg.test(str)){
err.message = "O campo "+eval("struct.@info")+"
tamanho) invlido"
hasErr = true;
break;
}
}

("+name+")

contm

um

nmero

(valor

ou

if (!hasErr){
n = parseFloat(str);
if (!isNaN(n)){
value = new java.lang.String(str);
if (n > 0)
err.empty = false;
}
}
}
break;
default:
if (value != "")
err.empty = false;
break;
}
return value;
}
function Trim(str){return str.replace(/^\s+|\s+$/g,"");}

19
Verso 1.0

Anda mungkin juga menyukai