Pular para o conteúdo principal

Exige Autorizador ao Abrir/Cancelar Cupom no MNF017

Tela de configuração: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Notas Fiscais → Parâmetros de Notas → "Autorizador[MNF017]" Tabela: PARMFATUR.ST_AUTORIZAFECHAMENTO Valor padrão: N (Não - não exige autorizador)

Telas impactadas​

MóduloCódigoDescrição
Cupom de Venda RápidaMNF017Única tela consumidora - controla se é necessário um Autorizador para iniciar um novo cupom (btnNovo / F5) e para confirmar o cancelamento da venda (confirmacaoFechamento)

Observação: o grep em source/ mostra que fora de MFA001 apenas a tela MNF017 consome ST_AUTORIZAFECHAMENTO. As demais referências do próprio MFA001 apenas persistem/carregam o valor na PARMFATUR.

Procedures impactadas​

Nenhuma ocorrência de ST_AUTORIZAFECHAMENTO em Scripts/ (0 ocorrências). O parâmetro é puramente client-side - a regra é implementada apenas no Delphi da MNF017.

Campos envolvidos​

CampoDescrição
PARMFATUR.ST_AUTORIZAFECHAMENTOParâmetro principal (S/N)
PARMFATUR.CD_LIBERACAOUsuário com poder de liberação (lido junto no mesmo SELECT)
AUTORIZADOR.CD_AUTORIZADORUsuário cadastrado como autorizador
AUTORIZADOR.ST_ATIVOSe o autorizador está ativo (validado no login do autorizador)
USUARIO.CD_USUARIO / USUARIO.SN_USUARIOLogin e senha conferidos na tela modal de autorização

Variáveis Delphi envolvidas em MNF017:

  • dmMNF017.iST_AUTORIZADOR - recebe o conteúdo de ST_AUTORIZAFECHAMENTO (apesar do nome curioso, o campo lido é ST_AUTORIZAFECHAMENTO).
  • dmMNF017.iAutoriza - '1' se o próprio usuário logado já é autorizador ativo (então a tela de autorização é dispensada), '0' caso contrário.
  • dmMNF017.flagAutorizador - flag que garante que a autorização seja solicitada somente uma vez por sessão de cupom.

Opções disponíveis​

S - Sim (exige autorizador)​

O que fazDetalhe
Exige autorizador?SIM, sempre que o usuário logado não for ele mesmo um autorizador ativo
Tela exibidaTUMNF017formAutorizadorForm (login + senha do autorizador, com campo de motivo)
Fluxos afetados(1) Início de novo cupom via btnNovoClick / F5 - exige autorizador antes de liberar a inserção de itens; (2) Cancelamento / fechamento da venda via confirmacaoFechamento (ao fechar a tela com cupom em andamento)
Dispensa de loginSe o próprio usuário logado já está cadastrado como AUTORIZADOR com ST_ATIVO = 'S' (iAutoriza = '1'), a tela modal não é aberta
Consequência ao cancelarSe TUMNF017formAutorizadorForm.ModalResult <> mrOk, a função Autorizador devolve False e o fluxo (novo cupom ou fechamento) é abortado
Log geradoGeraLogMNF017('LA', 'Realizado Login Autorizador') ao confirmar; GeraLogMNF017('FT', 'Fechamento da Tela') ao fechar com cupom cancelado

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Notas Fiscais → Parâmetros de Notas → "Autorizador[MNF017]" = Sim
  2. Salve os parâmetros (F6)
  3. Cadastre pelo menos um usuário em AUTORIZADOR com ST_ATIVO = 'S'
  4. Faça login na MNF017 com um usuário comum (que NÃO seja autorizador)
  5. Cenário A - Iniciar novo cupom: clique em btnNovo (F5) → se iAutoriza = '0' (usuário logado não é autorizador ativo) e flagAutorizador ainda permitir, abre TUMNF017formAutorizadorForm pedindo login + senha do autorizador
  6. Informe login e senha de um autorizador válido → btnOKClick valida em AUTORIZADOR e USUARIO.SN_USUARIO → ModalResult := mrOk → função Autorizador devolve True → cupom segue
  7. Se cancelar a tela de login (ESC / btnCancelar) → ModalResult <> mrOk → Autorizador := False → a inserção é abortada
  8. Cenário B - Fechar com cupom em aberto: com itens no grid, feche a tela → FormCloseQuery chama confirmacaoFechamento → pergunta "Deseja Cancelar a Venda?" → se confirmar e iST_AUTORIZADOR = 'S' e iAutoriza = '0', abre novamente TUMNF017formAutorizadorForm
  9. Só após autorização, são gerados os logs CC (Cancelamento do Cupom, se havia itens) e FT (Fechamento da Tela) e o cupom é efetivamente descartado

Resultado esperado: nenhum cupom novo pode ser aberto nem cancelado na MNF017 sem que um autorizador (usuário cadastrado em AUTORIZADOR com ST_ATIVO = 'S') confirme login e senha, impedindo que um operador comum descarte vendas iniciadas sem conferência.


N - Não (não exige autorizador) - padrão​

O que fazDetalhe
Exige autorizador?NÃO - o teste if (dmMNF017.iST_AUTORIZADOR = 'S') falha e Autorizador nunca é chamada
Tela exibidaNenhuma
FluxobtnNovoClick libera a inserção imediatamente; confirmacaoFechamento só pergunta "Deseja Cancelar a Venda?" e prossegue
Risco operacionalQualquer operador com acesso à MNF017 pode iniciar um cupom novo sobrescrevendo o atual ou cancelar uma venda em andamento sem rastreabilidade de autorização (só sobra o log CC/FT)

Simulação passo a passo​

  1. Vá em MFA001 → Parâmetros → Notas Fiscais → Parâmetros de Notas → "Autorizador[MNF017]" = Não
  2. Salve os parâmetros (F6)
  3. Abra a MNF017 com um usuário comum
  4. Clique em btnNovo (F5) → nenhuma tela de autorização aparece - o cupom é liberado direto para inserção de itens
  5. Adicione itens, tente fechar a tela (ESC / btnSair) → confirmacaoFechamento pergunta "Deseja Cancelar a Venda?" → ao confirmar, o cupom é descartado sem qualquer solicitação de autorizador
  6. Os logs CC (se havia itens) e FT são gravados em nome do próprio operador

Resultado esperado: operação mais ágil em ambientes onde o caixa é o próprio responsável. Útil em cenários de auto-atendimento ou operador único, mas reduz o controle de segregação de função.


Tabela Comparativa Resumida​

ValorExige Autorizador?Tela ModalDispensa se usuário logado é autorizador ativo?Fluxos Afetados em MNF017Fallback se Cancelar
SSimTUMNF017formAutorizadorFormSim (via iAutoriza = '1')btnNovoClick (F5) e confirmacaoFechamento (fechar tela/cancelar venda)Autorizador := False → operação abortada
N (padrão)Não-N/AMesmos fluxos seguem diretoNão aplicável

Referências no Código Fonte​

Tela de configuração (MFA001)​

  • source/MFA001/UMFA001.dfm:6315-6327 - object lbl55: TLabel com Caption = 'Autorizador[MNF017] ' (label do combo)
  • source/MFA001/UMFA001.dfm:7223-7249 - object cmbST_AUTORIZADOR: TwwDBComboBox com DataField = 'ST_AUTORIZAFECHAMENTO' e Items.Strings = ('Sim'#9'S', 'Não'#9'N')
  • Combo está dentro de pagParametrosNF (linha 5925, Caption "Parâmetros de Notas"), sob pagNota (linha 5909, Caption "Notas Fiscais"), sob pagPARMAMETROS (linha 2142, Caption "&Parâmetros")
  • source/MFA001/UdmMFA001.pas:205 - declaração tabPARMFATURST_AUTORIZAFECHAMENTO: TStringField;
  • source/MFA001/UdmMFA001.pas:521 - valor padrão em AfterInsert: tabPARMFATURST_AUTORIZAFECHAMENTO.AsString := 'N';
  • source/MFA001/UdmMFA001.dfm:1523-1528 - definição do TStringField (Size = 1, FixedChar = True)
  • source/MFA001/UdmMFA001.dfm:212, 2407, 2573, 2804, 3092 - inclusão em SELECT, INSERT, UPDATE da PARMFATUR

Tela consumidora (MNF017)​

  • source/MNF017/UdmMNF017.pas:287 - declaração das variáveis públicas iST_IPOSTOPEDIDO, iCalculaIMP, iST_AUTORIZADOR, iAutoriza, ... no data module
  • source/MNF017/UdmMNF017.pas:298 - declaração de flagVlDesconto, flagAutorizador: Boolean;
  • source/MNF017/UMNF017.pas:108 - forward declaration da função local Autorizador: Boolean;
  • source/MNF017/UMNF017.pas:165 - ST_AUTORIZAFECHAMENTO incluído no SELECT dos parâmetros (FormShow):
    ' CD_MOVSAIDA, P.ST_IMPOSTOPEDIDO, P.ST_AUTORIZAFECHAMENTO, ST_OBSCLIENTE, ST_LOGINBLOQUEIO, '
  • source/MNF017/UMNF017.pas:204 - atribuição: dmMNF017.iST_AUTORIZADOR := Resultado[30]; (apesar do nome da variável, o valor vem de ST_AUTORIZAFECHAMENTO)
  • source/MNF017/UMNF017.pas:237-242 - consulta complementar que define dmMNF017.iAutoriza:
    Consult := 'SELECT Count(A.CD_AUTORIZADOR) '+#10+
    'FROM AUTORIZADOR A '+#10+
    'WHERE A.CD_AUTORIZADOR = '+ Nulo(sessao.usuario.cd_usuario,'S') +#10+
    'AND A.ST_ATIVO = ''S''';
    ResultC := ExecutaConsulta(dmMNF017.transaction , Consult);
    dmMNF017.iAutoriza := resultC[0];
  • source/MNF017/UMNF017.pas:504-515 - função Autorizador: Boolean que cria e exibe TUMNF017formAutorizadorForm modalmente
  • source/MNF017/UMNF017.pas:567-607 - function TfrmMNF017.confirmacaoFechamento: boolean; usado por FormCloseQuery:
    if (Result) then
    begin
    if (dmMNF017.iST_AUTORIZADOR = 'S') then
    if (dmMNF017.iAutoriza = '0') then
    Result := Autorizador;
    ...
    end;
  • source/MNF017/UMNF017.pas:680-689 - btnNovoClick (F5) - chamada antes de iniciar um cupom novo:
    if (dmMNF017.iST_AUTORIZADOR = 'S') then
    begin
    if (dmMNF017.iAutoriza = '0') then
    begin
    if (dmMNF017.flagAutorizador) then
    begin
    iaux := Autorizador;
    end;
    end;
    end;

Formulário de autorização (TUMNF017formAutorizadorForm)​

  • source/MNF017/UMNF017formAutorizador.pas:12-33 - declaração da classe com grpAutorizador, btnOK, btnCancelar, edtLogin, edtSenha, memoMOTIVO
  • source/MNF017/UMNF017formAutorizador.pas:43-50 - FormKeyDown: F6 confirma, ESC cancela
  • source/MNF017/UMNF017formAutorizador.pas:102-145 - btnOKClick valida:
    • Login e senha obrigatórios (W-0000)
    • SELECT A.ST_ATIVO, A.CD_AUTORIZADOR FROM AUTORIZADOR A INNER JOIN USUARIO U ... → se ST_ATIVO = 'N' lança W-0000 ("O Usuário Autorizador Não Esta Ativo! [TFA008]"); se não encontrar, lança "O Usuário Não é Autorizador, Verifique! [TFA008]"
    • SELECT U.CD_USUARIO FROM USUARIO U WHERE U.SN_USUARIO = :senha AND U.CD_USUARIO = :login → se vazio, "Senha Inválida!, Verifique! [ADM001]"
    • Em caso de sucesso: GeraLogMNF017('LA', 'Realizado Login Autorizador') e ModalResult := mrOk
  • source/MNF017/UMNF017formAutorizador.pas:147-152 - FormCreate abre dmMNF017.tabLogin em modo Edit (onde login/senha são digitados via DBEdit)

Scripts SQL​

  • Nenhuma ocorrência de ST_AUTORIZAFECHAMENTO em Scripts/ - o parâmetro não é consumido por procedures, triggers ou views; a regra é 100% client-side no Delphi da MNF017.