Pular para o conteúdo principal

VL_MINIMOPEDIDO - Valor Mínimo para Pedidos

Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / O.S. → Opção 1 (rótulo no formulário: Vl Mínimo para Pedidos) Tabela: PARMFATUR.VL_MINIMOPEDIDO Tipo: Numérico (valor R$) — DOM_NUMERIC15_2 no DDL; TFMTBCDField com Precision=18 / Size=2 no client (DisplayFormat = '#,0.00', EditFormat = '#,0.00') Valor padrão: NULL (não atribuído em AfterInsert de UdmMFA001.pas — equivale a "sem valor mínimo exigido")

Telas impactadas​

MóduloCódigoPapel
Parâmetros de FaturamentoMFA001Produtora — cadastra/edita o valor na aba Pedidos / O.S. → Opção 1
Pedido de VendaMPD002Consumidora direta. No SELECT de BuscaParametros_MPD002 inclui P.VL_MINIMOPEDIDO (posição 30 do array). Também testa parmfatur.values['VL_MINIMOPEDIDO'] <> '' como flag de negócio para exigir Transportadora / Redespachante no fechamento do pedido ("Exclusividade Carlu"). A validação de valor mínimo em si é delegada à procedure VERIFICA_BLOQUEIO.
Comprovante RecapCPD009Lê no dataset de parâmetros (INSERT/UPDATE/SELECT do PARMFATUR)
RecapadoraRCA006Lê no dataset de parâmetros (INSERT/UPDATE/SELECT do PARMFATUR)

Atenção — NÃO confundir com:

  • PARMFATUR.VL_MINPARCELAPEDIDO → valor mínimo por parcela do pedido (rótulo "Valor Mínimo Para Parcela de Pedido", campo distinto, DOM_NUMERIC15_2).

Procedures impactadas​

ProcedurePapel
VERIFICA_BLOQUEIOConsumidora central. Lê COALESCE(VL_MINIMOPEDIDO, 0) da PARMFATUR e, quando o documento é Pedido (I_TP_DOCTO = 'P') novo/pendente (I_ST_PEDIDO = 'N'), compara o valor total do pedido (V_VL_TOTPEDIDO) contra esse mínimo. Se estiver abaixo, acrescenta a flag 'Q' a V_TP_BLOQUEIO e a mensagem ao O_DS_BLOQUEIO.

Campos envolvidos​

CampoTabelaDescrição
VL_MINIMOPEDIDOPARMFATURValor mínimo (R$) aceito para o total líquido de um pedido de venda novo
ST_BLOQUEIOPEDPARMFATURLiga/desliga o bloqueio em pedidos — o bloqueio 'Q' só vira motivo na saída quando V_ST_BLOQUEIO ativa a checagem
ST_LOGINBLOQUEIOPARMFATURQuando 'S', força janela de autorização com login/senha em MPD002 ao detectar qualquer bloqueio (inclusive 'Q')
VL_TOTPEDIDOPEDIDO (via PEDIDO.VL_PEDIDO/soma de itens)Base de comparação — total líquido do pedido lido em VERIFICA_BLOQUEIO

Comportamento / Regra de aplicação​

O parâmetro representa o valor mínimo (em R$) que um pedido de venda precisa atingir para passar livre no fechamento. A lógica está concentrada em VERIFICA_BLOQUEIO (Scripts/VERIFICA_BLOQUEIO.sql), invocada pelo MPD002 (e variantes MPD010, MPD011, MPD020 etc.) no BtnSalvar:

-- Scripts/VERIFICA_BLOQUEIO.sql (linhas 143-152)
SELECT ST_BLOQUEIONF, ST_BLOQUEIOPED, PC_DESCONTOMAX, PC_DESCONTOPED, TP_LIMITECREDITO,
COALESCE(VL_MINIMOPEDIDO,0), PC_MARGEMSEGURANCA, COALESCE(CD_TABCOMPRA,0),
ST_REPROCESSATABPRECO, ST_SEPARABLOQUEIOPED, TP_MODELOBLOQUEIO, TP_BLOQSUBGRUPO,
ST_DEMONSTRAMOTIVOBLOQUEIO, QT_CASASDECIMAISPRECOVENDA
FROM PARMFATUR
WHERE CD_EMPRESA = :I_CD_EMPRESA
INTO :V_ST_BLOQUEIONF, :V_ST_BLOQUEIOPED, :V_PC_DESCONTONF, :V_PC_DESCONTOPED, :V_TP_LIMITECREDITO,
:V_VL_MINIMOPEDIDO, :V_PC_MARGEMSEGURANCA, :V_CD_TABCOMPRA, ...;
-- Scripts/VERIFICA_BLOQUEIO.sql (linhas 1281-1291) — checagem do mínimo
IF ( (I_ST_PEDIDO = 'N') AND (V_VL_MINIMOPEDIDO > 0) AND (I_TP_DOCTO = 'P' )) THEN
BEGIN
IF (V_VL_TOTPEDIDO < V_VL_MINIMOPEDIDO) THEN
BEGIN
V_TP_BLOQUEIO = V_TP_BLOQUEIO||'Q';
O_DS_BLOQUEIO = O_DS_BLOQUEIO ||
'O Valor do Pedido Está Abaixo Do Mínimo Permitido' || ASCII_CHAR(13)||ASCII_CHAR(10)||
'Valor Líquido do Pedido.: ' || REPLACE(V_VL_TOTPEDIDO,'.',',') || '. ' || ASCII_CHAR(13)||ASCII_CHAR(10)||
'Valor Mínimo do Pedido.: ' || REPLACE(V_VL_MINIMOPEDIDO,'.',',') || ASCII_CHAR(13)||ASCII_CHAR(10);
END
END

Guardas: a checagem só roda quando as três condições são verdadeiras — pedido novo/pendente (I_ST_PEDIDO='N'), parâmetro maior que zero (V_VL_MINIMOPEDIDO > 0) e documento do tipo Pedido (I_TP_DOCTO='P'). Notas, orçamentos ('O'), ordens de serviço ('S') e recapagens ('R') não são checados contra este valor.

O MPD002 chama a procedure passando I_TP_DOCTO='P' e I_ST_PEDIDO='N':

// source/MPD002/UMPD002.pas:2755-2759
Consulta :=
'SELECT O_DS_MOTIVO, O_DS_BLOQUEIO, O_TP_BLOQUEIO '+#10+
'FROM VERIFICA_BLOQUEIO ('+Nulo(dmMPD002.tabPEDIDOCD_EMPRESA.AsString, 'I') + ', ' +
Nulo(dmMPD002.tabPEDIDONR_PEDIDO.AsString, 'I') + ', ' +
Nulo(dmMPD002.tabPEDIDOTP_PEDIDO.AsString, 'S') + ', NULL, ''P'', ''N'')';

O fluxo de tratamento do retorno:

// source/MPD002/UMPD002.pas:2761-2793
Resultado := ExecutaConsulta(dmMPD002.transaction, '/*BtnSalvar*/'+Consulta);
iDS_MOTIVO := Resultado[0];
iDS_BLOQUEIO := Resultado[1];

// Se o tipo de bloqueio for Erro
if (Trim(Resultado[2]) = 'E') then
Raise JException.Create('W-0000', ['Atenção.'+#10+ iDS_BLOQUEIO]);

// Mostra a Janela de login e senha do autorizador
if ((Trim(iDS_MOTIVO) <> '') or (v_bloqueaiAutorizacao <> '')) then
begin
if (parmfatur.values['ST_LOGINBLOQUEIO'] = 'S') then
begin
formAutorizacao := TfrmAUTORIZACAO.Create(Application);
...
if (Modal = mrCancel) then
Raise JException.Create('W-0000', ['Confirmação Cancelada!']);
end;
end;

Como 'Q' se comporta: diferente de 'E' (erro), o bloqueio 'Q' não interrompe o salvamento por si só — ele:

  1. Marca o pedido como bloqueado em PEDIDO.ST_PEDIDO (via RETORNA_MOTIVOBLOQUEIO + O_DS_MOTIVO), saindo como "Pendente";
  2. Se PARMFATUR.ST_LOGINBLOQUEIO = 'S', abre a janela "Autorização do Desbloqueio" exigindo login/senha de um usuário autorizador — esse é o bypass por permissão. Cancelar a janela aborta o salvamento.
  3. Se ST_LOGINBLOQUEIO = 'N', o pedido é salvo diretamente como bloqueado/pendente e fica na fila da tela de Liberação de Pedidos (MPD003) para aprovação posterior.

Uso paralelo como flag (MPD002 - Exclusividade Carlu)​

Além da checagem de valor mínimo, o MPD002 reaproveita VL_MINIMOPEDIDO como indicador booleano de perfil — se o campo estiver preenchido (combinado com VL_MINPARCELAPEDIDO preenchido e ST_ALTERAPEDIDO='A'), o sistema exige Transportadora e Redespachante obrigatórios na alteração de pedidos já fechados:

// source/MPD002/UMPD002.pas:2316-2337 — Exclusividade Carlu
if (dmMPD002.tabPEDIDOST_PEDIDO.AsString <> 'N') then
begin
if ((parmfatur.values['ST_ALTERAPEDIDO'] = 'A') and
(parmfatur.values['VL_MINPARCELAPEDIDO'] <> '') and
(parmfatur.values['VL_MINIMOPEDIDO'] <> '') and
(dmMPD002.tabPEDIDOCD_TRANSPORTADOR.AsString = '')) then
begin
frmMPD002.Paginas.ActivePage := frmMPD002.pagDADOS;
frmMPD002.edtCD_TRANSPORTADOR.SetFocus;
Raise JException.Create('W-0000', ['É Obrigatório informar uma Transportadora!']);
end;

if ((parmfatur.values['ST_ALTERAPEDIDO'] = 'A') and
(parmfatur.values['VL_MINPARCELAPEDIDO'] <> '') and
(parmfatur.values['VL_MINIMOPEDIDO'] <> '') and
(dmMPD002.tabPEDIDOCD_REDESPACHO.AsString = '')) then
begin
frmMPD002.Paginas.ActivePage := frmMPD002.pagDADOS;
frmMPD002.edtCD_REDESPACHO.SetFocus;
Raise JException.Create('W-0000', ['É Obrigatório informar um Redespachante!']);
end;
end;

Efeito colateral: se a empresa não precisa da regra de valor mínimo mas quiser desligar a exigência de transportadora/redespachante, o campo deve ficar vazio (NULL) — gravar 0,00 também quebra a guarda <> '' usada no código Delphi, mas desliga a checagem no VERIFICA_BLOQUEIO (que exige > 0). A semântica de "vazio vs. zero" difere entre os dois pontos de código.

Valor = NULL (padrão ao criar o registro no MFA001)​

AspectoComportamento
Precisa estar preenchido?Não — é o estado inicial (o AfterInsert de UdmMFA001.pas não atribui valor)
Bloqueio em VERIFICA_BLOQUEIONão ocorre. COALESCE(VL_MINIMOPEDIDO, 0) vira 0, a guarda V_VL_MINIMOPEDIDO > 0 falha e o ramo é pulado
Exigência de Transportadora/Redespachante (MPD002)Desligada — o parmfatur.values['VL_MINIMOPEDIDO'] <> '' retorna False
Validação no próprio MFA001Não existe OnValidate para este campo em UdmMFA001.pas — a proteção vem apenas do tipo NUMERIC(15,2) do Firebird

Resultado esperado: o pedido pode ter qualquer valor (inclusive R$ 0,00) que o sistema aceita sem bloqueio por mínimo.

Valor = 0,00​

AspectoComportamento
Bloqueio em VERIFICA_BLOQUEIONão ocorre — a guarda V_VL_MINIMOPEDIDO > 0 é falsa
Exigência de Transportadora/Redespachante (MPD002)Ativa (!) — parmfatur.values['VL_MINIMOPEDIDO'] <> '' retorna True (a string é '0,00'), disparando a regra "Exclusividade Carlu" se combinada com VL_MINPARCELAPEDIDO e ST_ALTERAPEDIDO='A'
Equivalência prática com NULLDiferente — gravar 0,00 explicitamente desliga o bloqueio mas mantém a flag da regra Carlu acesa

Resultado esperado: 0,00 funciona como "desligar bloqueio de mínimo, mas manter o sinalizador de perfil Carlu".

Valor > 0 (ex.: 100,00)​

AspectoComportamento
Pedido com total ≥ valorPassa sem bloqueio por mínimo
Pedido com total < valorBloqueio tipo 'Q' com mensagem "O Valor do Pedido Está Abaixo Do Mínimo Permitido\nValor Líquido do Pedido.: X.\nValor Mínimo do Pedido.: Y"
BypassVia tela de Autorização do Desbloqueio quando ST_LOGINBLOQUEIO='S', ou via liberação posterior em MPD003
EscopoApenas pedidos de venda (TP_DOCTO='P') novos (ST_PEDIDO='N') — nota, orçamento, OS, recapagem não validam

Simulação passo a passo​

  1. MFA001 → aba Parâmetros → Pedidos / O.S. → Opção 1 → campo Vl Mínimo para Pedidos = 100,00.
  2. Salve os parâmetros (F6).
  3. Emita um pedido novo em MPD002:
    • Caso A: Total do pedido = R$ 50,00 → ao salvar, VERIFICA_BLOQUEIO retorna O_TP_BLOQUEIO contendo 'Q' e O_DS_BLOQUEIO com a mensagem do mínimo.
      • Se ST_LOGINBLOQUEIO='S' → abre "Autorização do Desbloqueio". Autorizador aprova → pedido salva como liberado. Cancelar → erro "Confirmação Cancelada!" aborta o save.
      • Se ST_LOGINBLOQUEIO='N' → pedido salva diretamente com ST_PEDIDO de bloqueio, indo para a fila do MPD003.
    • Caso B: Total do pedido = R$ 100,00 → V_VL_TOTPEDIDO < V_VL_MINIMOPEDIDO é 100 < 100 (falso) → salva normalmente.
    • Caso C: Total do pedido = R$ 250,00 → salva normalmente.
  4. Altere o pedido já gravado (ST_PEDIDO <> 'N') com ST_ALTERAPEDIDO='A' e VL_MINPARCELAPEDIDO também preenchido:
    • Se CD_TRANSPORTADOR estiver em branco → erro "É Obrigatório informar uma Transportadora!" (regra Carlu).
    • Se CD_REDESPACHO estiver em branco → erro "É Obrigatório informar um Redespachante!".

Resultado esperado: pedidos de venda novos precisam totalizar, no mínimo, R$ 100,00; abaixo disso o sistema registra bloqueio 'Q' que exige autorização (ou liberação posterior). Notas/orçamentos/OS ignoram este parâmetro.


Interação com outros parâmetros​

ParâmetroEfeito combinado
PARMFATUR.ST_LOGINBLOQUEIOQuando 'S', força janela "Autorização do Desbloqueio" em MPD002 sempre que houver qualquer O_DS_MOTIVO — inclusive bloqueio 'Q' deste parâmetro. Em 'N', pedido salva pendente para MPD003.
PARMFATUR.ST_BLOQUEIOPEDControla o comportamento geral de bloqueios em pedido. A flag 'Q' é sempre anexada a V_TP_BLOQUEIO, mas o RETORNA_MOTIVOBLOQUEIO usa V_ST_BLOQUEIO (derivado de ST_BLOQUEIOPED) para decidir a mensagem final retornada.
PARMFATUR.ST_ALTERAPEDIDO + PARMFATUR.VL_MINPARCELAPEDIDOCombinação com efeito colateral. Quando os três campos estão preenchidos (ST_ALTERAPEDIDO='A', VL_MINPARCELAPEDIDO<>'', VL_MINIMOPEDIDO<>''), ativa a regra "Exclusividade Carlu" em MPD002 exigindo Transportadora e Redespachante na alteração.
PARMFATUR.ST_SEPARABLOQUEIOPED / ST_DEMONSTRAMOTIVOBLOQUEIOPassadas para RETORNA_MOTIVOBLOQUEIO determinam se a mensagem de bloqueio é exibida detalhada ou resumida ao usuário.
Sem OnValidate no MFA001Não há rejeição de valores negativos — o tipo DOM_NUMERIC15_2 (precisão 15, escala 2) no Firebird aceita valores de -9.999.999.999.999,99 a 9.999.999.999.999,99. Valores negativos são aceitos na tela mas nunca disparam o bloqueio (guarda > 0).

Referências no Código Fonte​

Delphi​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm7887-7900, 8562-8578Label lblVL_MINIMOPEDIDO: TLabel com Caption = 'Vl Mínimo para Pedidos' (pai: aba Pedidos/O.S. Opção 1) e TDBEdit edtVL_MINIMOPEDIDO (DataField=VL_MINIMOPEDIDO, DataSource=dmMFA001.dsPARMFATUR)
source/MFA001/UMFA001.pas278, 309Declarações de lblVL_MINIMOPEDIDO: TLabel e edtVL_MINIMOPEDIDO: TDBEdit
source/MFA001/UdmMFA001.dfm131, 1080-1090, 2374, 2531, 2742, 3011Field TFMTBCDField (Precision=18, Size=2, DisplayFormat='#,0.00') e cláusulas SELECT/INSERT/UPDATE do PARMFATUR incluindo VL_MINIMOPEDIDO
source/MFA001/UdmMFA001.pas127Declaração de tabPARMFATURVL_MINIMOPEDIDO: TFMTBCDField. Nenhum OnValidate nem atribuição de padrão em AfterInsert (o procedure termina por volta da linha 514 sem tocar o campo).
source/MPD002/UdmMPD002.pas5742BuscaParametros_MPD002 inclui P.VL_MINIMOPEDIDO no SELECT (posição 30 do array de resultados)
source/MPD002/UMPD002.pas2320, 2330Regra "Exclusividade Carlu" — testa parmfatur.values['VL_MINIMOPEDIDO'] <> '' para exigir Transportadora e Redespachante em alterações de pedido
source/MPD002/UMPD002.pas2755-2793, 3141-...Chamada a VERIFICA_BLOQUEIO(..., 'P', 'N') no BtnSalvar e tratamento do retorno ('E' → Raise; motivo preenchido + ST_LOGINBLOQUEIO='S' → janela de autorização)
source/CPD009/UdmCPD009.dfm324, 388, 486, 589Leitura no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR)
source/RCA006/UdmRCA006.dfm3073, 3137, 3235, 3338Leitura no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR)

SQL (Firebird)​

ArquivoLinhasPapel
Scripts/VERIFICA_BLOQUEIO.sql60, 143-152, 1281-1291Procedure central. Declara V_VL_MINIMOPEDIDO DOM_NUMERIC15_2, lê via COALESCE(VL_MINIMOPEDIDO, 0) junto com os demais parâmetros e aplica a comparação V_VL_TOTPEDIDO < V_VL_MINIMOPEDIDO quando I_ST_PEDIDO='N' AND I_TP_DOCTO='P'. Ao violar, marca `V_TP_BLOQUEIO = V_TP_BLOQUEIO
docs/schema/tables/PARMFATUR.sql87DDL: VL_MINIMOPEDIDO DOM_NUMERIC15_2 (sem default, sem NOT NULL)