PHPackages                             romegasoftware/availability - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. romegasoftware/availability

ActiveLibrary

romegasoftware/availability
===========================

Reusable availability rule engine for Eloquent models.

v1.0.2(1mo ago)113.7k↓50%MITPHPPHP ^8.4

Since Sep 20Pushed 1mo agoCompare

[ Source](https://github.com/romegasoftware/availability)[ Packagist](https://packagist.org/packages/romegasoftware/availability)[ RSS](/packages/romegasoftware-availability/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (3)Dependencies (14)Versions (5)Used By (0)

Romega Software - Availability
==============================

[](#romega-software---availability)

Reusable availability rule engine for Laravel models. Attach rules to any Eloquent model and evaluate allow/deny windows with a predictable "last matching rule wins" policy.

This package is brought to you by [Romega Software](https://romegasoftware.com). Romega Software is software development agency specializing in helping customers integrate AI and custom software into their business, helping companies in growth mode better acquire, visualize, and utilize their data, and helping entrepreneurs bring their ideas to life.

Installation
------------

[](#installation)

1. Install via Composer:

```
composer require romegasoftware/availability
```

2. Publish the config and optional migrations if you need to customise them:

```
php artisan vendor:publish --tag=availability-config
php artisan vendor:publish --tag=availability-migrations
```

The service provider auto-registers and the default table name is `availability_rules`.

Getting Started
---------------

[](#getting-started)

1. Add the `HasAvailability` trait (or implement `AvailabilitySubject`) on your model.
2. Create availability rules through the morph relation:

```
$item->availabilityRules()->create([
    'type' => 'months_of_year',
    'config' => ['months' => [7]],
    'effect' => 'allow',
    'priority' => 10,
]);
```

3. Resolve the engine and evaluate a moment:

```
$engine = app(\RomegaSoftware\Availability\Support\AvailabilityEngine::class);

if ($engine->isAvailable($item, now())) {
    // accept the booking
}
```

Rules are evaluated in the subject's timezone (`getAvailabilityTimezone`) with a default allow/deny policy provided by `getAvailabilityDefaultEffect`. The final matching rule controls the outcome.

Rule Types
----------

[](#rule-types)

Configure rule-&gt;type to one of the following and store the payload in `config`:

TypeExample ConfigNotes`months_of_year``{"months":[1,7,12]}`ISO months (1–12).`weekdays``{"days":[1,2,3,4,5]}`ISO weekdays (1=Mon).`date_range``{"from":"05-01","to":"08-31","kind":"yearly"}`Yearly (MM-DD) ranges wrap year-end; absolute expects `Y-m-d`.`rrule``{"rrule":"FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR","tz":"America/New_York"}`Supports core `FREQ`, `BYDAY`, `BYMONTH`, `BYMONTHDAY`, `BYHOUR/MINUTE/SECOND`, `INTERVAL` (requires `DTSTART`).`blackout_date``{"dates":["2025-12-25","2025-12-26"]}`Specific calendar dates to deny.`time_of_day``{"from":"09:00","to":"17:00"}`Inclusive time window. Wraps overnight spans (`22:00` → `04:00`).`inventory_gate``{"min":1}`Delegates to a resolver that returns numeric stock or boolean availability.Combine types for richer policies (e.g. `weekdays` allow + `time_of_day` allow + `blackout_date` deny).

Inventory Gate Resolver
-----------------------

[](#inventory-gate-resolver)

Provide inventory lookups through config:

```
config(['availability.inventory_gate' => [
    'resolver' => function (AvailabilitySubject $subject, CarbonInterface $moment, array $ruleConfig): int {
        return $subject->currentStock();
    },
]]);
```

You may also register resolvers per subject class in `availability.inventory_gate.resolvers`. Resolver return values:

- numeric → compared against `config['min']`
- boolean → used directly

Resolvers are cached per subject class, so configure them during boot.

Custom Evaluators
-----------------

[](#custom-evaluators)

Register additional evaluators in `config('availability.rule_types')` and implement `RuleEvaluator::matches()`. The registry accepts concrete instances, class names, or container factories.

Testing
-------

[](#testing)

```
composer test
```

When shipping new rules, add cases that cover DST boundaries, year transitions, and denial precedence to keep behaviour stable.

###  Health Score

48

—

FairBetter than 95% of packages

Maintenance88

Actively maintained with recent releases

Popularity28

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~91 days

Total

3

Last Release

58d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/219298?v=4)[Braden Keith](/maintainers/bradenkeith)[@bradenkeith](https://github.com/bradenkeith)

---

Top Contributors

[![bradenkeith](https://avatars.githubusercontent.com/u/219298?v=4)](https://github.com/bradenkeith "bradenkeith (9 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/romegasoftware-availability/health.svg)

```
[![Health](https://phpackages.com/badges/romegasoftware-availability/health.svg)](https://phpackages.com/packages/romegasoftware-availability)
```

###  Alternatives

[spatie/laravel-health

Monitor the health of a Laravel application

86910.0M83](/packages/spatie-laravel-health)[watson/validating

Eloquent model validating trait.

9723.3M47](/packages/watson-validating)[clickbar/laravel-magellan

This package provides functionality for working with the postgis extension in Laravel.

423715.4k1](/packages/clickbar-laravel-magellan)[reedware/laravel-relation-joins

Adds the ability to join on a relationship by name.

2121.2M13](/packages/reedware-laravel-relation-joins)[pressbooks/pressbooks

Pressbooks is an open source book publishing tool built on a WordPress multisite platform. Pressbooks outputs books in multiple formats, including PDF, EPUB, web, and a variety of XML flavours, using a theming/templating system, driven by CSS.

44643.1k1](/packages/pressbooks-pressbooks)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
