Skip to content

feat(service-invoice): downloadCancellationXml() — XML do evento de cancelamento — v3.5.0 - #34

Merged
andrenfe merged 1 commit into
masterfrom
feat/service-invoice-cancellation-xml
Aug 1, 2026
Merged

feat(service-invoice): downloadCancellationXml() — XML do evento de cancelamento — v3.5.0#34
andrenfe merged 1 commit into
masterfrom
feat/service-invoice-cancellation-xml

Conversation

@andrenfe

@andrenfe andrenfe commented Aug 1, 2026

Copy link
Copy Markdown
Member

Change openspec: add-service-invoice-cancellation-xml (onda 2 da review, P1-4)

Por quê

O download do XML do evento de cancelamento de NFS-e é o único gap funcional exigido por duas specs (nf-servico-v1.yaml:7909 ServiceInvoices_GetCancellationXml e service-invoice-rtc-v1.yaml:454). Com a Reforma Tributária, o ambiente Nacional emite o evento e110001 — integradores que guardam trilha fiscal completa precisam desse XML.

O que muda

  • ServiceInvoicesResource::downloadCancellationXml(string $companyId, string $invoiceId, ?RequestOptions $options = null): string — mesmo padrão dos downloads existentes (download(), bytes crus, segue redirect sem vazar Authorization).
  • 404 = resposta esperada quando não há XML de cancelamento (provedor legado ABRASF/Paulistana, ambiente não Nacional, ou nota não cancelada) → NotFoundException, com a semântica documentada no docblock, nos docs e na skill. Quando existem o XML de envio e o autorizado, a API retorna o autorizado.
  • Paridade-plus deliberada: o SDK Node não expõe este download.

Testes

  • Unit: verbo+path pinados (GET …/cancellation-xml), bytes crus, 404 → NotFoundException, IDs vazios rejeitados sem HTTP.
  • Alinhamento: path+verbo amarrados às duas specs (a RTC declara :param — o teste normaliza para {param}).
  • Suite: 280 passed (única falha local é a ambiental CurlTransportFailurePhaseTest); PHPStan e cs verdes.

Validação ao vivo (2026-08-01, empresa dev, read-only)

  • Invoice falso404 com a mensagem de domínio: "Cancellation event XML not available for this service invoice (National environment only; legacy providers have no cancellation event XML, or the invoice has not been cancelled)."
  • NFS-e cancelada real (provedor legado, ambiente Development) → o mesmo 404 semântico, confirmando a semântica documentada com uma nota efetivamente cancelada.
  • ⚠️ Validação pendente: download do XML real exige NFS-e Nacional cancelada, que a conta dev não tem — a rota e a semântica do 404 estão provadas; o caminho feliz fica para quando houver nota Nacional acessível.

Release

src/Version.php3.5.0 dentro deste PR (minor — método novo, nada muda no existente). Tag v3.5.0 após o merge.

…ancelamento (e110001) — v3.5.0

- GET /v1/companies/{id}/serviceinvoices/{id}/cancellation-xml, mesmo padrão
  dos downloads existentes (bytes crus, redirect sem vazar Authorization)
- 404 é resposta esperada (provedor legado / não Nacional / não cancelada) e
  chega como NotFoundException — documentado no docblock e nos docs
- Testes: unit (verbo+path pinados, 404 semântico, IDs vazios) + alinhamento
  com nf-servico-v1 (operationId ServiceInvoices_GetCancellationXml) e
  service-invoice-rtc-v1 (normalizando :param → {param})
- Docs + skill + CHANGELOG; Version 3.5.0 (minor)
- Sondado ao vivo 2026-08-01 com o código novo: invoice falso E nota
  cancelada real (provedor legado) → 404 com a mensagem de domínio
@andrenfe
andrenfe merged commit 6efabbf into master Aug 1, 2026
9 checks passed
@andrenfe
andrenfe deleted the feat/service-invoice-cancellation-xml branch August 1, 2026 00:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant