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_BLOQUEIASERIALValor 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_PEDIDOpreenchido), 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 (frmSERIALem 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ódulo | Código | Descrição |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Tela onde o parâmetro é configurado (ComboBox cmbST_BLOQUEIASERIAL, UMFA001.dfm linha 6971) |
| Manutenção de NF-e | MNF002 | Ú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 Fiscais | MNF008 | Apenas carrega o campo no SELECT geral de parâmetros (UdmMNF008.pas linha 762) — sem regra adicional |
| Consulta de Movimentos | MCO006 | Apenas carrega o campo no SELECT de parâmetros (UdmMCO006.pas linha 2106) — sem regra adicional |
| OS Recap (Recapadora) | RCA006 | Apenas declara o campo no dataset de parâmetros (UdmRCA006.dfm) — sem regra adicional |
| Consulta Pedidos | CPD009 | Apenas 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
| Campo | Tabela | Descrição |
|---|---|---|
ST_BLOQUEIASERIAL | PARMFATUR | Flag S/N que liga/desliga o bloqueio do status do serial quando ele tem pedido de origem |
STATUS | SERIAL (via tabSERIAL em MNF002) | Status do serial (livre, vendido, bloqueado, etc.) — é este campo que fica read-only |
NR_PEDIDO | NOTA (em MNF002 via tabNOTANR_PEDIDO) | Número do pedido que originou a nota; é o gatilho do bloqueio — só bloqueia quando preenchido |
ST_PEDVENDA | PARMFATUR | Modalidade 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_SERIAL | SERIAL | Número de série individual listado na tela frmSERIAL |
Opções disponíveis
S - Sim (Bloqueia Status do Serial quando Há Pedido)
| O que faz | Detalhe |
|---|---|
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)
- Em MFA001 → aba Faturamento → campo "Bloq. Serial do Pedido" → selecione Sim
- Salve os parâmetros (F6)
- Garanta que
ST_PEDVENDAesteja emS/L/D/V(Venda / Loja / Direta / Venda-Direta) — caso contrário o botão "Marcar" continua visível - Gere um pedido de venda em MPD002 contendo produtos serializados e selecione os seriais (tabela
ITEMPEDIDOSERIAL) - Faça o faturamento do pedido gerando uma NF-e em MNF002 (
NOTA.NR_PEDIDOfica preenchido com o nº do pedido) - Edite a NF-e recém-gerada e abra a tela de seleção de seriais (
frmSERIAL) - Resultado esperado:
- Ao navegar entre os seriais, a coluna
STATUSfica 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
- Ao navegar entre os seriais, a coluna
- 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 faz | Detalhe |
|---|---|
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 serial | Continuam inalteradas (TP_SERIAL, ST_VENDIDO, etc. seguem sendo aplicados pelas demais rotinas) |
| Risco | O 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
- Em MFA001 → "Bloq. Serial do Pedido" → selecione Não
- Salve os parâmetros (F6)
- Gere um pedido em MPD002 com itens serializados e faturamento em MNF002 (mesmo cenário de antes)
- Abra a tela
frmSERIALem MNF002 - Resultado esperado:
- A coluna
STATUSpermanece editável — o operador consegue trocar o status diretamente na grade - O botão "Marcar" é exibido — é possível marcar/desmarcar seriais manualmente na nota
- A coluna
- 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 (
AfterInsertdotabPARMFATURem UdmMFA001.pas linha 488 define'N').
Regras complementares
- O bloqueio só entra em ação quando
NOTA.NR_PEDIDOestá preenchido. Em notas sem pedido de origem (NR_PEDIDOvazio), o status continua editável mesmo com o parâmetro em'S'(UdmMNF002.pas linha 8621). - O parâmetro
ST_PEDVENDAatua 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ção | Descrição | STATUS read-only em MNF002? | Botão "Marcar" escondido? | Afeta outros módulos? |
|---|---|---|---|---|
| S | Sim | Sim (quando NOTA.NR_PEDIDO preenchido) | Sim (quando ST_PEDVENDA IN ('S','L','D','V')) | Não |
| N | Não (padrão) | Não | Não | Não |
Referências no Código Fonte
MFA001 (configuração)
source/MFA001/UMFA001.dfmlinha 6971–6998 — ComboBoxcmbST_BLOQUEIASERIALcomDataField = 'ST_BLOQUEIASERIAL',Items.Strings = ('Sim'#9'S', 'Não'#9'N'),Style = csDropDownList,MapList = True,DataSource = dmMFA001.dsPARMFATURsource/MFA001/UMFA001.dfmlinha 6186–6200 —Label15comCaption = 'Bloq. Serial do Pedido'eFocusControl = cmbST_BLOQUEIASERIALsource/MFA001/UMFA001.paslinha 392 — declaraçãocmbST_BLOQUEIASERIAL: TwwDBComboBoxsource/MFA001/UdmMFA001.dfmlinha 1164–1169 —TStringFieldtabPARMFATURST_BLOQUEIASERIAL(FieldNameST_BLOQUEIASERIAL, FixedChar, Size = 1)source/MFA001/UdmMFA001.dfmlinhas 145, 2381, 2540, 2755, 3025 —ST_BLOQUEIASERIALpresente nos SQLs de SELECT/INSERT/UPDATE da query persistidaqryParmFatursource/MFA001/UdmMFA001.paslinha 141 — declaraçãotabPARMFATURST_BLOQUEIASERIAL: TStringFieldsource/MFA001/UdmMFA001.paslinha 488 —AfterInsert:tabPARMFATURST_BLOQUEIASERIAL.AsString := 'N'(valor padrão)
MNF002 (Manutenção de NF-e) — regras de negócio
source/MNF002/UdmMNF002.paslinha 8617–8626 — proceduretabSERIALAfterScroll:if (parmfatur.values['ST_BLOQUEIASERIAL'] = 'S') thenbeginif ( Trim(dmMNF002.tabNOTANR_PEDIDO.AsString) <> '' ) thentabSERIALSTATUS.ReadOnly := TrueelsetabSERIALSTATUS.ReadOnly := False;end;source/MNF002/USERIAL2.paslinha 248–257 — procedureTfrmSERIAL.FormCreate:if (parmfatur.values['ST_BLOQUEIASERIAL'] = 'S') thenbeginif ( (parmfatur.values['ST_PEDVENDA'] = 'S') or (parmfatur.values['ST_PEDVENDA'] = 'L') or(parmfatur.values['ST_PEDVENDA'] = 'D') or (parmfatur.values['ST_PEDVENDA'] = 'V') ) thenbtnMarca.Visible := false;end;source/MNF002/UdmMNF002.paslinha 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.paslinha 762 —ST_BLOQUEIASERIALno SELECT de parâmetrossource/MCO006/UdmMCO006.paslinha 2106 —ST_BLOQUEIASERIALno SELECT de parâmetrossource/RCA006/UdmRCA006.dfmlinhas 3081, 3145, 3248, 3352 — campo declarado noTFDQueryde parâmetros (sem regra de negócio)source/CPD009/UdmCPD009.dfmlinhas 332, 396, 499, 603 — campo declarado noTFDQueryde parâmetros (sem regra de negócio)
Scripts SQL
- Grep em
D:/Desenvolvimento/JunsoftERP_V2/Scripts/→ 0 ocorrências. Nenhuma procedure/trigger/view referenciaST_BLOQUEIASERIAL.