Este documento é material de especificação dos requisitos de inovação, trata-se de conteúdo extremamente técnico. |
---|
Índice |
---|
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).
Elaborar a especificação que orientará a implementação do Identificador Global de Recursos nas respectivas linhas de produto com EAI.
Informações | ||
---|---|---|
| ||
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. |
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.
As marcas deverão atender os seguintes pré-requisitos:
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.
Informações |
---|
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. |
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.
Informações |
---|
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.
Informaçõ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).
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.
A especificação atual das mensagens será alterada para discriminar o tipo de identificador de recursos sendo utilizado na mensagem disparada.
Iremos incluir um atributo "globalType" no elemento nos elementos "InternalId" do conteúdo da mensagem padronizada
Bloco de código | ||
---|---|---|
| ||
<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> |
Bloco de código | ||
---|---|---|
| ||
<xs:element name="InternalId" type="xs:string" minOccurs="10" 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> |
Bloco de códigocode | ||
---|---|---|
| ||
<xs:complexType name="ListOfInternalIdType"> <BusinessContent><xs:sequence> <InternalId<xs:element globalTypename="uuid">f81d4fae-7dec-11d0-a765-00a0c91e6bf6</InternalId> InternalId" type="InternalIdType" minOccurs="1" maxOccurs="unbounded" /> <OrderPurpose>1<</OrderPurpose>xs:sequence> </xs:complexType> <CompanyId>4</CompanyId><xs:complexType name="InternalIdType"> <xs:attribute name="globalType" <CompanyInternalId>4|1</CompanyInternalId>type="xs:string" use="optional"> <BranchId>1</BranchId> <xs:restriction base="xs:string"> <CustomerOrderId>4|</CustomerOrderId> <xs:enumeration value="UUID"></xs:enumeration> <RegisterDate></RegisterDate> <PaymentTermCode>4|001</PaymentTermCode><xs:enumeration value="uuid"></xs:enumeration> <OrderId>5652<</OrderId>xs:restriction> <UserInternalId>mestre</UserInternalId></xs:attribute> <xs:sequence> <PaymenTermCode></PaymenTermCode> <xs:element name="Name" type="xs:string" <CurrencyCode></CurrencyCode>minOccurs="0" maxOccurs="1"> <CurrencyId></CurrencyId> <xs:annotation> <Observation></Observation> <ListOfCreditDocument></ListOfCreditDocument> <xs:documentation> <DeliveryAddress> Nome da InternalId, este nome <City></City> será padronizado como o nome <State> que esta internalId teria como chave <StateCode></StateCode>extrangeira de uma mensagem. <StateInternalId></StateInternalId> </State> </DeliveryAddress>Exemplo: <Discounts> Para entidade Item: ItemInternalId <Discount>0</Discount> </Discounts> <SalesOrderItens> City: CityInternalId <Item> <OrderItem>1</OrderItem> CustomerVendor: CustomerVendorInternalId <CompanyId>4</CompanyId> <BranchId><</BranchId>xs:documentation> <OrderId>5652</OrderId></xs:annotation> <itemunitofmeasure></itemunitofmeasure></xs:element> <xs:element name="Origin" type="xs:string" <InternalId>4|5652|1</InternalId>minOccurs="0" maxOccurs="1"> <xs:annotation> <ItemCode></ItemCode> <xs:documentation>InternalId da <ItemInternalId>4|</ItemInternalId> origem</xs:documentation> <CostCenter>4|</CostCenter>xs:annotation> <UnityPrice></UnityPrice></xs:element> <xs:element name="Destination" type="xs:string" minOccurs="0" maxOccurs="1"> <TotalPrice></TotalPrice> <xs:annotation> <Quantity></Quantity> <xs:documentation>InternalId do destino</xs:documentation> <Observation></Observation> </xs:annotation> <UnitOfMeasureInternalId></UnitOfMeasureInternalId></xs:element> </xs:sequence> </xs:complexType> |
Bloco de código | ||
---|---|---|
| ||
<WarehouseInternalId>4||</WarehouseInternalId><BusinessContent> <InternalId globalType="uuid">f81d4fae-7dec-11d0-a765-00a0c91e6bf6</InternalId> <FreightValue></FreightValue> <OrderPurpose>1</OrderPurpose> <ListOfApportionOrderItem><<CompanyId>4</ListOfApportionOrderItem>CompanyId> <CompanyInternalId globalType="uuid">19dfb9b3-901c-48ce-9954-2cb147ec4fe8</CompanyInternalId> <ItemDiscounts><BranchId>1</BranchId> <CustomerOrderId>4|</CustomerOrderId> <ItemDiscount><<RegisterDate></ItemDiscount>RegisterDate> <PaymentTermCode>4|001</PaymentTermCode> </ItemDiscounts> <OrderId>5652</OrderId> <<UserInternalId>mestre</Item>UserInternalId> <<PaymenTermCode></SalesOrderItens>PaymenTermCode> </BusinessContent> |
Bloco de código | ||
---|---|---|
| ||
<BusinessContent><CurrencyCode></CurrencyCode> <InternalId>4|5652<<CurrencyId></InternalId>CurrencyId> <OrderPurpose>1<<Observation></OrderPurpose>Observation> <CompanyId>4<<ListOfCreditDocument></CompanyId>ListOfCreditDocument> <CompanyInternalId>4|1</CompanyInternalId><DeliveryAddress> <BranchId>1</BranchId> <City></City> <CustomerOrderId>4|</CustomerOrderId> <State> <RegisterDate></RegisterDate> <PaymentTermCode>4|001<<StateCode></PaymentTermCode>StateCode> <OrderId>5652</OrderId> <StateInternalId></StateInternalId> <UserInternalId>mestre</UserInternalId> <PaymenTermCode><</PaymenTermCode>State> <CurrencyCode><</CurrencyCode>DeliveryAddress> <CurrencyId></CurrencyId> <Discounts> <Observation><<Discount>0</Observation>Discount> <ListOfCreditDocument><</ListOfCreditDocument>Discounts> <DeliveryAddress><SalesOrderItens> <City></City><Item> <State> <OrderItem>1</OrderItem> <StateCode><<CompanyId>4</StateCode>CompanyId> <StateInternalId><<BranchId></StateInternalId>BranchId> <<OrderId>5652</State>OrderId> </DeliveryAddress> <itemunitofmeasure></itemunitofmeasure> <Discounts> <Discount>0</Discount> <InternalId globalType="uuid">95a81989-e487-4012-b8e2-b5ae97d3e078</InternalId> </Discounts> <ItemCode></ItemCode> <SalesOrderItens> <Item><ItemInternalId globalType="uuid">7371ec73-3062-476d-93cf-251560d130da</ItemInternalId> <OrderItem>1<<CostCenter>4|</OrderItem>CostCenter> <CompanyId>4<<UnityPrice></CompanyId>UnityPrice> <BranchId><<TotalPrice></BranchId>TotalPrice> <OrderId>5652<<Quantity></OrderId>Quantity> <itemunitofmeasure><<Observation></itemunitofmeasure>Observation> <InternalId>4|5652|1</InternalId><UnitOfMeasureInternalId globalType="uuid">5eeba464-3748-41a6-a5f7-1cff2ca69aeb</UnitOfMeasureInternalId> <ItemCode></ItemCode><WarehouseInternalId globalType="uuid">c3507b85-a799-42b0-8e71-07cf886ec781</WarehouseInternalId> <ItemInternalId>4|<<FreightValue></ItemInternalId>FreightValue> <CostCenter>4|<<ListOfApportionOrderItem></CostCenter>ListOfApportionOrderItem> <UnityPrice></UnityPrice> <ItemDiscounts> <TotalPrice><<ItemDiscount></TotalPrice>ItemDiscount> <Quantity><</Quantity>ItemDiscounts> <Observation></Observation></Item> </SalesOrderItens> <UnitOfMeasureInternalId></UnitOfMeasureInternalId> </BusinessContent> |
Bloco de código | ||
---|---|---|
| ||
<TOTVSMessage> <MessageInformation version="1.000"> <UUID>6403aa6a-700d-a535-c567-8ea0be5c9142</UUID> <Type>Response</Type> <Transaction>CONTRACT</Transaction> <WarehouseInternalId>4||</WarehouseInternalId><StandardVersion>1.000</StandardVersion> <SourceApplication>PADRAO_EAI2</SourceApplication> <CompanyId>01</CompanyId> <BranchId>1U</BranchId> <Product <FreightValue></FreightValue>name="PROTHEUS" version="12"></Product> <GeneratedOn>2018-01-08T16:53:45</GeneratedOn> <DeliveryType>Sync</DeliveryType> </MessageInformation> <ResponseMessage> <ListOfApportionOrderItem></ListOfApportionOrderItem><ReceivedMessage> <SentBy>RM</SentBy> <UUID>bf920a68-8263-4e1a-8076-2084a55e69d2</UUID> <ItemDiscounts><Event>Upsert</Event> <MessageContent><![CDATA[ <?xml version="1.0" encoding="utf-8"?> <TOTVSMessage> <MessageInformation version="1.000"> <UUID>bf920a68-8263-4e1a-8076-2084a55e69d2</UUID> <ItemDiscount></ItemDiscount> <Type>BusinessMessage</Type> <Transaction>CONTRACT</Transaction> <StandardVersion>1.000</StandardVersion> <<SourceApplication>RM</ItemDiscounts>SourceApplication> <CompanyId>1</CompanyId> <<BranchId>1</Item>BranchId> <Product </SalesOrderItens>name="RM" version="12.1.17.0" /> </BusinessContent> |
Iremos incluir a propriedade "uuid" no elemento "InternalId" da mensagem padronizada para representar uma mensagem trafegando um identificador global
Bloco de código | ||
---|---|---|
| ||
{<GeneratedOn>2018-01-08T18:53:40</GeneratedOn> <DeliveryType>Sync</DeliveryType> </MessageInformation> "uuid": {<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> "type": "string"<Status>ok</Status> } } |
Bloco de código | ||
---|---|---|
| ||
{ </ProcessingInformation> "InternalId": {<ReturnContent> "type": ["object", "string"] <ListOfInternalId> <InternalId globalType="propertiesuuid": {> <Name>Contract</Name> "uuid": { <Origin>f555297a-951f-415d-8672-4a08f2251d40</Origin> "type": "string" <Destination>f555297a-951f-415d-8672-4a08f2251d40</Destination> </InternalId> } </ListOfInternalId> }</ReturnContent> } } |
</ResponseMessage>
</TOTVSMessage> |
Iremos incluir a propriedade "uuid" no elemento "InternalId" da mensagem padronizada para representar uma mensagem trafegando um identificador global
Bloco de código | ||
---|---|---|
| ||
{ "Contentuuid" : { "CompanyIdtype" : "99string", } } |
Bloco de código | ||
---|---|---|
| ||
{ "BranchIdInternalId" : "01",{ "CompanyInternalIdtype" : ["99object", "Code" : "ABC001","string"] "InternalIdproperties" : {"uuid": "f81d4fae-7dec-11d0-a765-00a0c91e6bf6"}, "RegisterSituation" : "Active", uuid": { "Name" : "Centro de Custo ABC001", "ShortCodetype" : "ABC001string", "SPED" : true, } "Class" : 2} } } |
Bloco de código | ||
---|---|---|
| ||
{ "Content" : { "CompanyId" : "99", "BranchId" : "01", "CompanyInternalId" : "99", "Code" : "ABC001", "InternalId" : {"uuid": "99|ABC001"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. |
---|