diff --git a/src/Purrse.Api/Services/LoanService.cs b/src/Purrse.Api/Services/LoanService.cs index 61aaded..1330055 100644 --- a/src/Purrse.Api/Services/LoanService.cs +++ b/src/Purrse.Api/Services/LoanService.cs @@ -113,11 +113,12 @@ public class LoanService : ILoanService // Build new schedule with extra payments var balance = Math.Abs(account.Balance); - var monthlyRate = l.InterestRate / 100 / 12; + var dailyRate = l.InterestRate / 100m / 365m; var extraMonthly = request.ExtraMonthlyPayment ?? 0; var basePayment = l.MonthlyPayment - (l.EscrowAmount ?? 0); var now = DateTime.UtcNow; - var paymentDate = new DateTime(now.Year, now.Month, l.OriginationDate.Day, 0, 0, 0, DateTimeKind.Utc); + var startDate = new DateTime(now.Year, now.Month, l.OriginationDate.Day, 0, 0, 0, DateTimeKind.Utc); + var previousDate = startDate; var newEntries = new List(); int paymentNum = 0; @@ -132,14 +133,16 @@ public class LoanService : ILoanService while (balance > 0 && paymentNum < 600) { paymentNum++; - paymentDate = paymentDate.AddMonths(1); + var paymentDate = startDate.AddMonths(paymentNum); + var days = (paymentDate - previousDate).Days; - var interest = balance * monthlyRate; + var interest = balance * dailyRate * days; var principal = Math.Min(basePayment + extraMonthly - interest, balance); if (principal < 0) principal = 0; balance -= principal; if (balance < 0.01m) balance = 0; + previousDate = paymentDate; newEntries.Add(new AmortizationEntryResponse( paymentNum, paymentDate, principal + interest + (l.EscrowAmount ?? 0), @@ -180,18 +183,20 @@ public class LoanService : ILoanService { var entries = new List(); var balance = loan.OriginalBalance; - var monthlyRate = loan.InterestRate / 100 / 12; + var dailyRate = loan.InterestRate / 100m / 365m; var payment = loan.MonthlyPayment - (loan.EscrowAmount ?? 0); var extra = loan.ExtraPayment ?? 0; - var paymentDate = loan.OriginationDate; + var previousDate = loan.OriginationDate; for (int i = 1; i <= loan.TermMonths && balance > 0; i++) { - paymentDate = paymentDate.AddMonths(1); - var interest = balance * monthlyRate; + var paymentDate = loan.OriginationDate.AddMonths(i); + var days = (paymentDate - previousDate).Days; + var interest = balance * dailyRate * days; var principal = Math.Min(payment + extra - interest, balance); balance -= principal; if (balance < 0.01m) balance = 0; + previousDate = paymentDate; entries.Add(new AmortizationEntry {