NR_DIASATRASO - Limite padrão de dias em atraso para bloqueio por inadimplência
Tela: MFA001 - Parâmetros de Faturamento
Localização: Parâmetros → Faturamento → Opção 2 (pagFatOp2 em UMFA001.dfm:3656-3657) → campo Dias de Atraso (label Label39 em UMFA001.dfm:3758-3772, posicionado em Left=29, Top=112)
Tabela: PARMFATUR.NR_DIASATRASO
Tipo: Numérico (inteiro, dias) — DOM_INTEGER no DDL (docs/schema/tables/PARMFATUR.sql:124); TIntegerField no client (UdmMFA001.dfm:1289-1293). Sem máscara no TDBEdit (UMFA001.dfm:4278-4294).
Valor padrão: NULL — o AfterInsert de tabPARMFATUR em UdmMFA001.pas não atribui default para este campo (o bloco de inicialização vai até UdmMFA001.pas:604 sem tocar em NR_DIASATRASO). Em base recém-criada o parâmetro nasce vazio e precisa ser preenchido manualmente para que a regra seja ativada.
Validação (MFA001): não há OnValidate em tabPARMFATURNR_DIASATRASO (confirmado por busca em UdmMFA001.pas:165 — só existe a declaração do field, nenhum handler). Qualquer inteiro é aceito (inclusive 0 e valores negativos, pois o tipo é INTEGER e o cliente não filtra).
O que o parâmetro faz
PARMFATUR.NR_DIASATRASO é o template/default de "limite de dias de atraso tolerados antes de bloquear" que o sistema copia para o cadastro de crédito (CREDITO) de cada pessoa na primeira vez em que ela é criada ou em que seu limite é atualizado pela análise de crédito.
A regra de bloqueio em tempo real (na hora de fechar o pedido/nota) não consulta PARMFATUR.NR_DIASATRASO — ela consulta CREDITO.NR_DIASATRASO (por cliente). O parâmetro da MFA001 funciona apenas como semente nos seguintes pontos:
TRGAI_PESSOA (trigger AFTER INSERT em PESSOA): ao criar uma pessoa nova, o trigger lê PARMFATUR.NR_DIASATRASO da empresa logada e insere o valor em CREDITO.NR_DIASATRASO (Scripts/TRGAI_PESSOA.sql:17-47). Se TP_LIMITECREDITO = 'S' (global), replica para todas as empresas; caso contrário, insere só na empresa atual.
CREDITOPERIODICO_AI0 e CREDITOPERIODICOGRUPO_AI0 (triggers em CREDITOPERIODICO / CREDITOPERIODICOGRUPO): quando a TFA002 (Análise de Crédito) insere um registro de período com DT_REGISTRO = '01.01.2000 00:00:00' e o limite é Global (TP_LIMITECREDITO = 'S'), os triggers propagam o novo período para as demais empresas, lendo PARMFATUR.NR_DIASATRASO para decidir o contexto (Scripts/CREDITOPERIODICO_AI0.sql:16-47, Scripts/CREDITOPERIODICOGRUPO_AI0.sql:16-47).
- TFA002 (cliente Delphi): na rotina de atualização de limite via DepsSmart, quando o usuário não preenche "Dias Último Período" e o
CREDITO.NR_DIASATRASO do cliente também está vazio, a tela faz um SELECT P.NR_DIASATRASO FROM PARMFATUR P como fallback final para popular o valor do novo período (UTFA002.pas:1915-1940).
Portanto, o parâmetro define a política default da empresa para quantos dias de atraso a mais uma duplicata pode estar antes de o sistema bloquear o próximo faturamento — valor que cada cliente herda no cadastro inicial, podendo depois ser alterado individualmente na CFC004 (Crédito do Cliente) ou pela TFA002.
Telas impactadas
| Módulo | Código | Papel |
|---|
| Parâmetros de Faturamento | MFA001 | Produtora — cadastra/edita o valor no campo edtNR_DIASATRASO (UMFA001.dfm:4278-4294), Opção 2 |
| Análise de Crédito | TFA002 | Consumidora (fallback) — em btnATUALIZARLIMITEClick, se CREDITO.NR_DIASATRASO do cliente estiver vazio, consulta PARMFATUR.NR_DIASATRASO para inicializar o novo período (UTFA002.pas:1923-1938) |
| Crédito do Cliente | CFC004 | Consumidora indireta — exibe/edita CREDITO.NR_DIASATRASO e CONTAS.NR_DIASATRASO por cliente; o valor inicial do CREDITO.NR_DIASATRASO veio do TRGAI_PESSOA que copiou de PARMFATUR.NR_DIASATRASO (UdmCFC004.dfm:793-797) |
| Config Permissão Usuário | ADM012 | Relacionada — configura PARMUSUARIO.NR_DIASATRASO (tolerância por usuário que libera), que é comparado com o atraso real na procedure VALIDA_MODELOBLOQUEIODIASATRASO (ver seção Interação abaixo) |
| Cadastro de Permissão | ADM013 | CRUD que inclui PM.NR_DIASATRASO (PARMUSUARIO) em SELECT/INSERT (UADM013.pas:475, 490, 523) |
| Produção | MEQ019 | Consulta CREDITO.NR_DIASATRASO (não PARMFATUR) para bloquear produção de pedido de cliente inadimplente (UMEQ019.pas:617-642) |
| Config Equipamentos | CEQ006 | Gera expressão COALESCE(C.NR_DIASATRASO,0) NR_DIASATRASO em procedure dinâmica a partir de CREDITO/VIEW_CREDITOPESSOA (UCEQ006.pas:612-616) |
| Bloqueio por Atraso | CFC008 | Tela de filtro/listagem que referencia NR_DIASATRASO ligado a NR_MAIORVENC (UCFC008.pas:803-805) |
| Bloqueio Modelo | CFC011 | Filtro com NR_DIASATRASO |
| Importação | JunsoftImportacao | Rotina PersistenciaDAO faz UPDATE OR INSERT INTO CREDITO (... NR_DIASATRASO ...) vindo do ERP de origem (PersistenciaDao.pas:463) |
Procedures impactadas
| Procedure / Trigger | Uso de PARMFATUR.NR_DIASATRASO |
|---|
TRGAI_PESSOA | Principal produtor de CREDITO.NR_DIASATRASO — ao criar pessoa, copia PARMFATUR.NR_DIASATRASO para CREDITO.NR_DIASATRASO de uma ou várias empresas (Scripts/TRGAI_PESSOA.sql) |
CREDITOPERIODICO_AI0 | Lê PARMFATUR.NR_DIASATRASO para decidir replicação global de períodos vindos da TFA002 (Scripts/CREDITOPERIODICO_AI0.sql) |
CREDITOPERIODICOGRUPO_AI0 | Mesma lógica para crédito de grupo de empresas (Scripts/CREDITOPERIODICOGRUPO_AI0.sql) |
TRGPARMFATUR_BU | Trigger BEFORE UPDATE em PARMFATUR: quando TP_MODELOBLOQUEIO muda para 'N' (sem modelo), zera PARMUSUARIO.NR_DIASATRASO de todos os usuários da empresa — efeito colateral sobre o parâmetro homônimo em PARMUSUARIO (Scripts/TRGPARMFATUR_BU.sql:7-14) |
VERIFICA_CREDITO | Consome CREDITO.NR_DIASATRASO (não PARMFATUR), mas é a peça que efetivamente bloqueia — documentada aqui porque PARMFATUR.NR_DIASATRASO alimenta o valor lido (Scripts/VERIFICA_CREDITO.sql:28, 49-56) |
VERIFICA_BLOQUEIO | Idem — consome VIEW_CREDITOPESSOA.NR_DIASATRASO, que retorna CREDITO.NR_DIASATRASO alimentado via TRGAI_PESSOA (Scripts/VERIFICA_BLOQUEIO.sql:700-837) |
VALIDA_MODELOBLOQUEIODIASATRASO | Procedure chamada pelo VERIFICA_BLOQUEIO; compara NR_DIASVENCIDOS com o limite por usuário (PARMUSUARIO.NR_DIASATRASO) e com o limite por cliente (entrada I_NR_DIASATRASO vinda de CREDITO.NR_DIASATRASO) (Scripts/VALIDA_MODELOBLOQUEIODIASATRASO.sql) |
GERA_CREDITO | Procedure com NR_DIASATRASO no corpo comentado — está toda inativa hoje (Scripts/GERA_CREDITO.sql:24-144 envolto em /* ... */) |
Campos envolvidos
| Campo | Tabela | Papel |
|---|
NR_DIASATRASO | PARMFATUR | Este parâmetro — default/template da empresa |
NR_DIASATRASO | CREDITO | Limite por cliente — é o que efetivamente trava o faturamento em VERIFICA_CREDITO/VERIFICA_BLOQUEIO. Nasce do PARMFATUR.NR_DIASATRASO via TRGAI_PESSOA |
NR_DIASATRASO | CREDITOPERIODICO / CREDITOPERIODICOGRUPO | Histórico de limites por período (TFA002) |
NR_DIASATRASO | PARMUSUARIO | Limite por usuário que libera — zerado automaticamente pelo TRGPARMFATUR_BU quando PARMFATUR.TP_MODELOBLOQUEIO = 'N' |
NR_MAIORVENC | CREDITO (e VIEW_CREDITOPESSOA) | Maior atraso real atual do cliente — comparado com CREDITO.NR_DIASATRASO na regra de bloqueio |
TP_LIMITECREDITO | PARMFATUR | 'S' = limite global (replica NR_DIASATRASO entre empresas); caso contrário, por empresa |
ST_BLOQUEIO | PESSOA | Modo de bloqueio do cliente — só com ST_BLOQUEIO in ('D','A','O','Q','B','Y','E','G') a regra de dias de atraso entra em vigor |
TP_MODELOBLOQUEIO | PARMFATUR | 'N' desliga todo o modelo e zera PARMUSUARIO.NR_DIASATRASO via trigger |
TP_VALIDALIMITEDIASATRASO | PARMFATUR | Parâmetro correlato em MFA001 que controla se a validação de dias de atraso é ativada no fluxo |
Comportamento / Regra
Valor = NULL (padrão / empresa recém-criada)
| Aspecto | Comportamento |
|---|
| Preenchimento em MFA001 | Campo nasce vazio no AfterInsert (UdmMFA001.pas:590-605) |
Efeito em TRGAI_PESSOA | Ao criar nova pessoa, o INSERT INTO CREDITO (..., NR_DIASATRASO ...) grava NULL em CREDITO.NR_DIASATRASO (Scripts/TRGAI_PESSOA.sql:34-48) |
Efeito em VERIFICA_CREDITO (Scripts/VERIFICA_CREDITO.sql:49) | A condição if (V_ST_BLOQUEIO in ('D','A','O')) and (I_NR_DIASATRASO is not null) cai para false → o bloco de bloqueio por dias de atraso é totalmente pulado |
Efeito em TFA002 (UTFA002.pas:1936-1938) | DiasUltimoPeriodo := Resultado[2] também recebe vazio → o campo NR_DIASATRASO do período nasce nulo |
| Consequência prática | Nenhum cliente herda limite de atraso. A regra de bloqueio por inadimplência fica desligada sistemicamente até que o usuário preencha o parâmetro e rode a rotina que atualiza CREDITO (TFA002) ou cadastre pessoa nova |
Resultado esperado: NULL equivale a "não bloquear ninguém por dias de atraso". O cliente só poderá ser bloqueado por outros modos ('C' — limite de crédito, 'T' — crédito acumulado, 'L' — liquidação tardia).
Valor = 0
| Aspecto | Comportamento |
|---|
| Cadastro em MFA001 | Aceito (sem OnValidate) |
Em TRGAI_PESSOA | CREDITO.NR_DIASATRASO = 0 para toda pessoa nova |
Em VERIFICA_CREDITO linha 49-56 | I_NR_DIASATRASO is not null é true → entra no bloco; if I_NR_DIASATRASO < I_NR_MAIORVENC compara 0 < dias_reais |
| Consequência prática | Basta o cliente ter qualquer duplicata com 1 dia de atraso (NR_MAIORVENC >= 1) para o bloqueio disparar. É o modo "zero tolerância" |
Mensagem (VERIFICA_CREDITO.sql:51-53) | "A Pessoa possui Duplicatas com Atraso acima do Limite. Dias da Duplicata em Atraso.: <NR_MAIORVENC>. Limite de Dias para Atraso..: 0" |
Resultado esperado: bloqueio imediato em inadimplência. Diferente de NULL: NULL desliga a regra; 0 a torna estrita.
Valor > 0 (ex.: 5)
| Aspecto | Comportamento |
|---|
| Cadastro em MFA001 | Aceito |
Em TRGAI_PESSOA | CREDITO.NR_DIASATRASO = 5 para toda pessoa nova |
Em VERIFICA_CREDITO | Compara 5 < NR_MAIORVENC (maior atraso real da pessoa). Só bloqueia quando o atraso real ultrapassa os 5 dias de tolerância |
| Consequência prática | Cliente ganha 5 dias de "carência" após vencimento antes de ser tratado como inadimplente para fins de faturamento |
Simulação passo a passo
Pré-requisitos do cenário:
PARMFATUR.NR_DIASATRASO = 5 (definido em MFA001, Opção 2).
PARMFATUR.TP_LIMITECREDITO = 'E' (limite por empresa).
PARMFATUR.TP_MODELOBLOQUEIO = 'S' (modelo de bloqueio ativo).
- Cliente novo "João" sendo cadastrado na TPO001 com
PESSOA.ST_BLOQUEIO = 'D' (bloqueio por dias de atraso).
- Parâmetro do pedido:
PEDIDO.ST_CONDPAGTO <> 'V' (não é venda à vista).
- Cadastro da pessoa (TPO001 → commit
INSERT INTO PESSOA):
- Trigger
TRGAI_PESSOA dispara.
- Lê
PARMFATUR.NR_DIASATRASO = 5 (Scripts/TRGAI_PESSOA.sql:17-22).
- Insere em
CREDITO da empresa logada: CREDITO.NR_DIASATRASO = 5 (Scripts/TRGAI_PESSOA.sql:43-48).
- Gera-se uma duplicata (NF com parcela
CONTAS.DT_VENCIMENTO = 2026-04-10).
- Dia 2026-04-13 (3 dias de atraso): operador tenta fechar novo pedido para João.
- O fluxo chama
VERIFICA_CREDITO(CD_EMPRESA, CD_PESSOA, 'X', 'D', 1000).
VIEW_CREDITOPESSOA retorna I_NR_DIASATRASO = 5, I_NR_MAIORVENC = 3.
- Condição
5 < 3 → false → não bloqueia. Pedido passa.
- Dia 2026-04-16 (6 dias de atraso):
I_NR_DIASATRASO = 5, I_NR_MAIORVENC = 6.
- Condição
5 < 6 → true → V_DS_BLOQUEIO = 'A Pessoa possui Duplicatas com Atraso acima do Limite. Dias da Duplicata em Atraso.: 6. Limite de Dias para Atraso..: 5'.
- O fluxo cliente (MPD002/MNF002/MEQ019) apresenta a mensagem e bloqueia/exige liberação.
- Financeiro muda individualmente
CREDITO.NR_DIASATRASO = 15 para João via CFC004:
- A próxima chamada de
VERIFICA_CREDITO compara 15 < 6 → false → libera. O parâmetro PARMFATUR.NR_DIASATRASO = 5 não é reconsultado — a decisão é 100% do valor por cliente.
Resultado esperado: o parâmetro define a tolerância inicial em dias que cada cliente carrega ao ser cadastrado. Ajustes individuais em CFC004/TFA002 sobrescrevem o default sem afetar o parâmetro, e ajustes posteriores no parâmetro não retroagem para clientes já existentes (apenas afetam clientes novos e novos períodos vindos da TFA002 quando o campo estiver vazio).
| Aspecto | PARMFATUR.NR_DIASATRASO (MFA001) | CREDITO.NR_DIASATRASO (por cliente) |
|---|
| Escopo | Empresa (CD_EMPRESA) | Empresa + Pessoa (CD_EMPRESA, CD_PESSOA) |
| Quem preenche | Usuário em MFA001 | TRGAI_PESSOA (default = PARMFATUR), ou CFC004/TFA002 (override manual) |
| Quem lê no bloqueio | Ninguém lê em tempo de pedido/NF | VERIFICA_CREDITO (Scripts/VERIFICA_CREDITO.sql:27-56), VERIFICA_BLOQUEIO, MEQ019 |
| Fallback | Usado como fallback em TFA002 quando CREDITO.NR_DIASATRASO do cliente também está vazio (UTFA002.pas:1923-1938) | É a fonte da verdade no momento do bloqueio |
| Atualização retroativa | Não — mudar MFA001 depois de cadastrado o cliente não altera os CREDITO.NR_DIASATRASO já existentes | Sim — cada alteração em CFC004/TFA002 altera imediatamente o comportamento da validação |
:::warning Parâmetro MFA001 não é suficiente sozinho
Preencher PARMFATUR.NR_DIASATRASO não habilita o bloqueio por dias de atraso para os clientes que já existiam antes. É necessário: (a) rodar TFA002/CFC004 para preencher CREDITO.NR_DIASATRASO de cada cliente, ou (b) confiar que apenas clientes cadastrados depois da parametrização terão o valor correto (via TRGAI_PESSOA).
:::
:::info Homônimo em PARMUSUARIO
Existe um outro parâmetro PARMUSUARIO.NR_DIASATRASO (cadastrado em ADM012) que representa o "quantos dias além do limite do cliente este usuário pode liberar". Ele é consumido pela procedure VALIDA_MODELOBLOQUEIODIASATRASO (Scripts/VALIDA_MODELOBLOQUEIODIASATRASO.sql:30-76). Esse parâmetro por usuário é zerado automaticamente pelo trigger TRGPARMFATUR_BU sempre que alguém muda PARMFATUR.TP_MODELOBLOQUEIO para 'N' (sem modelo) na MFA001 — portanto, alterar TP_MODELOBLOQUEIO na MFA001 tem efeito colateral nos usuários.
:::
Referências no Código Fonte
Delphi — MFA001 (cadastro do parâmetro)
| Arquivo | Linhas | Papel |
|---|
source/MFA001/UMFA001.dfm | 3758-3772 | TLabel Label39 com Caption = 'Dias de Atraso', FocusControl = edtNR_DIASATRASO, dentro de pagFatOp2 (Opção 2) |
source/MFA001/UMFA001.dfm | 4278-4294 | TDBEdit edtNR_DIASATRASO com DataField = 'NR_DIASATRASO', DataSource = dmMFA001.dsPARMFATUR, TabOrder = 8 |
source/MFA001/UdmMFA001.pas | 165 | Declaração tabPARMFATURNR_DIASATRASO: TIntegerField (sem OnValidate) |
source/MFA001/UdmMFA001.dfm | 1289-1293 | Field definition — apenas Alignment = taCenter, sem DefaultExpression, sem OnValidate |
source/MFA001/UdmMFA001.dfm | 173, 2392, 2556, 2775, 3053 | Inclusão de NR_DIASATRASO em SELECT/INSERT/UPDATE da tabela PARMFATUR |
source/MFA001/UdmMFA001.pas | 590-605 | Bloco tabPARMFATURAfterInsert termina sem atribuir valor a NR_DIASATRASO — nasce NULL |
Delphi — TFA002 (consumidor fallback)
| Arquivo | Linhas | Papel |
|---|
source/TFA002/UTFA002.pas | 1923-1940 | Em btnATUALIZARLIMITEClick, fallback final: SELECT P.CD_EMPRESA, P.VL_CREDITO, P.NR_DIASATRASO FROM PARMFATUR P WHERE P.CD_EMPRESA = ... — usado quando cdsDepsSmart e CREDITO do cliente não forneceram o valor |
Delphi — demais consumidores (via CREDITO, não PARMFATUR)
| Arquivo | Linhas | Papel |
|---|
source/MEQ019/UMEQ019.pas | 617-642 | Lê CREDITO.NR_DIASATRASO + VIEW_CREDITOPESSOA.NR_MAIORVENC para bloquear produção |
source/CFC004/UCFC004.dfm | 586, 730-739 | Grid de duplicatas + TDBEdit edtNR_DIASATRASO (edita CREDITO.NR_DIASATRASO por cliente) |
source/CFC004/UdmCFC004.dfm | 564-569, 793-797, 860-883 | Fields tabCONTASNR_DIASATRASO (calculado) e tabCREDITONR_DIASATRASO (persistido) + SQL INSERT/UPDATE em CREDITO |
source/CFC004/UCFC004.pas | 323 | Expressão CAST(DATEDIFF(DAY, CONTAS.DT_VENCIMENTO, COALESCE(CONTAS.DT_LIQUIDACAO, CURRENT_DATE)) AS INTEGER) NR_DIASATRASO — dias de atraso calculados em tempo real (não é o parâmetro) |
source/CFC008/UCFC008.pas | 803-805 | Filtro de listagem; observação: monta cláusula and NR_MAIORVENC = <valor> usando o campo NR_DIASATRASO do filtro (confusão de nomes na tela) |
source/CEQ006/UCEQ006.pas | 612-616 | Monta expressão SQL dinâmica com COALESCE(C.NR_DIASATRASO,0) a partir de CREDITO / VIEW_CREDITOPESSOA |
source/ADM012/ (UADM012.pas/dfm + UdmADM012.pas/dfm) | vários | CRUD de PARMUSUARIO.NR_DIASATRASO — parâmetro homônimo por usuário, validado em tabPARMUSUARIONR_DIASATRASOValidate (UdmADM012.pas:730-734: rejeita <= 0) |
source/ADM013/UADM013.pas | 475, 490, 523 | CRUD de permissões incluindo PM.NR_DIASATRASO (PARMUSUARIO) |
source/JunsoftImportacao/PersistenciaDAO/PersistenciaDao.pas | 463 | Rotina de importação persiste CREDITO.NR_DIASATRASO vindo do ERP origem |
DDL
docs/schema/tables/PARMFATUR.sql:124 — NR_DIASATRASO DOM_INTEGER, (permite NULL, sem default SQL)
docs/schema/tables/CREDITO.sql:6 — NR_DIASATRASO DOM_INTEGER, (campo populado por TRGAI_PESSOA a partir de PARMFATUR)
docs/schema/tables/CREDITOPERIODICO.sql:8 — NR_DIASATRASO DOM_INTEGER,
docs/schema/tables/PARMUSUARIO.sql:32 — NR_DIASATRASO DOM_INTEGER,
SQL — Triggers/Procedures
| Arquivo | Linhas | Papel |
|---|
Scripts/TRGAI_PESSOA.sql | 7-50 | Principal consumidor — copia PARMFATUR.NR_DIASATRASO para CREDITO.NR_DIASATRASO no cadastro de nova pessoa, respeitando TP_LIMITECREDITO (global vs. por empresa) |
Scripts/CREDITOPERIODICO_AI0.sql | 1-50 | Trigger AFTER INSERT de CREDITOPERIODICO — lê PARMFATUR.NR_DIASATRASO da empresa para propagar período global entre empresas |
Scripts/CREDITOPERIODICOGRUPO_AI0.sql | 1-50 | Mesma lógica para grupo de empresas |
Scripts/TRGPARMFATUR_BU.sql | 1-22 | Trigger BEFORE UPDATE em PARMFATUR: se TP_MODELOBLOQUEIO = 'N', zera PARMUSUARIO.NR_DIASATRASO (homônimo) |
Scripts/VERIFICA_CREDITO.sql | 27-56 | Consome CREDITO.NR_DIASATRASO (não PARMFATUR) para bloqueio em tempo de faturamento |
Scripts/VERIFICA_BLOQUEIO.sql | 38, 700-837 | Consome VIEW_CREDITOPESSOA.NR_DIASATRASO e chama VALIDA_MODELOBLOQUEIODIASATRASO |
Scripts/VALIDA_MODELOBLOQUEIODIASATRASO.sql | 1-90 | Combina CREDITO.NR_DIASATRASO (entrada) com PARMUSUARIO.NR_DIASATRASO (tolerância do usuário) para decidir bloqueio final |
Scripts/GERA_CREDITO.sql | 24-144 | Corpo comentado — rotina inativa |