Skip to main content

NFSe Nacional - Python SDK

Python License Ruff

SDK Python para integração com a API de emissão de Notas Fiscais de Serviço (NFSe) da Nota Nacional. Este projeto facilita a emissão de NFSe seguindo o padrão nacional, incluindo construção do XML, assinatura digital e comunicação com a API oficial.

📋 Índice

✨ Características

  • Conformidade com XSD: Geração de XML validado contra o schema oficial
  • Assinatura Digital: Suporte a certificados A1 (.pfx) para assinatura XML
  • Autenticação Automática: Autenticação via certificado digital (sem necessidade de API keys)
  • Validação Integrada: Validação XSD antes do envio
  • Ambientes Separados: Suporte para produção restrita e produção real
  • Testes Automatizados: Suite completa de testes com validação XSD
  • Type Hints: Código totalmente tipado para melhor experiência de desenvolvimento
  • Documentação Completa: Exemplos e documentação detalhada

🚀 Instalação

Pré-requisitos

  • Python 3.8 ou superior
  • Certificado digital A1 (.pfx) válido
  • Arquivos XSD da especificação (disponíveis em schemas/)

Instalação via pip

pip install -r requirements.txt

Instalação para Desenvolvimento

# Clone o repositório
git clone https://github.com/mupisystems/nfse_nacional.git
cd nfse_nacional

# Crie um ambiente virtual
python -m venv venv

# Ative o ambiente virtual
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate

# Instale as dependências
pip install -r requirements.txt

💡 Uso Rápido

Exemplo Básico

from src.nfse.emissor import NFSeEmissor
from src.nfse.api_client import Ambiente
from src.nfse.models import DPS, Prestador, Tomador, Servico, Endereco, Tributo
from decimal import Decimal
from datetime import datetime

# 1. Configure o emissor
emissor = NFSeEmissor(
    pfx_path="caminho/para/certificado.pfx",
    pfx_password="senha_do_certificado",
    ambiente=Ambiente.PRODUCAO_RESTRITA  # ou Ambiente.PRODUCAO_REAL
)

# 2. Crie os dados do prestador
prestador = Prestador(
    cpf_cnpj="12345678000190",
    inscricao_municipal="123456",
    optante_simples_nacional=True,
    op_simp_nac=3,  # ME/EPP
    reg_apuracao_sn=1,
    p_tot_trib_sn=Decimal("15.00")
)

# 3. Crie os dados do tomador
tomador = Tomador(
    cpf_cnpj="98765432000100",
    razao_social="Cliente Exemplo Ltda"
)

# 4. Crie os dados do serviço
servico = Servico(
    codigo_servico="1401",
    descricao="Desenvolvimento de software",
    valor_servico=Decimal("1000.00"),
    codigo_municipio="3550308"  # Código IBGE
)

# 5. Crie o DPS
dps = DPS(
    prestador=prestador,
    tomador=tomador,
    servicos=[servico],
    numero_rps="100000000000001",
    serie_rps="00001",
    data_emissao=datetime.now(),
    c_loc_emi="3550308"  # Código IBGE do município emissor
)

# 6. Emita a nota fiscal
resultado = emissor.emitir_nota(dps, validate_xml=True)
print(f"Nota emitida: {resultado}")

Exemplo Completo

Consulte o arquivo examples/exemplo_basico.py para um exemplo completo e comentado com todos os campos disponíveis.

📚 Documentação

Componentes Principais

NFSeEmissor

Classe principal que orquestra todo o fluxo de emissão:

  • Construção do XML do DPS
  • Assinatura digital com certificado A1
  • Envio para a API da Nota Nacional

XMLBuilder

Constrói o XML do DPS conforme o schema XSD oficial:

from src.nfse.xml_builder import XMLBuilder

builder = XMLBuilder(xsd_path="schemas/DPS_v1.00.xsd")
xml = builder.build_dps_xml(dps, validate=True)

Modelos de Dados

  • DPS: Declaração de Prestação de Serviço
  • Prestador: Dados do prestador (emissor)
  • Tomador: Dados do tomador (cliente)
  • Servico: Dados do serviço prestado
  • Tributo: Informações de tributação
  • Endereco: Dados de endereço

Fluxo de Emissão

  1. Construção do XML: Monta o XML da Declaração de Prestação de Serviço (DPS) com todos os dados necessários
  2. Assinatura Digital: Assina o XML com certificado digital A1 (.pfx)
  3. Validação XSD: Valida o XML assinado contra o schema oficial (opcional)
  4. Envio para API: Envia o XML comprimido (gzip) e codificado (base64) para a API

📁 Estrutura do Projeto

nfse_nacional/
├── src/
│   └── nfse/              # Módulo principal
│       ├── __init__.py
│       ├── models.py      # Modelos de dados
│       ├── xml_builder.py # Construtor de XML
│       ├── signer.py      # Assinatura digital
│       ├── api_client.py  # Cliente HTTP
│       ├── emissor.py     # Classe principal
│       └── config.py      # Configurações
├── tests/                  # Testes automatizados
│   ├── test_xml_builder.py
│   ├── test_client.py
│   └── conftest.py
├── examples/              # Exemplos de uso
│   └── exemplo_basico.py
├── schemas/               # Arquivos XSD
│   ├── DPS_v1.00.xsd
│   └── tiposComplexos_v1.00.xsd
├── requirements.txt       # Dependências
├── pyproject.toml        # Configuração do projeto
└── README.md

🛠️ Desenvolvimento

Executando os Testes

# Todos os testes
pytest tests/

# Com cobertura de código
pytest tests/ --cov=src --cov-report=html

# Apenas testes de validação XML
pytest tests/test_xml_builder.py -v

# Com output detalhado
pytest tests/ -v -s

Validação XSD

Os testes validam automaticamente o XML gerado contra o schema XSD oficial:

  • ✅ Estrutura do XML
  • ✅ Elementos obrigatórios
  • ✅ Tipos de dados
  • ✅ Valores permitidos
  • ✅ Geração correta do ID do DPS

Formatação de Código

Usamos ruff para linting e formatação (substitui black e flake8):

# Instalar ruff
pip install ruff

# Formatar código
ruff format src/ tests/ examples/

# Verificar linting
ruff check src/ tests/ examples/

# Formatar e verificar linting
ruff check --fix src/ tests/ examples/

🤝 Contribuindo

Contribuições são muito bem-vindas! Este é um projeto open source e estamos abertos a melhorias, correções e novas funcionalidades.

📖 Leia nosso Guia de Contribuição para detalhes completos.

Formas de Contribuir

Processo Rápido

  1. Fork o projeto
  2. Crie uma branch (git checkout -b feature/MinhaFeature)
  3. Commit suas mudanças (git commit -m 'Adiciona MinhaFeature')
  4. Push para a branch (git push origin feature/MinhaFeature)
  5. Abra um Pull Request

Áreas que Precisam de Contribuição

  • 🔍 Melhorias na validação XSD
  • 📝 Documentação adicional e exemplos
  • 🧪 Mais casos de teste
  • 🌐 Suporte a outros formatos/cenários
  • 🐛 Correção de bugs
  • ⚡ Otimizações de performance

📄 Licença

Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.

💬 Suporte

  • 📖 Documentação: Consulte os exemplos em examples/
  • 🐛 Bugs: Reporte em Issues
  • 💡 Sugestões: Abra uma Issue com a tag enhancement
  • 📧 Contato: [Seu email ou link de contato]

🙏 Agradecimentos

Agradecemos a todos os contribuidores que ajudam a melhorar este projeto!


Nota: Este projeto não é oficialmente afiliado à Nota Nacional ou à Receita Federal. É uma implementação open source da comunidade para facilitar a integração com a API oficial.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nfse_nacional-0.1.0.tar.gz (47.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nfse_nacional-0.1.0-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file nfse_nacional-0.1.0.tar.gz.

File metadata

  • Download URL: nfse_nacional-0.1.0.tar.gz
  • Upload date:
  • Size: 47.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for nfse_nacional-0.1.0.tar.gz
Algorithm Hash digest
SHA256 7a0ef45a0b646020126a1bd245e443897d161aa953adcbfd8ad4584d419911ec
MD5 c2a2e238e6e5ad59c375101cc5cbd870
BLAKE2b-256 5da99ff51f6e0905b196cc82ba8704271846babc1e028f1285a66abb67d2ad3a

See more details on using hashes here.

File details

Details for the file nfse_nacional-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: nfse_nacional-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for nfse_nacional-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 34aaf8de690939af7ed63644b833d055d48ad51cfbc3aa0d8d522eeebb4b0cfa
MD5 d5eae6c1941d7a3f5c53ec9dcc6937ec
BLAKE2b-256 ae9da3a7aa763f41138b7ae30bfd024f9cf3a655dba0873e37b6c7fb43a0a9b5

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page