From 358cbfc81c52aab6d3231e6c15885e5027871247 Mon Sep 17 00:00:00 2001
From: Francesco Picone
Date: Mon, 19 Oct 2026 10:54:07 +0200
Subject: [PATCH] ++ rientro: avviso tempo di percorrenza elevato nel banner
campagna
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
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
---
app/Livewire/Assegnazioni/Rientra.php | 11 +++++++++
app/Models/Assegnazione.php | 24 +++++++++++++++++++
.../livewire/assegnazioni/rientra.blade.php | 6 +++++
3 files changed, 41 insertions(+)
diff --git a/app/Livewire/Assegnazioni/Rientra.php b/app/Livewire/Assegnazioni/Rientra.php
index bceec6a..11dc365 100644
--- a/app/Livewire/Assegnazioni/Rientra.php
+++ b/app/Livewire/Assegnazioni/Rientra.php
@@ -116,8 +116,19 @@ class Rientra extends Component
{
$campagna = $this->campagna_id ? Campagna::find($this->campagna_id) : null;
+ // Warning shown inside the campaign prompt only: holding time up to
+ // the selected return date above the "da rientrare" threshold.
+ $giorniPercorrenza = null;
+ $sogliaPercorrenza = null;
+ if ($campagna && $this->returned_at) {
+ $giorniPercorrenza = $this->assegnazione->giorniPercorrenza(\Carbon\Carbon::parse($this->returned_at));
+ $sogliaPercorrenza = Assegnazione::sogliaPercorrenzaElevata();
+ }
+
return view('livewire.assegnazioni.rientra', [
'campagna' => $campagna,
+ 'giorniPercorrenza' => $giorniPercorrenza,
+ 'sogliaPercorrenza' => $sogliaPercorrenza,
]);
}
}
diff --git a/app/Models/Assegnazione.php b/app/Models/Assegnazione.php
index 7175304..8d9ae8f 100644
--- a/app/Models/Assegnazione.php
+++ b/app/Models/Assegnazione.php
@@ -206,6 +206,9 @@ class Assegnazione extends Model
{
$this->loadMissing(['territorio', 'proclamatore']);
+ $giorni = $this->giorniPercorrenza();
+ $soglia = static::sogliaPercorrenzaElevata();
+
activity()->causedBy(auth()->user())
->performedOn($this)
->withProperties([
@@ -213,11 +216,32 @@ class Assegnazione extends Model
'proclamatore' => $this->proclamatore?->nome_completo,
'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.
diff --git a/resources/views/livewire/assegnazioni/rientra.blade.php b/resources/views/livewire/assegnazioni/rientra.blade.php
index 79000ca..a25fd3c 100644
--- a/resources/views/livewire/assegnazioni/rientra.blade.php
+++ b/resources/views/livewire/assegnazioni/rientra.blade.php
@@ -47,6 +47,12 @@
({{ $campagna->start_date->format('d/m/Y') }} — {{ $campagna->end_date->format('d/m/Y') }}).
È stato percorso per la campagna? Se sì, conteggialo nella percentuale di percorrenza.
+ ⚠️ Tempo di percorrenza molto alto: {{ $giorniPercorrenza }} giorni (soglia {{ $sogliaPercorrenza }}).
+ Verifica che il territorio sia stato effettivamente percorso durante la campagna.
+