NR_ACESSOLIMITE - Limite de acessos do sócio ao clube durante a carência de inadimplência
Tela: MFA001 - Parâmetros de Faturamento Localização: Parâmetros → Faturamento → Opção 1 → campo Nº Limite de Acessos (label
Label7emUMFA001.dfm:2492-2505, posicionado emLeft=26, Top=295) Tabela:PARMFATUR.NR_ACESSOLIMITETipo: Numérico (inteiro) —DOM_INTEGERno DDL;TIntegerFieldno client. Sem máscara/formatação específica noTDBEdit. Valor padrão:NULL(oAfterInsertdetabPARMFATURemUdmMFA001.pas:434-...não atribui valor inicial — o registro nasce sem limite configurado) Validação (MFA001):tabPARMFATURNR_ACESSOLIMITEValidate(UdmMFA001.pas:2048-2052) rejeita valores negativos com a mensagem"Informe um Número de Acessos Maior que Zero. Verifique!". Valor0passa; qualquer inteiro positivo passa.
O que o parâmetro faz
NR_ACESSOLIMITE é o limite de entradas (catracadas) que um sócio inadimplente pode fazer no clube durante a janela de carência controlada por NR_MAIORVENC (tela CFC001 / PARMCONTAS.NR_MAIORVENC — tolerância máxima de dias em atraso antes do bloqueio definitivo).
Quando o sócio chega à portaria (MPD055) e possui contas vencidas, o sistema faz duas verificações em cascata:
- Carência por dias: compara o maior atraso do sócio (
iNR_DIASATRASO, obtido deVIEW_CREDITOPESSOA) com o teto de dias tolerados (iNR_MAIORVENC). Se o atraso ainda está dentro da tolerância, vai para o passo 2. - Carência por acessos: conta quantas vezes o sócio já entrou no clube (
MOVTOENTRADA×PESSOAENTRADA) desde o vencimento mais antigo em aberto e compara comNR_ACESSOLIMITE.- Se
entradas_desde_menor_vencimento >= NR_ACESSOLIMITE→ContaVencida := true→ acesso bloqueado (tratado nos passos seguintes do fluxo). - Caso contrário → o sistema emite aviso informando quantos acessos ainda restam e libera a entrada.
- Se
Portanto, o parâmetro funciona como um teto duplo junto com NR_MAIORVENC: enquanto o sócio estiver inadimplente, ele ganha ou NR_MAIORVENC dias ou NR_ACESSOLIMITE entradas, o que vencer primeiro.
Telas impactadas
| Módulo | Código | Papel |
|---|---|---|
| Parâmetros de Faturamento | MFA001 | Produtora — cadastra/edita o valor no campo edtNR_ACESSOLIMITE (UMFA001.dfm:3253-3272) |
| Controle de Acesso do Clube | MPD055 | Única consumidora real. Lê P.NR_ACESSOLIMITE de PARMFATUR em edtCD_PESSOAExit (UMPD055.pas:900-907) e usa na validação de inadimplência |
| Config Pedido | CPD009 | Apenas inclui o campo em SELECT/INSERT/UPDATE de PARMFATUR (UdmCPD009.dfm:327, 391, 492, 597) — não consome o valor |
| Relatório/Config Recap | RCA006 | Apenas inclui o campo em SELECT/INSERT/UPDATE de PARMFATUR (UdmRCA006.dfm:3076, 3140, 3241, 3346) — não consome o valor |
Procedures impactadas
Nenhuma procedure SQL (Scripts/*.sql) referencia NR_ACESSOLIMITE. Toda a lógica é feita no cliente Delphi, em MPD055.
Campos envolvidos
| Campo | Tabela | Papel |
|---|---|---|
NR_ACESSOLIMITE | PARMFATUR | Limite de entradas do sócio inadimplente (este parâmetro) |
NR_MAIORVENC | PARMCONTAS (consultado via VIEW_CREDITOPESSOA) | Tolerância em dias de atraso — teto alternativo |
NR_DIASATRASO | VIEW_CREDITOPESSOA | Maior atraso atual do sócio (calculado) |
DT_VENCIMENTO | CONTAS | Menor vencimento em aberto do sócio — define o ponto de partida do contador de acessos |
NR_MOVTOENTRADA / DT_ENTRADA | MOVTOENTRADA | Registro de cada entrada de sócio no clube |
CD_PESSOA | PESSOAENTRADA | Liga a entrada ao sócio |
CD_PESSOA / ST_CONTAS / TP_CONTAS | CONTAS | Seleciona apenas contas a receber em aberto (TP_CONTAS = 'S', ST_CONTAS IN ('T','P')) |
TP_VALIDACAOUSUARIO | (runtime MPD055) | Quando = 'E' (Portaria), o fluxo bloqueia/libera efetivamente o acesso; em outros tipos, apenas avisa |
Comportamento / Regra
Valor = NULL (padrão)
| Aspecto | Comportamento |
|---|---|
| Preenchimento em MFA001 | Campo nasce vazio no AfterInsert |
| Efeito em MPD055 (linha 906) | IF (Resultado[0] <> '') then iNR_ACESSOS := Resultado[0]; — a variável permanece '' |
| Efeito na validação (linha 965) | if (dmMPD055.iNR_ACESSOS <> '') then begin ... end; — todo o bloco de contagem de acessos é pulado |
| Consequência prática | Enquanto o sócio estiver dentro da carência em dias (NR_DIASATRASO < NR_MAIORVENC), não há limite de entradas. Ele só será bloqueado quando o atraso exceder NR_MAIORVENC. |
Resultado esperado: a carência de inadimplência passa a ser unidimensional (só por dias). O contador de acessos é desligado.
Valor = 0
| Aspecto | Comportamento |
|---|---|
Validação em tabPARMFATURNR_ACESSOLIMITEValidate | Aceita (a regra é if AsInteger < 0 then raise; 0 passa) |
| Efeito em MPD055 | iNR_ACESSOS = '0'. Na comparação (linha 969) if (StrToInt(Resultado[0]) >= StrToInt(dmMPD055.iNR_ACESSOS)), qualquer contagem >= 0 dispara ContaVencida := true |
| Consequência prática | Basta o sócio ter uma conta vencida (com DT_VENCIMENTO < hoje) e qualquer registro anterior em MOVTOENTRADA — na prática equivale a "zero tolerância de acessos durante inadimplência" |
Resultado esperado: inadimplentes ficam bloqueados desde a primeira entrada após o primeiro vencimento em aberto, mesmo estando ainda dentro da carência em dias. Não é o mesmo que NULL: NULL desliga a checagem e 0 a torna estrita.
:::warning Mensagem da validação é inconsistente com o comportamento
A mensagem "Informe um Número de Acessos Maior que Zero" sugere que 0 seria proibido, mas a condição real é < 0. O valor 0 é aceito e tem o efeito descrito acima.
:::
Valor > 0 (ex.: 3)
| Aspecto | Comportamento |
|---|---|
| Contador | MPD055 executa um SELECT COUNT(NR_MOVTOENTRADA) FROM MOVTOENTRADA INNER JOIN PESSOAENTRADA ... WHERE DT_ENTRADA >= menor_vencimento_em_aberto AND CD_PESSOA = :sócio (UMPD055.pas:947-963) |
| Comparação | if (Count >= NR_ACESSOLIMITE) then ContaVencida := true else avisa e libera |
| Mensagem de aviso (quando ainda há folga) | "O Sócio possui pendências financeiras! Ele poderá realizar mais <N> acessos ao Clube!" com N = NR_ACESSOLIMITE - Count |
| Bloqueio (quando atingiu o limite) | ContaVencida := true — o sócio é tratado como bloqueado pela rotina de validação de contas (efeito final no fluxo da portaria) |
Simulação passo a passo
Pré-requisitos do cenário:
PARMFATUR.NR_ACESSOLIMITE = 3(definido em MFA001).PARMCONTAS.NR_MAIORVENC = 15(p.ex.).- Sócio com 1 conta vencida há 5 dias (ou seja, ainda dentro de
NR_MAIORVENC). - Sócio configurado em
SOCIOCLIENTE. - Operador da portaria com
TP_VALIDACAOUSUARIO = 'E'.
- Em MFA001 → Parâmetros → Faturamento → Opção 1 → informe
Nº Limite de Acessos = 3. Salve (F6). - Na portaria (MPD055), o sócio chega com carteirinha. O operador digita
CD_PESSOAe sai do campo (edtCD_PESSOAExit). - O sistema consulta
VIEW_CREDITOPESSOA→NR_DIASATRASO = 5,NR_MAIORVENC = 15→ passa pela carência em dias (5 < 15). - O sistema consulta
PARMFATUR.NR_ACESSOLIMITE→iNR_ACESSOS = '3'. - O sistema conta quantas vezes o sócio entrou desde o menor
DT_VENCIMENTOem aberto:- 1ª tentativa de entrada após o vencimento:
Count = 0.0 >= 3 → false. Exibe aviso:"O Sócio possui pendências financeiras! Ele poderá realizar mais 3 acessos ao Clube!"e libera a entrada. - 2ª:
Count = 1.1 >= 3 → false. Aviso:"... mais 2 acessos ...". Libera. - 3ª:
Count = 2.2 >= 3 → false. Aviso:"... mais 1 acessos ...". Libera. - 4ª:
Count = 3.3 >= 3 → true.ContaVencida := true→ o bloco seguinte da rotina de validação trata como inadimplente bloqueado (a mensagem subsequente é a do fluxo padrão de conta vencida em portaria, não a de "ainda pode N acessos").
- 1ª tentativa de entrada após o vencimento:
Resultado esperado: o sócio consegue NR_ACESSOLIMITE entradas após o vencimento enquanto ainda estiver dentro da carência em dias; na (NR_ACESSOLIMITE+1)-ésima tentativa, a portaria bloqueia.
Interações com outros parâmetros
NR_MAIORVENC(PARMCONTAS, tela CFC001) — teto em dias que coexiste comNR_ACESSOLIMITE. O sócio é bloqueado quando qualquer um dos dois limites for ultrapassado (dias ou acessos).NR_DIASATRASO(calculado pelaVIEW_CREDITOPESSOA) — o contador de acessos só é consultado enquantoNR_DIASATRASO < NR_MAIORVENC. Se já passou dos dias, o bloqueio é direto e o parâmetroNR_ACESSOLIMITEnão é sequer avaliado.TP_VALIDACAOUSUARIO(configuração do usuário operador) — controla se a portaria usa o fluxo de sócio/dependente (= 'E') ou apenas exibe avisos (o fluxo que realmente chamaContaVencida := trueé o ramo'E').
Referências no Código Fonte
Delphi — MFA001 (cadastro do parâmetro)
| Arquivo | Linhas | Papel |
|---|---|---|
source/MFA001/UMFA001.dfm | 2492-2505 | TLabel Label7 com Caption = 'Nº Limite de Acessos', FocusControl = edtNR_ACESSOLIMITE |
source/MFA001/UMFA001.dfm | 3253-3272 | TDBEdit edtNR_ACESSOLIMITE com DataField = 'NR_ACESSOLIMITE', DataSource = dmMFA001.dsPARMFATUR, dentro de pagPARMAMETROS → pagAmbos (Faturamento) → pagFatOp1 (Opção 1) |
source/MFA001/UMFA001.pas | 244 | Declaração edtNR_ACESSOLIMITE: TDBEdit |
source/MFA001/UdmMFA001.pas | 134 | Declaração tabPARMFATURNR_ACESSOLIMITE: TIntegerField |
source/MFA001/UdmMFA001.pas | 402 | Assinatura procedure tabPARMFATURNR_ACESSOLIMITEValidate(Sender: TField) |
source/MFA001/UdmMFA001.pas | 2048-2052 | Corpo do OnValidate (bloqueia < 0 com JException 'W-0000') |
source/MFA001/UdmMFA001.pas | 434-... | tabPARMFATURAfterInsert não atribui default (campo nasce NULL) |
source/MFA001/UdmMFA001.dfm | 139, 1124-1128, 2377, 2534, 2748, 3019 | SELECT/INSERT/UPDATE de PARMFATUR incluindo o campo e definição do TIntegerField |
Delphi — MPD055 (consumidora real)
| Arquivo | Linhas | Papel |
|---|---|---|
source/MPD055/UdmMPD055.pas | 121 | Declaração da variável iNR_ACESSOS: String no data module |
source/MPD055/UMPD055.pas | 900-907 | Leitura do parâmetro: SELECT P.NR_ACESSOLIMITE FROM PARMFATUR P WHERE P.CD_EMPRESA = ... → popula dmMPD055.iNR_ACESSOS somente se não vazio |
source/MPD055/UMPD055.pas | 947-979 | Uso do parâmetro: conta entradas desde o menor vencimento em aberto e compara com iNR_ACESSOS; define ContaVencida := true ao atingir o limite ou exibe aviso "O Sócio possui pendências financeiras! Ele poderá realizar mais N acessos ao Clube!" |
Delphi — outros arquivos (CRUD de PARMFATUR, sem lógica de consumo)
| Arquivo | Linhas | Papel |
|---|---|---|
source/CPD009/UdmCPD009.dfm | 327, 391, 492, 597 | SELECT/INSERT/UPDATE de PARMFATUR inclui NR_ACESSOLIMITE — sem uso funcional |
source/RCA006/UdmRCA006.dfm | 3076, 3140, 3241, 3346 | SELECT/INSERT/UPDATE de PARMFATUR inclui NR_ACESSOLIMITE — sem uso funcional |
DDL
docs/schema/tables/PARMFATUR.sql:94—NR_ACESSOLIMITE DOM_INTEGER,(semNOT NULL, sem default → permiteNULL).
SQL — Procedures
Nenhuma stored procedure em Scripts/ referencia NR_ACESSOLIMITE (grep em Scripts/ retornou zero matches). A regra inteira é executada no lado cliente, em UMPD055.pas.