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_MINIMOPEDIDOTipo: Numérico (valor R$) —DOM_NUMERIC15_2no DDL;TFMTBCDFieldcomPrecision=18 / Size=2no client (DisplayFormat = '#,0.00',EditFormat = '#,0.00') Valor padrão:NULL(não atribuído emAfterInsertdeUdmMFA001.pas— equivale a "sem valor mínimo exigido")
Telas impactadas
| Módulo | Código | Papel |
|---|---|---|
| Parâmetros de Faturamento | MFA001 | Produtora — cadastra/edita o valor na aba Pedidos / O.S. → Opção 1 |
| Pedido de Venda | MPD002 | Consumidora 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 Recap | CPD009 | Lê no dataset de parâmetros (INSERT/UPDATE/SELECT do PARMFATUR) |
| Recapadora | RCA006 | Lê 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
| Procedure | Papel |
|---|---|
VERIFICA_BLOQUEIO | Consumidora 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
| Campo | Tabela | Descrição |
|---|---|---|
VL_MINIMOPEDIDO | PARMFATUR | Valor mínimo (R$) aceito para o total líquido de um pedido de venda novo |
ST_BLOQUEIOPED | PARMFATUR | Liga/desliga o bloqueio em pedidos — o bloqueio 'Q' só vira motivo na saída quando V_ST_BLOQUEIO ativa a checagem |
ST_LOGINBLOQUEIO | PARMFATUR | Quando 'S', força janela de autorização com login/senha em MPD002 ao detectar qualquer bloqueio (inclusive 'Q') |
VL_TOTPEDIDO | PEDIDO (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:
- Marca o pedido como bloqueado em
PEDIDO.ST_PEDIDO(viaRETORNA_MOTIVOBLOQUEIO+O_DS_MOTIVO), saindo como "Pendente";- 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.- 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,00também quebra a guarda<> ''usada no código Delphi, mas desliga a checagem noVERIFICA_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)
| Aspecto | Comportamento |
|---|---|
| Precisa estar preenchido? | Não — é o estado inicial (o AfterInsert de UdmMFA001.pas não atribui valor) |
Bloqueio em VERIFICA_BLOQUEIO | Nã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 MFA001 | Nã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
| Aspecto | Comportamento |
|---|---|
Bloqueio em VERIFICA_BLOQUEIO | Nã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 NULL | Diferente — 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)
| Aspecto | Comportamento |
|---|---|
| Pedido com total ≥ valor | Passa sem bloqueio por mínimo |
| Pedido com total < valor | Bloqueio 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" |
| Bypass | Via tela de Autorização do Desbloqueio quando ST_LOGINBLOQUEIO='S', ou via liberação posterior em MPD003 |
| Escopo | Apenas pedidos de venda (TP_DOCTO='P') novos (ST_PEDIDO='N') — nota, orçamento, OS, recapagem não validam |
Simulação passo a passo
- MFA001 → aba Parâmetros → Pedidos / O.S. → Opção 1 → campo Vl Mínimo para Pedidos =
100,00. - Salve os parâmetros (F6).
- Emita um pedido novo em MPD002:
- Caso A: Total do pedido = R$ 50,00 → ao salvar,
VERIFICA_BLOQUEIOretornaO_TP_BLOQUEIOcontendo'Q'eO_DS_BLOQUEIOcom 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 comST_PEDIDOde bloqueio, indo para a fila do MPD003.
- Se
- 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.
- Caso A: Total do pedido = R$ 50,00 → ao salvar,
- Altere o pedido já gravado (
ST_PEDIDO <> 'N') comST_ALTERAPEDIDO='A'eVL_MINPARCELAPEDIDOtambém preenchido:- Se
CD_TRANSPORTADORestiver em branco → erro "É Obrigatório informar uma Transportadora!" (regra Carlu). - Se
CD_REDESPACHOestiver em branco → erro "É Obrigatório informar um Redespachante!".
- Se
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âmetro | Efeito combinado |
|---|---|
PARMFATUR.ST_LOGINBLOQUEIO | Quando '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_BLOQUEIOPED | Controla 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_MINPARCELAPEDIDO | Combinaçã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_DEMONSTRAMOTIVOBLOQUEIO | Passadas para RETORNA_MOTIVOBLOQUEIO determinam se a mensagem de bloqueio é exibida detalhada ou resumida ao usuário. |
Sem OnValidate no MFA001 | Nã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
| Arquivo | Linhas | Papel |
|---|---|---|
source/MFA001/UMFA001.dfm | 7887-7900, 8562-8578 | Label 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.pas | 278, 309 | Declarações de lblVL_MINIMOPEDIDO: TLabel e edtVL_MINIMOPEDIDO: TDBEdit |
source/MFA001/UdmMFA001.dfm | 131, 1080-1090, 2374, 2531, 2742, 3011 | Field TFMTBCDField (Precision=18, Size=2, DisplayFormat='#,0.00') e cláusulas SELECT/INSERT/UPDATE do PARMFATUR incluindo VL_MINIMOPEDIDO |
source/MFA001/UdmMFA001.pas | 127 | Declaraçã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.pas | 5742 | BuscaParametros_MPD002 inclui P.VL_MINIMOPEDIDO no SELECT (posição 30 do array de resultados) |
source/MPD002/UMPD002.pas | 2320, 2330 | Regra "Exclusividade Carlu" — testa parmfatur.values['VL_MINIMOPEDIDO'] <> '' para exigir Transportadora e Redespachante em alterações de pedido |
source/MPD002/UMPD002.pas | 2755-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.dfm | 324, 388, 486, 589 | Leitura no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR) |
source/RCA006/UdmRCA006.dfm | 3073, 3137, 3235, 3338 | Leitura no dataset de parâmetros (INSERT/UPDATE/SELECT de PARMFATUR) |
SQL (Firebird)
| Arquivo | Linhas | Papel |
|---|---|---|
Scripts/VERIFICA_BLOQUEIO.sql | 60, 143-152, 1281-1291 | Procedure 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.sql | 87 | DDL: VL_MINIMOPEDIDO DOM_NUMERIC15_2 (sem default, sem NOT NULL) |