Introdução à API v0

A API disponibilizada inicialmente (v0) permite aceder a rotas para criação e edição de documentos das áreas comercial e de contabilidade. Quando se pretende utilizar rotas de contabilidade é necessário que a sessão esteja associada a um exercício contabilístico. Note-se que a sessão da API está associada a um utilizador do tipo Empresário, pelo que o acesso de leitura e escrita via API dependem das permissões que esse Empresário tenha aos Exercícios fiscais da empresa. A seleção do exercício usado na sessão da API está documentada na autenticação.

Nas páginas seguintes são descritas as rotas em maior detalhe, e apresentados exemplos da sua utilização.

A documentação Swagger (OpenAPI) para da versão inicial está disponível em: https://app.swaggerhub.com/apis/gitbook/APIv0/1.0

Formato da API

A versão v0 da API foi desenvolvida com base na especificação de JSON:API version 1.0. Na altura em que foi implementada a nossa API inicial, a especificação JSON:API 1.0 ainda estava em discussão e incluía a execução de operações através da extensão 'JSON Patch', que foi incluída parcialmente na API v0.

Ordenação

A ordenação de pedidos que devolvem coleções no data, pode ser indicada usando o parâmetro sort=<criteria>, de acordo com o formato de ordenação da JSON:API. Um exemplo de ordenação pelo campo date por ordem descendente, seguido de ordenação por document_type por ordem ascendente seria:

sort=-date,document_type

Paginação

A JSON:API é agnóstica em relação às estratégias de paginação implementadas no servidor. Pelo que optamos por implementar uma estratégia pelo número da página, ou seja usando os parâmetros page[number] e page[size], por exemplo:

page[number]=1&page[size]=10

Filtragem

Em relação a critérios de filtragem, a especificação apenas indica que deve ser usado o parâmetro filter. Na nossa implementação da API, optamos por usar este parâmetro num formato de texto livre, no formato filter="<texto>", ou como filtro específico de um campos, no formato filter[<field>]=<value>. Sendo possível combinar vários critérios de filtragem, como por exemplo:

filter[document_type]=FT&filter[status]=1&filter="documents.date>'2024-01-01'"

Quando se usa critérios pode ser conveniente saber o número de elementos que obedecem ao critério de filtragem (total) e o número total de elementos (grand-total) que seriam devolvidos sem filtragem. Essa informação pode ser obtida com o parâmetro totals=1, este parâmetro também pode ser usado com o valor zero sendo equivalente a não estar definido.

Assim, num pedido com totals=1 o número de elementos filtrados e sem filtragem são devolvidos no meta:

{
    "data": [...],
    "meta": {
        "total": "12",
        "grand-total": "83"
    }
}

Inclusão de recursos relacionados

Quando se faz um pedido, podemos incluir na resposta a informação dos recursos relacionados. Por exemplo quando se consulta um documento de vendas podemos pedir para incluir na resposta as linhas do documento, e o cliente assim como a morada deste:

include=lines,customer.addresses

Note-se que não é possível controlar a ordenação dos recursos incluídos, uma vez que não é relevante.

Exemplo de resposta:

{
    "data": [
        {
            "type": "commercial_sales_documents",
            "id": "4",
            "attributes": {...},
            "relationships": {
                ...
                "customer": {
                    "data": {
                        "type": "customers",
                        "id": "47"
                    }
                },
                "lines": {
                    "data": [
                        {
                            "type": "commercial_sales_document_lines",
                            "id": "4"
                        }
                    ]
                },
                ...
            }
        }
    ],
    "included": [
        {
            "type": "addresses",
            "id": "53",
            "attributes": {
                "is_primary": true,
                "name": "Sede",
                ...
            },
            "relationships": {...}
        },
        {
            "type": "commercial_sales_document_lines",
            "id": "4",
            "attributes": {...},
            "relationships": {...}
        },
        {
            "type": "customers",
            "id": "47",
            "attributes": {...},
            "relationships": {
                "addresses": {
                    "data": [
                        {
                            "type": "addresses",
                            "id": "53"
                        }
                    ]
                },
                ...
            }
        }
    ]
}

Campos na resposta

Para optimizar a quantidade de dados enviados na resposta, é possível indicar no pedido quais são os campos que devem ser devolvidos para cada tipo de recurso. Usando o exemplo anterior de consulta de um documento de vendas, com inclusão das linhas do documento, o cliente e a morada deste, podemos definir quais os campos a devolver para cada um destes recursos.

fields[addresses]=city&fields[customers]=business_name&fields[commercial_sales_documents]=document_no,date,gross_total&fields[commercial_sales_document_lines]=description,amount

Assim, a resposta completa seria apenas:

{
    "data": [
        {
            "type": "commercial_sales_documents",
            "id": "4",
            "attributes": {
                "document_no": "FT 2024/3",
                "date": "2024-01-12",
                "gross_total": 363
            }
        }
    ],
    "included": [
        {
            "type": "addresses",
            "id": "53",
            "attributes": {
                "city": "Madrid"
            }
        },
        {
            "type": "commercial_sales_document_lines",
            "id": "4",
            "attributes": {
                "description": "Serviço de atualização",
                "amount": 363
            }
        },
        {
            "type": "customers",
            "id": "47",
            "attributes": {
                "business_name": "Hispanic Business, S.L."
            }
        }
    ]
}

Extensão JSON Patch

Embora a extensão JSON Patch, entretanto tenha sido descontinuada, a documentação desta extensão, imediatamente antes de ser descontinuada, e com base na qual foram implementadas operação na APIv0, encontra-se disponível no histórico da extensão JSON Patch.

Caraterísticas dos pedidos

A utilização de operações foi implementada na API v0 sem que seja necessário definir os headers específicos de extensão. Ou seja, embora a especificação indique que é necessário identificar a extensão:

Content-Type: application/vnd.api+json; ext=jsonpatch
Accept: application/vnd.api+json; ext=jsonpatch

Os pedidos devem ser feitos de forma genérica indicando apenas que se está a usar uma API JSON:

Content-Type: application/vnd.api+json
Accept: application/vnd.api+json

Operações

São suportados os 3 tipos de operação previstos na especificação da extensão: "add", "replace" e "remove". Alguns exemplos de utilização estão na documentação de contabilização.

Last updated