SDK Python para integração com a API de emissão de Notas Fiscais de Serviço (NFSe) da Nota Nacional
Project description
NFSe Nacional - Python SDK
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
- Instalação
- Uso Rápido
- Documentação
- Estrutura do Projeto
- Desenvolvimento
- Contribuindo
- Licença
- Suporte
✨ 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çoPrestador: Dados do prestador (emissor)Tomador: Dados do tomador (cliente)Servico: Dados do serviço prestadoTributo: Informações de tributaçãoEndereco: Dados de endereço
Fluxo de Emissão
- Construção do XML: Monta o XML da Declaração de Prestação de Serviço (DPS) com todos os dados necessários
- Assinatura Digital: Assina o XML com certificado digital A1 (.pfx)
- Validação XSD: Valida o XML assinado contra o schema oficial (opcional)
- 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
- 🐛 Reportar bugs: Use o template de bug report
- 💡 Sugerir funcionalidades: Use o template de feature request
- 💻 Contribuir com código: Veja o Guia de Contribuição
- 📝 Melhorar documentação: Corrija erros ou adicione exemplos
- 🧪 Adicionar testes: Aumente a cobertura de testes
- 🔍 Revisar código: Ajude a revisar Pull Requests
Processo Rápido
- Fork o projeto
- Crie uma branch (
git checkout -b feature/MinhaFeature) - Commit suas mudanças (
git commit -m 'Adiciona MinhaFeature') - Push para a branch (
git push origin feature/MinhaFeature) - 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a0ef45a0b646020126a1bd245e443897d161aa953adcbfd8ad4584d419911ec
|
|
| MD5 |
c2a2e238e6e5ad59c375101cc5cbd870
|
|
| BLAKE2b-256 |
5da99ff51f6e0905b196cc82ba8704271846babc1e028f1285a66abb67d2ad3a
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34aaf8de690939af7ed63644b833d055d48ad51cfbc3aa0d8d522eeebb4b0cfa
|
|
| MD5 |
d5eae6c1941d7a3f5c53ec9dcc6937ec
|
|
| BLAKE2b-256 |
ae9da3a7aa763f41138b7ae30bfd024f9cf3a655dba0873e37b6c7fb43a0a9b5
|