private static RepaymentEvent GetRepaymentEvent(Loan loan, Loan repaidLoan) { var firstUnpaidInstallment = loan.Schedule.Find(x => !x.Repaid); var lateDays = (TimeProvider.Today - firstUnpaidInstallment.ExpectedDate.Date).Days; lateDays = lateDays < 0 ? 0 : lateDays; var repaymentEvent = new RepaymentEvent(); repaymentEvent.LoanId = loan.Id; repaymentEvent.Code = lateDays > 0 ? "RBLE" : "RGLE"; repaymentEvent.InstallmentNumber = firstUnpaidInstallment.Number; repaymentEvent.EventDate = TimeProvider.Now; repaymentEvent.UserId = User.CurrentUser.Id; repaymentEvent.LateDays = lateDays; repaymentEvent.Principal = repaidLoan.Schedule.Sum(x => x.PaidPrincipal) - loan.Schedule.Sum(x => x.PaidPrincipal); repaymentEvent.Interest = repaidLoan.Schedule.Sum(x => x.PaidInterest) - loan.Schedule.Sum(x => x.PaidInterest); return repaymentEvent; }
private static CloseEvent GetCloseEvent(Loan loan) { var closeEvent = new CloseEvent(); closeEvent.Code = "LOCE"; closeEvent.LoanId = loan.Id; closeEvent.UserId = User.CurrentUser.Id; closeEvent.EventDate = TimeProvider.Now; return closeEvent; }
private static void DistributeTotal(Loan loan, decimal total) { var installments = loan.Schedule.Where(x => !x.Repaid).ToList(); var date = TimeProvider.Now; foreach (var installment in installments) { if (installment.UnpaidInterest > total) { installment.PaidInterest += total; installment.PaymentDate = date; break; } total -= installment.UnpaidInterest; installment.PaidInterest = installment.Interest; installment.PaymentDate = date; if (installment.UnpaidPrincipal > total) { installment.PaidPrincipal += total; installment.PaymentDate = date; break; } total -= installment.UnpaidPrincipal; installment.PaidPrincipal = installment.Principal; installment.PaymentDate = date; if (total == 0) { break; } } }