Fórum Consulta Titulos Financeiros #623648
06/02/2025
0
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
Curtir tópico
+ 0Posts
06/02/2025
Arthur Heinrich
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.
Gostei + 0
06/02/2025
Mylena
Tem alguma forma que eu possa inserir esse calculo na query?
Gostei + 0
07/02/2025
Arthur Heinrich
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:
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
Gostei + 0
07/02/2025
Arthur Heinrich
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)