Arquitetura
Visão geral
O motor é organizado em camadas/pastas com responsabilidades bem separadas:
Models/: orquestração e ciclo de vida do cálculo (Motor, NotaFiscal, Produto, Emitente, Destinatario)Contexts/: DTO de contexto para cálculo (TaxContext) que reduz acoplamento entre cálculo e objetos do domínioImpostos/: implementações de cálculo por tributo (ICMS/ICMS-ST, IPI, PIS/COFINS, II, ISSQN, IBPT, etc.)RT/: componentes ligados à Reforma Tributária (IBS/CBS/ISE + vigência e auxiliares)Validations/: acumulação e execução de validações (pipeline)Regras/: regras de validação/negócio aplicadas no processamentoUFAliquotas/: tabela de alíquota interestadual (UF origem → UF destino)Enums/,Constants/,Utils/: apoio (tipos fiscais, constantes e funções numéricas)
Componentes principais (C4 — Componentes)
ImpostoMotor (orquestrador)
- Responsabilidade: coordenar execução e expor API principal (
IImpostoMotor) - Arquivo:
Models/ImpostoMotor.cs
Funções relevantes:
NotaFiscal(lazy init)Processar()(executa NF e validações)BuscarUFAliquota(ufOrigem, ufDestino)(resolve alíquota interestadual viaUFAliquotas/)
NotaFiscal (agregador do cálculo)
- Responsabilidade: agrupar emitente/destinatário/produtos/totais e disparar processamento
- Arquivo:
Models/NotaFiscal.cs
Características:
- Suporta produto único (
Produto) ou lista de produtos (AddProduto()+ProdutoList()) - Armazena totais usados para rateio (frete embutido, seguro, acréscimos, descontos, etc.)
- Mantém um
ValidationPipespróprio, executado ao final doMotor.Processar()
Produto (unidade de cálculo)
- Responsabilidade: rateios, regras e processamento de impostos do item
- Arquivo:
Models/Produto.cs
Características:
- Constrói e atualiza um
TaxContextantes de instanciar/processar impostos do item - Seleciona implementação de ICMS conforme o regime tributário do emitente
- Expõe resultados via
ITaxResults(parcialmente, para alguns tributos)
TaxContext (DTO de contexto)
- Responsabilidade: transportar dados e callbacks necessários para cálculo sem depender diretamente de
Produto/NotaFiscal - Arquivo:
Contexts/TaxContext.cs
O TaxContext inclui:
- parâmetros de arredondamento/truncamento (
CalcParams) - dados do emitente/destinatário
- dados do item e rateios
- callback para alíquota interestadual (
OnBuscarAliquotaInterestadual) - acesso ao pipeline de validações (
ValidationPipes)
Padrões observados
- Lazy initialization:
Motor.NotaFiscal,NotaFiscal.Emitente,NotaFiscal.Destinatario,NotaFiscal.Produto - Separação de contexto: cálculos recebem
TaxContextpara reduzir acoplamento - Rateio proporcional por valor bruto: diversos campos do item são rateados como
ValorBruto * (TotalRateio / TotalProdutosNF)(inferido do código)