Pular para o conteúdo principal

Parâmetro de Bloqueio de Desconto em Item Promocional

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 2 (label "Bloqueia Desconto em Produto Promoção") Tabela: PARMFATUR.ST_BLOQUEIADESCPROM Valor padrão: N (Não)

Controla se, quando o item estiver em promoção vigente (retornada pela procedure RETORNA_PRECOITEM com O_ST_PROMOCAO = '1'), os campos de desconto / valor unitário serão bloqueados (ReadOnly) nas telas de Pedido, Nota Fiscal, Ordem e Cotação. Também governa se, em rateios de desconto por pedido/nota, os itens promocionais devem ser excluídos do rateio.

Telas impactadas​

MóduloCódigoDescrição
Pedido de VendaMPD002Bloqueia VL_DESCONTO/PC_DESCONTO/VL_UNITARIO/VL_TOTAL quando ST_PROMOCAO = '1' e exclui promocionais do rateio de desconto
Pedido de Venda (Mobile/Rápido)MPD020Bloqueia edição do desconto em itens promocionais; Habilita_Desconto usa ST_AlteraPreco do usuário autorizador
Geração de NF a partir de PedidoMPD011Unit UdmNFORDEM / UNFORDEM aplica bloqueio ao transferir o item para a nota e no rateio de desconto e despesa
Nota Fiscal SaídaMNF002Bloqueia campos de desconto ao carregar o item; rateio global só é aplicado a promocionais quando ST_BLOQUEIADESCPROM = 'N'
Nota Fiscal Saída SimplificadaMNF008Carrega o parâmetro em BuscaParametros (mesmo SELECT de MNF002)
Frente de Caixa / PDVMNF017Só atribui O_ST_PROMOCAO do retorno de RETORNA_PRECOITEM quando ST_BLOQUEIADESCPROM = 'S'; caso contrário zera ('0')
NF Devolução/RemessaMNF019Armazena em iST_BLOQUEIADESCPROM; só executa a consulta O_ST_PROMOCAO quando 'S'
Cotação / ComprasMCO006Carrega o parâmetro junto à PARMFATUR
Recap NFMRC020Bloqueia campos de desconto na nota de recapagem quando item promocional
Cópia de Parâmetros entre EmpresasCPD009Replica ST_BLOQUEIADESCPROM nos INSERT/UPDATE de PARMFATUR
Cadastro de PrepostoRCA006Faz referência ao campo na seleção da PARMFATUR

Não foram encontradas stored procedures em Scripts/ que referenciem ST_BLOQUEIADESCPROM diretamente. A flag é consumida apenas em código Delphi; a informação que ela usa (O_ST_PROMOCAO) vem de RETORNA_PRECOITEM.

Campos envolvidos​

CampoDescrição
PARMFATUR.ST_BLOQUEIADESCPROMFlag S/N que liga/desliga o bloqueio de desconto em itens promocionais
ITEMPEDIDO.ST_PROMOCAO / ITEMNOTA.O_ST_PROMOCAOIndicador de item em promoção ('1' = em promoção, '0' = normal), retornado por RETORNA_PRECOITEM.O_ST_PROMOCAO
VL_DESCONTO, PC_DESCONTOValor / percentual de desconto do item — ficam ReadOnly quando o parâmetro é 'S' e o item está em promoção
VL_UNITARIO, VL_TOTALPreço unitário e total do item — também ficam ReadOnly em itens promocionais quando 'S'
PARMFATUR.ST_TABPRECOParâmetro correlato. Quando é 'V', 'B' ou 'L', MPD002 chama adicionalmente VerificaBloqTabPreco
Autorizador.ST_AlteraPrecoEm MPD020.Habilita_Desconto, permite a um usuário autorizador liberar a edição mesmo com o parâmetro em 'S'

Opções disponíveis​

S - Sim (bloqueia desconto em promocional)​

O que fazDetalhe
Ao selecionar item em promoçãoVL_DESCONTO, PC_DESCONTO, VL_UNITARIO e VL_TOTAL ficam ReadOnly (não editáveis)
Ao selecionar item fora de promoçãoCampos permanecem editáveis normalmente
Rateio de desconto do pedido (MPD002)Itens com ST_PROMOCAO = '1' são excluídos do rateio; desconto é distribuído apenas entre os itens normais
Rateio de desconto da nota (MNF002)Itens promocionais não recebem rateio do desconto global
Rateio de desconto/despesa da NF gerada por pedido (MPD011/UdmNFORDEM)Só distribui desconto quando ST_PROMOCAO <> '1'
O_ST_PROMOCAO vindo de RETORNA_PRECOITEMÉ gravado em ITEMNOTA.O_ST_PROMOCAO (em MNF002, MNF017, MNF019)
Em MNF002O bloqueio só é aplicado quando ST_ALTERANOTA não for 'S'/'T' e ST_TABPRECO <> 'V' (chamado 1228)
Em MPD020Usuário autorizador com ST_AlteraPreco = 'S' (função Habilita_Desconto) consegue liberar a edição mesmo assim

Simulação passo a passo​

  1. Em MFA001 → Parâmetros → Ambos → Opção 1 → Bloqueia Desconto em Produto Promoção = Sim.
  2. Salve (F6) e abra um Pedido de Venda em MPD002.
  3. Cadastre/tenha ativa uma promoção vigente para um determinado item (RETORNA_PRECOITEM retornará O_ST_PROMOCAO = '1').
  4. Inclua esse item no pedido. Ao validar CD_ITEM (tabITEMPEDIDOCD_ITEMValidate), o sistema:
    • Grava ST_PROMOCAO = '1' no item.
    • Executa o bloco if (parmfatur.values['ST_BLOQUEIADESCPROM'] = 'S') (UdmMPD002.pas linha 3313) que faz VL_DESCONTO.ReadOnly = True, PC_DESCONTO.ReadOnly = True, VL_UNITARIO.ReadOnly = True, VL_TOTAL.ReadOnly = True e limpa PC_DESCONTO e VL_DESCONTO (linhas 3324-3328).
  5. Tente digitar desconto manual no item promocional → campo bloqueado.
  6. Inclua um segundo item, fora de promoção (ST_PROMOCAO = '0'). Campos de desconto ficam editáveis.
  7. Preencha PEDIDO.VL_DESCONTO (desconto global do pedido) e confirme. O rateio (UMPD002.pas linhas 5154-5213) exclui o item promocional: o valor é distribuído proporcionalmente apenas entre os itens com ST_PROMOCAO = '0'.

Resultado esperado: O preço da promoção é protegido. O vendedor não consegue, nem digitando manualmente nem aplicando um desconto geral, reduzir ainda mais o valor do item em promoção.


N - Não (permite desconto em promocional)​

O que fazDetalhe
Ao selecionar item em promoçãoCampos de desconto permanecem editáveis
Rateio de desconto do pedido/notaItem promocional participa normalmente do rateio do desconto global
O_ST_PROMOCAO do retorno de RETORNA_PRECOITEMEm MNF002 / MNF017, é forçado para '0' (“limpa” a flag de promoção do item na nota)
Em MPD011/UNFORDEMAo gerar a NF a partir da ordem, itera os itens e grava ST_PROMOCAO = '0' em cada ITEMNOTA
Em MNF019Não dispara o SELECT O_ST_PROMOCAO extra (o código entra no ramo if (iST_BLOQUEIADESCPROM = 'S'); quando 'N', pula)

Simulação passo a passo​

  1. Em MFA001 → Bloqueia Desconto em Produto Promoção = Não.
  2. Salve (F6) e abra um Pedido de Venda em MPD002.
  3. Inclua um item que esteja em promoção cadastrada.
  4. Campos VL_DESCONTO, PC_DESCONTO, VL_UNITARIO e VL_TOTAL permanecem editáveis.
  5. Preencha PC_DESCONTO = 10 no item → valor é aceito.
  6. Informe desconto global PEDIDO.VL_DESCONTO e o item promocional entra no rateio normalmente.
  7. Em uma nota simplificada MNF017: ao validar o item, o sistema força O_ST_PROMOCAO = '0' (UMNF017.pas linhas 1329-1332), tratando o item como “não promocional” para todos os cálculos subsequentes.

Resultado esperado: O operador tem liberdade total para aplicar descontos manualmente ou via rateio — mesmo em itens que estariam em promoção vigente. Operacionalmente, a flag de promoção não protege o preço do item.

Este é o valor padrão ao criar um novo registro em PARMFATUR (UdmMFA001.tabPARMFATURAfterInsert linha 473 — AsString := 'N').


Regra de interação com outros parâmetros​

  • ST_ALTERANOTA (em MNF002): o bloqueio só é aplicado quando ST_ALTERANOTA não for 'S' nem 'T'. Ou seja, se a empresa permite alterar a nota após gerada, o bloqueio por promoção é ignorado (UdmMNF002.pas linhas 5788-5789 / 6696-6698).
  • ST_TABPRECO = 'V' (em MNF002): quando o controle de tabela de preço está como “Vendedor”, o bloqueio por promoção também é ignorado (linha 5789 — chamado 1228).
  • ST_TABPRECO em 'V', 'B' ou 'L' (em MPD002): adicionalmente chama VerificaBloqTabPreco após aplicar o bloqueio por promoção (UdmMPD002.pas linhas 3321 / 3353).
  • Usuário Autorizador com ST_AlteraPreco = 'S' (em MPD020): em Habilita_Desconto, mesmo com ST_BLOQUEIADESCPROM = 'S', o autorizador consegue editar preço/desconto do item promocional.

Tabela Comparativa Resumida​

OpçãoDesconto no item promocional?Rateio global inclui promocional?O_ST_PROMOCAO gravado no item
SNão (ReadOnly nos campos)Não (promocionais excluídos)'1' (mantém flag da promoção)
NSim (editável)Sim'0' (flag zerada — vira normal)

Referências no Código Fonte​

Tela de configuração (MFA001)​

  • source/MFA001/UMFA001.dfm linha 3949-3965 — lbl49 com caption "Bloqueia Desconto em Produto Promoção".
  • source/MFA001/UMFA001.dfm linha 4616-4642 — cmbST_BLOQUEIADESCPROM: TwwDBComboBox, DataField = 'ST_BLOQUEIADESCPROM', Items.Strings = (Sim#9S, Não#9N).
  • source/MFA001/UMFA001.pas linha 526 — declaração do componente cmbST_BLOQUEIADESCPROM: TwwDBComboBox.
  • source/MFA001/UdmMFA001.dfm linhas 125, 1062-1065, 2526, 2733, 3005 — SELECT/INSERT/UPDATE do tabPARMFATUR incluindo o campo.
  • source/MFA001/UdmMFA001.pas linha 123 — tabPARMFATURST_BLOQUEIADESCPROM: TStringField.
  • source/MFA001/UdmMFA001.pas linha 473 (bloco AfterInsert) — tabPARMFATURST_BLOQUEIADESCPROM.AsString := 'N'; (valor padrão).

Pedido de Venda (MPD002)​

  • source/MPD002/UdmMPD002.pas linha 3313 — aplica ReadOnly em VL_DESCONTO, PC_DESCONTO, VL_UNITARIO, VL_TOTAL quando ST_PROMOCAO = '1'.
  • source/MPD002/UdmMPD002.pas linha 3346 — reativa campos (ReadOnly := False) quando o item não traz promoção.
  • source/MPD002/UdmMPD002.pas linha 3798 — mesmo bloqueio em tabITEMPEDIDOAfterScroll.
  • source/MPD002/UdmMPD002.pas linha 2240 — varre os itens (flagReprocessaDesconto) e reconsulta O_ST_PROMOCAO para reajustar o bloqueio.
  • source/MPD002/UdmMPD002.pas linha 4367 — em tabITEMPEDIDOPC_DESCONTOValidate, reprocessa desconto respeitando o parâmetro.
  • source/MPD002/UMPD002.pas linhas 4752 / 5155-5213 — rateio do desconto global: quando 'S', o somatório de base usa apenas itens com ST_PROMOCAO = '0' e o desconto só é aplicado a esses itens.

Pedido Mobile/Rápido (MPD020)​

  • source/MPD020/UdmMPD020.pas linha 240 — variável local iST_BLOQUEIADESCPROM.
  • source/MPD020/UdmMPD020.pas linha 322 e 360 — SELECT em PARMFATUR carrega o parâmetro em iST_BLOQUEIADESCPROM.
  • source/MPD020/UdmMPD020.pas linha 677 — função Habilita_Desconto: se 'S' e UserAutorizador.St_AlteraPreco, libera edição mesmo em promoção.
  • source/MPD020/UdmMPD020.pas linhas 1360, 1377, 1745, 1774, 2041, 2937 — blocos que ativam/desativam ReadOnly em VL_UNITARIO/VL_TOTAL/VL_DESCONTO/PC_DESCONTO.
  • source/MPD020/UMPD020.pas linhas 1470, 1824, 1854 — recalcula desconto excluindo promocionais quando 'S'.

Geração de NF a partir de Pedido (MPD011)​

  • source/MPD011/UdmMPD011.pas linha 1580 — SELECT de PARMFATUR incluindo ST_BLOQUEIADESCPROM.
  • source/MPD011/UdmNFORDEM.pas linha 1458 — “chamado 1214”: rateia desconto apenas em itens cujo ST_PROMOCAO <> '1' ou quando parâmetro <> 'S'.
  • source/MPD011/UdmNFORDEM.pas linha 3374 / 3543 — aplica/ajusta ReadOnly dos campos de desconto na ITEMNOTA gerada.
  • source/MPD011/UNFORDEM.pas linha 1845 — quando 'N', percorre itens da nota gerada e força ST_PROMOCAO = '0'.

Nota Fiscal Saída (MNF002)​

  • source/MNF002/UdmMNF002.pas linha 5789 — bloco if parmfatur.values['ST_BLOQUEIADESCPROM'] = 'S' and ST_TABPRECO <> 'V' (chamado 1228): grava O_ST_PROMOCAO e aplica ReadOnly.
  • source/MNF002/UdmMNF002.pas linha 6698 — mesmo bloco no scroll do item.
  • source/MNF002/UdmMNF002.pas linha 10499 — SELECT em BuscaParametros_MNF002.
  • source/MNF002/UMNF002.pas linhas 6334 / 7190 — no rateio global de desconto, quando 'N' força O_ST_PROMOCAO = '0' (item passa a participar normalmente do rateio).

Outras telas​

  • source/MNF017/UMNF017.pas linhas 1329, 1946, 2174 — atribui O_ST_PROMOCAO do RETORNA_PRECOITEM apenas quando 'S'; caso contrário zera ('0').
  • source/MNF019/UdmMNF019.pas linhas 448, 633, 657, 4605 — variável iST_BLOQUEIADESCPROM; só roda o SELECT O_ST_PROMOCAO quando 'S'.
  • source/MNF008/UdmMNF008.pas linha 764 — inclui o campo no SELECT de parâmetros (mesma base de MNF002).
  • source/MCO006/UdmMCO006.pas linha 2108 — inclui o campo no SELECT de parâmetros da cotação.
  • source/MRC020/UdmMRC020NFORDEM.pas linhas 431, 566, 590, 4406, 4873 — carrega iST_BLOQUEIADESCPROM e aplica ReadOnly em VL_DESCONTO/PC_DESCONTO/VL_UNITARIO/VL_TOTAL para itens promocionais da NF de recapagem.
  • source/CPD009/UdmCPD009.dfm linhas 321, 385, 474 — SELECT/INSERT/UPDATE de cópia de parâmetros entre empresas.
  • source/RCA006/UdmRCA006.dfm — referência na seleção da PARMFATUR.