fix(infProt): modela o grupo PR13 como ocorrências repetíveis (alertas do cStat=120) - #88
Open
rhfranzoni wants to merge 1 commit into
Open
fix(infProt): modela o grupo PR13 como ocorrências repetíveis (alertas do cStat=120)#88rhfranzoni wants to merge 1 commit into
rhfranzoni wants to merge 1 commit into
Conversation
… de par escalar
O leiaute do protocolo descreve o PR13 como grupo de 0 a 5 ocorrências, sem
elemento agrupador ("Sequência XML"), com PR14 cMsg em 0-1 (opcional) e PR15
xMsg em 1-1 (obrigatório) — ver NT 2018.005 e a ampliação da NT 2026.002 §2.3,
que criou o cStat=120 ("Autorizado o uso da NF-e, com alerta") e passou a usar
o grupo para devolver até 5 alertas.
infProt mapeava cMsg e xMsg em propriedades ESCALARES. Com XmlSerializer, as
ocorrências repetidas colapsam: só a última sobrevive à desserialização. Uma
nota autorizada com 5 alertas chegava ao consumidor com 1 — silenciosamente, e
sem meio de perceber a perda.
Modelagem: coleção de escolha com XmlChoiceIdentifier. É o único arranjo do
XmlSerializer que preserva a ORDEM entre dois nomes de elemento distintos, e é
a ordem que permite reconstruir cada ocorrência — o cMsg imediatamente anterior
a um xMsg é o código daquela ocorrência.
- `Mensagens` + `MensagensTipos`: a coleção crua, na ordem do documento.
- `Alertas`: as ocorrências já reconstruídas em pares (Codigo, Mensagem), com
Codigo anulável porque o cMsg é opcional. cMsg sem xMsg seguinte não forma
ocorrência, conforme o leiaute.
- `cMsg` e `xMsg` permanecem, agora como projeções da primeira ocorrência, para
não quebrar quem já os consumia — NFe.Danfe.Nativo/NFCe/DanfeNativoNfce.cs
usa infProt.xMsg.
Também corrige o doc comment do Signature, que estava rotulado PR13 quando é
PR90.
Testes (NFCe.Tests/InfProtAlertGroupTests.cs): múltiplas ocorrências na ordem
do documento; ocorrência sem cMsg preservada com código nulo; protocolo sem o
grupo; cMsg órfão; compatibilidade dos campos escalares; e round-trip
preservando a contagem exata de cMsg e xMsg.
NFCe.Tests: 6 novos testes passam. A única falha da suíte
(ServicosNFe_WhenNfeNFeAutorizacao4_ReturnsxMotivoSuccess) é pré-existente e
sem relação — o teste aponta para um caminho absoluto de outra máquina
(C:\Works\nfe\nfe-products-api\schemas).
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
Modela o grupo PR13 do protocolo como ocorrências repetíveis, em vez do par escalar
cMsg/xMsgque existia.O leiaute descreve o PR13 como grupo de 0 a 5 ocorrências, sem elemento agrupador ("Sequência XML"), com PR14
cMsgem0-1(opcional) e PR15xMsgem1-1(obrigatório). A NT 2018.005 criou o grupo; a NT 2026.002 §2.3 o ampliou ao introduzir ocStat=120— "Autorizado o uso da NF-e, com alerta" — que devolve até 5 alertas por nota.O problema
infProtmapeavacMsgexMsgem propriedades escalares. ComXmlSerializer, ocorrências repetidas do mesmo elemento colapsam: só a última sobrevive à desserialização.Uma nota autorizada com 5 alertas chegava ao consumidor com 1 — silenciosamente, e sem meio de perceber a perda. O consumidor não tem como distinguir "veio 1 alerta" de "vieram 5 e 4 se perderam".
A modelagem
Coleção de escolha com
XmlChoiceIdentifier:É o único arranjo do
XmlSerializerque preserva a ordem entre dois nomes de elemento distintos — e é a ordem que permite reconstruir cada ocorrência: ocMsgimediatamente anterior a umxMsgé o código daquela ocorrência.Mapear em duas listas paralelas (
List<string> cMsgs/List<string> xMsgs) não funciona: como ocMsgé opcional, o pareamento por índice desalinha assim que uma ocorrência vem sem código.API resultante
Mensagens+MensagensTiposAlertas(Codigo, Mensagem);Codigoé anulável porque ocMsgé opcionalcMsg/xMsgO agrupamento é ancorado no
xMsg, que é o campo obrigatório: cadaxMsgencerra uma ocorrência. UmcMsgsemxMsgseguinte não forma ocorrência, conforme o leiaute.Compatibilidade
cMsgexMsgcontinuam existindo e devolvem a primeira ocorrência — o consumidor internoNFe.Danfe.Nativo/NFCe/DanfeNativoNfce.csusainfProt.xMsge segue funcionando sem alteração. Passaram a ser somente-leitura (antes ocMsgtinha setter usado apenas pelo próprio proxy de serialização).Também
Corrige o doc comment de
Signature, rotuladoPR13quando éPR90.Testes
NFCe.Tests/InfProtAlertGroupTests.cs— 6 testes, todos passando:cMsgpreservada com código nulo;cMsgórfão não forma ocorrência;cMsgexMsg.Contexto
Vem de nfe/dfetech-product-invoice-api#423, que expõe os alertas do
cStat=120na API e no webhook. Lá o produto contorna a limitação com um parser próprio sobre o XML bruto do protocolo, justamente porque a lib colapsava as ocorrências. Com este PR mergeado, o consumidor passa a poder usarinfProt.Alertasdireto, e onfeProcremontado volta a poder carregar o grupo — hoje ele sai sem os alertas, divergindo do que a API expõe.