Skip to content

Commit

Permalink
Fix spatie#73 and support immutable dates
Browse files Browse the repository at this point in the history
  • Loading branch information
kylekatarnls committed Nov 5, 2018
1 parent 5f72cb5 commit e3cd321
Show file tree
Hide file tree
Showing 8 changed files with 237 additions and 12 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,5 +39,5 @@
},
"config": {
"sort-packages": true
}
}
}
27 changes: 21 additions & 6 deletions src/OpeningHours.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use DateTime;
use DateTimeZone;
use DateTimeImmutable;
use DateTimeInterface;
use Spatie\OpeningHours\Helpers\Arr;
use Spatie\OpeningHours\Exceptions\Exception;
Expand Down Expand Up @@ -150,13 +151,20 @@ public function isClosed(): bool
return $this->isClosedAt(new DateTime());
}

/**
* @TODO This should returns DateTimeInterface on next major release
*/
public function nextOpen(DateTimeInterface $dateTime): DateTime
{
if (! ($dateTime instanceof DateTimeImmutable)) {
$dateTime = clone $dateTime;
}

$openingHoursForDay = $this->forDate($dateTime);
$nextOpen = $openingHoursForDay->nextOpen(Time::fromDateTime($dateTime));

while ($nextOpen == false) {
$dateTime
while ($nextOpen === false) {
$dateTime = $dateTime
->modify('+1 day')
->setTime(0, 0, 0);

Expand All @@ -166,18 +174,25 @@ public function nextOpen(DateTimeInterface $dateTime): DateTime
}

$nextDateTime = $nextOpen->toDateTime();
$dateTime->setTime($nextDateTime->format('G'), $nextDateTime->format('i'), 0);
$dateTime = $dateTime->setTime($nextDateTime->format('G'), $nextDateTime->format('i'), 0);

return $dateTime;
}

/**
* @TODO This should returns DateTimeInterface on next major release
*/
public function nextClose(DateTimeInterface $dateTime): DateTime
{
if (! ($dateTime instanceof DateTimeImmutable)) {
$dateTime = clone $dateTime;
}

$openingHoursForDay = $this->forDate($dateTime);
$nextClose = $openingHoursForDay->nextClose(Time::fromDateTime($dateTime));

while ($nextClose == false) {
$dateTime
while ($nextClose === false) {
$dateTime = $dateTime
->modify('+1 day')
->setTime(0, 0, 0);

Expand All @@ -187,7 +202,7 @@ public function nextClose(DateTimeInterface $dateTime): DateTime
}

$nextDateTime = $nextClose->toDateTime();
$dateTime->setTime($nextDateTime->format('G'), $nextDateTime->format('i'), 0);
$dateTime = $dateTime->setTime($nextDateTime->format('G'), $nextDateTime->format('i'), 0);

return $dateTime;
}
Expand Down
8 changes: 8 additions & 0 deletions src/OpeningHoursForDay.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,14 @@ public function nextOpen(Time $time)
{
foreach ($this->openingHours as $timeRange) {
if ($nextOpen = $this->findNextOpenInWorkingHours($time, $timeRange)) {
reset($timeRange);

return $nextOpen;
}

if ($nextOpen = $this->findNextOpenInFreeTime($time, $timeRange)) {
reset($timeRange);

return $nextOpen;
}
}
Expand All @@ -59,10 +63,14 @@ public function nextClose(Time $time)
{
foreach ($this->openingHours as $timeRange) {
if ($nextClose = $this->findNextCloseInWorkingHours($time, $timeRange)) {
reset($timeRange);

return $nextClose;
}

if ($nextClose = $this->findNextCloseInFreeTime($time, $timeRange)) {
reset($timeRange);

return $nextClose;
}
}
Expand Down
10 changes: 9 additions & 1 deletion src/Time.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Spatie\OpeningHours;

use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use Spatie\OpeningHours\Exceptions\InvalidTimeString;

Expand Down Expand Up @@ -83,9 +84,16 @@ public function diff(self $time): \DateInterval
return $this->toDateTime()->diff($time->toDateTime());
}

/**
* @TODO This should returns DateTime on next major release
*/
public function toDateTime(DateTime $date = null): DateTime
{
$date = $date ? (clone $date) : new DateTime('1970-01-01 00:00:00');
if (! $date) {
$date = new DateTime('1970-01-01 00:00:00');
} elseif (! ($date instanceof DateTimeImmutable)) {
$date = clone $date;
}

return $date->setTime($this->hours, $this->minutes);
}
Expand Down
2 changes: 2 additions & 0 deletions tests/OpeningHoursFillTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Spatie\OpeningHours\Test;

use DateTime;
use DateTimeImmutable;
use Spatie\OpeningHours\Day;
use PHPUnit\Framework\TestCase;
use Spatie\OpeningHours\TimeRange;
Expand Down Expand Up @@ -44,6 +45,7 @@ public function it_fills_opening_hours()
$this->assertEquals((string) $openingHours->forDay('friday')[0], '09:00-20:00');

$this->assertCount(0, $openingHours->forDate(new DateTime('2016-09-26 11:00:00')));
$this->assertCount(0, $openingHours->forDate(new DateTimeImmutable('2016-09-26 11:00:00')));
}

/** @test */
Expand Down
2 changes: 1 addition & 1 deletion tests/OpeningHoursForDayTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public function it_can_unset_offset()
}

/** @test */
public function ic_can_get_iterator()
public function it_can_get_iterator()
{
$openingHoursForDay = OpeningHoursForDay::fromStrings(['09:00-12:00', '13:00-18:00']);

Expand Down
Loading

0 comments on commit e3cd321

Please sign in to comment.