Pular para o conteúdo principal

ST_PRECOVENDA - Atualização de Tabela de Venda (Método de Cálculo do Preço de Venda na Entrada de NF)

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas Tabela: PARMFATUR.ST_PRECOVENDA Valor padrão: N (Não Atualiza) — definido em UdmMFA001.pas:444

Este parâmetro controla como e se o sistema recalcula/atualiza o preço da Tabela de Venda do produto durante a entrada de Nota Fiscal (conferência/emissão de NF de entrada). Ele define a base de custo usada (Última Compra, Custo de Estoque ou Tabela de Compra) e o método de cálculo (margem "De Cima" — markup sobre o custo — ou "De Baixo" — fator inverso sobre o preço de venda).

Telas impactadas​

MóduloCódigoDescriçãoUso
Parâmetros de FaturamentoMFA001Tela de configuração do parâmetroLeitura/gravação
Conferência de NF de EntradaCNF017Calcula o VL_VENDA do item da NF em tempo real conforme margem/custo digitadosLeitura via parmFatur.Values['ST_PRECOVENDA']
Parâmetros do PedidoCPD009Mantém o campo no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR)Persistência

Procedures impactadas​

ProcedureDescrição
ATUALIZA_PRECOVENDAProcedure central de recálculo. Recebe o valor de ST_PRECOVENDA via parâmetro I_ST_PRECOVENDA e decide qual fórmula de markup/margem aplicar.
RECALCULA_PRECOVENDALê PARMFATUR.ST_PRECOVENDA e decide a origem do custo (Custo Estoque D/E, Última Compra B/C, Tabela de Compra F/G, ou repassa para ATUALIZA_PRECOVENDA quando T).
GERA_ESTOQUEDurante a geração de estoque em operações de entrada (I_TP_OPERACAO = 'E'), lê PARMFATUR.ST_PRECOVENDA e chama ATUALIZA_PRECOVENDA.
GERA_ESTOQUE_NOTAFISCALIdem, ao gerar estoque a partir da nota fiscal (usa CASE WHEN P.CD_TABPRECO IS NULL THEN 'N' ELSE P.ST_PRECOVENDA END).
GERA_NOTAFISCALDeclara variável I_ST_PRECOVENDA para o fluxo de geração de NF.
Trigger ITEMTABPRECO_AU0Dispara RECALCULA_PRECOVENDA quando o item pertence à tabela padrão e o parâmetro está em modo T.
RECALCULA_PRECOCOMPRADeclara variável V_ST_PRECOVENDA.

Campos envolvidos​

CampoDescrição
PARMFATUR.ST_PRECOVENDAParâmetro em si (VARCHAR(1)). Valores: C, E, B, D, F, G, T, N.
PARMFATUR.CD_TABPRECOTabela de Venda padrão alvo da atualização. Se estiver NULL em GERA_ESTOQUE_NOTAFISCAL, o sistema força ST_PRECOVENDA = 'N'.
PARMFATUR.PC_MARGEMVENDAMargem padrão da empresa usada quando o item/tabela não têm margem própria.
PARMFATUR.TP_ATUALIZACAOTABELAVENDAEscopo da atualização (Todas, Margem preenchida, etc.). Habilitado apenas quando ST_PRECOVENDA é diferente de T e N (ver UMFA001.pas:924-925 e UdmMFA001.pas:1680-1691).
ITEMNOTA.VL_UNITARIOUsado como custo "Última Compra" (opções B e C).
ITEMNOTA.VL_ESTOQUEUsado como custo "Custo Estoque" (opções D e E).
ITEMNOTA.VL_CUSTOCusto bruto (fallback).
ITEMNOTA.VL_VENDAPreço de venda calculado.
ITEMNOTA.PC_MARGEMMargem aplicada no cálculo.
ITEMTABCOMPRA.VL_PRECOPreço da Tabela de Compra (opções F e G).

Opções disponíveis​

C - Última Compra (De Cima)​

O que fazDetalhe
Base de custoVL_UNITARIO da última compra (ITEMNOTA)
MétodoDe Cima (markup direto sobre o custo)
FórmulaVL_VENDA = VL_UNITARIO + (VL_UNITARIO × PC_MARGEM / 100)
Fórmula inversa (ao digitar venda)PC_MARGEM = (VL_VENDA - VL_UNITARIO) × 100 / VL_UNITARIO
Quando recalcula (ATUALIZA_PRECOVENDA)TP_LANCAMENTO = 'N' (NF nova) ou 'P' (padrão), ver ATUALIZA_PRECOVENDA.sql:47-49
TP_ATUALIZACAOTABELAVENDAHabilitado (permite escolher escopo)

Simulação passo a passo​

  1. MFA001 → aba Parâmetros → Notas Fiscais → Parâmetros de Notas → Atualiza Tabela de Venda = Última Compra (De Cima) (C)
  2. Salve os parâmetros (F6)
  3. Dê entrada de uma NF (CNF017) com um item cujo VL_UNITARIO = 100,00 e PC_MARGEM = 30%
  4. Durante a conferência do item, observe o campo Valor de Venda do ITEMNOTA
  5. VL_VENDA = 100 + (100 × 30 / 100) = 130,00
  6. Confirme a NF → a procedure ATUALIZA_PRECOVENDA atualizará o VL_PRECO do produto na Tabela de Venda padrão (CD_TABPRECO do PARMFATUR) usando esta mesma fórmula

Resultado esperado: O preço da tabela de venda é recalculado como custo da última compra + margem aplicada por cima.


E - Custo Estoque (De Cima)​

O que fazDetalhe
Base de custoVL_ESTOQUE (custo médio de estoque)
MétodoDe Cima (markup direto)
FórmulaVL_VENDA = VL_ESTOQUE + (VL_ESTOQUE × PC_MARGEM / 100)
Fórmula inversaPC_MARGEM = (VL_VENDA - VL_ESTOQUE) × 100 / VL_ESTOQUE
Quando recalculaTP_LANCAMENTO = 'E' (entrada com reavaliação de estoque) ou 'P'
TP_ATUALIZACAOTABELAVENDAHabilitado

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Custo Estoque (De Cima) (E)
  2. Salve os parâmetros (F6)
  3. Suponha produto com custo médio de estoque (VL_ESTOQUE) = 80,00 e margem 25%
  4. Dê entrada de uma NF (CNF017) desse item
  5. VL_VENDA = 80 + (80 × 25 / 100) = 100,00
  6. Após confirmar a entrada, GERA_ESTOQUE recalcula o estoque; em seguida ATUALIZA_PRECOVENDA usa o novo custo médio como base

Resultado esperado: O preço é calculado usando o custo médio de estoque (não o preço da nota) + margem por cima.


B - Última Compra (De Baixo)​

O que fazDetalhe
Base de custoVL_UNITARIO da última compra
MétodoDe Baixo (markup inverso / preço por fator)
FatorV_FATOR = 1 - (PC_MARGEM / 100)
FórmulaVL_VENDA = VL_UNITARIO / V_FATOR (somente se V_FATOR > 0)
Fórmula inversaPC_MARGEM = (1 - VL_UNITARIO / VL_VENDA) × 100
Se V_FATOR ≤ 0VL_VENDA = 0,00
Quando recalculaTP_LANCAMENTO = 'N' ou 'P'

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Última Compra (De Baixo) (B)
  2. Salve os parâmetros (F6)
  3. Dê entrada de uma NF (CNF017) com item VL_UNITARIO = 100,00 e PC_MARGEM = 20%
  4. V_FATOR = 1 - 0,20 = 0,80
  5. VL_VENDA = 100 / 0,80 = 125,00
  6. Note que a margem efetiva sobre o custo é 25% (não 20%) — o parâmetro diz que a margem é "sobre o preço de venda"

Resultado esperado: Preço calculado "de baixo para cima" — a margem representa o percentual do preço final, não do custo.


D - Custo Estoque (De Baixo)​

O que fazDetalhe
Base de custoVL_ESTOQUE (custo médio)
MétodoDe Baixo
FatorV_FATOR = 1 - (PC_MARGEM / 100)
FórmulaVL_VENDA = VL_ESTOQUE / V_FATOR
Fórmula inversaPC_MARGEM = (1 - VL_ESTOQUE / VL_VENDA) × 100
Quando recalculaTP_LANCAMENTO = 'E' ou 'P'

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Custo Estoque (De Baixo) (D)
  2. Salve (F6)
  3. Produto com custo médio 80,00 e margem 20% → V_FATOR = 0,80
  4. VL_VENDA = 80 / 0,80 = 100,00
  5. Se o usuário digitar manualmente VL_VENDA = 120,00, o sistema recalcula: PC_MARGEM = (1 - 80/120) × 100 = 33,33%

Resultado esperado: Usa custo médio de estoque com cálculo de margem "de baixo".


F - Tab de Compra (De Cima)​

O que fazDetalhe
Base de custoVL_PRECO da Tabela de Compra (ITEMTABCOMPRA)
MétodoDe Cima (markup direto)
Origem em RECALCULA_PRECOVENDAITEMTABCOMPRA.VL_PRECO filtrando por CD_TABCOMPRA do PARMFATUR
Quando recalculaTP_LANCAMENTO = 'N' ou 'P'
Pré-requisitoEmpresa deve ter Tabela de Compra definida (PARMFATUR.CD_TABCOMPRA)

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Tab de Compra (De Cima) (F)
  2. Informe uma Tabela de Compra padrão (CD_TABCOMPRA) e salve (F6)
  3. Certifique-se que o produto tem preço cadastrado na tabela de compra (ex.: VL_PRECO = 90,00)
  4. Margem 20%
  5. Ao recalcular (trigger ou entrada): VL_VENDA = 90 + (90 × 20 / 100) = 108,00
  6. O preço da tabela de venda é atualizado para 108,00

Resultado esperado: O preço de venda deriva da tabela de compra (não da NF nem do estoque), com margem aplicada por cima.


G - Tab de Compra (De Baixo)​

O que fazDetalhe
Base de custoVL_PRECO da Tabela de Compra
MétodoDe Baixo (fator inverso)
FórmulaVL_VENDA = VL_PRECO / (1 - PC_MARGEM/100)
Quando recalculaTP_LANCAMENTO = 'N' ou 'P'

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Tab de Compra (De Baixo) (G)
  2. Salve (F6)
  3. Produto com preço de tabela de compra 90,00 e margem 20%
  4. V_FATOR = 0,80 → VL_VENDA = 90 / 0,80 = 112,50

Resultado esperado: Igual ao F, mas com cálculo "de baixo" — a margem representa o percentual do preço de venda.


T - Tabela de Venda Padrão​

O que fazDetalhe
ComportamentoNão usa custo — lê o VL_PRECO de outra Tabela de Venda cadastrada (ITEMTABPRECO) e recalcula as demais tabelas com base na margem dela
Procedure responsávelATUALIZA_PRECOVENDA.sql:64-76 — monta consulta em ITEMTABPRECO + TABPRECO para varrer todas as tabelas do item e atualizar os preços
Usa tabelas derivadas?Sim — percorre todas as tabelas associadas ao item via cursor dinâmico
TP_ATUALIZACAOTABELAVENDABLOQUEADO/desabilitado (forçado para 'T') — ver UdmMFA001.pas:1682-1686
Trigger ITEMTABPRECO_AU0Dispara RECALCULA_PRECOVENDA quando a linha alterada pertence à tabela padrão (CD_TABPRECO do PARMFATUR) e ST_PRECOVENDA = 'T'

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Tabela de Venda Padrão (T)
  2. Observe: o combo Tipo de Atualização da Tabela de Venda fica desabilitado e é forçado para "T"
  3. Informe uma Tabela de Venda padrão (CD_TABPRECO) — obrigatório (senão bloqueia no salvamento: UMFA001.pas:1043-1050)
  4. Salve (F6)
  5. Cadastre um item com preço de 100,00 na tabela padrão e margem 30%
  6. Altere o preço/margem na tabela padrão ([TFA006]) → a trigger ITEMTABPRECO_AU0 recalcula os preços das demais tabelas vinculadas ao item, usando como referência a tabela padrão
  7. Em nenhum momento o custo do produto é usado — apenas preço de tabela de venda

Resultado esperado: As outras tabelas de venda do item são atualizadas automaticamente a partir da tabela padrão, sem envolver custo de compra/estoque.


N - Não Atualiza​

O que fazDetalhe
ComportamentoNenhuma atualização automática da Tabela de Venda na entrada de NF
Procedure ATUALIZA_PRECOVENDANenhum dos blocos IN ('C','B','F','G'), ('D','E'), ou ='T' é satisfeito — procedure efetivamente não altera preços
GERA_ESTOQUE_NOTAFISCALCASE WHEN P.CD_TABPRECO IS NULL THEN 'N' ELSE P.ST_PRECOVENDA END — o próprio SELECT força 'N' quando não há tabela padrão
TP_ATUALIZACAOTABELAVENDABLOQUEADO/desabilitado (forçado para 'T') — ver UdmMFA001.pas:1682-1686
CD_TABPRECO obrigatório?Não — UMFA001.pas:1043 só valida quando ST_PRECOVENDA <> 'N'

Simulação passo a passo​

  1. MFA001 → Atualiza Tabela de Venda = Não Atualiza (N)
  2. Observe: o combo Tipo de Atualização da Tabela de Venda fica desabilitado
  3. Não é necessário informar CD_TABPRECO
  4. Salve (F6)
  5. Dê entrada de qualquer NF no CNF017 com custo e margem
  6. Confirme a entrada → o preço da tabela de venda NÃO é atualizado
  7. As tabelas de venda permanecem exatamente como estavam antes da entrada

Resultado esperado: Entradas de NF não mexem em preço de tabela. Este é o valor padrão ao criar um novo registro no MFA001 (UdmMFA001.pas:444).


Interação com TP_ATUALIZACAOTABELAVENDA​

O parâmetro irmão TP_ATUALIZACAOTABELAVENDA (combo "Tipo de Atualização") controla o escopo da atualização (quais tabelas do item são afetadas: Todas, só as com Margem preenchida, etc.). A habilitação do combo depende diretamente de ST_PRECOVENDA:

  • ST_PRECOVENDA = T ou N → cmbTP_ATUALIZACAOTABELAVENDA.Enabled = false e forçado para 'T' (UdmMFA001.pas:1680-1691; reforçado na carga em UMFA001.pas:924-925)
  • Qualquer outra opção (C, E, B, D, F, G) → combo habilitado para edição

Validação no Salvamento (MFA001)​

Em UMFA001.pas:1043-1050, ao clicar em Salvar (F6):

  • Se ST_PRECOVENDA <> 'N' e CD_TABPRECO estiver em branco → bloqueia com erro: "Informe alguma tabela de Venda para Atualização de Tabela de Venda."

Integração com GERA_ESTOQUE / GERA_NOTAFISCAL​

Em GERA_ESTOQUE.sql:711-731 e GERA_ESTOQUE_NOTAFISCAL.sql:168-178, durante o processamento de uma NF de entrada:

  1. Sistema faz SELECT ST_PRECOVENDA, PC_MARGEMVENDA, CD_TABPRECO FROM PARMFATUR
  2. Se CD_TABPRECO IS NULL → força ST_PRECOVENDA = 'N' (defesa contra configuração inconsistente)
  3. Caso contrário, chama ATUALIZA_PRECOVENDA com os valores lidos, passando TP_LANCAMENTO = 'E'

Regra Geral de Cálculo​

  • Opções De Cima (C, E, F): margem aplicada como markup sobre o custo → preço = custo × (1 + margem/100)
  • Opções De Baixo (B, D, G): margem representa percentual do preço final → preço = custo / (1 - margem/100)
  • Para a mesma margem nominal, "De Baixo" sempre resulta em preço maior que "De Cima"
  • Prioridade da margem (ATUALIZA_PRECOVENDA.sql:165-170): margem do item na tabela (V_PC_MARGEMITEMTAB) → margem do item cadastrado (I_PC_MARGEMITEM) → margem da tabela (V_PC_MARGEMTAB) → margem padrão da empresa (PC_MARGEMVENDA)

Tabela Comparativa Resumida​

OpçãoBase de CustoMétodoQuando recalcula (TP_LANCAMENTO)TP_ATUALIZACAOTABELAVENDAExige CD_TABPRECO?
CÚltima Compra (VL_UNITARIO)De CimaN, PHabilitadoSim
ECusto Estoque (VL_ESTOQUE)De CimaE, PHabilitadoSim
BÚltima Compra (VL_UNITARIO)De BaixoN, PHabilitadoSim
DCusto Estoque (VL_ESTOQUE)De BaixoE, PHabilitadoSim
FTabela de Compra (ITEMTABCOMPRA)De CimaN, PHabilitadoSim
GTabela de Compra (ITEMTABCOMPRA)De BaixoN, PHabilitadoSim
TTabela de Venda Padrão (sem custo)Reflete margem da tabela padrãosempreDesabilitado (força 'T')Sim
N—Não atualiza nadanuncaDesabilitado (força 'T')Não

Referências no Código Fonte​

Delphi​

ArquivoLinhasDescrição
source/MFA001/UMFA001.dfm5973, 6570-6601Label "Atualiza Tabela de Venda" e ComboBox cmbST_PRECOVENDA com as 8 opções
source/MFA001/UMFA001.pas377Declaração do componente cmbST_PRECOVENDA: TwwDBComboBox
source/MFA001/UMFA001.pas924-925Habilitação do combo TP_ATUALIZACAOTABELAVENDA na carga da tela
source/MFA001/UMFA001.pas1043-1050Validação no salvamento: exige CD_TABPRECO quando ST_PRECOVENDA <> 'N'
source/MFA001/UdmMFA001.pas48, 388Declaração do TField e do OnValidate
source/MFA001/UdmMFA001.pas444Valor padrão 'N' no AfterInsert
source/MFA001/UdmMFA001.pas1680-1691Handler tabPARMFATURST_PRECOVENDAValidate — bloqueia TP_ATUALIZACAOTABELAVENDA quando opção é T ou N
source/MFA001/UdmMFA001.dfm81, 719-723, 2343, 2489, 2725Definição do TField e presença nos SQLs do dataset (SELECT/INSERT/UPDATE)
source/CNF017/UdmCNF017.pas321-359tabITEMNOTAVL_CUSTOValidate — recalcula VL_VENDA do item da NF conforme ST_PRECOVENDA
source/CNF017/UdmCNF017.pas361-403tabITEMNOTAPC_MARGEMValidate — idem, disparado na alteração da margem
source/CNF017/UdmCNF017.pas436-479tabITEMNOTAVL_VENDAValidate — fórmula inversa: digitando o preço de venda, recalcula a margem
source/CPD009/UdmCPD009.dfm315, 379, 471, 535Dataset de parâmetros do CPD009 (INSERT/UPDATE/SELECT de PARMFATUR)

SQL (Firebird)​

ArquivoLinhasDescrição
Scripts/ATUALIZA_PRECOVENDA.sql10, 47-49, 64, 161, 177, 223, 244, 336Parâmetro I_ST_PRECOVENDA e ramos de cálculo por opção (C,B,F,G vs D,E vs T)
Scripts/RECALCULA_PRECOVENDA.sql18, 31-34, 74, 81, 100, 108, 112, 115, 118Lê ST_PRECOVENDA do PARMFATUR e decide origem do custo (estoque D/E, última compra B/C, tab compra F/G, tabela padrão T)
Scripts/GERA_ESTOQUE.sql53, 711-715, 728-731Lê ST_PRECOVENDA e chama ATUALIZA_PRECOVENDA com TP_LANCAMENTO='E'
Scripts/GERA_ESTOQUE_NOTAFISCAL.sql87, 170, 176Lê ST_PRECOVENDA forçando 'N' se CD_TABPRECO IS NULL
Scripts/GERA_NOTAFISCAL.sql85Declara I_ST_PRECOVENDA
Scripts/ITEMTABPRECO_AU0.sql43, 51Trigger AFTER UPDATE — dispara RECALCULA_PRECOVENDA quando ST_PRECOVENDA = 'T'
Scripts/RECALCULA_PRECOCOMPRA.sql16Declara V_ST_PRECOVENDA