Pular para o conteúdo principal

Alteração de Pedido Bloqueado (ST_PEDIDO = 'B')

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Pedidos / O.S. → Opção 1 (label "Altera Pedido Bloqueado", UMFA001.dfm linha 8143 / combo cmbST_ALTERAPEDIDOBLOQ linhas 8955-8982) Tabela: PARMFATUR.ST_ALTERAPEDIDOBLOQ Valor padrão: S (Sim — libera alteração mesmo com pedido bloqueado) — definido em UdmMFA001.pas linha 525 (AfterInsert)

Define se o sistema permite ou impede a alteração de um Pedido de Venda que esteja com PEDIDO.ST_PEDIDO = 'B' (Bloqueado aguardando liberação). Atua como exceção complementar ao parâmetro ST_ALTERAPEDIDO — quando este estiver bloqueando alterações na venda ('S') e o pedido específico estiver no status Bloqueado, é ST_ALTERAPEDIDOBLOQ que decide se a edição ainda é possível ou se o operador precisa aguardar a liberação.

Todo o efeito prático deste parâmetro está concentrado em MPD002 (Pedido de Venda), em dois pontos: ao abrir/alterar um pedido e ao confirmar/consultar um pedido pelo número. Fora de MPD002 o parâmetro é apenas lido/persistido (MFA001) ou trafegado pela API REST (JunsoftWebAPI), mas nenhuma tela ou procedure SQL o utiliza de forma lógica.

Telas impactadas​

MóduloCódigoArquivoDescrição
Parâmetros FaturamentoMFA001UMFA001.dfm, UdmMFA001.pasConfiguração do parâmetro (combo S/N/A)
Pedido de VendaMPD002UMPD002.pas, UdmMPD002.pasÚnica tela que consome o parâmetro para liberar/bloquear alteração de pedido em status B

Observação: O parâmetro também é exposto pela API REST em source/Server/JunsoftWebAPI (ParmFaturSQL.java linha 32 e JunsoftBuilder.java linha 346), mas esse trajeto está fora do escopo desta documentação (apenas serialização do campo).

Procedures impactadas​

Nenhuma. grep em Scripts/ não retornou ocorrências — o parâmetro é consumido exclusivamente pelo front Delphi.

Campos envolvidos​

CampoTabelaDescrição
ST_ALTERAPEDIDOBLOQPARMFATURParâmetro principal (este documento)
ST_ALTERAPEDIDOPARMFATURParâmetro mestre — só quando = 'S' a lógica deste parâmetro é avaliada em MPD002 linha 2290. Ver st_alterapedido.md
ST_PEDIDOPEDIDOStatus do pedido. A regra só é avaliada quando ST_PEDIDO = 'B' (Bloqueado)
iAutorizadorvariável interna MPD002Flag do usuário logado (cadastrada em ADM012); 'S' = Autorizador, 'N' = usuário comum
iTpPEDIDO / TP_PEDIDOPEDIDO'O' = Orçamento — libera a regra

Opções disponíveis​

Valores do combo (DFM UMFA001.dfm linhas 8974-8977): Sim → S, Não → N, Autorizador → A

S - Sim (Valor Padrão)​

O que fazDetalhe
Pedido com ST_PEDIDO = 'B'Liberado para alteração normalmente — o bloqueio do pedido é ignorado
Interação com ST_ALTERAPEDIDOEm UMPD002.pas linha 2290 a condição (ST_ALTERAPEDIDOBLOQ <> 'S') falha, portanto o bloco que dispararia "O Pedido foi Bloqueado..." é pulado
Confirmação por NR_PEDIDO (linha 4099)A condição (ST_ALTERAPEDIDOBLOQ <> 'S') também falha — não cai nas mensagens de aguardando liberação nem na pergunta "O Pedido está bloqueado. Deseja Continuar?"

Simulação passo a passo​

  1. Logue com usuário não autorizador (iAutorizador = 'N' em MPD002)
  2. MFA001 → Ambos → Opção 1 → ST_ALTERAPEDIDO = "Somente na Venda" e ST_ALTERAPEDIDOBLOQ = "Sim"
  3. Salve os parâmetros (F6)
  4. No banco, coloque um pedido de venda em PEDIDO.ST_PEDIDO = 'B'
  5. Abra MPD002, digite o número do pedido em edtNR_PEDIDO e consulte
  6. Não aparece nenhuma mensagem de bloqueio — o pedido é aberto normalmente (UMPD002.pas linha 4099 — condição invertida)
  7. Altere campos e salve (F6) → a validação da linha 2290 não dispara; só se aplica a regra do ST_ALTERAPEDIDO mestre (se = 'S', a linha 2286-2288 ainda bloqueia, pois essa é uma regra separada de pedido impresso)

Resultado esperado: O status "Bloqueado" do pedido é transparente — qualquer usuário pode alterá-lo, desde que respeitadas as outras regras (ST_ALTERAPEDIDO, impressão, autorização). É o valor padrão e o modo mais permissivo.


N - Não​

O que fazDetalhe
Pedido com ST_PEDIDO = 'B' + ST_ALTERAPEDIDO = 'S'Bloqueado — dispara "O Pedido foi Bloqueado e está aguardando Liberação!" para qualquer usuário (inclusive autorizador) no salvamento (linha 2303-2304)
Consulta por NR_PEDIDO (linha 4099)Bloqueado — ao digitar o número e consultar, dispara a mesma mensagem (linha 4120-4121), também para autorizador (ramo else sem checar iAutorizador)
Regra só aplica quando ST_ALTERAPEDIDO = 'S'Se ST_ALTERAPEDIDO <> 'S', a condição composta da linha 2290 falha e a mensagem não dispara (no caso do salvamento). Já na linha 4099 a regra é avaliada independentemente de ST_ALTERAPEDIDO

Simulação passo a passo​

  1. MFA001 → ST_ALTERAPEDIDO = "Somente na Venda" e ST_ALTERAPEDIDOBLOQ = "Não"
  2. Um pedido de venda está com ST_PEDIDO = 'B' (bloqueado aguardando liberação)
  3. Abra MPD002, digite o NR_PEDIDO e tecle Enter
  4. Imediatamente aparece a mensagem: "O Pedido foi Bloqueado e está aguardando Liberação!" (UMPD002.pas linhas 4120-4121 — ramo else do bloco ST_ALTERAPEDIDOBLOQ <> 'S')
  5. O foco retorna para edtNR_PEDIDO e o pedido não abre
  6. Mesmo comportamento se tentar salvar alteração: a linha 2303-2304 dispara a mesma mensagem antes do commit

Resultado esperado: Enquanto o pedido estiver em ST_PEDIDO = 'B', ninguém (nem Autorizador) consegue abrir/alterar — é preciso rodar o fluxo de liberação do pedido (tela de aprovação) antes. É o modo mais restritivo.


A - Autorizador​

O que fazDetalhe
Pedido com ST_PEDIDO = 'B' e usuário autorizadorLiberado — iAutorizador = 'S' escapa da validação; o pedido abre sem alerta (linha 4104) ou, em alguns ramos, com a pergunta "O Pedido está bloqueado. Deseja Continuar?" (linha 4109-4116)
Pedido com ST_PEDIDO = 'B' e usuário comumBloqueado — dispara "O Pedido foi Bloqueado e está aguardando Liberação!" (linhas 2297-2298 e 4106-4107)
Orçamento (iTpPEDIDO = 'O')Escapa da regra (as duas condições exigem iTpPEDIDO <> 'O')
Consulta por NR_PEDIDO + AutorizadorCai no ramo else interno (linha 4109): exibe msgcodigo('C-0000', ['O Pedido está bloqueado. Deseja Continuar ?']); se o autorizador responder Não, lança "Operação cancelada!" (linha 4114)

Simulação passo a passo — usuário comum​

  1. Usuário não autorizador (iAutorizador = 'N')
  2. MFA001 → ST_ALTERAPEDIDO = "Somente na Venda" e ST_ALTERAPEDIDOBLOQ = "Autorizador"
  3. Pedido em ST_PEDIDO = 'B'
  4. Abra MPD002, digite o NR_PEDIDO
  5. Aparece: "O Pedido foi Bloqueado e está aguardando Liberação!" (UMPD002.pas linha 4107) e o pedido não abre
  6. Ao tentar salvar alterações (se abriu por outro caminho), a linha 2297-2298 dispara a mesma mensagem

Simulação passo a passo — usuário autorizador​

  1. Usuário autorizador (iAutorizador = 'S' — configurado em ADM012)
  2. Mesmo parâmetro ST_ALTERAPEDIDOBLOQ = "Autorizador"
  3. Pedido em ST_PEDIDO = 'B'
  4. Abra MPD002, digite o NR_PEDIDO
  5. Aparece a confirmação: "O Pedido está bloqueado. Deseja Continuar ?" (UMPD002.pas linha 4111)
  6. Se confirma Sim → pedido abre normalmente
  7. Se confirma Não → "Operação cancelada!" (linha 4114) e o foco volta para edtNR_PEDIDO

Resultado esperado: Permite que somente autorizadores destravam o bloqueio por status 'B' — o usuário comum é barrado, o autorizador confirma com pergunta antes de seguir. Modo intermediário.


Lógica real do código​

Bloco 1 — Salvamento do pedido (UMPD002.pas linhas 2290-2306):

if ((parmfatur.values['ST_ALTERAPEDIDOBLOQ'] <> 'S') and (parmfatur.values['ST_ALTERAPEDIDO'] = 'S') and
(dmMPD002.tabPEDIDOST_PEDIDO.asString = 'B' )) then
begin //se o parametro estiver como autorizador, verifica o usuario.
if (parmfatur.values['ST_ALTERAPEDIDOBLOQ'] = 'A') then
begin
if ((dmMPD002.iAutorizador = 'N') and (dmMPD002.iTpPEDIDO <> 'O'))then
begin
edtNR_PEDIDO.SetFocus;
Raise JException.Create('W-0000', ['O Pedido foi Bloqueado e está aguardando Liberação!']);
end;
end
else
begin
edtNR_PEDIDO.SetFocus;
Raise JException.Create('W-0000', ['O Pedido foi Bloqueado e está aguardando Liberação!']);
end;
end;

Observações sobre este bloco:

  • Só é avaliado quando todas as três condições forem verdadeiras: ST_ALTERAPEDIDOBLOQ <> 'S', ST_ALTERAPEDIDO = 'S' e ST_PEDIDO = 'B'.
  • Com ST_ALTERAPEDIDOBLOQ = 'A' e usuário autorizador ou orçamento, o bloco entra mas não lança erro (fluxo segue).
  • Com ST_ALTERAPEDIDOBLOQ = 'N', cai no else e lança a exceção sem checar nada (nem autorizador, nem orçamento).

Bloco 2 — Confirmação por NR_PEDIDO (UMPD002.pas linhas 4099-4123):

if (St_PedidoPed = 'B') and (parmfatur.values['ST_ALTERAPEDIDOBLOQ'] <> 'S') then
begin
//se o parametro estiver como autorizador, verifica o usuario.
if (parmfatur.values['ST_ALTERAPEDIDOBLOQ'] = 'A') then
begin
if ((dmMPD002.iAutorizador = 'N') and (dmMPD002.iTpPEDIDO <> 'O')) then
begin
edtNR_PEDIDO.SetFocus;
Raise JException.Create('W-0000', ['O Pedido foi Bloqueado e está aguardando Liberação!']);
end
else
begin
if not (msgcodigo('C-0000',['O Pedido está bloqueado. Deseja Continuar ?'])) then
begin
edtNR_PEDIDO.SetFocus;
Raise JException.Create('W-0000', ['Operação cancelada!']);
end;
end;
end
else
begin
edtNR_PEDIDO.SetFocus;
Raise JException.Create('W-0000', ['O Pedido foi Bloqueado e está aguardando Liberação!']);
end;
end;

Observações:

  • Aqui a avaliação não depende de ST_ALTERAPEDIDO — basta ST_PEDIDO = 'B' + ST_ALTERAPEDIDOBLOQ <> 'S'.
  • Com 'A' e autorizador, dispara msgcodigo('C-0000', ...) pedindo confirmação interativa.
  • Com 'N', cai no else e bloqueia incondicionalmente, independente de perfil.

Interação com ST_ALTERAPEDIDO / TP_BLOQVARIASVEZESPED​

ST_ALTERAPEDIDO​

O parâmetro ST_ALTERAPEDIDOBLOQ só é efetivo em dois cenários distintos:

  • No salvamento (linha 2290) exige ST_ALTERAPEDIDO = 'S' para ser avaliado. Nos demais valores de ST_ALTERAPEDIDO (E, T, N, A, P), o bloco da linha 2290 não entra — o bloqueio por status 'B' nem é testado nesse caminho.
  • Na consulta por NR_PEDIDO (linha 4099) a regra é avaliada sempre que ST_PEDIDO = 'B' e ST_ALTERAPEDIDOBLOQ <> 'S', independente do valor de ST_ALTERAPEDIDO.

Isso cria um comportamento assimétrico: mesmo que ST_ALTERAPEDIDO esteja configurado para "Não" e libere qualquer alteração de pedido impresso, a simples consulta por número em MPD002 ainda pode ser travada se o pedido estiver em status B e este parâmetro for N ou A.

Ver documentação complementar em st_alterapedido.md.

TP_BLOQVARIASVEZESPED​

Sem interação direta no código. TP_BLOQVARIASVEZESPED governa quantas vezes um pedido pode ser bloqueado/desbloqueado (ciclos de aprovação), enquanto ST_ALTERAPEDIDOBLOQ define se é possível abrir/alterar um pedido que está bloqueado no momento. Os dois atuam em fases distintas: TP_BLOQVARIASVEZESPED no momento do (re)bloqueio e ST_ALTERAPEDIDOBLOQ no momento da edição/consulta do pedido já bloqueado.


Tabela Comparativa Resumida​

OpçãoDescriçãoPedido ST_PEDIDO='B' para usuário comumPedido ST_PEDIDO='B' para autorizadorRequer ST_ALTERAPEDIDO='S'?
SSimAbre normalmenteAbre normalmente— (regra não entra)
NNãoBloqueia ("aguardando Liberação")Bloqueia (ramo else sem checar perfil)Só no bloco 2290; bloco 4099 sempre
AAutorizadorBloqueia ("aguardando Liberação")Abre (com pergunta "Deseja Continuar?" no bloco 4099)Só no bloco 2290; bloco 4099 sempre

Em qualquer opção, orçamento (TP_PEDIDO = 'O') escapa da regra, mas apenas dentro dos ramos ST_ALTERAPEDIDOBLOQ = 'A' (nos ramos else que tratam 'N' a verificação de orçamento não existe).


Referências no Código Fonte​

Definição do campo e combo (MFA001):

  • source/MFA001/UMFA001.dfm linha 8143 — label "Altera Pedido Bloqueado"
  • source/MFA001/UMFA001.dfm linhas 8955-8982 — combo cmbST_ALTERAPEDIDOBLOQ (opções Sim → S, Não → N, Autorizador → A)
  • source/MFA001/UMFA001.pas linha 325 — declaração do componente cmbST_ALTERAPEDIDOBLOQ
  • source/MFA001/UdmMFA001.pas linha 213 — declaração do TStringField tabPARMFATURST_ALTERAPEDIDOBLOQ
  • source/MFA001/UdmMFA001.pas linha 525 — valor padrão 'S' em AfterInsert
  • source/MFA001/UdmMFA001.dfm linhas 227, 1571-1573, 2410, 2577, 2812, 3107 — SELECT, INSERT, UPDATE e metadata persistidos

Pedido de Venda (MPD002):

  • source/MPD002/UdmMPD002.pas linha 5748 — SELECT traz P.ST_ALTERAPEDIDOBLOQ para parmfatur.values['ST_ALTERAPEDIDOBLOQ']
  • source/MPD002/UMPD002.pas linhas 2290-2306 — validação no salvamento (depende de ST_ALTERAPEDIDO = 'S')
  • source/MPD002/UMPD002.pas linhas 4099-4123 — validação na consulta por NR_PEDIDO (independe de ST_ALTERAPEDIDO)

API REST (fora do escopo Delphi):

  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.java linha 32 — select no SQL builder
  • source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.java linha 346 — mapeamento .stAlteraPedidoBloq(...)

Procedures SQL: nenhuma (grep em Scripts/ retornou vazio).