Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

Índice

...

Objetivo e formas de uso

O objetivo da Mensagem Padronizada TOTVS

...

A Mensagem Padronizada TOTVS estabelece alguns (TOTVS Standard Message - TSM) é estabelecer padrões que devem ser seguidos por todos os aplicativos que participam da integração. Estes padrões estabelecem alguns definem os tipos de mensagens suportadas bem como informações obrigatórias que devem fazer parte do seu conteúdo.

A composição do conteúdo de cada uma das mensagens de negócio será definida em conjunto com especialistas de negócio e não faz parte do escopo deste documento.A anatomia básica de uma mensagem de negócio permite que dentro de uma mensagem específica seja definido se defina apenas o modelo do conteúdo de negócio e retorno. Entretanto, mas quando a mensagem completa for trafegar for necessário um maior controle das mensagens trafegadas entre os produtos, todas as informações citadas acima também façam parte da estrutura da mensagem.

Veja abaixo um exemplo do JSON de uma mensagem padronizada completa (incluindo header para controle da camada de EAI):

Image Removed

Clique aqui para obter mais informações sobre integração via transactions (EAI)

No caso de JSON simplificado para API, trabalhamos apenas com o conteúdo da propriedade "content", desconsiderando o header.

é possível acrescentar modelos adicionais (como o modelo de dado para retorno de status de processamento), de forma todas as informações necessárias façam parte de uma única estrutura de mensagem.

A composição do conteúdo da mensagem no que diz respeito ao negócio será definida em conjunto com especialistas de negócio e não faz parte do escopo deste documento.

As orientações descritas neste documento, portanto, visam atender os dois modelos de integração existentes: API e Transactions.

(informação) Clique aqui para entender a divisão e as diferenças entre especificação de API (arquivo OpenAPI) e Mensagem Padronizada TOTVS (JsonSchema)

Veja abaixo um exemplo de mensagem padronizada completa, em formato JSON, (incluindo header para controle da camada de EAI), trafegada no modelo Transactions:

Image Added

(informação) Clique aqui para obter mais informações sobre o modelo de integração Transactions


No caso de conteúdo trafegado no modelo para API, apenas com o conteúdo da propriedade "Content" será utilizado, desconsiderando o header.

Veja abaixo o exemplo do mesmo JSON definido acima, porém atendendo ao modelo de requestVeja abaixo o exemplo do mesmo JSON definido acima, porém como modelo de request/response de uma API.

Bloco de código
languagejs
titleMensagem Padronizada API
{
    "CompanyId": "1",
    "BranchId": "B1",
    "CompanyInternalId": "CompanyInternalId",
    "InternalId": "InternalId",
    "Code": "Code",
    "Description": "Description",
    "NatureType": "NatureType",
    "UseCategory": "UseCategory",
    "Blocked": 0    
}

(informação) Clique aqui para obter mais informações sobre integração via API

Definição da Mensagem no modelo JsonSchema

Abaixo encontram-se as regras para definir uma mensagem padronizada.

...


Nota
titleReutilização do Modelo

É obrigatório que, ao utilizar os dois modelos de integração disponíveis, o modelo de dados definido para retorno da API seja compatível com a definição da propriedade "Content", do modelo Transactions.

Definição da Mensagem no modelo JsonSchema

Abaixo encontram-se as regras para definir uma mensagem padronizada.

  1. Seguir a especificação do formato JsonSchema (draft 4 ou superior)
    1. Clique aqui para visualizar exemplos

...

  1. Seguir a definição de campos

...

  1. especificada
  2. Especificar propriedade X-Totvs

...

  1. de acordo com

...

  1. a documentação, incluindo quais ERPs implementam aquela mensagem e os campos relacionados. 
  2. Sempre que possível, utilizar padrões internacionaisPara saber se já existe uma mensagem de conta contábil, por exemplo, pesquise no Google usando "account xsd oasis repository".
    1. Mensagens criadas para atender uma exigência legal devem se ater estritamente ao que é definido pela legislação. Nestes casos, o nome da mensagem e dos campos podem ser em português, se a legislação exigir.

Âncora
xtotvs
xtotvs
X-TOTVS

Cabeçalho (Info)

Nesse tópico entraremos em maiores detalhes da propriedade x-totvs de dentro da info (cabeçalho). Caso queira entender sobre os outros campos da info do schema, visite nosso Guia de APIs e/ou verifique como a info foi descrita em outros schemas.

O objetivo do x-totvs da info O objetivo dessa propriedade é especificar quais produtos Totvs implementaram uma determinada propriedade da mensagem, e trazer outras informações sobre a mesma.

Bloco de código
languagejs
titleExemplo X-Totvs Info
"info": {
...
	"x-totvs": {
            "messageDocumentation": {
                "name": "StockTurnOver",
                "description": "Baixa de estoque",
                "segment": "Construção e Projetos",
				"domain": "Planejamento"
            },
            "productInformation": [
                {
                    "product": "RM",
                    "contact": "Bruno Barbosa de Souza",
                    "note": "GDP Inovação Const. e Proj.",
                    "adapter": "MovMovimentoData"
                },
                {
                    "product": "PROTHEUSProtheus",
                    "contact": "Eduardo de Souza",
                    "note": "GDP de Materiais",
                    "adapter": "MATI241"
                },
                {
                    "product": "PIMS",
                    "contact": "José Alberto da Silva",
                    "note": "",
                    "adapter": ""
                }
            ],
            "transactionDefinition": {
                "subType": "event",
                "businessContentType": {
                    "$ref": "#/definitions/BusinessContentType",
                    "type": "object"
                },
                "returnContentType": {
                    "$ref": "#/definitions/ReturnContentType",
                    "type": "object"
                }
            }
        }
}

...

MessageDocumentation

Contém nome, descrição e agrupador da mensagem (esse último definido através da propriedade das propriedades segment )e domain)

Campo Obrigatório

Aviso

Os campos "segment" e "domain" devem ser preenchidos de forma coerente com o que já está em uso nos outros schemas e APIs de nossa base (por exemplo, deve-se manter o "case" em uso, evitando variações como "HealthCare" em uma mensagem, e "Healthcare" em outra). Para isso, visite o API Reference e verifique como o que você quer adicionar está escrito.


(informação)
 Clique aqui Clique aqui para verificar os valores disponíveis para a propriedade segment

Campo Obrigatório

...

ProductInformation

  • product: produto ao qual aquelas informações do "productInformation" se referem;
  • contact: contato do desenvolvedor do schema;
  • note: observações referente ao produto, como regras específicas;
  • adapter: adapter correspondente ao schema.

Contém lista com nomes dos produtos em que essa mensagem foi implementada, qual o seu adapter correspondente e responsável.

...

Ao ativá-lo dessa maneira, a propriedade "Header" será preenchida automaticamente pelo EAI, enquanto a propriedade "Content" será substituída pelo objeto configurado.

Clique (informação) Clique aqui se existem dúvidas sobre integração via transaction

...

Bloco de código
languagejs
titleExemplo X-Totvs Propriedade
Code": {
                    "type": "string",
                    "description": "Código do País",
                    "x-totvs": [
                        {
                            "product": "Logix",
                            "Fieldfield": "paises.cod_pais",
                            "Requiredrequired": true,
                            "Typetype": "Char",
                            "length": "3",
							"note": "some info...",
                            "available": true,
                            "canUpdate": false
                        },
                        {
                            "product": "RMS",
                            "Fieldfield": "AA1CPAIS.PAIS_COD",
                            "Requiredrequired": true,
                            "Typetype": "integer",
                            "length": "6",
							"note": "some info...",
                            "available": true,
                            "canUpdate": false
                        }
                    ]
                },

Product

Nome do produto TOTVS do qual as outras informações se referem

Campo Obrigatório

Available 

Define se essa propriedade está ou não disponível 

Campo Obrigatório

CanUpdate

Define se essa propriedade pode ser atualizada

Campo Obrigatório

Field

product

Produto a que se refere essa informação.

Exemplos

product: “Protheus”

ou

product: “RM”

Aviso

O campo "product" deve ser preenchido de forma coerente com o que já está em uso nos outros schemas de nosso repositório (por exemplo, mantendo o mesmo "case"). Para isso, visite o API Reference e verifique como o produto que você quer adicionar está escrito.


Campo Obrigatório

field

A qual tabela e campo do produto A qual tabela.campo o campo da mensagem se refere.

Quando não for possível ou não for conveniente referenciar o campo, pode-se referenciar o atributo de um modelo conceitual ou intermediário.

Caso no produto este campo Caso no produto este campo possa estar em mais tabela (ou modelo), explicar o funcionamento.

Campo Obrigatório

Required

...

Exemplos

field: “clientes.cod_cliente”

ou

field: “cliente.cod_cliente para Type=Customer ou fornecedor.cod_fornecedor para Type=Vendor”

Campo Obrigatório

...

required

Tipo Obrigatoriedade do campo no modelo de dados. Caso haja alguma condição deve ser descrito no campo note.

Exemplos

required: true

required: false

Campo Obrigatório

type

Tipo de dado do campo no produto. Importante declarar aqui o tipo de dado do campo como produto. Importante declarar aqui o tipo do campo como é conhecido no produto.

Exemplos

type: ‘char’

type: ‘varchar’

type: ‘number’

type: ‘decimal’

type: ‘integer’

type: ‘boolean’

Campo Obrigatório

...

length

Tamanho do campo no produto, pode ser informado apenas o tamanho ou outro texto que descreva como este tamanho funciona.

Campo Obrigatório

Note

Complemento de informações sobre o campo se for o caso.

...

Exemplos

length: ‘20’

length: ‘8,2’

length: ’sempre implantado como 20, mas o cliente pode usar até 50’

Campo Obrigatório

note

Complemento de informações sobre o campo se for o caso, como por exemplo formato da informação, vínculo entre mensagens, escopo de dados (deve ser informado para campos que precisam respeitar uma relação específica de valores no produto, podendo ser informado aqui: 'lista fixa'   ou 'valores da tabela [tabela.campo]').

Exemplos

"note": "1=CEI;2=CNPJ;3=CPF;4=INCRA"

"note": "Campo obrigatório para o processo fiscal/TAF."

"note":"Segmento Principal"

Caso na mensagem tenha sido definida lista fixa, informar aqui a relação dos valores da mensagem com os valores do produto ou qualquer outra informação importante para descrever a representação deste conteúdo no produto em questão.

Campo Opcional

available

Indica se o campo esta implementado para o produto, para a determinada mensagem. Recebe um valor booleano:

Exemplos

available: true

available: false

Campo Obrigatório

canUpdate

Indica se o valor do campo pode ser atualizado na tabela. Recebe um valor booleano:

Exemplos

canUpdate: true

canUpdate: false

Campo Obrigatório


Segmentação do modelo de dados

Partindo de um jsonSchema como base, veremos a seguir um exemplo de uma possível implementação de API usando segmentação do modelo de dados.

O modelo de dados em JsonSchema será compartilhado no repositório do Github da TOTVS e deve ser referenciado na documentação da API pela sua URL, conforme apresentado no exemplo da sessão anterior.

Para este exemplo será utilizado o modelo Contract_2_000.json, representado graficamente a seguir (clique na imagem para expandir).

Contract_2_000.pngImage Added

Convertendo este modelo "como ele é" para o formato Json Schema, teríamos o seguinte documento (alguns elementos previstos para documentação da mensagem padronizada foram omitidos para melhor compreensão):

Bloco de código
titleContract_2_000 - monolítico
collapsetrue
{  
    "$schema": "https://raw.githubusercontent.com/totvs/ttalk-standard-message/master/jsonschema/schemas/events/contract_2_000.json#",
     
  (...),
  "definitions": {
      "Contract": {
        "type": "object",
        "properties": {
          "CompanyId": {
            "type": "string"
          },
          "BranchId": {
            "type": "string"
          },
          "CompanyInternalId": {
            "type": "string"
          },
          "InternalId": {
            "type": "string"
          },
          "ContractNumber": {
            "type": "string"
          },
          "ContractReview": {
            "type": "string"
          },
          "ProjectInternalId": {
            "type": "string"
          },
          "BeginDate": {
            "type": "string",
            "format": "date-time"
          },
          "FinalDate": {
            "type": "string",
            "format": "date-time"
          },
          "CustomerCode": {
            "type": "string"
          },
          "CustomerInternalId": {
            "type": "string"
          },
          "ContractTotalValue": {
            "type": "number",
            "format": "float"
          },
          "ContractTypeCode": {
            "type": "string"
          },
          "ContractTypeInternalId": {
            "type": "string"
          },
          "ListOfSheet": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "SheetNumber": {
                  "type": "string"
                },
                "SheetTypePoperty": {
                  "type": "string"
                },
                "UnitPrice": {
                  "type": "number",
                  "format": "float"
                },
                "SheetTotalValue": {
                  "type": "number",
                  "format": "float"
                },
                "ListOfItem": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "ItemCode": {
                        "type": "string"
                      },
                      "ItemInternalId": {
                        "type": "string"
                      },
                      "AccountantAcountCode": {
                        "type": "string"
                      },
                      "AccountantAcountInternalId": {
                        "type": "string"
                      },
                      "CostCenterCode": {
                        "type": "string"
                      },
                      "CostCenterInternalId": {
                        "type": "string"
                      },
                      "AccountingItemCode": {
                        "type": "string"
                      },
                      "AccountingItemInternalId": {
                        "type": "string"
                      },
                      "ClassValueCode": {
                        "type": "string"
                      },
                      "ClassValueInternalId": {
                        "type": "string"
                      },
                      "ItemQuantity": {
                        "type": "number",
                        "format": "float"
                      },
                      "ItemUnitPrice": {
                        "type": "number",
                        "format": "float"
                      },
                      "ItemTotalValue": {
                        "type": "number",
                        "format": "float"
                      },
                      "PercentageOfDiscount": {
                        "type": "number",
                        "format": "float"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Contrato"     
    }
  }
}

Entretanto, utilizar o modelo desta forma tem vários problemas como, por exemplo, na modificação do contrato, onde teríamos que enviar também as páginas (Sheet) do contrato e os itens das páginas.

Por isso, a segmentação do modelo de dados é permitida, desde que mantenha a estrutura e atributos do modelo JSON original.

Nosso modelo Json Schema poderia ser segmentado em 3 submodelos:

  • ContractModel, correspondente ao cabeçalho do contrato.
  • SheetModel, correspondente às folhas do contrato.
  • ItemModel, correspondente aos itens vinculados às folhas do contrato.

Convertendo isso para o modelo Json Schema, teríamos o seguinte, lembrando que elementos como as tags de documentação foram omitidos por questões didáticas.

Bloco de código
titleContract_2_000 - segmentado
collapsetrue
{
    "$schema": "https://raw.githubusercontent.com/totvs/ttalk-standard-message/master/jsonschema/schemas/events/contract_2_000.json#",
 
    (...),
    "definitions": {
        "ContractModel": {
            "type": "object",
            "properties": {
                "CompanyId": {
                    "type": "string"
                },
                "BranchId": {
                    "type": "string"
                },
                "CompanyInternalId": {
                    "type": "string"
                },
                "InternalId": {
                    "type": "string"
                },
                "ContractNumber": {
                    "type": "string"
                },
                "ContractReview": {
                    "type": "string"
                },
                "ProjectInternalId": {
                    "type": "string"
                },
                "BeginDate": {
                    "type": "string",
                    "format": "date-time"
                },
                "FinalDate": {
                    "type": "string",
                    "format": "date-time"
                },
                "CustomerCode": {
                    "type": "string"
                },
                "CustomerInternalId": {
                    "type": "string"
                },
                "ContractTotalValue": {
                    "type": "number",
                    "format": "float"
                },
                "ContractTypeCode": {
                    "type": "string"
                },
                "ContractTypeInternalId": {
                    "type": "string"
                },
                "ListOfSheet": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/SheetModel"
                    }
                }
            },
            "description": "Contrato"
        },
        "SheetModel": {
            "type": "object",
            "properties": {
                "SheetNumber": {
                    "type": "string"
                },
                "SheetTypePoperty": {
                    "type": "string"
                },
                "UnitPrice": {
                    "type": "number",
                    "format": "float"
                },
                "SheetTotalValue": {
                    "type": "number",
                    "format": "float"
                },
                "ListOfItem": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/ItemModel"
                    }
                }
            }
        },
        "ItemModel": {
            "type": "object",
            "properties": {
                "ItemCode": {
                    "type": "string"
                },
                "ItemInternalId": {
                    "type": "string"
                },
                "AccountantAcountCode": {
                    "type": "string"
                },
                "AccountantAcountInternalId": {
                    "type": "string"
                },
                "CostCenterCode": {
                    "type": "string"
                },
                "CostCenterInternalId": {
                    "type": "string"
                },
                "AccountingItemCode": {
                    "type": "string"
                },
                "AccountingItemInternalId": {
                    "type": "string"
                },
                "ClassValueCode": {
                    "type": "string"
                },
                "ClassValueInternalId": {
                    "type": "string"
                },
                "ItemQuantity": {
                    "type": "number",
                    "format": "float"
                },
                "ItemUnitPrice": {
                    "type": "number",
                    "format": "float"
                },
                "ItemTotalValue": {
                    "type": "number",
                    "format": "float"
                },
                "PercentageOfDiscount": {
                    "type": "number",
                    "format": "float"
                }
            }
        }
    }
}

Consequentemente, esta segmentação será refletida nos endpoints das APIs. Tomando por base a divisão realizada, teríamos o seguinte template:

Bloco de código
languagetext
/api/{agrupador}/v1/contracts/{ContractUniqueId}/sheets/{SheetNumber}/items/{ItemCode}

Neste template, temos as seguintes considerações:

  • O item ContractUniqueId deve ser um identificador único, já que a entidade Contract prevê uma chave composta. A forma como esta chave será representada ficará a cargo da área de negócio definir. Neste exemplo específico, poderiamos assumir a concatenação dos atributos ContractNumber e ContractReview, separados por "|". Ex: 1|1.
  • No nível de contracts utilizamos o submodelo ContractModel. Nos atributos ListOfSheet e ListOfItem, utilizamos os submodelos SheetModelItemModel quando os mesmos forem expandidos.
  • No nível de sheets, utilizamos apenas o submodelo SheetModel. O modelo ItemModel será utilizado quando o atributo ListOfItem for expandido.
  • No nível de items, utilizamos apenas o submodelo ItemModel.
  • Observe a equivalencia entre o item do modelo e o item de path correspondente:
    • ListOfSheet (atributo de ContractModel) equivale a sheets.
    • ListOfItem (atributo de SheetModel) equivale a items.

Nos exemplos a seguir veremos a utilização dos possíveis endpoints e seus respectivos modelos:

Inclusão de um contrato de forma completa

Bloco de código
languagejs
titlePOST /v1/contracts/
collapsetrue
{
  "CompanyId": "1",
  "BranchId": "1",
  "CompanyInternalId": "1",
  "InternalId": "1|1|1",
  "ContractNumber": "1",
  "ContractReview": "1",
  "ProjectInternalId": "1|1",
  "BeginDate": "2018-07-25T14:24:00",
  "FinalDate": "2019-07-25T14:24:00",
  "CustomerCode": "1",
  "CustomerInternalId": "1",
  "ContractTotalValue": 1.0,
  "ContractTypeCode": "1",
  "ContractTypeInternalId": "1",
  "ListOfSheet": [{
      "SheetNumber": "1",
      "SheetTypePoperty": "1",
      "UnitPrice": 1.0,
      "SheetTotalValue": 1.0,
      "ListOfItem": [{
          "ItemCode": "1",
          "ItemInternalId": "1|1",
          "AccountantAcountCode": "0001",
          "AccountantAcountInternalId": "1|0001",
          "CostCenterCode": "1",
          "CostCenterInternalId": "1|1",
          "AccountingItemCode": "111",
          "AccountingItemInternalId": "1|111",
          "ClassValueCode": "001",
          "ClassValueInternalId": "1|001",
          "ItemQuantity": 1.0,
          "ItemUnitPrice": 1.0,
          "ItemTotalValue": 1.0,
          "PercentageOfDiscount": 0.0
        }
      ]
    }
  ]
}

Inclusão de um contrato sem folhas (se a regra de negócio permitir)

Bloco de código
languagejs
titlePOST /v1/contracts/
collapsetrue
{
  "CompanyId": "1",
  "BranchId": "1",
  "CompanyInternalId": "1",
  "InternalId": "1|1|1",
  "ContractNumber": "1",
  "ContractReview": "1",
  "ProjectInternalId": "1|1",
  "BeginDate": "2018-07-25T14:24:00",
  "FinalDate": "2019-07-25T14:24:00",
  "CustomerCode": "1",
  "CustomerInternalId": "1",
  "ContractTotalValue": 1.0,
  "ContractTypeCode": "1",
  "ContractTypeInternalId": "1",
  "ListOfSheet": []
}

Recuperando contratos (apenas cabeçalho, 1a página, até o limite de uma página)

Bloco de código
languagejs
titleGET /v1/contracts
collapsetrue
{
  "hasNext": false,
  "items": [{
      "_expandables": ["ListOfSheet"],
      "CompanyId": "1",
      "BranchId": "1",
      "CompanyInternalId": "1",
      "InternalId": "1|1|1",
      "ContractNumber": "1",
      "ContractReview": "1",
      "ProjectInternalId": "1|1",
      "BeginDate": "2018-07-25T14:24:00",
      "FinalDate": "2019-07-25T14:24:00",
      "CustomerCode": "1",
      "CustomerInternalId": "1",
      "ContractTotalValue": 1.0,
      "ContractTypeCode": "1",
      "ContractTypeInternalId": "1",
      "ListOfSheet": []
    }
  ]
}

Recuperando um contrato, expandindo os atributos ListOfSheet e ListOfItem

Bloco de código
languagejs
titleGET /v1/contracts/1|1?expand=ListOfSheet.ListOfItem
collapsetrue
{
  "_expandables": ["ListOfSheet"],
  "CompanyId": "1",
  "BranchId": "1",
  "CompanyInternalId": "1",
  "InternalId": "1|1|1",
  "ContractNumber": "1",
  "ContractReview": "1",
  "ProjectInternalId": "1|1",
  "BeginDate": "2018-07-25T14:24:00",
  "FinalDate": "2019-07-25T14:24:00",
  "CustomerCode": "1",
  "CustomerInternalId": "1",
  "ContractTotalValue": 1.0,
  "ContractTypeCode": "1",
  "ContractTypeInternalId": "1",
  "ListOfSheet": [{
      "_expandable": ["ListOfItem"],
      "SheetNumber": "1",
      "SheetTypePoperty": "1",
      "UnitPrice": 1.0,
      "SheetTotalValue": 1.0,
      "ListOfItem": [{
          "ItemCode": "1",
          "ItemInternalId": "1|1",
          "AccountantAcountCode": "0001",
          "AccountantAcountInternalId": "1|0001",
          "CostCenterCode": "1",
          "CostCenterInternalId": "1|1",
          "AccountingItemCode": "111",
          "AccountingItemInternalId": "1|111",
          "ClassValueCode": "001",
          "ClassValueInternalId": "1|001",
          "ItemQuantity": 1.0,
          "ItemUnitPrice": 1.0,
          "ItemTotalValue": 1.0,
          "PercentageOfDiscount": 0.0
        }
      ]
    }
  ]
}

Incluindo uma folha no contrato

Bloco de código
languagejs
titlePOST /v1/contracts/1|1/sheets
collapsetrue
{
  "SheetNumber": "1",
  "SheetTypePoperty": "1",
  "UnitPrice": 1.0,
  "SheetTotalValue": 1.0,
  "ListOfItem": [{
      "ItemCode": "1",
      "ItemInternalId": "1|1",
      "AccountantAcountCode": "0001",
      "AccountantAcountInternalId": "1|0001",
      "CostCenterCode": "1",
      "CostCenterInternalId": "1|1",
      "AccountingItemCode": "111",
      "AccountingItemInternalId": "1|111",
      "ClassValueCode": "001",
      "ClassValueInternalId": "1|001",
      "ItemQuantity": 1.0,
      "ItemUnitPrice": 1.0,
      "ItemTotalValue": 1.0,
      "PercentageOfDiscount": 0.0
    }
  ]
}

Incluindo um item de uma folha do contrato

Bloco de código
languagejs
titlePOST /v1/contracts/1|1/sheets/1/items
collapsetrue
{
  "ItemCode": "1",
  "ItemInternalId": "1|1",
  "AccountantAcountCode": "0001",
  "AccountantAcountInternalId": "1|0001",
  "CostCenterCode": "1",
  "CostCenterInternalId": "1|1",
  "AccountingItemCode": "111",
  "AccountingItemInternalId": "1|111",
  "ClassValueCode": "001",
  "ClassValueInternalId": "1|001",
  "ItemQuantity": 1.0,
  "ItemUnitPrice": 1.0,
  "ItemTotalValue": 1.0,
  "PercentageOfDiscount": 0.0
}

Eliminando um item de uma folha

  • DELETE /v1/contracts/1|1/sheets/1/items/1

Eliminando uma folha de um contrato

  • DELETE /v1/contracts/1|1/sheets/1


Âncora
jschema-examples
jschema-examples
Exemplos JsonSchema:

Json Schema da Mensagem Branch 2.001 : https://raw.githubusercontent.com/totvs/ttalk-standard-message/master/jsonschema/schemas/Branch_2_001.json

...

Exemplos Oficiais site json-schema: https://json-schema.org/learn/miscellaneous-examples.html

Âncora
int-examples
int-examples
Padrões internacionais de mensagens para integração

http://docs.oasis-open.org/ubl/prd1-UBL-2.1/UBL-2.1.html

...