public void TestFixtureSetUp() { provisionTable = ProvisionTable.GetInstance(new User()); provisionTable.ProvisioningRates = new List<ProvisioningRate>(); provisionTable.Add(new ProvisioningRate { Number = 1, NbOfDaysMin = 0, NbOfDaysMax = 0, ProvisioningValue = 2, ProvisioningInterest=2, ProvisioningPenalty=2 }); provisionTable.Add(new ProvisioningRate { Number = 2, NbOfDaysMin = 1, NbOfDaysMax = 30, ProvisioningValue = 10, ProvisioningInterest = 10, ProvisioningPenalty = 10 }); provisionTable.Add(new ProvisioningRate { Number = 3, NbOfDaysMin = 31, NbOfDaysMax = 60, ProvisioningValue = 25, ProvisioningInterest = 25, ProvisioningPenalty = 25 }); }
private static OCurrency _LoanLossReserveBalance(Loan pCredit,ProvisionTable pProvisionningTable, int writeOffDays) { OCurrency balance = 0; if (!pCredit.Disbursed) return balance; if (pCredit.GetPastDueDays(TimeProvider.Today) == 0) return balance; if (pCredit.GetPastDueDays(TimeProvider.Today) > writeOffDays) return balance; foreach (Installment installment in pCredit.InstallmentList) { if (installment.ExpectedDate >= TimeProvider.Today) break; balance += (installment.InterestsRepayment - installment.PaidInterests); } balance += pCredit.GetUnpaidLatePenalties(TimeProvider.Today); int pastDueDays = pCredit.GetPastDueDays(TimeProvider.Today); balance += pCredit.GetOlb() * Convert.ToDecimal(pProvisionningTable.GetProvisiningRateByNbOfDays(pastDueDays).Rate); OCurrency realBalance = 0; return balance > realBalance ? balance : realBalance; }
public static bool CheckDegradeToBadLoan(Loan pLoan, ApplicationSettings settings, ProvisionTable pProvisionTable, DateTime pDate, bool authorizeSeveralPastDueEventByPeriod, int? pPstDueDays,User pUser) { DateTime date; int pastDueDays; if (pPstDueDays.HasValue) { pastDueDays = pPstDueDays.Value; date = pDate.AddDays(pastDueDays - pLoan.GetPastDueDays(pDate)); } else { date = pDate; pastDueDays = pLoan.GetPastDueDays(date); } //In this case, the loan is not considered as bad loan if (pastDueDays < PAST_DUE_MIN_DAYS) { return false; } //A loan is only degraded from cash credit to bad loan one time OCurrency cashBalance = 0; //pLoan.ChartOfAccounts.GetAccountByNumber(OAccounts.CASH_CREDIT, pLoan.Product.Currency.Id, pLoan, OBookingDirections.Both).Balance; if (cashBalance != 0) { pLoan.BadLoan = true; } else { //Downgrading the loan to unrecoverable bad loans is done once for loan with past due days greater than 180 if (pastDueDays > settings.BadLoanDays) { pLoan.BadLoan = true; } } return 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"); _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 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 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(); }
public ProvisionEvent GetProvisionEvent(DateTime dateTime, ProvisionTable provisionTable) { int lateDays = CalculatePastDueSinceLastRepayment(dateTime); OCurrency rate = 0; foreach (ProvisioningRate provisioningRate in provisionTable.ProvisioningRates) { if(lateDays >= provisioningRate.NbOfDaysMin && lateDays <= provisioningRate.NbOfDaysMax) { rate = (decimal)provisioningRate.Rate; } if(Rescheduled && provisioningRate.NbOfDaysMin < 0 && provisioningRate.NbOfDaysMax < 0) { rate = (decimal)provisioningRate.Rate; } } ProvisionEvent provisionEvent = new ProvisionEvent { Id = 0, Code = "LLPE", Amount = GetOlb() * rate, OverdueDays = lateDays, Rate = rate, Date = TimeProvider.Now, User = User.CurrentUser, Description = Code, ContracId = Id }; //check if we have a event for that date ProvisionEvent p = Events.GetProvisionEvents().Find(item => item.Date == provisionEvent.Date.Date && item.Amount == provisionEvent.Amount && item.OverdueDays == provisionEvent.OverdueDays); if (provisionEvent.Amount > 0 && p == null) { Events.Add(provisionEvent); return provisionEvent; } return null; }
/// <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 GetStockBalance(Loan pCredit, ApplicationSettings settings, ProvisionTable pProvisionningTable, string pAccountNumber) { OCurrency balance = 0; return balance; }
private static OCurrency _IncomeLoanLossBalance(Loan pCredit, ProvisionTable pProvisionningTable) { OCurrency olb = pCredit.GetOlb(); OCurrency rate = Convert.ToDecimal(pProvisionningTable.GetProvisiningRateByNbOfDays(0).Rate); if (pCredit.GetPastDueDays(TimeProvider.Today) != 0) olb = 0; if (pCredit.WrittenOff) return 0; if (!pCredit.Disbursed) return 0; if (pCredit.AllInstallmentsRepaid) return 0; if (!pCredit.BadLoan) return (pCredit.Amount - olb) * rate; else return (pCredit.Amount) * rate; }
private static OCurrency _ExpensesLoanLossBalance(Loan pCredit,ProvisionTable pProvisionningTable) { if (pCredit.Disbursed && !pCredit.AllInstallmentsRepaid && !pCredit.WrittenOff) return pCredit.Amount * Convert.ToDecimal(pProvisionningTable.GetProvisiningRateByNbOfDays(0).Rate); else return 0; }
private static OCurrency _LiabilitiesLoanLossBalance(Loan pCredit,ProvisionTable pProvisionningTable) { if (pCredit.Disbursed && !pCredit.BadLoan) if (pCredit.GetPastDueDays(TimeProvider.Today) == 0) return pCredit.GetOlb() * Convert.ToDecimal(pProvisionningTable.GetProvisiningRateByNbOfDays(0).Rate); else return 0; else return 0; }
public Guarantee(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt) { }