public void CalculatePastDueSinceLastRepayment() { _myContract.Disburse(new DateTime(2006, 1, 1), true, false); Assert.AreEqual(0, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 1))); Assert.AreEqual(3, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 4))); Assert.AreEqual(28, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 1))); _myContract.Repay(1, new DateTime(2006, 2, 3), 30, true, false); //repay tottaly the first installment Assert.AreEqual(0, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 2, 4))); Assert.AreEqual(3, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 4))); _myContract.Repay(2, new DateTime(2006, 3, 1), 200, true, false); //repay partially the second installment (200 instead of 230) Assert.AreEqual(0, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 1))); Assert.AreEqual(3, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 4))); _myContract.Repay(2, new DateTime(2006, 3, 1), 30, true, false); //repay tottaly the second installment Assert.AreEqual(0, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 1))); Assert.AreEqual(0, _myContract.CalculatePastDueSinceLastRepayment(new DateTime(2006, 3, 4))); }
public static OCurrency FeesBasedOnInitialAmount(Loan pContract, DateTime pDate, int pInstallmentNumber, bool pForClosure, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { if (pContract.NonRepaymentPenalties.InitialAmount != 0) { int pastDueDays = pForClosure ? pContract.CalculatePastDueForClosure(pDate) : pContract.CalculatePastDueSinceLastRepayment(pDate); pastDueDays = _CalculatePastDueWithGeneralParameterForRepayment(pastDueDays, pGeneralSettings); if (pContract.GracePeriodOfLateFees >= pastDueDays) { pastDueDays = 0; } OCurrency fees = pContract.Amount * Convert.ToDecimal(pContract.NonRepaymentPenalties.InitialAmount) * (double)pastDueDays; OCurrency amount = pContract.UseCents ? Math.Round(fees.Value, 2, MidpointRounding.AwayFromZero) : Math.Round(fees.Value, 0, MidpointRounding.AwayFromZero); if (pContract.WrittenOff && pGeneralSettings.IsStopWriteOffPenalty) amount = 0; return amount; } return 0; }
public static OCurrency FeesBasedOnInitialAmount(Loan pContract, DateTime pDate, int pInstallmentNumber, bool pForClosure, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { if (pContract.NonRepaymentPenalties.InitialAmount != 0) { int pastDueDays = pForClosure ? pContract.CalculatePastDueForClosure(pDate) : pContract.CalculatePastDueSinceLastRepayment(pDate); pastDueDays = _CalculatePastDueWithGeneralParameterForRepayment(pastDueDays, pGeneralSettings); if (pContract.GracePeriodOfLateFees >= pastDueDays) { pastDueDays = 0; } OCurrency fees = pContract.Amount * Convert.ToDecimal(pContract.NonRepaymentPenalties.InitialAmount) * (double)pastDueDays; OCurrency amount = pContract.UseCents ? Math.Round(fees.Value, 2, MidpointRounding.AwayFromZero) : Math.Round(fees.Value, 0, MidpointRounding.AwayFromZero); if (pContract.WrittenOff && pGeneralSettings.IsStopWriteOffPenalty) { amount = 0; } return(amount); } return(0); }