fix(invoice): inutilização e EPEC de NF-e usam as rotas reais (POST /disablement, /xml-epec) - #29
Merged
Merged
Conversation
`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
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).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resumo
Três métodos de
ProductInvoicesResourceestavam 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):disable()PUT …/{id}/disable→ 404POST …/{id}/disablement(+reasonem query)disableRange()PUT …/disable→ 405POST …/productinvoices/disablementdownloadEpecXml()GET …/xml/epec→ 404GET …/xml-epecdownloadRejectionXml()não foi tocado:/xml/rejectione/xml-rejectionsão aliases vivos.Detalhes
disable(),$data['reason']é promovido a query param (o endpoint individual não declara request body na spec); o fio exige 15–255 caracteres (erro40001).disableRange(), o body segueDisablementResource(serie,beginNumber,lastNumber,state,environment,reason);reasoné obrigatório no fio (400 "The Reason field is required").product-invoices.md) e skillnfeio-php-sdkatualizados; CHANGELOG em Unreleased.Testes
MockTransport(+ alias de rejection + reason→query).ProductInvoiceSpecAlignmentTest: amarra as rotas aopenapi/nf-produto-v2.yamle 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 stanemake cslimpos.Validação ao vivo (2026-07-30, com o SDK deste PR)
disableRangesemreason→400 "The Reason field is required."(rota viva; nada inutilizado)disablecom invoice falso + reason válido →404 {"code":40401,"message":"invoice not found"}downloadEpecXmlcom invoice falso →40401 invoice not foundDecisão (task 4.3 da change): aceitamos o
400/40401como prova suficiente de rota+verbo+parsing dereason. 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 vaultreview-07-14-2026(arquivos 03, 08 e 09).