ujamii / osm-opening-hours
Parser for Openstreetmap opening hours format
Installs: 1 604
Dependents: 0
Suggesters: 0
Security: 0
Stars: 9
Watchers: 2
Forks: 1
Open Issues: 0
Requires
- php: >=8.0
- ext-calendar: *
- spatie/opening-hours: ^2.11
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- infection/infection: ^0.26.8
- phpstan/phpstan: ^1.6 || ^2.0
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-12-19 14:02:48 UTC
README
Parser for the Openstreetmap opening hours format as connector for the library
spatie/opening-hours
.
Installation
composer require ujamii/osm-opening-hours
Usage
$hours = OsmStringToOpeningHoursConverter::openingHoursFromOsmString('Mo-Sa 10:00-18:00'); $hours->isOpenAt(new \DateTimeImmutable('2022-01-10 16:00:00')); // true, this is a monday $hours->isOpenAt(new \DateTimeImmutable('2022-03-06 16:00:00')); // false, as this is a sunday
There are a lot more methods on the $hours
object, please check the docs of that library.
Of course, you can also use some more complex input like (please also check the docs)
and the list of missing features below to see what's actually possible:
Mo-Fr 08:00-12:00,13:00-17:30; Sa 08:00-12:00
Sa 08:00-12:00; Mo 11:30-17:00; Tu 11:30-18:00; Dec 23-31 off; Jan 24 off; Oct 10 off; PH off; Apr 16 off
If you also need to support the public holiday feature (like PH off
in the example above), you have to pass in a filter like this:
$hours = OsmStringToOpeningHoursConverter::openingHoursFromOsmString('Mo-Su 10:00-18:00; PH 09:00-12:00', ['PH' => new GermanPublicHolidayFilter()]); $hours->isOpenAt(new \DateTimeImmutable('2022-01-10 16:00:00')); // true, open late on normal day $hours->isOpenAt(new \DateTimeImmutable('2022-01-01 16:00:00')); // false, closed late on holiday $hours->isOpenAt(new \DateTimeImmutable('2022-01-01 11:00:00')); // true, open early on holiday
The filter for German holidays is included already, so please take at look at this and
the corresponding interface, if you want to implement something specific for you. The expected config array
may look like ['PH' => new GermanPublicHolidayFilter()]
where the key PH
has to match the beginning of the ruleset in the given OSM string
and the value is an instance of your filter class.
Input values like PH 09:00-12:00
or PH off
will be parsed and given to the filter in the setOpeningHours
method. The spatie/opening-hours
library will call the applyFilter(\DateTimeImmutable $date)
method internally when something like isOpenAt
is requested.
Running tests
You can run the tests with composer run phpunit
or composer run testall
for test and static analysis.
License and Contribution
As this is OpenSource, you are very welcome to contribute by reporting bugs, improve the code, write tests or whatever you are able to do to improve the project. Just fork and PR.
If you want to do me a favour, buy me something from my Amazon wishlist.
Known issues / missing features
- the
spatie/opening-hours
library does not support different settings for a weekday based on the week (likeweek 01-53/2 Fr 09:00-12:00; week 02-52/2 Fr 14:00-18:00
), so we have to add this information via the data attribute which the library supports for each given opening hour value (this may be solved by another filter) - constraint features like years, year_range, year, months, monthdays and week_range are not or not completely supported. This may also be solved by the filter feature later
- things like
week 14-24
andweek 1,3,7,34
are not supported yet - the OSM input string is not validated yet
- No support for constrained weekdays yet
Th[1,2-3], Fr[-1]
- No support for calculations yet
Sa[-1],Sa[-1] +1 day