2016-04-14 5 views
1

Ich habe eine Methode erstellt, um eine Amortisation Zeitplan für Darlehen zu berechnen. Ich Kohlenstoff verwende für jedes Mal einen Monat hinzuzufügen muss der Benutzer zu Zahlungen auf ihre Darlehen zu machen und hier ist Schnipsel meines Code:PHP mit Laravel 5.2 und Carbon keine Monate korrekt hinzufügen

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; 
} 

Diese Methode in meinem Controller wie folgt aufgerufen wird:

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

Hier ist das Problem, sagen wir zum Beispiel die $ start_date Variable, die diesen Wert gespeichert hat 2016-04-14 10:34:56 und die $ payback Variable hat den Wert 6. In der while Schleifenanweisung habe ich das $ info Objekt hinzugefügt eine Eigenschaft von payment_date, die den hinzugefügten Monat speichert:

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

Wenn die while-Schleife eine Schleife ausführt, dann ist der Wert, den ich erhalten soll, 2016-05-14. Aber das, was ich aus der Antwort bekam:

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

Auch wenn ich dies in der Schleife tun:

return $info->payment_date; 

ich den Wert 2016.05.14 zurück. Was könnte die Ursache dafür sein? Vielen Dank im Voraus für Ihre Hilfe,

Antwort

1

Just do:

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

Lasst uns sagen: $start_date = '2016-04-14';

Ihr Problem ist, dass $count++ ist 1 in der ersten Iteration und fügt 1 Monat.

$payment_date ist jetzt '2016-05-14'

In der zweiten Iteration $count2 jetzt gleich und fügt 2 Monate.

$payment_date ist jetzt '2016-07-14'

In der dritten Iteration $count3 jetzt gleich und fügt 3 Monate.

$payment_date ist jetzt '2016-10-14'

Wenn Sie return innerhalb der Schleife tun es nach der ersten Iteration gestoppt wird.

+0

Ich habe versucht, diesen $ info-> payment_date = $ payment_date-> AddMonths (1) ;, aber immer noch das gleiche Datum erhalten, die von dem Array von Objekten 2016.10.14 für jede payment_date Eigenschaft ist – newbieDev

0

Ich habe das gleiche Problem.

Anscheinend gibt es einen Fehler. Sie können addMonths() nicht für ein Datum verwenden, das am Ende des Monats wie 30. April oder 31. Mai ist.

Ich bin mir immer noch nicht sicher, warum, aber wenn Sie addMonths() mit Datum wie 1. Februar verwenden, wird es schön und richtig summieren.

Grundsätzlich müssen Sie das Datum früher einstellen, bevor Sie AddMonths verwenden();

Dieser Fehler machte mich verrückt.