Jump to content

Caculo De Juros E Atualização Da Data De Vencimento Do Boleto.


Recommended Posts

Olá Amigos,

 

Gostaria de compartilhar um script que fiz usando uma class de calculo de juros que poderá ajuda-los. 

Para quem usa o PHPBoleto integrado ao WHMCS, basta editar o arquivo /whmcs/modules/boleto/include/funcoes_SEUBANCO.php

/********************************************************************************************
 * CALCULO DE JUROS E MULTA 
 *******************************************************************************************/
include 'juros.php';

//FUNÇÃO PARA CALCULO DE X DIAS APÓS A DATA ATUAL

$boleto = new Juros($dadosboleto["valor_boleto"],$dadosboleto["data_vencimento"],$multa,$juros);
if($boleto->VerificaBoleto()){

    
	// RETORNA O VALOR COM JUROS
    
    $boleto->CalculaOsJuros();
     
    $mensagem_juros  = "
   
      <B>Valor do Documento:</B> R$ ".$boleto->Moeda($boleto->getValor())."  
    | <B>Juros:</B> R$ ".$boleto->getJurosTotal()." 
    | <B>Multa:</B> R$ ".$boleto->getMultaTotal()."
    | <B>Dias em atraso:</B> ".(int)$boleto->getDiasEmAberto();      
    
    $dadosboleto["valor_boleto"]  = $boleto->getValorTotal();
    $dadosboleto["demonstrativo3"] = $mensagem_juros;
    
    /* ADCIONA MAIS 1 DIA */
    $dadosboleto["data_vencimento"] =  date('d/m/Y', strtotime("+1 days"));
    
                 
} else { 
	
    // RETORNA O VALOR SEM JUROS
    $dadosboleto["valor_boleto"]  = $boleto->Moeda($boleto->getValor());
    $dadosboleto["demonstrativo3"] = "";
     
}
    

Também vamos precisar da Class juros.php, não me recordo onde localizei ela, segue o script (adicione ele junto do arquivo que está sendo editado). Informe os valores em %

<?php

$multa = 2; //% 
$juros = 0.033; //%
    
class Juros {
    
    private $valor;
    private $vencimento;
    private $multa;
    private $juros;
    
    private $valorTotal;
    private $jurosTotal;
    private $multaTotal;
    private $diasEmAberto;
    	
    public function __construct($valor,$vencimento,$multa,$juros){
		$this->valor      = $valor;
        $this->vencimento = $vencimento;
        $this->multa      = $multa;
        $this->juros      = $juros;
    }
	public function getValor()     { return $this->valor; }
    public function getVencimento(){ return $this->vencimento; }
    public function getMulta()     { return $this->multa; }
    public function getJuros()     { return $this->juros; }
    
    public function getValorTotal()     { return $this->valorTotal; }
    public function getJurosTotal()     { return $this->jurosTotal; }
    public function getMultaTotal()     { return $this->multaTotal; }
    public function getDiasEmAberto()   { return $this->diasEmAberto; }
            
    
    function ConverteData($data, $tipo){
    	if ($tipo == 0) {
    		$datatrans = explode ("/", $data);
    		$data = "$datatrans[2]-$datatrans[1]-$datatrans[0]";
    	} elseif ($tipo == 1) {
    		$datatrans = explode ("-", $data);
    		$data = "$datatrans[2]/$datatrans[1]/$datatrans[0]";
    	}elseif ($tipo == 2) {
    		$datatrans = explode ("-", $data);
    		$data = "$datatrans[1]/$datatrans[2]/$datatrans[0]";
    	} elseif ($tipo == 3) {
    		$datatrans = explode ("/", $data);
    		$data = "$datatrans[2]-$datatrans[1]-$datatrans[0]";
    	}
               
    	return $data;
    }    
    
       
    function VerificaBoleto(){
        
        list($ano,$mes,$dia) = explode("-",$this->ConverteData($this->vencimento,3));
        
        $VerificaBoleto['data']['vencimento'] = mktime (0, 0, 0, $mes, $dia, $ano);
        $VerificaBoleto['data']['atual'] = mktime (0, 0, 0, date("m"), date("d"), date("Y"));
        if($VerificaBoleto['data']['atual'] <= $VerificaBoleto['data']['vencimento']){
            return false; // BOLETO EM ABERTO            
        } else {             
            return true; // BOLETO VENCIDO      
        }

    }
    
    function DiasEntreData($date_ini, $date_end){
	    $data_ini = strtotime( $this->ConverteData($this->ConverteData($date_ini,3),2)); 
	    $hoje = $this->ConverteData($date_end,3);
    	$foo = strtotime($hoje);
    	$dias = ($foo - $data_ini)/86400; 
	    return $dias;
    }

    function Moeda($value){
    	return number_format($value, 2, ",", ".");
    }
    
    function CalculaOsJuros(){        
        $juros = (($this->juros * ($this->DiasEntreData($this->vencimento,date("d/m/Y")))));
              
        if($this->DiasEntreData($this->vencimento,date("d/m/Y"))==0){
            $multa = 0;
        } else {
            $multa = (($this->multa * $this->valor) / 100);
        }
        
        $this->valorTotal    = $this->Moeda($this->valor + ($juros + $multa));
        $this->jurosTotal    = $this->Moeda($juros);
        $this->multaTotal    = $this->Moeda($multa);
        $this->diasEmAberto  = $this->DiasEntreData($this->vencimento,date("d/m/Y"));

    }
    
}
?>

Bom aproveito. 

Link to comment
Share on other sites

Boa noite,

Estou utilizando o código, porém tenho uma dúvida.

 

O script deveria calcular

valor do boleto + valor dos juros + valor da multa = Total a pagar

 

Porém, ele calcula apenas

valor do boleto + valor da multa = total a pagar

 

 

O script, chega a calcular a porcentagem da multa em atraso e os (juros de dias em atraso), porém o valor final do boleto para pagamento nao é acrescidos o valor dos (juros de dias em atraso), só é acrescentado o valor da multa.

 

Alguém pode me ajudar ?

Link to comment
Share on other sites

Esse calculo tem de ser feito com muito cuidado e ser bem revisado.

Já temos em nossos boletos, deu um certo trabalho pra fazer, se observarem com mais cuidado vão compreender que o cálculo não está levando em conta os centavos.

Link to comment
Share on other sites

O problema é simples, os dados estão sendo passados no nosso padrão xxxx,xx (centavos separdos por vírgula), o correto é separar os centavos por ponto xxxx.xx, senão é exatamente isto que acontece, o que vem depois da vírgula é ignorado.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...