Определить срок оплаты от даты создания тикета php - PullRequest
0 голосов
/ 10 июня 2019

Я строю SLA KPI. Соглашение об уровне обслуживания основано на типе заявки и приоритете, у каждого из них есть срок оплаты.

Дело в том, что у меня есть только поле созданное_, у меня нет этого срока, поэтому мне нужно рассчитать его, и, как упоминалось выше, использовать приоритет параметров и тип для определения правильной даты.

Но моя настоящая проблема в том, как рассчитать его на PHP, учитывая дни и часы работы, с понедельника по пятницу, с 8:00 до 18:00. Например.

Билет был создан в 2019-06-04 08:00:00, и его крайний срок - 16 часов. Так было бы, 2019-06-06 08:00:00

1 Ответ

0 голосов
/ 11 июня 2019

После долгих поисков ответа я нашел функцию, которая решила мою проблему.

    function addRollover($givenDate, $addtime, $dayStart, $dayEnd, $weekDaysOnly) {

    //Break the working day start and end times into hours, minuets
    $dayStart = explode(',', $dayStart);
    $dayEnd = explode(',', $dayEnd);

    //Create required datetime objects and hours interval
    $datetime = new DateTime($givenDate);

    $endofday = clone $datetime;
    $endofday->setTime($dayEnd[0], $dayEnd[1]); //set end of working day time


    $interval = 'PT'.$addtime.'H';
    //Add hours onto initial given date
    $datetime->add(new DateInterval($interval));

    //if initial date + hours is after the end of working day

    if($datetime > $endofday)
    {
        //get the difference between the initial date + interval and the end of working day in seconds
        $seconds = $datetime->getTimestamp()- $endofday->getTimestamp();

        //Loop to next day
        while(true)
        {
            $endofday->add(new DateInterval('PT24H'));//Loop to next day by adding 24hrs
            $nextDay = $endofday->setTime($dayStart[0], $dayStart[1]);//Set day to working day start time
            //If the next day is on a weekend and the week day only param is true continue to add days
            if(in_array($nextDay->format('l'), array('Sunday','Saturday')) && $weekDaysOnly)
            {
                continue;
            }
            else //If not a weekend
            {
                $tmpDate = clone $nextDay;
                $tmpDate->setTime($dayEnd[0], $dayEnd[1]);//clone the next day and set time to working day end time
                $nextDay->add(new DateInterval('PT'.$seconds.'S')); //add the seconds onto the next day
                //if the next day time is later than the end of the working day continue loop
                if($nextDay > $tmpDate)
                {
                    $seconds = $nextDay->getTimestamp()-$tmpDate->getTimestamp();
                    $endofday = clone $tmpDate;
                    $endofday->setTime($dayStart[0], $dayStart[1]);

                }
                else //else return the new date.
                {
                    return $endofday;


                }
            }
        }
    }

    return $datetime;
}

Спасибо всем.

...