Pular para o conteúdo principal

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_EXCLUIPRODNF Valor 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/grid tabITEMNOTA, botão Excluir / F7). Quando ligado, qualquer clique em "Excluir Produto" na NF abre o form TfrmAUTORIZACAO (arquivo UMNF002AUTORIZACAO.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óduloCódigoDescrição
Parâmetros FaturamentoMFA001Tela onde o parâmetro é configurado (ComboBox cmbST_EXCLUIPRODNF, UMFA001.dfm linha 7015)
Manutenção de NF-eMNF002Ú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 FiscaisMNF008Apenas carrega o campo no SELECT geral de parâmetros (UdmMNF008.pas linha 771) — sem regra adicional
Consulta de MovimentosMCO006Apenas 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​

CampoTabelaDescrição
ST_EXCLUIPRODNFPARMFATURFlag S/N que liga/desliga a exigência de autorizador na exclusão de itens de NF
LOGINNOTA (via tabNOTALOGIN em MNF002)Campo temporário da NF onde o form de autorização grava o login informado; validado contra AUTORIZADOR.CD_AUTORIZADOR
SENHANOTA (via tabNOTASENHA em MNF002)Campo temporário onde o form grava a senha informada; validada contra USUARIO.SN_USUARIO do autorizador
CD_AUTORIZADORAUTORIZADORChave do usuário habilitado a autorizar operações (join com USUARIO)
ST_ATIVOAUTORIZADORSe o autorizador está ativo; se 'N', bloqueia com "O Usuário Autorizador Não Esta Ativo!"
SN_USUARIOUSUARIOSenha do usuário, comparada com o que foi digitado no form
PS_PEDIDO, QT_PEDIDAITEMNOTACampos 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 fazDetalhe
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ções1º 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-effectApó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)​

  1. Em MFA001 → aba Ambos → Opção 1 → campo "Solicita Autorizador na Exclusão de Produtos" → selecione Sim
  2. Salve os parâmetros (F6)
  3. Cadastre um Autorizador em AUTORIZADOR (via TFA008 ou equivalente) vinculado a um USUARIO existente, com ST_ATIVO = 'S' e senha conhecida
  4. Abra MNF002 e edite uma NF-e que tenha itens não vindos de pedido (campos PS_PEDIDO e QT_PEDIDA vazios em ITEMNOTA)
  5. Navegue até a grid de itens (tabITEMNOTA) e clique em Excluir (F7) sobre um item
  6. 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]"
  7. Se o item que você tentar excluir veio de pedido (tiver PS_PEDIDO/QT_PEDIDA preenchidos), 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 fazDetalhe
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 continuamO 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.
RiscoQualquer 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​

  1. Em MFA001 → "Solicita Autorizador na Exclusão de Produtos" → selecione Não
  2. Salve os parâmetros (F6)
  3. Abra MNF002 e edite uma NF-e com itens
  4. Selecione um item em tabITEMNOTA e clique em Excluir (F7)
  5. Resultado esperado:
    • O form de autorização não aparece
    • O item é excluído imediatamente (desde que não tenha PS_PEDIDO/QT_PEDIDA preenchidos)
    • dmMNF002.idAutorizador permanece 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 (AfterInsert do tabPARMFATUR em 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óprio btnExcluirClick tem fluxos específicos).
  • O btnExcluirClick em MNF002 só consulta ST_EXCLUIPRODNF quando Navegacao.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_PEDIDO ou ITEMNOTA.QT_PEDIDA estiverem preenchidos, o sistema aborta com "Este Produto está Associado a um Pedido..." independentemente do valor de ST_EXCLUIPRODNF.
  • O form TfrmAUTORIZACAO (arquivo UMNF002AUTORIZACAO.pas) é específico do MNF002; ele reutiliza campos voláteis tabNOTALOGIN/tabNOTASENHA do próprio dataset da NF para carregar os valores digitados e os limpa no FormClose (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çãoDescriçãoAbre form de autorização em MNF002?Pode excluir sem autorizador?Afeta outros módulos?
SSimSim (quando item não veio de pedido)NãoNão
NNão (padrão)NãoSimNão

Referências no Código Fonte​

MFA001 (configuração)​

  • source/MFA001/UMFA001.dfm linha 7015–7041 — ComboBox cmbST_EXCLUIPRODNF com DataField = 'ST_EXCLUIPRODNF', Items.Strings = ('Sim'#9'S', 'Não'#9'N'), Style = csDropDownList, MapList = True, DataSource = dmMFA001.dsPARMFATUR
  • source/MFA001/UMFA001.dfm linha 6216–6229 — Label25 com Caption = 'Solicita Autorizador na Exclusão de Produtos' (posicionado acima do ComboBox, dentro de pagFatOp1 → Ambos → Opção 1)
  • source/MFA001/UMFA001.pas linha 394 — declaração cmbST_EXCLUIPRODNF: TwwDBComboBox
  • source/MFA001/UdmMFA001.dfm linha 1218–1223 — TStringField tabPARMFATURST_EXCLUIPRODNF (FieldName ST_EXCLUIPRODNF, FixedChar, Size = 1, Origin "PARMFATUR"."ST_EXCLUIPRODNF")
  • source/MFA001/UdmMFA001.dfm linhas 159, 2387, 2549, 2765, 3039 — ST_EXCLUIPRODNF presente nos SQLs de SELECT/INSERT/UPDATE da query persistida qryParmFatur
  • source/MFA001/UdmMFA001.pas linha 152 — declaração tabPARMFATURST_EXCLUIPRODNF: TStringField
  • source/MFA001/UdmMFA001.pas linha 493 — AfterInsert: tabPARMFATURST_EXCLUIPRODNF.AsString := 'N' (valor padrão)

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

  • source/MNF002/UMNF002.pas linha 5547–5573 — procedure TfrmMNF002.btnExcluirClick (bloco de exclusão de tabITEMNOTA):
    if (Navegacao.Name = 'tabITEMNOTA') then
    begin
    {Verifica se o Produto Possui Pedido}
    if ((Trim(dmMNF002.tabITEMNOTAPS_PEDIDO.AsString) <> '') or
    (Trim(dmMNF002.tabITEMNOTAQT_PEDIDA.AsString) <> '')) then
    Raise 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') then
    begin
    formAutorizacao := TfrmAUTORIZACAO.Create(Application);
    formAutorizacao.Caption := 'Autorização para Exclusão';
    Modal := formAutorizacao.ShowModal;
    FreeAndNil(formAutorizacao);

    if (Modal = mrCancel) then
    raise JException.Create('W-0000', ['Exclusão Cancelada!']);
    end;
    ...
    end;
  • source/MNF002/UMNF002AUTORIZACAO.pas — form TfrmAUTORIZACAO usado pelo bloco acima:
    • linha 44–86 — btnConfirmarClick: valida AUTORIZADOR.CD_AUTORIZADOR + AUTORIZADOR.ST_ATIVO + senha contra USUARIO.SN_USUARIO; em sucesso grava dmMNF002.idAutorizador e seta ModalResult := mrOk
    • linha 88–92 — btnCancelaClick: fecha com ModalResult := mrCancel
    • linha 94–98 — FormClose: limpa tabNOTALOGIN/tabNOTASENHA
  • source/MNF002/UdmMNF002.pas linha 10506 — campo P.ST_EXCLUIPRODNF incluído no SELECT de carga dos parâmetros de faturamento do módulo (query que alimenta ParmFatur.Values[...])

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

  • source/MNF008/UdmMNF008.pas linha 771 — P.ST_EXCLUIPRODNF no SELECT de parâmetros de faturamento
  • source/MCO006/UdmMCO006.pas linha 2115 — P.ST_EXCLUIPRODNF no SELECT de parâmetros de faturamento

Scripts SQL​

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