Faturação: ATCUD e o código QR da AT¶
Desde 2022, as faturas portuguesas têm de incluir um ATCUD e um código QR
definidos pela Autoridade Tributária (AT). O pt-fiscal ajuda-te a compor ambos;
não gera a assinatura/hash digital (campo Q) — isso vem do teu software de
faturação certificado.
ATCUD¶
O ATCUD é o código único do documento:
- Código de validação — emitido pela AT quando registas uma série de documentos.
- Número sequencial — a posição do documento dentro dessa série.
- Documentos emitidos antes de a série ser comunicada usam o literal
"0".
import { buildAtcud, validateAtcud } from 'pt-fiscal';
buildAtcud({ validationCode: 'CSDF7T5H', sequence: 1 }); // "CSDF7T5H-1"
validateAtcud('CSDF7T5H-1'); // true
validateAtcud('0'); // true (pré-registo)
Código QR¶
O buildInvoiceQRCode() devolve a string de campos que a AT espera. Depois
renderizas como imagem QR com uma biblioteca como a qrcode.
import { buildInvoiceQRCode } from 'pt-fiscal';
import QRCode from 'qrcode';
const payload = buildInvoiceQRCode({
issuerNif: '500000000',
buyerNif: '999999990', // 999999990 = consumidor final
buyerCountry: 'PT',
docType: 'FS', // FT, FS, FR, NC, ND, ...
docState: 'N',
docDate: new Date(),
docId: 'FS A/1',
atcud: 'CSDF7T5H-1',
vat: { PT: { standard: [10, 2.3] } }, // [base, imposto]
totalTaxes: 2.3,
totalWithTax: 12.3,
hash4: 'kIrx', // 4 chars do hash da assinatura (do teu software)
certificateNumber: 9999, // nº do certificado do programa (AT)
});
await QRCode.toFile('fatura-qr.png', payload);
Campos¶
| Campo | Significado |
|---|---|
| A | NIF do emitente |
| B | NIF do adquirente (999999990 para consumidor final) |
| C | País do adquirente (ISO 3166-1 alpha-2) |
| D | Tipo de documento (FT, FS, FR, NC, ND, …) |
| E | Estado do documento (N, A, F, R) |
| F | Data do documento (AAAAMMDD) |
| G | Identificação única do documento |
| H | ATCUD |
| I1–I8 | Espaço fiscal continente (PT): base tributável e IVA por taxa |
| J1–J8 / K1–K8 | Equivalentes para Açores (PT-AC) / Madeira (PT-MA) |
| L | Valor não sujeito a IVA |
| M | Imposto do selo |
| N | Total de impostos |
| O | Total com impostos |
| P | Retenções na fonte |
| Q | 4 chars do hash da assinatura |
| R | Nº do certificado do programa (AT) |
| S | Outras informações |
O objeto vat aceita exemptBase, reduced, intermediate e standard (cada
taxa como [base, imposto]) por região, e o builder emite os campos pela ordem que
a especificação da AT exige.
Nota legal: as faturas oficiais têm de ser emitidas via Portal das Finanças ou software certificado pela AT. Este helper serve para construir o payload do QR, não para substituir a faturação certificada.