Example #1
0
 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 });
 }
Example #2
0
        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;
        }
Example #3
0
        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);
        }
Example #5
0
 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);
 }
Example #6
0
        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();
        }
Example #7
0
        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;
        }
Example #8
0
        /// <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();
        }
Example #9
0
        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;
        }
Example #10
0
 public static OCurrency GetStockBalance(Loan pCredit, ApplicationSettings settings, ProvisionTable pProvisionningTable, string pAccountNumber)
 {
     OCurrency balance = 0;
     return balance;
 }
Example #11
0
        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;
        }
Example #12
0
 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;
 }
Example #13
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;
 }
Example #14
0
 public Guarantee(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt)
 {
 }