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_BLOQUEIADESCPROMValor 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ódulo | Código | Descrição |
|---|---|---|
| Pedido de Venda | MPD002 | Bloqueia 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) | MPD020 | Bloqueia edição do desconto em itens promocionais; Habilita_Desconto usa ST_AlteraPreco do usuário autorizador |
| Geração de NF a partir de Pedido | MPD011 | Unit UdmNFORDEM / UNFORDEM aplica bloqueio ao transferir o item para a nota e no rateio de desconto e despesa |
| Nota Fiscal Saída | MNF002 | Bloqueia campos de desconto ao carregar o item; rateio global só é aplicado a promocionais quando ST_BLOQUEIADESCPROM = 'N' |
| Nota Fiscal Saída Simplificada | MNF008 | Carrega o parâmetro em BuscaParametros (mesmo SELECT de MNF002) |
| Frente de Caixa / PDV | MNF017 | Só atribui O_ST_PROMOCAO do retorno de RETORNA_PRECOITEM quando ST_BLOQUEIADESCPROM = 'S'; caso contrário zera ('0') |
| NF Devolução/Remessa | MNF019 | Armazena em iST_BLOQUEIADESCPROM; só executa a consulta O_ST_PROMOCAO quando 'S' |
| Cotação / Compras | MCO006 | Carrega o parâmetro junto à PARMFATUR |
| Recap NF | MRC020 | Bloqueia campos de desconto na nota de recapagem quando item promocional |
| Cópia de Parâmetros entre Empresas | CPD009 | Replica ST_BLOQUEIADESCPROM nos INSERT/UPDATE de PARMFATUR |
| Cadastro de Preposto | RCA006 | Faz referência ao campo na seleção da PARMFATUR |
Não foram encontradas stored procedures em
Scripts/que referenciemST_BLOQUEIADESCPROMdiretamente. A flag é consumida apenas em código Delphi; a informação que ela usa (O_ST_PROMOCAO) vem deRETORNA_PRECOITEM.
Campos envolvidos
| Campo | Descrição |
|---|---|
PARMFATUR.ST_BLOQUEIADESCPROM | Flag S/N que liga/desliga o bloqueio de desconto em itens promocionais |
ITEMPEDIDO.ST_PROMOCAO / ITEMNOTA.O_ST_PROMOCAO | Indicador de item em promoção ('1' = em promoção, '0' = normal), retornado por RETORNA_PRECOITEM.O_ST_PROMOCAO |
VL_DESCONTO, PC_DESCONTO | Valor / percentual de desconto do item — ficam ReadOnly quando o parâmetro é 'S' e o item está em promoção |
VL_UNITARIO, VL_TOTAL | Preço unitário e total do item — também ficam ReadOnly em itens promocionais quando 'S' |
PARMFATUR.ST_TABPRECO | Parâmetro correlato. Quando é 'V', 'B' ou 'L', MPD002 chama adicionalmente VerificaBloqTabPreco |
Autorizador.ST_AlteraPreco | Em 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 faz | Detalhe |
|---|---|
| Ao selecionar item em promoção | VL_DESCONTO, PC_DESCONTO, VL_UNITARIO e VL_TOTAL ficam ReadOnly (não editáveis) |
| Ao selecionar item fora de promoção | Campos 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 MNF002 | O bloqueio só é aplicado quando ST_ALTERANOTA não for 'S'/'T' e ST_TABPRECO <> 'V' (chamado 1228) |
| Em MPD020 | Usuário autorizador com ST_AlteraPreco = 'S' (função Habilita_Desconto) consegue liberar a edição mesmo assim |
Simulação passo a passo
- Em MFA001 → Parâmetros → Ambos → Opção 1 → Bloqueia Desconto em Produto Promoção =
Sim. - Salve (F6) e abra um Pedido de Venda em MPD002.
- Cadastre/tenha ativa uma promoção vigente para um determinado item (
RETORNA_PRECOITEMretornaráO_ST_PROMOCAO = '1'). - 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 fazVL_DESCONTO.ReadOnly = True,PC_DESCONTO.ReadOnly = True,VL_UNITARIO.ReadOnly = True,VL_TOTAL.ReadOnly = Truee limpaPC_DESCONTOeVL_DESCONTO(linhas 3324-3328).
- Grava
- Tente digitar desconto manual no item promocional → campo bloqueado.
- Inclua um segundo item, fora de promoção (
ST_PROMOCAO = '0'). Campos de desconto ficam editáveis. - Preencha
PEDIDO.VL_DESCONTO(desconto global do pedido) e confirme. O rateio (UMPD002.paslinhas 5154-5213) exclui o item promocional: o valor é distribuído proporcionalmente apenas entre os itens comST_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 faz | Detalhe |
|---|---|
| Ao selecionar item em promoção | Campos de desconto permanecem editáveis |
| Rateio de desconto do pedido/nota | Item promocional participa normalmente do rateio do desconto global |
O_ST_PROMOCAO do retorno de RETORNA_PRECOITEM | Em MNF002 / MNF017, é forçado para '0' (“limpa” a flag de promoção do item na nota) |
| Em MPD011/UNFORDEM | Ao gerar a NF a partir da ordem, itera os itens e grava ST_PROMOCAO = '0' em cada ITEMNOTA |
| Em MNF019 | Nã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
- Em MFA001 → Bloqueia Desconto em Produto Promoção =
Não. - Salve (F6) e abra um Pedido de Venda em MPD002.
- Inclua um item que esteja em promoção cadastrada.
- Campos
VL_DESCONTO,PC_DESCONTO,VL_UNITARIOeVL_TOTALpermanecem editáveis. - Preencha
PC_DESCONTO = 10no item → valor é aceito. - Informe desconto global
PEDIDO.VL_DESCONTOe o item promocional entra no rateio normalmente. - 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.tabPARMFATURAfterInsertlinha 473 —AsString := 'N').
Regra de interação com outros parâmetros
ST_ALTERANOTA(em MNF002): o bloqueio só é aplicado quandoST_ALTERANOTAnã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_TABPRECOem'V','B'ou'L'(em MPD002): adicionalmente chamaVerificaBloqTabPrecoapós aplicar o bloqueio por promoção (UdmMPD002.pas linhas 3321 / 3353).- Usuário Autorizador com
ST_AlteraPreco = 'S'(em MPD020): emHabilita_Desconto, mesmo comST_BLOQUEIADESCPROM = 'S', o autorizador consegue editar preço/desconto do item promocional.
Tabela Comparativa Resumida
| Opção | Desconto no item promocional? | Rateio global inclui promocional? | O_ST_PROMOCAO gravado no item |
|---|---|---|---|
| S | Não (ReadOnly nos campos) | Não (promocionais excluídos) | '1' (mantém flag da promoção) |
| N | Sim (editável) | Sim | '0' (flag zerada — vira normal) |
Referências no Código Fonte
Tela de configuração (MFA001)
source/MFA001/UMFA001.dfmlinha 3949-3965 —lbl49com caption"Bloqueia Desconto em Produto Promoção".source/MFA001/UMFA001.dfmlinha 4616-4642 —cmbST_BLOQUEIADESCPROM: TwwDBComboBox,DataField = 'ST_BLOQUEIADESCPROM',Items.Strings = (Sim#9S, Não#9N).source/MFA001/UMFA001.paslinha 526 — declaração do componentecmbST_BLOQUEIADESCPROM: TwwDBComboBox.source/MFA001/UdmMFA001.dfmlinhas 125, 1062-1065, 2526, 2733, 3005 — SELECT/INSERT/UPDATE dotabPARMFATURincluindo o campo.source/MFA001/UdmMFA001.paslinha 123 —tabPARMFATURST_BLOQUEIADESCPROM: TStringField.source/MFA001/UdmMFA001.paslinha 473 (blocoAfterInsert) —tabPARMFATURST_BLOQUEIADESCPROM.AsString := 'N';(valor padrão).
Pedido de Venda (MPD002)
source/MPD002/UdmMPD002.paslinha 3313 — aplicaReadOnlyemVL_DESCONTO,PC_DESCONTO,VL_UNITARIO,VL_TOTALquandoST_PROMOCAO = '1'.source/MPD002/UdmMPD002.paslinha 3346 — reativa campos (ReadOnly := False) quando o item não traz promoção.source/MPD002/UdmMPD002.paslinha 3798 — mesmo bloqueio emtabITEMPEDIDOAfterScroll.source/MPD002/UdmMPD002.paslinha 2240 — varre os itens (flagReprocessaDesconto) e reconsultaO_ST_PROMOCAOpara reajustar o bloqueio.source/MPD002/UdmMPD002.paslinha 4367 — emtabITEMPEDIDOPC_DESCONTOValidate, reprocessa desconto respeitando o parâmetro.source/MPD002/UMPD002.paslinhas 4752 / 5155-5213 — rateio do desconto global: quando'S', o somatório de base usa apenas itens comST_PROMOCAO = '0'e o desconto só é aplicado a esses itens.
Pedido Mobile/Rápido (MPD020)
source/MPD020/UdmMPD020.paslinha 240 — variável localiST_BLOQUEIADESCPROM.source/MPD020/UdmMPD020.paslinha 322 e 360 — SELECT emPARMFATURcarrega o parâmetro emiST_BLOQUEIADESCPROM.source/MPD020/UdmMPD020.paslinha 677 — funçãoHabilita_Desconto: se'S'eUserAutorizador.St_AlteraPreco, libera edição mesmo em promoção.source/MPD020/UdmMPD020.paslinhas 1360, 1377, 1745, 1774, 2041, 2937 — blocos que ativam/desativamReadOnlyemVL_UNITARIO/VL_TOTAL/VL_DESCONTO/PC_DESCONTO.source/MPD020/UMPD020.paslinhas 1470, 1824, 1854 — recalcula desconto excluindo promocionais quando'S'.
Geração de NF a partir de Pedido (MPD011)
source/MPD011/UdmMPD011.paslinha 1580 — SELECT dePARMFATURincluindoST_BLOQUEIADESCPROM.source/MPD011/UdmNFORDEM.paslinha 1458 — “chamado 1214”: rateia desconto apenas em itens cujoST_PROMOCAO <> '1'ou quando parâmetro<> 'S'.source/MPD011/UdmNFORDEM.paslinha 3374 / 3543 — aplica/ajustaReadOnlydos campos de desconto naITEMNOTAgerada.source/MPD011/UNFORDEM.paslinha 1845 — quando'N', percorre itens da nota gerada e forçaST_PROMOCAO = '0'.
Nota Fiscal Saída (MNF002)
source/MNF002/UdmMNF002.paslinha 5789 — blocoif parmfatur.values['ST_BLOQUEIADESCPROM'] = 'S' and ST_TABPRECO <> 'V'(chamado 1228): gravaO_ST_PROMOCAOe aplicaReadOnly.source/MNF002/UdmMNF002.paslinha 6698 — mesmo bloco no scroll do item.source/MNF002/UdmMNF002.paslinha 10499 — SELECT emBuscaParametros_MNF002.source/MNF002/UMNF002.paslinhas 6334 / 7190 — no rateio global de desconto, quando'N'forçaO_ST_PROMOCAO = '0'(item passa a participar normalmente do rateio).
Outras telas
source/MNF017/UMNF017.paslinhas 1329, 1946, 2174 — atribuiO_ST_PROMOCAOdoRETORNA_PRECOITEMapenas quando'S'; caso contrário zera ('0').source/MNF019/UdmMNF019.paslinhas 448, 633, 657, 4605 — variáveliST_BLOQUEIADESCPROM; só roda oSELECT O_ST_PROMOCAOquando'S'.source/MNF008/UdmMNF008.paslinha 764 — inclui o campo no SELECT de parâmetros (mesma base deMNF002).source/MCO006/UdmMCO006.paslinha 2108 — inclui o campo no SELECT de parâmetros da cotação.source/MRC020/UdmMRC020NFORDEM.paslinhas 431, 566, 590, 4406, 4873 — carregaiST_BLOQUEIADESCPROMe aplicaReadOnlyemVL_DESCONTO/PC_DESCONTO/VL_UNITARIO/VL_TOTALpara itens promocionais da NF de recapagem.source/CPD009/UdmCPD009.dfmlinhas 321, 385, 474 — SELECT/INSERT/UPDATE de cópia de parâmetros entre empresas.source/RCA006/UdmRCA006.dfm— referência na seleção daPARMFATUR.