Pular para o conteúdo principal

Parâmetro de Bloqueio do Status do Serial Oriundo de Pedido

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → (aba Faturamento, seção de Notas) → campo "Bloq. Serial do Pedido" Tabela: PARMFATUR.ST_BLOQUEIASERIAL Valor padrão: N (Não)

O que é? Quando um serial é vendido/entregue por meio de um pedido (ou seja, a nota fiscal que está consumindo o serial foi gerada a partir de um pedido — campo NOTA.NR_PEDIDO preenchido), o sistema passa a bloquear alterações manuais no status (STATUS) daquele serial diretamente pela tela de seleção de seriais da nota fiscal (MNF002). Também oculta o botão "Marcar" da tela de seleção de seriais (frmSERIAL em MNF002) quando o módulo de pedido ativo é do tipo Venda/Loja/Direta/Venda-Direta. O objetivo é impedir que o operador da nota altere a situação de um serial que já foi reservado/empenhado pelo pedido — toda a manutenção deve passar pelo próprio pedido.

Telas impactadas​

MóduloCódigoDescrição
Parâmetros FaturamentoMFA001Tela onde o parâmetro é configurado (ComboBox cmbST_BLOQUEIASERIAL, UMFA001.dfm linha 6971)
Manutenção de NF-eMNF002Único módulo com regra de negócio real. tabSERIALAfterScroll torna tabSERIALSTATUS read-only quando o serial tem pedido de origem (UdmMNF002.pas linha 8617). frmSERIAL.FormCreate oculta o botão "Marcar" quando o módulo de pedido for venda/loja/direta (USERIAL2.pas linha 248)
Notas FiscaisMNF008Apenas carrega o campo no SELECT geral de parâmetros (UdmMNF008.pas linha 762) — sem regra adicional
Consulta de MovimentosMCO006Apenas carrega o campo no SELECT de parâmetros (UdmMCO006.pas linha 2106) — sem regra adicional
OS Recap (Recapadora)RCA006Apenas declara o campo no dataset de parâmetros (UdmRCA006.dfm) — sem regra adicional
Consulta PedidosCPD009Apenas declara o campo no dataset (UdmCPD009.dfm) — sem regra adicional

Procedures impactadas​

Nenhuma stored procedure/trigger da base referencia ST_BLOQUEIASERIAL (grep em Scripts/ retorna zero ocorrências). A regra é 100% Delphi, executada somente em MNF002.

Campos envolvidos​

CampoTabelaDescrição
ST_BLOQUEIASERIALPARMFATURFlag S/N que liga/desliga o bloqueio do status do serial quando ele tem pedido de origem
STATUSSERIAL (via tabSERIAL em MNF002)Status do serial (livre, vendido, bloqueado, etc.) — é este campo que fica read-only
NR_PEDIDONOTA (em MNF002 via tabNOTANR_PEDIDO)Número do pedido que originou a nota; é o gatilho do bloqueio — só bloqueia quando preenchido
ST_PEDVENDAPARMFATURModalidade do módulo de pedido (S, L, D, V); usado em conjunto com ST_BLOQUEIASERIAL para decidir se o botão "Marcar" deve aparecer
NR_SERIALSERIALNúmero de série individual listado na tela frmSERIAL

Opções disponíveis​

S - Sim (Bloqueia Status do Serial quando Há Pedido)​

O que fazDetalhe
Torna STATUS read-only?Sim. Em MNF002, sempre que o cursor do tabSERIAL passa por um serial cuja nota tem NR_PEDIDO preenchido, tabSERIALSTATUS.ReadOnly := True (UdmMNF002.pas linha 8622)
Esconde botão "Marcar"?Sim, mas apenas quando ST_PEDVENDA IN ('S','L','D','V'). frmSERIAL.FormCreate (USERIAL2.pas linha 250–256) executa btnMarca.Visible := false
Afeta outros módulos?Não. Demais módulos apenas carregam o campo na query de parâmetros; a regra é só para MNF002
Procedure / trigger?Nenhuma. A restrição é puramente na UI Delphi

Simulação passo a passo (MNF002)​

  1. Em MFA001 → aba Faturamento → campo "Bloq. Serial do Pedido" → selecione Sim
  2. Salve os parâmetros (F6)
  3. Garanta que ST_PEDVENDA esteja em S/L/D/V (Venda / Loja / Direta / Venda-Direta) — caso contrário o botão "Marcar" continua visível
  4. Gere um pedido de venda em MPD002 contendo produtos serializados e selecione os seriais (tabela ITEMPEDIDOSERIAL)
  5. Faça o faturamento do pedido gerando uma NF-e em MNF002 (NOTA.NR_PEDIDO fica preenchido com o nº do pedido)
  6. Edite a NF-e recém-gerada e abra a tela de seleção de seriais (frmSERIAL)
  7. Resultado esperado:
    • Ao navegar entre os seriais, a coluna STATUS fica read-only (UdmMNF002.pas linha 8617–8625) — nenhum campo de status pode ser alterado manualmente
    • O botão "Marcar" não aparece (USERIAL2.pas linha 254) — não é possível marcar/desmarcar seriais individualmente
  8. Resultado: a situação dos seriais é fiel ao que o pedido determinou; o operador da nota não consegue "mexer" em seriais reservados por um pedido

Resultado esperado: integridade do vínculo pedido → serial. Qualquer ajuste na lista/status de seriais precisa voltar ao pedido de origem; a nota apenas consome o que o pedido já reservou.


N - Não (Padrão — Não Bloqueia)​

O que fazDetalhe
Torna STATUS read-only?Não. O bloco if (parmfatur.values['ST_BLOQUEIASERIAL'] = 'S') em UdmMNF002.pas linha 8619 é pulado; tabSERIALSTATUS mantém seu estado normal (editável)
Esconde botão "Marcar"?Não. USERIAL2.pas linha 250 sai sem executar btnMarca.Visible := false — o botão continua visível
Outras validações de serialContinuam inalteradas (TP_SERIAL, ST_VENDIDO, etc. seguem sendo aplicados pelas demais rotinas)
RiscoO operador da NF-e pode alterar o status de seriais já reservados por pedido, o que pode divergir o pedido da nota

Simulação passo a passo​

  1. Em MFA001 → "Bloq. Serial do Pedido" → selecione Não
  2. Salve os parâmetros (F6)
  3. Gere um pedido em MPD002 com itens serializados e faturamento em MNF002 (mesmo cenário de antes)
  4. Abra a tela frmSERIAL em MNF002
  5. Resultado esperado:
    • A coluna STATUS permanece editável — o operador consegue trocar o status diretamente na grade
    • O botão "Marcar" é exibido — é possível marcar/desmarcar seriais manualmente na nota
  6. Resultado: a nota pode divergir do pedido original caso o operador altere seriais.

Resultado esperado: comportamento "aberto", recomendado apenas para operações em que a nota não é originada de pedido (ex.: notas de transferência, entradas diversas) ou em ambientes onde essa rastreabilidade pedido → nota não é exigida.

Este é o valor padrão (AfterInsert do tabPARMFATUR em UdmMFA001.pas linha 488 define 'N').


Regras complementares​

  • O bloqueio só entra em ação quando NOTA.NR_PEDIDO está preenchido. Em notas sem pedido de origem (NR_PEDIDO vazio), o status continua editável mesmo com o parâmetro em 'S' (UdmMNF002.pas linha 8621).
  • O parâmetro ST_PEDVENDA atua como co-pré-requisito para o ocultamento do botão "Marcar": somente módulos de pedido do tipo Venda / Loja / Direta / Venda-Direta (S/L/D/V) escondem o botão. Outras modalidades (ex.: OS, orçamento) mantêm o botão visível mesmo com o parâmetro em 'S'.
  • O teste é feito em tempo real via tabSERIALAfterScroll: cada vez que o usuário muda de linha na grade de seriais, a condição é reavaliada.
  • Nenhuma procedure, trigger, view ou rotina SQL referencia ST_BLOQUEIASERIAL; é regra puramente Delphi.
  • Módulos consumidores "somente-leitura" (MNF008, MCO006, RCA006, CPD009) carregam o campo no SELECT de parâmetros apenas por coerência do modelo de dados compartilhado — não aplicam nenhum comportamento baseado nele.

Tabela Comparativa Resumida​

OpçãoDescriçãoSTATUS read-only em MNF002?Botão "Marcar" escondido?Afeta outros módulos?
SSimSim (quando NOTA.NR_PEDIDO preenchido)Sim (quando ST_PEDVENDA IN ('S','L','D','V'))Não
NNão (padrão)NãoNãoNão

Referências no Código Fonte​

MFA001 (configuração)​

  • source/MFA001/UMFA001.dfm linha 6971–6998 — ComboBox cmbST_BLOQUEIASERIAL com DataField = 'ST_BLOQUEIASERIAL', Items.Strings = ('Sim'#9'S', 'Não'#9'N'), Style = csDropDownList, MapList = True, DataSource = dmMFA001.dsPARMFATUR
  • source/MFA001/UMFA001.dfm linha 6186–6200 — Label15 com Caption = 'Bloq. Serial do Pedido' e FocusControl = cmbST_BLOQUEIASERIAL
  • source/MFA001/UMFA001.pas linha 392 — declaração cmbST_BLOQUEIASERIAL: TwwDBComboBox
  • source/MFA001/UdmMFA001.dfm linha 1164–1169 — TStringField tabPARMFATURST_BLOQUEIASERIAL (FieldName ST_BLOQUEIASERIAL, FixedChar, Size = 1)
  • source/MFA001/UdmMFA001.dfm linhas 145, 2381, 2540, 2755, 3025 — ST_BLOQUEIASERIAL presente nos SQLs de SELECT/INSERT/UPDATE da query persistida qryParmFatur
  • source/MFA001/UdmMFA001.pas linha 141 — declaração tabPARMFATURST_BLOQUEIASERIAL: TStringField
  • source/MFA001/UdmMFA001.pas linha 488 — AfterInsert: tabPARMFATURST_BLOQUEIASERIAL.AsString := 'N' (valor padrão)

MNF002 (Manutenção de NF-e) — regras de negócio​

  • source/MNF002/UdmMNF002.pas linha 8617–8626 — procedure tabSERIALAfterScroll:
    if (parmfatur.values['ST_BLOQUEIASERIAL'] = 'S') then
    begin
    if ( Trim(dmMNF002.tabNOTANR_PEDIDO.AsString) <> '' ) then
    tabSERIALSTATUS.ReadOnly := True
    else
    tabSERIALSTATUS.ReadOnly := False;
    end;
  • source/MNF002/USERIAL2.pas linha 248–257 — procedure TfrmSERIAL.FormCreate:
    if (parmfatur.values['ST_BLOQUEIASERIAL'] = 'S') then
    begin
    if ( (parmfatur.values['ST_PEDVENDA'] = 'S') or (parmfatur.values['ST_PEDVENDA'] = 'L') or
    (parmfatur.values['ST_PEDVENDA'] = 'D') or (parmfatur.values['ST_PEDVENDA'] = 'V') ) then
    btnMarca.Visible := false;
    end;
  • source/MNF002/UdmMNF002.pas linha 10497 — campo incluído no SELECT de carga dos parâmetros de faturamento do módulo

Outros módulos (apenas mapeamento em dataset / SELECT, sem regra)​

  • source/MNF008/UdmMNF008.pas linha 762 — ST_BLOQUEIASERIAL no SELECT de parâmetros
  • source/MCO006/UdmMCO006.pas linha 2106 — ST_BLOQUEIASERIAL no SELECT de parâmetros
  • source/RCA006/UdmRCA006.dfm linhas 3081, 3145, 3248, 3352 — campo declarado no TFDQuery de parâmetros (sem regra de negócio)
  • source/CPD009/UdmCPD009.dfm linhas 332, 396, 499, 603 — campo declarado no TFDQuery de parâmetros (sem regra de negócio)

Scripts SQL​

  • Grep em D:/Desenvolvimento/JunsoftERP_V2/Scripts/ → 0 ocorrências. Nenhuma procedure/trigger/view referencia ST_BLOQUEIASERIAL.