Exemplo n.º 1
0
            internal void Generate(Settings.InstalmentPolicyDetail instalmentPolicyDetail, decimal instalmentAmount, int totalPeriod, DateTime tradeDay, int sequenceOffset = 1)
            {
                decimal monthRate    = this.CalculateMonthRate(instalmentPolicyDetail.InterestRate, _instalment.Frequence);
                decimal remainAmount = instalmentAmount;
                decimal principle;
                decimal interest;

                for (int period = 0; period < totalPeriod; period++)
                {
                    if (this.IsInstalmentDetailExist(period + 1))
                    {
                        continue;
                    }
                    if (_instalment.InstalmentType == InstalmentType.EqualPrincipal || monthRate == 0m)
                    {
                        principle = InstalmentDetailCalculator.Round(instalmentAmount / totalPeriod);
                        interest  = InstalmentDetailCalculator.Round(remainAmount * monthRate);
                    }
                    else
                    {
                        var item = this.CalculateEqualInstalmentPrincipleAndInterest(monthRate, period, totalPeriod, instalmentAmount, remainAmount);
                        principle = item.Item1;
                        interest  = item.Item2;
                    }
                    remainAmount -= principle;
                    if (period == totalPeriod - 1 && remainAmount != 0)
                    {
                        principle   += remainAmount;
                        remainAmount = 0m;
                    }
                    DateTime dateTimeOnPlan = this.CalculateDateTimeOnPlan(tradeDay, _instalment.Frequence, period);
                    _order.AddInstalmentDetail(new InstalmentDetail(_order, (sequenceOffset - 1) + period + 1, principle, interest, 0m, dateTimeOnPlan, null), OperationType.AsNewRecord);
                }
            }
Exemplo n.º 2
0
            private Tuple <decimal, decimal> CalculateEqualInstalmentPrincipleAndInterest(decimal monthRate, int period, int totalPeriod, decimal amount, decimal remainAmount)
            {
                double  x         = 1 + (double)monthRate;
                decimal p1        = (decimal)Math.Pow(x, (period + 1));
                decimal p2        = (decimal)Math.Pow(x, period);
                decimal p3        = (decimal)Math.Pow(x, totalPeriod) - 1;
                decimal principle = InstalmentDetailCalculator.Round((p1 - p2) / p3 * amount);
                decimal interest  = InstalmentDetailCalculator.Round(remainAmount * monthRate);

                return(Tuple.Create(principle, interest));
            }