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.dfmlinha 8746; labelLabel26linha 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 emUdmMFA001.paslinha 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ódulo | Código | Descrição |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Tela de configuração (combo wwDBComboBox8 - UMFA001.dfm linhas 8746-8772) |
| Pedido de Venda | MPD002 | Ló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 Lote | MPD010 | Botã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
| Campo | Tabela | Descrição |
|---|---|---|
TP_BLOQVARIASVEZESPED | PARMFATUR | O parâmetro em si (S = Normal; N = Bloquear Somente Uma Vez). DOM_CHAR1 |
ST_BLOQUEIOPED | PARMFATUR | Pré-requisito: só é consultado pelo MPD010 quando ST_BLOQUEIOPED <> 'N' (UMPD010.pas linhas 1420, 1519). Se ST_BLOQUEIOPED='N', o lote nem executa |
PEDIDO.DS_BLOQUEIO | PEDIDO | Motivo atual do bloqueio. Quando vazio e TP_BLOQVARIASVEZESPED='S' + DT_DESBLOQUEIO preenchida → tenta rebloquear (UMPD002.pas linhas 2736-2739) |
PEDIDO.DT_DESBLOQUEIO | PEDIDO | Data em que o pedido foi liberado. É a "chave" da decisão: se preenchida e TP_BLOQVARIASVEZESPED='N' → pedido não é rebloqueado |
PEDIDO.ST_PEDIDO | PEDIDO | Em MPD010, é atualizado para 'B' quando o pedido é rebloqueado (UMPD010.pas linha 1455) |
Opções disponíveis
S - Normal (padrão)
| O que faz | Detalhe |
|---|---|
| Comportamento | Permite 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 usar | Cená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
- MFA001 → Pedidos/O.S. → Opção 1 → "Bloqueio de Pedido" (combo TP_BLOQVARIASVEZESPED) = Normal
- Configure
ST_BLOQUEIOPED = "Limite de Crédito"(combo ao lado) - Salve (F6)
- Cliente com limite R$ 1.000,00; crie Pedido (MPD002) de R$ 1.500,00 → pedido bloqueia (motivo: limite)
- Supervisor libera o pedido manualmente (preenche
DT_DESBLOQUEIO,DS_BLOQUEIOlimpo) - Usuário retorna ao mesmo pedido, edita (altera item qualquer) e pressiona "Salvar" → em
BtnSalvarClick(linhas 2736-2744): comoDS_BLOQUEIO=''eDT_DESBLOQUEIO<>''eTP_BLOQVARIASVEZESPED='S'→BloquearPedido:=True→ pedido volta a ficar bloqueado se o limite ainda estiver estourado - Alternativamente, rodar MPD010 "Validar Pedidos" → percorre pedidos com
STATUS='Å', executaVERIFICA_BLOQUEIO; para cada pedido já desbloqueado com motivo atual, cai noelseda 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 faz | Detalhe |
|---|---|
| Comportamento | Uma 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 MPD002 | A 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 usar | Empresas 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ção | Se 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
- MFA001 → Pedidos/O.S. → Opção 1 → "Bloqueio de Pedido" = Bloquear Somente Uma Vez
- Mantenha
ST_BLOQUEIOPED = "Limite de Crédito" - Salve (F6)
- Cliente com limite R$ 1.000,00; crie Pedido de R$ 1.500,00 → pedido bloqueia (primeira vez,
DT_DESBLOQUEIOainda vazia) - Supervisor libera o pedido (preenche
DT_DESBLOQUEIO, limpaDS_BLOQUEIO,ST_PEDIDO='A') - 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 - Rodar MPD010 "Validar Pedidos" →
VERIFICA_BLOQUEIOretorna motivo, mas a linha 1448 cai noif(poisiTP_BLOQVARIASVEZESPED='N'eDT_DESBLOQUEIO<>'') → pedido vai paraiNR_PEDIDOSBLOe não recebeUPDATE SET ST_PEDIDO='B' - 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ção | Código | Permite rebloquear pedido já liberado? | Efeito em MPD002 ao salvar | Efeito em MPD010 "Validar Pedidos" | Padrão |
|---|---|---|---|---|---|
| Normal | S | Sim | Rebloqueia se VERIFICA_BLOQUEIO retornar motivo e pedido tiver DT_DESBLOQUEIO | Faz UPDATE SET ST_PEDIDO='B' mesmo em pedidos já desbloqueados (lista iNR_PEDIDOS) | Sim |
| Bloquear Somente Uma Vez | N | Não | Mantém liberação; BloquearPedido permanece False | Move o pedido para lista iNR_PEDIDOSBLO (não rebloqueados) e não altera ST_PEDIDO | Não |
Regra Geral / Interação com Outros Parâmetros
- Pré-requisito
ST_BLOQUEIOPED: seST_BLOQUEIOPED = 'N'(Não Bloqueia), este parâmetro é irrelevante — nenhum pedido será bloqueado em primeiro lugar. Em MPD010, oif (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 porPARMOFICINA.TP_BLOQUEIOOS. - Não há validação em
BeforePostdo MFA001 (diferente deST_BLOQUEIOPED). Qualquer valor fora deS/Nfica aceito pelo banco (DOM_CHAR1), mas osifs 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
| Arquivo | Linhas | Função |
|---|---|---|
source/MFA001/UMFA001.dfm | 8746-8772 | ComboBox wwDBComboBox8 com DataField='TP_BLOQVARIASVEZESPED'; Items.Strings = ('Normal'#9'S', 'Bloquear Somente Uma Vez'#9'N'); DataSource = dmMFA001.dsPARMFATUR |
source/MFA001/UMFA001.dfm | 7985-7998 | Label26 "Bloqueio de Pedido" (Left=270, Top=325, Width=90, taRightJustify) associada visualmente ao combo |
source/MFA001/UMFA001.dfm | 7708-7709 | pagPedidoOp1: TTabSheet Caption = 'Opção 1' (aba onde o combo está) |
source/MFA001/UMFA001.dfm | 7698-7699 | pagPedidos: TTabSheet Caption = 'Pedidos / O.S.' (aba-pai) |
source/MFA001/UMFA001.dfm | 7710-7715 | grpPedidos: TGroupBox Caption = ' Parâmetros de Pedidos/ Ordem de Serviço ' |
source/MFA001/UMFA001.pas | 317 | Declaração wwDBComboBox8: TwwDBComboBox; |
source/MFA001/UdmMFA001.pas | 153 | Declaração tabPARMFATURTP_BLOQVARIASVEZESPED: TStringField; |
source/MFA001/UdmMFA001.pas | 509 | Valor padrão := 'S' em tabPARMFATURAfterInsert |
source/MFA001/UdmMFA001.dfm | 159, 1224-1229, 2387, 2767, 3039 | Campo 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.pas | 5754 | SELECT 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.pas | 2736-2739 | if ((trim(DS_BLOQUEIO.AsString) = '') or (ParmFatur.values['TP_BLOQVARIASVEZESPED'] = 'S') and (DT_DESBLOQUEIO.AsString <> '')) then BloquearPedido := True |
source/MPD002/UMPD002.pas | 2743-2745 | if ((trim(DS_BLOQUEIO.AsString) <> '') and (ParmFatur.values['TP_BLOQVARIASVEZESPED'] = 'S')) then BloquearPedido := True |
source/MPD010/UMPD010.pas | 1400 | Declaração local iTP_BLOQVARIASVEZESPED: String no botão btnValidarPedidos_PedidosClick (aba Pedidos) |
source/MPD010/UMPD010.pas | 1410-1412 | SELECT ST_BLOQUEIOPED, TP_BLOQVARIASVEZESPED FROM PARMFATUR WHERE CD_EMPRESA = ... |
source/MPD010/UMPD010.pas | 1416 | iTP_BLOQVARIASVEZESPED := Resultado[1]; |
source/MPD010/UMPD010.pas | 1448 | if ((Resultado[0] <> '') and (iTP_BLOQVARIASVEZESPED = 'N')) then iNR_PEDIDOSBLO := ... (pedido não rebloqueado) else faz UPDATE para ST_PEDIDO='B' |
source/MPD010/UMPD010.pas | 1499, 1509, 1515, 1547 | Có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 referenciaTP_BLOQVARIASVEZESPED) - Outros módulos de pedido (MPD005, MPD017, MPD018, MPD020, MPD081, MPD092) — eles executam
VERIFICA_BLOQUEIOporé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).