Pular para o conteúdo principal

Guia de integração — Tabelas e campos extra

Microserviço: XDPeople.Soba.WebAPI (Core API)
Autenticação: token Bearer (JWT) e contexto de tenant — ver Login Combinado


Introdução

A funcionalidade de tabelas e campos extra permite definir, por tipo de entidade, um conjunto de tabelas lógicas e campos com persistência em tabelas físicas na base de dados, além de valores por instância da entidade (por chave primária).

Dois grupos de endpoints cobrem casos distintos:

  1. Configuração — criar, alterar e remover tabelas e campos; obter a configuração completa para o segmento {entityTypeName} na rota.
  2. Valores — ler e gravar (upsert) os valores extra de uma instância, identificada por entityKeyId.

Ver Identificador do tipo de entidade para os valores suportados de {entityTypeName} nas rotas.


Prefixo e rotas

ÁreaPrefixo de URL
Configuração/gateway/extra-tables-fields-config/{entityTypeName}
Valores/gateway/extra-fields-values/{entityTypeName}

Os segmentos {entityTypeName} e {entityKeyId} devem ser codificados para URL quando contiverem caracteres reservados.


Identificador do tipo de entidade (entityTypeName)

O segmento {entityTypeName} na URL é o identificador de tipo reconhecido pelo servidor. A comparação é insensível a maiúsculas/minúsculas. Qualquer outro valor devolve ExtraTablesAndFields.UnsupportedEntityType.

entityTypeNameentityKeyId nos valores
AccountHeadingBEnúmero inteiro
AccountTypeBEnúmero inteiro
AdvancedDiscounttexto até 50 caracteres
BusinessAccountnúmero inteiro
EntityContactsBEnúmero inteiro
Entitytexto até 25 caracteres
EntityAddressnúmero inteiro
EntityGroupsnúmero inteiro
EntityTypesnúmero inteiro
FixedExpensesAndRevenuesnúmero inteiro
ItemBarcodeBEnúmero inteiro
ItemBEtexto até 60 caracteres
ItemGroupBEnúmero inteiro
LoadUnloadPlaceBEnúmero inteiro
PointsConfigGUID
PriceTablenúmero inteiro
SalesPromoBEnúmero inteiro
SalesZonenúmero inteiro
UserBEnúmero inteiro
UserGroupBEnúmero inteiro
WarehouseBEnúmero inteiro
XDfree01texto até 25 caracteres
XDfree02texto até 25 caracteres
XDfree03texto até 25 caracteres
XConfigCurrencynúmero inteiro
XConfigItemUnitnúmero inteiro
XConfigPaymentModenúmero inteiro
XConfigPaymentTypenúmero inteiro

O campo entityTypeName no corpo JSON do GET de configuração corresponde ao valor pedido na rota.


Nome da tabela física

Para cada tabela lógica com nome Name e tipo de entidade entityTypeName, a tabela física segue o padrão:

{Name}_{entityTypeName_em_minúsculas}_extrafields

Exemplo: tabela lógica Extras com entityTypeName ItemBEExtras_itembe_extrafields.

Este nome aparece na resposta de configuração como physicalTableName.


Endpoints — Configuração

Base: /gateway/extra-tables-fields-config/{entityTypeName}

MétodoURLDescriçãoResposta de sucesso
GET/gateway/extra-tables-fields-config/{entityTypeName}Lista tabelas e respetivos campos.200 — corpo ExtraFieldsConfigurationResponse
POST/gateway/extra-tables-fields-config/{entityTypeName}/tablesCria uma tabela lógica e a tabela física.200 — corpo da tabela criada
PUT/gateway/extra-tables-fields-config/{entityTypeName}/tables/{tableGuid}Atualiza metadados da tabela (não altera o nome lógico).204
DELETE/gateway/extra-tables-fields-config/{entityTypeName}/tables/{tableGuid}Remove configuração, campos associados e elimina a tabela física.204
POST/gateway/extra-tables-fields-config/{entityTypeName}/tables/{tableGuid}/fieldsCria um campo (coluna física).200 — corpo do campo criado
PUT/gateway/extra-tables-fields-config/{entityTypeName}/fields/{fieldGuid}Atualiza metadados do campo (não altera o nome nem o tipo).204
DELETE/gateway/extra-tables-fields-config/{entityTypeName}/fields/{fieldGuid}Remove o campo e remove a coluna da tabela física.204

Corpo da configuração (GET /gateway/extra-tables-fields-config/{entityTypeName})

Propriedades principais (JSON em camelCase):

PropriedadeTipoDescrição
entityTypeNamestringIgual ao identificador que foi usado no segmento da rota do pedido (o servidor devolve-o de volta no corpo).
tablesarrayTabelas lógicas ordenadas na resposta.

Cada elemento de tables:

PropriedadeTipoDescrição
guidstringIdentificador único da tabela na configuração.
ordernumberOrdem de apresentação (≥ 0).
namestringNome lógico da tabela (identificador).
descriptionstringTexto descritivo (pode ser vazio na criação).
permissionTypenumberVer Permissões da tabela.
allowInDocumentsbooleanPermissão de uso em documentos.
allowMultipleRegistriesbooleanSe true, a tabela admite vários registos por entidade; ver Valores por instância.
physicalTableNamestringNome da tabela na base de dados.
fieldsarrayCampos da tabela.

Cada elemento de fields:

PropriedadeTipoDescrição
guidstringIdentificador único do campo.
ordernumberOrdem (≥ 0).
namestringNome lógico da coluna.
descriptionstringDescrição (obrigatória na criação; 1–500 caracteres).
fieldTypestringTipo lógico; ver Tipos de campo.
lengthnumberPara String, comprimento máximo; para Decimal, casas decimais; noutros casos segue regras do servidor (1–16383).
requiredbooleanCampo obrigatório na configuração.
inactivebooleanSe true, o campo é ignorado na leitura de valores.
tableNamestringNome lógico da tabela a que o campo pertence.
valuesobjectMapa índice → texto (opções quando aplicável).
canEditValuesbooleanSe as opções são editáveis em runtime.
entityTypestring | nullTipo de entidade alvo para pesquisa (campo estilo lookup); opcional.

Criar tabela (POST /gateway/extra-tables-fields-config/{entityTypeName}/tables)

PropriedadeObrigatórioRegras
namesim1–25 caracteres; primeiro carácter letra; restantes letras ou dígitos (^[a-zA-Z][a-zA-Z0-9]*$).
descriptionsimAté 2000 caracteres; pode ser string vazia.
ordersim≥ 0.
permissionTypesimEntre 0 e 2; ver Permissões da tabela.
allowInDocumentssimboolean
allowMultipleRegistriessimboolean

O servidor valida o nome lógico e recusa a criação se já existir uma tabela física com o nome derivado (ExtraTablesAndFields.PhysicalTableExists).

Atualizar tabela (PUT /gateway/extra-tables-fields-config/{entityTypeName}/tables/{tableGuid})

Corpo: description, order, permissionType, allowInDocuments, allowMultipleRegistries (o nome lógico da tabela não é alterável por este endpoint).

Criar campo (POST /gateway/extra-tables-fields-config/{entityTypeName}/tables/{tableGuid}/fields)

PropriedadeObrigatórioRegras
namesimMesmas regras de identificador que o nome da tabela lógica (1–25, letra inicial).
descriptionsim1–500 caracteres.
ordersim≥ 0.
fieldTypesimString não vazia até 16 caracteres; ver Tipos de campo.
lengthsim1–16383 (significado conforme tipo).
requiredsimboolean
inactivesimboolean
valuessimObjeto com chaves numéricas e valores texto (pode ser {}).
canEditValuessimboolean
entityTypenãoAté 32 caracteres; vazio ou omitido = sem lookup.

Atualizar campo (PUT /gateway/extra-tables-fields-config/{entityTypeName}/fields/{fieldGuid})

Corpo: description, order, length, required, inactive, values, canEditValues, entityType. O nome e o tipo do campo não são alterados por este fluxo.

Permissões da tabela

Valores de permissionType (alinhados ao enumerado interno):

ValorSignificado
0Todos os utilizadores
1Utilizador atual
2Grupos de utilizadores

Tipos de campo

Valores típicos de fieldType na criação (mapeados internamente para tipos CLR e DDL):

fieldTypeUso resumido
StringTexto; length = comprimento máximo da coluna de texto.
LongTextTexto longo
Int32Número inteiro.
DecimalDecimal; length = casas decimais.
BooleanVerdadeiro/falso.
DateTimeData e hora.
DateData (armazenamento como data/hora).
GuidIdentificador único.
ImageImagem

Tipos não reconhecidos tendem a ser tratados como texto.


Endpoints — Valores por instância

Base: /gateway/extra-fields-values/{entityTypeName}

MétodoURLDescriçãoResposta de sucesso
GET.../{entityKeyId}Devolve todos os valores extra aplicáveis à instância.200
PUT.../{entityKeyId}Grava valores (upsert: insere linha se não existir, senão atualiza).204

Formato das chaves

Todas as chaves no objeto values usam o formato {nomeTabelaLógica}.{nomeCampo}, por exemplo Extras.Notas.

A correspondência é insensível a maiúsculas/minúsculas na chave. Chaves que não correspondam a nenhum campo ativo numa tabela de registo único são ignoradas no PUT (não provocam erro).

Corpo do PUT

{
"values": {
"MinhaTabela.CampoTexto": "nota",
"MinhaTabela.CampoDecimal": 12.34,
"MinhaTabela.CampoBool": true
}
}

Conversão na gravação

Para cada campo, o servidor converte o valor recebido consoante o tipo:

fieldTypeTratamento
Int32Inteiro.
DecimalDecimal.
BooleanBooleano.
DateTime, DateData/hora (se vier como texto, é interpretada no servidor).
OutrosPersistido como texto a partir do valor recebido.

Valores JSON nulos ou ausentes podem ser persistidos como SQL NULL conforme a coluna.

Corpo do GET

A mesma estrutura { "values": { "Tabela.Campo": ... } }. Para tipos booleano, inteiro e decimal, a resposta normaliza para tipos JSON nativos; para restantes tipos o valor devolvido reflete o que veio da base (por exemplo datas como string ou valor nativo, conforme o controlador da base).


Erros (códigos estáveis)

Os problemas são devolvidos no formato de erro HTTP do gateway; códigos de negócio relevantes:

CódigoSituação típica
ExtraTablesAndFields.UnsupportedEntityTypeentityTypeName não suportado.
ExtraTablesAndFields.InvalidTableNameNome de tabela ou campo inválido face às regras de identificador (o mesmo código é usado na validação do nome do campo na criação).
ExtraTablesAndFields.TableNotFoundtableGuid desconhecido para o tipo.
ExtraTablesAndFields.FieldNotFoundfieldGuid desconhecido (ou tabela pai inconsistente na eliminação).
ExtraTablesAndFields.PhysicalTableExistsJá existe tabela física com o nome gerado.
ExtraTablesAndFields.DdlFailedFalha ao aplicar DDL (criar/alterar estrutura).
ExtraTablesAndFields.SaveFailedFalha ao guardar metadados de configuração.
ExtraTablesAndFields.DeleteFailedFalha ao eliminar tabela/campo.
ExtraTablesAndFields.ReadValuesFailedFalha ao ler valores.
ExtraTablesAndFields.SaveValuesFailedFalha ao gravar valores.

Respostas 404 aplicam-se a tabela/campo em falta nas operações de configuração; 400 a validação de tipo de entidade ou payload; 500 a falhas internas ou DDL conforme o mapeamento do gateway.


Exemplo mínimo (configuração + valores)

  1. POST /gateway/extra-tables-fields-config/ItemBE/tables com corpo, por exemplo:
{
"name": "Tabela",
"description": "Tabela 1",
"order": 2,
"permissionType": 0,
"allowInDocuments": false,
"allowMultipleRegistries": false
}
  1. Com o guid da tabela devolvido POST /gateway/extra-tables-fields-config/ItemBE/tables/cfbe5b29-5777-4c4a-84c3-68c065811ed7/fields.
{
"name": "Campo1",
"description": "Campo1 desc",
"order": 1,
"fieldType": "String",
"length": 255,
"required": true,
"inactive": false,
"values": {},
"canEditValues": false,
"entityType": "Entity"
}
  1. GET /gateway/extra-tables-fields-config/ItemBE — obter tables e fields existentes (exemplo para artigos).
{
"entityTypeName": "ItemBE",
"tables": [
{
"guid": "cfbe5b29-5777-4c4a-84c3-68c065811ed7",
"order": 2,
"name": "Tabela",
"description": "Tabela 1",
"permissionType": 0,
"allowInDocuments": false,
"allowMultipleRegistries": false,
"physicalTableName": "Tabela_itembe_extrafields",
"fields": [
{
"guid": "3d63058f-1df6-439e-9d9b-f04e55103d3c",
"order": 1,
"name": "Campo1",
"description": "Campo1 desc",
"fieldType": "String",
"length": 255,
"required": true,
"inactive": false,
"tableName": "Tabela",
"values": {},
"canEditValues": false,
"entityType": "Entity"
}
]
}
]
}
  1. Envio de valores PUT /gateway/extra-fields-values/ItemBE/3
{
"values": {
"Tabela.Campo1": "2"
}
}

Última atualização: 14 de Maio de 2026