我正在寻找一些帮助来计算新调度系统的截止日期。
目前,时间表基于每月或每周付款,从定义的日期开始。
在新的时间表中,我们希望这是基于客户支付频率,从定义的日期开始。
我们有13种支付频率选项:
根据传入的付款频率以及付款和余额,我需要制定新的时间表。
第一笔付款是直接进行的,因为它是在通过日期,计划中的其他日期需要从该日期开始计算(取决于付款频率)。
我还需要确保预定的日期是在工作日(周一至周五)并且不会在公共/银行假日降落 - 在这种情况下,我将恢复到下一个有效的工作日。
我到目前为止的方法如下 - 我需要帮助的区域评论:
//计算下一个付款日期
public IList<ScheduledInstalment> GenerateSchedule(int agreementID, int paymentCount,
PayFrequency frequency, double balance, DateTime firstPaymentDate)
{
IList<ScheduledInstalment> schedule = new List<ScheduledInstalment>();
PaymentCalculation calc = GetPaymentCalculation(frequency, firstPaymentDate);
double regularInstalment = Math.Round(balance / paymentCount, 1);
double finalInstalment = Math.Round(((regularInstalment * (paymentCount - 1)) - balance), 2);
for (int i = 0; i <= paymentCount; i++)
{
ScheduledInstalment s = new ScheduledInstalment();
s.AgreementID = agreementID;
if (i == 0)
{
// First Payment
s.DueDate = firstPaymentDate;
s.AmountDue = regularInstalment;
}
else
// Calculate next payment date
if (i < paymentCount)
{
// Regular Payment
s.AmountDue = regularInstalment;
}
else
{
// Final Payment
s.AmountDue = finalInstalment;
}
schedule.Add(s);
}
return schedule;
}
答案 0 :(得分:1)
好的,我已经设法获得了似乎有用的东西,这是我的方法:
public DateTime GetNextRepaymentDate(DateTime BaseDate, int instalmentCount, PaymentCalculation calc)
{
DateTime dueDate = new DateTime();
switch (calc.Interval)
{
case DateInterval.Month:
dueDate = BaseDate.AddMonths((instalmentCount) * calc.Number);
if (!string.IsNullOrEmpty(calc.OtherCriteria))
{
if (calc.OtherCriteria == "Last")
{
int lastDay = DateTime.DaysInMonth(dueDate.Year, dueDate.Month);
dueDate = Convert.ToDateTime(string.Format("{0}/{1}/{2}", lastDay, dueDate.Month, dueDate.Year));
}
else
{
int fixedDate = Convert.ToInt32(calc.OtherCriteria);
if (dueDate.Day != fixedDate)
{
if (dueDate.Day > fixedDate)
{
while (dueDate.Day != fixedDate)
{
dueDate = dueDate.AddDays(-1);
}
}
else
{
while (dueDate.Day != fixedDate)
{
dueDate = dueDate.AddDays(1);
}
}
}
}
}
break;
case DateInterval.WeekOfYear:
dueDate = BaseDate.AddDays((instalmentCount) * (calc.Number * 7));
if (calc.FixedDay != null)
{
while (dueDate.DayOfWeek != calc.FixedDay)
{
dueDate = dueDate.AddDays(-1);
}
}
break;
}
while (!PaymentIsAllowedOnDate(dueDate) == true)
{
dueDate = dueDate.AddDays(-1);
}
return dueDate;
}