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.