Pular para o conteúdo principal

Modalidade de Cálculo de Rateio de Frete

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → "Modalidade de Cálculo de Rateio de Frete" Tabela: PARMFATUR.ST_MODALIDADECALCULOFRETE Valor padrão: P (Quantidade)

Define o critério usado para ratear o valor do frete (campo VL_FRETE da nota/pedido) entre os itens do documento. É a regra proporcional de distribuição: por quantidade/peso informado no item, por valor líquido do item, ou por peso líquido do produto cadastrado.

O rateio ocorre automaticamente no momento de gravar/recalcular os itens de nota fiscal, pedido e movimentação de estoque.

Telas impactadas​

MóduloCódigoOnde o parâmetro é utilizado
Nota Fiscal EntradaMNF001Ratear frete nos itens da nota ao digitar VL_FRETE (UdmMNF001.pas:9009). Também na atualização do custo do estoque via UFRETENF.pas
Pedido de VendaMPD002Parâmetro lido no carregamento (UdmMPD002.pas:5746)
Pedido de Venda MobileMPD020Parâmetro lido na inicialização (UdmMPD020.pas:369)
Pedido (Outro Tipo)MPD024Ratear frete nos itens do pedido (UdmMPD024.pas:445)
Pedido de CompraMPD001Parâmetro lido no carregamento (UdmMPD001.pas:253)
Parâmetros de FaturamentoMFA001Tela onde o parâmetro é configurado

Procedures e views impactadas​

ObjetoArquivoDescrição
POPULA_ITEMFRETENOTAScripts/POPULA_ITEMFRETENOTA.sqlGera ITEMFRETENOTA a partir de FRETENOTA, usando ST_MODALIDADECALCULOFRETE para decidir o critério de rateio
RECALCULA_ESTOQUEScripts/RECALCULA_ESTOQUE.sqlRecálculo geral de estoque — lê o parâmetro (linha 157) em I_ST_MODALIDADE_CALCULO_FRETE para repropagar frete no custo
RECALCULA_ESTOQUEDIAScripts/RECALCULA_ESTOQUEDIA.sqlRecálculo diário de estoque — lê o parâmetro (linha 135) para aplicar no custo do dia

Campos envolvidos​

CampoDescrição
NOTA.VL_FRETE / PEDIDO.VL_FRETEValor total do frete informado no documento
ITEMNOTA.VL_FRETE / ITEMPEDIDO.VL_FRETEValor do frete rateado para cada item
ITEMNOTA.QT_ITEMNOTA / ITEMPEDIDO.QT_PEDIDAQuantidade usada no rateio quando TP_UNIDADE = 'Q'
ITEMNOTA.PS_ITEMNOTA / ITEMPEDIDO.PS_PEDIDOPeso usado no rateio quando TP_UNIDADE <> 'Q'
ITEMNOTA.VL_TOTAL - VL_DESCONTOValor líquido do item (base para modalidade por valor)
TIPOCALCULO.TP_UNIDADEDefine se o item é calculado por Quantidade ou por peso
ITEM.PS_LIQUIDOEMBPeso líquido cadastrado em TPO001 — usado na modalidade 'S'
ITEMFRETENOTA.VL_FRETEFrete rateado por CT-e sobre item da nota de origem (modalidade 'S')

Opções disponíveis​

P - Quantidade (padrão)​

O que fazDetalhe
Critério de rateioProporcional à quantidade (ou peso do item) — não ao valor
Rateio em pedido (MPD024)VL_FRETE_ITEM = (VL_FRETE_TOTAL × QT_PEDIDA) / ΣQT_PEDIDA quando TP_UNIDADE = 'Q', senão usa PS_PEDIDO / ΣPS_PEDIDO
Rateio em NF Entrada (MNF001)Se TP_UNIDADE = 'Q': (QT_ITEMNOTA × VL_FRETE) / ΣQT_ITEMNOTA; caso contrário: (PS_ITEMNOTA × VL_FRETE) / ΣPS_ITEMNOTA
Rateio no estoque (UFRETENF.pas)(QT_ESTOQUE × VL_FRETE) / ΣQT_ESTOQUE
Quando usarQuando os itens têm custo de transporte proporcional à quantidade movimentada (commodities, itens pesados semelhantes)

Código real — MPD024 (UdmMPD024.pas:453-458)​

else begin
{ Rateio por Peso }
if (tabITEMPEDIDOTP_UNIDADE.AsString = 'Q') then
iVlFrete := RoundTo(((tabPEDIDOVL_FRETE.AsFloat * tabITEMPEDIDOQT_PEDIDA.AsFloat) / qtItemPedido ), -2)
else
iVlFrete := RoundTo(((tabPEDIDOVL_FRETE.AsFloat * tabITEMPEDIDOPS_PEDIDO.AsFloat) / qtItemPedido ), -2)
end;

Simulação passo a passo​

  1. MFA001 → Notas Fiscais → Parâmetros de Notas → Modalidade de Cálculo de Rateio de Frete = Quantidade
  2. Salve (F6).
  3. Abra um Pedido (MPD024) com 3 itens:
    • Item A: QT_PEDIDA = 10, VL_TOTAL = 100,00
    • Item B: QT_PEDIDA = 30, VL_TOTAL = 300,00
    • Item C: QT_PEDIDA = 60, VL_TOTAL = 600,00
    • Soma das quantidades = 100
  4. Informe VL_FRETE do pedido = R$ 200,00.
  5. O sistema calcula (supondo TP_UNIDADE = 'Q'):
    • Item A: (200 × 10) / 100 = R$ 20,00
    • Item B: (200 × 30) / 100 = R$ 60,00
    • Item C: (200 × 60) / 100 = R$ 120,00 (último item recebe VL_FRETE - Σjá rateado → ajuste de arredondamento)

Resultado esperado: O frete é distribuído em proporção direta à quantidade de cada item. O último item absorve a diferença de arredondamento para que a soma feche exatamente no VL_FRETE total.


V - Valor​

O que fazDetalhe
Critério de rateioProporcional ao valor líquido do item (VL_TOTAL - VL_DESCONTO [+ VL_DESPESA])
Rateio em pedido (MPD024)(VL_TOTAL - VL_DESCONTO + VL_DESPESA) × VL_FRETE / (ΣVL_LIQUIDO - VL_FRETE)
Rateio em NF Entrada (MNF001)((VL_TOTAL - VL_DESCONTO) × VL_FRETE) / Σ VL_TOTAL
Rateio no custo do estoque (UFRETENF.pas:469-475)(VL_ESTOQUE_ITEM × VL_NOTAFISCAL_CTE) / ΣVL_ESTOQUE
Quando usarQuando o custo de transporte está associado ao valor da mercadoria (seguros, produtos de alto valor agregado)

Código real — MNF001 (UdmMNF001.pas:9009-9013)​

if (dmMNF001.ParmFatur.Values['ST_MODALIDADECALCULOFRETE'] = 'V') then
begin
tabITEMNOTAVL_FRETE.AsFloat := RoundTo(
((tabITEMNOTAVL_TOTAL.AsFloat - tabITEMNOTAVL_DESCONTO.AsFloat) * tabNOTAVL_FRETE.AsFloat)
/ SeSenao(dmMNF001.memTOTAIST_VL_TOTAL.AsFloat > 0, dmMNF001.memTOTAIST_VL_TOTAL.AsFloat, 1), -2);
end

Simulação passo a passo​

  1. MFA001 → Modalidade de Cálculo de Rateio de Frete = Valor
  2. Salve (F6).
  3. Abra uma Nota Fiscal de Entrada (MNF001) com 3 itens (sem desconto):
    • Item A: VL_TOTAL = 100,00
    • Item B: VL_TOTAL = 300,00
    • Item C: VL_TOTAL = 600,00
    • Total = 1.000,00
  4. Informe VL_FRETE da nota = R$ 200,00.
  5. O sistema calcula:
    • Item A: (100 × 200) / 1000 = R$ 20,00
    • Item B: (300 × 200) / 1000 = R$ 60,00
    • Item C: (600 × 200) / 1000 = R$ 120,00 (último item absorve diferença de arredondamento)

Resultado esperado: O frete é distribuído em proporção direta ao valor líquido de cada item. Itens mais caros recebem mais frete.


S - Peso Produto​

O que fazDetalhe
Critério de rateioBaseado no peso líquido cadastrado no produto (TPO001 - ITEM.PS_LIQUIDOEMB), multiplicado pela quantidade/peso do item
Uso principalRateio de frete de CT-e sobre notas de entrada: acumula frete no custo do estoque
Fórmula (estoque)VL_ESTOQUE = (QT_ITEM × PS_LIQUIDOEMB) × (VL_NOTAFRETE / Σ(QT × PS_LIQUIDOEMB))
Rateio em pedido (MPD024)Não tem cláusula 'S' específica — cai no else tratado como modalidade Quantidade (P)
Rateio em NF (MNF001)Só afeta a atualização do custo do estoque (UFRETENF.pas:263-483), não o rateio direto no ITEMNOTA.VL_FRETE da nota de saída
Quando usarQuando a empresa recebe CT-e (frete) em separado e precisa incorporar o custo do frete ao estoque dos produtos, proporcional ao peso líquido unitário cadastrado

Código real — UFRETENF.pas (UFRETENF.pas:478-483)​

else
if (Trim(iStmodalidadeCalculoFrete) = 'S') then
begin
////////////Bosing 22/09/2016 08:01:20///////////
///////Rateio de frete por Peso do produto///////
iVlFrete := tabESTOQUE.FieldByName('VL_ESTOQUE').AsFloat;
end;

O valor VL_ESTOQUE já vem calculado pela query (linhas 274-335), que faz o rateio via peso líquido do produto:

-- Extrato do SELECT em UFRETENF.pas:274-335
CAST(CAST(X.VL_MULTIPLICACAO AS DOM_NUMERIC15_2) *
CASE TC.TP_UNIDADE
WHEN 'Q' THEN ITN.QT_ITEMNOTA * COALESCE(ITEM.PS_LIQUIDOEMB, 0)
ELSE ITN.PS_ITEMNOTA * COALESCE(ITEM.PS_LIQUIDOEMB, 0)
END AS DOM_NUMERIC15_2) VL_ESTOQUE

Simulação passo a passo (exemplo real documentado no código — UFRETENF.pas:266-272)​

  1. MFA001 → Modalidade de Cálculo de Rateio de Frete = Peso Produto
  2. Salve (F6).
  3. Nota de origem (entrada): NF 20936, peso total = 32.000 Kg.
    • Produto 3729: PS_LIQUIDOEMB (TPO001) = 30 Kg; QT_ITEMNOTA = 400; VL_UNITARIO = 8,00 → 400 × 30 = 12.000 Kg
    • Produto 3730: PS_LIQUIDOEMB = 25 Kg; QT_ITEMNOTA = 800; VL_UNITARIO = 5,00 → 800 × 25 = 20.000 Kg
  4. Receba o CT-e 11906 vinculado à nota, valor R$ 8.017,69.
  5. O sistema calcula fator de rateio: 8.017,69 / 32.000 = 0,250553.
  6. Produto 3729: 12.000 × 0,250553 = 3.006,64 → rateio por unidade: 3.006,64 / 400 = 7,51 → custo + rateio = 8,00 + 7,51 = R$ 15,51
  7. Produto 3730: 20.000 × 0,250553 = 5.011,06 → rateio por unidade: 5.011,06 / 800 = 6,26 → custo + rateio = 5,00 + 6,26 = R$ 11,26

Resultado esperado: O frete do CT-e é incorporado ao custo do estoque de cada produto proporcionalmente ao peso líquido total movimentado (quantidade vezes peso líquido cadastrado em TPO001). Produtos mais pesados absorvem mais frete no custo.


Observação: comportamento quando o item é zerado / default​

Em todos os módulos, quando o valor do rateio calculado resultaria negativo (por arredondamento), o sistema zera o valor (iVlFrete := 0.00 — UFRETENF.pas:484). O último item do documento sempre recebe a diferença entre VL_FRETE total e a soma já rateada, garantindo que a soma feche exatamente. Ver UdmMNF001.pas:9032-9036:

iTotFrete := iTotFrete + tabITEMNOTAVL_FRETE.AsFloat;
if (iTotFrete > tabNOTAVL_FRETE.AsFloat) then
begin
tabITEMNOTAVL_FRETE.AsFloat := (tabITEMNOTAVL_FRETE.AsFloat - (iTotFrete - tabNOTAVL_FRETE.AsFloat));
iFimRateioFrete := True;
end;

Tabela Comparativa Resumida​

OpçãoNomeBase do rateioUsado em pedidos?Usado em NF entrada?Usado no custo de estoque (CT-e)?
PQuantidade (padrão)QT_PEDIDA / PS_PEDIDO conforme TP_UNIDADESimSimSim
VValorVL_TOTAL - VL_DESCONTOSimSimSim
SPeso ProdutoQT × PS_LIQUIDOEMB (peso cadastrado em TPO001)Não (cai no ramo 'else' = Quantidade em MPD024)Indireto (só no custo do estoque)Sim — caso principal de uso

Referências no Código Fonte​

Delphi​

ArquivoLinhaO quê
source/MFA001/UMFA001.dfm7084-7110ComboBox cbbST_MODALIDADECALCULOFRETE com os items 'Quantidade\tP', 'Valor\tV', 'Peso Produto\tS'
source/MFA001/UMFA001.dfm6243-6255Label do campo (Label47 = "Modalidade de Cálculo de Rateio de Frete")
source/MFA001/UMFA001.pas397Declaração do ComboBox cbbST_MODALIDADECALCULOFRETE: TwwDBComboBox
source/MFA001/UdmMFA001.pas170Declaração do field tabPARMFATURST_MODALIDADECALCULOFRETE: TStringField
source/MFA001/UdmMFA001.pas511Valor padrão no AfterInsert: tabPARMFATURST_MODALIDADECALCULOFRETE.AsString := 'P'
source/MFA001/UdmMFA001.dfm177, 2395, 2558, 2780, 3057Campo no SELECT/INSERT/UPDATE do dataset PARMFATUR
source/MNF001/UdmMNF001.pas9009Uso no rateio do frete nos itens da NF quando modalidade = 'V'
source/MNF001/UFRETENF.pas249, 259, 263, 459, 469, 478, 648, 660, 672Rateio de frete de CT-e sobre itens de NF e custo de estoque (todas as 3 modalidades)
source/MPD001/UdmMPD001.pas253SELECT do parâmetro no load dos parâmetros de pedido
source/MPD002/UdmMPD002.pas5746SELECT do parâmetro no load
source/MPD020/UdmMPD020.pas241, 325, 369Declaração e leitura do parâmetro (posição 32 do array Resultado)
source/MPD024/UdmMPD024.pas164, 192, 206, 445Leitura e uso no rateio do frete do pedido (modalidade 'V' — senão cai no rateio por peso/quantidade)

SQL (Firebird)​

ArquivoLinhaO quê
Scripts/POPULA_ITEMFRETENOTA.sql51SELECT de PM.ST_MODALIDADECALCULOFRETE para popular ITEMFRETENOTA conforme modalidade
Scripts/RECALCULA_ESTOQUE.sql157-160Lê o parâmetro em I_ST_MODALIDADE_CALCULO_FRETE para recálculo do custo de estoque
Scripts/RECALCULA_ESTOQUEDIA.sql135-138Lê o parâmetro em I_ST_MODALIDADE_CALCULO_FRETE para recálculo diário