Runtime Flow
Fluxo principal (Motor → NF → Itens → Validações)
1) ImpostoMotor.Processar()
Arquivo: Models/ImpostoMotor.cs
Comportamento observado:
- Se
NotaFiscalainda não foi instanciada, retorna sem processar - Caso exista, chama:
NotaFiscal.Processar()NotaFiscal.ValidationPipes().Validate()
2) NotaFiscal.Processar()
Arquivo: Models/NotaFiscal.cs
Comportamento observado:
- Executa pré-condições via
DoAssert():Emitente.RegimeTributarionão pode serNotDefinedDestinatario.ContribuinteIcmsnão pode serNotDefinedTotalProdutosNFdeve ser> 0
- Se houver itens adicionados via
AddProduto(), processa todos e executa ajuste de diferenças:- Processa cada item chamando
Produto.Processar() - Seleciona o item de maior total (
AsTotalProduto()) e chamaProcessarDiffRateio()nele
- Processa cada item chamando
- Caso contrário, processa o
Produtoúnico (se existir)
3) Produto.Processar()
Arquivo: Models/Produto.cs
Comportamento observado:
- Executa pré-condições via
DoAssert():PrecoUnitario > 0Quantidade > 0Cfop > 0
- Aplica regra de validação do produto (por CFOP e outras validações):
new RegraProdutoValidar(this).Validar()
- Processa rateios do item (proporcional ao valor bruto do item sobre
TotalProdutosNF) - Processa impostos:
ProcessarImpostos()(método interno doProduto)
Rateio e ajuste de diferenças
Rateio proporcional
Padrão de rateio observado (exemplo):
freteRateio = ValorBrutoItem * (FreteEmbutidoNF / TotalProdutosNF)
Esse padrão aparece para frete embutido, seguro, despesas acessórias, acréscimo, desconto e outros campos.
Ajuste de diferenças (ProcessarDiffRateio)
Quando existem múltiplos itens:
- A nota fiscal escolhe o item com maior
AsTotalProduto() - Nesse item, executa rotinas de “diff” para ajustar possíveis diferenças decorrentes de arredondamento/truncamento no rateio
O ajuste de diferença é inferido da estrutura do código (nome e invocação). O comportamento exato do ajuste depende das rotinas internas
ProcessarDiff*doProduto.
Validações
O pipeline de validação (Validations/ValidationPipes.cs) funciona assim:
- Regras/validators adicionam entradas com
ValidationPipes.Add() - Ao final do
Motor.Processar(), o pipeline executa todos os validadores e acumula mensagens de falha - O consumidor pode ler mensagens via
NotaFiscal.ValidationPipes().ListMessages()