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.dfmlinha 8143 / combocmbST_ALTERAPEDIDOBLOQlinhas 8955-8982) Tabela:PARMFATUR.ST_ALTERAPEDIDOBLOQValor padrão:S(Sim — libera alteração mesmo com pedido bloqueado) — definido emUdmMFA001.paslinha 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ódulo | Código | Arquivo | Descrição |
|---|---|---|---|
| Parâmetros Faturamento | MFA001 | UMFA001.dfm, UdmMFA001.pas | Configuração do parâmetro (combo S/N/A) |
| Pedido de Venda | MPD002 | UMPD002.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.javalinha 32 eJunsoftBuilder.javalinha 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
| Campo | Tabela | Descrição |
|---|---|---|
ST_ALTERAPEDIDOBLOQ | PARMFATUR | Parâmetro principal (este documento) |
ST_ALTERAPEDIDO | PARMFATUR | Parâmetro mestre — só quando = 'S' a lógica deste parâmetro é avaliada em MPD002 linha 2290. Ver st_alterapedido.md |
ST_PEDIDO | PEDIDO | Status do pedido. A regra só é avaliada quando ST_PEDIDO = 'B' (Bloqueado) |
iAutorizador | variável interna MPD002 | Flag do usuário logado (cadastrada em ADM012); 'S' = Autorizador, 'N' = usuário comum |
iTpPEDIDO / TP_PEDIDO | PEDIDO | 'O' = Orçamento — libera a regra |
Opções disponíveis
Valores do combo (DFM
UMFA001.dfmlinhas 8974-8977):Sim → S,Não → N,Autorizador → A
S - Sim (Valor Padrão)
| O que faz | Detalhe |
|---|---|
Pedido com ST_PEDIDO = 'B' | Liberado para alteração normalmente — o bloqueio do pedido é ignorado |
Interação com ST_ALTERAPEDIDO | Em 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
- Logue com usuário não autorizador (
iAutorizador = 'N'em MPD002) - MFA001 → Ambos → Opção 1 →
ST_ALTERAPEDIDO = "Somente na Venda"eST_ALTERAPEDIDOBLOQ = "Sim" - Salve os parâmetros (F6)
- No banco, coloque um pedido de venda em
PEDIDO.ST_PEDIDO = 'B' - Abra MPD002, digite o número do pedido em
edtNR_PEDIDOe consulte - Não aparece nenhuma mensagem de bloqueio — o pedido é aberto normalmente (
UMPD002.paslinha 4099 — condição invertida) - Altere campos e salve (F6) → a validação da linha 2290 não dispara; só se aplica a regra do
ST_ALTERAPEDIDOmestre (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 faz | Detalhe |
|---|---|
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
- MFA001 →
ST_ALTERAPEDIDO = "Somente na Venda"eST_ALTERAPEDIDOBLOQ = "Não" - Um pedido de venda está com
ST_PEDIDO = 'B'(bloqueado aguardando liberação) - Abra MPD002, digite o
NR_PEDIDOe tecle Enter - Imediatamente aparece a mensagem: "O Pedido foi Bloqueado e está aguardando Liberação!" (
UMPD002.paslinhas 4120-4121 — ramoelsedo blocoST_ALTERAPEDIDOBLOQ <> 'S') - O foco retorna para
edtNR_PEDIDOe o pedido não abre - 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 faz | Detalhe |
|---|---|
Pedido com ST_PEDIDO = 'B' e usuário autorizador | Liberado — 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 comum | Bloqueado — 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 + Autorizador | Cai 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
- Usuário não autorizador (
iAutorizador = 'N') - MFA001 →
ST_ALTERAPEDIDO = "Somente na Venda"eST_ALTERAPEDIDOBLOQ = "Autorizador" - Pedido em
ST_PEDIDO = 'B' - Abra MPD002, digite o
NR_PEDIDO - Aparece: "O Pedido foi Bloqueado e está aguardando Liberação!" (
UMPD002.paslinha 4107) e o pedido não abre - 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
- Usuário autorizador (
iAutorizador = 'S'— configurado em ADM012) - Mesmo parâmetro
ST_ALTERAPEDIDOBLOQ = "Autorizador" - Pedido em
ST_PEDIDO = 'B' - Abra MPD002, digite o
NR_PEDIDO - Aparece a confirmação: "O Pedido está bloqueado. Deseja Continuar ?" (
UMPD002.paslinha 4111) - Se confirma Sim → pedido abre normalmente
- 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'eST_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 noelsee 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— bastaST_PEDIDO = 'B'+ST_ALTERAPEDIDOBLOQ <> 'S'. - Com
'A'e autorizador, disparamsgcodigo('C-0000', ...)pedindo confirmação interativa. - Com
'N', cai noelsee 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 deST_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 queST_PEDIDO = 'B'eST_ALTERAPEDIDOBLOQ <> 'S', independente do valor deST_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ção | Descrição | Pedido ST_PEDIDO='B' para usuário comum | Pedido ST_PEDIDO='B' para autorizador | Requer ST_ALTERAPEDIDO='S'? |
|---|---|---|---|---|
| S | Sim | Abre normalmente | Abre normalmente | — (regra não entra) |
| N | Não | Bloqueia ("aguardando Liberação") | Bloqueia (ramo else sem checar perfil) | Só no bloco 2290; bloco 4099 sempre |
| A | Autorizador | Bloqueia ("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 ramosST_ALTERAPEDIDOBLOQ = 'A'(nos ramoselseque 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.dfmlinha 8143 — label "Altera Pedido Bloqueado"source/MFA001/UMFA001.dfmlinhas 8955-8982 — combocmbST_ALTERAPEDIDOBLOQ(opçõesSim → S,Não → N,Autorizador → A)source/MFA001/UMFA001.paslinha 325 — declaração do componentecmbST_ALTERAPEDIDOBLOQsource/MFA001/UdmMFA001.paslinha 213 — declaração doTStringFieldtabPARMFATURST_ALTERAPEDIDOBLOQsource/MFA001/UdmMFA001.paslinha 525 — valor padrão'S'emAfterInsertsource/MFA001/UdmMFA001.dfmlinhas 227, 1571-1573, 2410, 2577, 2812, 3107 — SELECT, INSERT, UPDATE e metadata persistidos
Pedido de Venda (MPD002):
source/MPD002/UdmMPD002.paslinha 5748 — SELECT trazP.ST_ALTERAPEDIDOBLOQparaparmfatur.values['ST_ALTERAPEDIDOBLOQ']source/MPD002/UMPD002.paslinhas 2290-2306 — validação no salvamento (depende deST_ALTERAPEDIDO = 'S')source/MPD002/UMPD002.paslinhas 4099-4123 — validação na consulta porNR_PEDIDO(independe deST_ALTERAPEDIDO)
API REST (fora do escopo Delphi):
source/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/queries/ParmFaturSQL.javalinha 32 — select no SQL buildersource/Server/JunsoftWebAPI/src/main/java/junsoft/erp/repository/JunsoftBuilder.javalinha 346 — mapeamento.stAlteraPedidoBloq(...)
Procedures SQL: nenhuma (grep em Scripts/ retornou vazio).