novosga/triage-bundle
Symfony bundle that adds triage workflows to Novo SGA: configure service queues and priority rules, screen incoming attendances, and route tickets to the right desk. Integrates entities, forms, and admin screens for PHP/Symfony applications.
novosga/triage-bundle is a Symfony bundle, not a Laravel package — it comes from the Novo SGA queue-management ecosystem and models triage/risk-classification of scheduled appointments. Treat it as a library you either consume inside a Symfony service (if your Laravel app talks to Novo SGA) or wrap behind a thin adapter in your Laravel domain layer; you will not get php artisan vendor:publish or Eloquent models out of it.
Minimal path:
composer require novosga/triage-bundle:^2.3 — note v2.3.0 requires Symfony 7.4 LTS components and therefore PHP 8.2+. Check composer why-not symfony/framework-bundle 7.4 before committing; Laravel 11/12 pin Symfony components below 7.4 in some patch lines and the constraint will resolve to a conflict rather than an error you can read easily.DependencyInjection/Configuration.php first — that is the authoritative list of config keys (units, timezone, and the new appointment max-delay option). Everything else in the docs is downstream of it.$this->app->bind(...) works without reflection hacks).Unit, a ScheduledAppointment and a risk/priority input, resolve the triage result and confirm the appointment is inside the allowed scheduling window.If you only need the triage rules and not the Doctrine mapping, you can pull the service classes alone and skip the bundle registration entirely.
Configuration over code. The bundle is config-tree driven (Symfony TreeBuilder), not attribute driven. Wire environment-specific values through your Laravel config/ files into the container at boot rather than editing bundle YAML — it keeps the DI graph identical between test and prod.
Per-unit timezone as a first-class input. Units carry their own timezone, and since v2.3.0 appointment datetimes are parsed in the unit's timezone rather than the application default. Model this explicitly: resolve the Unit before parsing any datetime, and pass a DateTimeZone rather than relying on date_default_timezone_set(). For multi-tenant Laravel apps this maps cleanly onto a per-tenant timezone column.
Appointment max delay as a guard, not a validator. The new max-delay config (v2.3.0) belongs in your scheduling/booking path, early — resolve the limit from config once per request and short-circuit before persisting an appointment. Decide deliberately whether an over-limit appointment throws or is silently dropped; the bundle's behaviour is config-dependent, so assert on it in a test rather than assuming.
Adapter boundary. Expose a single TriageService-style class in your app that takes primitives (unit id, datetime, priority) and returns a DTO. This insulates your controllers from the bundle's value objects, which are not designed for serialization to JSON and will leak Doctrine proxies if you return them directly from an API resource.
Doctrine/ORM interop. Entities are Doctrine-mapped. If the rest of your Laravel app is Eloquent, either run a second EntityManager for these tables or hydrate the bundle's inputs from your Eloquent models and never persist through Doctrine. Mixing both on the same table is where most integration time gets lost.
Testing. With the dev-tool upgrade (PHPUnit 11, PHPStan 2, PHPCS 4), PHPUnit 11 deprecates docblock @dataProvider in favour of the #[DataProvider] attribute — write your wrapper tests that way now so a future bump doesn't break them.
vendor:publish. Bundle configuration lives in Symfony config (YAML/XML/PHP) or the container. In Laravel, keep a config/triage.php and translate it into container parameters in a provider — do not fight the bundle's expectation of a config tree.Unit/ScheduledAppointment entity fields and the priority/risk resolution services. Prefer composing a decorator over your own service to subclassing bundle classes; there is no formal extension interface, so subclassing is more brittle across minor releases.How can I help you explore Laravel packages today?