支払いサイクルの現在の週に基づいてユーザーへの支払いを行う、非常に一般的な注文システムを作成しています。
当社の支払いサイクルは隔週であるため、WEEK 1 は ODD 週、WEEK 2 は EVEN 週と見なされます。
- 第1週(奇数)[開始期間A]
- 第 2 週 (偶数) [終了期間 A]
- 第 3 週(奇数)[開始期間 B]
- 4週目(偶数)【終了期間B】【今週金曜日の支給期間A】
- 第 5 週 (奇数) [開始ピリオド C]
- 6週目(偶数)【終了期間C】【今週金曜日の支給期間B】
などなど。
以下を使用して、奇数週か偶数週かを判断できます。
self::$now = new DateTime();
if (self::$now->format('W') % 2 === 0) {
// Week is even -
} else {
// Week is odd
}
奇数週の場合は、その週の日曜日を現在の支払いサイクルの「開始日」として使用します。一方、偶数週の場合は、その週の土曜日を現在の支払いサイクルの「終了日」として使用します。
以前は、これらの開始日と終了日を計算する方法はかなり粗雑でした。2 週間の支払いサイクルの最初の日付として使用する任意の日付を選択しただけで、DateTime()
差分などを計算するために厄介なコードを使用していました。このようにしたくはありませんが、代わりにその週が EVEN か ODD かどうかに依存します。
以前の開始日と終了日を計算するために使用していたコードは次のとおりです。
public function getPreviousPeriodStart() {
$daysIntoCurrentPeriod = ((int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH);
self::$prevPeriodStart = new DateTime('2 weeks ago');
self::$prevPeriodStart->sub(new DateInterval('P'.$daysIntoCurrentPeriod.'D'));
return self::$prevPeriodStart;
}
public function getPreviousPeriodEnd() {
$daysLeftCurrentPeriod = self::PERIOD_LENGTH - ((int)self::$now->diff(self::$refStart)->format('%a') % self::PERIOD_LENGTH) - 1;
self::$prevPeriodStart = new DateTime('2 weeks ago');
self::$prevPeriodStart->add(new DateInterval('P'.$daysLeftCurrentPeriod.'D'));
return (self::$prevPeriodStart);
}
繰り返しますが、私はこれが貧弱でずさんであることを知っています。それが私がそれを改善したい理由です!
現在の支払いサイクルの開始日と終了日を確立したら、次の値を決定できるようにしたいと考えています。
- 現在の支払い期間の開始
- 現在の支払い期間の終了
- 前の支払い期間の開始
- 前の支払い期間の終了
- 前の期間の支払い日 (これは、前の支払い期間の支払い日になります - 現在の支払い期間が始まる前に終了したもの) [これは、次の EVEN 支払い期間の金曜日に発生します]
- 現在の期間の支払い日 (これは現在の支払い期間の支払い日になります) [これは NEXT EVEN 支払い期間の金曜日に発生します]
これを処理するための最もクリーンで健全な方法を見つけようとしています。このアプローチまたは方法論が理想的でない場合は、代替の提案を歓迎します。これが正確で保守可能であることを確認したいだけです!