Pedro Paulo Bento Postado Terça as 20:19 Postado Terça as 20:19 Boa tarde. Apos atualizar o ACBrNFe para a versao mais recente de 30/06/2026, passei a ter rejeicao em toda emissao de NFC-e (modelo 65) por falha de schema XML. ## Erro retornado pela SEFAZ 225 - Rejeicao: Falha no Schema XML da NFe Detalhe do schema: Element 'gPagAntecipado' has incomplete content. List of possible elements expected: 'refNFe' ## Cenario da NFC-e Trata-se de uma venda comum de NFC-e, sem qualquer uso de pagamento antecipado. No grupo de pagamento tenho apenas: <tPag>04</tPag> Ou seja: - Cartao de Debito - Nao existe pagamento antecipado - Nao existe nota referenciada - Nao existe refNFe - Portanto, conforme a NT 2025.002, o grupo gPagAntecipado nao deveria ser gerado Mesmo assim, o XML esta saindo com: <gPagAntecipado/> E isso gera a rejeicao 225 no schema. ## Analise tecnica no fonte Fiz uma analise completa no codigo-fonte atual do ACBr e encontrei o ponto exato onde isso ocorre. ### 1. Onde o grupo e gerado Arquivo: Base\ACBrNFe.XmlWriter.pas Metodo: TNFeXmlWriter.Gerar_gPagAntecipado Trecho atual: ```delphi function TNFeXmlWriter.Gerar_gPagAntecipado: TACBrXmlNode; var i: Integer; begin Result := nil; if Assigned(NFe.Ide.gPagAntecipado) then begin Result := FDocument.CreateElement('gPagAntecipado'); for i := 0 to NFe.Ide.gPagAntecipado.refNFe.Count - 1 do begin Result.AppendChild(AddNode(tcStr,'BC02','refNFe', 44, 44, 1, NFe.Ide.gPagAntecipado.refNFe[i].refDFEChave, DSC_REFNFE)); end; end; end; ``` ### 2. Causa raiz A condicao atual verifica apenas: ```delphi if Assigned(NFe.Ide.gPagAntecipado) then ``` O problema e que esse objeto e criado automaticamente no construtor de TIde, mesmo quando nao existe nenhum dado de pagamento antecipado. No arquivo: Base\ACBrNFe.Classes.pas Construtor de TIde: ```delphi constructor TIde.Create; begin inherited Create; FNFref := TNFrefCollection.Create(); FgCompraGov := TgCompraGov.Create; FgPagAntecipado := TgPagAntecipado.Create(); end; ``` E no construtor de TgPagAntecipado: ```delphi constructor TgPagAntecipado.create; begin inherited Create; FrefNFe := TDFErefCollection.Create; end; ``` Ou seja: - `gPagAntecipado` sempre existe - `refNFe` sempre existe - mas a colecao nasce vazia Com isso, o writer entra no bloco apenas porque o objeto esta instanciado, cria o no XML e, como a lista esta vazia, o resultado final vira: ```xml <gPagAntecipado/> ``` ## Fluxo completo identificado O fluxo que leva ate esse XML vazio e o seguinte: - `NotaFiscal.Create` - `TNFe.Create` - `TIde.Create` - `TgPagAntecipado.Create` - `NotaFiscal.GerarXML` - `TNFeXmlWriter.GerarXml` - `GerarInfNFe` - `GerarIde` - `Gerar_gPagAntecipado` Em `GerarIde`, o writer chama: ```delphi Result.AppendChild(Gerar_Ide_CompraGov); Result.AppendChild(Gerar_gPagAntecipado); ``` Portanto, o metodo `Gerar_gPagAntecipado` decide sozinho se o grupo entra ou nao no XML. ## Comparacao com outros serializadores No JSON Writer, o comportamento ja esta mais correto, pois existe uma protecao para nao gerar o grupo vazio: Arquivo: Base\ACBrNFe.JSONWriter.pas ```delphi if AGPagAntecipado.refNFe.Count = 0 then exit; ``` Ou seja: - JSON nao gera o grupo vazio - XML gera - existe inconsistencia entre os serializadores ## Correcao sugerida Entendo que a condicao correta no XML Writer deveria impedir a geracao do grupo quando nao existir pelo menos um `refNFe`. Sugestao minima: ```delphi function TNFeXmlWriter.Gerar_gPagAntecipado: TACBrXmlNode; var i: Integer; begin Result := nil; if not Assigned(NFe.Ide.gPagAntecipado) then Exit; if NFe.Ide.gPagAntecipado.refNFe.Count = 0 then Exit; Result := FDocument.CreateElement('gPagAntecipado'); for i := 0 to NFe.Ide.gPagAntecipado.refNFe.Count - 1 do begin Result.AppendChild(AddNode(tcStr, 'BC02', 'refNFe', 44, 44, 1, NFe.Ide.gPagAntecipado.refNFe[i].refDFEChave, DSC_REFNFE)); end; end; ``` Se quiserem uma abordagem mais robusta, o ideal seria inclusive validar se existe ao menos uma chave nao vazia antes de abrir o grupo. ## Conclusao Pelo que identifiquei, trata-se de bug de serializacao no XML Writer novo do ACBr. O problema nao esta relacionado ao meu preenchimento de pagamento, nem ao `tPag=04`, e sim ao fato de `gPagAntecipado` ser criado automaticamente e o writer verificar apenas `Assigned(...)`, sem exigir `refNFe`. Se a equipe entender da mesma forma, acredito que a correcao seja simples e localizada em: - `Base\ACBrNFe.XmlWriter.pas` - metodo `TNFeXmlWriter.Gerar_gPagAntecipado` Se precisarem, eu posso anexar o XML rejeitado e tambem disponibilizar um SPEC completo com o rastreamento do fluxo no fonte. Obrigado.
Fundadores Daniel Simoes Postado Terça as 21:13 Fundadores Postado Terça as 21:13 Experimente atualizar seus fontes... Daniel Simões de Almeida O melhor TEF, é com o Projeto ACBr - Clique e Conheça Ajude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976.
Cleverton Martins Postado Quinta as 19:44 Postado Quinta as 19:44 Mesmo erro aqui. Atualizei os fontes na terça dia 30.
Cleverton Martins Postado Quinta as 20:00 Postado Quinta as 20:00 Esqueçam, parece que foi corrigido após eu baixar os fontes. 1
Consultores Juliomar Marchetti Postado Há 16 horas Consultores Postado Há 16 horas Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Juliomar Marchetti Ajude o Projeto ACBr crescer - Seja Pro discord: juliomar telegram: juliomar e-mail: [email protected] http://www.juliomarmarchetti.com.br Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Recommended Posts