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. [Database &amp; ORM](/categories/database)
4. /
5. romegasoftware/availability

ActiveLibrary[Database &amp; ORM](/categories/database)

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

Reusable availability rule engine for Eloquent models.

v1.0.2(3mo ago)123.8k↓91.7%MITPHPPHP ^8.4

Since Sep 20Pushed 3mo agoCompare

[ Source](https://github.com/romegasoftware/availability)[ Packagist](https://packagist.org/packages/romegasoftware/availability)[ RSS](/packages/romegasoftware-availability/feed)WikiDiscussions main Synced 2d 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

46

—

FairBetter than 92% of packages

Maintenance80

Actively maintained with recent releases

Popularity27

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity57

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

104d 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

[psalm/plugin-laravel

Psalm plugin for Laravel

3355.3M345](/packages/psalm-plugin-laravel)[laravel/ai

The official AI SDK for Laravel.

1.0k3.2M194](/packages/laravel-ai)[illuminate/database

The Illuminate Database package.

2.8k54.9M11.6k](/packages/illuminate-database)[illuminate/queue

The Illuminate Queue package.

21332.6M1.6k](/packages/illuminate-queue)[api-platform/laravel

API Platform support for Laravel

58171.4k14](/packages/api-platform-laravel)[yajra/laravel-oci8

Oracle DB driver for Laravel via OCI8

8793.2M25](/packages/yajra-laravel-oci8)

PHPackages © 2026

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