コード例 #1
0
 public NonWorkingDateManagement(User pUser)
     : base(pUser)
 {
     _user = pUser;
     dbParam = ApplicationSettings.GetInstance(pUser.Md5);
     nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance(_user.Md5);
 }
コード例 #2
0
        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;
        }
コード例 #3
0
 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;
 }
コード例 #5
0
        public CalculateMaximumAmountToRegradingLoanStrategy(CreditContractOptions pCCo,Loan pContract, User pUser, 
            ApplicationSettings pGeneralSettings,NonWorkingDateSingleton pNonWorkingDate)
        {
            _user = pUser;
            _generalSettings = pGeneralSettings;
            _nWds = pNonWorkingDate;

            _contract = pContract;
            _cCo = pCCo;
        }
コード例 #6
0
 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>();
 }
コード例 #7
0
ファイル: Reschedule.cs プロジェクト: TalasZh/opencbs
        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;
        }
コード例 #8
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;
        }
コード例 #9
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;
        }
コード例 #10
0
        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;
        }
コード例 #11
0
ファイル: TestAddTranches.cs プロジェクト: TalasZh/opencbs
 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);
 }
コード例 #12
0
 public NonWorkingDateManagement(string testDB)
     : base(testDB)
 {
     dbParam = ApplicationSettings.GetInstance("");
     nonWorkingDateHelper = NonWorkingDateSingleton.GetInstance("");
 }
コード例 #13
0
 public void TestIfWeekEndDaysAreCorrectlyFilled()
 {
     nonWorkingDateHelper = nonWorkingDateManager.FillNonWorkingDateHelper();
     Assert.AreEqual(6, nonWorkingDateHelper.WeekEndDay1);
     Assert.AreEqual(0, nonWorkingDateHelper.WeekEndDay2);
 }
コード例 #14
0
        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;
        }
コード例 #15
0
ファイル: Loan.cs プロジェクト: TalasZh/opencbs
        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();
        }
コード例 #16
0
ファイル: Loan.cs プロジェクト: TalasZh/opencbs
        /// <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();
        }
コード例 #17
0
ファイル: TestLoan.cs プロジェクト: aelhadi/opencbs
        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;
        }
コード例 #18
0
        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;
        }
コード例 #19
0
 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);
 }
コード例 #21
0
        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);
        }
コード例 #22
0
        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;
        }
コード例 #23
0
        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;
        }
コード例 #24
0
        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);
        }
コード例 #25
0
        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;
        }
コード例 #26
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);
 }
コード例 #27
0
ファイル: Guarantee.cs プロジェクト: aelhadi/opencbs
 public Guarantee(User pUser, ApplicationSettings pGeneralSettings, NonWorkingDateSingleton pNwds, ProvisionTable pPt)
 {
 }