public NonWorkingDateManagement(User pUser) : base(pUser) { _user = pUser; dbParam = ApplicationSettings.GetInstance(pUser.Md5); nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(_user.Md5); }
public CreditContractRepayment(Loan contract, CreditContractOptions creditOptions, DateTime pDate,int pInstallmentNumber, User user, ApplicationSettings pGeneralSettings,NonWorkingDateSingleton pNonWorkingDate) { _generalSettings = pGeneralSettings; _nWds = pNonWorkingDate; _date = pDate.Date; _installmentNumber = pInstallmentNumber; PaidIstallments = new List<Installment>(); _amountToRepayTotalyLoan = new CalculateMaximumAmountToRepayStrategy(creditOptions, contract.Copy(), user, _generalSettings,_nWds); _amountToRegradingLoan = new CalculateMaximumAmountToRegradingLoanStrategy(creditOptions, contract.Copy(), user, _generalSettings, _nWds); _amountToRepayInstallment = new CalculateAmountToRepaySpecifiedInstallmentStrategy(creditOptions, contract.Copy(), user, _generalSettings, _nWds); _calculateInstallments = new Repayment.RepayLateInstallments.CalculateInstallments(creditOptions, contract, user, _generalSettings, _nWds); _calculateRealInterestInstallments = new CalculateRealInterestInstallments(creditOptions, _amountToRepayTotalyLoan, contract, _generalSettings, _nWds); _feesForAnticipatedRepayment = new CalculateAnticipatedFeesStrategy(creditOptions, contract, _generalSettings); _repayNextInstallments = new RepayNextInstallmentsStrategy(contract, creditOptions, user, _generalSettings); _repaymentMethod = new RepaymentMethod(contract,creditOptions); _loan = contract; CalculateMaximumAmountAuthorizedToRepay(); CalculateAmountToRegradingLoan(); CalculateMaximumAmountForEscapedMember(); LoanOptions = creditOptions; }
public void TestIfPublicHolidaysAreCorrectlyFilled() { nonWorkingDateHelper = nonWorkingDateManager.FillNonWorkingDateHelper(); Assert.AreEqual(3, nonWorkingDateHelper.PublicHolidays.Count); Assert.AreEqual("Idi Navruz", nonWorkingDateHelper.PublicHolidays[new DateTime(2006, 3, 21)]); nonWorkingDateHelper = nonWorkingDateManager.FillNonWorkingDateHelper(); Assert.AreEqual(3, nonWorkingDateHelper.PublicHolidays.Count); }
public CalculateAmountToRepaySpecifiedInstallmentStrategy(CreditContractOptions pCCo,Loan pContract, User pUser, ApplicationSettings pGeneralSettings,NonWorkingDateSingleton pNonWorkingDate) { _user = pUser; _generalSettings = pGeneralSettings; _nWds = pNonWorkingDate; _contract = pContract; _cCo = pCCo; }
public CalculateMaximumAmountToRegradingLoanStrategy(CreditContractOptions pCCo,Loan pContract, User pUser, ApplicationSettings pGeneralSettings,NonWorkingDateSingleton pNonWorkingDate) { _user = pUser; _generalSettings = pGeneralSettings; _nWds = pNonWorkingDate; _contract = pContract; _cCo = pCCo; }
public CalculateInstallments(CreditContractOptions pCco, Loan pContract, User pUser, ApplicationSettings pGeneralSettings,NonWorkingDateSingleton pNonWorkingDate) { _generalSettings = pGeneralSettings; _nWds = pNonWorkingDate; _contract = pContract; _cCo = pCco; _methodToRepayFees = new RepayFeesStrategy(pCco); _methodToRepayInterest = new RepayInterestStrategy(pCco); _methodToRepayCommission = new RepayCommisionStrategy(pCco); PaidIstallments = new List<Installment>(); }
public RescheduleLoanEvent Reschedule(ReschedulingOptions ro, Loan contract, NonWorkingDateSingleton nwdS, ApplicationSettings applicationSettings) { _contract = contract; _nwdS = nwdS; _generalSettings = applicationSettings; switch (contract.Product.LoanType) { case OLoanTypes.Flat: _Reschedule_Flat(ro); break; case OLoanTypes.DecliningFixedPrincipal: _Reschedule_FixedPrincipal(ro); break; case OLoanTypes.DecliningFixedInstallments: _Reschedule_DecliningFixedInstallments(ro); break; } _Reschedule_AdjustOverpaid(); RescheduleLoanEvent rSe = new RescheduleLoanEvent { Date = ro.ReschedulingDate, Amount = contract.CalculateActualOlb(), Interest = contract.GetTotalInterestDue(), ClientType = contract.ClientType, BadLoan = contract.BadLoan, NbOfMaturity = ro.NewInstallments, DateOffset = ro.RepaymentDateOffset, GracePeriod = ro.GracePeriod, ChargeInterestDuringShift = ro.ChargeInterestDuringShift, ChargeInterestDuringGracePeriod = ro.ChargeInterestDuringGracePeriod, InstallmentNumber = contract.GetLastFullyRepaidInstallment() == null ? 1 : contract.GetLastFullyRepaidInstallment().Number + 1 }; _contract.CalculateStartDates(); return rSe; }
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; }
private static int CountDaysOff(DateTime beginDate, DateTime endDate, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { var dt = new DateTime(); int countDayOff = 0; if (!pGeneralSettings.IsCalculationLateFeesDuringHolidays) { //count day off for (int day = 1; day <= (endDate - beginDate).Days; day++) { //week end if (!pGeneralSettings.DoNotSkipNonWorkingDays) if (((int)(dt.DayOfWeek) == pGeneralSettings.WeekEndDay1) || ((int)(dt.DayOfWeek) == pGeneralSettings.WeekEndDay2)) countDayOff++; //holidays countDayOff += pNonWorkingDate.PublicHolidays.Keys.Count(publicHoliday => dt == publicHoliday); dt = beginDate.AddDays(day); } } return countDayOff; }
public static OCurrency AnticipateFeesBasedOnOlb(Loan pContract, DateTime pDate, int pInstallmentNumber, bool pForClosure, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate, OPaymentType pPaymentType) { OCurrency fees = AnticipateCalculateFeesBasedOnOlb(pContract, pDate, pInstallmentNumber, pPaymentType); return fees; }
public void TestFixtureSetUp() { _user = new User(); _provisions = ProvisionTable.GetInstance(_user); _provisions.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 30, Rate = 10 }); _provisions.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 31, NbOfDaysMax = 60, Rate = 25 }); _provisions.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 61, NbOfDaysMax = 90, Rate = 50 }); _provisions.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 91, NbOfDaysMax = 180, Rate = 75 }); _provisions.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 181, NbOfDaysMax = 365, Rate = 100 }); _provisions.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 366, NbOfDaysMax = 99999, Rate = 100 }); _daysOff = NonWorkingDateSingleton.GetInstance(""); _daysOff.WeekEndDay1 = 6; _daysOff.WeekEndDay2 = 0; ApplicationSettings settings = ApplicationSettings.GetInstance(""); settings.DeleteAllParameters(); settings.AddParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash); settings.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, false); settings.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); settings.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); settings.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); }
public NonWorkingDateManagement(string testDB) : base(testDB) { dbParam = ApplicationSettings.GetInstance(""); nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); }
public void TestIfWeekEndDaysAreCorrectlyFilled() { nonWorkingDateHelper = nonWorkingDateManager.FillNonWorkingDateHelper(); Assert.AreEqual(6, nonWorkingDateHelper.WeekEndDay1); Assert.AreEqual(0, nonWorkingDateHelper.WeekEndDay2); }
public static OCurrency CalculateAnticipateRepayment(Loan pContract, DateTime pDate, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate, OPaymentType pPaymentType) { Installment pInstallment = null; OCurrency interests = 0; Installment priorInstallment; OCurrency olb = 0; OCurrency fees = 0; OCurrency ammountHasToPay = 0; for (int i = 0; i < pContract.NbOfInstallments; i++) { Installment installment = pContract.GetInstallment(i); if (!installment.IsRepaid && installment.ExpectedDate > pDate) { if (pInstallment == null) { pInstallment = installment; if (olb == 0) { olb = pContract.CalculateExpectedOlb(pInstallment.Number, false); } //is case APR on the first installment DateTime expectedDate; if (i == 0) { expectedDate = pContract.StartDate; } else { priorInstallment = pContract.GetInstallment(i - 1); expectedDate = priorInstallment.ExpectedDate; } int daySpan = (pDate - expectedDate).Days < 0 ? 0 : (pDate - expectedDate).Days; int daysInMonth = DateTime.DaysInMonth(pDate.Year, pDate.Month); if (pGeneralSettings.AccountingProcesses == OAccountingProcesses.Accrual) { interests = pInstallment.InterestsRepayment * daySpan / daysInMonth; } else { interests = pInstallment.ExpectedDate > pDate ? 0 : pInstallment.InterestsRepayment; } } fees += CalculateCommision(pContract, pDate, installment.Number, pPaymentType, pGeneralSettings); } if (!installment.IsRepaid && installment.ExpectedDate <= pDate) { ammountHasToPay += installment.InterestsRepayment + installment.PrincipalHasToPay; } } if (interests != 0) interests = pContract.UseCents ? Math.Round(interests.Value, 2) : Math.Round(interests.Value, 0); OCurrency amount = interests + fees + ammountHasToPay; return amount; }
public Loan(LoanProduct pAckage, OCurrency pAmount, decimal pInterestRate, int pNbOfInstallments, int pGracePeriod, DateTime pStartDate, DayOfWeek? meetingDay, User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt, ChartOfAccounts pChartOfAccounts) { _user = pUser; _generalSettings = pGeneralSettings; _nwdS = pNwds; Product = pAckage; NonRepaymentPenalties = new NonRepaymentPenalties(); _events = new EventStock(); _guarantors = new List<Guarantor>(); _collaterals = new List<ContractCollateral>(); _installmentType = pAckage.InstallmentType; _amount = pAmount; _interestRate = pInterestRate; _nbOfInstallments = pNbOfInstallments; GracePeriod = pGracePeriod; CreationDate = pStartDate; _startDate = pStartDate; _firstInstallmentDate = CalculateInstallmentDate(pStartDate, 1); if (meetingDay.HasValue) _firstInstallmentDate = GetMeetingDate(_firstInstallmentDate, meetingDay); _alignAlignDisbursementDate = CalculateAlignDisbursementDate(_firstInstallmentDate); //with this constructor, installment are directly calculated when a new CreditContract is instanciated _installmentList = CalculateInstallments(true); CalculateStartDates(); }
/// <summary> /// Instancy a new CreditContract. Use it if installments need'nt calculate /// </summary> /// <param name="pUser"></param> /// <param name="pGeneralSettings"></param> /// <param name="pNwds"></param> /// <param name="pPt"></param> /// <param name="pChartOfAccounts"></param> public Loan(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt, ChartOfAccounts pChartOfAccounts) { _user = pUser; _generalSettings = pGeneralSettings; _nwdS = pNwds; NonRepaymentPenalties = new NonRepaymentPenalties(); _installmentList = new List<Installment>(); _guarantors = new List<Guarantor>(); _collaterals = new List<ContractCollateral>(); _events = new EventStock(); }
public void TestFixtureSetUp() { _generalSettings = ApplicationSettings.GetInstance(""); _generalSettings.DeleteAllParameters(); _generalSettings.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); _generalSettings.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); _generalSettings.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); _generalSettings.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); _generalSettings.AddParameter(OGeneralSettings.BAD_LOAN_DAYS, "180"); _generalSettings.AddParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); _generalSettings.AddParameter(OGeneralSettings.USE_DAILY_ACCRUAL_OF_PENALTY, false); _provisionningTable = ProvisionTable.GetInstance(new User()); _provisionningTable.ProvisioningRates = new List<ProvisioningRate>(); _provisionningTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 30, ProvisioningValue = 10 }); _provisionningTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 25 }); _provisionningTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 50 }); _provisionningTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 75 }); _provisionningTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 100 }); _provisionningTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 100 }); _nonWorkingDate = NonWorkingDateSingleton.GetInstance(""); _nonWorkingDate.PublicHolidays = new Dictionary<DateTime, string>(); _nonWorkingDate.WeekEndDay1 = 0; _nonWorkingDate.WeekEndDay2 = 1; }
public static OCurrency AnticipateFeesBasedOnOverdueInterest(Loan pContract, DateTime pDate, int pInstallmentNumber, bool pForClosure, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate, OPaymentType pPaymentType) { OCurrency fees = _AnticipateCalculateNonRepaymentPenalties(pContract, pDate, pInstallmentNumber, pPaymentType, pGeneralSettings); return fees.Value; }
public void TestFixtureSetUp() { nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); nonWorkingDateHelper.WeekEndDay1 = 6; nonWorkingDateHelper.WeekEndDay2 = 0; nonWorkingDateHelper.PublicHolidays = new Dictionary<DateTime, string>(); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,1,1),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,8),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,21),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,22),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,5,1),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,5,9),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,6,27),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,9,9),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,11,6),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,11,26),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,1,6),"Christmas"); dataParam = ApplicationSettings.GetInstance(""); dataParam.DeleteAllParameters(); dataParam.AddParameter(OGeneralSettings.USECENTS, true); dataParam.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); dataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); dataParam.AddParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash); dataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); }
public void TestFixtureSetUp() { ProvisionTable provisionTable = ProvisionTable.GetInstance(new User()); provisionTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 30, ProvisioningValue = 10, ProvisioningInterest = 10, ProvisioningPenalty = 10 }); provisionTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 25, ProvisioningInterest = 25, ProvisioningPenalty = 25 }); provisionTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 50, ProvisioningInterest = 50, ProvisioningPenalty = 50 }); provisionTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 75, ProvisioningInterest = 75, ProvisioningPenalty = 75 }); provisionTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 100, ProvisioningInterest = 100, ProvisioningPenalty = 100 }); provisionTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 100, ProvisioningInterest = 100, ProvisioningPenalty = 100 }); nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); nonWorkingDateHelper.WeekEndDay1 = 6; nonWorkingDateHelper.WeekEndDay2 = 0; nonWorkingDateHelper.PublicHolidays = new Dictionary<DateTime, string> { {new DateTime(2006, 1, 1), "New Year Eve"}, {new DateTime(2006, 12, 25), "Christmas"} }; dataParam = ApplicationSettings.GetInstance(""); dataParam.DeleteAllParameters(); dataParam.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); dataParam.AddParameter(OGeneralSettings.OLBBEFOREREPAYMENT, true); dataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); dataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); }
public void TestFixtureSetUp() { nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); nonWorkingDateHelper.WeekEndDay1 = 6; nonWorkingDateHelper.WeekEndDay2 = 0; nonWorkingDateHelper.PublicHolidays = new Dictionary<DateTime, string>(); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 1, 1), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 3, 8), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 3, 21), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 3, 22), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 5, 1), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 5, 9), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 6, 27), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 9, 9), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 11, 6), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 11, 26), "New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006, 1, 6), "Christmas"); ApplicationSettings generalParameters = ApplicationSettings.GetInstance(""); generalParameters.DeleteAllParameters(); generalParameters.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); generalParameters.AddParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Accrual); generalParameters.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); generalParameters.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); generalParameters.AddParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); generalParameters.AddParameter(OGeneralSettings.INTEREST_RATE_DECIMAL_PLACES, 2); ApplicationSettings.GetInstance("").UpdateParameter("CALCULATION_LATE_FEES_DURING_PUBLIC_HOLIDAYS", true); }
private static OCurrency CalculateNonRepaymentPenalties(Loan pContract, DateTime pDate, int installmentNumber, OLateRepaymentTypes repaymentType, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { Installment installment = pContract.GetInstallment(installmentNumber - 1); DateTime date = installment.ExpectedDate; // Calulating of fee in case of previous installment's fee is written off if (installment.PaidCapital + installment.PaidInterests > 0 && installment.PaidFees == 0 && installment.FeesUnpaid > 0) { if (pDate < installment.ExpectedDate) date = pDate; else { var last = pContract.InstallmentList.FindLast(i => i.PaidDate != null); if (last != null && last.PaidDate != null) date = last.PaidDate.Value; } } // foreach (RepaymentEvent rPayment in pContract.Events.GetRepaymentEvents()) { if (rPayment.Date == pDate && rPayment.Deleted == false && installmentNumber == rPayment.InstallmentNumber) { date = pDate; } if (rPayment.InstallmentNumber <= installment.Number && rPayment.Deleted == false && rPayment.Date != pDate && pDate > installment.ExpectedDate && installment.PaidFees != 0) { date = rPayment.Date <= installment.ExpectedDate ? installment.ExpectedDate : rPayment.Date; } } int nbOfDays = (pDate - date).Days < 0 ? 0 : (pDate - date).Days; nbOfDays = nbOfDays - CountDaysOff(date, pDate, pGeneralSettings, pNonWorkingDate); nbOfDays = _CalculatePastDueWithGeneralParameterForRepayment(nbOfDays, pGeneralSettings); if (pContract.GracePeriodOfLateFees >= nbOfDays) { nbOfDays = 0; } double penalties; OCurrency amountHasToPay; if (repaymentType == OLateRepaymentTypes.Principal) { amountHasToPay = installment.PrincipalHasToPay; penalties = pContract.NonRepaymentPenalties.OverDuePrincipal; } else if (repaymentType == OLateRepaymentTypes.Interest) { amountHasToPay = installment.InterestHasToPay; penalties = pContract.NonRepaymentPenalties.OverDueInterest; } else if (repaymentType == OLateRepaymentTypes.Olb) { amountHasToPay = installment.OLB - installment.PaidCapital; penalties = pContract.NonRepaymentPenalties.OLB; } else if (repaymentType == OLateRepaymentTypes.Amount) { amountHasToPay = installment.Amount; penalties = pContract.NonRepaymentPenalties.InitialAmount; } else // Fixed method of late repayments for future implementation; Principal is set for now { amountHasToPay = installment.PrincipalHasToPay; penalties = pContract.NonRepaymentPenalties.OverDuePrincipal; } decimal amount = amountHasToPay.Value * Convert.ToDecimal(penalties) * nbOfDays; amount = pContract.UseCents ? Math.Round(amount, 2, MidpointRounding.AwayFromZero) : Math.Round(amount, 0, MidpointRounding.AwayFromZero); if (pContract.WrittenOff && pGeneralSettings.IsStopWriteOffPenalty) amount = 0; return amount; }
private static OCurrency _CalculateNonRepaymentPenaltiesForClosure(Loan pContract, DateTime pDate, int pInstallmentNumber, OLateRepaymentTypes repaymentType, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { Installment installment = pContract.GetInstallment(pInstallmentNumber - 1); if (pDate <= installment.ExpectedDate) return 0; DateTime baseDate = DateTime.MinValue; DateTime dateForInstallment = installment.PaidDate.HasValue ? installment.PaidDate.Value : installment.ExpectedDate; if (baseDate == DateTime.MinValue) { baseDate = dateForInstallment; } else { if (baseDate < dateForInstallment) baseDate = dateForInstallment; } int pstDueDays = (pDate - baseDate).Days < 0 ? 0 : (pDate - baseDate).Days; pstDueDays = pstDueDays - CountDaysOff(baseDate, pDate, pGeneralSettings, pNonWorkingDate); if(pContract.GracePeriodOfLateFees >= pstDueDays) { pstDueDays = 0; } double penalties; OCurrency amountHasToPay; if (repaymentType == OLateRepaymentTypes.Principal) { amountHasToPay = installment.PrincipalHasToPay; penalties = pContract.NonRepaymentPenalties.OverDuePrincipal; } else if (repaymentType == OLateRepaymentTypes.Interest) { amountHasToPay = installment.InterestHasToPay; penalties = pContract.NonRepaymentPenalties.OverDueInterest; } else if (repaymentType == OLateRepaymentTypes.Olb) { amountHasToPay = installment.OLB; penalties = pContract.NonRepaymentPenalties.OLB; } else if (repaymentType == OLateRepaymentTypes.Amount) { amountHasToPay = installment.Amount; penalties = pContract.NonRepaymentPenalties.InitialAmount; } else // Fixed method of late repayments for future implementation; Principal is set for now { amountHasToPay = installment.PrincipalHasToPay; penalties = pContract.NonRepaymentPenalties.OverDuePrincipal; } return amountHasToPay * penalties * pstDueDays; }
public void TestFixtureSetUp() { nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); nonWorkingDateHelper.WeekEndDay1 = 6; nonWorkingDateHelper.WeekEndDay2 = 0; nonWorkingDateHelper.PublicHolidays = new Dictionary<DateTime, string>(); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,1,1),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,8),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,21),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,3,22),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,5,1),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,5,9),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,6,27),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,9,9),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,11,6),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,11,26),"New Year Eve"); nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,1,6),"Christmas"); _provisionningTable = ProvisionTable.GetInstance(new User()); _provisionningTable.ProvisioningRates = new List<ProvisioningRate>(); _provisionningTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 0, ProvisioningValue = 0.02 }); _provisionningTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 1, NbOfDaysMax = 30, ProvisioningValue = 0.1 }); _provisionningTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 0.25 }); _provisionningTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 0.5 }); _provisionningTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 0.75 }); _provisionningTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 1 }); _provisionningTable.Add(new ProvisioningRate { Number = 7, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 1 }); dataParam = ApplicationSettings.GetInstance(""); dataParam.DeleteAllParameters(); dataParam.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); dataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); dataParam.AddParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash); dataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); dataParam.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); dataParam.AddParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); dataParam.AddParameter(OGeneralSettings.BAD_LOAN_DAYS, "180"); dataParam.AddParameter(OGeneralSettings.INTEREST_RATE_DECIMAL_PLACES, 2); dataParam.AddParameter(OGeneralSettings.USE_DAILY_ACCRUAL_OF_PENALTY, false); }
public static OCurrency FeesBasedOnOlb(Loan pContract, DateTime pDate, int pInstallmentNumber, bool pForClosure, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNonWorkingDate) { if (pContract.NonRepaymentPenalties.OLB != 0) { OCurrency fees = pForClosure ? _CalculateNonRepaymentPenaltiesForClosure(pContract, pDate, pInstallmentNumber, OLateRepaymentTypes.Olb, pGeneralSettings, pNonWorkingDate) : CalculateNonRepaymentPenalties(pContract, pDate, pInstallmentNumber, OLateRepaymentTypes.Olb, pGeneralSettings, pNonWorkingDate); return fees; } return 0; }
public void TestFixtureSetUp() { ProvisionTable provisionTable = ProvisionTable.GetInstance(new User()); provisionTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 30, ProvisioningValue = 10, ProvisioningInterest = 10, ProvisioningPenalty = 10 }); provisionTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 25, ProvisioningInterest = 25, ProvisioningPenalty = 25 }); provisionTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 61, NbOfDaysMax = 90, ProvisioningValue = 50, ProvisioningInterest = 50, ProvisioningPenalty = 50 }); provisionTable.Add(new ProvisioningRate { Number = 4, NbOfDaysMin = 91, NbOfDaysMax = 180, ProvisioningValue = 75, ProvisioningInterest = 75, ProvisioningPenalty = 75 }); provisionTable.Add(new ProvisioningRate { Number = 5, NbOfDaysMin = 181, NbOfDaysMax = 365, ProvisioningValue = 100, ProvisioningInterest = 100, ProvisioningPenalty = 100 }); provisionTable.Add(new ProvisioningRate { Number = 6, NbOfDaysMin = 366, NbOfDaysMax = 99999, ProvisioningValue = 100, ProvisioningInterest = 100, ProvisioningPenalty = 100 }); _nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(""); _nonWorkingDateHelper.WeekEndDay1 = 6; _nonWorkingDateHelper.WeekEndDay2 = 0; _nonWorkingDateHelper.PublicHolidays = new Dictionary<DateTime, string>(); _nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,1,1),"New Year Eve"); _nonWorkingDateHelper.PublicHolidays.Add(new DateTime(2006,12,25),"Christmas"); ApplicationSettings dataParam = ApplicationSettings.GetInstance(""); dataParam.DeleteAllParameters(); dataParam.AddParameter(OGeneralSettings.ACCOUNTINGPROCESS, OAccountingProcesses.Cash); dataParam.AddParameter(OGeneralSettings.PAYFIRSTINSTALLMENTREALVALUE, true); dataParam.AddParameter(OGeneralSettings.CALCULATIONLATEFEESDURINGPUBLICHOLIDAYS, true); dataParam.AddParameter(OGeneralSettings.DONOTSKIPWEEKENDSININSTALLMENTSDATE, false); dataParam.AddParameter(OGeneralSettings.INCREMENTALDURINGDAYOFF, true); dataParam.AddParameter(OGeneralSettings.STOP_WRITEOFF_PENALTY, true); dataParam.AddParameter(OGeneralSettings.INTEREST_RATE_DECIMAL_PLACES, 2); }
public Guarantee(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt) { }