Fórum Consulta Titulos Financeiros #623648
06/02/2025
0
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
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:
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 |
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 :)