Pular para o conteúdo principal

Modo de Bloqueio do Pedido (permitir várias vezes ou só uma vez)

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Aba Pedidos / O.S. → sub-aba Opção 1 → GroupBox "Parâmetros de Pedidos/Ordem de Serviço" → label "Bloqueio de Pedido" (combo wwDBComboBox8 - UMFA001.dfm linha 8746; label Label26 linha 7985) Tabela: PARMFATUR.TP_BLOQVARIASVEZESPED (DOM_CHAR1) Valor padrão: S (Normal - bloqueia o pedido sempre que as regras forem violadas, mesmo após já ter sido desbloqueado) - definido em UdmMFA001.pas linha 509 (AfterInsert)

Controla o comportamento do bloqueio automático quando um Pedido é re-validado: define se um pedido que já foi desbloqueado (PEDIDO.DT_DESBLOQUEIO preenchida) pode voltar a ser bloqueado pelas regras normais de ST_BLOQUEIOPED / VERIFICA_BLOQUEIO (opção S - Normal) ou se, uma vez desbloqueado, não deve mais ser bloqueado outra vez (opção N - Bloquear Somente Uma Vez).

É um parâmetro complementar de ST_BLOQUEIOPED: ST_BLOQUEIOPED decide por que bloqueia; este decide quantas vezes o mesmo pedido pode ser bloqueado ao longo da sua vida.

Telas impactadas​

MóduloCódigoDescrição
Parâmetros FaturamentoMFA001Tela de configuração (combo wwDBComboBox8 - UMFA001.dfm linhas 8746-8772)
Pedido de VendaMPD002Lógica de rebloqueio em UMPD002.pas linhas 2737, 2744 (decide se seta BloquearPedido := True quando o pedido já tem DT_DESBLOQUEIO ou DS_BLOQUEIO); leitura do parâmetro via ParmFatur.values['TP_BLOQVARIASVEZESPED']; SELECT inclui o campo em UdmMPD002.pas linha 5754
Validação de Pedidos em LoteMPD010Botão "Validar Pedidos" em duas variantes do formulário: aba Pedidos (UMPD010.pas linhas 1400, 1410, 1416, 1448) e aba Pedidos/Produtos (linhas 1499, 1509, 1515, 1547). Se TP_BLOQVARIASVEZESPED = 'N' e o pedido já tem DT_DESBLOQUEIO, esse pedido vai para a lista iNR_PEDIDOSBLO (não re-bloqueados). Senão, bloqueia novamente

Procedures impactadas​

Nenhuma procedure SQL usa este parâmetro. A regra é aplicada 100% no código Delphi (regra de UI/aplicação). A VERIFICA_BLOQUEIO continua retornando os motivos de bloqueio normalmente; quem decide gravar/ignorar o rebloqueio é a aplicação.

Campos envolvidos​

CampoTabelaDescrição
TP_BLOQVARIASVEZESPEDPARMFATURO parâmetro em si (S = Normal; N = Bloquear Somente Uma Vez). DOM_CHAR1
ST_BLOQUEIOPEDPARMFATURPré-requisito: só é consultado pelo MPD010 quando ST_BLOQUEIOPED <> 'N' (UMPD010.pas linhas 1420, 1519). Se ST_BLOQUEIOPED='N', o lote nem executa
PEDIDO.DS_BLOQUEIOPEDIDOMotivo atual do bloqueio. Quando vazio e TP_BLOQVARIASVEZESPED='S' + DT_DESBLOQUEIO preenchida → tenta rebloquear (UMPD002.pas linhas 2736-2739)
PEDIDO.DT_DESBLOQUEIOPEDIDOData em que o pedido foi liberado. É a "chave" da decisão: se preenchida e TP_BLOQVARIASVEZESPED='N' → pedido não é rebloqueado
PEDIDO.ST_PEDIDOPEDIDOEm MPD010, é atualizado para 'B' quando o pedido é rebloqueado (UMPD010.pas linha 1455)

Opções disponíveis​

S - Normal (padrão)​

O que fazDetalhe
ComportamentoPermite que o mesmo pedido seja bloqueado várias vezes ao longo da sua vida
Em MPD002 (UMPD002.pas linhas 2736-2744)Seta BloquearPedido := True em 2 cenários: (1) quando DS_BLOQUEIO está vazio OU o pedido já teve DT_DESBLOQUEIO; (2) quando DS_BLOQUEIO já está preenchido e o parâmetro é 'S' (reforça o bloqueio ao salvar)
Em MPD010 (UMPD010.pas linhas 1448, 1547)Mesmo que o pedido tenha DT_DESBLOQUEIO, o botão "Validar Pedidos" vai rebloqueá-lo se a VERIFICA_BLOQUEIO retornar motivo. A condição iTP_BLOQVARIASVEZESPED = 'N' não é satisfeita → cai no else que re-executa o UPDATE com ST_PEDIDO='B'
Quando usarCenário padrão - a empresa quer que o pedido reflita sempre a situação atual do cliente. Se o cliente voltou a ter atraso depois de liberado, o pedido trava de novo
É o valor padrão?Sim (UdmMFA001.pas linha 509)

Simulação passo a passo​

  1. MFA001 → Pedidos/O.S. → Opção 1 → "Bloqueio de Pedido" (combo TP_BLOQVARIASVEZESPED) = Normal
  2. Configure ST_BLOQUEIOPED = "Limite de Crédito" (combo ao lado)
  3. Salve (F6)
  4. Cliente com limite R$ 1.000,00; crie Pedido (MPD002) de R$ 1.500,00 → pedido bloqueia (motivo: limite)
  5. Supervisor libera o pedido manualmente (preenche DT_DESBLOQUEIO, DS_BLOQUEIO limpo)
  6. Usuário retorna ao mesmo pedido, edita (altera item qualquer) e pressiona "Salvar" → em BtnSalvarClick (linhas 2736-2744): como DS_BLOQUEIO='' e DT_DESBLOQUEIO<>'' e TP_BLOQVARIASVEZESPED='S' → BloquearPedido:=True → pedido volta a ficar bloqueado se o limite ainda estiver estourado
  7. Alternativamente, rodar MPD010 "Validar Pedidos" → percorre pedidos com STATUS='Å', executa VERIFICA_BLOQUEIO; para cada pedido já desbloqueado com motivo atual, cai no else da linha 1448/1547 → UPDATE PEDIDO SET DS_BLOQUEIO=..., ST_PEDIDO='B'

Resultado esperado: pedidos podem ser bloqueados repetidamente. A liberação anterior não imuniza o pedido contra novo bloqueio. Esse é o comportamento-padrão do sistema.


N - Bloquear Somente Uma Vez​

O que fazDetalhe
ComportamentoUma vez que o pedido foi liberado (DT_DESBLOQUEIO preenchida), ele não é mais bloqueado automaticamente, mesmo que as regras de ST_BLOQUEIOPED / VERIFICA_BLOQUEIO voltem a apontar motivo
Em MPD002A condição (DT_DESBLOQUEIO <> '') AND TP_BLOQVARIASVEZESPED='S' (linha 2737-2738) não é atendida. O if das linhas 2743-2745 também exige TP_BLOQVARIASVEZESPED='S'. Portanto BloquearPedido fica False nos dois ramos quando o pedido já foi desbloqueado
Em MPD010 (linhas 1448, 1547)if ((Resultado[0] <> '') and (iTP_BLOQVARIASVEZESPED = 'N')) → o pedido é adicionado a iNR_PEDIDOSBLO (lista de "pedidos não rebloqueados") em vez de sofrer UPDATE ... SET ST_PEDIDO='B'. O lote reporta esses pedidos como "já foram liberados anteriormente"
Quando usarEmpresas que aplicam uma política de liberação manual definitiva - uma vez que o supervisor libera o pedido, o sistema confia nessa decisão e não bloqueia de novo
ObservaçãoSe o pedido nunca foi desbloqueado (DT_DESBLOQUEIO NULL), o bloqueio normal continua funcionando. A opção N só afeta o rebloqueio

Simulação passo a passo​

  1. MFA001 → Pedidos/O.S. → Opção 1 → "Bloqueio de Pedido" = Bloquear Somente Uma Vez
  2. Mantenha ST_BLOQUEIOPED = "Limite de Crédito"
  3. Salve (F6)
  4. Cliente com limite R$ 1.000,00; crie Pedido de R$ 1.500,00 → pedido bloqueia (primeira vez, DT_DESBLOQUEIO ainda vazia)
  5. Supervisor libera o pedido (preenche DT_DESBLOQUEIO, limpa DS_BLOQUEIO, ST_PEDIDO='A')
  6. Cliente continua estourado no limite. Usuário edita o pedido e salva em MPD002 → na linha 2737-2738 a condição TP_BLOQVARIASVEZESPED='S' não bate; BloquearPedido:=False → pedido não é rebloqueado
  7. Rodar MPD010 "Validar Pedidos" → VERIFICA_BLOQUEIO retorna motivo, mas a linha 1448 cai no if (pois iTP_BLOQVARIASVEZESPED='N' e DT_DESBLOQUEIO<>'') → pedido vai para iNR_PEDIDOSBLO e não recebe UPDATE SET ST_PEDIDO='B'
  8. No fim, a mensagem do lote lista esse pedido em "Pedidos não Bloqueados"

Resultado esperado: após a primeira liberação, o pedido fica "imune" ao rebloqueio automático. Se o cliente piorou, é necessário ação manual para travar de novo. Útil em políticas comerciais onde a liberação é uma decisão final.


Tabela Comparativa Resumida​

OpçãoCódigoPermite rebloquear pedido já liberado?Efeito em MPD002 ao salvarEfeito em MPD010 "Validar Pedidos"Padrão
NormalSSimRebloqueia se VERIFICA_BLOQUEIO retornar motivo e pedido tiver DT_DESBLOQUEIOFaz UPDATE SET ST_PEDIDO='B' mesmo em pedidos já desbloqueados (lista iNR_PEDIDOS)Sim
Bloquear Somente Uma VezNNãoMantém liberação; BloquearPedido permanece FalseMove o pedido para lista iNR_PEDIDOSBLO (não rebloqueados) e não altera ST_PEDIDONão

Regra Geral / Interação com Outros Parâmetros​

  • Pré-requisito ST_BLOQUEIOPED: se ST_BLOQUEIOPED = 'N' (Não Bloqueia), este parâmetro é irrelevante — nenhum pedido será bloqueado em primeiro lugar. Em MPD010, o if (iST_BLOQUEIOPED <> 'N') (linhas 1420/1519) nem entra no laço.
  • Somente se aplica a Pedidos: não afeta Notas Fiscais (que têm seu próprio parâmetro ST_BLOQUEIONF) nem Ordens de Serviço que rodam por PARMOFICINA.TP_BLOQUEIOOS.
  • Não há validação em BeforePost do MFA001 (diferente de ST_BLOQUEIOPED). Qualquer valor fora de S/N fica aceito pelo banco (DOM_CHAR1), mas os ifs do código só consideram literalmente 'S' ou 'N'.
  • A decisão de rebloqueio é sempre aplicacional, não vem de procedure SQL. Portanto integrações externas (via API ou scripts SQL diretos) não respeitam este parâmetro automaticamente — precisariam replicar a lógica.

Referências no Código Fonte​

ArquivoLinhasFunção
source/MFA001/UMFA001.dfm8746-8772ComboBox wwDBComboBox8 com DataField='TP_BLOQVARIASVEZESPED'; Items.Strings = ('Normal'#9'S', 'Bloquear Somente Uma Vez'#9'N'); DataSource = dmMFA001.dsPARMFATUR
source/MFA001/UMFA001.dfm7985-7998Label26 "Bloqueio de Pedido" (Left=270, Top=325, Width=90, taRightJustify) associada visualmente ao combo
source/MFA001/UMFA001.dfm7708-7709pagPedidoOp1: TTabSheet Caption = 'Opção 1' (aba onde o combo está)
source/MFA001/UMFA001.dfm7698-7699pagPedidos: TTabSheet Caption = 'Pedidos / O.S.' (aba-pai)
source/MFA001/UMFA001.dfm7710-7715grpPedidos: TGroupBox Caption = ' Parâmetros de Pedidos/ Ordem de Serviço '
source/MFA001/UMFA001.pas317Declaração wwDBComboBox8: TwwDBComboBox;
source/MFA001/UdmMFA001.pas153Declaração tabPARMFATURTP_BLOQVARIASVEZESPED: TStringField;
source/MFA001/UdmMFA001.pas509Valor padrão := 'S' em tabPARMFATURAfterInsert
source/MFA001/UdmMFA001.dfm159, 1224-1229, 2387, 2767, 3039Campo incluído no SELECT principal (linhas 159 e 3039), definição de TStringField persistente (1224-1229), SQL de INSERT (2387) e UPDATE (2767) da PARMFATUR
source/MPD002/UdmMPD002.pas5754SELECT em RetornaParmFatur inclui P.TP_BLOQVARIASVEZESPED junto com demais parâmetros de PARMFATUR para alimentar a variável em memória ParmFatur.Values[]
source/MPD002/UMPD002.pas2736-2739if ((trim(DS_BLOQUEIO.AsString) = '') or (ParmFatur.values['TP_BLOQVARIASVEZESPED'] = 'S') and (DT_DESBLOQUEIO.AsString <> '')) then BloquearPedido := True
source/MPD002/UMPD002.pas2743-2745if ((trim(DS_BLOQUEIO.AsString) <> '') and (ParmFatur.values['TP_BLOQVARIASVEZESPED'] = 'S')) then BloquearPedido := True
source/MPD010/UMPD010.pas1400Declaração local iTP_BLOQVARIASVEZESPED: String no botão btnValidarPedidos_PedidosClick (aba Pedidos)
source/MPD010/UMPD010.pas1410-1412SELECT ST_BLOQUEIOPED, TP_BLOQVARIASVEZESPED FROM PARMFATUR WHERE CD_EMPRESA = ...
source/MPD010/UMPD010.pas1416iTP_BLOQVARIASVEZESPED := Resultado[1];
source/MPD010/UMPD010.pas1448if ((Resultado[0] <> '') and (iTP_BLOQVARIASVEZESPED = 'N')) then iNR_PEDIDOSBLO := ... (pedido não rebloqueado) else faz UPDATE para ST_PEDIDO='B'
source/MPD010/UMPD010.pas1499, 1509, 1515, 1547Cópia idêntica da mesma lógica em btnValidarPedidos_PedidosProdutosClick (aba Pedidos/Produtos)

Onde o parâmetro NÃO é usado​

Pesquisa em source/ retornou apenas os 6 arquivos acima. Em particular, não há uso em:

  • Nenhum arquivo em Scripts/ (nenhuma procedure/trigger/view referencia TP_BLOQVARIASVEZESPED)
  • Outros módulos de pedido (MPD005, MPD017, MPD018, MPD020, MPD081, MPD092) — eles executam VERIFICA_BLOQUEIO porém não consultam este parâmetro para decidir rebloqueio
  • Módulos de OS (MOF001, MOF002, MOF006, MOF008)
  • Módulos de NF (MNF017, MNF036 etc.)

Portanto, a decisão "bloquear só uma vez" é aplicada apenas nos fluxos de rebloqueio do MPD002 (edição manual) e MPD010 (validação em lote).