Sitelet https://github.com/OpenAC-Net/OpenAC.Net.DFe.Core
Skip to content

About

Biblioteca para serialização e deserialização de xml e comunicação com os webservices

Resources

Stars

8 stars

Watchers

5 watching

Forks

Latest commit

 

History

45 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OpenAC.Net.DFe.Core

Núcleo de serialização XML de alta performance, assinatura digital e comunicação com Web Services para Documentos Fiscais Eletrônicos (DF-e).

Nuget version Nuget downloads License: MIT Discord


📌 Visão Geral

O OpenAC.Net.DFe.Core é a biblioteca base do ecossistema OpenAC .Net para desenvolvimento e integração com Documentos Fiscais Eletrônicos no Brasil (NF-e, NFC-e, CT-e, MDF-e, SAT/CF-e, NFS-e, BP-e, CIOT, entre outros).

Ele provê a infraestrutura fundamental de:

  • Serialização e Deserialização XML: Baseada em Roslyn Source Generator em tempo de compilação (Zero Reflection, alta performance e compatibilidade nativa com AOT/Trimming).
  • Assinatura Digital XML-DSig: Suporte completo a certificados digitais ICP-Brasil (A1 e A3) com algoritmos SHA-1 e SHA-256.
  • Validação de Schemas XSD: Validação sintática e estrutural rigorosa contra schemas oficiais da SEFAZ.
  • Clientes de Web Services: Clientes base para comunicação SOAP e REST com suporte a mTLS, timeout configurável, logs de requisição/resposta e regras de contingência (SVC-AN, SVC-RS, etc.).

🚀 Principais Recursos

  • ⚡ Source Generator Integrado: Não utiliza Reflection em tempo de execução. O gerador é embutido no próprio pacote e gera métodos C# nativos (WriteToXml, ReadFromXml) durante a compilação.
  • 🔒 Pronto para Native AOT: Compatível com compilação Ahead-of-Time (.NET 8, .NET 9 e .NET 10).
  • 🏷️ Anotações Fiscais Especializadas: Atributos específicos para regras da SEFAZ ([DFeRoot], [DFeElement], [DFeAttribute], [DFeCollection], [DFeEnum], [DFeDictionary]).
  • 🔢 Tipagem Fiscal Rigorosa (TipoCampo): Formatação automática para decimais de 2 a 10 casas (De2, De3, De4, De6, De10), datas fiscais (Dat, DatCFe), horas (Hor, HorCFe) e fusos horários (DatHorTz).
  • 📁 Gerenciamento Inteligente de Arquivos: Organização automática de XMLs por CNPJ, Modelo, Ano e Mês.
  • 🎯 Multi-Targeting: Suporte a .NET Standard 2.0, .NET 6.0, .NET 7.0, .NET 8.0+ e .NET Framework 4.6.2+.

📦 Instalação

Adicione o pacote via CLI do .NET:

dotnet add package OpenAC.Net.DFe.Core

Ou através do Gerenciador de Pacotes do Visual Studio:

Install-Package OpenAC.Net.DFe.Core

(O Source Generator já está embutido no pacote. Nenhuma instalação adicional é necessária!)


💡 Exemplos de Uso

1. Criando um Modelo e Serializando para XML

Basta declarar a classe como partial e utilizar as anotações do OpenAC.Net:

using System;
using System.Collections.Generic;
using OpenAC.Net.DFe.Core.Attributes;
using OpenAC.Net.DFe.Core.Document;
using OpenAC.Net.DFe.Core.Serializer;

namespace MeuProjeto.Modelos;

[DFeRoot("NFe", Namespace = "http://www.portalfiscal.inf.br/nfe")]
public partial class NotaFiscal : DFeDocument<NotaFiscal>
{
    [DFeAttribute(TipoCampo.Str, "Id")]
    public string Id { get; set; } = string.Empty;

    [DFeElement(TipoCampo.DatHorTz, "dhEmi", Ocorrencia = Ocorrencia.Obrigatoria)]
    public DateTimeOffset DataEmissao { get; set; }

    [DFeElement(TipoCampo.De2, "vNF", Ocorrencia = Ocorrencia.Obrigatoria)]
    public decimal ValorTotal { get; set; }

    [DFeCollection("itens")]
    [DFeItem(typeof(ItemNota), "det")]
    public List<ItemNota> Itens { get; set; } = new();
}

public partial class ItemNota
{
    [DFeAttribute(TipoCampo.Int, "nItem")]
    public int NumeroItem { get; set; }

    [DFeElement(TipoCampo.Str, "cProd", Ocorrencia = Ocorrencia.Obrigatoria)]
    public string CodigoProduto { get; set; } = string.Empty;

    [DFeElement(TipoCampo.De2, "vProd", Ocorrencia = Ocorrencia.Obrigatoria)]
    public decimal ValorProduto { get; set; }
}

Gerando e Lendo o XML:

// 1. Instanciar o modelo
var nfe = new NotaFiscal
{
    Id = "NFe35260100000000000191550010000000011000000011",
    DataEmissao = DateTimeOffset.Now,
    ValorTotal = 150.00m,
    Itens =
    {
        new ItemNota { NumeroItem = 1, CodigoProduto = "PROD001", ValorProduto = 150.00m }
    }
};

// 2. Serializar para string XML (gerado pelo Source Generator em tempo de compilação)
string xml = nfe.WriteToXml();
Console.WriteLine(xml);

// 3. Deserializar a partir de XML
NotaFiscal documento = NotaFiscal.Load(xml);
Console.WriteLine($"Carregado: {documento.Id} - Total: {documento.ValorTotal:C2}");

2. Assinando Digitalmente um Documento (XML-DSig)

Para documentos que exigem assinatura digital, herde de DFeSignDocument<T>:

using System.Security.Cryptography.X509Certificates;
using OpenAC.Net.DFe.Core.Common;
using OpenAC.Net.DFe.Core.Document;

public partial class MinhaNFeAssinada : DFeSignDocument<MinhaNFeAssinada>
{
    // Propriedades do documento...
}

// Assinando o XML:
var cert = new X509Certificate2("certificado.pfx", "senha123");
minhaNFe.Assinar(cert, TipoAssinatura.RsaSha1, "infNFe", "NFe");

// Obtendo o XML assinado completo com a tag <Signature>
string xmlAssinado = minhaNFe.WriteToXml();

3. Validando XML contra Schemas XSD

using System.Xml.Schema;
using OpenAC.Net.DFe.Core;

var validador = new XmlSchemaValidation();
validador.AddSchema("http://www.portalfiscal.inf.br/nfe", @"C:\Schemas\nfe_v4.00.xsd");

bool valido = validador.Validar(xmlString, out string erros);

if (!valido)
{
    Console.WriteLine($"Erros de validação:\n{erros}");
}

🏛️ Estrutura da Solução

OpenAC.Net.DFe.Core/
├── src/
│   ├── OpenAC.Net.DFe.Core/            # Biblioteca principal (Modelos, Assinatura, Serviços)
│   ├── OpenAC.Net.DFe.Generator/       # Roslyn Incremental Source Generator
│   ├── OpenAC.Net.DFe.Generator.Sample/# Projeto de demonstração
│   └── OpenAC.Net.DFe.Core.Tests/      # Suíte unificada de testes unitários (TUnit)

🧪 Executando os Testes

Os testes unitários cobrem todos os tipos de campos, coleções, dicionários, CDATA, enums, interfaces polimórficas e o próprio Source Generator.

Para executar os testes via linha de comando:

dotnet test

🤝 Como Contribuir

Contribuições da comunidade são muito bem-vindas!

  1. Faça um Fork do repositório.
  2. Crie uma Branch para sua funcionalidade ou correção:
    git checkout -b feature/minha-melhoria
  3. Garanta que todos os testes passem:
    dotnet test
  4. Envie seus commits com mensagens descritivas:
    git commit -m "feat: adiciona suporte ao novo campo"
  5. Abra um Pull Request.

💬 Comunidade

Participe da comunidade de desenvolvedores do OpenAC .Net:


📄 Licença

Este projeto é distribuído sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.

About

Biblioteca para serialização e deserialização de xml e comunicação com os webservices

Resources

Stars

8 stars

Watchers

5 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages