@Kurusa

Php, исправить багу при поиске свободных мест для записи в гугл календаре?

Мой скрипт ищет свободные для записи места в календаре. Пользователей выбирает день (будний/выходной/неважно), время дня (утро/обед/вечер/неважно), длительность приема и еще несколько критериев и по этим данным я ищу свободные для записи места в гугл календаре на следующие три недели.

Но если выбрать длительность приема два часа, и есть запись на 9 и 11 утра, скрипт покажет что есть свободная запись на 10 утра. Уже несколько часов ломаю голову как это можно исправить. Вот так выглядит функция

private function getFree($start, $end, $events, $data){
    $selected_day = $data[0]['selected_day'];
    $selected_time = $data[0]['selected_time'];
    $how_long = $data[0]['how_long'];

    $start = strtotime($start);
    $end = strtotime($end);
    $result = [];
    // Kick off first appt time at beginning of the day.
    $appt_start_time = $start;

    // Loop through each appt slot in the search range.
    while ($appt_start_time < $end) {
        // Add 29:59 to the appt start time so we know where the appt will end.
        $appt_end_time = ($appt_start_time + 1799);

        // For each appt slot, loop through the current appts to see if it falls
        // in a slot that is already taken.
        $slot_available = true;
        foreach ($events as $event) {
            $this_start = strtotime($event['start']);
            $this_end = strtotime($event['end']);

            // If the appt start time or appt end time falls on a current appt, slot is taken.
            if (($appt_start_time >= $this_start && $appt_start_time < $this_end) ||
                ($appt_end_time >= $this_start && $appt_end_time < $this_end)) {
                $slot_available = false;
                break; // No need to continue if it's taken.
            }
        }

        // If we made it through all appts and the slot is still available, it's an open slot.
        if ($slot_available) {
            $date = new DateTime();
            $date->setTimestamp($appt_start_time);
            if ($selected_day === '0') {
                //будний
                if ($date->format('l') == 'Tuesday' || $date->format('l') == 'Thursday') {
                    if ($how_long == 150 || $how_long == 180) {
                        if ($date->format('H') <= 17) {
                            if ($date->format('i') == '00' || $date->format('i') == '30') {
                                $result[] = $date->format("Y-m-d H:i");
                            }
                        }
                    } elseif ($date->format('H') >= 9 && $date->format('H') <= 19) {
                        $result[] = $date->format("Y-m-d H:i");
                    }
                }
            } elseif ($selected_day === '1') {
                //суббота
                if ($date->format('l') == 'Saturday') {
                    if ($how_long == 150 || $how_long == 180) {
                        if ($date->format('H') <= 17) {
                            if ($date->format('i') == '00' || $date->format('i') == '30') {
                                $result[] = $date->format("Y-m-d H:i");
                            }
                        }
                    } elseif ($date->format('H') >= 9 && $date->format('H') <= 19) {
                        $result[] = $date->format("Y-m-d H:i");
                    }
                }
            } elseif ($selected_day === '2') {
                //неважно
                if ($date->format('l') == 'Tuesday' || $date->format('l') == 'Thursday' || $date->format('l') == 'Saturday') {
                    if ($how_long == 150 || $how_long == 180) {
                        if ($date->format('H') <= 17) {
                            if ($date->format('i') == '00' || $date->format('i') == '30') {
                                $result[] = $date->format("Y-m-d H:i");
                            }
                        }
                    } elseif ($date->format('H') >= 9 && $date->format('H') <= 19) {
                        $result[] = $date->format("Y-m-d H:i");
                    }
                }
            }
        }
        // + n minutes
        $appt_start_time += (60 * $how_long);
    }
    $acc_result = [];
    $time_arr = [
        '1' => [
            'start' => 9,
            'end' => 12
        ],
        '2' => [
            'start' => 12,
            'end' => 17
        ],
        '3' => [
            'start' => 17,
            'end' => 19
        ],
        '4' => [
            'start' => 9,
            'end' => 19
        ],
    ];
    foreach ($result as $time) {
        if (date('H', strtotime($time)) >= $time_arr[$selected_time]['start'] && date('H', strtotime($time)) <= $time_arr[$selected_time]['end']) {
            $acc_result[] = [
                'title' => $time,
                'id' => $time,
                'aid' => $aid,
            ];
        }
    }
    return $acc_result;
}
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
08 апр. 2020, в 21:19
10000 руб./за проект
08 апр. 2020, в 20:18
35000 руб./за проект
08 апр. 2020, в 19:41
2000 руб./за проект