Ir para conteúdo
  • Cadastre-se

Recommended Posts

Postado
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.
  • Consultores
Postado

Obrigado por reportar.

Fechando. Para novas dúvidas, criar um novo tópico.

 

Consultora ACBr Pro

Juliomar Marchetti

Ajude o Projeto ACBr crescer - Seja Pro

discord: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br

 

MVP_NewLogo_100x100_Transparent-02.png
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 !!

Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...