Pular para o conteúdo principal

PC_INDICE1 - Índice de Lucratividade desejado (benchmark para o Índice Geral do pedido)

Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / O.S. → Opção 1 → campo % Margem Índice 1 (label lbl27 em UMFA001.dfm:7860-7872) Tabela: PARMFATUR.PC_INDICE1 Tipo: Numérico (percentual %) - DOM_NUMERIC3_2 (NUMERIC(3,2), máximo 9,99) Valor padrão: NULL (vazio - nenhum default é atribuído no AfterInsert de tabPARMFATUR em UdmMFA001.pas:434) Validação: nenhuma validação cadastrada (não há tabPARMFATURPC_INDICE1Validate em UdmMFA001.pas). O consumidor aceita qualquer valor que o domínio permita armazenar.

:::note Componente com nome enganoso O TDBEdit deste campo em source/MFA001/UMFA001.dfm:8387-8403 é chamado de edtPC_INDICE2, mas seu DataField é PC_INDICE1. A tabela PARMFATUR possui apenas este índice - não existe PC_INDICE2, PC_INDICE3, etc. O número "1" no nome é histórico e não implica uma série. :::

O que o parâmetro faz​

PC_INDICE1 é o divisor benchmark de lucratividade usado para transformar a margem percentual efetiva de um pedido/item em um índice adimensional (coluna VL_INDICE no item e T_VL_INDICEGERAL nos totais do pedido), que serve como indicador rápido "atingiu ou não atingiu a meta" na tela de pedido (MPD002).

A ideia por trás do campo: o gestor define em MFA001 qual é a margem de lucro alvo da empresa (ex.: 10%). Em tempo real, quando o vendedor digita um pedido:

  1. O sistema calcula a margem de lucro efetiva em % do pedido/item: PC_LUCRO = 100 × (Total − Desconto − Custo) / (Total − Desconto).
  2. Divide essa margem pelo alvo PC_INDICE1 para gerar o índice: VL_INDICE = PC_LUCRO / PC_INDICE1.
  3. Índice = 1,00 → vendedor atingiu exatamente a meta; > 1,00 → superou; < 1,00 → ficou abaixo da meta.

Se PC_INDICE1 não estiver configurado (NULL/0), nenhum índice é calculado - os campos T_VL_INDICEGERAL e ITEMPEDIDO.VL_INDICE ficam em branco (string vazia), sinalizando ao vendedor que não há benchmark para comparar.

Há também um uso secundário em EXPORTACAO_SOVIS, onde PC_INDICE1 é exportado como "Índice de lucratividade desejado no pedido" para integração externa.


Telas impactadas​

MóduloCódigoComo usa PC_INDICE1
Parâmetros FaturamentoMFA001Cadastro do próprio valor - TDBEdit edtPC_INDICE2 (nome do componente) com DataField='PC_INDICE1' na aba Pedidos / O.S. → Opção 1 (UMFA001.dfm:8387-8403, label lbl27 "% Margem Índice 1")
Pedido de VendaMPD002Consumidor principal. Lê parmfatur.values['PC_INDICE1'] e (a) calcula T_VL_INDICEGERAL do pedido em tabTotaisCalcFields (UdmMPD002.pas:992-1003); (b) calcula VL_INDICE por item em tabITEMPEDIDOCalcFields (UdmMPD002.pas:6083-6101)
Pedido/Pré-PedidoMPD020SELECT COALESCE(PC_INDICE1, 0) ... em BuscaParametros (UdmMPD020.pas:320) - carregado mas não foram encontrados usos diretos além do SELECT
Config PedidoCPD009Update/Insert de PARMFATUR inclui PC_INDICE1 (UdmCPD009.dfm:297, 360, 442, 548)
Relatório AnáliseRCA006Update/Insert de PARMFATUR inclui PC_INDICE1 (UdmRCA006.dfm:3046, 3109, 3191, 3297)

Procedures impactadas​

ProcedureArquivoUso
EXPORTACAO_SOVISScripts/EXPORTACAO_SOVIS.sql:829-862Ao exportar o bloco "TABELA CONDIÇÃO DE PAGAMENTO" (I_TP_REGISTRO = 'H'), lê COALESCE(P.PC_INDICE1, 1) e grava no campo "Indice de lucratividade desejado no pedido" do registro exportado para o sistema externo SOVIS

Campos envolvidos​

CampoTabelaDescrição
PC_INDICE1PARMFATURMeta (benchmark) de margem de lucratividade da empresa (este parâmetro)
T_VL_INDICEGERALtabTotais (calculado em memória no MPD002)Índice geral do pedido = PC_LUCRO / PC_INDICE1
VL_INDICEITEMPEDIDO (calculado via tabITEMPEDIDOCalcFields)Índice por item do pedido - mesma fórmula aplicada sobre o item
VL_TOTALITEMPEDIDO / totaisComponente do numerador (faturamento do item/pedido)
VL_DESCONTOITEMPEDIDO / totaisSubtrai do faturamento no cálculo do lucro
O_VL_CUSTO / VL_CUSTOITEMPEDIDO / totaisCusto que define PC_LUCRO
PS_PEDIDO / QT_PEDIDAITEMPEDIDODefine se o custo é ponderado por peso (PS_PEDIDO > 0) ou por quantidade

Comportamento / Fórmula de aplicação​

Valor = 0 ou NULL (não configurado)​

O que aconteceDetalhe
Cadastro (MFA001)AfterInsert não atribui default - campo nasce NULL
No MPD002 - totaistabTotaisT_VL_INDICEGERAL.AsString := '' (vazio). O grid/campo de totais do pedido mostra em branco
No MPD002 - itemtabITEMPEDIDOVL_INDICE.AsString := '' (vazio). Coluna de índice por item fica em branco
Exportação SOVISCOALESCE(P.PC_INDICE1, 1) → exporta 1 como índice desejado (valor neutro para o sistema externo)
Efeito práticoO sistema não compara margem realizada × meta; nenhum feedback visual de performance de lucratividade é exibido no pedido

Simulação passo a passo​

  1. Em MFA001 → Pedidos / O.S. → Opção 1 → % Margem Índice 1 = vazio (ou 0,00).
  2. Salve o parâmetro.
  3. Abra MPD002, crie um pedido com itens que resultem em lucro positivo.
  4. Resultado esperado: campo "Índice Geral" no rodapé dos totais e coluna "Índice" no grid de itens ficam em branco, mesmo que o pedido esteja lucrativo.

Valor > 0 (ex.: PC_INDICE1 = 10,00)​

Com o benchmark preenchido, o sistema aplica a fórmula a cada recálculo de totais / alteração de itens.

Fórmula exata (transcrita de UdmMPD002.pas)​

Para o pedido inteiro (tabTotaisCalcFields, linhas 992-1003):

if (StrToFloat(parmfatur.values['PC_INDICE1']) > 0) then
begin
if (((tabTotaisT_VL_TOTAL.AsFloat - tabTotaisT_VL_DESCONTO.AsFloat) > tabTotaisT_VL_CUSTO.AsFloat)
and (tabTotaisT_VL_CUSTO.AsFloat > 0 )) then
begin
vPC_LUCRO := ((100 * (tabTotaisT_VL_TOTAL.AsFloat
- tabTotaisT_VL_DESCONTO.AsFloat
- tabTotaisT_VL_CUSTO.AsFloat))
/ (tabTotaisT_VL_TOTAL.AsFloat - tabTotaisT_VL_DESCONTO.AsFloat));
tabTotaisT_VL_INDICEGERAL.AsFloat := (vPC_LUCRO / StrToFloat(parmfatur.values['PC_INDICE1']));
end
else
tabTotaisT_VL_INDICEGERAL.AsString := '0';
end
else
tabTotaisT_VL_INDICEGERAL.AsString := '';

Para cada item (tabITEMPEDIDOCalcFields, linhas 6083-6101) - mesma fórmula, porém o custo é ponderado por peso (PS_PEDIDO) quando informado, senão por quantidade (QT_PEDIDA):

if (tabITEMPEDIDOPS_PEDIDO.AsFloat > 0) then
iVlCusto := tabITEMPEDIDOO_VL_CUSTO.AsFloat * tabITEMPEDIDOPS_PEDIDO.AsFloat
else
iVlCusto := tabITEMPEDIDOO_VL_CUSTO.AsFloat * tabITEMPEDIDOQT_PEDIDA.AsFloat;

if (((tabITEMPEDIDOVL_TOTAL.AsFloat - tabITEMPEDIDOVL_DESCONTO.AsFloat) > iVlCusto) and (iVlCusto > 0)) then
begin
vPC_LUCRO := ((100 * (tabITEMPEDIDOVL_TOTAL.AsFloat
- tabITEMPEDIDOVL_DESCONTO.AsFloat
- iVlCusto))
/ (tabITEMPEDIDOVL_TOTAL.AsFloat - tabITEMPEDIDOVL_DESCONTO.AsFloat));
tabITEMPEDIDOVL_INDICE.AsFloat := (vPC_LUCRO / StrToFloat(parmfatur.values['PC_INDICE1']));
end
else
tabITEMPEDIDOVL_INDICE.AsString := '0';

Resumindo a semântica:

PC_LUCRO = 100 × (Total - Desconto - Custo) / (Total - Desconto) -- margem sobre venda (%)
VL_INDICE = PC_LUCRO / PC_INDICE1 -- adimensional
  • VL_INDICE = 1,00 → margem realizada igualou a meta PC_INDICE1.
  • VL_INDICE > 1,00 → pedido/item acima da meta.
  • VL_INDICE < 1,00 → pedido/item abaixo da meta.
  • VL_INDICE = 0 → pedido sem lucro (custo >= (total − desconto)).

Simulação passo a passo​

Cenário A: pedido exatamente na meta

  1. Em MFA001 → Pedidos / O.S. → Opção 1, preencha % Margem Índice 1 = 10,00 (meta de 10% de margem).
  2. Abra MPD002 e crie um pedido com um item:
    • VL_TOTAL = R$ 1.000,00, VL_DESCONTO = R$ 0,00, VL_CUSTO (total) = R$ 900,00.
  3. O sistema calcula em tabTotaisCalcFields:
    • PC_LUCRO = 100 × (1000 − 0 − 900) / (1000 − 0) = 100 × 100 / 1000 = 10,00%
    • T_VL_INDICEGERAL = 10,00 / 10,00 = 1,00
  4. Resultado esperado: Índice Geral do pedido exibe 1,00 (meta cumprida).

Cenário B: pedido acima da meta

  • VL_TOTAL = R$ 1.000,00, VL_CUSTO = R$ 800,00, VL_DESCONTO = 0, PC_INDICE1 = 10,00
  • PC_LUCRO = 100 × 200 / 1000 = 20,00%
  • T_VL_INDICEGERAL = 20,00 / 10,00 = 2,00
  • Resultado esperado: Índice Geral = 2,00 (vendedor dobrou a meta).

Cenário C: pedido abaixo da meta

  • VL_TOTAL = R$ 1.000,00, VL_CUSTO = R$ 950,00, VL_DESCONTO = 0, PC_INDICE1 = 10,00
  • PC_LUCRO = 100 × 50 / 1000 = 5,00%
  • T_VL_INDICEGERAL = 5,00 / 10,00 = 0,50
  • Resultado esperado: Índice Geral = 0,50 (vendedor ficou na metade da meta).

Cenário D: pedido no prejuízo ou sem custo

  • Caso (Total − Desconto) <= Custo ou Custo <= 0, a condição do if interno falha e o código executa tabTotaisT_VL_INDICEGERAL.AsString := '0'.
  • Resultado esperado: Índice Geral = 0,00 (mesmo com PC_INDICE1 preenchido).

Cenário E: valor de borda do domínio (DOM_NUMERIC3_2 permite até 9,99)

  • PC_INDICE1 = 9,99; pedido com margem realizada de PC_LUCRO = 5,00%
  • VL_INDICE = 5,00 / 9,99 ≈ 0,5005
  • Observação: como o domínio é NUMERIC(3,2), o valor máximo configurável é 9,99. Para metas de margem acima de 9,99% em relação ao preço de venda, o campo não aceita persistir o valor - a UI ou o FireDAC lançarão erro ao tentar salvar acima desse limite. Metas maiores precisariam de uma alteração de domínio.

Interações com outros parâmetros​

  • PC_MARGEMVENDA (pc_margemvenda) - PC_MARGEMVENDA é a margem aplicada ao cálculo do preço de venda, enquanto PC_INDICE1 é uma meta de performance usada só para pintar um indicador no pedido. Não há relação numérica direta entre eles. Porém, se PC_MARGEMVENDA e PC_INDICE1 estiverem alinhados (mesmo percentual), um pedido vendido ao preço de tabela tende a entregar VL_INDICE ≈ 1,00.
  • ST_PRECOVENDA (pc_margemvenda.md cita a relação) - define como o custo/preço é formado; afeta indiretamente os valores VL_TOTAL e VL_CUSTO que entram no numerador da fórmula de VL_INDICE.
  • PC_DESCONTOMAX / PC_DESCONTOPED - limitam o desconto permitido no pedido; como VL_DESCONTO entra no denominador e numerador, descontos maiores puxam VL_INDICE para baixo.

:::info Não confundir com INDICEMARCKUP Existe na base outra estrutura de "índices", a tabela INDICEMARCKUP (plural, via CD_INDICEMARKUP em PARMFATUR), relacionada ao cálculo de Markup Contábil (CFA001, RETORNA_CONTASINDICEMARKUP, RETORNA_IMPOSTOMARKUP). Aquilo é uma composição multi-conta de markup contábil, sem relação com PC_INDICE1, que é um benchmark único de lucratividade no pedido. :::


Referências no Código Fonte​

Delphi - MFA001 (cadastro do parâmetro)​

  • source/MFA001/UMFA001.dfm:8387-8403 - TDBEdit edtPC_INDICE2 (nome do componente) com DataField = 'PC_INDICE1', ligado a dmMFA001.dsPARMFATUR, dentro do pagPedidoOp1 (aba Pedidos / O.S. → Opção 1).
  • source/MFA001/UMFA001.dfm:7860-7872 - Label lbl27 com Caption = '% Margem Índice 1' posicionado em Left=35, Top=92 (associado visualmente ao edit em Left=133, Top=88).
  • source/MFA001/UMFA001.pas:302 - declaração edtPC_INDICE2: TDBEdit no form (apesar do nome, controla PC_INDICE1).
  • source/MFA001/UdmMFA001.pas:78 - tabPARMFATURPC_INDICE1: TBCDField;.
  • source/MFA001/UdmMFA001.dfm:845-852 - TField:
object tabPARMFATURPC_INDICE1: TBCDField
FieldName = 'PC_INDICE1'
Origin = '"PARMFATUR"."PC_INDICE1"'
DisplayFormat = '##0.00'
EditFormat = '##0.00'
Precision = 4
Size = 2
end
  • source/MFA001/UdmMFA001.pas:434-... - tabPARMFATURAfterInsert não atribui valor a PC_INDICE1 (nasce NULL).
  • Nenhum tabPARMFATURPC_INDICE1Validate está registrado - o campo não tem validação customizada no cadastro.
  • source/MFA001/UdmMFA001.dfm:2353, 2504, 2696, 2974 - SQL de SELECT/INSERT/UPDATE de PARMFATUR inclui PC_INDICE1.

Delphi - consumidor principal: MPD002 (Pedido de Venda)​

  • source/MPD002/UdmMPD002.pas:992-1003 - cálculo do T_VL_INDICEGERAL do pedido em tabTotaisCalcFields (fórmula completa transcrita na seção "Valor > 0").
  • source/MPD002/UdmMPD002.pas:6083-6101 - cálculo do VL_INDICE por item em tabITEMPEDIDOCalcFields (fórmula completa transcrita na seção "Valor > 0").
  • source/MPD002/UdmMPD002.pas:5739 - BuscaParametros_MPD002 inclui COALESCE(P.PC_INDICE1,0) PC_INDICE1 no SELECT de PARMFATUR que popula parmfatur.values[...].
  • source/MPD002/UdmMPD002.dfm:1628-1630 - tabITEMPEDIDOVL_INDICE: TFloatField (campo calculado que recebe o resultado).
  • source/MPD002/UdmMPD002.pas:360 - tabTotaisT_VL_INDICEGERAL: TFloatField (campo calculado nos totais).

Delphi - outros consumidores​

  • source/MPD020/UdmMPD020.pas:320 - BuscaParametros lê COALESCE(PC_INDICE1, 0) de PARMFATUR (carregado no contexto do pedido, sem uso adicional localizado).
  • source/CPD009/UdmCPD009.dfm:297, 360, 442, 548 - grids/updates de PARMFATUR incluem PC_INDICE1 (manutenção administrativa).
  • source/RCA006/UdmRCA006.dfm:3046, 3109, 3191, 3297 - grids/updates de PARMFATUR incluem PC_INDICE1.

SQL - Procedures​

  • Scripts/EXPORTACAO_SOVIS.sql:93 - declaração V_PC_INDICEPEDIDO type of DOM_NUMERIC3_2.
  • Scripts/EXPORTACAO_SOVIS.sql:829-832:
SELECT COALESCE(P.PC_INDICE1,1)
FROM PARMFATUR P
WHERE P.CD_EMPRESA = :I_CD_EMPRESA
INTO :V_PC_INDICEPEDIDO;
  • Scripts/EXPORTACAO_SOVIS.sql:862 - V_PC_INDICEPEDIDO é concatenado no registro de saída como "Indice de lucratividade desejado no pedido" exportado para o sistema SOVIS.

DDL​

  • docs/schema/tables/PARMFATUR.sql:45 - definição:
PC_INDICE1 DOM_NUMERIC3_2,

DOM_NUMERIC3_2 = NUMERIC(3,2) → valor máximo 9,99. Para metas de lucratividade acima desse limite seria necessária alteração do domínio.