<?php
define('C_TIME_ONE_DAY', 86400);
/**
* @param int $from Дата заказа
* @param int $daysCount Базовое число дней доставки
* @param int $nextDayHour Заказы, сделанные после этого часа доставляются со следующего дня
* @param array $freezeDays Дни недели, в которые заказы не движутся
* @param array $deliveryDays Дни доставки
* @return int
*/
function delivery($from, $daysCount, $nextDayHour, $freezeDays, $deliveryDays)
{
if(!in_array(date('w', $from), $freezeDays)) {
if(date('H', $from) > $nextDayHour - 1) {
$from = strtotime('tomorrow', $from);
} else {
$from = strtotime('midnight', $from);
}
}
while($daysCount > 0) {
if(!in_array(date('w', $from), $freezeDays)) {
$daysCount--;
}
$from += C_TIME_ONE_DAY;
}
while(!in_array(date('w', $from), $deliveryDays)) {
$from += C_TIME_ONE_DAY;
}
return $from;
}
/*
* 5 дней на доставку
* Заказ, сделанный в 12:01 начинает доставляться со следующего дня
* в субботу и воскресенье заказы не движутся
* склад выдает заказы по пн,ср,чт,пт
*/
$deliveryDate = delivery(strtotime('2016-06-06 12:08'), 5, 12, [0,6], [1,3,4,5]);
echo 'warehouse: ', date('Y-m-d', $deliveryDate), PHP_EOL;
echo 'office: ', date('Y-m-d', $deliveryDate + C_TIME_ONE_DAY), PHP_EOL;