0

新しいスケジューリング システムの期日を計算するための支援を探しています。

現在、スケジュールは、定義された日付から始まる月次または週次の支払いに基づいています。

新しいスケジュールでは、定義された日付から始まる顧客の支払い頻度に基づいてこれを行いたいと考えています。

支払い頻度には 13 のオプションがあります。

  1. 毎月 - 最終営業日
  2. 毎月 - 同日、例: 20 日、25 日
  3. 毎月 - 第 1 月/火/水/木/金
  4. 毎月 - 第 2 月/火/水/木/金
  5. 毎月 - 第 3 月/火/水/木/金
  6. 毎月 - 最後の月/火/水/木/金
  7. 毎週 – 月曜日
  8. 毎週 – 火曜日
  9. 毎週 – 水曜日
  10. 毎週 – 木曜日
  11. 毎週 – 金曜日
  12. 4 毎週
  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;
}
4

1 に答える 1

1

OK、私はうまくいくように見えるものを手に入れることができました。以下に私の方法を示します:

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;
            }
于 2012-12-13T13:23:45.223 に答える