コード例 #1
0
        private static Installment BuildNext(Installment previous, IScheduleConfiguration configuration)
        {
            if (previous == null)
            {
                throw new ArgumentException("Previous installment cannot be null.");
            }

            if (previous.Number == configuration.NumberOfInstallments)
            {
                return(null);
            }
            var installment = new Installment
            {
                Number             = previous.Number + 1,
                StartDate          = previous.ExpectedDate,
                ExpectedDate       = configuration.PeriodPolicy.GetNextDate(previous.ExpectedDate),
                InterestsRepayment = 0m,
                CapitalRepayment   = 0m,
                OLB        = previous.OLB - previous.CapitalRepayment,
                FeesUnpaid = 0
            };

            if (configuration.GracePeriod < installment.Number)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }
            return(installment);
        }
コード例 #2
0
        private static decimal CalculateFirstInstallmentInterest(Installment installment,
                                                                 IScheduleConfiguration configuration)
        {
            var daysInPeriod = configuration.PeriodPolicy.GetNumberOfDays(installment, configuration.DateShiftPolicy);
            var daysInYear   = configuration.YearPolicy.GetNumberOfDays(installment.ExpectedDate);
            var interest     = installment.OLB * configuration.InterestRate / 100 * daysInPeriod / daysInYear;

            //if schedule is flat
            if (configuration.CalculationPolicy.GetType() == typeof(FlatInstallmentCalculationPolicy))
            {
                var numberOfPeriods =
                    (decimal)
                    (configuration.PeriodPolicy.GetNumberOfPeriodsInYear(
                         configuration.PreferredFirstInstallmentDate, configuration.YearPolicy));
                interest = configuration.Amount * configuration.InterestRate / numberOfPeriods / 100;

                if (configuration.ChargeActualInterestForFirstInstallment)
                {
                    var nextDate    = configuration.PeriodPolicy.GetNextDate(configuration.StartDate);
                    var numerator   = (installment.ExpectedDate - configuration.StartDate).Days;
                    var denominator = (nextDate - configuration.StartDate).Days;
                    interest = interest * numerator / denominator;
                }
            }
            return(configuration.RoundingPolicy.Round(interest.Value));
        }
コード例 #3
0
        private static IInstallment BuildNext(IInstallment previous, IScheduleConfiguration configuration)
        {
            if (previous == null)
            {
                throw new ArgumentException("Previous installment cannot be null.");
            }

            if (previous.Number == configuration.NumberOfInstallments)
            {
                return(null);
            }
            var installment = new Installment
            {
                Number    = previous.Number + 1,
                StartDate = previous.EndDate,
                EndDate   = configuration.PeriodPolicy.GetNextDate(previous.EndDate),
                Olb       = previous.Olb - previous.Principal,
            };

            if (configuration.GracePeriod < installment.Number)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }
            return(installment);
        }
コード例 #4
0
        public List<IInstallment> BuildTranche(IEnumerable<IInstallment> schedule, IScheduleBuilder scheduleBuilder, IScheduleConfiguration scheduleConfiguration, ITrancheConfiguration trancheConfiguration)
        {
            var rhc = (IScheduleConfiguration)scheduleConfiguration.Clone();
            rhc.Amount = trancheConfiguration.Amount;
            rhc.NumberOfInstallments = trancheConfiguration.NumberOfInstallments;
            rhc.GracePeriod = trancheConfiguration.GracePeriod;
            rhc.InterestRate = trancheConfiguration.InterestRate;
            rhc.StartDate = trancheConfiguration.StartDate;
            rhc.PreferredFirstInstallmentDate = trancheConfiguration.PreferredFirstInstallmentDate;

            var lhc = (IScheduleConfiguration)rhc.Clone();
            lhc.Amount = schedule.Sum(i => i.Principal - i.PaidPrincipal);
            if (!trancheConfiguration.ApplyNewInterestRateToOlb)
            {
                lhc.InterestRate = scheduleConfiguration.InterestRate;
            }

            var lhs = scheduleBuilder.BuildSchedule(lhc);
            var rhs = scheduleBuilder.BuildSchedule(rhc);

            var result = new List<IInstallment>();

            // Merge the two schedules
            var max = Math.Max(lhs.Count, rhs.Count);
            for (var i = 0; i < max; i++)
            {
                var lhi = i >= lhs.Count ? null : lhs[i];
                var rhi = i >= rhs.Count ? null : rhs[i];

                IInstallment installment;

                if (lhi == null)
                {
                    installment = rhi;
                }
                else if (rhi == null)
                {
                    installment = lhi;
                }
                else
                {
                    installment = new Installment
                    {
                        Number = lhi.Number,
                        StartDate = lhi.StartDate,
                        EndDate = lhi.EndDate,
                        RepaymentDate = lhi.RepaymentDate,
                        Principal = lhi.Principal + rhi.Principal,
                        Interest = lhi.Interest + rhi.Interest,
                        Olb = lhi.Olb + rhi.Olb,
                    };
                }
                result.Add(installment);
            }

            result[0].Interest += GetExtraInterest(schedule, scheduleConfiguration, trancheConfiguration);
            return result;
        }
コード例 #5
0
        private static IInstallment BuildFirst(IScheduleConfiguration configuration)
        {
            var installment = new Installment
            {
                Number = 1,
                StartDate = configuration.StartDate,
                EndDate = configuration.PreferredFirstInstallmentDate,
                Olb = configuration.Amount,
            };
            if (configuration.GracePeriod == 0)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }

            return installment;
        }
コード例 #6
0
        private static decimal CalculateInterest(Installment installment, IScheduleConfiguration configuration)
        {
            var daysInPeriod = configuration.PeriodPolicy.GetNumberOfDays(installment.ExpectedDate);//, configuration.DateShiftPolicy);
            var daysInYear   = configuration.YearPolicy.GetNumberOfDays(installment.ExpectedDate);
            var interest     = installment.OLB * configuration.InterestRate / 100 * daysInPeriod / daysInYear;

            //if schedule is flat
            if (configuration.CalculationPolicy.GetType() == typeof(FlatInstallmentCalculationPolicy))
            {
                var numberOfPeriods =
                    (decimal)
                    (configuration.PeriodPolicy.GetNumberOfPeriodsInYear(
                         configuration.PreferredFirstInstallmentDate, configuration.YearPolicy));
                interest = configuration.Amount * configuration.InterestRate / numberOfPeriods / 100;
            }
            return(configuration.RoundingPolicy.Round(interest.Value));
        }
コード例 #7
0
        private static IInstallment BuildFirst(IScheduleConfiguration configuration)
        {
            var installment = new Installment
            {
                Number    = 1,
                StartDate = configuration.StartDate,
                EndDate   = configuration.PreferredFirstInstallmentDate,
                Olb       = configuration.Amount,
            };

            if (configuration.GracePeriod == 0)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }

            return(installment);
        }
コード例 #8
0
ファイル: ScheduleBuilder.cs プロジェクト: jay3126/opencbs
        private static IInstallment BuildNext(IInstallment previous, IScheduleConfiguration configuration)
        {
            if (previous == null) throw new ArgumentException("Previous installment cannot be null.");

            if (previous.Number == configuration.NumberOfInstallments) return null;
            var installment = new Installment
            {
                Number = previous.Number + 1,
                StartDate = previous.EndDate,
                EndDate = configuration.PeriodPolicy.GetNextDate(previous.EndDate),
                Olb = previous.Olb - previous.Principal,
            };
            if (configuration.GracePeriod < installment.Number)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }
            return installment;
        }
コード例 #9
0
        private static Installment BuildFirst(IScheduleConfiguration configuration)
        {
            var installment = new Installment
            {
                Number             = 1,
                StartDate          = configuration.StartDate,
                ExpectedDate       = configuration.PreferredFirstInstallmentDate,
                OLB                = configuration.Amount,
                CapitalRepayment   = 0m,
                InterestsRepayment = 0m,
                FeesUnpaid         = 0
            };

            if (configuration.GracePeriod == 0)
            {
                configuration.CalculationPolicy.Calculate(installment, configuration);
            }

            return(installment);
        }
コード例 #10
0
        public List <Installment> BuildTranche(IEnumerable <Installment> schedule, IScheduleBuilder scheduleBuilder, IScheduleConfiguration scheduleConfiguration, ITrancheConfiguration trancheConfiguration)
        {
            var rhc = (IScheduleConfiguration)scheduleConfiguration.Clone();

            rhc.Amount = trancheConfiguration.Amount;
            rhc.NumberOfInstallments          = trancheConfiguration.NumberOfInstallments;
            rhc.GracePeriod                   = trancheConfiguration.GracePeriod;
            rhc.InterestRate                  = trancheConfiguration.InterestRate;
            rhc.StartDate                     = trancheConfiguration.StartDate;
            rhc.PreferredFirstInstallmentDate = trancheConfiguration.PreferredFirstInstallmentDate;

            var lhc = (IScheduleConfiguration)rhc.Clone();

            lhc.Amount = schedule.Sum(i => i.CapitalRepayment.Value - i.PaidCapital.Value);
            if (!trancheConfiguration.ApplyNewInterestRateToOlb)
            {
                lhc.InterestRate = scheduleConfiguration.InterestRate;
            }

            var lhs = scheduleBuilder.BuildSchedule(lhc);
            var rhs = scheduleBuilder.BuildSchedule(rhc);

            var result = new List <Installment>();

            // Merge the two schedules
            var max = Math.Max(lhs.Count, rhs.Count);

            for (var i = 0; i < max; i++)
            {
                var lhi = i >= lhs.Count ? null : lhs[i];
                var rhi = i >= rhs.Count ? null : rhs[i];

                Installment installment;

                if (lhi == null)
                {
                    installment = rhi;
                }
                else if (rhi == null)
                {
                    installment = lhi;
                }
                else
                {
                    installment = new Installment
                    {
                        Number       = lhi.Number,
                        StartDate    = lhi.StartDate,
                        ExpectedDate = lhi.ExpectedDate,
                        //RepaymentDate = lhi.RepaymentDate,
                        CapitalRepayment   = lhi.CapitalRepayment + rhi.CapitalRepayment,
                        InterestsRepayment = lhi.InterestsRepayment + rhi.InterestsRepayment,
                        OLB = lhi.OLB + rhi.OLB,
                    };
                }
                result.Add(installment);
            }

            result[0].InterestsRepayment += GetExtraInterest(schedule, scheduleConfiguration, trancheConfiguration);
            return(result);
        }