Custo FIFO (CMV)

Dúvida: como o M3R calcula o custo da saída se não existe recálculo de custo médio.

Dúvida: como o custo de estoque funciona no M3R?

Ambiente: o custo é a camada FACL01, consumida na saída. Não há rotina que recalcule custo médio de um período já movimentado.

O M3R aplica FIFO no ato da saída, dentro da transação (consumeFIFO()). O custo da NF é o da confirmação: alterar o tipo de movimento depois não refaz o custo de entradas já gravadas.

Entrada

Confirmação de NF (e outras entradas que criam camada) grava FACL01 com quantidade e custo unitário na UM de estoque. Atualiza Product.lastPrice e averageCost.

Saída

Ordem: entryDate ASC, empate id ASC. Consome quantidade da camada mais antiga. Se a quantidade da saída é maior que o resto da camada, parte para a próxima.

Se não há camada restante: usa Product.averageCost. Nunca usa salePrice.

Se a soma das camadas é menor que a quantidade: exceção (não há estoque de custo) — a operação inteira dá rollback.

Onde a saída consome FIFO

Faturamento, documento de saída, OP (consumo de MP), ajuste negativo, doação, e demais origens S que passam pelo writer.

Estorno

Cria movimento inverso e devolve consistência de saldo; o original permanece no razão (reversal_of_id). Não “edita” o custo da linha antiga.

Relatório

Kardex mostra custo de entrada, custo de saída e saldo valor. Relatório de valuation: /apps/stock/reports/valuation.

Contábil

CMV do período sai das saídas FIFO, não de um recálculo mensal. Doação industrial: D CMV / C estoque (evento contábil).