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

Módulo

EAI

Segmento Executor

Framework

Projeto1

DEAI1

IRM/EPIC1


Requisito/Story/Issue1

DEAI1-1160

Subtarefa1

DEAI1-1608

Chamado/Ticket2


País

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

(  ) USA  (  ) Colombia   ( X ) TODOS.

Outros

<Caso necessário informe outras referências que sejam pertinentes a esta especificação. Exemplo: links de outros documentos ou subtarefas relacionadas>.

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

Objetivo

Elaborar a especificação que orientará a implementação do Identificador Global de Recursos nas respectivas linhas de produto com EAI.


Para sua informação

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


Definições Gerais

Estamos propondo a criação de um Identificador Global de Recursos para as entidades trafegadas entre os ERP's da TOTVS afim de substituir o uso de "Internal ID" em todas as integrações SOAP e REST.

Pré-requisitos

As marcas deverão atender os seguintes pré-requisitos:

  • Devem respeitar a sintaxe de URI descrita na RFC-3986;
  • Devem respeitar a sintaxe de URN descrita na RFC-8141;
  • Devem respeitar a definição de UUID descrita na RFC-4122;
  • Devem respeitar a definição de JSON descrita na RFC-8259;

Termos e Nomenclaturas

Os termos "DEVE", "NÃO DEVE", "REQUERIDO", "PODE", "NÃO PODE", "DEVERIA", "NÃO DEVERIA", "RECOMENDADO", "NÃO RECOMENDADO" e "OPCIONAL" devem ser interpretados como descritos na BCP-14, RFC-2119 e RFC-8174.


Recursos podem ser compreendidos como as Entidades que são trafegadas através das mensagens padronizadas a partir do EAI dos ERP's da TOTVS.

Definições da Regra de Negócio

Em termos gerais, o ERP de onde se origina a entidade a ser trafegada através do EAI (RM, Datasul, Protheus, Logix) irá realizar a geração do UUID v4, que identificará este recurso através de todas as linhas de produtos que compartilhem esta integração.

Iremos adotar o padrão de compatibilidade total com as mensagens atualmente em uso, sendo assim, mesmo que uma mensagem não utilize a estrutura proposta, os EAIs irão processar estas mensagens através do funcionamento legado utilizando o de-para na entidade "InternalId" para identificar o recurso.

Nossa proposta inicial é de se utilizar UUID's (Universally Unique Identifier), também conhecidos por GUID's (Globally Unique IDentifier), como URN (Uniform Resource Name) de entidades sendo trafegadas entre os ERP's da TOTVS.


Um UUID é composto por 128 bits de informação e não requer um processo de geração centralizado.


Uma das principais razões pela escolha do UUID é que, além de sua geração poder ser descentralizada e automatizada, o algoritmo de geração do UUID suporta geração concorrente de até 10 milhões de registros por segundo por máquina, permitindo seu uso até como identificador de transações.


Exemplo de uma representação em texto de um UUID como URN:

urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6


Foi escolhida a versão 4 (UUID v4) por se tratar de um algoritmo que utiliza geração de valores randômicos e que não se baseia no MAC Address da máquina que realiza a geração do identificador (UUID v1).

Funcionamento

Todas as linhas irão adequar seus adapters para enviar o Identificador Global de Recursos através da entidade "InternalId" no conteúdo de uma mensagem padronizada.

Todos os adapters deverão estar preparados para receber o Identificador Global de Recursos e retornar este mesmo identificador nas tags "Origin" e "Destination" do elemento "InternalId" de forma que a migração possa ocorrer de forma gradativa.


Estrutura

A especificação atual das mensagens será alterada para discriminar o tipo de identificador de recursos sendo utilizado na mensagem disparada.

SOAP/XML

Iremos incluir um atributo "globalType" nos elementos "InternalId" do conteúdo da mensagem padronizada

<xs:attribute name="globalType" type="xs:string" use="optional">
    <xs:restriction base="xs:string">
        <xs:enumeration value="UUID"></xs:enumeration>
        <xs:enumeration value="uuid"></xs:enumeration>
    </xs:restriction>
</xs:attribute>

Especificação do elemento "InternalId"

<xs:element name="InternalId" type="xs:string" minOccurs="0" maxOccurs="1">
    <xs:complexType>
        <xs:attribute name="globalType" type="xs:string" use="optional">
            <xs:restriction base="xs:string">
                <xs:enumeration value="UUID"></xs:enumeration>
                <xs:enumeration value="uuid"></xs:enumeration>
            </xs:restriction>
        </xs:attribute>
    </xs:complexType>
</xs:element>

Especificação do elemento "ListOfInternalId"

    <xs:complexType name="ListOfInternalIdType">
        <xs:sequence>
            <xs:element name="InternalId" type="InternalIdType" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="InternalIdType">
        <xs:attribute name="globalType" type="xs:string" use="optional">
            <xs:restriction base="xs:string">
                <xs:enumeration value="UUID"></xs:enumeration>
                <xs:enumeration value="uuid"></xs:enumeration>
            </xs:restriction>
        </xs:attribute>

        <xs:sequence>
            <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>
                        Nome da InternalId, este nome será padronizado como o nome 
                        que esta internalId teria como chave extrangeira de uma mensagem.
                        
                        Exemplo:
                        Para entidade Item: ItemInternalId
                                      City: CityInternalId
                                      CustomerVendor: CustomerVendorInternalId
                        </xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="Origin" type="xs:string" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>InternalId da origem</xs:documentation>
                </xs:annotation>
            </xs:element>

            <xs:element name="Destination" type="xs:string" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>InternalId do destino</xs:documentation>
                </xs:annotation>
            </xs:element>

        </xs:sequence>
    </xs:complexType>


Exemplos

Utilização da entidade "InternalId" em mensagens padronizadas para identificar recursos globais

        <BusinessContent>
            <InternalId globalType="uuid">f81d4fae-7dec-11d0-a765-00a0c91e6bf6</InternalId>
            <OrderPurpose>1</OrderPurpose>
            <CompanyId>4</CompanyId>
            <CompanyInternalId globalType="uuid">19dfb9b3-901c-48ce-9954-2cb147ec4fe8</CompanyInternalId>
            <BranchId>1</BranchId>
            <CustomerOrderId>4|</CustomerOrderId>
            <RegisterDate></RegisterDate>
            <PaymentTermCode>4|001</PaymentTermCode>
            <OrderId>5652</OrderId>
            <UserInternalId>mestre</UserInternalId>
            <PaymenTermCode></PaymenTermCode>
            <CurrencyCode></CurrencyCode>
            <CurrencyId></CurrencyId>
            <Observation></Observation>
            <ListOfCreditDocument></ListOfCreditDocument>
            <DeliveryAddress>
                <City></City>
                <State>
                    <StateCode></StateCode>
                    <StateInternalId></StateInternalId>
                </State>
            </DeliveryAddress>
            <Discounts>
                <Discount>0</Discount>
            </Discounts>
            <SalesOrderItens>
                <Item>
                    <OrderItem>1</OrderItem>
                    <CompanyId>4</CompanyId>
                    <BranchId></BranchId>
                    <OrderId>5652</OrderId>
                    <itemunitofmeasure></itemunitofmeasure>
                    <InternalId globalType="uuid">95a81989-e487-4012-b8e2-b5ae97d3e078</InternalId>
                    <ItemCode></ItemCode>
                    <ItemInternalId globalType="uuid">7371ec73-3062-476d-93cf-251560d130da</ItemInternalId>
                    <CostCenter>4|</CostCenter>
                    <UnityPrice></UnityPrice>
                    <TotalPrice></TotalPrice>
                    <Quantity></Quantity>
                    <Observation></Observation>
                    <UnitOfMeasureInternalId globalType="uuid">5eeba464-3748-41a6-a5f7-1cff2ca69aeb</UnitOfMeasureInternalId>
                    <WarehouseInternalId globalType="uuid">c3507b85-a799-42b0-8e71-07cf886ec781</WarehouseInternalId>
                    <FreightValue></FreightValue>
                    <ListOfApportionOrderItem></ListOfApportionOrderItem>
                    <ItemDiscounts>
                        <ItemDiscount></ItemDiscount>
                    </ItemDiscounts>
                </Item>
            </SalesOrderItens>
        </BusinessContent>

Utilização da entidade "ListOfInternalId" em mensagens padronizadas para identificar recursos globais

<TOTVSMessage>
  <MessageInformation version="1.000">
    <UUID>6403aa6a-700d-a535-c567-8ea0be5c9142</UUID>
    <Type>Response</Type>
    <Transaction>CONTRACT</Transaction>
    <StandardVersion>1.000</StandardVersion>
    <SourceApplication>PADRAO_EAI2</SourceApplication>
    <CompanyId>01</CompanyId>
    <BranchId>1U</BranchId>
    <Product name="PROTHEUS" version="12"></Product>
    <GeneratedOn>2018-01-08T16:53:45</GeneratedOn>
    <DeliveryType>Sync</DeliveryType>
  </MessageInformation>
  <ResponseMessage>
    <ReceivedMessage>
      <SentBy>RM</SentBy>
      <UUID>bf920a68-8263-4e1a-8076-2084a55e69d2</UUID>
      <Event>Upsert</Event>
      <MessageContent><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<TOTVSMessage>
    <MessageInformation version="1.000">
        <UUID>bf920a68-8263-4e1a-8076-2084a55e69d2</UUID>
        <Type>BusinessMessage</Type>
        <Transaction>CONTRACT</Transaction>
        <StandardVersion>1.000</StandardVersion>
        <SourceApplication>RM</SourceApplication>
        <CompanyId>1</CompanyId>
        <BranchId>1</BranchId>
        <Product name="RM" version="12.1.17.0" />
        <GeneratedOn>2018-01-08T18:53:40</GeneratedOn>
        <DeliveryType>Sync</DeliveryType>
    </MessageInformation>
    <BusinessMessage>
        <BusinessEvent>
            <Entity>CONTRACT</Entity>
            <Event>Upsert</Event>
        </BusinessEvent>
        <BusinessContent>
            <RMENTITYNAME>MCNT</RMENTITYNAME>
            <InternalId globalType="uuid">f555297a-951f-415d-8672-4a08f2251d40</InternalId>
            <CompanyId>1</CompanyId>
            <ProjectInternalId globalType="uuid">a82462a7-481b-4839-b525-272184f86cb6</ProjectInternalId>
            <ContractNumber>333333</ContractNumber>
        </BusinessContent>
    </BusinessMessage>
</TOTVSMessage>
]]></MessageContent>
    </ReceivedMessage>
    <ProcessingInformation>
      <ProcessedOn>2018-01-08T16:53:45</ProcessedOn>
      <Status>ok</Status>
    </ProcessingInformation>
    <ReturnContent>
      <ListOfInternalId>
        <InternalId globalType="uuid">
          <Name>Contract</Name>
          <Origin>f555297a-951f-415d-8672-4a08f2251d40</Origin>
          <Destination>f555297a-951f-415d-8672-4a08f2251d40</Destination>
        </InternalId>
      </ListOfInternalId>
    </ReturnContent>
  </ResponseMessage>
</TOTVSMessage>

REST/JSON

Iremos incluir a propriedade "uuid" no elemento "InternalId" da mensagem padronizada para representar uma mensagem trafegando um identificador global

{
    "uuid": {
        "type": "string"
    }
}

Especificação do elemento "InternalId"

{
    "InternalId": {
        "type": ["object", "string"]
        "properties": {
            "uuid": {
                "type": "string"
            }
        }
    }
}

Exemplos

Utilização da entidade "InternalId" em mensagens padronizadas para identificar recursos globais

{
    "Content" : {
        "CompanyId" : "99",
        "BranchId" : "01",
        "CompanyInternalId" : "99",
        "Code" : "ABC001",
        "InternalId" : {"uuid": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"},
        "RegisterSituation" : "Active",
        "Name" : "Centro de Custo ABC001",
        "ShortCode" : "ABC001",
        "SPED" : true,
        "Class" : 2
    }
}










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