Árvore de páginas

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.                                                             

  

Informações Gerais

 

Especificação

Produto

Totvs Automação Fiscal

Módulo

SIGATAF

Segmento Executor

Serviços

Projeto1

SERTAF003

IRM/EPIC1

 

Requisito/Story/Issue1

SERTAF003-961

Subtarefa1

SERTAF003-962

Chamado/Ticket2

 

País

( x) Brasil  (  ) Argentina  (  ) Mexico  (  ) Chile  (  ) Paraguai  (  ) Equador

(  ) USA  (  ) Colombia   (  ) Outro _____________.

Outros

.

   Legenda: 1 – Inovação 2 – Manutenção (Os demais campos devem ser preenchidos para ambos os processos). 

Objetivo

Criar um mecanismo de integração dos layout do TAF utilizando um WebServer REST.

Definição da Regra de Negócio

O Serviço deverá ser criado com o nome WSTAFST2 utilizando os métodos POST, GET e DELETE próprios da tecnologia REST. A integração irá persistir na tabela compartilhada TAFST2, permitindo a consulta do status de integração e cadastro dos registros através do TAFKEY ou TAFTICKET e a exclusão dos registros através do TAFTICKET.

 

Rotina

Tipo de Operação

Opção de Menu

WSTAFST2

Criação

-

TAFeSocialFuncoes

Alteração

-

TAFAPIERP

Alteração

-

 

Definição dos métodos

POST

Descrição do Método: O método POST deverá seguir o conceito do próprio método em qualquer outro tipo de serviço REST, devendo seu conteúdo ser enviado no corpo da mensagem (body) no formato json.

O objetivo do método é enviar informações que devem ser gravadas na tabela transacional do TAF  ( TAFST2 ), permitindo que os dados sejam submetidos aos processos de integração.

Estrutura da mensagem enviada no POST (Request):

Atributo

Pai

Nivel

TAFST2

Ocorrência

Formato

ticketCode

-

1

 

1

String(36)

lote

-

1

 

1:N

-

sourceBranch

lote

2

TAFFIL

1

String(40)

messageType

lote

2

TAFCODMSG

1

String(01)

messageSequential

lote

2

TAFSEQ

1

String(03)

registryType

lote

2

TAFTPREG

1

String(10)

registryKey

lote

2

TAFKEY

1

String(100)

integrationMessage

lote

2

TAFMSG

1

Memo - Base64

integrationDate

lote

2

TAFDATA

0:1

String - AAAAMM01

integrationTime

lote

2

TAFHORA

0:1

String - HH:MM:SS


 

Atenção!

Os atributos não obrigatórios têm que fazer parte da estrutura, somente o seu preenchimento é opcional.


Estrutura da mensagem de retorno do POST (Response)

Atributo

Pai

Nivel

Ocorrência

Formato

ticketCode

-

1

1

String(36)

registryKey

-

1

1:N

-

key

registryKey

2

1

String(100)

success

registryKey

2

1

boolean(true : false)

error

registryKey

2

0:N

-

coderr

error

3

1

Int(3)

description

error

3

1

String(100)

keyAmount

registryKey

2

1

Int(9999)

  • ticketCode – atributo raiz
  • registryKey – Array contendo os TAFKEY requisitados.
  • key – Código do TAFKEY
  • success – Informa se o TAFKEY foi integrado ou não.
  • error – Array contendo os erros que impediram a integração do registro. Atributo gerado somente quando success for igual a false.
  • coderr – Código do erro que impossibilitou a integração.
  • description – Descrição do erro que impossibilitou a integração. 
  • keyAmount – Número de registros enviados no POST.

 

Exemplo de Mensagem POST
.{"ticketCode" : "WIO9753123654789789363655241452363",
  "lote": [
    	{"sourceBranch" : "0100",
      	 "messageType" : "2",
      	 "messageSequential" : "001",
      	 "registryType" : "S-1010",
      	 "registryKey" : "KEYIO7878874854545454998598525",
      	 "integrationMessage": "PGVTb2NpYWw+PGV2dFRhYlJ1YnJpY2EgaWQ9J1MtMTAxMDEzMDUyMDE2MTU0MDE2JyB2ZXJzYW89JzEuMSc+PGlkZUV2ZW50bz48dHBBbWI+MzwvdHBBbWI+PHByb2NFbWk+MTwvcHJvY0VtaT48dmVyUHJvYz48L3ZlclByb2M+PC9pZGVFdmVudG8+PGlkZUVtcHJlZ2Fkb3I+PHRwSW5zYz4xPC90cEluc2M+PG5ySW5zYz41MzExMzc5MTAwMDEyMjwvbnJJbnNjPjwvaWRlRW1wcmVnYWRvcj48aW5mb1J1YnJpY2E+PGFsdGVyYWNhbz48aWRlUnVicmljYT48Y29kUnVicj45OTg8L2NvZFJ1YnI+PGluaVZhbGlkPjIwMTYtMDM8L2luaVZhbGlkPjwvaWRlUnVicmljYT48ZGFkb3NSdWJyaWNhPjxkc2NSdWJyPkJBU0UgUEVOU0FPIFBHVE88L2RzY1J1YnI+PG5hdFJ1YnI+OTk4OTwvbmF0UnVicj48dHBSdWJyPjM8L3RwUnVicj48Y29kSW5jQ1A+MDA8L2NvZEluY0NQPjxjb2RJbmNJUlJGPjAwPC9jb2RJbmNJUlJGPjxjb2RJbmNGR1RTPjAwPC9jb2RJbmNGR1RTPjxjb2RJbmNTSU5EPjAwPC9jb2RJbmNTSU5EPjxyZXBEU1I+TjwvcmVwRFNSPjxyZXAxMz5OPC9yZXAxMz48cmVwRmVyaWFzPk48L3JlcEZlcmlhcz48cmVwUmVzYz5OPC9yZXBSZXNjPjwvZGFkb3NSdWJyaWNhPjwvYWx0ZXJhY2FvPjwvaW5mb1J1YnJpY2E+PC9ldnRUYWJSdWJyaWNhPjwvZVNvY2lhbD4=",
      	 "integrationDate" : "20161210",
	  	 "integrationTime": "14:15:22"
    	},
		{"sourceBranch" : "0100",
      	 "messageType" : "2",
      	 "messageSequential" : "001",
      	 "registryType" : "S-2100",
	  	 "registryKey" : "KEYYZE7878RE4854545454998598576",
	  	 "integrationMessage":
"PGVTb2NpYWw+PGV2dENhZEluaWNpYWwgSWQ9J0lEMTUzMTEzNzkxMDAwMDAwMjAxNjEyMDkxNDU5NTQwMDAwMSc+PGlkZUV2ZW50bz48aW5kUmV0aWY+MTwvaW5kUmV0aWY+PG5yUmVjaWJvPjwvbnJSZWNpYm8+PHRwQW1iPjM8L3RwQW1iPjxwcm9jRW1pPjE8L3Byb2NFbWk+PHZlclByb2M+MS4wPC92ZXJQcm9jPjwvaWRlRXZlbnRvPjxpZGVFbXByZWdhZG9yPjx0cEluc2M+MTwvdHBJbnNjPjxuckluc2M+NTMxMTM3OTE8L25ySW5zYz48L2lkZUVtcHJlZ2Fkb3I+PHRyYWJhbGhhZG9yPjxjcGZUcmFiPjMyMDA5MDM3ODQ2PC9jcGZUcmFiPjxuaXNUcmFiPjEyMjAzNjcxODQ0PC9uaXNUcmFiPjxubVRyYWI+IEdUIFhNQlBFUkhVSlpOQ1FGU0lWTEFPRDwvbm1UcmFiPjxzZXhvPk08L3NleG8+PHJhY2FDb3I+MTwvcmFjYUNvcj48ZXN0Q2l2PjI8L2VzdENpdj48Z3JhdUluc3RyPjwvZ3JhdUluc3RyPjxuYXNjaW1lbnRvPjxkdE5hc2N0bz4xOTc2LTA0LTEzPC9kdE5hc2N0bz48Y29kTXVuaWM+MTIwMDEwNTwvY29kTXVuaWM+PHVmPlNQPC91Zj48cGFpc05hc2N0bz4wMTM8L3BhaXNOYXNjdG8+PHBhaXNOYWM+MDEzPC9wYWlzTmFjPjxubU1hZT5ORVVTQSBDQVJWQUxITyBORVZFUzwvbm1NYWU+PG5tUGFpPkpPU0UgUkVZTkFMRE8gQ1JFU1BPIE5FVkVTPC9ubVBhaT48L25hc2NpbWVudG8+PGRvY3VtZW50b3M+PENUUFM+PG5yQ3Rwcz4wMDAzNTgwMDwvbnJDdHBzPjxzZXJpZUN0cHM+MDAwNzM8L3NlcmllQ3Rwcz48dWZDdHBzPlNQPC91ZkN0cHM+PC9DVFBTPjxSRz48bnJSZz4xNi43MjEuMDMwPC9uclJnPjxvcmdhb0VtaXNzb3I+U1NQPC9vcmdhb0VtaXNzb3I+PGR0RXhwZWQ+MTk4Mi0wMy0wMjwvZHRFeHBlZD48L1JHPjxDTkg+PG5yUmVnQ25oPjAwMDAwMDAwMDA8L25yUmVnQ25oPjx1ZkNuaD48L3VmQ25oPjxkdFZhbGlkPjwvZHRWYWxpZD48Y2F0ZWdvcmlhQ25oPjwvY2F0ZWdvcmlhQ25oPjwvQ05IPjwvZG9jdW1lbnRvcz48ZW5kZXJlY28+PGV4dGVyaW9yPjxwYWlzUmVzaWQ+MDEzPC9wYWlzUmVzaWQ+PGRzY0xvZ3JhZD5BTEJBPC9kc2NMb2dyYWQ+PG5yTG9ncmFkPjE0NDQ8L25yTG9ncmFkPjxiYWlycm8+UFEuIEpBQkFRVUFSQTwvYmFpcnJvPjxubUNpZD5TQU4gTFVJWjwvbm1DaWQ+PGNvZFBvc3RhbD4wNDM0NjAwMDwvY29kUG9zdGFsPjwvZXh0ZXJpb3I+PC9lbmRlcmVjbz48aW5mb0RlZmljaWVuY2lhPjxkZWZGaXNpY2E+TjwvZGVmRmlzaWNhPjxkZWZWaXN1YWw+TjwvZGVmVmlzdWFsPjxkZWZBdWRpdGl2YT5OPC9kZWZBdWRpdGl2YT48ZGVmTWVudGFsPk48L2RlZk1lbnRhbD48ZGVmSW50ZWxlY3R1YWw+TjwvZGVmSW50ZWxlY3R1YWw+PHJlYWJSZWFkYXA+TjwvcmVhYlJlYWRhcD48L2luZm9EZWZpY2llbmNpYT48YXBvc2VudGFkb3JpYT48dHJhYkFwb3NlbnQ+TjwvdHJhYkFwb3NlbnQ+PC9hcG9zZW50YWRvcmlhPjxjb250YXRvPjxmb25lUHJpbmM+MDAxMzQ3MzU1NTUgLzwvZm9uZVByaW5jPjxmb25lQWx0ZXJuYXQ+MDExNzg5Nzk4Nzk4PC9mb25lQWx0ZXJuYXQ+PGVtYWlsQWx0ZXJuYXQ+UkVZTkFMRE9ASE9UTUFJTC5DT008L2VtYWlsQWx0ZXJuYXQ+PC9jb250YXRvPjwvdHJhYmFsaGFkb3I+PHZpbmN1bG8+PG1hdHJpY3VsYT4wMDAwMDAwMDAwMDAwMDAwMDAwNzwvbWF0cmljdWxhPjx0cFJlZ1RyYWI+MTwvdHBSZWdUcmFiPjx0cFJlZ1ByZXY+MTwvdHBSZWdQcmV2PjxpbmZvUmVnaW1lVHJhYj48L2luZm9SZWdpbWVUcmFiPjxpbmZvQ29udHJhdG8+PGNvZENhdGVnPjMwMjwvY29kQ2F0ZWc+PHJlbXVuZXJhY2FvPjx2clNhbEZ4PjEwMDAuMDA8L3ZyU2FsRng+PHVuZFNhbEZpeG8+NTwvdW5kU2FsRml4bz48L3JlbXVuZXJhY2FvPjxkdXJhY2FvPjx0cENvbnRyPjE8L3RwQ29udHI+PC9kdXJhY2FvPjxsb2NhbFRyYWJhbGhvPjwvbG9jYWxUcmFiYWxobz48L2luZm9Db250cmF0bz48L3ZpbmN1bG8+PC9ldnRDYWRJbmljaWFsPjwvZVNvY2lhbD4=",
	 	 "integrationDate" : "",
	 	 "integrationTime" :  ""
  		}
  	]
}
Response:
{
"ticketCode": "WIO9753123654789789363655241452363",
"registryKey": [
	{
		"key": "KEYIO7878874854545454998598525",
		"success": true
	},
	{
		"key": "KEYYZE7878RE4854545454998598576",
		"success": true
	}
  ],
"keyAmount": 2
}

GET

Descrição do Método: O método GET deverá retornar os status dos registros integrados de acordo com os parâmetros (atributos) enviados na URL.

A Consulta pode combinar parâmetros utilizando a sintaxe “Query String” conforme exemplo abaixo:

http://172.16.31.214:8085/rest/wstafst2?ticketCode=F95975312365478978936365524145236352&RegistryKey=KEYQWE7878RE4854545454998598571&startRecNo=0

 

ParâmetroDescriçãoObrigatório
ticketCodeTAFTICKETOC
registryKeyTAFKEYOC
startRecNoRecNo inicial para consultaO
searchModeFiltro para buscaN

 

  • ticketCode – Código do TAFTICKET, Obrigatório caso registryKey não seja informado.
  • registryKey – Código do TAFKEY, Obrigatório caso ticketCode não seja informado.
  • startRecNo - Numero do RecNo Inicial a ser considerado na consulta. 
    Observação : O Tamanho máximo do Response é 850 kB, quando a mensagem chega neste valor é realizado um retorno contendo os registros que já foram incrementados na resposta. O Controle dos itens restantes é feito através do lastRecNo que informa o RecNo do ultimo registro que fez parte da mensagem anterior (respeitando a chave),  caso o mesmo seja diferente de maxRecNo é por que existem itens a serem retornados, caso o contrario a consulta está completa.
  • searchMode – Modo de pesquisa, quando não informado o response retorna todos os TAFKEYs relacionados a busca, quando igual a 1 retorna a última ocorrência do TAFKEY, quando igual a 2 retorna a última ocorrência válida do TAFKEY. Este parâmetro é útil quando o mesmo TAFKEY é enviado em vários TAFTICKET diferentes.
Estrutura da Resposta do método GET (Response):

 

Atributo

Pai

Nivel

Ocorrência

Formato

type

-

1

1

-

code

-

1

1:N

String(36-100)

Items

-

1

1

-

success

Items

2

1

boolean(true : false)

proccessed

Items

2

1

boolean(true : false)

description

Items

2

1

String(100)

registryKey

Items

2

0:1

String(100)

ticketCode

Items

2

0:1

String(36)

errorCode

Items

2

0:1

String(6)

errorDescription

Items

2

0:1

String(60)

errorDetail

Items

2

0:1

String(220)

statusCode

Items

2

0:1

String(1)

statusDescription

Items

2

0:1

String(25)

active

Items

2

0:1

boolean(true : false)

lastRecNo-11Int(9999)
maxRecNo-11Int(9

 

  • type – Determina o agrupamento do retorno que pode ser por ticketCode (TAFTICKET) ou registryKey (TAFKEY), o agrupamento depende dos parâmetros enviados no request, quando o registryKey é informado e o ticketCode omitido, o  retorno será por registryKey caso contrário por ticketCode.
  • code – Código do registro indicado no atributo type.
  • items – Itens do response.
  • success – informa que o envio do registro pelo método POST  foi realizado com sucesso.
  • proccessed – Informa se o registro foi processado (Job2) e integrado com sucesso no seu respectivo cadastro.
  • description – Descrição do status atual do registro.
  • registryKey – código do TAFKEY, esse atributo somente é exibido quando type for igual a ticketCode.
  • ticketCode – código do TAFTICKET, esse atributo somente é exibido quando type for igual a registryKey.
  • errorCode – Código do erro contido no campo TAFCODERR na tabela TAFXERP, atributo exibido somente quando proccessed for igual a false.
  • errorDescription – Descrição do errorCode, atributo exibido somente quando proccessed for igual a false.
  • errorDetail – Detalhes do erro, alguns tipos de erros possuem detalhes e são armazenados no campo TAFERR na tabela TAFXERP, atributo exibido somente quando proccessed for igual a false.
  • statusCode – Status do registro no TAF, atributo exibido somente quando proccessed for igual a true.
  • statusDescription – Descrição do status no TAF, atributo exibido somente quando proccessed for igual a true.
  • ative – Informa se o registro está ativo no TAF, atributo exibido somente quando proccessed for igual a true.
  • lastRecNo - Numero do RecNo do ultimo registro retornado na requisição.
  • maxRecNo - Informa o numero do RecNo do ultimo registro relacionado a consulta, deve ser utilizado juntamente com o lastRecNo para controlar a paginação e garantir o retorno de todos os registros.

 

Exemplos de requisição utilizando o método GET:

 

  • Consulta pelo ticketCode:

Request:

http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&startRecNo=0

 

 

Response:
{
  "type": "ticketCode",
  "code": "WIO9753123654789789363655241452363",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento.",
      "registryKey": "KEYIO7878874854545454998598525",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    },
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento.",
      "registryKey": "KEYYZE7878RE4854545454998598576",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    }
 ],
  "lastRecNo": 82,
  "maxRecNo": 82
}

 

 

Response após a execução do processamento:
{

  "type": "ticketCode",
  "code": "WIO9753123654789789363655241452363",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Registro Inconsistente.",
      "registryKey": "KEYIO7878874854545454998598525",
      "errorCode": "000007",
      "errorDescription": "A operacao solicitada no XML esta em desacordo com o cenario do registro na base do TAF",
      "errorDetail": ""
    },
    {
      "success": true,
      "proccessed": true,
      "description": "Registro Processado.",
      "registryKey": "KEYYZE7878RE4854545454998598576",
      "statusCode": " ",
      "statusDescription": "Registro Integrado",
      "active": true
    } 
 ],
  "lastRecNo": 82,
  "maxRecNo": 82
}

Observação: O exemplo acima contem os 2 tipos de retorno possíveis para um TAFKEY, o atributo proccessed define se vão ser apresentados os atributos de Erro ou de Sucesso conforme descrito acima na tabela de estrutura da resposta do método GET.

 

  • Consulta pelo ticketCode + registryKey:

Request:

http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&RegistryKey=KEYYZE7878RE4854545454998598576&startRecNo=0

 
Response:
{
  "type": "ticketCode",
  "code": "WIO9753123654789789363655241452363",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento do Job2.",
      "registryKey": "KEYYZE7878RE4854545454998598576",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    }
  ],
  "lastRecNo": 81,
  "maxRecNo": 81
}

Atenção!

Quando a consulta for por ticketCode + registryKey o retorno será agrupado por ticketCode.

 

  • Consulta pelo registryKey:

Request:

http://172.16.31.214:8085/rest/wstafst2?registryKey=KEYYZE7878RE4854545454998598576&startRecNo=0


Response:
{
  "type": "registryKey",
  "code": "KEYYZE7878RE4854545454998598576",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento do Job2.",
      "ticketCode": "WIO9753123654789789363655241452363",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    }
  ],
  "lastRecNo": 80,
  "maxRecNo": 80
}

 

Controle de Paginação:

Quando o retorno de uma requisição ultrapassa o valor de 850 Kb a mensagem de resposta deverá ser  "quebrada" e retornada com o conteúdo até então incrementado, exemplo:

Exemplo de Paginação
{
  "type": "ticketCode",
  "code": "WIO9753123654789789363655241452363",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento",
      "registryKey": "KEYIO7878874854545454998598525",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    },
*
*
*
{several items}
*
*
*
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento",
      "registryKey": "KEYQIU7878RE4854545454998598544",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    }
  ],
  "lastRecNo": 150,
  "maxRecNo": 322
}

No exemplo acima a consulta retornou até o registro 150, sendo que o registro com maior RecNo pertencente a consulta é o 322, isso não quer dizer que foram retornados 150 registros e que faltam 172, o RecNo apenas informa a sequencia do registro na tabela TAFST2 porém o lastRecNo menor que o maxRecNo indica que ainda existem registro a serem retornados para a chave requisitada. Para o retorno dos demais registros deve-se realizar uma nova requisição com o startRecNo igual a lastRecNo + 1, este procedimento deve ser adotado  até que o lastRecNo seja igual ao maxRecNo conforme exemplo abaixo:

 

Request:

http://172.16.31.214:8085/rest/wstafst2?ticketCode=WIO9753123654789789363655241452363&startRecNo=151

 

Response
{
  "type": "ticketCode",
  "code": "WIO9753123654789789363655241452363",
  "items": [
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento",
      "registryKey": "KEYIO7878874854545454998598888",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    },
*
*
*
{several items}
*
*
*
    {
      "success": true,
      "proccessed": false,
      "description": "Aguardando Processamento",
      "registryKey": "KEYQIU7878RE4854545454998598987",
      "errorCode": "",
      "errorDescription": "",
      "errorDetail": ""
    }
  ],
  "lastRecNo": 322,
  "maxRecNo": 322
}

 

DELETE

Descrição do Método: O método DELETE deverá permitir a exclusão de toda a cadeia de integração de um TAFTICKET; Um ticket submetido a exclusão tem seus TAFKEYS avaliados, rastreados e excluídos, desde a sua inclusão na TAFST2 e TAFXERP até o cadastro no TAF caso já tenha ocorrido o Processamento. 

 

Estrutura da mensagem enviada no DELETE (Request):

Atributo

Pai

Nivel

Ocorrência

Formato

deleteTicket

-

1

1

-

ticketCode

deleteTicket

2

1:N

String(36)

Estrutura da mensagem de retorno do método DELETE (Response):

 

Atributo

Pai

Nivel

Ocorrência

Formato

success

-

1

1

Lógico(true : false)

 

 

 

 

Exemplo de mensagem para o método DELETE:
 {
	"deleteTicket" : [{"ticketCode":"WIO9753123654789789363655241452363"}
							,{"ticketCode":"UIO9753123654789789363655241452363"}
							,{"ticketCode":"F95975312365478978936365524145236352"}
							,{"ticketCode":"ZTF059753123654789789363655241452363"}
							,{"ticketCode":"AF0597531236547897893636552414523635"}
				 			 ]
}
Response:
{"success": true}

 

Exemplo de Consumo do Serviço

 

Client REST
#Include 'Protheus.ch'
Function WSCTAFST2(cMetodo)
	Local oRestClient := FWRest():New("http://172.16.31.214:8085")
	Local oObj   	:= Nil
	Local aHeader := {}
	Local cBody	:= {}
	Local lContinue := .T.
	Local nPag		:= 0
	Local nRec		:= 0
	
	// inclui o campo Authorization no formato <usuario>:<senha> na base64
	Aadd(aHeader, "Authorization: Basic " + Encode64("usertotvs:totvs123456"))
	
	If cMetodo == 'POST'
	
		oRestClient:setPath("/rest/wstafst2/")
		
		cBody := '{'
		cBody += '"ticketCode": "WIO9753123654789789363655241452363",'
		cBody += '"lote": ['
		cBody += '{'
		cBody += '"sourceBranch": "0100",'	
		cBody += '"messageType": "2",''
		cBody += '"messageSequential": "001",'
		cBody += '"registryType": "S-1010",'
		cBody += '"registryKey": "KEYIO7878874854545454998598525",'
		cBody += '"integrationMessage": "PGVTb2NpYWw+PGV2dFRhYlJ1YnJpY2EgaWQ9J1MtMTAxMDEzMDUyMDE2MTU0MDE2JyB2ZXJzYW89JzEuMSc+PGlkZUV2ZW50bz48dHBBbWI+MzwvdHBBbWI+PHByb2NFbWk+MTwvcHJvY0VtaT48dmVyUHJvYz48L3ZlclByb2M+PC9pZGVFdmVudG8+PGlkZUVtcHJlZ2Fkb3I+PHRwSW5zYz4xPC90cEluc2M+PG5ySW5zYz41Mz'
		cBody += 'ExMzc5MTAwMDEyMjwvbnJJbnNjPjwvaWRlRW1wcmVnYWRvcj48aW5mb1J1YnJpY2E+PGFsdGVyYWNhbz48aWRlUnVicmljYT48Y29kUnVicj45OTg8L2NvZFJ1YnI+PGluaVZhbGlkPjIwMTYtMDM8L2luaVZhbGlkPjwvaWRlUnVicmljYT48ZGFkb3NSdWJyaWNhPjxkc2NSdWJyPkJBU0UgUEVOU0FPIFBHVE88L2RzY1J1YnI+PG5hdFJ1YnI+OTk4OTwvbmF'
		cBody += '0UnVicj48dHBSdWJyPjM8L3RwUnVicj48Y29kSW5jQ1A+MDA8L2NvZEluY0NQPjxjb2RJbmNJUlJGPjAwPC9jb2RJbmNJUlJGPjxjb2RJbmNGR1RTPjAwPC9jb2RJbmNGR1RTPjxjb2RJbmNTSU5EPjAwPC9jb2RJbmNTSU5EPjxyZXBEU1I+TjwvcmVwRFNSPjxyZXAxMz5OPC9yZXAxMz48cmVwRmVyaWFzPk48L3JlcEZlcmlhcz48cmVwUmVzYz5OPC9yZXBS'
		cBody += 'ZXNjPjwvZGFkb3NSdWJyaWNhPjwvYWx0ZXJhY2FvPjwvaW5mb1J1YnJpY2E+PC9ldnRUYWJSdWJyaWNhPjwvZVNvY2lhbD4=",'
		cBody += '"integrationDate": "20161005",'
		cBody += '"integrationTime": "14:15:36"'
		cBody += '},'
		cBody += '{'
		cBody += '"sourceBranch": "0100",'
		cBody += '"messageType": "2",'
		cBody += '"messageSequential": "001",'
		cBody += '"registryType": "S-2100",'
		cBody += '"registryKey": "KEYYZE7878RE4854545454998598576",'
		cBody += '"integrationMessage": "PGVTb2NpYWw+PGV2dENhZEluaWNpYWwgSWQ9J0lEMTUzMTEzNzkxMDAwMDAwMjAxNjEyMDkxNDU5NTQwMDAwMSc+PGlkZUV2ZW50bz48aW5kUmV0aWY+MTwvaW5kUmV0aWY+PG5yUmVjaWJvPjwvbnJSZWNpYm8+PHRwQW1iPjM8L3RwQW1iPjxwcm9jRW1pPjE8L3Byb2NFbWk+PHZlclByb2M+MS4wPC92ZXJQcm9jPjwvaWRlRXZ'
		cBody += 'lbnRvPjxpZGVFbXByZWdhZG9yPjx0cEluc2M+MTwvdHBJbnNjPjxuckluc2M+NTMxMTM3OTE8L25ySW5zYz48L2lkZUVtcHJlZ2Fkb3I+PHRyYWJhbGhhZG9yPjxjcGZUcmFiPjMyMDA5MDM3ODQ2PC9jcGZUcmFiPjxuaXNUcmFiPjEyMjAzNjcxODQ0PC9uaXNUcmFiPjxubVRyYWI+IEdUIFhNQlBFUkhVSlpOQ1FGU0lWTEFPRDwvbm1UcmFiPjxzZXhvPk08L'
		cBody += '3NleG8+PHJhY2FDb3I+MTwvcmFjYUNvcj48ZXN0Q2l2PjI8L2VzdENpdj48Z3JhdUluc3RyPjwvZ3JhdUluc3RyPjxuYXNjaW1lbnRvPjxkdE5hc2N0bz4xOTc2LTA0LTEzPC9kdE5hc2N0bz48Y29kTXVuaWM+MTIwMDEwNTwvY29kTXVuaWM+PHVmPlNQPC91Zj48cGFpc05hc2N0bz4wMTM8L3BhaXNOYXNjdG8+PHBhaXNOYWM+MDEzPC9wYWlzTmFjPjxubU1'
		cBody += 'hZT5ORVVTQSBDQVJWQUxITyBORVZFUzwvbm1NYWU+PG5tUGFpPkpPU0UgUkVZTkFMRE8gQ1JFU1BPIE5FVkVTPC9ubVBhaT48L25hc2NpbWVudG8+PGRvY3VtZW50b3M+PENUUFM+PG5yQ3Rwcz4wMDAzNTgwMDwvbnJDdHBzPjxzZXJpZUN0cHM+MDAwNzM8L3NlcmllQ3Rwcz48dWZDdHBzPlNQPC91ZkN0cHM+PC9DVFBTPjxSRz48bnJSZz4xNi43MjEuMDMwP'
		cBody += 'C9uclJnPjxvcmdhb0VtaXNzb3I+U1NQPC9vcmdhb0VtaXNzb3I+PGR0RXhwZWQ+MTk4Mi0wMy0wMjwvZHRFeHBlZD48L1JHPjxDTkg+PG5yUmVnQ25oPjAwMDAwMDAwMDA8L25yUmVnQ25oPjx1ZkNuaD48L3VmQ25oPjxkdFZhbGlkPjwvZHRWYWxpZD48Y2F0ZWdvcmlhQ25oPjwvY2F0ZWdvcmlhQ25oPjwvQ05IPjwvZG9jdW1lbnRvcz48ZW5kZXJlY28+PGV'
		cBody += '4dGVyaW9yPjxwYWlzUmVzaWQ+MDEzPC9wYWlzUmVzaWQ+PGRzY0xvZ3JhZD5BTEJBPC9kc2NMb2dyYWQ+PG5yTG9ncmFkPjE0NDQ8L25yTG9ncmFkPjxiYWlycm8+UFEuIEpBQkFRVUFSQTwvYmFpcnJvPjxubUNpZD5TQU4gTFVJWjwvbm1DaWQ+PGNvZFBvc3RhbD4wNDM0NjAwMDwvY29kUG9zdGFsPjwvZXh0ZXJpb3I+PC9lbmRlcmVjbz48aW5mb0RlZmlja'
		cBody += 'WVuY2lhPjxkZWZGaXNpY2E+TjwvZGVmRmlzaWNhPjxkZWZWaXN1YWw+TjwvZGVmVmlzdWFsPjxkZWZBdWRpdGl2YT5OPC9kZWZBdWRpdGl2YT48ZGVmTWVudGFsPk48L2RlZk1lbnRhbD48ZGVmSW50ZWxlY3R1YWw+TjwvZGVmSW50ZWxlY3R1YWw+PHJlYWJSZWFkYXA+TjwvcmVhYlJlYWRhcD48L2luZm9EZWZpY2llbmNpYT48YXBvc2VudGFkb3JpYT48dHJ'
		cBody += 'hYkFwb3NlbnQ+TjwvdHJhYkFwb3NlbnQ+PC9hcG9zZW50YWRvcmlhPjxjb250YXRvPjxmb25lUHJpbmM+MDAxMzQ3MzU1NTUgLzwvZm9uZVByaW5jPjxmb25lQWx0ZXJuYXQ+MDExNzg5Nzk4Nzk4PC9mb25lQWx0ZXJuYXQ+PGVtYWlsQWx0ZXJuYXQ+UkVZTkFMRE9ASE9UTUFJTC5DT008L2VtYWlsQWx0ZXJuYXQ+PC9jb250YXRvPjwvdHJhYmFsaGFkb3I+P'
		cBody += 'HZpbmN1bG8+PG1hdHJpY3VsYT4wMDAwMDAwMDAwMDAwMDAwMDAwNzwvbWF0cmljdWxhPjx0cFJlZ1RyYWI+MTwvdHBSZWdUcmFiPjx0cFJlZ1ByZXY+MTwvdHBSZWdQcmV2PjxpbmZvUmVnaW1lVHJhYj48L2luZm9SZWdpbWVUcmFiPjxpbmZvQ29udHJhdG8+PGNvZENhdGVnPjMwMjwvY29kQ2F0ZWc+PHJlbXVuZXJhY2FvPjx2clNhbEZ4PjEwMDAuMDA8L3Z'
		cBody += 'yU2FsRng+PHVuZFNhbEZpeG8+NTwvdW5kU2FsRml4bz48L3JlbXVuZXJhY2FvPjxkdXJhY2FvPjx0cENvbnRyPjE8L3RwQ29udHI+PC9kdXJhY2FvPjxsb2NhbFRyYWJhbGhvPjwvbG9jYWxUcmFiYWxobz48L2luZm9Db250cmF0bz48L3ZpbmN1bG8+PC9ldnRDYWRJbmljaWFsPjwvZVNvY2lhbD4=",'
		cBody += '"integrationDate": "",'
		cBody += '"integrationTime": ""'
		cBody += '}]'
		cBody += '}'
	
		// define o conteúdo do body
		oRestClient:SetPostParams(cBody)
		 
		If oRestClient:Post(aHeader)
		   ConOut("POST", oRestClient:GetResult())
		Else
		   ConOut("POST", oRestClient:GetLastError())
		EndIf
		
	ElseIf cMetodo == "GET"
	
		While lContinue
			nPag++
			oRestClient:setPath("/rest/wstafst2?TicketCode=WIO9753123654789789363655241452363&startRecNo=" + AllTrim(Str(nRec)))
			If oRestClient:Get(aHeader)
				ConOut("Pag: " + AllTrim(Str(nPag)))
			   	ConOut("GET", oRestClient:GetResult())
			  	
				If FWJsonDeserialize(oRestClient:GetResult(),@oObj)
			   		If oObj:lastRecNo == oObj:maxRecNo
			   			lContinue := .F.
			   		Else
			   			nRec := oObj:lastRecNo+1
			   		EndIf
			   	EndIf
			   	oObj := Nil
			Else
			   ConOut("GET", oRestClient:GetLastError())
			   lContinue := .F.
			EndIf
		End
		ConOut("------FIM------")
	ElseIf cMetodo == "DELETE"
		
		cBody := '{"deleteTicket" : [{"ticketCode":"WIO9753123654789789363655241452363"}'
		cBody += ',{"ticketCode":"UIO9753123654789789363655241452363"}]}'
		If oRestClient:Delete(aHeader,cBody)
		   ConOut("DELETE", oRestClient:GetResult())
		Else
		   ConOut("DELETE", oRestClient:GetLastError())
		EndIf
		
	Else
		ConOut("Método Inválido")
	EndIf
	
	FreeObj(oRestClient)
Return 
Exemplo de Resposta do método GET com RESTFAULT
  "errorCode": 101,
  "errorMessage": "obrigatorio o envio do parametro ticketCode ou registryKey"
}

 

CÓDIGOS DE ERROS DE VALIDAÇÃO:

Os Erros de validação deverão seguir os seguintes códigos:

  • 800 – Campo não informado na estrutura do arquivo.
  • 801 – Campo obrigatório não enviado.
  • 802 – Campo com valor inválido.
  • 803 – TAFFIL não encontrado no complemento de empresas.
  • 804 – Layout Inválido. 

 

Exemplo de mensagem POST:Exemplo de Resposta do método POST com erro de validação:
{
  "ticketCode": "WIO9753123654789789363655241452363",
  "registryKey": [
    {
      "key": "KEYIO7878874854545454998598525",
      "success": false,
      "error": [
        {
          "coderr": 801,
          "description": "Campo TAFFIL (sourceBranch)  e Obrigatorio."
        },
        {
          "coderr": 803,
          "description": "O valor do campo TAFFIL (sourceBranch)  nao esta cadastro no complemento de empresas."
        }
      ]
    },
    {
      "key": "KEYYZE7878RE4854545454998598576",
      "success": true
    },
    {
      "key": "KEYQWE7878RE4854545454998598571",
      "success": true
    },
    {
      "key": "KEYQIU7878RE4854545454998598544",
      "success": true
    }
  ],
  "keyAmount": 4
}

 Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico.