diff --git a/README.md b/README.md index 73a29a5..c11cab4 100644 --- a/README.md +++ b/README.md @@ -842,8 +842,17 @@ sempre** sul flag: l'amministratore può aggiungere priorità, non toglierla quando la soglia è scattata. ### Percentuale di percorrenza delle campagne -- **Denominatore**: tutti i territori assegnati nel periodo della campagna -- **Numeratore**: le assegnazioni contrassegnate come conteggiate +- **Denominatore**: tutti i territori attivi +- **Numeratore**: i territori attivi distinti con almeno un'assegnazione + collegata alla campagna e contrassegnata come conteggiata al rientro (un + territorio percorso due volte conta una volta sola) + +Al rientro la campagna viene proposta se il territorio era fuori almeno in +parte del periodo: assegnato durante la campagna, rientrato durante la +campagna, oppure fuori per tutta la sua durata. Se sia stato davvero percorso +lo decide l'operatore con la spunta. Se più campagne corrispondono viene +proposta la più recente. I territori fuori durante la campagna e non ancora +rientrati compaiono nel dettaglio come "in corso". --- diff --git a/app/Livewire/Campagne/CampagnaShow.php b/app/Livewire/Campagne/CampagnaShow.php index cd03c56..beebae2 100644 --- a/app/Livewire/Campagne/CampagnaShow.php +++ b/app/Livewire/Campagne/CampagnaShow.php @@ -28,6 +28,18 @@ class CampagnaShow extends Component ->orderBy('returned_at') ->get(); + // Open assignments can still be counted for this campaign only while + // no later campaign has started: on return the most recent one is + // offered (see Assegnazione::campagnaApplicabile()). + $superata = Campagna::where('start_date', '>', $this->campagna->start_date) + ->where('start_date', '<=', now()->toDateString()) + ->exists(); + + $inCorso = $superata ? null : $this->campagna->assegnazioniInCorso() + ->with(['territorio', 'proclamatore']) + ->orderBy('assigned_at') + ->get(); + // All assignments that were active during this campaign range $assegnateNelRange = Assegnazione::where('assigned_at', '<=', $this->campagna->end_date) ->where(function ($q) { @@ -38,6 +50,7 @@ class CampagnaShow extends Component return view('livewire.campagne.campagna-show', [ 'conteggiate' => $conteggiate, + 'inCorso' => $inCorso, 'assegnateNelRange' => $assegnateNelRange, ]); } diff --git a/app/Models/Assegnazione.php b/app/Models/Assegnazione.php index d1b1b81..1fa7fda 100644 --- a/app/Models/Assegnazione.php +++ b/app/Models/Assegnazione.php @@ -241,10 +241,18 @@ class Assegnazione extends Model */ public function campagnaApplicabile(?\Carbon\Carbon $returnDate = null): ?Campagna { - $returnDate = $returnDate ?? now(); + $returnDate = ($returnDate ?? now())->toDateString(); + $assignedAt = $this->assigned_at->toDateString(); + // Il territorio può essere conteggiato per una campagna se è rimasto + // in mano al proclamatore almeno in parte del periodo: assegnato + // durante la campagna, rientrato durante la campagna, oppure fuori per + // tutta la sua durata (assegnato prima e rientrato dopo). Se sia stato + // davvero percorso lo decide l'operatore con la spunta. + // Se più campagne corrispondono si propone la più recente. return Campagna::where('start_date', '<=', $returnDate) - ->where('end_date', '>=', $this->assigned_at) + ->where('end_date', '>=', $assignedAt) + ->orderByDesc('start_date') ->first(); } } diff --git a/app/Models/Campagna.php b/app/Models/Campagna.php index 7222712..e103ccc 100644 --- a/app/Models/Campagna.php +++ b/app/Models/Campagna.php @@ -65,6 +65,16 @@ class Campagna extends Model ->where('counted_in_campaign', true); } + /** + * Assignments still open that were out during this campaign (assigned + * on or before its end): they can be counted for it when they come back. + */ + public function assegnazioniInCorso() + { + return Assegnazione::whereNull('returned_at') + ->where('assigned_at', '<=', $this->end_date); + } + /** * All assignments with assigned_at in this campaign's range. */ diff --git a/resources/views/livewire/assegnazioni/rientra.blade.php b/resources/views/livewire/assegnazioni/rientra.blade.php index 39d0946..9326736 100644 --- a/resources/views/livewire/assegnazioni/rientra.blade.php +++ b/resources/views/livewire/assegnazioni/rientra.blade.php @@ -40,12 +40,12 @@ @if($showCampaignPrompt && $campagna)

- ⚠️ Campagna Attiva: {{ $campagna->descrizione }} + ⚠️ Campagna: {{ $campagna->descrizione }}

- Questo territorio è stato assegnato durante la campagna "{{ $campagna->descrizione }}" + Questo territorio era assegnato durante la campagna "{{ $campagna->descrizione }}" ({{ $campagna->start_date->format('d/m/Y') }} — {{ $campagna->end_date->format('d/m/Y') }}). - Vuoi conteggiarlo nella percentuale di percorrenza? + È stato percorso per la campagna? Se sì, conteggialo nella percentuale di percorrenza.

diff --git a/resources/views/livewire/campagne/campagna-show.blade.php b/resources/views/livewire/campagne/campagna-show.blade.php index b8fd0b7..b14faa6 100644 --- a/resources/views/livewire/campagne/campagna-show.blade.php +++ b/resources/views/livewire/campagne/campagna-show.blade.php @@ -78,4 +78,40 @@
+ + {{-- Out during the campaign, not yet returned (hidden once a later campaign has started) --}} + @if($inCorso !== null) +
+
+

In corso ({{ $inCorso->count() }})

+

Fuori durante la campagna e non ancora rientrati: si potranno conteggiare al rientro.

+
+
+ + + + + + + + + + + @forelse($inCorso as $a) + + + + + + + @empty + + + + @endforelse + +
TerritorioProclamatoreAssegnatoGiorni
N° {{ $a->territorio?->numero }}{{ $a->proclamatore?->nome_completo ?? 'N/A' }}{{ $a->assigned_at->format('d/m/Y') }}{{ $a->giorni }}
Nessun territorio in corso.
+
+
+ @endif