Skip to content

fix(inbound): migra os 20 métodos de inbound/CT-e para as rotas reais /inbound/… (v3.4.0) - #30

Merged
andrenfe merged 1 commit into
masterfrom
fix/inbound-routes
Jul 30, 2026
Merged

fix(inbound): migra os 20 métodos de inbound/CT-e para as rotas reais /inbound/… (v3.4.0)#30
andrenfe merged 1 commit into
masterfrom
fix/inbound-routes

Conversation

@andrenfe

Copy link
Copy Markdown
Member

Resumo

O domínio de documentos de entrada inteiro nunca funcionou na v3. InboundProductInvoicesResource (13 métodos) e TransportationInvoicesResource (7 métodos) usavam rotas que não existem na API — 404 de rota ou colisão com /productinvoices/{id} (sondado ao vivo 2026-07-29/30, empresa dev). Este PR migra os 20 métodos para o contrato real /inbound/… de openapi/consulta-dfe-distribuicao-v2.yaml (spec canônica, superconjunto das 3 specs de distribuição), mantendo nomes e assinaturas públicas (pinado por teste de reflexão).

Grupo Antes (morto) Depois (probe-confirmado vivo)
Config NF-e PUT|GET|DELETE …/productinvoices/inbound POST|GET|DELETE …/inbound/productinvoices
Config CT-e PUT|GET|DELETE …/cte/inbound POST|GET|DELETE …/inbound/transportationinvoices
Consultas por chave …/productinvoices/received/{key}…, …/cte/{key}… genéricas …/inbound/{key}… + específicas …/inbound/productinvoices/{key}…
Manifestação PUT …/received/{key}/manifest/{type} POST …/inbound/{key}/manifest?tpEvent={código}
Reprocesso de webhook POST …/received/{key}/webhook/reprocess POST …/inbound/productinvoices/{key_or_nsu}/processwebhook

Decisões de design (openspec fix-inbound-routes)

  • D3 fechado por sonda (2026-07-30): o binder da API só aceita tpEvent numérico (tpEvent=Confirmation400 "The value 'Confirmation' is not valid."; tpEvent=210210 passa e falha na chave). O SDK aceita o código direto ou mapeia os literais legados: Confirmation→210200, Acknowledgement→210210, Unknown→210220, Refused→210240; outro valor lança InvalidRequestException local.
  • D4: reprocessWebhook() aceita chave de 44 dígitos ou NSU de 1–15 dígitos (novo IdValidator::accessKeyOrNsu()), conforme {access_key_or_nsu} da spec.
  • SemVer minor (3.4.0): comportamento externo passa de "sempre 404" para "funciona"; nada que funciona hoje muda, porque nada funciona hoje.

Testes

  • Unit: verbo+path pinados para os 20 métodos (datasets com MockTransport), mapeamento de literais, NSU, validações locais.
  • Novo InboundSpecAlignmentTest: cada rota emitida existe na spec DF-e v2 com o verbo correspondente; os esquemas de rota mortos seguem ausentes; tpEvent é integer; assinaturas dos 20 métodos pinadas por reflexão.
  • make test: 262 passed / 1 failed — a falha é a ambiental pré-existente (CurlTransportFailurePhaseTest, DNS; passa no CI). make stan e make cs limpos.

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

  • getSettings NF-e → 404 "company not configured or enabled to use nfe distribution"; CT-e → 400 "company not configured or active to use transportation inbound"erros de domínio, não 404 de rota.
  • getDetails/retrieve com chave falsa → 400 "Key … for companyId … does not exist".
  • manifest com chave falsa → 400 "Invalid access key …"; reprocessWebhook com NSU → erro de domínio citando o NSU.

Decisão (task 5.3): não habilitamos inbound de verdade na empresa dev — a conta é compartilhada e a habilitação dispara busca real de DF-e na SEFAZ. Os erros de domínio acima provam o roteamento; a validação funcional ponta a ponta fica para uma conta dedicada.

OpenSpec: fix-inbound-routes (19/19 tasks; artefatos locais, openspec/ é gitignored). Contexto no vault review-07-14-2026 (arquivos 05 e 09).

… /inbound/…

Os dois resources do domínio de documentos de entrada nunca funcionaram na
v3: as rotas usadas (/productinvoices/received/…, /productinvoices/inbound,
/cte/…) não existem na API — 404 de rota ou colisão com /productinvoices/{id}
(sondado ao vivo 2026-07-29/30). Migra tudo para o contrato /inbound/… da
consulta-dfe-distribuicao-v2 (spec canônica), mantendo nomes e assinaturas
públicas dos 20 métodos:

- config NF-e/CT-e: POST|GET|DELETE …/inbound/{productinvoices|transportationinvoices}
  (habilitar era PUT, agora POST conforme a spec)
- consultas: rotas genéricas …/inbound/{key}… e específicas
  …/inbound/productinvoices/{key}…
- manifest(): POST …/inbound/{key}/manifest?tpEvent={código} — sondado: o
  binder só aceita código numérico SEFAZ; literais legados do SDK são
  mapeados (Confirmation→210200, Acknowledgement→210210, Unknown→210220,
  Refused→210240)
- reprocessWebhook(): POST …/inbound/productinvoices/{key_or_nsu}/processwebhook,
  aceitando NSU via novo IdValidator::accessKeyOrNsu()

Testes: verbo+path pinados por método (datasets), InboundSpecAlignmentTest
(paths↔spec DF-e v2, rotas mortas ausentes, tpEvent integer, assinaturas dos
20 métodos por reflexão). Revalidado ao vivo com o código novo: settings e
chaves falsas retornam erros de domínio, nunca 404 de rota.

OpenSpec: fix-inbound-routes
@andrenfe
andrenfe merged commit 1e4a7bf into master Jul 30, 2026
9 checks passed
@andrenfe
andrenfe deleted the fix/inbound-routes branch July 30, 2026 04:34
andrenfe added a commit that referenced this pull request Jul 30, 2026
…ientes — release v3.4.0 (#32)

Environment::Sandbox prometia roteamento/isolamento que nunca existiu: não há
host sandbox na plataforma (o Node valida só production|development; a spec
client-core já dizia que o servidor distingue por credencial) e
Config::baseUrlForApi() nunca consultou o environment — todo tráfego sempre
foi para produção. Um integrador que selecionava Sandbox com chave de
produção emitia documento fiscal real achando-se isolado.

- Environment/Config: docblocks passam a dizer a verdade (metadado
  declarativo; isolamento = chave de conta dev + company.environment)
- Sandbox @deprecated; Config emite E_USER_DEPRECATED ao selecioná-lo,
  com a orientação do isolamento real; remoção na próxima major
- Testes: deprecation disparada só em Sandbox; URLs idênticas com
  Production e Sandbox (pina a ausência de roteamento)
- Docs: configuration.md ganha a seção "Ambientes na NFE.io";
  getting-started.md, README e skill corrigidos
- Nenhum comportamento de rede muda

Inclui o corte da release v3.4.0 (Version.php + CHANGELOG), que embarca
também a fix-inbound-routes (#30).

OpenSpec: fix-sandbox-environment-contract
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