public void DecliningRate_ExoticInstallments_GracePeriod() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, ExoticProduct = new ExoticInstallmentsTable { new ExoticInstallment(1, 0.1, null), new ExoticInstallment(2, 0.1, null), new ExoticInstallment(3, 0.1, null), new ExoticInstallment(4, 0.1, null), new ExoticInstallment(5, 0.1, null), new ExoticInstallment(6, 0.5, null) }, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 7, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 1, new DateTime(2006, 2, 1), 30.00m, 0, 1000); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 2, new DateTime(2006, 3, 1), 30.00m, 100.00m, 1000); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 3, new DateTime(2006, 4, 3), 27.00m, 100.00m, 900); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 4, new DateTime(2006, 5, 1), 24.00m, 100.00m, 800); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 5, new DateTime(2006, 6, 1), 21.00m, 100.00m, 700); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 6, new DateTime(2006, 7, 3), 18.00m, 100.00m, 600); _AssertSpecifiedInstallment(myContract.GetInstallment(6), 7, new DateTime(2006, 8, 1), 15.00m, 500.00m, 500); }
private static OCurrency _AccruedInterestsLoanBalance(Loan pCredit) { if (!pCredit.Disbursed || pCredit.Rescheduled) return 0; if (pCredit.GetPastDueDays(TimeProvider.Today) != 0) return 0; foreach (Installment installment in pCredit.InstallmentList) { if(!installment.IsRepaid) { DateTime date = installment.Number == 1 ? pCredit.StartDate : pCredit.GetInstallment(installment.Number - 2).ExpectedDate; int days = (TimeProvider.Today - date).Days; OCurrency accruedInterest = installment.InterestsRepayment * (double)days / (double)DateTime.DaysInMonth(date.Year, date.Month); accruedInterest -= installment.PaidInterests; return accruedInterest > 0 ? accruedInterest : 0; } } return 0; }
public void FlatRate_BiWeeklyInstallmentType_GracePeriod() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Bi-Weekly", 14, 0), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1, UseCents = true} }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 1, new DateTime(2006, 1, 16), 32.14m, 0, 1000); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 2, new DateTime(2006, 1, 30), 30.00m, 0, 1000); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 3, new DateTime(2006, 2, 13), 30.00m, 250, 1000); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 4, new DateTime(2006, 2, 27), 30.00m, 250, 750); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 5, new DateTime(2006, 3, 13), 30.00m, 250, 500); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 6, new DateTime(2006, 3, 27), 30.00m, 250, 250); }
public void TestDisburseWhenDisburseDateEqualsToContractStartDate() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package,1000,0.03m,6,1,new DateTime(2006,1,1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); EntryFee entryFee = new EntryFee(); entryFee.Value = 5; entryFee.IsRate = true; entryFee.Id = 21; LoanEntryFee loanEntryFee = new LoanEntryFee(); loanEntryFee.FeeValue = 5; loanEntryFee.ProductEntryFee = entryFee; loanEntryFee.ProductEntryFeeId = 21; myContract.LoanEntryFeesList = new List<LoanEntryFee>(); myContract.LoanEntryFeesList.Add(loanEntryFee); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006,1,1),false,false); Assert.AreEqual(new DateTime(2006,1,1),myContract.StartDate); Assert.AreEqual(30m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(1000m,lDE.Amount.Value); Assert.AreEqual(50m,lDE.Commissions[0].Fee.Value); }
public void TestDisburseWhenBiWeeklyInstallmentType() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Bi-Weelky", 14, 0), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.02m, 6, 1, new DateTime(2006, 1, 2), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); EntryFee entryFee = new EntryFee(); entryFee.Value = 5; entryFee.IsRate = true; entryFee.Id = 21; LoanEntryFee loanEntryFee = new LoanEntryFee(); loanEntryFee.FeeValue = 5; loanEntryFee.ProductEntryFee = entryFee; loanEntryFee.ProductEntryFeeId = 21; myContract.LoanEntryFeesList = new List<LoanEntryFee>(); myContract.LoanEntryFeesList.Add(loanEntryFee); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006, 1, 6), false, false); Assert.AreEqual(new DateTime(2006,1,2), myContract.StartDate); Assert.AreEqual(14.29m, myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(1000m, lDE.Amount.Value); Assert.AreEqual(50m, lDE.Commissions[0].Fee.Value); }
public void TestContract9InstallmentsDecliningRateWhenLittleOverPaid() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; package.KeepExpectedInstallment = false; Loan myContract = new Loan(package,1500,0.03m,9,1,new DateTime(2006,1,1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.AnticipatedTotalRepaymentPenalties = 0.02; Assert.AreEqual(45m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(0,myContract.GetInstallment(0).CapitalRepayment.Value); Assert.AreEqual(new DateTime(2006,2,1),myContract.GetInstallment(0).ExpectedDate); RepaymentEvent rPE = myContract.Repay(1,new DateTime(2006,2,1),45m,false,false); Assert.AreEqual(45,myContract.GetInstallment(0).PaidInterests.Value); Assert.AreEqual(0,myContract.GetInstallment(0).PaidCapital.Value); Assert.AreEqual(0m,rPE.Fees.Value); Assert.AreEqual(45m,rPE.Interests.Value); Assert.AreEqual(0m,rPE.Principal.Value); }
public void TestCalculatePastDueSinceLastRepayment2() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, KeepExpectedInstallment = false, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); PaymentMethod paymentMethod = new PaymentMethod(1, "Cash", "", false); myContract.Repay(1, new DateTime(2006, 6, 1), 30, true, 0, 0, false, 0, true, false, false, paymentMethod); Assert.IsTrue(myContract.GetInstallment(0).IsRepaid); Assert.AreEqual(122, myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 7, 1))); }
public void TestCalculateOverDueAmountWithInterest() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1, UseCents = true}, RoundingType = ORoundingType.Approximate }; Loan myContract = new Loan(package, 1000, 0.03m, 12, 0, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.NonRepaymentPenalties.OLB = 0.0016; Assert.AreEqual(30m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(70.46m,myContract.GetInstallment(0).CapitalRepayment.Value); Assert.AreEqual(new DateTime(2006,2,1),myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(1000, _CheckInstalmentsTotalPrincipal(myContract).Value); Assert.AreEqual(27.89m,myContract.GetInstallment(1).InterestsRepayment.Value); Assert.AreEqual(72.57m,myContract.GetInstallment(1).CapitalRepayment.Value); Assert.AreEqual(new DateTime(2006,3,1),myContract.GetInstallment(1).ExpectedDate); Assert.AreEqual(new DateTime(2006,4,3),myContract.GetInstallment(2).ExpectedDate); Assert.AreEqual(new DateTime(2006,5,1),myContract.GetInstallment(3).ExpectedDate); Assert.AreEqual(new DateTime(2006,6,1),myContract.GetInstallment(4).ExpectedDate); Assert.AreEqual(new DateTime(2006,7,3),myContract.GetInstallment(5).ExpectedDate); }
public void TestAddInstallmentAndGetInstallment() { Loan newContract = new Loan(new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); new Loan(new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Installment i = new Installment {PaidCapital = 100}; newContract.AddInstallment(i); Assert.AreEqual(100m,newContract.GetInstallment(0).PaidCapital.Value); }
public void Disburse_DisburseDateGreaterThanContractFirstInstallmentDate_NoAlignDates() { LoanProduct package = new LoanProduct{ InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 750, 0.03m,6,1,new DateTime(2006,1,1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006,3,1),false,false); Assert.IsNotNull(lDE); Assert.AreEqual(new DateTime(2006,1,1),myContract.StartDate); Assert.AreEqual(0m,myContract.GetInstallment(0).InterestsRepayment.Value); }
public void TestRepayEventCorrectlyGenerateWhenTenDaysLateAndPayFees() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.NonRepaymentPenalties.OLB = 0.003; Assert.AreEqual(new DateTime(2006, 2, 1), myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(new DateTime(2006, 3, 1), myContract.GetInstallment(1).ExpectedDate); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); RepaymentEvent rPE = myContract.Repay(2, new DateTime(2006, 3, 11), 230.41m, false, false); Assert.AreEqual(30m, rPE.Fees.Value); Assert.AreEqual(30m, rPE.Interests.Value); Assert.AreEqual(170.41m, rPE.Principal.Value); }
public void TestIfPastDueCorrectlyCalculatedWhenLimitDateYearIsLowerThanInstallmentDateOne() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; package.KeepExpectedInstallment = false; package.NonRepaymentPenalties.OLB = 0.001; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(1000m,myContract.GetInstallment(0).OLB.Value); Assert.AreEqual(1000m,myContract.GetInstallment(1).OLB.Value); Assert.AreEqual(800m,myContract.GetInstallment(2).OLB.Value); Assert.AreEqual(600m,myContract.GetInstallment(3).OLB.Value); }
public void TestDisburseWhenMontlyInstallmentTypeAndAlignDateWithRealDisbuseDate() { ApplicationSettings pDataParam = ApplicationSettings.GetInstance(""); pDataParam.DeleteAllParameters(); pDataParam.AddParameter("ALIGN_INSTALLMENTS_ON_REAL_DISBURSEMENT_DATE", true); pDataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); pDataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); pDataParam.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package,1000,0.02m,6,1,new DateTime(2006,1,2), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); EntryFee entryFee = new EntryFee(); entryFee.Value = 5; entryFee.IsRate = true; entryFee.Id = 21; LoanEntryFee loanEntryFee = new LoanEntryFee(); loanEntryFee.FeeValue = 5; loanEntryFee.ProductEntryFee = entryFee; loanEntryFee.ProductEntryFeeId = 21; myContract.LoanEntryFeesList = new List<LoanEntryFee>(); myContract.LoanEntryFeesList.Add(loanEntryFee); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006,1,2),true,false); Assert.AreEqual(new DateTime(2006, 1, 2), myContract.StartDate); Assert.AreEqual(20m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(new DateTime(2006,2,2),myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(1000m,lDE.Amount.Value); Assert.AreEqual(50m, lDE.Commissions[0].Fee.Value); }
public void TestDisburseWhenMonthlyInstallmentTypeAndNotAlignWithRealDisburseDate() { ApplicationSettings pDataParam = ApplicationSettings.GetInstance(""); pDataParam.DeleteAllParameters(); pDataParam.AddParameter("ALIGN_INSTALLMENTS_ON_REAL_DISBURSEMENT_DATE", false); pDataParam.AddParameter("PAY_FIRST_INSTALLMENT_REAL_VALUE", true); pDataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); pDataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 2), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.Disburse(new DateTime(2006,1,6),false,true); Assert.AreEqual(26m,myContract.GetInstallment(0).InterestsRepayment.Value); }
public void TestDisburseWhenDisburseDateLowerThanContractStartDate() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package,1000,0.03m,6,1,new DateTime(2006,2,1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(new DateTime(2006,2,1),myContract.StartDate); myContract.Disburse(new DateTime(2005,12,25),false,false); Assert.AreEqual(new DateTime(2006,2,1),myContract.StartDate); Assert.AreEqual(68m,myContract.GetInstallment(0).InterestsRepayment.Value); }
public void Repay_DecliningLoan_KeepNotExpectedInstallment_EntirlyPaid_NoCancelFees() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, KeepExpectedInstallment = false, Currency = new Currency { Id = 1, UseCents = true}, RoundingType = ORoundingType.Approximate }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())) { NonRepaymentPenalties = { InitialAmount = 0.003 }, AnticipatedTotalRepaymentPenalties = 0.003 }; //VPM => 218,3546 myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); RepaymentEvent repayEvent = myContract.Repay(2, new DateTime(2006, 3, 1), 1032.44m, false, false); _AssertSpecifiedEvent(repayEvent, 2.44m, 30.00m, 1000.00m); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 1, new DateTime(2006, 2, 1), 30.00m, 0, 1000, 0, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 2, new DateTime(2006, 3, 1), 30.00m, 188.35m, 1000, 188.35m, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 3, new DateTime(2006, 4, 3), 0, 811.65m, 811.65m, 811.65m, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 4, new DateTime(2006, 5, 1), 0, 0, 0, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 5, new DateTime(2006, 6, 1), 0, 0, 0, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 6, new DateTime(2006, 7, 3), 0, 0, 0, 0, 0); }
public void Repay_DecliningLoan_KeepNotExpectedInstallment_SecondInstallmentNotEntirlyPaid() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, KeepExpectedInstallment = false, Currency = new Currency { Id = 1, UseCents = true}, RoundingType = ORoundingType.Approximate }; Loan myContract = new Loan(package, 1000, 0.03m, 7, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(1000, _CheckInstalmentsTotalPrincipal(myContract).Value); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); myContract.Repay(2, new DateTime(2006, 3, 1), 100, true, false); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 1, new DateTime(2006, 2, 1), 30, 0, 1000, 0, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 2, new DateTime(2006, 3, 1), 30, 154.60m, 1000, 70, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 3, new DateTime(2006, 4, 3), 25.36m, 159.24m, 845.40m, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 4, new DateTime(2006, 5, 1), 20.58m, 164.02m, 686.16m, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 5, new DateTime(2006, 6, 1), 15.66m, 168.93m, 522.14m, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 6, new DateTime(2006, 7, 3), 10.60m, 173.99m, 353.21m, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(6), 7, new DateTime(2006, 8, 1), 5.38m, 179.22m, 179.22m, 0, 0); }
public void TestRepayFlateLoanWhenKeepExpectedInstallmentButSecondInstallmentNotEntirlyPaidTheSecondInstallment() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; package.KeepExpectedInstallment = true; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); myContract.Repay(2, new DateTime(2006, 3, 1), 200, true, false); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 1, new DateTime(2006, 2, 1), 30, 0, 1000, 0, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 2, new DateTime(2006, 3, 1), 30, 200, 1000, 170, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 3, new DateTime(2006, 4, 3), 30, 200, 800, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 4, new DateTime(2006, 5, 1), 30, 200, 600, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 5, new DateTime(2006, 6, 1), 30, 200, 400, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 6, new DateTime(2006, 7, 3), 30, 200, 200, 0, 0); }
public void TestCalculateInstallmentWhenChangeDateSetToFalse() { ApplicationSettings pDataParam = ApplicationSettings.GetInstance(""); pDataParam.DeleteAllParameters(); pDataParam.AddParameter("ALIGN_INSTALLMENTS_ON_REAL_DISBURSEMENT_DATE", false); pDataParam.AddParameter("PAY_FIRST_INSTALLMENT_REAL_VALUE", true); pDataParam.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); pDataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); pDataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package,1000,0.02m,6,1,new DateTime(2006,1,2), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(new DateTime(2006,2,2),myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(new DateTime(2006,3,2),myContract.GetInstallment(1).ExpectedDate); myContract.Disburse(new DateTime(2006,1,6),false,false); Assert.AreEqual(new DateTime(2006,1,2),myContract.StartDate); Assert.AreEqual(new DateTime(2006,2,2),myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(new DateTime(2006,3,2),myContract.GetInstallment(1).ExpectedDate); myContract.Repay(1,new DateTime(2006,2,2),100,true,false); Assert.AreEqual(new DateTime(2006,2,2),myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(new DateTime(2006,3,2),myContract.GetInstallment(1).ExpectedDate); }
public void TestRepayFlateLoanWhenKeepNotExpectedInstallmentAndOverPaid() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; package.KeepExpectedInstallment = false; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); RepaymentEvent rE = myContract.Repay(2, new DateTime(2006, 3, 1), 430, true, false); Assert.AreEqual(0, rE.Fees.Value); Assert.AreEqual(30, rE.Interests.Value); Assert.AreEqual(400, rE.Principal.Value); _AssertSpecifiedInstallment(myContract.GetInstallment(0), 30, 0, 1000, 0, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(1), 30, 200, 1000, 200, 30); _AssertSpecifiedInstallment(myContract.GetInstallment(2), 18, 150, 600, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(3), 18, 150, 450, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(4), 18, 150, 300, 0, 0); _AssertSpecifiedInstallment(myContract.GetInstallment(5), 18, 150, 150, 0, 0); }
public void TestCalculateOverDueAmountWithoutInterest() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(30m, myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(0m, myContract.GetInstallment(0).CapitalRepayment.Value); Assert.AreEqual(new DateTime(2006, 2, 1), myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(30m, myContract.GetInstallment(1).InterestsRepayment.Value); Assert.AreEqual(200m, myContract.GetInstallment(1).CapitalRepayment.Value); Assert.AreEqual(new DateTime(2006, 3, 1), myContract.GetInstallment(1).ExpectedDate); Assert.AreEqual(new DateTime(2006, 4, 3), myContract.GetInstallment(2).ExpectedDate); Assert.AreEqual(0m, myContract.CalculateOverduePrincipal(new DateTime(2006, 1, 9)).Value); Assert.AreEqual(400m, myContract.CalculateOverduePrincipal(new DateTime(2006, 4, 9)).Value); Assert.AreEqual(400m, myContract.CalculateOverduePrincipal(new DateTime(2006, 4, 9)).Value); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); Assert.AreEqual(400m, myContract.CalculateOverduePrincipal(new DateTime(2006, 4, 9)).Value); myContract.Repay(2, new DateTime(2006, 3, 1), 230, true, false); Assert.AreEqual(200m, myContract.CalculateOverduePrincipal(new DateTime(2006, 4, 9)).Value); myContract.Repay(3, new DateTime(2006, 4, 3), 130, true, false); Assert.AreEqual(100m, myContract.CalculateOverduePrincipal(new DateTime(2006, 4, 9)).Value); }
public void TestRepayFlateLoanWhenKeepNotExpectedInstallmentButEntirlyPaidButNoCancelFees() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INTEREST_RATE_DECIMAL_PLACES, 2); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency {Id = 1, UseCents = true}, KeepExpectedInstallment = false }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())) { NonRepaymentPenalties = {InitialAmount = 0.003}, AnticipatedTotalRepaymentPenalties = 0.003 }; myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); RepaymentEvent repayEvent = myContract.Repay(2, new DateTime(2006, 3, 1), 1032.4m, false, false); Assert.AreEqual(2.4m, repayEvent.Fees.Value); Assert.AreEqual(30, repayEvent.Interests.Value); Assert.AreEqual(1000, repayEvent.Principal.Value); Assert.AreEqual(30, myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(0).CapitalRepayment.Value); Assert.AreEqual(1000, myContract.GetInstallment(0).OLB.Value); Assert.AreEqual(0, myContract.GetInstallment(0).PaidCapital.Value); Assert.AreEqual(30, myContract.GetInstallment(0).PaidInterests.Value); Assert.AreEqual(30, myContract.GetInstallment(1).InterestsRepayment.Value); Assert.AreEqual(200, myContract.GetInstallment(1).CapitalRepayment.Value); Assert.AreEqual(1000, myContract.GetInstallment(1).OLB.Value); Assert.AreEqual(200, myContract.GetInstallment(1).PaidCapital.Value); Assert.AreEqual(30, myContract.GetInstallment(1).PaidInterests.Value); Assert.AreEqual(0, myContract.GetInstallment(2).InterestsRepayment.Value); Assert.AreEqual(800, myContract.GetInstallment(2).CapitalRepayment.Value); Assert.AreEqual(800, myContract.GetInstallment(2).OLB.Value); Assert.AreEqual(800, myContract.GetInstallment(2).PaidCapital.Value); Assert.AreEqual(0, myContract.GetInstallment(2).PaidInterests.Value); Assert.AreEqual(0, myContract.GetInstallment(3).InterestsRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(3).CapitalRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(3).OLB.Value); Assert.AreEqual(0, myContract.GetInstallment(3).PaidCapital.Value); Assert.AreEqual(0, myContract.GetInstallment(3).PaidInterests.Value); Assert.AreEqual(0, myContract.GetInstallment(4).InterestsRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(4).CapitalRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(4).OLB.Value); Assert.AreEqual(0, myContract.GetInstallment(4).PaidCapital.Value); Assert.AreEqual(0, myContract.GetInstallment(4).PaidInterests.Value); Assert.AreEqual(0, myContract.GetInstallment(5).InterestsRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(5).CapitalRepayment.Value); Assert.AreEqual(0, myContract.GetInstallment(5).OLB.Value); Assert.AreEqual(0, myContract.GetInstallment(5).PaidCapital.Value); Assert.AreEqual(0, myContract.GetInstallment(5).PaidInterests.Value); }
public void TestCalculatePendingRepayment() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, KeepExpectedInstallment = false, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 2, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); PaymentMethod paymentMethod = new PaymentMethod(2, "Voucher", "", true); RepaymentEvent pEvent = myContract.Repay(1, new DateTime(2006, 6, 1), 30, true, 0, 0, false, 0, true, false, true, paymentMethod); Assert.IsTrue(myContract.GetInstallment(0).IsRepaid); Assert.AreEqual(pEvent.Code, "PBLR"); Assert.IsTrue(myContract.GetInstallment(0).IsPending); myContract.ConfirmPendingRepayment(); Assert.IsFalse(myContract.GetInstallment(0).IsPending); }
public void TestRepayFlateLoanWhenKeepNotExpectedInstallmentButSecondInstallmentNotEntirlyPaidTheSecondInstallment() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; package.KeepExpectedInstallment = false; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.Repay(1, new DateTime(2006, 2, 1), 30, true, false); myContract.Repay(2, new DateTime(2006, 3, 1), 200, true, false); Assert.AreEqual(30m, myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(0m, myContract.GetInstallment(0).CapitalRepayment.Value); Assert.AreEqual(1000m, myContract.GetInstallment(0).OLB.Value); Assert.AreEqual(0m, myContract.GetInstallment(0).PaidCapital.Value); Assert.AreEqual(30m, myContract.GetInstallment(0).PaidInterests.Value); Assert.AreEqual(30m, myContract.GetInstallment(1).InterestsRepayment.Value); Assert.AreEqual(200m, myContract.GetInstallment(1).CapitalRepayment.Value); Assert.AreEqual(1000m, myContract.GetInstallment(1).OLB.Value); Assert.AreEqual(170m, myContract.GetInstallment(1).PaidCapital.Value); Assert.AreEqual(30m, myContract.GetInstallment(1).PaidInterests.Value); Assert.AreEqual(30m, myContract.GetInstallment(2).InterestsRepayment.Value); Assert.AreEqual(200m, myContract.GetInstallment(2).CapitalRepayment.Value); Assert.AreEqual(800m, myContract.GetInstallment(2).OLB.Value); Assert.AreEqual(0m, myContract.GetInstallment(2).PaidCapital.Value); Assert.AreEqual(0m, myContract.GetInstallment(2).PaidInterests.Value); }
public void TestCountFeesWithSmallPrepayment() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1, UseCents = true } }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 1, new DateTime(2010, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.NonRepaymentPenalties.OverDuePrincipal = 0.01; Assert.AreEqual(new DateTime(2010, 2, 1), myContract.GetInstallment(0).ExpectedDate); Assert.AreEqual(new DateTime(2010, 3, 1), myContract.GetInstallment(1).ExpectedDate); myContract.Repay(1, new DateTime(2010, 2, 1), 30, true, false); myContract.Repay(2, new DateTime(2010, 2, 26), 30, true, false); RepaymentEvent rPE = myContract.Repay(2, new DateTime(2010, 3, 4), 196.58m, false, false); Assert.AreEqual(5.63m, rPE.Fees.Value); Assert.AreEqual(3.2m, rPE.Interests.Value); Assert.AreEqual(187.75m, rPE.Principal.Value); Assert.AreEqual(myContract.GetInstallment(1).IsRepaid, true); }
public void TestRepaySecondInstallmentDecliningRateNoOverPaid() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1, UseCents = true}, RoundingType = ORoundingType.Approximate }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 0, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); myContract.Repay(1, new DateTime(2006, 2, 1), 184.60m, false, false); myContract.Repay(2, new DateTime(2006, 3, 1), 184.60m, false, false); Assert.AreEqual(159.24m, myContract.GetInstallment(1).PaidCapital.Value); Assert.AreEqual(25.36m, myContract.GetInstallment(1).PaidInterests.Value); Assert.IsTrue(myContract.GetInstallment(1).IsRepaid); }
public void TestDisburseWhenDisableFeesTrue() { ApplicationSettings pDataParam = ApplicationSettings.GetInstance(""); pDataParam.DeleteAllParameters(); pDataParam.AddParameter("ALIGN_INSTALLMENTS_ON_REAL_DISBURSEMENT_DATE", false); pDataParam.AddParameter("PAY_FIRST_INSTALLMENT_REAL_VALUE", true); pDataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); pDataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Bi-Weelky", 14, 0), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; Loan myContract = new Loan(package,1000,0.02m,6,1,new DateTime(2006,1,2), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); EntryFee productFee = new EntryFee(); productFee.Value = 5; productFee.IsRate = true; LoanEntryFee entryFee = new LoanEntryFee(); entryFee.FeeValue = 5; entryFee.ProductEntryFee = productFee; myContract.LoanEntryFeesList = new List<LoanEntryFee>(); myContract.LoanEntryFeesList.Add(entryFee); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006,1,6),false,true); Assert.AreEqual(new DateTime(2006,1,2),myContract.StartDate); Assert.AreEqual(14.29m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(1000m,lDE.Amount.Value); Assert.AreEqual(null, lDE.Commissions); }
public void NonRepaidInstallments() { LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, Currency = new Currency {Id = 1} }; Loan loan = new Loan(package, 1000, 0.02m, 5, 0, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); loan.Repay(1, new DateTime(2006, 2, 1), 220, true, true); Assert.AreEqual(loan.GetInstallment(0).IsRepaid, true); int num = 2; foreach (Installment i in loan.NonRepaidInstallments) { Assert.AreEqual(i.Number, num); num++; } }
public void TestDisburseWhenDisburseDateGreaterThanContractStartDate() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); //startdate = 1/1/2006 //expectedFirstInstallment = 1/2/2006 //real startdate = 6/1/2006 LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.Flat, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1 } }; EntryFee productEntryFee = new EntryFee(); productEntryFee.IsRate = true; productEntryFee.Value = 5;//5% of an amount productEntryFee.Id = 21; productEntryFee.Name = "Test entry fee"; package.EntryFees = new List<EntryFee>(); package.EntryFees.Add(productEntryFee); Loan myContract = new Loan( package, 1000, 0.03m, 6, 1, new DateTime(2006,1,1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User()) ); LoanEntryFee fee = new LoanEntryFee(); fee.ProductEntryFee = package.EntryFees[0]; fee.FeeValue = (decimal)fee.ProductEntryFee.Value; fee.ProductEntryFeeId = (int) package.EntryFees[0].Id; myContract.LoanEntryFeesList=new List<LoanEntryFee>(); myContract.LoanEntryFeesList.Add(fee); LoanDisbursmentEvent lDE = myContract.Disburse(new DateTime(2006,1,6),false,false); Assert.AreEqual(new DateTime(2006,1,1),myContract.StartDate); Assert.AreEqual(25m,myContract.GetInstallment(0).InterestsRepayment.Value); Assert.AreEqual(1000m,lDE.Amount.Value); Assert.AreEqual(50m, lDE.Commissions[0].Fee.Value); }
public void TestRepayThirdInstallmentDecliningRateWithOverPaid() { ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); ApplicationSettings.GetInstance("").UpdateParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); LoanProduct package = new LoanProduct { InstallmentType = new InstallmentType(1, "Monthly", 0, 1), LoanType = OLoanTypes.DecliningFixedInstallments, ChargeInterestWithinGracePeriod = true, Currency = new Currency { Id = 1, UseCents = true} }; Loan myContract = new Loan(package, 1000, 0.03m, 6, 0, new DateTime(2006, 1, 1), new User(), ApplicationSettings.GetInstance(""), NonWorkingDateSingleton.GetInstance(""), ProvisionTable.GetInstance(new User()), ChartOfAccounts.GetInstance(new User())); Assert.AreEqual(1000, _CheckInstalmentsTotalPrincipal(myContract).Value); myContract.AnticipatedTotalRepaymentPenalties = 0.01; myContract.AnticipatedPartialRepaymentPenalties = 0.01; myContract.Repay(1, new DateTime(2006, 2, 1), 184.60m, true, false); myContract.Repay(2, new DateTime(2006, 3, 1), 184.60m, true, false); RepaymentEvent rPE = myContract.Repay(3, new DateTime(2006, 4, 3), 250m, false, false); Assert.AreEqual(5.22m, rPE.Fees.Value); Assert.AreEqual(20.58m, rPE.Interests.Value); Assert.AreEqual(224.2m, rPE.Principal.Value); Assert.AreEqual(164.02m, myContract.GetInstallment(2).PaidCapital.Value); Assert.AreEqual(20.58m, myContract.GetInstallment(2).PaidInterests.Value); Assert.IsTrue(myContract.GetInstallment(2).IsRepaid); Assert.AreEqual(149.46m, myContract.GetInstallment(3).CapitalRepayment.Value); Assert.AreEqual(13.86m, myContract.GetInstallment(3).InterestsRepayment.Value); Assert.AreEqual(461.96m, myContract.GetInstallment(3).OLB.Value); }