Pular para o conteúdo principal

Guia do módulo SAT — Assistência Técnica

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

Base URL

Os endpoints de gestão vivem em https://api.xdsoba.com/gateway/... e exigem o cabeçalho Authorization: Bearer {token}.

Introdução​

O módulo SAT (Serviço de Assistência Técnica) cobre o ciclo completo de assistência no Soba: catálogos, contratos de assistência, equipamentos do cliente, ordens de serviço, intervenções técnicas, fecho, faturação e RMA (devoluções), mais relatórios próprios.

Visão geral do fluxo​

PassoO quêOnde no guia
1Preparar catálogos (uma vez por tenant)Catálogos
1.5Configuração do módulo SATConfiguração
2Contratos de assistência (opcional)Contratos
3Registar equipamento do clienteEquipamento
4Abrir, fechar e reabrir a Ordem de ServiçoOrdem de serviço
4.1Linhas facturáveis (details)Ordem de serviço
5Registar intervençõesIntervenções
5.1Ligar intervenções à Ordem de ServiçoLigações
6Pré-visualizar e emitir faturaFaturação
—Devoluções (fluxo paralelo)RMA
—Ligar RMA à Ordem de ServiçoLigações

Mapa rápido de recursos​

ÁreaPrefixo típico
Equipamento/gateway/equipment-type, equipment-brand, equipment-model, equipment
Ordem de Serviço/gateway/service-order-catalog, service-order-state, service-order, sat-config
Intervenção/gateway/intervention-config, intervention
Contrato/gateway/entity-contract-group, entity-contract-type, entity-contract
Faturação/gateway/service-order/invoice/preview, /gateway/intervention/invoice/preview, /gateway/invoice/invoices
RMA/gateway/return-type, return-reason, rma

Ligar intervenções e RMA à Ordem de Serviço​

A ordem de serviço tem de existir primeiro: a ligação usa sempre o GUID devolvido no POST /gateway/service-order (ou obtido em GET /gateway/service-order/{series}/{number}). Não é possível criar a ordem de serviço e as suas intervenções no mesmo pedido — o payload da ordem de serviço não aceita uma lista de intervenções.

Passo 5.1 — Ligar intervenções à Ordem de Serviço​

Opção A — ligar ao criar a intervenção​

POST /gateway/intervention
Content-Type: application/json
Authorization: Bearer {token}
{
"type": "DIAG",
"status": "CURSO",
"description": "Diagnóstico inicial da fonte de alimentação",
"userId": 1,
"entityKeyId": "C0001",
"equipmentId": 123,
"serviceOrderGuid": "GUID-DA-ORDEM",
"concluded": true,
"discountTime": 1.5,
"discountTimeItemId": "MO-HORA",
"details": [
{
"itemKeyId": "FONTE-19V",
"itemDescription": "Fonte de alimentação 19V / 65W",
"quantity": 1,
"retailPrice": 45.00
}
]
}

A API valida que a ordem de serviço existe e copia dela a série e o número, devolvidos depois em serviceOrderSeries e serviceOrderNumber. Se a ordem de serviço não existir, devolve 404 ServiceOrder.NotFound.

atenção

Se o serviceOrderGuid for enviado vazio ou não for um GUID válido, o campo é ignorado em silêncio e a intervenção fica sem ordem de serviço — não há erro. Confirme sempre com o GET da ordem de serviço.

atenção

Não há herança de dados da ordem de serviço: entityKeyId, equipmentId e entityContractId têm de ser enviados no payload da intervenção, mesmo que a ordem de serviço já os tenha.

Opção B — associar uma intervenção que já existe​

POST /gateway/service-order/GUID-DA-ORDEM/interventions/46
Authorization: Bearer {token}

Resposta: 204 No Content, sem corpo. Para ligar várias intervenções à mesma ordem de serviço, repita a chamada — uma por intervenção; não existe endpoint em lote:

POST /gateway/service-order/GUID-DA-ORDEM/interventions/46
Authorization: Bearer {token}
POST /gateway/service-order/GUID-DA-ORDEM/interventions/47
Authorization: Bearer {token}
POST /gateway/service-order/GUID-DA-ORDEM/interventions/48
Authorization: Bearer {token}
SituaçãoResposta
Associada com sucesso204
Já estava ligada a esta mesma ordem de serviço204 (a operação é idempotente)
Já está ligada a outra ordem de serviço409 Intervention.AlreadyLinked
Ordem de Serviço inexistente404 ServiceOrder.NotFound
Intervenção inexistente404 Intervention.NotFound

Consultar as intervenções de uma Ordem de Serviço: GET /gateway/service-order/{guid}, na propriedade interventions[]. Não existe GET /service-order/{guid}/interventions, e a listagem GET /gateway/intervention não filtra por ordem de serviço.

Remover uma intervenção da Ordem de Serviço​

DELETE /gateway/service-order/GUID-DA-ORDEM/interventions/46
Authorization: Bearer {token}
atenção

Este endpoint não desliga a intervenção da ordem de serviço: elimina-a (remoção lógica). Não há operação de “unlink” que devolva a intervenção ao estado de intervenção isolada. Se a intervenção não pertencer àquela ordem de serviço, devolve 409 Intervention.NotLinkedToServiceOrder.

Editar depois de ligada​

Depois de ligada, a intervenção só se edita “através” da ordem de serviço. O PUT /gateway/intervention/{id} devolve 409 Intervention.CannotEditLinkedToServiceOrder — a não ser que o corpo do pedido repita o mesmo serviceOrderGuid, que é o sinal de que a edição vem do contexto da ordem de serviço (a mesma excepção se aplica a intervenções já facturadas, que de outro modo devolvem 409 Intervention.CannotEditInvoiced).

atenção

O serviceOrderGuid é ignorado no update: não serve para mudar a intervenção de ordem de serviço. Para mudar a ligação use o endpoint de associação, e só é possível se a intervenção não estiver já ligada a outra ordem de serviço.

RMA — ligar a uma ordem de serviço​

Também aqui a ordem de serviço tem de estar criada primeiro, porque a ligação se faz pelo GUID dela. Há duas formas, e a escolha tem consequências.

Opção A — declarar a Ordem de Serviço no próprio RMA​

POST /gateway/rma
Content-Type: application/json
Authorization: Bearer {token}
{
"rmaId": "RMA-2026-001",
"rmaType": 1,
"equipmentId": 123,
"quantity": 1,
"returnType": "Garantia",
"returnReason": "Avaria de fabrico",
"serviceOrderGuid": "GUID-DA-ORDEM"
}

Funciona igualmente no PUT /gateway/rma/{guid}, o que permite ligar a posteriori um RMA já criado.

atenção

Ao contrário da intervenção, o serviceOrderGuid do RMA não é validado: um GUID errado é aceite e o RMA fica órfão, sem aparecer no detalhe da Ordem de Serviço e sem qualquer erro. Confirme sempre com GET /gateway/service-order/{guid}.

Opção B — enviar os RMAs no payload da Ordem de Serviço​

PUT /gateway/service-order/GUID-DA-ORDEM
Content-Type: application/json
Authorization: Bearer {token}
{
"status": "RECEB",
"priority": "URG",
"assistanceTypeKeyId": "REP",
"rmaList": [
{ "rmaId": "RMA-2026-001", "rmaType": 1, "equipmentId": 123, "quantity": 1 },
{ "rmaId": "RMA-2026-002", "rmaType": 2, "componentKeyId": "FONTE19V", "quantity": 1 }
]
}

A API preenche automaticamente o serviceOrderGuid e a serviceOrderDesignation de cada RMA a partir da ordem, e gera o GUID dos que não o trouxerem.

atenção

No PUT, o rmaList é uma substituição total e destrutiva: os RMAs existentes da Ordem de Serviço são apagados fisicamente da base de dados e recriados a partir da lista enviada — com GUIDs novos, se os não incluir. Omitir o campo (null) preserva os RMAs actuais; enviar [] apaga todos.

atenção

Por esta via, as validações do recurso RMA não são aplicadas: rmaId duplicado, existência de returnType/returnReason e a obrigatoriedade de equipmentId (tipo Equipment) ou componentKeyId (tipo Component) só são verificadas no POST/PUT /gateway/rma. Para dados vindos de integrações, prefira a Opção A.

atenção

Se a Ordem de Serviço estiver fechada, o PUT /gateway/service-order/{guid} devolve 409 ServiceOrder.CannotEditClosed. Nesse caso, ligue ou altere o RMA pelo PUT /gateway/rma/{guid}.

Desligar um RMA da Ordem de Serviço: PUT /gateway/rma/{guid} com serviceOrderGuid vazio, ou retirando-o do rmaList da ordem (lembrando que isso apaga e recria os restantes).

Consultar os RMAs de uma Ordem de Serviço: GET /gateway/service-order/{guid}, na propriedade rmaList[]. Não existe GET /service-order/{guid}/rmas.

Resumo das duas ligações​

Intervenção → Ordem de ServiçoRMA → Ordem de Serviço
Ordem tem de existir antesSimSim
Campo de ligaçãoserviceOrderGuid (opcional)serviceOrderGuid (opcional)
Existência da Ordem de Serviço é validadaSim (404 se não existir)Não (fica órfão em silêncio)
Endpoint dedicadoPOST /gateway/service-order/{guid}/interventions/{id}Não existe
Pelo payload da Ordem de ServiçoNão suportadormaList (substituição total no PUT)
Mudar de Ordem de Serviço no PUT do recursoNão (campo ignorado)Sim
ConsultaGET /service-order/{guid} → interventions[]GET /service-order/{guid} → rmaList[]
Desfazer a ligaçãoSó apagando a intervençãoserviceOrderGuid vazio no PUT do RMA

Relatórios SAT​

O módulo inclui quatro relatórios próprios (disponíveis na UI do produto e através da API de Relatórios padrão):

RelatórioConteúdoIdentificador
Contratos de entidadeContratos, plafond, horas usadas e disponíveis (agora calculadas)D3B0946B-409F-477C-855D-A05BC517B186
EquipamentosParque de equipamentos por cliente, marca, modelo e garantia367DD5A9-D7A4-4722-906F-3A88EDFC616E
IntervençõesTrabalho técnico por período, técnico, cliente e contratoBE27808C-123D-4699-9107-666D255530DE
Ordens de serviçoOrdens por estado, prioridade, tipo de assistência e equipamentoB2D7C4E8-1A3F-4B9C-8D6E-5F2A7C3B1D9E

Use GET /gateway/reports/{reportId}/info e GET /gateway/reports/{reportId}?jsonParameters=… conforme o guia da Report API.

Erros comuns​

HTTPSituaçãoComo resolver
400Campo obrigatório em falta (status, priority, assistanceTypeKeyId…)A mensagem indica o primeiro campo em falta
400keyId de catálogo inexistenteCriar primeiro a entrada no catálogo (Passo 1)
400ExtraOnlyRequiresContractO modo ExtraOnly exige intervenção com contrato associado
400Invoice.Details.OnlyCommentsO documento tem de ter pelo menos uma linha valorizada (details)
400ServiceOrderInvoice.NothingToInvoice / InterventionInvoice.NothingToInvoiceAdicionar details e/ou horas/km valorizados
400ServiceOrder.InvalidDetailItemKeyId / Intervention.InvalidDetailItemKeyIdEnviar itemKeyId nas linhas com quantity > 0
400ServiceOrder.ResponsibleUserRequiredEnviar responsibleUserId > 0 quando isEmployeeFillObligatory está activo
400SatLineNotFromDeclaredOriginA linha enviada não pertence à ordem/intervenção declarada no cabeçalho
404GUID/id inexistenteConfirmar com o GET de listagem
404ServiceOrder.NotFound / Intervention.NotFoundConfirmar o GUID da ordem ou o id da intervenção
404ServiceOrder.ItemNotFound / Intervention.ItemNotFoundCriar primeiro o artigo no catálogo de artigos
404ServiceOrderConfiguration.NotFoundTratar como valores por omissão, ou fazer PUT /gateway/sat-config
409Fecho com intervenções abertasUsar close-preview e enviar concludeOpenInterventions: true
409ServiceOrder.CannotRemoveInvoicedDetailNão omitir no PUT linhas de details já facturadas
409Intervention.AlreadyLinkedA intervenção já está ligada a outra ordem
409Intervention.CannotEditLinkedToServiceOrderRepetir o mesmo serviceOrderGuid no PUT (edição no contexto da ordem)
409Intervention.NotLinkedToServiceOrderO DELETE só remove intervenções que pertencem àquela ordem
409ServiceOrder.CannotEditClosedReabrir a ordem, ou alterar o RMA via PUT /gateway/rma/{guid}
409keyId / rmaId duplicadoEscolher outra chave ou consultar o existente