Pular para o conteúdo principal

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:

  1. 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.
  2. 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).
  3. 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óduloCódigoPapel
Parâmetros de FaturamentoMFA001Produtora — cadastra/edita o valor no campo edtNR_DIASATRASO (UMFA001.dfm:4278-4294), Opção 2
Análise de CréditoTFA002Consumidora (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 ClienteCFC004Consumidora 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árioADM012Relacionada — 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ãoADM013CRUD que inclui PM.NR_DIASATRASO (PARMUSUARIO) em SELECT/INSERT (UADM013.pas:475, 490, 523)
ProduçãoMEQ019Consulta CREDITO.NR_DIASATRASO (não PARMFATUR) para bloquear produção de pedido de cliente inadimplente (UMEQ019.pas:617-642)
Config EquipamentosCEQ006Gera 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 AtrasoCFC008Tela de filtro/listagem que referencia NR_DIASATRASO ligado a NR_MAIORVENC (UCFC008.pas:803-805)
Bloqueio ModeloCFC011Filtro com NR_DIASATRASO
ImportaçãoJunsoftImportacaoRotina PersistenciaDAO faz UPDATE OR INSERT INTO CREDITO (... NR_DIASATRASO ...) vindo do ERP de origem (PersistenciaDao.pas:463)

Procedures impactadas​

Procedure / TriggerUso de PARMFATUR.NR_DIASATRASO
TRGAI_PESSOAPrincipal 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_AI0Lê PARMFATUR.NR_DIASATRASO para decidir replicação global de períodos vindos da TFA002 (Scripts/CREDITOPERIODICO_AI0.sql)
CREDITOPERIODICOGRUPO_AI0Mesma lógica para crédito de grupo de empresas (Scripts/CREDITOPERIODICOGRUPO_AI0.sql)
TRGPARMFATUR_BUTrigger 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_CREDITOConsome 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_BLOQUEIOIdem — consome VIEW_CREDITOPESSOA.NR_DIASATRASO, que retorna CREDITO.NR_DIASATRASO alimentado via TRGAI_PESSOA (Scripts/VERIFICA_BLOQUEIO.sql:700-837)
VALIDA_MODELOBLOQUEIODIASATRASOProcedure 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_CREDITOProcedure com NR_DIASATRASO no corpo comentado — está toda inativa hoje (Scripts/GERA_CREDITO.sql:24-144 envolto em /* ... */)

Campos envolvidos​

CampoTabelaPapel
NR_DIASATRASOPARMFATUREste parâmetro — default/template da empresa
NR_DIASATRASOCREDITOLimite por cliente — é o que efetivamente trava o faturamento em VERIFICA_CREDITO/VERIFICA_BLOQUEIO. Nasce do PARMFATUR.NR_DIASATRASO via TRGAI_PESSOA
NR_DIASATRASOCREDITOPERIODICO / CREDITOPERIODICOGRUPOHistórico de limites por período (TFA002)
NR_DIASATRASOPARMUSUARIOLimite por usuário que libera — zerado automaticamente pelo TRGPARMFATUR_BU quando PARMFATUR.TP_MODELOBLOQUEIO = 'N'
NR_MAIORVENCCREDITO (e VIEW_CREDITOPESSOA)Maior atraso real atual do cliente — comparado com CREDITO.NR_DIASATRASO na regra de bloqueio
TP_LIMITECREDITOPARMFATUR'S' = limite global (replica NR_DIASATRASO entre empresas); caso contrário, por empresa
ST_BLOQUEIOPESSOAModo 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_MODELOBLOQUEIOPARMFATUR'N' desliga todo o modelo e zera PARMUSUARIO.NR_DIASATRASO via trigger
TP_VALIDALIMITEDIASATRASOPARMFATURParâ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)​

AspectoComportamento
Preenchimento em MFA001Campo nasce vazio no AfterInsert (UdmMFA001.pas:590-605)
Efeito em TRGAI_PESSOAAo 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áticaNenhum 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​

AspectoComportamento
Cadastro em MFA001Aceito (sem OnValidate)
Em TRGAI_PESSOACREDITO.NR_DIASATRASO = 0 para toda pessoa nova
Em VERIFICA_CREDITO linha 49-56I_NR_DIASATRASO is not null é true → entra no bloco; if I_NR_DIASATRASO < I_NR_MAIORVENC compara 0 < dias_reais
Consequência práticaBasta 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)​

AspectoComportamento
Cadastro em MFA001Aceito
Em TRGAI_PESSOACREDITO.NR_DIASATRASO = 5 para toda pessoa nova
Em VERIFICA_CREDITOCompara 5 < NR_MAIORVENC (maior atraso real da pessoa). Só bloqueia quando o atraso real ultrapassa os 5 dias de tolerância
Consequência práticaCliente 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).
  1. 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).
  2. Gera-se uma duplicata (NF com parcela CONTAS.DT_VENCIMENTO = 2026-04-10).
  3. 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.
  4. 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.
  5. 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).


Interação com CREDITO.NR_DIASATRASO (por cliente)​

AspectoPARMFATUR.NR_DIASATRASO (MFA001)CREDITO.NR_DIASATRASO (por cliente)
EscopoEmpresa (CD_EMPRESA)Empresa + Pessoa (CD_EMPRESA, CD_PESSOA)
Quem preencheUsuário em MFA001TRGAI_PESSOA (default = PARMFATUR), ou CFC004/TFA002 (override manual)
Quem lê no bloqueioNinguém lê em tempo de pedido/NFVERIFICA_CREDITO (Scripts/VERIFICA_CREDITO.sql:27-56), VERIFICA_BLOQUEIO, MEQ019
FallbackUsado 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 retroativaNão — mudar MFA001 depois de cadastrado o cliente não altera os CREDITO.NR_DIASATRASO já existentesSim — 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)​

ArquivoLinhasPapel
source/MFA001/UMFA001.dfm3758-3772TLabel Label39 com Caption = 'Dias de Atraso', FocusControl = edtNR_DIASATRASO, dentro de pagFatOp2 (Opção 2)
source/MFA001/UMFA001.dfm4278-4294TDBEdit edtNR_DIASATRASO com DataField = 'NR_DIASATRASO', DataSource = dmMFA001.dsPARMFATUR, TabOrder = 8
source/MFA001/UdmMFA001.pas165Declaração tabPARMFATURNR_DIASATRASO: TIntegerField (sem OnValidate)
source/MFA001/UdmMFA001.dfm1289-1293Field definition — apenas Alignment = taCenter, sem DefaultExpression, sem OnValidate
source/MFA001/UdmMFA001.dfm173, 2392, 2556, 2775, 3053Inclusão de NR_DIASATRASO em SELECT/INSERT/UPDATE da tabela PARMFATUR
source/MFA001/UdmMFA001.pas590-605Bloco tabPARMFATURAfterInsert termina sem atribuir valor a NR_DIASATRASO — nasce NULL

Delphi — TFA002 (consumidor fallback)​

ArquivoLinhasPapel
source/TFA002/UTFA002.pas1923-1940Em 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)​

ArquivoLinhasPapel
source/MEQ019/UMEQ019.pas617-642Lê CREDITO.NR_DIASATRASO + VIEW_CREDITOPESSOA.NR_MAIORVENC para bloquear produção
source/CFC004/UCFC004.dfm586, 730-739Grid de duplicatas + TDBEdit edtNR_DIASATRASO (edita CREDITO.NR_DIASATRASO por cliente)
source/CFC004/UdmCFC004.dfm564-569, 793-797, 860-883Fields tabCONTASNR_DIASATRASO (calculado) e tabCREDITONR_DIASATRASO (persistido) + SQL INSERT/UPDATE em CREDITO
source/CFC004/UCFC004.pas323Expressã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.pas803-805Filtro 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.pas612-616Monta 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áriosCRUD de PARMUSUARIO.NR_DIASATRASO — parâmetro homônimo por usuário, validado em tabPARMUSUARIONR_DIASATRASOValidate (UdmADM012.pas:730-734: rejeita <= 0)
source/ADM013/UADM013.pas475, 490, 523CRUD de permissões incluindo PM.NR_DIASATRASO (PARMUSUARIO)
source/JunsoftImportacao/PersistenciaDAO/PersistenciaDao.pas463Rotina 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​

ArquivoLinhasPapel
Scripts/TRGAI_PESSOA.sql7-50Principal consumidor — copia PARMFATUR.NR_DIASATRASO para CREDITO.NR_DIASATRASO no cadastro de nova pessoa, respeitando TP_LIMITECREDITO (global vs. por empresa)
Scripts/CREDITOPERIODICO_AI0.sql1-50Trigger AFTER INSERT de CREDITOPERIODICO — lê PARMFATUR.NR_DIASATRASO da empresa para propagar período global entre empresas
Scripts/CREDITOPERIODICOGRUPO_AI0.sql1-50Mesma lógica para grupo de empresas
Scripts/TRGPARMFATUR_BU.sql1-22Trigger BEFORE UPDATE em PARMFATUR: se TP_MODELOBLOQUEIO = 'N', zera PARMUSUARIO.NR_DIASATRASO (homônimo)
Scripts/VERIFICA_CREDITO.sql27-56Consome CREDITO.NR_DIASATRASO (não PARMFATUR) para bloqueio em tempo de faturamento
Scripts/VERIFICA_BLOQUEIO.sql38, 700-837Consome VIEW_CREDITOPESSOA.NR_DIASATRASO e chama VALIDA_MODELOBLOQUEIODIASATRASO
Scripts/VALIDA_MODELOBLOQUEIODIASATRASO.sql1-90Combina CREDITO.NR_DIASATRASO (entrada) com PARMUSUARIO.NR_DIASATRASO (tolerância do usuário) para decidir bloqueio final
Scripts/GERA_CREDITO.sql24-144Corpo comentado — rotina inativa