Objetivo

Documentar a estrutura, funcionamento e práticas relacionadas a mensagem padronizada TOTVS utilizando REST como padrão de comunicação e JSON como formato de mensagem.

Este documento leva em consideração que o leitor tenha um conhecimento prévio da mensagem padronizada TOTVS utilizando XML e SOAP. Caso algum termo não esteja suficientemente descrito, recomenda-se consultar o documento Padrão para criação de mensagem padronizada, disponível no portal de Integrações TOTVS.


Estrutura

A partir da estrutura original da mensagem padronizada, baseada em SOAP e XML, temos os seguintes elementos:

Graficamente, a nova proposta pode ser descrita conforme abaixo:

Funcionamento

A dinâmica envolvendo o envio e recebimento de mensagens não se altera com a nova proposta. O que muda, de fato, são o formato da mensagem e a interface.

Os modos de operação continuam os mesmos: síncrono e assíncrono, sendo que neste último continuamos a ter a necessidade de uma fila e de um agente que se responsabilize por sua gestão (processador de fila).

A geração das mensagens continua a cargo dos adapters, que entregam para a Engine do EAI a estrutura de dados necessária para gerar a mensagem no padrão TOTVS. Da mesma, forma o recebimento das mensagens continua sendo intermediado pelo Engine de EAI, que determinará qual o adapter responsável por processar a mensagem recebida.

Definições da nova proposta

Mensagem

A mensagem padronizada, utilizando JSON como formato, será composta dos seguintes elementos:

header: contem informações equivalentes a tag MessageInformation, do formato XML. Os atributos JSON correspondentes seguem as mesmas convenções de obrigatoriedade do padrão original. As tags que não estão descritas aqui, a principio, não serão utilizadas.

content: contem informações equivalentes a tag BusinessContent, para mensagens de negócio, ou a tag ReturnContent, para mensagens de resposta. Devido a isso, os atributos podem variar de acordo com a definição da transação. Quando a mensagem for de resposta, o atributo content terá a seguinte estrutura:


Nesta nova proposta, a indicação do tipo de operação - upsert ou delete - está vinculada ao método HTTP utilizado na requisição. Mais informações serão prestadas na seção Interface deste documento.


Uma mensagem da transação CostCenter, versão 2.000, seria expressa da seguinte forma, usando o formato JSON proposto:

{
    "header" : {
        "UUID" : "d6bbfa63-ca27-e2ac-0b14-101970f59a5b",
        "type" : "BusinessMessage",
        "subType" : "event",
        "transaction" : "CostCenter",
        "version" : "2.000",
        "sourceApplication": "P1299",
        "productName" : "PROTHEUS",
        "productVersion" : "12.1.17",
        "companyId" : "99",
        "branchId" : "01",
        "generatedOn" : "2017-11-14T11:47:00-03:00",
        "deliveryType" : "async",
    },
    "content" : {
        "CompanyId" : "99",
        "BranchId" : "01",
		"CompanyInternalId" : "99",
		"Code" : "ABC001",
		"InternalId" : "99|ABC001",
		"RegisterSituation" : "Active",
        "Name" : "Centro de Custo ABC001",
		"ShortCode" : "ABC001",
		"SPED" : true,
		"Class" : 2
    }
}


A mensagem de resposta correspondente seria semelhante ao exemplo abaixo:

{
    "header" : {
        "UUID" : "a1b2c3d4-e5f6-g7h8-i9j0-k1l2m3n4o5p6",
        "type" : "Response",
        "subType" : "event",
        "transaction" : "CostCenter",
        "version" : "2.000",
        "sourceApplication" : "LGX12",
        "productName" : "LOGIX",
        "productVersion" : "12.1.15",
        "generatedOn" : "2017-11-14T11:47:15-03:00",
        "deliveryType": "async"
    },
    "content" : {
        "receivedMessage" : {
            "UUID" : "d6bbfa63-ca27-e2ac-0b14-101970f59a5b",
            "sentBy" : "P1299",
            "event" : "upsert"        
        },
        "processingInformation" : {
            "processedOn" : "2017-11-14T11:47:15-03:00",
            "status" : "ERROR",
            "details" : [
                {
                    "code" : "FE001",
                    "message" : "Mensagem padrão no formato incorreto.",
                    "detailedMessage" : ""
                },
                {
                    "code" : "AE004",
                    "message" : "Empresa não configurada para integração.",
                    "detailedMessage" : ""
                }
            ]
        },
        "returnContent" : {            
            "listOfInternalID" : [
                {
                    "name" : "CostCenter",
                    "origin" : "99|ABC001",
                    "destination" : "10|1000"
                },
                {
                    "name" : "Company",
                    "origin" : "99",
                    "destination" : "10"
                }
            ]
        }
    }
}


A nova proposta fornece também um modelo para lote de mensagens, que corresponde a um array JSON, onde cada elemento corresponde a uma mensagem no formato JSON.

{
    "items" : [
        {
            "header" : {
                "UUID" : "",
                "type" : "",
                "subType" : "",
                "transaction" : "customerVendor",
                "version" : "2.001",
                "sourceApplication": "",
                "productName" : "",
                "productVersion" : "",
                "generatedOn" : "",
                "deliveryType" : "async",
            },
            "content" : {
                "atributo1" : "",
                "atributo2" : "",
                ...
                "atributoN" : ""
            }
        },{
            "header" : {
                "UUID" : "",
                ...
                "transaction" : "item",
                "version" : "3.001",
                ...
                "deliveryType" : "async" 
            },
            "content" : {
                "atributo1" : "",
                "atributo2" : "",
                ...
                "atributoN" : ""
            }
        }
    ]
}

O lote de mensagens tem algumas características importantes:

Interface

As mensagens padronizadas em formato JSON serão recebidas por um endpoint padrão, conforme descrito abaixo:

/totvseai/standardmessage/v1

Neste endpoint estarão disponíveis dois predicados ou entidades:


Salvo quando explicitamente indicado no documento, deve-se considerar que os endpoints disponibilizam os recursos previstos no Guia de Implementação de APIs para paginação, ordenação e filtro de dados.

Predicado /transactions

URL completa: /totvseai/standardmessage/v1/transactions?batchType={batchType}.

Os parâmetros de paginação, ordenação e filtro de dados previstos pelo Guia de Implementação de APIs não são aplicáveis para as requisições deste predicado.

Os métodos HTTP previstos para o endpoint são:

Exemplos de utilização deste endpoint podem ser encontrados nesta página.

Predicado /contents

URL completa: /totvseai/standardmessage/v1/contents/{transactionID_version}/{internalID}.

Os métodos previstos são:

Formato de mensagem

O formato de mensagem utilizado nas requisições para o endpoint /contents é mais simples, já que não requer as informações de cabeçalho para realizar o controle da mensagem. A proposta do modelo é apenas utilizar-se do modelo de mensagem padronizada para trafegar informações entre as partes.

Na prática, o modelo de dados que será trafegado nas requisições corresponde ao atributo content do modelo completo, usado pelo endpoint /transactions.

Exemplos de utilização deste endpoint podem ser vistos aqui.

Coexistência com o formato XML/SOAP

No período de migração das implementações em XML para JSON, será necessário que os formatos convivam simultaneamente e sejam interoperáveis. Assim que todos os ERPs forem capazes de trabalhar com a nova proposta, o formato XML e os endpoints SOAP poderão ser desativados.

Elaboração da mensagem padronizada

O desenho de uma transação, na nova proposta, utilizará o formato Swagger/OpenAPI, em substituição ao formato XML Schema, utilizado na implementação original.