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ódulo | Código | Descrição | Uso |
|---|
| Parâmetros de Faturamento | MFA001 | Tela de configuração do parâmetro | Leitura/gravação |
| Conferência de NF de Entrada | CNF017 | Calcula o VL_VENDA do item da NF em tempo real conforme margem/custo digitados | Leitura via parmFatur.Values['ST_PRECOVENDA'] |
| Parâmetros do Pedido | CPD009 | Mantém o campo no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR) | Persistência |
Procedures impactadas
| Procedure | Descrição |
|---|
ATUALIZA_PRECOVENDA | Procedure 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_PRECOVENDA | Lê 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_ESTOQUE | Durante a geração de estoque em operações de entrada (I_TP_OPERACAO = 'E'), lê PARMFATUR.ST_PRECOVENDA e chama ATUALIZA_PRECOVENDA. |
GERA_ESTOQUE_NOTAFISCAL | Idem, ao gerar estoque a partir da nota fiscal (usa CASE WHEN P.CD_TABPRECO IS NULL THEN 'N' ELSE P.ST_PRECOVENDA END). |
GERA_NOTAFISCAL | Declara variável I_ST_PRECOVENDA para o fluxo de geração de NF. |
Trigger ITEMTABPRECO_AU0 | Dispara RECALCULA_PRECOVENDA quando o item pertence à tabela padrão e o parâmetro está em modo T. |
RECALCULA_PRECOCOMPRA | Declara variável V_ST_PRECOVENDA. |
Campos envolvidos
| Campo | Descrição |
|---|
PARMFATUR.ST_PRECOVENDA | Parâmetro em si (VARCHAR(1)). Valores: C, E, B, D, F, G, T, N. |
PARMFATUR.CD_TABPRECO | Tabela de Venda padrão alvo da atualização. Se estiver NULL em GERA_ESTOQUE_NOTAFISCAL, o sistema força ST_PRECOVENDA = 'N'. |
PARMFATUR.PC_MARGEMVENDA | Margem padrão da empresa usada quando o item/tabela não têm margem própria. |
PARMFATUR.TP_ATUALIZACAOTABELAVENDA | Escopo 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_UNITARIO | Usado como custo "Última Compra" (opções B e C). |
ITEMNOTA.VL_ESTOQUE | Usado como custo "Custo Estoque" (opções D e E). |
ITEMNOTA.VL_CUSTO | Custo bruto (fallback). |
ITEMNOTA.VL_VENDA | Preço de venda calculado. |
ITEMNOTA.PC_MARGEM | Margem aplicada no cálculo. |
ITEMTABCOMPRA.VL_PRECO | Preço da Tabela de Compra (opções F e G). |
Opções disponíveis
C - Última Compra (De Cima)
| O que faz | Detalhe |
|---|
| Base de custo | VL_UNITARIO da última compra (ITEMNOTA) |
| Método | De Cima (markup direto sobre o custo) |
| Fórmula | VL_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_ATUALIZACAOTABELAVENDA | Habilitado (permite escolher escopo) |
Simulação passo a passo
- MFA001 → aba Parâmetros → Notas Fiscais → Parâmetros de Notas → Atualiza Tabela de Venda =
Última Compra (De Cima) (C)
- Salve os parâmetros (F6)
- Dê entrada de uma NF (CNF017) com um item cujo
VL_UNITARIO = 100,00 e PC_MARGEM = 30%
- Durante a conferência do item, observe o campo Valor de Venda do ITEMNOTA
VL_VENDA = 100 + (100 × 30 / 100) = 130,00
- 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 faz | Detalhe |
|---|
| Base de custo | VL_ESTOQUE (custo médio de estoque) |
| Método | De Cima (markup direto) |
| Fórmula | VL_VENDA = VL_ESTOQUE + (VL_ESTOQUE × PC_MARGEM / 100) |
| Fórmula inversa | PC_MARGEM = (VL_VENDA - VL_ESTOQUE) × 100 / VL_ESTOQUE |
| Quando recalcula | TP_LANCAMENTO = 'E' (entrada com reavaliação de estoque) ou 'P' |
TP_ATUALIZACAOTABELAVENDA | Habilitado |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Custo Estoque (De Cima) (E)
- Salve os parâmetros (F6)
- Suponha produto com custo médio de estoque (
VL_ESTOQUE) = 80,00 e margem 25%
- Dê entrada de uma NF (CNF017) desse item
VL_VENDA = 80 + (80 × 25 / 100) = 100,00
- 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 faz | Detalhe |
|---|
| Base de custo | VL_UNITARIO da última compra |
| Método | De Baixo (markup inverso / preço por fator) |
| Fator | V_FATOR = 1 - (PC_MARGEM / 100) |
| Fórmula | VL_VENDA = VL_UNITARIO / V_FATOR (somente se V_FATOR > 0) |
| Fórmula inversa | PC_MARGEM = (1 - VL_UNITARIO / VL_VENDA) × 100 |
Se V_FATOR ≤ 0 | VL_VENDA = 0,00 |
| Quando recalcula | TP_LANCAMENTO = 'N' ou 'P' |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Última Compra (De Baixo) (B)
- Salve os parâmetros (F6)
- Dê entrada de uma NF (CNF017) com item
VL_UNITARIO = 100,00 e PC_MARGEM = 20%
V_FATOR = 1 - 0,20 = 0,80
VL_VENDA = 100 / 0,80 = 125,00
- 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 faz | Detalhe |
|---|
| Base de custo | VL_ESTOQUE (custo médio) |
| Método | De Baixo |
| Fator | V_FATOR = 1 - (PC_MARGEM / 100) |
| Fórmula | VL_VENDA = VL_ESTOQUE / V_FATOR |
| Fórmula inversa | PC_MARGEM = (1 - VL_ESTOQUE / VL_VENDA) × 100 |
| Quando recalcula | TP_LANCAMENTO = 'E' ou 'P' |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Custo Estoque (De Baixo) (D)
- Salve (F6)
- Produto com custo médio 80,00 e margem 20% →
V_FATOR = 0,80
VL_VENDA = 80 / 0,80 = 100,00
- 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 faz | Detalhe |
|---|
| Base de custo | VL_PRECO da Tabela de Compra (ITEMTABCOMPRA) |
| Método | De Cima (markup direto) |
| Origem em RECALCULA_PRECOVENDA | ITEMTABCOMPRA.VL_PRECO filtrando por CD_TABCOMPRA do PARMFATUR |
| Quando recalcula | TP_LANCAMENTO = 'N' ou 'P' |
| Pré-requisito | Empresa deve ter Tabela de Compra definida (PARMFATUR.CD_TABCOMPRA) |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Tab de Compra (De Cima) (F)
- Informe uma Tabela de Compra padrão (
CD_TABCOMPRA) e salve (F6)
- Certifique-se que o produto tem preço cadastrado na tabela de compra (ex.:
VL_PRECO = 90,00)
- Margem 20%
- Ao recalcular (trigger ou entrada):
VL_VENDA = 90 + (90 × 20 / 100) = 108,00
- 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 faz | Detalhe |
|---|
| Base de custo | VL_PRECO da Tabela de Compra |
| Método | De Baixo (fator inverso) |
| Fórmula | VL_VENDA = VL_PRECO / (1 - PC_MARGEM/100) |
| Quando recalcula | TP_LANCAMENTO = 'N' ou 'P' |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Tab de Compra (De Baixo) (G)
- Salve (F6)
- Produto com preço de tabela de compra 90,00 e margem 20%
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 faz | Detalhe |
|---|
| Comportamento | Nã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ável | ATUALIZA_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_ATUALIZACAOTABELAVENDA | BLOQUEADO/desabilitado (forçado para 'T') — ver UdmMFA001.pas:1682-1686 |
Trigger ITEMTABPRECO_AU0 | Dispara RECALCULA_PRECOVENDA quando a linha alterada pertence à tabela padrão (CD_TABPRECO do PARMFATUR) e ST_PRECOVENDA = 'T' |
Simulação passo a passo
- MFA001 → Atualiza Tabela de Venda =
Tabela de Venda Padrão (T)
- Observe: o combo Tipo de Atualização da Tabela de Venda fica desabilitado e é forçado para "T"
- Informe uma Tabela de Venda padrão (
CD_TABPRECO) — obrigatório (senão bloqueia no salvamento: UMFA001.pas:1043-1050)
- Salve (F6)
- Cadastre um item com preço de 100,00 na tabela padrão e margem 30%
- 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
- 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 faz | Detalhe |
|---|
| Comportamento | Nenhuma atualização automática da Tabela de Venda na entrada de NF |
Procedure ATUALIZA_PRECOVENDA | Nenhum dos blocos IN ('C','B','F','G'), ('D','E'), ou ='T' é satisfeito — procedure efetivamente não altera preços |
GERA_ESTOQUE_NOTAFISCAL | CASE 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_ATUALIZACAOTABELAVENDA | BLOQUEADO/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
- MFA001 → Atualiza Tabela de Venda =
Não Atualiza (N)
- Observe: o combo Tipo de Atualização da Tabela de Venda fica desabilitado
- Não é necessário informar
CD_TABPRECO
- Salve (F6)
- Dê entrada de qualquer NF no CNF017 com custo e margem
- Confirme a entrada → o preço da tabela de venda NÃO é atualizado
- 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).
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."
Em GERA_ESTOQUE.sql:711-731 e GERA_ESTOQUE_NOTAFISCAL.sql:168-178, durante o processamento de uma NF de entrada:
- Sistema faz
SELECT ST_PRECOVENDA, PC_MARGEMVENDA, CD_TABPRECO FROM PARMFATUR
- Se
CD_TABPRECO IS NULL → força ST_PRECOVENDA = 'N' (defesa contra configuração inconsistente)
- 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ção | Base de Custo | Método | Quando recalcula (TP_LANCAMENTO) | TP_ATUALIZACAOTABELAVENDA | Exige CD_TABPRECO? |
|---|
| C | Última Compra (VL_UNITARIO) | De Cima | N, P | Habilitado | Sim |
| E | Custo Estoque (VL_ESTOQUE) | De Cima | E, P | Habilitado | Sim |
| B | Última Compra (VL_UNITARIO) | De Baixo | N, P | Habilitado | Sim |
| D | Custo Estoque (VL_ESTOQUE) | De Baixo | E, P | Habilitado | Sim |
| F | Tabela de Compra (ITEMTABCOMPRA) | De Cima | N, P | Habilitado | Sim |
| G | Tabela de Compra (ITEMTABCOMPRA) | De Baixo | N, P | Habilitado | Sim |
| T | Tabela de Venda Padrão (sem custo) | Reflete margem da tabela padrão | sempre | Desabilitado (força 'T') | Sim |
| N | — | Não atualiza nada | nunca | Desabilitado (força 'T') | Não |
Referências no Código Fonte
Delphi
| Arquivo | Linhas | Descrição |
|---|
source/MFA001/UMFA001.dfm | 5973, 6570-6601 | Label "Atualiza Tabela de Venda" e ComboBox cmbST_PRECOVENDA com as 8 opções |
source/MFA001/UMFA001.pas | 377 | Declaração do componente cmbST_PRECOVENDA: TwwDBComboBox |
source/MFA001/UMFA001.pas | 924-925 | Habilitação do combo TP_ATUALIZACAOTABELAVENDA na carga da tela |
source/MFA001/UMFA001.pas | 1043-1050 | Validação no salvamento: exige CD_TABPRECO quando ST_PRECOVENDA <> 'N' |
source/MFA001/UdmMFA001.pas | 48, 388 | Declaração do TField e do OnValidate |
source/MFA001/UdmMFA001.pas | 444 | Valor padrão 'N' no AfterInsert |
source/MFA001/UdmMFA001.pas | 1680-1691 | Handler tabPARMFATURST_PRECOVENDAValidate — bloqueia TP_ATUALIZACAOTABELAVENDA quando opção é T ou N |
source/MFA001/UdmMFA001.dfm | 81, 719-723, 2343, 2489, 2725 | Definição do TField e presença nos SQLs do dataset (SELECT/INSERT/UPDATE) |
source/CNF017/UdmCNF017.pas | 321-359 | tabITEMNOTAVL_CUSTOValidate — recalcula VL_VENDA do item da NF conforme ST_PRECOVENDA |
source/CNF017/UdmCNF017.pas | 361-403 | tabITEMNOTAPC_MARGEMValidate — idem, disparado na alteração da margem |
source/CNF017/UdmCNF017.pas | 436-479 | tabITEMNOTAVL_VENDAValidate — fórmula inversa: digitando o preço de venda, recalcula a margem |
source/CPD009/UdmCPD009.dfm | 315, 379, 471, 535 | Dataset de parâmetros do CPD009 (INSERT/UPDATE/SELECT de PARMFATUR) |
SQL (Firebird)
| Arquivo | Linhas | Descrição |
|---|
Scripts/ATUALIZA_PRECOVENDA.sql | 10, 47-49, 64, 161, 177, 223, 244, 336 | Parâmetro I_ST_PRECOVENDA e ramos de cálculo por opção (C,B,F,G vs D,E vs T) |
Scripts/RECALCULA_PRECOVENDA.sql | 18, 31-34, 74, 81, 100, 108, 112, 115, 118 | Lê 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.sql | 53, 711-715, 728-731 | Lê ST_PRECOVENDA e chama ATUALIZA_PRECOVENDA com TP_LANCAMENTO='E' |
Scripts/GERA_ESTOQUE_NOTAFISCAL.sql | 87, 170, 176 | Lê ST_PRECOVENDA forçando 'N' se CD_TABPRECO IS NULL |
Scripts/GERA_NOTAFISCAL.sql | 85 | Declara I_ST_PRECOVENDA |
Scripts/ITEMTABPRECO_AU0.sql | 43, 51 | Trigger AFTER UPDATE — dispara RECALCULA_PRECOVENDA quando ST_PRECOVENDA = 'T' |
Scripts/RECALCULA_PRECOCOMPRA.sql | 16 | Declara V_ST_PRECOVENDA |