PC_MAXDESCONTO — Percentual Máximo de Desconto do Usuário
Tela de configuração: ADM012 — Parâmetros do Usuário
Tabela:PARMUSUARIO.PC_MAXDESCONTO
Tipo:NUMERIC(15,2)
Valor padrão:NULL(não definido)
Faixa aceita:0,00a100,00(percentual)
Telas impactadas
| Tela | Nome | Como é impactada |
|---|---|---|
| ADM012 | Parâmetros do Usuário | Campo editável para definir o desconto máximo por usuário |
| MFA001 | Parâmetros de Faturamento | TP_MODELOBLOQUEIO define o modelo que decide como PC_MAXDESCONTO é avaliado |
| TFA008 | Autorizador | Autorização de desconto excedente combinada com este parâmetro |
Campos envolvidos
| Campo | Tabela | Tipo | Observação |
|---|---|---|---|
PC_MAXDESCONTO | PARMUSUARIO | NUMERIC(15,2) | Percentual máximo de desconto permitido ao usuário |
TP_MODELOBLOQUEIO | PARMFATUR | CHAR(1) | Define o modelo de bloqueio: N (Normal), L (Alçada com atualização), A (Alçada pura) |
PC_MAXIMOUSUARIO | — | NUMERIC(15,2) | Parâmetro de desconto máximo passado nas rotinas de validação (pode vir de outro campo) |
ST_HABILITADESCMAXSUBGRUPO | PARMUSUARIO | CHAR(1) | Habilita desconto máximo por subgrupo (ver VALIDA_BLOQDESCMAXSUBGRUPO) |
Opções disponíveis
Este parâmetro não tem opções predefinidas — ele aceita um valor numérico percentual. O comportamento depende de estar preenchido ou NULL e do modelo de bloqueio configurado.
| O que faz | Detalhe |
|---|---|
Valor preenchido (ex: 15,00) | Define o teto percentual de desconto que o usuário pode conceder. Se o desconto ultrapassar esse valor E o PC_MAXIMOUSUARIO também for ultrapassado, o bloqueio é acionado no modelo Alçada (A). |
| Valor NULL | No modelo Alçada (A), não há verificação de teto adicional — apenas o PC_MAXIMOUSUARIO é considerado. Nos modelos N e L, o campo é ignorado. |
Desconto dentro do limite
Simulação passo a passo
- Acesse ADM012 — Parâmetros do Usuário.
- Localize o campo PC_MAXDESCONTO e informe
15,00(15%). - Salve o registro.
- Ao emitir um pedido ou nota fiscal, aplique um desconto de
10,00%em um item. - O sistema valida o desconto e permite a operação normalmente.
Resultado esperado: Nenhum bloqueio — o desconto de 10% está abaixo do teto de 15% parametrizado.
Desconto acima do limite (modelo Alçada A)
Simulação passo a passo
- Acesse MFA001 — Parâmetros de Faturamento e configure
TP_MODELOBLOQUEIO = 'A'(modelo Alçada). - Acesse ADM012 — Parâmetros do Usuário e informe
PC_MAXDESCONTO = 15,00. - Suponha que o
PC_MAXIMOUSUARIO(teto geral do usuário) seja10,00. - Emita um pedido aplicando desconto de
20,00%em um item. - O desconto de 20% ultrapassa tanto o
PC_MAXIMOUSUARIO(10%) quanto oPC_MAXDESCONTO(15%). - O sistema registra o bloqueio:
O_TP_BLOQUEIO = 'U'eO_TP_BLOQUEIOALCADA = 'P'. - A mensagem de erro é exibida: "O Percentual de Desconto do Usuário está acima do Máximo Permitido. Desconto Concedido(%).: 20,00. Desconto Permitido(%).: 10,00".
Resultado esperado: O desconto é bloqueado e o documento exige autorização via TFA008 para ser liberado.
Exceção / Importante: No modelo Alçada (
A), o bloqueio porPC_MAXDESCONTOsó ocorre quando o desconto ultrapassa ambos os limites (PC_MAXIMOUSUARIOEPC_MAXDESCONTO). SePC_MAXDESCONTOestáNULL, apenas oPC_MAXIMOUSUARIOé verificado. Exemplo: comPC_MAXIMOUSUARIO = 10,00ePC_MAXDESCONTO = NULL, um desconto de 20% ultrapassa oPC_MAXIMOUSUARIOe gera bloqueio simples ('U'), mas não geraO_TP_BLOQUEIOALCADA = 'P'.
Desconto acima do limite (modelo Normal N ou Alçada com crédito L)
Simulação passo a passo
- Acesse MFA001 — Parâmetros de Faturamento e configure
TP_MODELOBLOQUEIO = 'N'(modelo Normal). - Acesse ADM012 — Parâmetros do Usuário (o valor de
PC_MAXDESCONTOé ignorado neste modelo). - Emita um pedido com desconto acima do
PC_MAXIMOUSUARIO. - O sistema valida apenas comparando o desconto com
PC_MAXIMOUSUARIO.
Resultado esperado: Se o desconto ultrapassar o PC_MAXIMOUSUARIO, o bloqueio 'U' é gerado. O campo PC_MAXDESCONTO não interfere nos modelos N e L.
Validacao de faixa na tela ADM012
Simulação passo a passo
- Acesse ADM012 — Parâmetros do Usuário.
- Tente informar
PC_MAXDESCONTO = 110,00(acima de 100). - O sistema exibe a mensagem: "O percentual de desconto deve ser menor que 100,00%!".
- Tente informar
PC_MAXDESCONTO = -5,00(negativo). - O sistema exibe a mesma mensagem: "O percentual de desconto deve ser menor que 100,00%!".
- Informe
PC_MAXDESCONTO = 15,00e salve.
Resultado esperado: A validação rejeita valores menores que 0 ou maiores que 100, aceitando apenas a faixa de 0,00 a 100,00.
Duplicação de usuário (ADM013)
Simulação passo a passo
- Acesse ADM013 — Manutenção de Usuários.
- Selecione um usuário existente que possui
PC_MAXDESCONTO = 12,00. - Clique no botão Duplicar Usuário.
- Informe os dados do novo usuário e salve.
Resultado esperado: O novo usuário recebe o mesmo valor de PC_MAXDESCONTO (12,00) copiado do usuário original, junto com os demais parâmetros.
Regra Geral de Autorização
O fluxo de bloqueio de desconto segue esta lógica (procedimento VALIDA_MODELOBLOQUEIOPCDESCMAX):
Modelo (TP_MODELOBLOQUEIO) | Verifica PC_MAXDESCONTO? | Comportamento |
|---|---|---|
N (Normal) | Não | Bloqueia se desconto > PC_MAXIMOUSUARIO |
L (Alçada com crédito) | Não | Igual ao Normal, mas também gera O_TP_BLOQUEIOALCADA = 'P' |
A (Alçada pura) | Sim (se preenchido) | Bloqueia se desconto > PC_MAXIMOUSUARIO E desconto > PC_MAXDESCONTO; gera ambos 'U' e 'P' |
A (Alçada pura, PC_MAXDESCONTO = NULL) | Não | Bloqueia apenas se desconto > PC_MAXIMOUSUARIO |
Tabela Comparativa Resumida
| Cenário | TP_MODELOBLOQUEIO | PC_MAXDESCONTO | Desconto aplicado | Resultado |
|---|---|---|---|---|
| 1 | N | 15,00 | 10% | ✅ Liberado |
| 2 | N | 15,00 | 20% | 🔒 Bloqueio 'U' (ignora os 15%, compara com PC_MAXIMOUSUARIO) |
| 3 | A | 15,00 | 10% | ✅ Liberado |
| 4 | A | 15,00 | 20% (PC_MAXIMOUSUARIO = 10%) | 🔒 Bloqueio 'U' + 'P' (passou ambos os tetos) |
| 5 | A | 15,00 | 12% (PC_MAXIMOUSUARIO = 10%) | 🔒 Bloqueio 'U' apenas (passou MAXIMOUSUARIO mas não MAXDESCONTO) |
| 6 | A | NULL | 20% (PC_MAXIMOUSUARIO = 10%) | 🔒 Bloqueio 'U' apenas (sem 'P', pois PC_MAXDESCONTO é nulo) |
| 7 | L | 15,00 | 20% (PC_MAXIMOUSUARIO = 10%) | 🔒 Bloqueio 'U' + 'P' (ignora PC_MAXDESCONTO, mas gera alcada por ser modelo L) |
Procedures impactadas
Rotinas Delphi com referência direta ao campo
| Rotina | Arquivo | Papel |
|---|---|---|
TdmADM012.tabPARMUSUARIOPC_MAXDESCONTOValidate | source/ADM012/UdmADM012.pas:739 | Validação no ADM012: aceita valores entre 0 e 100 |
TfrmADM013.btnDuplicaUsuarioClick | source/ADM013/UADM013.pas:475 | Copia o valor ao duplicar usuário no ADM013 |
Referências SQL diretas ao campo
| Procedure | Arquivo | Papel |
|---|---|---|
VALIDA_MODELOBLOQUEIOPCDESCMAX | Scripts/VALIDA_MODELOBLOQUEIOPCDESCMAX.sql:29 | Lê PC_MAXDESCONTO e compara com o desconto aplicado para decidir bloqueio |
VALIDA_LIBERACAOUSUARIO | Scripts/VALIDA_LIBERACAOUSUARIO.sql:39 | Lê PC_MAXDESCONTO como V_PC_DESCMAXLIBERACAO ao validar liberação de documentos |
TRGPARMFATUR_BU | Scripts/TRGPARMFATUR_BU.sql:12 | Trigger que reseta PC_MAXDESCONTO = NULL (possível limpeza em atualização de parâmetros) |
Candidatas por uso da tabela PARMUSUARIO
Estas procedures usam a tabela PARMUSUARIO mas não referenciam o campo PC_MAXDESCONTO literalmente. Não foi encontrado uso funcional direto do campo.
| Procedure/View | Arquivo |
|---|---|
CANCELA_NOTAFISCAL | Scripts/CANCELA_NOTAFISCAL.sql |
CONTROLE_CAIXA | Scripts/CONTROLE_CAIXA.sql |
GERA_ETIQUETABALANCA | Scripts/GERA_ETIQUETABALANCA.sql |
PERMISSAO_CAIXA | Scripts/PERMISSAO_CAIXA.sql |
RETORNA_IMPRESSORAUSUARIO | Scripts/RETORNA_IMPRESSORAUSUARIO.sql |
VALIDA_BLOQDESCMAXSUBGRUPO | Scripts/VALIDA_BLOQDESCMAXSUBGRUPO.sql |
VALIDA_CODIGOBARRA | Scripts/VALIDA_CODIGOBARRA.sql |
VALIDA_MODELOBLOQUEIODIASATRASO | Scripts/VALIDA_MODELOBLOQUEIODIASATRASO.sql |
VALIDA_MODELOBLOQUEIOVLLIMITE | Scripts/VALIDA_MODELOBLOQUEIOVLLIMITE.sql |
VIEW_DOCUMENTOSBLOQUEADOS | Scripts/VIEW_DOCUMENTOSBLOQUEADOS.sql |
Lacunas identificadas
VERIFICA_BLOQUEIO: A evidencia inicial indicou uma referênciaP.PC_MAXDESCONTOna linha 165, mas grep subsequente não confirmou o literal no arquivo. É possível que o campo seja lido viaSELECT ... INTOindireto ou que a referência seja de versão anterior do script. Sem impacto direto confirmado.PC_MAXIMOUSUARIO: Este parâmetro aparece como variável de entrada (I_PC_MAXIMOUSUARIO) nas validations, mas não foi possível identificar de qual campo da tabela ele é populado. Verificar rotinas que chamamVALIDA_MODELOBLOQUEIOPCDESCMAX.