Fórum Consulta Titulos Financeiros #623648

06/02/2025

0

Estou com a seguinte consulta, onde lista a soma de valores pendentes que os clientes deveram pagar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
with
  tit as
    ( select
        cabrecpag.codfilial, cabrecpag.codcabrecpag, sublanca.codfilialrecpag codfilialorig,
        sublanca.codcabrecpag codtituloorig, rencabrecpag.codrencabrecpag, cabrecpag.codfilialparcela, cabrecpag.codtransacao
      from
        cabrecpag
          left join rencabrecpag on rencabrecpag.codfilialrecpag=cabrecpag.codfilial and rencabrecpag.codcabrecpag=cabrecpag.codcabrecpag
          left join sublanca on sublanca.codlanca = rencabrecpag.codlanca
      where
        ( cabrecpag.tipodoc='R' and cabrecpag.codtransdev is null ) and
        cabrecpag.EFEITO in ('A-----', 'P0----') and
        cabrecpag.codfilial = 1 and
        cabrecpag.datavcto <= '25/02/2025' and
        ( exists( select unidclifor.codunidclifor
                  from
                    unidclifor unidclifor, clifor clifor
                  where
                    (unidclifor.codclifor=cabrecpag.codclifor) and
                    (unidclifor.codunidclifor=cabrecpag.codunidclifor) and
                    (clifor.EFORNECED=1) and
                    (unidclifor.codtipoclifor =  6) and
                    (clifor.codclifor=unidclifor.codclifor))) and
                    (cabrecpag.codcrsituacao <> 6)),
  titulos as
    ( select
        c.*, null codrencabrecpag, null codvende, null nomevende, null codvendedor, null nomevendedor, null codger, null nomeger
      from
        tit t
          inner join cabrecpag c on c.codfilial = t.codfilial and c.codcabrecpag = t.codcabrecpag),
  lanc_indiv as
    ( select
        unidclifor_1.CODUNIDCLIFOR, clifor_1.NOME,
        (case when cabrecpag_1.tipodoc = 'R' then 1 else -1 end) * cabrecpag_1.valor as debito,
        sum(case when sublanca_1.tipo in ('R','P','X','Y','S') then sublanca_1.vlrmoeda else 0 end) / (count(*) / coalesce(nullif(count(distinct sublanca_1.codsublanca),0),1)) as valorpg,
        round(sum(case when sublanca_1.tipo in ('D','E','J','K','A') then sublanca_1.vlrmoeda else 0 end) / (count(*) / coalesce(nullif(count(distinct sublanca_1.codsublanca),0),1)),2) as jurospg
      from
        titulos cabrecpag_1
          left join clifor clifor_1 on clifor_1.codclifor=cabrecpag_1.codclifor
          left join unidclifor unidclifor_1 on cabrecpag_1.codclifor=unidclifor_1.codclifor and cabrecpag_1.codunidclifor=unidclifor_1.codunidclifor
          left join sublanca sublanca_1 on sublanca_1.codfilialrecpag=cabrecpag_1.codfilial and sublanca_1.codcabrecpag=cabrecpag_1.codcabrecpag and sublanca_1.data <= '25/02/2025'
          left join lanca lanca_1 on lanca_1.codlanca=sublanca_1.codlanca
          left join empresa empresa_1 on empresa_1.codempresa=cabrecpag_1.codfilial
          left join tipoclifor tipoclifor_1 on unidclifor_1.codtipoclifor=tipoclifor_1.codtipoclifor
          left join crsituacao crsituacao_1 on crsituacao_1.codcrsituacao = cabrecpag_1.codcrsituacao
      group by
        cabrecpag_1.datavcto, cabrecpag_1.documento, cabrecpag_1.valor,unidclifor_1.codtipoclifor,
        clifor_1.codclifor, clifor_1.nome, clifor_1.codclifor, unidclifor_1.codunidclifor,  cabrecpag_1.codfilial,
        empresa_1.nomefilial, cabrecpag_1.tipodoc, substring(cabrecpag_1.efeito,1,1), cabrecpag_1.nrobloqueto, cabrecpag_1.nossonumero,
        unidclifor_1.codcobrador,clifor_1.ecliente, clifor_1.eforneced
      having
        ((coalesce(round(sum(case when sublanca_1.tipo in ('R','P','X','Y','S') then sublanca_1.vlrmoeda else 0 end),2),0)/
        (count(*) / coalesce(nullif(count(distinct sublanca_1.codsublanca),0),1))) + 0.001 < round(cabrecpag_1.valor,2)) or (sum(sublanca_1.vlrmoeda) is null) )
select
  CODUNIDCLIFOR, NOME, sum(debito) - sum(valorpg) TOTAL
from lanc_indiv
group by NOME,CODUNIDCLIFOR
order by nome


Preciso colocar o valor corrigido de juros (3% ao mês) referente ao total de cada cliente. Lembrando que cada titulo tem a data de vencimento diferente. Como posso fazer isso ?

Resultado esperado:

CLIENTE | VALOR PENDENTE | JUROS | VALOR CORRIGIDO

Amador Santana de Souza | 5.169,03 | 555,46 | 5.724,49
Francy Damasceno Magalhaes | 34.963,8 | 5.412,08 | 40.375,88
Mylena

Mylena

Responder

Posts

06/02/2025

Arthur Heinrich

Como o valor dos juros depende da data de vencimento do título, o cálculo dos jutos precisa ser feito na view "lanc_indiv".

Nela, encontramos as colunas "cabrecpag_1.datavcto" e "cabrecpag_1.valor", que podem ser utilizadas para calcular o valor dos juros.

É importante lembrar que, durante os pagamentos, que podem ter ocorrido em atraso, consta os valores "valorpg" e "jurospg", que precisam ser considerados.

Se um título está em aberto, calcula-se os juros desde "cabrecpag_1.datavcto" até o presente momento. Porém, se o título foi pago, devemos considerar o valor "jurospg", a menos que um título possa ser pago parcialmente, sendo necessário apurar os juros da parcela em aberto, desde o pagamento parcial, o que complica ainda mais o cálculo.

Além disso, o cálculo de juros pode ser feito de diversas formas. Como a taxa de juros é medida ao mês, meses com 28 e 30 dias apresentam taxa de juros diária maior do que em meses com 31 dias.

Em geral, considera-se juros simples, adicionando 3% ao valor original, para cada 1 mês completo e, no último mês com atraso parcial, calcula-se a fração baseado nos dias de atraso dividido pelo número de dias do mês.

Implementar esta regra diretamente na query é muito complicado e é necessário escrever uma função para esta finalidade.

Outra coisa que é comum, é adicionar correção monetária. Os encargos por atraso geralmente são divididos em 3 itens:

1 - Multa por atraso. Nossa legislação prevê que títulos pagos em atraso estão sujeitos ao pagamento de multa de no máximo 2%, independentemente do atraso. Se for 1 dia ou 10 anos, a multa é fixa e de no máximo 2%.

2 - Juros de mora. São computados de forma simples, sobre o valor original, como eu descrevi acima, limitado a 1% ao mês.

3 - Correção monetária. A correção se aplica ao período em que o título permaneceu em aberto. Ela visa atualizar o valor monetário, para evitar prejuízos com pagamentos com atraso elevado, uma vez que os juros do item 2 não são compostos.

É um assunto complexo.
Responder

Gostei + 0

06/02/2025

Mylena

Nesse caso será calculado a taxa diária de 0,1% sobre o valor pendente do titulo, considerando o juros compostos.

Tem alguma forma que eu possa inserir esse calculo na query?
Responder

Gostei + 0

07/02/2025

Arthur Heinrich

Se considerar 0,1% de juros diário, aplicado de forma composta, vai gerar o seguinte montante de juros mensal:

Meses com 28 dias, 2,838%
Meses com 29 dias, 2,941%
Meses com 30 dias, 3,044%
Meses com 28 dias, 3,147%

Para calcular, a fórmula é: valor*(power(1+juros/100,dias)-1)

cabrecpag_1.valor*(power(1.0+0.1/100,datediff(day, cabrecpag_1.datavcto, getdate()))-1) juros

Deve ficar mais ou menos assim:

1
2
3
4
5
6
7
8
9
10
11
12
select
  ...
  unidclifor_1.CODUNIDCLIFOR, clifor_1.NOME, cabrecpag_1.valor*(power(1.0+0.1/100,datediff(day, cabrecpag_1.datavcto, getdate()))-1) juros
  ...
select
  CODUNIDCLIFOR, NOME,
  sum(debito) - sum(valorpg) VALOR_PENDENTE,
  sum(juros) JUROS,
  sum(debito) - sum(valorpg) + sum(juros) - sum(jurospg) VALOR_CORRIGIDO
from lanc_indiv
group by NOME,CODUNIDCLIFOR
order by nome

Responder

Gostei + 0

07/02/2025

Arthur Heinrich

Porém, essa abordagem não leva em consideração o fluxo de pagamentos.

Imagine que temos uma dívida de 1000, foram pagos 400 e faltam 600. Depois de 30 dias, quanto o cliente deve?

Vai depender de quando foram pagos os 400.

Se ele pagar os 400 no primeiro dia, efetivamente os juros deveriam correr sobre o valor de 600. Mas, se pagou os 400 no dia 29, deveriam correr juros sobre 1000 durante 29 dias e mais 0,1% sobre o dia em que o saldo era de apenas 600.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar