Biblioteca .NET open-source de alto desempenho para emissão, consulta e processamento da GNRe (Guia Nacional de Recolhimento de Tributos Estaduais) nas versões 1.00 e 2.00.
O OpenAC.Net.GNRe faz parte do ecossistema OpenAC .Net e foi desenvolvido para simplificar e padronizar a comunicação com os WebServices da GNRe Nacional (Portal GNRe PE).
A biblioteca oferece serialização e desserialização rápida de XML orientada a Source Generators, validação rigorosa de schemas XSD através do OpenAC.Net.DFe.Core, suporte completo a certificados digitais (A1/A3), além de compatibilidade multiplataforma (Windows, Linux e macOS).
- Suporte Completo a Versões:
- GNRe versão 1.00
- GNRe versão 2.00 (Múltiplas receitas, múltiplos documentos de origem, FECP, etc.)
- Serviços Suportados:
- Envio de Lotes de GNRe (
RecepcaoLotesíncrono e assíncrono) - Consulta de Resultado de Processamento do Lote (
ConsultaLote) - Consulta de Configuração da UF (
ConsultaConfigUF) - Download e extração do PDF da Guia gerada pela SEFAZ
- Envio de Lotes de GNRe (
- Validação de Schemas XSD:
- Validação integrada com os schemas oficiais da GNRe via
OpenAC.Net.DFe.Core.XmlSchemaValidation.
- Validação integrada com os schemas oficiais da GNRe via
- Multiplataforma & Multi-target:
- Suporte a
.NET Framework 4.6.2+,.NET Standard 2.0,.NET 6.0,.NET 7.0,.NET 8.0,.NET 9.0e.NET 10.0.
- Suporte a
- Aplicativo de Demonstração Multiplataforma:
- Demo moderno em Avalonia UI (.NET 10) que roda em Linux, Windows e macOS.
Instale via NuGet Package Manager:
dotnet add package OpenAC.Net.GNReOu através do Console do Gerenciador de Pacotes:
Install-Package OpenAC.Net.GNReusing System.Security.Cryptography.X509Certificates;
using OpenAC.Net.DFe.Core.Common;
using OpenAC.Net.GNRe;
var gnre = new OpenGNRe();
// Configurações Gerais
gnre.Config.Geral.FormaEmissao = DFeTipoEmissao.Normal;
gnre.Config.Geral.VersaoDFe = VersaoGNre.v200;
// Configurações de WebService
gnre.Config.WebServices.Ambiente = DFeTipoAmbiente.Homologacao;
gnre.Config.WebServices.Uf = "PE";
gnre.Config.WebServices.TimeOut = 30000;
// Configuração de Certificado Digital
gnre.Config.Certificados.Certificado = "caminho_ou_serial_do_certificado";
gnre.Config.Certificados.Senha = "senha_do_certificado";
// Diretório de Schemas XSD e Gravação de XMLs
gnre.Config.Arquivos.PathSchemas = @"C:\GNRe\Schemas";
gnre.Config.Arquivos.PathSalvar = @"C:\GNRe\Salvos";
gnre.Config.Arquivos.Salvar = true;Permite consultar as regras, receitas e campos exigidos por cada Estado:
// Consulta geral da UF
var configUf = await gnre.ConsultaConfigUFAsync("PR");
if (configUf.Situacao.Codigo == "100")
{
foreach (var receita in configUf.Dados.Receitas)
{
Console.WriteLine($"Receita: {receita.Codigo} - {receita.Descricao}");
Console.WriteLine($"Exige Documento Origem: {receita.ExigeDocumentoOrigem?.Value}");
}
}using System;
using System.Collections.Generic;
using OpenAC.Net.GNRe.Commom;
var guia = new GuiaGNRe
{
Versao = VersaoGNre.v200,
UfFavorecida = "RJ",
TipoGnre = TipoGnre.GnreSimples,
ContribuinteEmitente = new ContribuinteEmitente
{
IdContribuinteEmitente = new IdContribuinte
{
Cnpj = "12345678000195"
},
RazaoSocial = "Empresa Exemplo LTDA",
Endereco = "Av. Paulista, 1000",
Municipio = 35503, // Código IBGE (5 dígitos)
Uf = "SP",
Cep = "01310100"
},
Item = new List<ItemGnre>
{
new()
{
Receita = "100102",
DocumentoOrigem = new StringTipo
{
Tipo = "24", // Nota Fiscal Eletrônica
Value = "35260112345678000195550010000000011000000011"
},
DataVencimento = DateTime.Today.AddDays(5),
Valor = new List<DecimalCampo>
{
new()
{
Tipo = "11", // Valor Principal
Value = 150.50M
}
}
}
},
ValorGnre = 150.50M,
DataPagamento = DateTime.Today
};
// Adiciona a guia ao componente
gnre.Guias.Add(guia);
// Envia o lote
var retornoEnvio = await gnre.EnviarLoteAsync();
Console.WriteLine($"Recibo: {retornoEnvio.Dados.Recibo.Numero}");var numeroRecibo = retornoEnvio.Dados.Recibo.Numero;
var resultadoLote = await gnre.ConsultaLoteAsync(numeroRecibo, incluirPdf: true);
if (resultadoLote.Dados.SituacaoProcess.Codigo == "100") // Processado com Sucesso
{
foreach (var g in resultadoLote.Dados.Resultado.Guia)
{
Console.WriteLine($"Linha Digitável: {g.LinhaDigitavel}");
Console.WriteLine($"Código de Barras: {g.CodigoBarras}");
}
// Salvar PDF da Guia retornada pela SEFAZ
resultadoLote.Dados.Resultado.SalvarGuia(@"C:\GNRe\PDFs\guia_gnre.pdf");
}É possível validar o XML gerado utilizando a classe nativa do OpenAC.Net.DFe.Core:
using OpenAC.Net.DFe.Core;
var xmlString = guia.GetXml();
var caminhoSchema = @"Schemas/lote_gnre_v2.00.xsd";
var valido = XmlSchemaValidation.ValidarXml(xmlString, caminhoSchema, out var erros, out var avisos);
if (!valido)
{
foreach (var erro in erros)
Console.WriteLine($"Erro de validação: {erro}");
}O projeto inclui um aplicativo de demonstração multiplataforma construído com Avalonia UI (.NET 10):
dotnet run --project src/OpenAC.Net.GNRe.Demo/OpenAC.Net.GNRe.Demo.csprojEle permite:
- Testar a configuração do componente e certificados
- Gerar e emitir guias GNRe versão 1.00 e 2.00
- Consultar recibos e configurações por UF
- Visualizar os XMLs enviados e recebidos em tempo real
O projeto possui uma suíte completa de testes unitários utilizando TUnit com validação de serialização, desserialização e conformidade com os schemas XSD oficiais:
dotnet run --project src/OpenAC.Net.GNRe.Tests/OpenAC.Net.GNRe.Tests.csprojContribuições são sempre bem-vindas! Para contribuir:
- Faça um Fork do projeto
- Crie uma branch para sua funcionalidade (
git checkout -b feature/minha-feature) - Faça commit das alterações (
git commit -m 'Adiciona funcionalidade X') - Faça push para a branch (
git push origin feature/minha-feature) - Abra um Pull Request
Dúvidas e discussões podem ser feitas através da nossa comunidade no Discord.
Este projeto é distribuído sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.