Passo 7 — Faturação
7.1 Pré-visualizar as linhas
POST /gateway/service-order/invoice/preview
Content-Type: application/json
Authorization: Bearer {token}
{
"serviceOrderGuid": "GUID-DA-ORDEM",
"documentTypeKeyId": "FAC",
"hoursBillingMode": "ExtraOnly"
}
Existe o equivalente para intervenção isolada em POST /gateway/intervention/invoice/preview, com interventionGuid.
As linhas da pré-visualização vêm dos details da ordem/intervenção, mais horas e km valorizados. Sem isso, a pré-visualização devolve ServiceOrderInvoice.NothingToInvoice / InterventionInvoice.NothingToInvoice.
A resposta traz os dados do cliente e a lista de linhas propostas, cada uma já com itemKeyId, itemDescription, quantity, retailPrice, netPrice, taxId, isComment e — crucialmente — originBodyGuid e relationType, que garantem a rastreabilidade até à intervenção de origem.
hoursBillingMode
| Modo | Comportamento |
|---|---|
Full (0) | Fatura todas as horas gastas, ignorando o plafond |
ExtraOnly (1) | Fatura apenas as horas acima do plafond disponível. Exige contrato associado; sem ele devolve ExtraOnlyRequiresContract |
None (2) | Não fatura horas nem km, só os artigos consumidos |
Em ExtraOnly, o cabeçalho de agrupamento das linhas de horas muda para «horas extra-contrato». Quando se fatura uma ordem com várias intervenções ligadas ao mesmo contrato, o plafond é consumido progressivamente ao longo das intervenções (em vez de cada uma ver o plafond cheio).
7.2 Emitir
As linhas devolvidas pela pré-visualização (depois de o utilizador as poder ajustar) são enviadas para o endpoint genérico, com a origem SAT declarada no cabeçalho:
POST /gateway/invoice/invoices
Content-Type: application/json
Authorization: Bearer {token}
{
"documentTypeId": 1,
"serieId": 2026,
"entityKeyId": "C0001",
"serviceOrderGuid": "GUID-DA-ORDEM",
"documentBodies": [
{
"itemKeyId": "HORAS",
"itemDescription": "Horas de intervenção",
"quantity": 2.5,
"retailPrice": 25.00,
"taxId": 3,
"originBodyGuid": "GUID-DA-INTERVENCAO",
"relationType": "ServiceOrderInterventionHours"
}
],
"payments": [
{
"paymentTypeId": 1,
"amount": 76.88
}
]
}
O preview usa documentTypeKeyId (alfanumérico) e a emissão usa documentTypeId (numérico). Resolva sempre via GET /gateway/document-type — os IDs não são portáveis entre tenants.
Na emissão, a API valida que a origem SAT existe e é faturável, confirma que as linhas enviadas pertencem à ordem/intervenção declarada no cabeçalho, e associa o documento à ordem de serviço.
Depois de faturar
GET /gateway/intervention/{guid}/billing-detailsGET /gateway/service-order/{guid}/issued-documents
Se quem foi faturado foi a ordem de serviço, a intervenção deixa de listar essa fatura como documento próprio — só mostra os documentos que lhe pertencem de facto.
Seguinte
RMA (fluxo paralelo) ou erros comuns.