fiscal-rsfiscal-rs

InvoiceBuilder

Construindo documentos fiscais com o builder typestate

O InvoiceBuilder usa o padrão typestate para garantir em tempo de compilação que o documento fiscal passe pelas etapas corretas: DraftBuiltSigned.

Ciclo de vida

Loading diagram...

Criando uma NF-e

1. Emissor (IssuerData)

use fiscal::types::*;

let issuer = IssuerData::new(
    "25028332000105",   // CNPJ
    "140950881119",     // IE
    "Minha Empresa LTDA",
    TaxRegime::Normal,
    "35",               // codigo UF
    "3550308",          // codigo municipio IBGE
    "Rua Principal",
    "100",
    "Centro",
    "SAO PAULO",
    "01000000",         // CEP
);

Campos opcionais via builder:

  • .trade_name("Nome Fantasia")
  • .address_complement("Sala 1")

2. Destinatario (RecipientData)

let recipient = RecipientData::new("17812455000295", "Cliente LTDA")
    .state_tax_id("142304338112")
    .street("Rua do Cliente")
    .street_number("200")
    .district("Bairro")
    .city_code(IbgeCode::new("3550308"))
    .city_name("SAO PAULO")
    .state_code("SP")
    .zip_code("05302001");

3. Itens (InvoiceItemData)

let item = InvoiceItemData::new(
    "001",           // c_prod
    "Produto",       // descricao
    "18069000",      // NCM
    "5102",          // CFOP
    "UN",            // unidade
    1000,            // quantidade (x1000)
    10000,           // valor unitario (centavos)
    10000,           // valor total (centavos)
    "00",            // CST ICMS
    1800,            // aliquota ICMS
    10000,           // base ICMS
    "01",            // CST PIS
    "01",            // CST COFINS
)
.c_ean("7891234567890")
.cest("1700700")
.v_frete(500)
.v_desc(100);

4. Construindo

use fiscal::xml_builder::InvoiceBuilder;

let invoice = InvoiceBuilder::new(issuer, SefazEnvironment::Homologation, InvoiceModel::NFe)
    .series(1)
    .invoice_number(502)
    .operation_nature("VENDA")
    .recipient(recipient)
    .items(vec![item])
    .payments(vec![PaymentData::new("01", 10000)])
    .build()?;

// Acesso ao XML e chave
let xml = invoice.xml();
let access_key = invoice.access_key();

5. Assinando

use fiscal::certificate::{load_certificate, sign_xml};

let pfx = std::fs::read("certificado.pfx")?;
let cert = load_certificate(&pfx, "senha")?;

let signed = invoice.sign_with(|xml| {
    sign_xml(xml, &cert.private_key, &cert.certificate)
})?;

let signed_xml = signed.signed_xml();

Campos opcionais

O builder aceita diversos campos opcionais:

MetodoDescricao
.contingency(data)Dados de contingencia
.transport(data)Informacoes de transporte
.billing(data)Fatura e duplicatas
.additional_info(info)Informacoes adicionais
.references(refs)Documentos referenciados
.intermediary(data)Indicador de intermediador
.tech_responsible(data)Responsavel tecnico
.purchase(data)Dados de compra
.export(data)Dados de exportacao

NFC-e (modelo 65)

Para NFC-e, use InvoiceModel::NFCe:

let invoice = InvoiceBuilder::new(issuer, SefazEnvironment::Homologation, InvoiceModel::NFCe)
    .series(1)
    .invoice_number(1)
    .operation_nature("VENDA")
    .add_item(item)
    .payments(vec![PaymentData::new("01", 10000)])
    .build()?;

On this page