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_AUTORIZAFECHAMENTOValor padrão:N(Não - não exige autorizador)
Telas impactadas
| Módulo | Código | Descrição |
|---|---|---|
| Cupom de Venda Rápida | MNF017 | Ú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
grepemsource/mostra que fora deMFA001apenas a tela MNF017 consomeST_AUTORIZAFECHAMENTO. As demais referências do próprioMFA001apenas persistem/carregam o valor naPARMFATUR.
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
| Campo | Descrição |
|---|---|
PARMFATUR.ST_AUTORIZAFECHAMENTO | Parâmetro principal (S/N) |
PARMFATUR.CD_LIBERACAO | Usuário com poder de liberação (lido junto no mesmo SELECT) |
AUTORIZADOR.CD_AUTORIZADOR | Usuário cadastrado como autorizador |
AUTORIZADOR.ST_ATIVO | Se o autorizador está ativo (validado no login do autorizador) |
USUARIO.CD_USUARIO / USUARIO.SN_USUARIO | Login e senha conferidos na tela modal de autorização |
Variáveis Delphi envolvidas em MNF017:
dmMNF017.iST_AUTORIZADOR- recebe o conteúdo deST_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 faz | Detalhe |
|---|---|
| Exige autorizador? | SIM, sempre que o usuário logado não for ele mesmo um autorizador ativo |
| Tela exibida | TUMNF017formAutorizadorForm (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 login | Se 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 cancelar | Se TUMNF017formAutorizadorForm.ModalResult <> mrOk, a função Autorizador devolve False e o fluxo (novo cupom ou fechamento) é abortado |
| Log gerado | GeraLogMNF017('LA', 'Realizado Login Autorizador') ao confirmar; GeraLogMNF017('FT', 'Fechamento da Tela') ao fechar com cupom cancelado |
Simulação passo a passo
- Vá em MFA001 → Parâmetros → Notas Fiscais → Parâmetros de Notas → "Autorizador[MNF017]" = Sim
- Salve os parâmetros (F6)
- Cadastre pelo menos um usuário em AUTORIZADOR com
ST_ATIVO = 'S' - Faça login na MNF017 com um usuário comum (que NÃO seja autorizador)
- Cenário A - Iniciar novo cupom: clique em
btnNovo(F5) → seiAutoriza = '0'(usuário logado não é autorizador ativo) eflagAutorizadorainda permitir, abreTUMNF017formAutorizadorFormpedindo login + senha do autorizador - Informe login e senha de um autorizador válido →
btnOKClickvalida emAUTORIZADOReUSUARIO.SN_USUARIO→ModalResult := mrOk→ funçãoAutorizadordevolveTrue→ cupom segue - Se cancelar a tela de login (ESC / btnCancelar) →
ModalResult <> mrOk→Autorizador := False→ a inserção é abortada - Cenário B - Fechar com cupom em aberto: com itens no grid, feche a tela →
FormCloseQuerychamaconfirmacaoFechamento→ pergunta "Deseja Cancelar a Venda?" → se confirmar eiST_AUTORIZADOR = 'S'eiAutoriza = '0', abre novamenteTUMNF017formAutorizadorForm - Só após autorização, são gerados os logs
CC(Cancelamento do Cupom, se havia itens) eFT(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 faz | Detalhe |
|---|---|
| Exige autorizador? | NÃO - o teste if (dmMNF017.iST_AUTORIZADOR = 'S') falha e Autorizador nunca é chamada |
| Tela exibida | Nenhuma |
| Fluxo | btnNovoClick libera a inserção imediatamente; confirmacaoFechamento só pergunta "Deseja Cancelar a Venda?" e prossegue |
| Risco operacional | Qualquer 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
- Vá em MFA001 → Parâmetros → Notas Fiscais → Parâmetros de Notas → "Autorizador[MNF017]" = Não
- Salve os parâmetros (F6)
- Abra a MNF017 com um usuário comum
- Clique em
btnNovo(F5) → nenhuma tela de autorização aparece - o cupom é liberado direto para inserção de itens - Adicione itens, tente fechar a tela (ESC / btnSair) →
confirmacaoFechamentopergunta "Deseja Cancelar a Venda?" → ao confirmar, o cupom é descartado sem qualquer solicitação de autorizador - Os logs
CC(se havia itens) eFTsã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
| Valor | Exige Autorizador? | Tela Modal | Dispensa se usuário logado é autorizador ativo? | Fluxos Afetados em MNF017 | Fallback se Cancelar |
|---|---|---|---|---|---|
| S | Sim | TUMNF017formAutorizadorForm | Sim (via iAutoriza = '1') | btnNovoClick (F5) e confirmacaoFechamento (fechar tela/cancelar venda) | Autorizador := False → operação abortada |
| N (padrão) | Não | - | N/A | Mesmos fluxos seguem direto | Não aplicável |
Referências no Código Fonte
Tela de configuração (MFA001)
source/MFA001/UMFA001.dfm:6315-6327-object lbl55: TLabelcomCaption = 'Autorizador[MNF017] '(label do combo)source/MFA001/UMFA001.dfm:7223-7249-object cmbST_AUTORIZADOR: TwwDBComboBoxcomDataField = 'ST_AUTORIZAFECHAMENTO'eItems.Strings = ('Sim'#9'S', 'Não'#9'N')- Combo está dentro de
pagParametrosNF(linha 5925, Caption "Parâmetros de Notas"), sobpagNota(linha 5909, Caption "Notas Fiscais"), sobpagPARMAMETROS(linha 2142, Caption "&Parâmetros") source/MFA001/UdmMFA001.pas:205- declaraçãotabPARMFATURST_AUTORIZAFECHAMENTO: TStringField;source/MFA001/UdmMFA001.pas:521- valor padrão emAfterInsert:tabPARMFATURST_AUTORIZAFECHAMENTO.AsString := 'N';source/MFA001/UdmMFA001.dfm:1523-1528- definição doTStringField(Size = 1,FixedChar = True)source/MFA001/UdmMFA001.dfm:212, 2407, 2573, 2804, 3092- inclusão emSELECT,INSERT,UPDATEdaPARMFATUR
Tela consumidora (MNF017)
source/MNF017/UdmMNF017.pas:287- declaração das variáveis públicasiST_IPOSTOPEDIDO, iCalculaIMP, iST_AUTORIZADOR, iAutoriza, ...no data modulesource/MNF017/UdmMNF017.pas:298- declaração deflagVlDesconto, flagAutorizador: Boolean;source/MNF017/UMNF017.pas:108- forward declaration da função localAutorizador: Boolean;source/MNF017/UMNF017.pas:165-ST_AUTORIZAFECHAMENTOincluído noSELECTdos 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 deST_AUTORIZAFECHAMENTO)source/MNF017/UMNF017.pas:237-242- consulta complementar que definedmMNF017.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çãoAutorizador: Booleanque cria e exibeTUMNF017formAutorizadorFormmodalmentesource/MNF017/UMNF017.pas:567-607-function TfrmMNF017.confirmacaoFechamento: boolean;usado porFormCloseQuery:if (Result) thenbeginif (dmMNF017.iST_AUTORIZADOR = 'S') thenif (dmMNF017.iAutoriza = '0') thenResult := Autorizador;...end;source/MNF017/UMNF017.pas:680-689-btnNovoClick(F5) - chamada antes de iniciar um cupom novo:if (dmMNF017.iST_AUTORIZADOR = 'S') thenbeginif (dmMNF017.iAutoriza = '0') thenbeginif (dmMNF017.flagAutorizador) thenbeginiaux := Autorizador;end;end;end;
Formulário de autorização (TUMNF017formAutorizadorForm)
source/MNF017/UMNF017formAutorizador.pas:12-33- declaração da classe comgrpAutorizador,btnOK,btnCancelar,edtLogin,edtSenha,memoMOTIVOsource/MNF017/UMNF017formAutorizador.pas:43-50-FormKeyDown: F6 confirma, ESC cancelasource/MNF017/UMNF017formAutorizador.pas:102-145-btnOKClickvalida:- Login e senha obrigatórios (W-0000)
SELECT A.ST_ATIVO, A.CD_AUTORIZADOR FROM AUTORIZADOR A INNER JOIN USUARIO U ...→ seST_ATIVO = 'N'lançaW-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')eModalResult := mrOk
source/MNF017/UMNF017formAutorizador.pas:147-152-FormCreateabredmMNF017.tabLoginem modo Edit (onde login/senha são digitados via DBEdit)
Scripts SQL
- Nenhuma ocorrência de
ST_AUTORIZAFECHAMENTOemScripts/- o parâmetro não é consumido por procedures, triggers ou views; a regra é 100% client-side no Delphi da MNF017.