dfe
Documentos Fiscais Eletrônicos Brasileiros — crate Rust para integração com os webservices da SEFAZ.
Funcionalidades
| Funcionalidade | Descrição |
|---|---|
| Emissão NF-e / NFC-e | Autorização via SOAP para SEFAZ estadual (modelos 55 e 65) |
| Cancelamento | Evento 110111 para NF-e e NFC-e |
| Manifestação do destinatário | Ciência, confirmação, desconhecimento e operação não realizada |
| Distribuição de DF-e | Consulta ao Ambiente Nacional por NSU ou chave de acesso |
| DANFE | Geração de PDF em A4 e 80mm (NF-e e NFC-e) com suporte a logotipo |
| Validação XSD | Schemas SEFAZ embutidos no binário — sem arquivos externos |
| Status do webservice | Consulta de disponibilidade por UF e ambiente |
Instalação
[]
= "0.5.7"
OpenSSL: No Windows, a feature
vendoredé usada automaticamente — nenhuma instalação manual necessária.
Schemas XSD (PL_010b_NT2025_002_v1.21) estão embutidos no binário viainclude_bytes!.
Tratamento de erros
Todas as funções públicas retornam Result<T, DfeError>.
use DfeError;
match resultado
| Variante | Quando ocorre |
|---|---|
Certificado |
Falha ao abrir o .pfx ou senha incorreta |
Xml |
Erro de parsing ou serialização XML |
Assinatura |
Falha na assinatura digital RSA-SHA1 |
Webservice |
Erro HTTP ou resposta inesperada da SEFAZ |
Validacao |
Campo obrigatório ausente ou fora das regras XSD |
Configuracao |
Falha ao ler configuração ou credenciais |
Io |
Erro de leitura/escrita em disco |
NFeBuilder — Emissão de NF-e / NFC-e
use NFeBuilder;
use ;
use Dest;
let resposta = new
.cert
.ide
.emitente
.destinatario
.itens
.total // totais calculados automaticamente dos itens
.transporte
.pagamento
.informacoes_adicionais
// NFC-e: obrigatório também .id_csc() e .csc()
.emitir
.await?;
println!;
println!;
println!;
// resposta.xml → XML autorizado (nfeProc) completo
Métodos do NFeBuilder
| Método | Obrigatório | Descrição |
|---|---|---|
.cert(path, pass) |
✅ | Caminho e senha do certificado .pfx |
.ide(Ide) |
✅ | Identificação do documento |
.emitente(Emit) |
✅ | Dados do emitente |
.itens(Vec<Det>) |
✅ | Lista de itens; totais calculados automaticamente |
.total(Total) |
✅ | Informar apenas frete, seguro, ST, FCP — demais campos auto-calculados |
.transporte(Transp) |
✅ | Modalidade de frete e dados do transportador |
.pagamento(Pag) |
✅ | Forma de pagamento |
.destinatario(Dest) |
— | Obrigatório para NF-e mod 55 |
.informacoes_adicionais(InfAdic) |
— | Informações complementares e ao fisco |
.id_csc(str) |
— | ID do CSC — obrigatório NFC-e |
.csc(str) |
— | Valor do CSC — obrigatório NFC-e |
.desconto_rateio(Decimal) |
— | Desconto global rateado proporcionalmente nos itens |
.emitir() |
— | Valida, assina e transmite para a SEFAZ |
Totais automáticos
Os campos v_bc, v_icms, v_prod, v_pis, v_cofins, v_desc e v_nf são calculados automaticamente dos itens. No Total informe apenas despesas extras:
| Campo | Quando usar |
|---|---|
v_frete, v_seg, v_outro |
Frete, seguro e outras despesas |
v_ii, v_ipi, v_ipi_devol |
Impostos específicos |
v_bc_st, v_st |
Substituição Tributária |
v_fcp, v_fcpst, v_fcpst_ret |
Fundo de Combate à Pobreza |
Para uma venda simples sem extras: Total::default().
Tipos de ICMS suportados
| Variante | Regime | Construtor |
|---|---|---|
Icms00 |
CST 00 — Tributada integralmente (CRT 3) | Icms::icms00(orig, mod_bc, v_bc, p_icms, v_icms) |
Icms40 |
CST 40/41/50 — Isenta/NT/Suspensa (CRT 3) | Icms::icms40(orig, cst) |
Icms60 |
CST 60 — ST cobrada anteriormente (CRT 3) | Icms::icms60(orig) |
Icms90 |
CST 90 — Outros (CRT 3) | Icms::icms90(orig) |
Sn101 |
CSOSN 101 — Com crédito (CRT 1) | Icms::sn101(orig, p_cred_sn, v_cred_icmssn) |
Sn102 |
CSOSN 102/103/300/400 — Sem crédito (CRT 1) | Icms::sn102(orig, csosn) |
Sn500 |
CSOSN 500 — ST anterior (CRT 1) | Icms::sn500(orig) |
Sn900 |
CSOSN 900 — Outros (CRT 1) | Icms::sn900(orig) |
Resposta da emissão
CancelarBuilder — Cancelamento
use CancelarBuilder;
let r = new
.cert
.tp_amb // 1 = Produção | 2 = Homologação
.chave
.protocolo
.justificativa // mín. 15 chars
.mod_ // opcional — padrão 55; 65 para NFC-e
.send
.await?;
println!; // "135" = evento registrado
println!;
// r.send_xml → XML enviado
// r.receive_xml → XML de resposta
| Método | Obrigatório | Descrição |
|---|---|---|
.cert(path, pass) |
✅ | Certificado .pfx |
.tp_amb(u8) |
✅ | Ambiente (1 = Produção, 2 = Homologação) |
.chave(str) |
✅ | Chave de acesso de 44 dígitos |
.protocolo(str) |
✅ | Protocolo de autorização da NF-e |
.justificativa(str) |
✅ | Mínimo 15 caracteres |
.mod_(u32) |
— | Modelo do documento (padrão: 55) |
Manifestação do Destinatário
Eventos enviados ao Ambiente Nacional (AN). O Manifestacao é compartilhado entre os quatro eventos.
use ;
use ;
let params = Manifestacao ;
// 210210 — Ciência da Operação
let r = ciencia_operacao.await?;
// 210200 — Confirmação da Operação
let r = confirmacao_operacao.await?;
// 210220 — Desconhecimento da Operação
let r = desconhecimento_operacao.await?;
// 210240 — Operação Não Realizada (requer justificativa mín. 15 chars)
let r = operacao_nao_realizada.await?;
println!;
println!;
Distribuição de DF-e
Consulta documentos fiscais de interesse do CNPJ no Ambiente Nacional.
use ;
// Últimos documentos
let r = new
.cert_path
.cert_pass
.cnpj
.uf // código IBGE da UF (SP = 35)
.ambiente
.send
.await?;
println!;
if let Some = r.lote_dist_dfe_int
// A partir de um NSU específico
let r = new
.cert_path.cert_pass
.cnpj.uf.ambiente
.nsu
.send.await?;
// Por chave de acesso
let r = new
.cert_path.cert_pass
.cnpj.uf.ambiente
.chave_acesso
.send.await?;
NFeService — Status do Webservice
use NFeService;
let r = new
.cert_path
.cert_pass
.uf
.environment // 1 = Produção | 2 = Homologação
.send
.await?;
println!; // "107" = Serviço em operação
println!;
println!;
DanfeBuilder — Geração de DANFE
Gera o DANFE em PDF a partir do XML autorizado (nfeProc). O modelo do documento (55 ou 65) é detectado automaticamente do campo <mod> no XML.
use DanfeBuilder;
// NF-e A4 — salvar como arquivo
let caminho = new
.xml // caminho .xml ou string XML diretamente
.paper_size // padrão quando omitido
.as_file
.build
.await?;
println!;
// NF-e A4 — com logotipo do emitente, retornar base64
let b64 = new
.xml
.paper_size
.logo // .png/.jpg, base64 puro ou data URI
.as_base64
.build
.await?;
// NF-e 80mm
let b64 = new
.xml
.paper_size
.as_base64
.build
.await?;
// NFC-e 80mm — QR Code lateral
let b64 = new
.xml
.paper_size
.qr_side // QR Code à esquerda (~33mm); chave e protocolo à direita
.as_base64
.build
.await?;
Métodos do DanfeBuilder
| Método | Obrigatório | Descrição |
|---|---|---|
.xml(src) |
✅ | Caminho .xml ou string do nfeProc |
.paper_size(str) |
— | "a4" (padrão), "80mm" ou "54mm" |
.as_file(path) |
✅¹ | Salva o PDF em disco; retorna o caminho |
.as_base64() |
✅¹ | Retorna o PDF como string base64 |
.logo(src) |
— | Logotipo do emitente — apenas A4 |
.qr_side() |
— | Layout QR lateral — apenas NFC-e 80mm |
¹ Use .as_file() ou .as_base64() — nunca os dois.
Formatos implementados
| Tamanho | Modelo 55 (NF-e) | Modelo 65 (NFC-e) |
|---|---|---|
"a4" |
✅ (suporta .logo()) |
❌ |
"80mm" |
✅ | ✅ (suporta .qr_side()) |
"54mm" |
❌ | ❌ |
Logotipo do emitente — .logo(src)
O logo é renderizado no topo da coluna do emitente, centralizado horizontalmente, com altura máxima de 18mm. A proporção é sempre mantida; a imagem nunca é ampliada além do tamanho original.
| Formato de entrada | Exemplo |
|---|---|
| Caminho de arquivo | "./logo.png" / "./logo.jpg" |
| Base64 puro | "iVBORw0KGgo..." |
| Data URI | "data:image/png;base64,iVBORw0KGgo..." |
Testes
Os testes estão em src/bin/tests/ e cobrem:
| Suite | Arquivo | Descrição |
|---|---|---|
| DANFE NF-e A4 | test_danfe_nfe_a4.rs |
Geração A4 modelo 55 (base64, arquivo, erro modelo 65) |
| DANFE NFC-e 80mm | test_danfe_nfce.rs |
Geração 80mm modelo 65 (multi-pagamento, CPF, qr_side, erros) |
| XML Extractor | test_xml_extractor.rs |
Parsing de nfeProc a partir de string e arquivo |
| Integração | mod.rs |
Status SEFAZ, emissão NF-e/NFC-e, cancelamento, DANFE¹ |
¹ Os testes de integração (test_emit_nfe, test_emit_nfce, test_cancelar_nfe, test_service_status) requerem certificado .pfx válido e conectividade com a SEFAZ em homologação.
Os testes de DANFE e XML não requerem certificado nem conexão.
Notas importantes
- Sempre teste em homologação (
tp_amb: 2) antes de produção. - O certificado
.pfxé lido do disco a cada operação — nunca cacheado em memória. - Os webservices cobertos são da SEFAZ/SP e do Ambiente Nacional. Para outras UFs, contribua adicionando URLs em
interno/ws.rs. - Em
tp_amb = 2, o campox_proddo primeiro item é substituído automaticamente por"NOTA FISCAL EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"(exigência SEFAZ).
Licença
MIT — veja LICENSE.