2016-04-14 6 views
1

私は、ローン申請償却スケジュールを計算する方法を作成しました。私は、ユーザーが自分のローンの支払いをする必要があり、ここに私のコードの抜粋であるたびに、月に追加するにはカーボンを使用しています:Laravel 5.2を使用しているPHPとCarbonを正しく追加していない

public function amoritization($amount,$interest_rate,$repaid_months,$start_date) 
{ 
    $beginning_balance = $amount; 
    $interest = $interest_rate/100/12; 
    $payback = $repaid_months; 
    $x = pow(1 + $interest,$payback); 
    $monthly_payment = ($beginning_balance*$x*$interest)/($x-1); 

    $payment_date = new Carbon($start_date) 


    $info = (object)[]; //convert empty array to an object 
    $amoritization = []; 
    $count = 0; 
    while($payback > 0){ 
     $total_interest = $interest * $beginning_balance; //interest 
     $principal_payment = $monthly_payment - $total_interest; //principal 
     $ending_balance = $beginning_balance - $principal_payment; //ending balance 

     $info->beginning_balance = (float)$beginning_balance; 
     $info->total_interest = $total_interest; 
     $info->payment = $monthly_payment; 
     $info->principal_payment = $principal_payment; 
     $info->ending_balance = $ending_balance; 
     $info->payment_date = $payment_date->addMonths($count++); 

     array_push($amoritization,$info); 
     $beginning_balance = $ending_balance; 
     $info = (object)[]; 
     $payback--; 
    } 

    return $amoritization; 
} 

をこの方法では、このように私のコントローラに呼び出されます。

return $this->calculation->amoritization($data['amount'],$data['interest_rate'],$data['loan_term'],$data['start_date']); 

ここに問題があります。たとえば、$ start_date変数にはこの値が格納されています。2016-04-14 10:34:56そして$ payback変数の値は6です。whileループ文には$ infoオブジェクトが追加されています追加月を保存するpayment_dateのプロパティ:

$info->payment_date = $payment_date->addMonths($count++); 

whileループステートメントが1回ループするとき、私は得るべき値は2016-05-14です。私は戻って応答から得たものしかし、この:私はループ内でこれを行うと

payment_date :{date: "2016-10-14 10:34:56.247000", timezone_type: 2, timezone: "Z"} 

はまた、:

return $info->payment_date; 

私は価値2016年5月14日を取り戻します。これの原因は何でしょうか?あなたの助けを事前に感謝、

答えて

1

だけで実行します。

$info->payment_date = $payment_date->addMonths(1); //or just $payment_date->addMonth(); 

さんが言ってみましょう:$start_date = '2016-04-14'を。

問題は、最初の繰り返しで$count++が1で、1か月が追加されています。

$payment_dateは今2に等しく、2ヶ月を追加する2回目の反復$countで今'2016-05-14'

です。

$payment_dateは今3に等しく、3ヶ月を追加第3の反復$countで今'2016-07-14'

あります。あなたは、その最初の反復後に停止しますループ内returnを行うと

$payment_dateは今'2016-10-14'

です。

+0

私はこの$ info-> payment_date = $ payment_date-> addMonths(1);を試しましたが、オブジェクトの配列から各payment_dateプロパティの2016-10-14という同じ日付を取得しています – newbieDev

0

私は同じ問題に直面しています。

明らかにバグがあります。月の終わりにある30日の4月または31日のような日付にaddMonths()を使用することはできません。

私はまだ理由はわかりませんが、2月1日のような日付のaddMonths()を使用すると、うまく正しく追加されます。

基本的には、addMonths()を使用する前に日付をより早い日付に調整する必要があります。

このバグは私を狂っていました。

関連する問題