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); }
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)); }
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); }
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; }
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; }
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)); }
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); }
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; }
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); }
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); }