feat(invoice): expande o DTO ServiceInvoice (campos tipados, Borrower, raw) — v3.3.0#26
Merged
Merged
Conversation
…, raw) — release v3.3.0
Mitigação do lado do SDK para o DTO de NFS-e incompleto, enquanto o upstream
(nfe/docs) não componentiza a resposta de sucesso.
- AbstractResource::hydrate() agora popula `raw` de qualquer DTO que o declare
(payload decodificado completo) — o escape-hatch de forward-compat vira
consistente em todo o SDK (antes só Webhooks/lookups o faziam à mão). Também
hidrata DTOs aninhados (Nfe\...) recursivamente. Nenhum campo do fio se perde.
- ServiceInvoice ganha campos tipados de alto valor: number, checkCode,
description, cityServiceCode, baseTaxAmount, issRate, issTaxAmount, amountNet
(anexados ao fim do construtor — aditivo).
- Novo DTO aninhado Borrower (federalTaxNumber int|string|null, tolerante a
CPF/CNPJ); provider (pesado) permanece via raw.
- Teste de alinhamento YAML↔DTO (ServiceInvoiceSpecAlignmentTest) ancorado por
PATH /serviceinvoices/{id} — o operationId ServiceInvoices_idGet colide com
/external/{id}.
- totalAmount marcado @deprecated (a API nunca o retorna; sempre null).
- Sample e docs/recursos/service-invoices.md atualizados.
SemVer: minor. Tudo aditivo; totalAmount deprecado (não removido). É uma PONTE:
quando o nfe/docs componentizar a resposta + re-sync, o modelo migra para o tipo
gerado, protegido pelo teste de alinhamento.
Ref: OpenSpec change expand-service-invoice-dto.
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.
Objetivo
Tornar a NFS-e usável pela API tipada do SDK PHP. Hoje o
ServiceInvoicecobre ~13 de ~39 campos do fio e oraw(escape-hatch prometido) nunca era populado —number,checkCode, tributos eborrowerficavam inacessíveis. É a mitigação do lado do SDK enquanto onfe/docsnão componentiza a resposta de sucesso (o spec a declara inline, sem schema nomeado, então o codegen não gera o modelo).OpenSpec change:
expand-service-invoice-dto.O que muda
AbstractResource::hydrate()popularawde qualquer DTO que o declare, com o payload decodificado completo → todo campo do fio fica acessível via$dto->raw['campo'], mesmo sem tipo. Unifica o padrão queWebhooksResource/lookups já faziam à mão (consistência SDK-wide; todos os paramsrawsão?array). Também hidrata DTOs aninhados (Nfe\...) recursivamente.ServiceInvoice:number,checkCode,description,cityServiceCode,baseTaxAmount,issRate,issTaxAmount,amountNet(anexados ao fim do construtor — aditivo).Borrower(ServiceInvoice::$borrower);federalTaxNumberéint|string|null(tolerante a CPF/CNPJ — desvio deliberado vs. ointegerdo spec, pinado pelo teste de alinhamento).provider(pesado) fica viaraw.ServiceInvoiceSpecAlignmentTest), ancorado pelo path/serviceinvoices/{id}(ooperationIdServiceInvoices_idGetcolide com/external/{id}). Direção DTO ⊆ spec; pinatotalAmountcomo phantom ausente.totalAmount@deprecated— a API nunca o retorna (semprenull; confirmado ao vivo). Sample e cookbook atualizados.Decisão de design (gradiente de valor)
Não se tipa os 39 campos — só os de alto valor; o resto vive no
raw. Mantém o DTO enxuto e o alinhamento barato. Detalhes e trade-offs nodesign.mdda change.Qualidade
rawpopulado (retrieve + list por item), campos tipados,Borrower(int e string federalTaxNumber), provider via raw, alinhamento (4 cenários).generate:checkem sync; testes da change verdes em PHP 8.2 e 8.4.CurlTransportFailurePhaseTest(do feat(http): retry seguro de POST + idempotência por externalId (release v3.2.0) #23) é frágil a ambientes com resolver catch-all (.invalid→ errno 60 em vez de 6). Passa no CI limpo; não é tocado por este PR. Follow-up sugerido para robustecê-lo.SemVer
Minor (v3.3.0). Tudo aditivo;
totalAmountdeprecado (não removido). Corte no PR (padrão do repo). 🏷️ Tag após o merge.Ponte (não é o conserto de raiz)
Quando o
nfe/docscomponentizar a resposta de sucesso (issue rascunhada) + re-sync, o modelo pode migrar para o tipo gerado — o teste de alinhamento protege essa transição. Mesma abordagem se aplica a Node/Ruby (playbooks separados).