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ódulo | Código | Onde o parâmetro é utilizado |
|---|
| Nota Fiscal Entrada | MNF001 | Ratear 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 Venda | MPD002 | Parâmetro lido no carregamento (UdmMPD002.pas:5746) |
| Pedido de Venda Mobile | MPD020 | Parâmetro lido na inicialização (UdmMPD020.pas:369) |
| Pedido (Outro Tipo) | MPD024 | Ratear frete nos itens do pedido (UdmMPD024.pas:445) |
| Pedido de Compra | MPD001 | Parâmetro lido no carregamento (UdmMPD001.pas:253) |
| Parâmetros de Faturamento | MFA001 | Tela onde o parâmetro é configurado |
Procedures e views impactadas
| Objeto | Arquivo | Descrição |
|---|
POPULA_ITEMFRETENOTA | Scripts/POPULA_ITEMFRETENOTA.sql | Gera ITEMFRETENOTA a partir de FRETENOTA, usando ST_MODALIDADECALCULOFRETE para decidir o critério de rateio |
RECALCULA_ESTOQUE | Scripts/RECALCULA_ESTOQUE.sql | Recálculo geral de estoque — lê o parâmetro (linha 157) em I_ST_MODALIDADE_CALCULO_FRETE para repropagar frete no custo |
RECALCULA_ESTOQUEDIA | Scripts/RECALCULA_ESTOQUEDIA.sql | Recálculo diário de estoque — lê o parâmetro (linha 135) para aplicar no custo do dia |
Campos envolvidos
| Campo | Descrição |
|---|
NOTA.VL_FRETE / PEDIDO.VL_FRETE | Valor total do frete informado no documento |
ITEMNOTA.VL_FRETE / ITEMPEDIDO.VL_FRETE | Valor do frete rateado para cada item |
ITEMNOTA.QT_ITEMNOTA / ITEMPEDIDO.QT_PEDIDA | Quantidade usada no rateio quando TP_UNIDADE = 'Q' |
ITEMNOTA.PS_ITEMNOTA / ITEMPEDIDO.PS_PEDIDO | Peso usado no rateio quando TP_UNIDADE <> 'Q' |
ITEMNOTA.VL_TOTAL - VL_DESCONTO | Valor líquido do item (base para modalidade por valor) |
TIPOCALCULO.TP_UNIDADE | Define se o item é calculado por Quantidade ou por peso |
ITEM.PS_LIQUIDOEMB | Peso líquido cadastrado em TPO001 — usado na modalidade 'S' |
ITEMFRETENOTA.VL_FRETE | Frete rateado por CT-e sobre item da nota de origem (modalidade 'S') |
Opções disponíveis
P - Quantidade (padrão)
| O que faz | Detalhe |
|---|
| Critério de rateio | Proporcional à 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 usar | Quando os itens têm custo de transporte proporcional à quantidade movimentada (commodities, itens pesados semelhantes) |
Código real — MPD024 (UdmMPD024.pas:453-458)
else begin
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
- MFA001 → Notas Fiscais → Parâmetros de Notas → Modalidade de Cálculo de Rateio de Frete =
Quantidade
- Salve (F6).
- 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
- Informe
VL_FRETE do pedido = R$ 200,00.
- 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 faz | Detalhe |
|---|
| Critério de rateio | Proporcional 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 usar | Quando 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
- MFA001 → Modalidade de Cálculo de Rateio de Frete =
Valor
- Salve (F6).
- 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
- Informe
VL_FRETE da nota = R$ 200,00.
- 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 faz | Detalhe |
|---|
| Critério de rateio | Baseado no peso líquido cadastrado no produto (TPO001 - ITEM.PS_LIQUIDOEMB), multiplicado pela quantidade/peso do item |
| Uso principal | Rateio 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 usar | Quando 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
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:
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)
- MFA001 → Modalidade de Cálculo de Rateio de Frete =
Peso Produto
- Salve (F6).
- 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
- Receba o CT-e 11906 vinculado à nota, valor R$ 8.017,69.
- O sistema calcula fator de rateio:
8.017,69 / 32.000 = 0,250553.
- 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
- 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ção | Nome | Base do rateio | Usado em pedidos? | Usado em NF entrada? | Usado no custo de estoque (CT-e)? |
|---|
| P | Quantidade (padrão) | QT_PEDIDA / PS_PEDIDO conforme TP_UNIDADE | Sim | Sim | Sim |
| V | Valor | VL_TOTAL - VL_DESCONTO | Sim | Sim | Sim |
| S | Peso Produto | QT × 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
| Arquivo | Linha | O quê |
|---|
source/MFA001/UMFA001.dfm | 7084-7110 | ComboBox cbbST_MODALIDADECALCULOFRETE com os items 'Quantidade\tP', 'Valor\tV', 'Peso Produto\tS' |
source/MFA001/UMFA001.dfm | 6243-6255 | Label do campo (Label47 = "Modalidade de Cálculo de Rateio de Frete") |
source/MFA001/UMFA001.pas | 397 | Declaração do ComboBox cbbST_MODALIDADECALCULOFRETE: TwwDBComboBox |
source/MFA001/UdmMFA001.pas | 170 | Declaração do field tabPARMFATURST_MODALIDADECALCULOFRETE: TStringField |
source/MFA001/UdmMFA001.pas | 511 | Valor padrão no AfterInsert: tabPARMFATURST_MODALIDADECALCULOFRETE.AsString := 'P' |
source/MFA001/UdmMFA001.dfm | 177, 2395, 2558, 2780, 3057 | Campo no SELECT/INSERT/UPDATE do dataset PARMFATUR |
source/MNF001/UdmMNF001.pas | 9009 | Uso no rateio do frete nos itens da NF quando modalidade = 'V' |
source/MNF001/UFRETENF.pas | 249, 259, 263, 459, 469, 478, 648, 660, 672 | Rateio de frete de CT-e sobre itens de NF e custo de estoque (todas as 3 modalidades) |
source/MPD001/UdmMPD001.pas | 253 | SELECT do parâmetro no load dos parâmetros de pedido |
source/MPD002/UdmMPD002.pas | 5746 | SELECT do parâmetro no load |
source/MPD020/UdmMPD020.pas | 241, 325, 369 | Declaração e leitura do parâmetro (posição 32 do array Resultado) |
source/MPD024/UdmMPD024.pas | 164, 192, 206, 445 | Leitura e uso no rateio do frete do pedido (modalidade 'V' — senão cai no rateio por peso/quantidade) |
SQL (Firebird)
| Arquivo | Linha | O quê |
|---|
Scripts/POPULA_ITEMFRETENOTA.sql | 51 | SELECT de PM.ST_MODALIDADECALCULOFRETE para popular ITEMFRETENOTA conforme modalidade |
Scripts/RECALCULA_ESTOQUE.sql | 157-160 | Lê o parâmetro em I_ST_MODALIDADE_CALCULO_FRETE para recálculo do custo de estoque |
Scripts/RECALCULA_ESTOQUEDIA.sql | 135-138 | Lê o parâmetro em I_ST_MODALIDADE_CALCULO_FRETE para recálculo diário |