NewWe open-sourced 50+ Laravel packages
Custom AI apps, agents and automation — Roundly ConsultingRoundly
All packages

Three commands cover inspection and housekeeping:

php artisan opening-hours:show clinic 42 --calendar=pickup --date=2026-12-20 --days=14 --at=2026-12-24T10:00:00+01:00
php artisan opening-hours:prune --exceptions-after-days=30 --trashed-after-days=90 --dry-run
php artisan opening-hours:materialize --calendar=5 --sync
  • opening-hours:show {owner} {id} — prints a status line (open until … / closed, opens …) and a table of dates, weekdays, sources, labels and hours. owner is a morph alias or a model class implementing OpeningHoursOwner; --days is capped at max_query_days.
  • opening-hours:prune — soft-deletes one-off exceptions that ended more than N days ago and permanently removes rows soft-deleted more than M days ago. Defaults come from prune.*; --dry-run only reports. Both options take a whole number of days (0–36500) — anything else fails instead of being ignored. With neither configured it prints “Nothing to prune”.
  • opening-hours:materialize — only with materialize.enabled; walks every live calendar (or the --calendar ids) and queues one unique job per calendar unless --sync is given.

A sync without ids replaces schedules and exceptions — the old rows are soft-deleted — so schedule opening-hours:prune daily with prune.trashed_after_days to purge them.

Show your open-source love

This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.

More ways to support, including crypto

By donating, you agree to our donation terms.

Want this built into your product?

We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.