Parâmetro de Validação de Bloqueio na Nota quando o Pedido já foi Liberado
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas (combo
cmbST_BLOQNOTAPEDJABLOQ-UMFA001.dfmlinha 7304) Caption: "Valida Bloq. Nota com Pedido já Liberado" Tabela:PARMFATUR.ST_BLOQNOTAPEDJABLOQValor padrão:S(Sim - reavaliar bloqueios na nota) - definido emUdmMFA001.paslinha 530 (AfterInsert)
Controla se, ao gerar a Nota Fiscal a partir de um Pedido que já passou pelas regras de bloqueio (e eventualmente foi liberado por autorizador), o sistema deve reavaliar todas as regras de bloqueio (crédito, duplicatas em atraso, preço mínimo, desconto máximo, etc.) na NF, ou confiar na análise já feita no pedido e pular essas validações.
Tecnicamente, este parâmetro decide o valor da flag iPedidoBloqueado que é enviada como 6º parâmetro (I_ST_PEDIDO) para a procedure VERIFICA_BLOQUEIO. Quando I_ST_PEDIDO = 'S', a procedure ignora a maioria dos blocos IF ( I_ST_PEDIDO = 'N' AND ... ) dentro dela, evitando duplicação de análise sobre o mesmo negócio.
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Tela de configuração (combo principal, campo persistente e CRUD SQL) |
| Nota Fiscal Saída | MNF002 | Faturamento de NF a partir de pedido: lê ST_BLOQNOTAPEDJABLOQ em UMNF002.pas linhas 2365 e 2844 e usa iPedidoBloqueado em VERIFICA_BLOQUEIO (linha 3655) |
| Conhecimento de Transporte (CT-e) | MNF008 | Lê ST_BLOQNOTAPEDJABLOQ no SELECT da PARMFATUR em UdmMNF008.pas linha 769 |
| NF Ordem (Pedidos) | MPD011 | Leitura em UdmMPD011.pas linha 1582; uso em UdmNFORDEM.pas linhas 755-758 e UNFORDEM.pas linhas 776, 787 |
| NF Ordem (Recapadora) | MRC020 | Uso em UdmMRC020NFORDEM.pas linhas 1174-1177 e UMRC020NFORDEM.pas linha 915 |
| NF Pré-Emitida (Coleta) | MCO006 | Leitura no SELECT da PARMFATUR em UdmMCO006.pas linha 2113 |
Procedures impactadas
| Procedure | Arquivo | Descrição |
|---|---|---|
VERIFICA_BLOQUEIO | Scripts/VERIFICA_BLOQUEIO.sql | Procedure central que decide se a NF/pedido deve ser bloqueado. O 6º parâmetro I_ST_PEDIDO recebe o valor de iPedidoBloqueado calculado a partir de ST_BLOQNOTAPEDJABLOQ. Quando I_ST_PEDIDO='S', a procedure pula as validações de crédito (linha 818), desconto máximo por pessoa (linha 964), desconto por usuário (linha 979), desconto por subgrupo (linha 992), preço mínimo/desconto do produto (linhas 1019, 1052, 1065, 1078), tabela do vendedor (linha 1111), desconto por faixa de média (linha 1140), preço mínimo/máximo (linha 1173), desconto máximo da condição de pagamento (linha 1222) e valor mínimo do pedido (linha 1281). |
Campos envolvidos
| Campo | Descrição |
|---|---|
PARMFATUR.ST_BLOQNOTAPEDJABLOQ | S = sempre revalidar bloqueios na nota; N = não revalidar se o pedido já estava bloqueado/liberado |
PEDIDO.DS_BLOQUEIO | Lido via tabPEDIDODS_BLOQUEIO / tabNFORDEM.DS_BLOQUEIO — se contiver texto, o pedido já passou por análise de bloqueio; combinado com ST_BLOQNOTAPEDJABLOQ='N' ativa o "pular validação" |
iPedidoBloqueado (variável Delphi) | Flag transportada para VERIFICA_BLOQUEIO no 6º parâmetro (I_ST_PEDIDO). Inicializada em 'N' e só sobe para 'S' quando o pedido tem bloqueio registrado E ST_BLOQNOTAPEDJABLOQ='N' |
VERIFICA_BLOQUEIO.I_ST_PEDIDO | 6º parâmetro da procedure que recebe iPedidoBloqueado; seu valor liga/desliga blocos inteiros de validação |
Opções disponíveis
S - Sim (reavaliar bloqueios na nota - padrão)
| O que faz | Detalhe |
|---|---|
iPedidoBloqueado | Permanece em 'N' (valor inicial) |
VERIFICA_BLOQUEIO.I_ST_PEDIDO | Recebe 'N' → procedure executa todas as validações (crédito, duplicatas, desconto máximo, preço mínimo, tabela de preço, vendedor, faixa de média, valor mínimo do pedido, condição de pagamento) |
| Pedidos já liberados manualmente | Mesmo que tenham DS_BLOQUEIO preenchido, a NF volta a aplicar todas as regras — podendo bloquear a nota novamente |
| Uso recomendado | Controle fiscal rigoroso: validações precisam ser sempre atuais (ex.: condições de crédito mudam entre pedido e faturamento) |
Simulação passo a passo
- MFA001 → "Valida Bloq. Nota com Pedido já Liberado" = Sim
- Salve os parâmetros (F6)
- Em MPD002 cadastre um Pedido que excede o limite de crédito do cliente → campo
PEDIDO.DS_BLOQUEIOrecebe a descrição do bloqueio - Libere o pedido via autorizador (o texto em
DS_BLOQUEIOpermanece como histórico, mas o pedido ficaST_BLOQUEIO <> 'S') - Em MNF002 fature este pedido
- Durante a geração da NF, o código executa:
if ((Trim(VProduto[K].Ds_Bloqueio) <> '') and (ParmFatur.Values['ST_BLOQNOTAPEDJABLOQ'] = 'N'))→ falso (parâmetro é'S'), entãoiPedidoBloqueadofica'N' - Ao chamar
VERIFICA_BLOQUEIO(..., 'N', 'N'), a procedure percorre novamente todos os blocos de validação
Resultado esperado: Se o cliente continuar acima do limite de crédito, a NF também é bloqueada e exige nova liberação. O valor de DS_BLOQUEIO pode ser preenchido com novo motivo, exigindo autorizador novamente (via ST_LOGINBLOQUEIO em MNF002 linha 3666).
N - Não (confiar na análise do pedido)
| O que faz | Detalhe |
|---|---|
Quando PEDIDO.DS_BLOQUEIO tem texto | iPedidoBloqueado é setado para 'S' (UMNF002.pas:2366, UMNF002.pas:2845, UdmNFORDEM.pas:756, UdmMRC020NFORDEM.pas:1175) |
VERIFICA_BLOQUEIO.I_ST_PEDIDO | Recebe 'S' → procedure pula 12+ blocos de validação (IF (I_ST_PEDIDO = 'N' ...)): crédito/limite, desconto máximo (pessoa/usuário/subgrupo), preço mínimo/máximo do produto, tabela do vendedor, desconto por faixa de média, condição de pagamento, valor mínimo do pedido |
| Fluxo adicional em MPD011 | UNFORDEM.pas linha 776: if (dmNFORDEM.iPedidoBloqueado = 'N') decide se chama Verifica_CreditoTabela antes do VERIFICA_BLOQUEIO — quando iPedidoBloqueado='S', a verificação de crédito também é pulada |
| Uso recomendado | Pedido passou por autorizador e foi liberado conscientemente — não faz sentido reaplicar as mesmas regras no momento da NF, evitando pedir autorização duas vezes para o mesmo negócio |
Simulação passo a passo
- MFA001 → "Valida Bloq. Nota com Pedido já Liberado" = Não
- Salve os parâmetros (F6)
- Em MPD002 cadastre um Pedido com desconto acima do máximo permitido →
DS_BLOQUEIOrecebe "Desconto acima do permitido..." eTP_BLOQUEIOpreenchido - Libere o pedido via autorizador em MNF017 (o campo
DS_BLOQUEIOpermanece preenchido como histórico do bloqueio já tratado) - Em MNF002 fature este pedido
- Durante a geração da NF, o código executa:
if ((Trim(VProduto[K].Ds_Bloqueio) <> '') and (ParmFatur.Values['ST_BLOQNOTAPEDJABLOQ'] = 'N'))→ verdadeiro →iPedidoBloqueado := 'S' - Ao chamar
VERIFICA_BLOQUEIO(..., 'N', 'S'), a procedure retorna sem reavaliar as regras de desconto/crédito; apenas as validações que não têm a condiçãoI_ST_PEDIDO='N'permanecem ativas (ex.:VERIFICA_BLOQUEIOSUBGRUPO, bloqueios administrativos independentes)
Resultado esperado: A NF não pergunta autorizador novamente pelo mesmo motivo já liberado no pedido. O usuário salva a nota sem redundância de aprovação.
Interação com outros parâmetros
ST_PEDVENDA: define como o pedido é integrado à NF (bruto, líquido por imposto, etc.) —ST_BLOQNOTAPEDJABLOQopera sobre o fluxo iniciado porST_PEDVENDA <> 'N', ou seja, só tem efeito quando há integração Pedido → NF. SeST_PEDVENDA='N', não há pedido de origem para herdar/reavaliar bloqueio. Veja ST_PEDVENDA.ST_BLOQUEIOPED: define quais regras de bloqueio aplicar no pedido (C, V, X, Y, A, F, etc.).ST_BLOQNOTAPEDJABLOQage no momento seguinte: decide se essas mesmas regras voltam a rodar quando a NF é gerada. Veja ST_BLOQUEIOPED.ST_LOGINBLOQUEIO: quando a NF acaba sendo bloqueada (porqueST_BLOQNOTAPEDJABLOQ='S'reexecutou as regras),ST_LOGINBLOQUEIO='S'força abertura da telaTfrmAUTORIZACAOem MNF002 linha 3666, exigindo login de autorizador para continuar.ST_ALTERAPEDIDOBLOQeST_SEPARABLOQUEIOPED: também afetam o fluxo de bloqueio mas operam no pedido (não interagem diretamente aqui).
Tabela Comparativa Resumida
| Opção | Descrição | iPedidoBloqueado enviado | VERIFICA_BLOQUEIO revalida regras na NF? | Pedido liberado exige nova autorização na NF? |
|---|---|---|---|---|
| S | Sim (reavaliar) — padrão | 'N' | Sim — executa todos os blocos IF (I_ST_PEDIDO='N') | Sim, se as condições ainda indicarem bloqueio |
| N | Não (confiar no pedido) | 'S' (quando DS_BLOQUEIO preenchido) | Não — pula os blocos de crédito/desconto/preço/tabela | Não — aproveita a liberação já feita no pedido |
Referências no Código Fonte
| Arquivo | Linhas | Função |
|---|---|---|
source/MFA001/UMFA001.dfm | 6355-6369, 7304-7330 | Label "Valida Bloq. Nota com Pedido já Liberado" e TwwDBComboBox cmbST_BLOQNOTAPEDJABLOQ com Items.Strings = ('Sim'#9'S' / 'Não'#9'N') |
source/MFA001/UdmMFA001.pas | 227, 530 | Declaração do campo persistente e default 'S' no AfterInsert |
source/MFA001/UdmMFA001.dfm | 242, 1654-1659, 2414, 2584, 2822, 3122 | Campo no SELECT, TStringField, INSERT INTO PARMFATUR, UPDATE PARMFATUR |
source/MFA001/UMFA001.pas | 405 | Declaração do ComboBox (cmbST_BLOQNOTAPEDJABLOQ: TwwDBComboBox) |
source/MNF002/UMNF002.pas | 2364-2366 | Bloco que seta dmMNF002.iPedidoBloqueado := 'S' em CarregaPedido (array) quando Ds_Bloqueio preenchido e ST_BLOQNOTAPEDJABLOQ='N' |
source/MNF002/UMNF002.pas | 2843-2845 | Mesmo bloco em outro caminho de integração (leitura via tabPEDIDODS_BLOQUEIO) |
source/MNF002/UMNF002.pas | 3647-3655 | Chamada de VERIFICA_BLOQUEIO passando iPedidoBloqueado no 6º parâmetro |
source/MNF002/UdmMNF002.pas | 833, 3637 | Declaração e inicialização iPedidoBloqueado := 'N' |
source/MNF002/UdmMNF002.pas | 10504 | SELECT ST_BLOQNOTAPEDJABLOQ da PARMFATUR |
source/MNF008/UdmMNF008.pas | 769 | SELECT ST_BLOQNOTAPEDJABLOQ da PARMFATUR (CT-e) |
source/MPD011/UdmMPD011.pas | 1582 | SELECT ST_BLOQNOTAPEDJABLOQ (ordem de carregamento) |
source/MPD011/UdmNFORDEM.pas | 331, 754-758 | Declaração de iPedidoBloqueado e decisão 'S'/'N' com base em ST_BLOQNOTAPEDJABLOQ e NFORDEM.DS_BLOQUEIO |
source/MPD011/UdmNFORDEM.pas | 2574 | Inicialização iPedidoBloqueado := 'N' |
source/MPD011/UNFORDEM.pas | 776, 787 | Skip de Verifica_CreditoTabela quando iPedidoBloqueado<>'N'; passagem no 6º parâmetro de VERIFICA_BLOQUEIO |
source/MRC020/UdmMRC020NFORDEM.pas | 440, 1173-1177, 2959 | Declaração, decisão e reinicialização de iPedidoBloqueado |
source/MRC020/UMRC020NFORDEM.pas | 915 | Chamada de VERIFICA_BLOQUEIO com iPedidoBloqueado |
source/MCO006/UdmMCO006.pas | 2113 | SELECT ST_BLOQNOTAPEDJABLOQ da PARMFATUR (pré-emissão) |
Scripts/VERIFICA_BLOQUEIO.sql | 9 | 6º parâmetro I_ST_PEDIDO varchar(1) — recebe o valor de iPedidoBloqueado |
Scripts/VERIFICA_BLOQUEIO.sql | 177, 818, 964, 979, 992, 1019, 1052, 1065, 1078, 1111, 1140, 1173, 1222, 1281 | Blocos condicionais IF (I_ST_PEDIDO = 'N' ...) que são pulados quando o pedido já estava bloqueado e ST_BLOQNOTAPEDJABLOQ='N' |