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(labellbl27em UMFA001.dfm:7860-7872) Tabela:PARMFATUR.PC_INDICE1Tipo: Numérico (percentual %) -DOM_NUMERIC3_2(NUMERIC(3,2), máximo 9,99) Valor padrão:NULL(vazio - nenhum default é atribuído noAfterInsertdetabPARMFATURemUdmMFA001.pas:434) Validação: nenhuma validação cadastrada (não hátabPARMFATURPC_INDICE1ValidateemUdmMFA001.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:
- O sistema calcula a margem de lucro efetiva em % do pedido/item:
PC_LUCRO = 100 × (Total − Desconto − Custo) / (Total − Desconto). - Divide essa margem pelo alvo
PC_INDICE1para gerar o índice:VL_INDICE = PC_LUCRO / PC_INDICE1. - Í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ódulo | Código | Como usa PC_INDICE1 |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Cadastro 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 Venda | MPD002 | Consumidor 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é-Pedido | MPD020 | SELECT COALESCE(PC_INDICE1, 0) ... em BuscaParametros (UdmMPD020.pas:320) - carregado mas não foram encontrados usos diretos além do SELECT |
| Config Pedido | CPD009 | Update/Insert de PARMFATUR inclui PC_INDICE1 (UdmCPD009.dfm:297, 360, 442, 548) |
| Relatório Análise | RCA006 | Update/Insert de PARMFATUR inclui PC_INDICE1 (UdmRCA006.dfm:3046, 3109, 3191, 3297) |
Procedures impactadas
| Procedure | Arquivo | Uso |
|---|---|---|
EXPORTACAO_SOVIS | Scripts/EXPORTACAO_SOVIS.sql:829-862 | Ao 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
| Campo | Tabela | Descrição |
|---|---|---|
PC_INDICE1 | PARMFATUR | Meta (benchmark) de margem de lucratividade da empresa (este parâmetro) |
T_VL_INDICEGERAL | tabTotais (calculado em memória no MPD002) | Índice geral do pedido = PC_LUCRO / PC_INDICE1 |
VL_INDICE | ITEMPEDIDO (calculado via tabITEMPEDIDOCalcFields) | Índice por item do pedido - mesma fórmula aplicada sobre o item |
VL_TOTAL | ITEMPEDIDO / totais | Componente do numerador (faturamento do item/pedido) |
VL_DESCONTO | ITEMPEDIDO / totais | Subtrai do faturamento no cálculo do lucro |
O_VL_CUSTO / VL_CUSTO | ITEMPEDIDO / totais | Custo que define PC_LUCRO |
PS_PEDIDO / QT_PEDIDA | ITEMPEDIDO | Define 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 acontece | Detalhe |
|---|---|
| Cadastro (MFA001) | AfterInsert não atribui default - campo nasce NULL |
| No MPD002 - totais | tabTotaisT_VL_INDICEGERAL.AsString := '' (vazio). O grid/campo de totais do pedido mostra em branco |
| No MPD002 - item | tabITEMPEDIDOVL_INDICE.AsString := '' (vazio). Coluna de índice por item fica em branco |
| Exportação SOVIS | COALESCE(P.PC_INDICE1, 1) → exporta 1 como índice desejado (valor neutro para o sistema externo) |
| Efeito prático | O sistema não compara margem realizada × meta; nenhum feedback visual de performance de lucratividade é exibido no pedido |
Simulação passo a passo
- Em MFA001 → Pedidos / O.S. → Opção 1 →
% Margem Índice 1= vazio (ou0,00). - Salve o parâmetro.
- Abra MPD002, crie um pedido com itens que resultem em lucro positivo.
- 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 metaPC_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
- Em MFA001 → Pedidos / O.S. → Opção 1, preencha
% Margem Índice 1 = 10,00(meta de 10% de margem). - 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.
- 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
- 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,00PC_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,00PC_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) <= CustoouCusto <= 0, a condição doifinterno falha e o código executatabTotaisT_VL_INDICEGERAL.AsString := '0'. - Resultado esperado: Índice Geral =
0,00(mesmo comPC_INDICE1preenchido).
Cenário E: valor de borda do domínio (DOM_NUMERIC3_2 permite até 9,99)
PC_INDICE1 = 9,99; pedido com margem realizada dePC_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, enquantoPC_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, sePC_MARGEMVENDAePC_INDICE1estiverem alinhados (mesmo percentual), um pedido vendido ao preço de tabela tende a entregarVL_INDICE ≈ 1,00.ST_PRECOVENDA(pc_margemvenda.mdcita a relação) - define como o custo/preço é formado; afeta indiretamente os valoresVL_TOTALeVL_CUSTOque entram no numerador da fórmula deVL_INDICE.PC_DESCONTOMAX/PC_DESCONTOPED- limitam o desconto permitido no pedido; comoVL_DESCONTOentra no denominador e numerador, descontos maiores puxamVL_INDICEpara 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) comDataField = 'PC_INDICE1', ligado admMFA001.dsPARMFATUR, dentro dopagPedidoOp1(abaPedidos / O.S.→Opção 1).source/MFA001/UMFA001.dfm:7860-7872- Labellbl27comCaption = '% Margem Índice 1'posicionado emLeft=35, Top=92(associado visualmente ao edit emLeft=133, Top=88).source/MFA001/UMFA001.pas:302- declaraçãoedtPC_INDICE2: TDBEditno form (apesar do nome, controlaPC_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-...-tabPARMFATURAfterInsertnão atribui valor aPC_INDICE1(nasce NULL).- Nenhum
tabPARMFATURPC_INDICE1Validateestá registrado - o campo não tem validação customizada no cadastro. source/MFA001/UdmMFA001.dfm:2353, 2504, 2696, 2974- SQL de SELECT/INSERT/UPDATE dePARMFATURincluiPC_INDICE1.
Delphi - consumidor principal: MPD002 (Pedido de Venda)
source/MPD002/UdmMPD002.pas:992-1003- cálculo doT_VL_INDICEGERALdo pedido emtabTotaisCalcFields(fórmula completa transcrita na seção "Valor > 0").source/MPD002/UdmMPD002.pas:6083-6101- cálculo doVL_INDICEpor item emtabITEMPEDIDOCalcFields(fórmula completa transcrita na seção "Valor > 0").source/MPD002/UdmMPD002.pas:5739-BuscaParametros_MPD002incluiCOALESCE(P.PC_INDICE1,0) PC_INDICE1no SELECT dePARMFATURque populaparmfatur.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-BuscaParametroslêCOALESCE(PC_INDICE1, 0)dePARMFATUR(carregado no contexto do pedido, sem uso adicional localizado).source/CPD009/UdmCPD009.dfm:297, 360, 442, 548- grids/updates dePARMFATURincluemPC_INDICE1(manutenção administrativa).source/RCA006/UdmRCA006.dfm:3046, 3109, 3191, 3297- grids/updates dePARMFATURincluemPC_INDICE1.
SQL - Procedures
Scripts/EXPORTACAO_SOVIS.sql:93- declaraçãoV_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.