++ rientro: avviso tempo di percorrenza elevato nel banner campagna

Se il territorio è rimasto fuori oltre la soglia "giorni_per_smarrito",
il banner della campagna mostra un avviso (non bloccante). Giorni e
avviso vengono salvati anche nell'evento "campagna_percorso".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Francesco Picone
2026-10-19 10:54:07 +02:00
parent 1708890d48
commit 2f42cf937c
3 changed files with 41 additions and 0 deletions

View File

@@ -244,6 +244,9 @@ class Assegnazione extends Model
{
$this->loadMissing('territorio');
$giorni = $this->giorniPercorrenza();
$soglia = static::sogliaPercorrenzaElevata();
activity()->causedBy(auth()->user())
->performedOn($this)
->withProperties([
@@ -251,11 +254,32 @@ class Assegnazione extends Model
'proclamatore_id' => $this->proclamatore_id, // vedi Assegna: niente nomi in chiaro
'campagna' => $campagna?->descrizione,
'percorso_in_campagna' => $percorso ? 'Sì' : 'No',
'giorni_percorrenza' => $giorni,
'avviso_tempo_elevato' => $giorni > $soglia ? "Sì (soglia {$soglia} giorni)" : 'No',
'origine' => $origine,
])
->log('campagna_percorso');
}
/**
* Giorni tra assegnazione e rientro (o la data indicata, o oggi).
*/
public function giorniPercorrenza(?Carbon $returnDate = null): int
{
$end = $returnDate ?? $this->returned_at ?? now();
return (int) Carbon::parse($this->assigned_at)->startOfDay()->diffInDays(Carbon::parse($end)->startOfDay());
}
/**
* Oltre questa soglia il tempo di percorrenza è considerato molto alto:
* è la stessa soglia "giorni_per_smarrito" dello stato "da_rientrare".
*/
public static function sogliaPercorrenzaElevata(): int
{
return (int) Setting::getValue('giorni_per_smarrito', 120);
}
/**
* Check if a campaign prompt should be shown when returning this assignment.
* Returns the matching campaign or null.