/// <summary> /// 根据当前还款时间和还款周期,计算下一个还款时间 /// </summary> /// <param name="thisPaymentDate">当前还款时间</param> /// <param name="paymentCircle">还款周期</param> /// <returns>一个还款时间</returns> public static DateTime GetNextPaymentDate(DateTime thisPaymentDate, PaymentTermTypes paymentCircle) { DateTime nextPaymentDate = DateTime.MinValue; switch (paymentCircle) { case PaymentTermTypes.Daily: nextPaymentDate = thisPaymentDate.AddDays(1); break; case PaymentTermTypes.Weekly: nextPaymentDate = thisPaymentDate.AddDays(7); break; case PaymentTermTypes.DoubleWeekly: nextPaymentDate = thisPaymentDate.AddDays(14); break; case PaymentTermTypes.DoubleMonthly: nextPaymentDate = thisPaymentDate.AddMonths(2); break; case PaymentTermTypes.Quarterly: nextPaymentDate = thisPaymentDate.AddMonths(3); break; case PaymentTermTypes.SemiYearly: nextPaymentDate = thisPaymentDate.AddMonths(6); break; case PaymentTermTypes.Annual: nextPaymentDate = thisPaymentDate.AddYears(1); break; case PaymentTermTypes.Monthly: default: nextPaymentDate = thisPaymentDate.AddMonths(1); break; } //贷款还款日期的时间精度仅仅控制到日,不对时分秒控制 return nextPaymentDate.Date; }
/// <summary> /// 根据周期类型获取利率 /// </summary> /// <param name="loanTermType"></param> /// <returns></returns> public double GetRate(PaymentTermTypes loanTermType) { double rate = this.MonthlyRate; switch (loanTermType) { case PaymentTermTypes.Daily: rate = this.DailyRate; break; case PaymentTermTypes.Weekly: rate = this.WeeklyRate; break; case PaymentTermTypes.DoubleWeekly: rate = this.DoubleWeeklyRate; break; case PaymentTermTypes.Monthly: rate = this.MonthlyRate; break; case PaymentTermTypes.DoubleMonthly: rate = this.DoubleMonthlyRate; break; case PaymentTermTypes.Quarterly: rate = this.QuarterlyRate; break; case PaymentTermTypes.SemiYearly: rate = this.SemiYearlyRate; break; case PaymentTermTypes.Annual: rate = this.AnnualRate; break; default: break; } return rate; }
/// <summary> /// 按照一般算数方法进行的利率转换 /// </summary> /// <param name="rate">利率值</param> /// <param name="circle">利率周期</param> public SimpleRateConverter(double rate, PaymentTermTypes circle) { switch (circle) { case PaymentTermTypes.Daily: this.DailyRate = rate; this.AnnualRate = rate * 365; break; case PaymentTermTypes.Weekly: this.WeeklyRate = rate; this.AnnualRate = rate * 52; break; case PaymentTermTypes.DoubleWeekly: this.DoubleWeeklyRate = rate; this.AnnualRate = rate * 26; break; case PaymentTermTypes.Monthly: this.MonthlyRate = rate; this.AnnualRate = rate * 12; break; case PaymentTermTypes.DoubleMonthly: this.DoubleMonthlyRate = rate; this.AnnualRate = rate * 6; break; case PaymentTermTypes.Quarterly: this.QuarterlyRate = rate; this.AnnualRate = rate * 4; break; case PaymentTermTypes.SemiYearly: this.SemiYearlyRate = rate; this.AnnualRate = rate * 2; break; case PaymentTermTypes.Annual: default: this.AnnualRate = rate; break; } }
/// <summary> /// 获取还款日程信息 /// </summary> /// <param name="paymentNumber">指定要计算的还款档期序号</param> /// <param name="rate">利率</param> /// <param name="paymentCount">还款总期数</param> /// <param name="totalAmount">贷款总费用</param> /// <param name="dueDate">还款在每期的开始还是结尾时间,缺省为每期的结尾时间(大部分商业都是用结尾时间)</param> /// <param name="getPaymentFunc">生成每期贷款的方法</param> /// <returns>每期还款的额度</returns> /// <remarks>参数rate和参数paymentCount是呼应的。即如果paymentCount按照月计数,那么rate就必须指定为月利率; /// 如果paymentCount按照年计数,那么rate就必须指定为年利率。</remarks> public static List<Payment> GetPaymentSchedule(double rate, double totalAmount, int paymentCount, PaymentTermTypes paymentCircle, DateTime loanStartDate, DueDate dueDate, Funcs<double, double, int, int, DueDate, Payment> getPaymentFunc) { //贷款还款日期的时间精度仅仅控制到日,不对时分秒控制 loanStartDate = loanStartDate.Date; List<Payment> paymentSchedule = new List<Payment>(); double totalNeedPayPrinclepal = 0; DateTime lastPaymentDate = DateTime.MinValue; for (int i = 0; i < paymentCount; i++) { int paymentNumber = i + 1; Payment payment = getPaymentFunc(rate, totalAmount, paymentCount, paymentNumber, dueDate); totalNeedPayPrinclepal += payment.Principal; payment.TotalPrincipal = totalNeedPayPrinclepal; payment.PrincipalBalance = totalAmount - totalNeedPayPrinclepal; if (lastPaymentDate == DateTime.MinValue) { if (dueDate == DueDate.BegOfPeriod) { lastPaymentDate = loanStartDate; } else { lastPaymentDate = LoanHelper.GetNextPaymentDate(loanStartDate, paymentCircle); } } else { lastPaymentDate = LoanHelper.GetNextPaymentDate(lastPaymentDate, paymentCircle); } payment.PaymentDate = lastPaymentDate; paymentSchedule.Add(payment); } return paymentSchedule; }
/// <summary> /// 获取还款日程信息 /// </summary> /// <param name="paymentNumber">指定要计算的还款档期序号</param> /// <param name="rate">利率</param> /// <param name="paymentCount">还款总期数</param> /// <param name="totalAmount">贷款总费用</param> /// <param name="dueDate">还款在每期的开始还是结尾时间,缺省为每期的结尾时间(大部分商业都是用结尾时间)</param> /// <returns>每期还款的额度</returns> /// <remarks>参数rate和参数paymentCount是呼应的。即如果paymentCount按照月计数,那么rate就必须指定为月利率; /// 如果paymentCount按照年计数,那么rate就必须指定为年利率。</remarks> public static List<Payment> GetPaymentSchedule(double rate, double totalAmount, int paymentCount, PaymentTermTypes paymentCircle, DateTime loanStartDate, DueDate dueDate = DueDate.EndOfPeriod) { return LoanHelper.GetPaymentSchedule(rate, totalAmount, paymentCount, paymentCircle, loanStartDate, dueDate, GetPayment); }