Skip to content

fix(invoice): inutilização e EPEC de NF-e usam as rotas reais (POST /disablement, /xml-epec) - #29

Merged
andrenfe merged 2 commits into
masterfrom
fix/product-invoice-disablement-epec
Jul 30, 2026
Merged

fix(invoice): inutilização e EPEC de NF-e usam as rotas reais (POST /disablement, /xml-epec)#29
andrenfe merged 2 commits into
masterfrom
fix/product-invoice-disablement-epec

Conversation

@andrenfe

Copy link
Copy Markdown
Member

Resumo

Três métodos de ProductInvoicesResource estavam quebrados contra a API real — retornavam 405/404 incondicionalmente porque usavam rotas que não existem no servidor (sondas ao vivo de 2026-07-29, empresa dev, nada inutilizado):

Método Antes (morto) Depois (contrato da spec, sondado vivo)
disable() PUT …/{id}/disable → 404 POST …/{id}/disablement (+ reason em query)
disableRange() PUT …/disable → 405 POST …/productinvoices/disablement
downloadEpecXml() GET …/xml/epec → 404 GET …/xml-epec

downloadRejectionXml() não foi tocado: /xml/rejection e /xml-rejection são aliases vivos.

Detalhes

  • Assinaturas públicas inalteradas — só rota/verbo interno. SemVer patch: não há uso funcional possível do comportamento anterior.
  • Em disable(), $data['reason'] é promovido a query param (o endpoint individual não declara request body na spec); o fio exige 15–255 caracteres (erro 40001).
  • Em disableRange(), o body segue DisablementResource (serie, beginNumber, lastNumber, state, environment, reason); reason é obrigatório no fio (400 "The Reason field is required").
  • Docs (product-invoices.md) e skill nfeio-php-sdk atualizados; CHANGELOG em Unreleased.

Testes

  • Unit: verbo+path dos 3 métodos pinados via MockTransport (+ alias de rejection + reason→query).
  • Novo ProductInvoiceSpecAlignmentTest: amarra as rotas a openapi/nf-produto-v2.yaml e pina a ausência das rotas mortas (um sync de spec que as mova quebra o build).
  • make test: 233 passed / 1 failed — a falha é CurlTransportFailurePhaseTest (classificação de erro DNS), ambiental e pré-existente (falha idêntica na master limpa desta máquina). make stan e make cs limpos.

Validação ao vivo (2026-07-30, com o SDK deste PR)

  • disableRange sem reason400 "The Reason field is required." (rota viva; nada inutilizado)
  • disable com invoice falso + reason válido → 404 {"code":40401,"message":"invoice not found"}
  • downloadEpecXml com invoice falso → 40401 invoice not found

Decisão (task 4.3 da change): aceitamos o 400/40401 como prova suficiente de rota+verbo+parsing de reason. Não fizemos inutilização real nem em Development — inutilização de numeração é irreversível na SEFAZ.

OpenSpec: fix-product-invoice-disablement-epec (13/13 tasks; artefatos locais, openspec/ é gitignored). Contexto completo no vault review-07-14-2026 (arquivos 03, 08 e 09).

andrenfe added 2 commits July 30, 2026 00:36
`disable()`/`disableRange()` emitiam `PUT …/disable` e `downloadEpecXml()`
usava `GET …/xml/epec` — rotas que não existem no servidor (405/404
incondicionais, sondado ao vivo 2026-07-29). Migra para o contrato de
`openapi/nf-produto-v2.yaml`, provado vivo por sonda:

- `disable()` → `POST …/{invoiceId}/disablement`, com `reason` promovido a
  query param (endpoint individual não tem request body; fio exige 15–255
  caracteres, erro 40001)
- `disableRange()` → `POST …/productinvoices/disablement` (body
  `DisablementResource`; `reason` obrigatório no fio)
- `downloadEpecXml()` → `GET …/xml-epec` (hífen); `downloadRejectionXml()`
  intocado (`/xml/rejection` é alias vivo)

Assinaturas públicas inalteradas (SemVer patch — os métodos eram
inutilizáveis). Verbo+path pinados em unit tests + novo teste de alinhamento
YAML↔rotas (`ProductInvoiceSpecAlignmentTest`). Rotas novas revalidadas ao
vivo com o SDK corrigido em 2026-07-30 (400 validação / 40401 — nada foi
inutilizado de verdade).

OpenSpec: fix-product-invoice-disablement-epec
@andrenfe
andrenfe merged commit bf908dc into master Jul 30, 2026
9 checks passed
@andrenfe
andrenfe deleted the fix/product-invoice-disablement-epec branch July 30, 2026 03:59
andrenfe added a commit that referenced this pull request Jul 30, 2026
O CHANGELOG já foi versionado no PR #29; faltou o bump de src/Version.php,
que o release.yml confere contra a tag (a primeira tentativa de tag falhou
nessa checagem e foi removida).
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