Download the PHP package ilbronza/schedules without Composer

On this page you can find all versions of the php package ilbronza/schedules. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package schedules

Schedules

Scadenze e soglie di notifica per Laravel, basate su un valore che avanza nel tempo (chilometri, date, ore, pezzi, …).

Il package non calcola “quanto manca” da solo: legge il valore corrente dal modello host, lo confronta con una scadenza, e quando una soglia è raggiunta notifica i ruoli configurati.

Se stai arrivando da v2.5.1, leggi anche UPGRADING.md.


Indice

  1. A cosa serve
  2. I pezzi del dominio
  3. Installazione
  4. Configurazione dell’applicazione host
  5. Rendere un modello schedulabile
  6. Creare un tipo di scadenza
  7. Soglie di notifica
  8. Applicare le scadenze
  9. Valutare le scadenze (cron)
  10. Segnare una scadenza come gestita
  11. Leggere le scadenze da un modello
  12. Stati
  13. Interfaccia HTTP
  14. Soft delete
  15. Personalizzazioni
  16. Comportamento fail-fast

A cosa serve

Esempio classico: un veicolo ha un odometro. Vuoi:

Lo stesso schema vale per date (assicurazione tra 365 giorni, avviso a 30), ore di lavoro, pezzi prodotti, e qualunque unità gestita da ilbronza/measurementunits.

Il flusso è sempre questo:


I pezzi del dominio

Concetto Classe Ruolo
Tipo Type Template: unità di misura, durata (validity), modelli a cui si applica, ruoli da notificare
Soglia tipo TypeNotification “Avvisa N unità prima della deadline”, con eventuale ripetizione
Scadenza Schedule Istanza su un modello concreto (Vehicle #12), con starting_value e deadline_value
Soglia istanza ScheduledNotification Copia operativa di una TypeNotification su quella schedule
Invio ScheduledNotificationDispatch Storico di ogni invio (ripetizioni incluse)

Una schedule vive su un morph (schedulable_type / schedulable_id). Il valore corrente non è salvato sulla schedule: viene riletto dal modello a ogni valutazione.


Installazione

Dipendenze runtime dichiarate in composer.json: Laravel 11, Carbon 3, Spatie Activitylog e Permission, e i pacchetti IlBronza crud, buttons, datatables, form, formfield, measurementunits, notifications.

Prima di lanciare le migration di Schedules deve già esistere la tabella Laravel notifications (di solito creata da ilbronza/notifications). Le scheduled notification tengono una foreign key su notifications.id.


Configurazione dell’applicazione host

Il package non conosce i modelli del progetto. Pubblica config/schedules.php e dichiara:

Punti fermi:


Rendere un modello schedulabile

Getter allowlistati

Il tipo di scadenza indica come leggere il valore, in uno di questi due modi:

Campo sul Type Effetto
source odometer → chiama getOdometer()
method chiama esattamente quel metodo, es. getOdometer

Se sono presenti entrambi, vince method. In ogni caso il metodo deve stare in $allowedScheduleValueMethods. Un getter non allowlistato lancia RuntimeException (e in HTTP create/update del tipo dà 422).

Non è un accessor Eloquent: source = current_km risolve getCurrentKm(), non getCurrentKmAttribute().

Metodi opzionali del trait

Metodo Default A cosa serve
getSchedulableModelNameAttribute() getMorphClass() Etichetta del modello nella lista “applica a…”
getSchedulableModelTableFieldsArray() colonne vuote extra Campi aggiuntivi nella datatable degli elementi
getName() — Nome mostrato nel payload della notifica

Scope per l’applicazione da UI

getSchedulableElementsQuery() chiama scope{Studly(nome del Type)}. Se manca, l’indice di applicazione lancia un’eccezione. Se vuoi tutti i record:

Applicando le scadenze da codice (ScheduleApplicatorHelper) lo scope non è necessario.


Creare un tipo di scadenza

Un Type è il template. Campi rilevanti:

Campo Significato
name Nome visibile. Dalla UI di applicazione deriva anche lo scope (Revisione → scopeRevisione)
measurement_unit_id Unità di ilbronza/measurementunits (km, giorni, ore, …)
validity Durata della scadenza in quell’unità. starting + validity = deadline
percentage_validity Soglia di “in scadenza”: isExpiring() è true quando il progresso ≥ questo valore (default 99)
allow_multiple Se false, un modello può avere una sola schedule corrente di questo tipo
models Elenco dei FQCN a cui si applica, con source e/o method
roles Ruoli Spatie che ricevono le notifiche (id del role model)

models deve:

Esempio in codice:

roles accetta anche role_id o id come chiave dell’entry. Entry malformate o vuote lanciano RuntimeException in valutazione.

Dalla UI: Impostazioni → Scadenze → Tipologie (/schedules-management/types).


Soglie di notifica

Una TypeNotification appartiene a un tipo e definisce quando avvisare rispetto alla deadline della schedule.

Campo Significato
before Offset della prima ripetizione, prima della deadline. Obbligatorio
repeat_every Intervallo tra un invio e il successivo (dopo il primo)
repeat_every_measurement_unit_id Unità dell’intervallo (stessa base dell’unità del tipo)
last_repetition Offset dell’ultima ripetizione ammessa, prima della deadline. Se omesso, si ripete fino alla deadline
urgency Intero ≥ 0 scritto nel payload (urgency / priority)

type_id è immutabile dopo la creazione.

Vincoli (save + form HTTP 422)

Esempio numerico

Tipo con validity = 20000 km, veicolo a 90.000 km:

Senza ripetizione la soglia parte una sola volta, anche se l’evaluator gira di nuovo.

Ogni invio viene scritto in schedules__scheduled_notification_dispatches. Sulla scheduled notification restano solo notification_id e last_dispatched_value dell’ultimo invio (idempotenza e calcolo del prossimo intervallo).

Il messaggio di default:

La scadenza "Revisione" per "AB123CD" ha raggiunto una soglia di notifica.


Applicare le scadenze

ScheduleApplicatorHelper crea (o aggiorna) la schedule e tutte le soglie in una transazione. O tutto o niente.

Da codice

applicate* (senza findOr) crea sempre una schedule nuova. Se allow_multiple è false e ne esiste già una corrente, lancia RuntimeException.

Dalla UI

  1. Apri il tipo → Applica.
  2. Scegli il modello (vehicles).
  3. Seleziona gli elementi e conferma.

La route usa l’alias, non la classe PHP:

/schedules-management/types/applicate/{type}/models/vehicles


Valutare le scadenze (cron)

Il package registra schedules:evaluate e, di default, lo mette nello scheduler Laravel ogni minuto (withoutOverlapping). L’host deve comunque far girare lo scheduler:

A mano:

Per invalidare manualmente le schedule:

type e --all sono alternativi. L'invalidazione soft-delete di ogni schedule e delle relative scheduled notification; non modifica expired_at e non fa force-delete, quindi resta possibile il ripristino.

Per ogni schedule corrente (non expired, non managed) l’evaluator:

  1. rilegge il valore corrente dal modello (getter allowlistato);
  2. per ogni scheduled notification ancora eligible, se la soglia è raggiunta invia la notifica ai ruoli del tipo;
  3. se la deadline della schedule è raggiunta, marca expired_at e fa scadere le soglie ancora pending.

Le soglie già dispatched o managed non vengono toccate quando la schedule scade.

L’esecuzione è fail-fast: valore illeggibile, ruoli mancanti, unità di ripetizione incompatibile, errore di dispatch → il comando si ferma.

Il valore corrente della schedule è anche esposto come attributo current_value, cachato 60 secondi.

Per disattivare lo schedule automatico: 'evaluator.enabled' => false.


Segnare una scadenza come gestita

Quando l’intervento è stato fatto (revisione eseguita, rinnovo, …) si marca la schedule come managed. La transizione è transazionale: lo stesso managed_at va sulla schedule e su tutte le scheduled notification ancora senza timestamp. Ripetere l’azione non cambia il timestamp originale.

Dalla tabella scadenze: azione singola o “Segna come gestite” sulla selezione.

Una schedule managed non viene più valutata.


Leggere le scadenze da un modello

Metodi del trait InteractsWithSchedule:

Sulla schedule:

getPercentageValidity() lancia se starting e deadline coincidono (span zero).


Stati

Schedule

Precedenza: managed > expired > current.

Stato Condizione
current expired_at e managed_at nulli — viene valutata
expired expired_at valorizzato — deadline raggiunta
managed managed_at valorizzato — chiusa dall’operatore

Scope: Schedule::current(), notExpired(), notManaged(), byType($type).

Scheduled notification

Precedenza: managed > expired > dispatched > pending.

Stato Condizione
pending mai inviata, non expired, non managed
dispatched almeno un invio (notification_id e/o riga in dispatches)
expired la schedule è scaduta prima che questa soglia potesse partire
managed la schedule è stata gestita

Una soglia dispatched non viene sovrascritta a expired. markExpired() su una notifica non pending lancia RuntimeException.

Le soglie repeating restano eligible dopo il primo invio: lo scope pending() include anche quelle già dispatchate se il tipo ha repeat_every + unità.


Interfaccia HTTP

Prefisso URL: /schedules-management. Prefisso nomi: ibSchedules. (config routePrefix).

Middleware: web, auth, schedules.roles. I ruoli ammessi sono defaultRoles, con override per route in routeRoles. Senza autenticazione o senza ruolo: accesso negato.

Area Route principali
Tipologie ibSchedules.types.index/create/show/edit/destroy
Applica tipo ibSchedules.types.applicate.index, types.applicate.classname.index/store
Soglie tipo ibSchedules.types.typeNotifications.create/store, typeNotifications.*
Scadenze ibSchedules.schedules.index/show/manage/manageMany

Il menu (se il package Menu è registrato) aggiunge sotto Impostazioni: elenco tipologie e elenco scadenze.

Non c’è create/edit di una Schedule da form: si crea solo applicando un tipo.


Soft delete

Tentativi non validi: RuntimeException, non silenzio.


Personalizzazioni

Dispatcher di notifiche

Il default è IlBronzaScheduleNotificationDispatcher: invia ScheduleThresholdReachedNotification al primo ruolo del tipo, poi ChildDatabaseNotification agli altri, tramite ilbronza/notifications.

Per sostituirlo:

dispatch() deve restituire l’id della riga in notifications.

FileCabinet (legacy)

Se è installato ilbronza/filecabinet, le Dossierrow di tipo expiration-date possono fornire il valore corrente senza implementare Schedulable. È un ponte esplicito, non il percorso consigliato per i modelli nuovi.

Modelli del package

In config/schedules.php → models.*.class puoi estendere Schedule, Type, ecc. La classe deve discendere da quella del package. La validazione di boot lo verifica.


Comportamento fail-fast

Il package non ignora gli errori di dominio. In particolare:

Situazione Cosa succede
Classe in applicableTo inesistente o non Schedulable eccezione al boot
Type.models invalido eccezione al save / 422 in HTTP
Getter non allowlistato RuntimeException
Configurazione ripetizione incompleta eccezione al save / 422
Tipo senza ruoli al momento del dispatch l’evaluator si ferma
Role id inesistente l’evaluator si ferma
Unità di ripetizione con base diversa da quella del tipo l’evaluator si ferma
Cancellazione di Type/TypeNotification ancora referenziati RuntimeException
Span starting–deadline a zero in percentage_validity RuntimeException

Questo è intenzionale: una scadenza silenziosa è peggio di un job che fallisce in evidenza.


All versions of schedules with dependencies

PHP Build Version
Package Version
No informations.
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package ilbronza/schedules contains the following files

Loading the files please wait ...