Parâmetro de Solicitação de Autorizador na Exclusão de Item de NF
Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → campo "Solicita Autorizador na Exclusão de Produtos" Tabela:
PARMFATUR.ST_EXCLUIPRODNFValor padrão:N(Não)
O que é? Controla se o sistema exige login + senha de um usuário Autorizador (cadastrado em
AUTORIZADOR) toda vez que um operador tentar excluir um item de Nota Fiscal (MNF002, aba/gridtabITEMNOTA, botão Excluir / F7). Quando ligado, qualquer clique em "Excluir Produto" na NF abre o formTfrmAUTORIZACAO(arquivoUMNF002AUTORIZACAO.pas), com caption "Autorização para Exclusão"; sem autorização válida, a exclusão é abortada com a mensagem "Exclusão Cancelada!".
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Parâmetros Faturamento | MFA001 | Tela onde o parâmetro é configurado (ComboBox cmbST_EXCLUIPRODNF, UMFA001.dfm linha 7015) |
| Manutenção de NF-e | MNF002 | Único módulo com regra de negócio real. btnExcluirClick em tabITEMNOTA abre TfrmAUTORIZACAO quando o parâmetro = 'S' (UMNF002.pas linha 5564–5573) |
| Notas Fiscais | MNF008 | Apenas carrega o campo no SELECT geral de parâmetros (UdmMNF008.pas linha 771) — sem regra adicional |
| Consulta de Movimentos | MCO006 | Apenas carrega o campo no SELECT de parâmetros (UdmMCO006.pas linha 2115) — sem regra adicional |
Procedures impactadas
Nenhuma stored procedure/trigger da base referencia ST_EXCLUIPRODNF (grep em Scripts/ retorna zero ocorrências). A regra é 100% Delphi, executada somente em MNF002.
Campos envolvidos
| Campo | Tabela | Descrição |
|---|---|---|
ST_EXCLUIPRODNF | PARMFATUR | Flag S/N que liga/desliga a exigência de autorizador na exclusão de itens de NF |
LOGIN | NOTA (via tabNOTALOGIN em MNF002) | Campo temporário da NF onde o form de autorização grava o login informado; validado contra AUTORIZADOR.CD_AUTORIZADOR |
SENHA | NOTA (via tabNOTASENHA em MNF002) | Campo temporário onde o form grava a senha informada; validada contra USUARIO.SN_USUARIO do autorizador |
CD_AUTORIZADOR | AUTORIZADOR | Chave do usuário habilitado a autorizar operações (join com USUARIO) |
ST_ATIVO | AUTORIZADOR | Se o autorizador está ativo; se 'N', bloqueia com "O Usuário Autorizador Não Esta Ativo!" |
SN_USUARIO | USUARIO | Senha do usuário, comparada com o que foi digitado no form |
PS_PEDIDO, QT_PEDIDA | ITEMNOTA | Campos que impedem a exclusão antes de chegar na validação do autorizador — se o item veio de pedido, nem abre o form |
Opções disponíveis
S - Sim (Exige Autorizador na Exclusão de Itens de NF)
| O que faz | Detalhe |
|---|---|
| Abre form de autorização? | Sim. Em MNF002, toda exclusão de item da NF (tabITEMNOTA) dispara TfrmAUTORIZACAO.ShowModal (UMNF002.pas linha 5566) com caption "Autorização para Exclusão" |
| Quem pode autorizar? | Apenas usuários cadastrados em AUTORIZADOR e ativos (ST_ATIVO = 'S'). O CD_AUTORIZADOR precisa também existir em USUARIO (INNER JOIN, UMNF002AUTORIZACAO.pas linha 58) |
| Como valida a senha? | Compara o campo informado com USUARIO.SN_USUARIO do autorizador (UMNF002AUTORIZACAO.pas linha 72–81). Senha inválida → "Senha Inválida!, Verifique! [ADM001]" |
| Se o operador cancelar? | Clicar em Cancelar (ou fechar o form) retorna mrCancel; a exclusão é abortada com JException "Exclusão Cancelada!" (UMNF002.pas linha 5571–5572) |
| Afeta outros módulos? | Não. Demais módulos (MNF008, MCO006) apenas carregam o campo na query de parâmetros; não usam-no |
| Procedure / trigger? | Nenhuma. A restrição é puramente na UI Delphi |
| Ordem das validações | 1º verifica se o item veio de pedido (PS_PEDIDO/QT_PEDIDA) — se veio, nem chega na autorização (erro "Este Produto está Associado a um Pedido e não pode ser Excluído"). 2º só então abre o form de autorização |
| Side-effect | Após autorizar com sucesso, o CD_AUTORIZADOR informado é gravado em dmMNF002.idAutorizador (UMNF002AUTORIZACAO.pas linha 82) e fica registrado como quem autorizou a exclusão |
Simulação passo a passo (MNF002)
- Em MFA001 → aba Ambos → Opção 1 → campo "Solicita Autorizador na Exclusão de Produtos" → selecione Sim
- Salve os parâmetros (F6)
- Cadastre um Autorizador em
AUTORIZADOR(via TFA008 ou equivalente) vinculado a umUSUARIOexistente, comST_ATIVO = 'S'e senha conhecida - Abra MNF002 e edite uma NF-e que tenha itens não vindos de pedido (campos
PS_PEDIDOeQT_PEDIDAvazios emITEMNOTA) - Navegue até a grid de itens (
tabITEMNOTA) e clique em Excluir (F7) sobre um item - Resultado esperado:
- Abre o form
TfrmAUTORIZACAO(UMNF002AUTORIZACAO.pas) com caption "Autorização para Exclusão", exigindo Login e Senha - Digite login/senha de autorizador ativo e válido → item é excluído normalmente (seguem as rotinas de exclusão de
IMPOSTONOTA,ITEMNOTASEMENTE, locais, etc.) - Digite senha incorreta → erro "Senha Inválida!, Verifique! [ADM001]" e o item não é excluído
- Clique em Cancelar (ou feche o form) →
JException "Exclusão Cancelada!", o item permanece - Tente autorizar com usuário não cadastrado em AUTORIZADOR → "O Usuário Não é Autorizador, Verifique! [TFA008]"
- Tente autorizar com usuário cadastrado mas
ST_ATIVO = 'N'→ "O Usuário Autorizador Não Esta Ativo! [TFA008]"
- Abre o form
- Se o item que você tentar excluir veio de pedido (tiver
PS_PEDIDO/QT_PEDIDApreenchidos), o form de autorização nem chega a abrir — já bloqueia antes com "Este Produto está Associado a um Pedido e não pode ser Excluído"
Resultado esperado: nenhum item de NF é excluído sem que um usuário autorizador confirme com suas credenciais; o autorizador fica registrado em dmMNF002.idAutorizador para rastreabilidade.
N - Não (Padrão — Exclusão Livre)
| O que faz | Detalhe |
|---|---|
| Abre form de autorização? | Não. O bloco if (ParmFatur.Values['ST_EXCLUIPRODNF'] = 'S') em UMNF002.pas linha 5564 é pulado; a exclusão do item prossegue direto |
| Validações que continuam | O bloqueio de item vindo de pedido (PS_PEDIDO/QT_PEDIDA, UMNF002.pas linha 5559–5561) e as demais rotinas de limpeza (IMPOSTONOTA, ITEMNOTASEMENTE, ITEMNOTALOCAL, etc.) continuam sendo aplicadas normalmente |
| Afeta outros módulos? | Não. |
| Risco | Qualquer operador com acesso ao MNF002 consegue excluir itens da NF sem deixar um autorizador registrado — não há rastro de quem aprovou a exclusão |
Simulação passo a passo
- Em MFA001 → "Solicita Autorizador na Exclusão de Produtos" → selecione Não
- Salve os parâmetros (F6)
- Abra MNF002 e edite uma NF-e com itens
- Selecione um item em
tabITEMNOTAe clique em Excluir (F7) - Resultado esperado:
- O form de autorização não aparece
- O item é excluído imediatamente (desde que não tenha
PS_PEDIDO/QT_PEDIDApreenchidos) dmMNF002.idAutorizadorpermanece vazio — não há registro de autorizador
Resultado esperado: comportamento "aberto", sem controle adicional na exclusão de itens de NF — recomendado apenas para ambientes onde todo operador de NF já tem permissão plena, ou quando o rastreio de exclusões é feito por outro meio (log de auditoria externo, por exemplo).
Este é o valor padrão (
AfterInsertdotabPARMFATURem UdmMFA001.pas linha 493 define'N').
Regras complementares
- A validação só se aplica à exclusão de itens (
tabITEMNOTA) dentro do MNF002. Exclusão da NF inteira, de impostos, de seriais ou de locais não passa por este parâmetro (para impostos e locais o própriobtnExcluirClicktem fluxos específicos). - O
btnExcluirClickem MNF002 só consultaST_EXCLUIPRODNFquandoNavegacao.Name = 'tabITEMNOTA'(UMNF002.pas linha 5556). Para outros datasets (ex.:tabIMPOSTO), o fluxo é diferente e não dispara autorização por este parâmetro. - A checagem de item originado de pedido acontece antes da checagem do parâmetro (UMNF002.pas linha 5559–5561). Se
ITEMNOTA.PS_PEDIDOouITEMNOTA.QT_PEDIDAestiverem preenchidos, o sistema aborta com "Este Produto está Associado a um Pedido..." independentemente do valor deST_EXCLUIPRODNF. - O form
TfrmAUTORIZACAO(arquivoUMNF002AUTORIZACAO.pas) é específico do MNF002; ele reutiliza campos voláteistabNOTALOGIN/tabNOTASENHAdo próprio dataset da NF para carregar os valores digitados e os limpa noFormClose(UMNF002AUTORIZACAO.pas linha 94–98). - Após autorizar com sucesso,
dmMNF002.idAutorizador := tabNOTALOGIN.AsString(UMNF002AUTORIZACAO.pas linha 82) — o código do autorizador fica disponível para as demais rotinas do módulo (ex.: gravação em log / vinculação ao evento de exclusão). - Nenhuma procedure, trigger, view ou rotina SQL referencia
ST_EXCLUIPRODNF; é regra puramente Delphi. - Módulos consumidores "somente-leitura" (MNF008, MCO006) 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 | Abre form de autorização em MNF002? | Pode excluir sem autorizador? | Afeta outros módulos? |
|---|---|---|---|---|
| S | Sim | Sim (quando item não veio de pedido) | Não | Não |
| N | Não (padrão) | Não | Sim | Não |
Referências no Código Fonte
MFA001 (configuração)
source/MFA001/UMFA001.dfmlinha 7015–7041 — ComboBoxcmbST_EXCLUIPRODNFcomDataField = 'ST_EXCLUIPRODNF',Items.Strings = ('Sim'#9'S', 'Não'#9'N'),Style = csDropDownList,MapList = True,DataSource = dmMFA001.dsPARMFATURsource/MFA001/UMFA001.dfmlinha 6216–6229 —Label25comCaption = 'Solicita Autorizador na Exclusão de Produtos'(posicionado acima do ComboBox, dentro depagFatOp1→ Ambos → Opção 1)source/MFA001/UMFA001.paslinha 394 — declaraçãocmbST_EXCLUIPRODNF: TwwDBComboBoxsource/MFA001/UdmMFA001.dfmlinha 1218–1223 —TStringFieldtabPARMFATURST_EXCLUIPRODNF(FieldNameST_EXCLUIPRODNF, FixedChar, Size = 1, Origin"PARMFATUR"."ST_EXCLUIPRODNF")source/MFA001/UdmMFA001.dfmlinhas 159, 2387, 2549, 2765, 3039 —ST_EXCLUIPRODNFpresente nos SQLs de SELECT/INSERT/UPDATE da query persistidaqryParmFatursource/MFA001/UdmMFA001.paslinha 152 — declaraçãotabPARMFATURST_EXCLUIPRODNF: TStringFieldsource/MFA001/UdmMFA001.paslinha 493 —AfterInsert:tabPARMFATURST_EXCLUIPRODNF.AsString := 'N'(valor padrão)
MNF002 (Manutenção de NF-e) — regras de negócio
source/MNF002/UMNF002.paslinha 5547–5573 — procedureTfrmMNF002.btnExcluirClick(bloco de exclusão detabITEMNOTA):if (Navegacao.Name = 'tabITEMNOTA') thenbegin{Verifica se o Produto Possui Pedido}if ((Trim(dmMNF002.tabITEMNOTAPS_PEDIDO.AsString) <> '') or(Trim(dmMNF002.tabITEMNOTAQT_PEDIDA.AsString) <> '')) thenRaise JException.Create('W-0000', ['Este Produto está Associado a um Pedido e não pode ser Excluído.']);{Verifica se Pede Autorizador na Exclusão}if (ParmFatur.Values['ST_EXCLUIPRODNF'] = 'S') thenbeginformAutorizacao := TfrmAUTORIZACAO.Create(Application);formAutorizacao.Caption := 'Autorização para Exclusão';Modal := formAutorizacao.ShowModal;FreeAndNil(formAutorizacao);if (Modal = mrCancel) thenraise JException.Create('W-0000', ['Exclusão Cancelada!']);end;...end;source/MNF002/UMNF002AUTORIZACAO.pas— formTfrmAUTORIZACAOusado pelo bloco acima:- linha 44–86 —
btnConfirmarClick: validaAUTORIZADOR.CD_AUTORIZADOR+AUTORIZADOR.ST_ATIVO+ senha contraUSUARIO.SN_USUARIO; em sucesso gravadmMNF002.idAutorizadore setaModalResult := mrOk - linha 88–92 —
btnCancelaClick: fecha comModalResult := mrCancel - linha 94–98 —
FormClose: limpatabNOTALOGIN/tabNOTASENHA
- linha 44–86 —
source/MNF002/UdmMNF002.paslinha 10506 — campoP.ST_EXCLUIPRODNFincluído no SELECT de carga dos parâmetros de faturamento do módulo (query que alimentaParmFatur.Values[...])
Outros módulos (apenas mapeamento em SELECT, sem regra)
source/MNF008/UdmMNF008.paslinha 771 —P.ST_EXCLUIPRODNFno SELECT de parâmetros de faturamentosource/MCO006/UdmMCO006.paslinha 2115 —P.ST_EXCLUIPRODNFno SELECT de parâmetros de faturamento
Scripts SQL
- Grep em
D:/Desenvolvimento/JunsoftERP_V2/Scripts/→ 0 ocorrências. Nenhuma procedure/trigger/view referenciaST_EXCLUIPRODNF.