Формула для получения дат оплаты прямых дебетовых счетов

Имея способ оплаты счетов, счета которого настроены на прямой дебет, и периоды их рассрочки могут варьироваться: 30/60/90 дней, 30/45/60, 15/30/45 и т. Д., Как я могу точно определить даты рассрочки ?

Это то, что у меня есть, но оно не работает, например, 30/45/60 или 15/45/75:

$dates = [];

$invoiceDate = explode('-', $invoiceDate); // yyyy-mm-dd   Generation dateforeach ($installments as $i => $installment) {  // e.g.: $installment = [30, 45, 60]

if ($installment % 30 == 0) {
$month = round($installment / 30);

$date = mktime(0, 0, 0, $invoiceDate[1] + $month, $invoiceDate[2], $invoiceDate[0]);
}
else {

$month = 0;
if ($installment > 30 && count($installments) > 1) {
$month = floor($installment / 30);
$installment = abs($installment - ($month * 30));
}

$monthOffset = 30 - date('t', mktime(0, 0, 0, $invoiceDate[1] + $month, 1, date('Y')));

$date = mktime(0, 0, 0, $invoiceDate[1] + $month, (int)$invoiceDate[2] + (int)$installment - $monthOffset, $invoiceDate[0]);

}$dates[] = date('Y-m-d', $date);
}

С этим кодом, если бы мне приходилось выставлять счета на 2016-04-15, платежи вроде 30/60/90 работают, возвращая эти даты оплаты:

15/05/2016
15/06/2016
15/07/2016

Однако не с такими платежами, как 15/45/75:

30/04/2016
31/ 05/2016 (должно быть 30)
30/06/2016

ни с 30/45/60:

15/05/2016
31/ 05/2016 (должно быть 30)
15/06/2016

Если расчет был произведен в 2016-04-30, этот платеж работает: 30/45/60

30/05/2016
15/06/2016
30/06/2016

Так же как и 15/45/75:

15/05/2016
15/06/2016
15/07/2016

И 30/60/90:

30/05/2016
30/06/2016
30/07/2016

Любая идея, как реализовать алгоритм, который учитывает все возможности?

0

Решение

использовать объект DAteTime для манипуляции с датой

 $periods = [ [30,60,90],
[30,45,60],
[15,30,45]];
$date =  '2016-04-15';

$d = new DateTime($date);

foreach ($periods as $ps)
foreach($ps as $p) {
$t = new DateTime($d->format('Y-m-d'));
echo $t->modify('+'.$p.' days')->format('Y-m-d')."\n";
unset($t);
}

результат

2016-05-15
2016-06-14
2016-07-14
2016-05-15
2016-05-30
2016-06-14
2016-04-30
2016-05-15
2016-05-30
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]