Skip to main content

Quickstart

This quickstart shows a minimal usage of the engine based on the public interfaces (Interfaces/) and the flows implemented in Models/ImpostoMotor.cs, Models/NotaFiscal.cs, and Models/Produto.cs.

Requirements

  • .NET 8

Example: single product

using MCIBr.Enums;
using MCIBr.Interfaces;
using MCIBr.Models;

var motor = new ImpostoMotor
{
TipoOperacao = OperacaoDestino.Interna,
CalcParam = new CalcParams
{
CalcType = CalcType.Round,
CalcDecimal = 2
}
};

var nf = motor.NotaFiscal;
nf.ModeloDFe = ModeloDFe.NFe;

nf.TotalProdutosNF = 100;
nf.FreteEmbutidoNF = 0;
nf.SeguroNF = 0;
nf.DespesasAcessoriasNF = 0;
nf.AcrescimoNF = 0;
nf.DescontoNF = 0;

var emit = nf.Emitente;
emit.UFSigla = "SP";
emit.RegimeTributario = RegimeTributario.LucroPresumido;
emit.ContribuinteIpi = ContribuinteIpi.Contribuinte;

var dest = nf.Destinatario;
dest.UFSigla = "SP";
dest.ContribuinteIcms = ContribuinteIcms.Contribuinte;
dest.ConsumidorFinal = false;

var item = nf.Produto;
item.Item = "Produto A";
item.Cfop = 5102;
item.Quantidade = 1;
item.PrecoUnitario = 100;
item.TipoVenda = TipoVenda.Revenda;

motor.Processar();

var mensagens = nf.ValidationPipes().ListMessages();
var valorIcms = item.ICMS.AsValor();

Example: multiple products (allocation + diff adjustment)

When you use AddProduto(), NotaFiscal processes all items and selects the highest-total product to execute ProcessarDiffRateio(), adjusting differences generated by allocation rounding/truncation.

using MCIBr.Enums;
using MCIBr.Models;

var motor = new ImpostoMotor();
motor.TipoOperacao = OperacaoDestino.Interna;

var nf = motor.NotaFiscal;
nf.TotalProdutosNF = 300;
nf.FreteEmbutidoNF = 30;

nf.Emitente.UFSigla = "SP";
nf.Emitente.RegimeTributario = RegimeTributario.SimplesNacional;
nf.Destinatario.UFSigla = "RJ";
nf.Destinatario.ContribuinteIcms = ContribuinteIcms.NaoContribuinte;
nf.Destinatario.ConsumidorFinal = true;

var p1 = nf.AddProduto();
p1.Item = "P1";
p1.Cfop = 6102;
p1.Quantidade = 1;
p1.PrecoUnitario = 200;

var p2 = nf.AddProduto();
p2.Item = "P2";
p2.Cfop = 6102;
p2.Quantidade = 1;
p2.PrecoUnitario = 100;

motor.Processar();

Common Errors

  • If Emitente.RegimeTributario is not set, NotaFiscal.Processar() throws InvalidOperationException.
  • If Destinatario.ContribuinteIcms is not set, NotaFiscal.Processar() throws InvalidOperationException.
  • If TotalProdutosNF is <= 0, NotaFiscal.Processar() throws InvalidOperationException.
  • If a product PrecoUnitario, Quantidade, or Cfop is invalid, Produto.Processar() throws InvalidOperationException.

See details in: Troubleshooting.