GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 6c429f...cfdce4 )
by Sebastian
9s
created

OpeningHours::nextOpen()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 9.3142
c 0
b 0
f 0
cc 2
eloc 12
nc 2
nop 1
1
<?php
2
3
namespace Spatie\OpeningHours;
4
5
use DateTime;
6
use DateTimeInterface;
7
use DateTimeZone;
8
use Spatie\OpeningHours\Exceptions\Exception;
9
use Spatie\OpeningHours\Exceptions\InvalidDate;
10
use Spatie\OpeningHours\Exceptions\InvalidDayName;
11
use Spatie\OpeningHours\Helpers\Arr;
12
13
class OpeningHours
14
{
15
    /** @var \Spatie\OpeningHours\Day[] */
16
    protected $openingHours;
17
18
    /** @var array */
19
    protected $exceptions = [];
20
21
    /** @var DateTimeZone|null */
22
    protected $timezone;
23
24
    public function __construct($timezone = null)
25
    {
26
        $this->timezone = $timezone ? new DateTimeZone($timezone) : null;
27
28
        $this->openingHours = Day::mapDays(function () {
29
            return new OpeningHoursForDay();
30
        });
31
    }
32
33
    /**
34
     * @param array $data
35
     *
36
     * @return static
37
     */
38
    public static function create(array $data)
39
    {
40
        return (new static())->fill($data);
41
    }
42
43
    /**
44
     * @param array $data
45
     *
46
     * @return bool
47
     */
48
    public static function isValid(array $data): bool
49
    {
50
        try {
51
            static::create($data);
52
53
            return true;
54
        } catch (Exception $exception) {
55
            return false;
56
        }
57
    }
58
59
    public function fill(array $data)
60
    {
61
        list($openingHours, $exceptions) = $this->parseOpeningHoursAndExceptions($data);
62
63
        foreach ($openingHours as $day => $openingHoursForThisDay) {
64
            $this->setOpeningHoursFromStrings($day, $openingHoursForThisDay);
65
        }
66
67
        $this->setExceptionsFromStrings($exceptions);
68
69
        return $this;
70
    }
71
72
    public function forWeek(): array
73
    {
74
        return $this->openingHours;
75
    }
76
77
    public function forDay(string $day): OpeningHoursForDay
78
    {
79
        $day = $this->normalizeDayName($day);
80
81
        return $this->openingHours[$day];
82
    }
83
84
    public function forDate(DateTimeInterface $date): OpeningHoursForDay
85
    {
86
        $date = $this->applyTimezone($date);
87
88
        return $this->exceptions[$date->format('Y-m-d')] ?? $this->forDay(Day::onDateTime($date));
89
    }
90
91
    public function exceptions(): array
92
    {
93
        return $this->exceptions;
94
    }
95
96
    public function isOpenOn(string $day): bool
97
    {
98
        return count($this->forDay($day)) > 0;
99
    }
100
101
    public function isClosedOn(string $day): bool
102
    {
103
        return ! $this->isOpenOn($day);
104
    }
105
106
    public function isOpenAt(DateTimeInterface $dateTime): bool
107
    {
108
        $dateTime = $this->applyTimezone($dateTime);
109
110
        $openingHoursForDay = $this->forDate($dateTime);
111
112
        return $openingHoursForDay->isOpenAt(Time::fromDateTime($dateTime));
113
    }
114
115
    public function isClosedAt(DateTimeInterface $dateTime): bool
116
    {
117
        return ! $this->isOpenAt($dateTime);
118
    }
119
120
    public function isOpen(): bool
121
    {
122
        return $this->isOpenAt(new DateTime());
123
    }
124
125
    public function isClosed(): bool
126
    {
127
        return $this->isClosedAt(new DateTime());
128
    }
129
130
    public function nextOpen(DateTimeInterface $dateTime) : DateTime
131
    {
132
        $openingHoursForDay = $this->forDate($dateTime);
133
        $nextOpen = $openingHoursForDay->nextOpen(Time::fromDateTime($dateTime));
134
135
        while ($nextOpen == false) {
136
            $dateTime
137
                ->modify('+1 day')
138
                ->setTime(0, 0, 0)
139
            ;
140
141
            $openingHoursForDay = $this->forDate($dateTime);
142
143
            $nextOpen = $openingHoursForDay->nextOpen(Time::fromDateTime($dateTime));
144
        }
145
146
        $nextDateTime = $nextOpen->toDateTime();
147
        $dateTime->setTime($nextDateTime->format('G'), $nextDateTime->format('i'), 0);
148
149
        return $dateTime;
150
    }
151
  
152
    public function setTimezone($timezone)
153
    {
154
        $this->timezone = new DateTimeZone($timezone);
155
    }
156
157
    protected function parseOpeningHoursAndExceptions(array $data): array
158
    {
159
        $exceptions = Arr::pull($data, 'exceptions', []);
160
        $openingHours = [];
161
162
        foreach ($data as $day => $openingHoursData) {
163
            $openingHours[$this->normalizeDayName($day)] = $openingHoursData;
164
        }
165
166
        return [$openingHours, $exceptions];
167
    }
168
169
    protected function setOpeningHoursFromStrings(string $day, array $openingHours)
170
    {
171
        $day = $this->normalizeDayName($day);
172
173
        $this->openingHours[$day] = OpeningHoursForDay::fromStrings($openingHours);
174
    }
175
176
    protected function setExceptionsFromStrings(array $exceptions)
177
    {
178
        $this->exceptions = Arr::map($exceptions, function (array $openingHours, string $date) {
179
            $dateTime = DateTime::createFromFormat('Y-m-d', $date);
180
181
            if ($dateTime === false || $dateTime->format('Y-m-d') !== $date) {
182
                throw InvalidDate::invalidDate($date);
183
            }
184
185
            return OpeningHoursForDay::fromStrings($openingHours);
186
        });
187
    }
188
189
    protected function normalizeDayName(string $day)
190
    {
191
        $day = strtolower($day);
192
193
        if (! Day::isValid($day)) {
194
            throw new InvalidDayName();
195
        }
196
197
        return $day;
198
    }
199
200
    protected function applyTimezone(DateTimeInterface $date)
201
    {
202
        if ($this->timezone) {
203
            $date = $date->setTimezone($this->timezone);
204
        }
205
206
        return $date;
207
    }
208
}
209