diff --git a/app/Livewire/Assegnazioni/Rientra.php b/app/Livewire/Assegnazioni/Rientra.php index 430d6d3..bceec6a 100644 --- a/app/Livewire/Assegnazioni/Rientra.php +++ b/app/Livewire/Assegnazioni/Rientra.php @@ -98,6 +98,16 @@ class Rientra extends Component ]) ->log('returned'); + // The operator answered the campaign prompt: record the choice + // (counted or not) as its own audit entry. + if ($this->showCampaignPrompt && $this->campagna_id) { + $this->assegnazione->logCampagnaPercorso( + Campagna::find($this->campagna_id), + $this->counted_in_campaign, + 'Rientro' + ); + } + session()->flash('success', "Territorio {$territorio->numero} rientrato da {$proclamatore->nome_completo} dopo {$this->assegnazione->giorni} giorni."); return $this->redirect(route('territori.show', $territorio), navigate: true); } diff --git a/app/Livewire/Registro.php b/app/Livewire/Registro.php index 9245636..26fba29 100644 --- a/app/Livewire/Registro.php +++ b/app/Livewire/Registro.php @@ -141,10 +141,23 @@ class Registro extends Component ]; if ($this->editingId) { - Assegnazione::findOrFail($this->editingId)->update($data); + $assegnazione = Assegnazione::findOrFail($this->editingId); + $prima = [(bool) $assegnazione->counted_in_campaign, $assegnazione->campaign_id ? (int) $assegnazione->campaign_id : null]; + $assegnazione->update($data); } else { $data['created_by'] = auth()->id(); - Assegnazione::create($data); + $assegnazione = Assegnazione::create($data); + $prima = [false, null]; + } + + // Log the campaign choice when the admin sets or changes it here. + $dopo = [(bool) $assegnazione->counted_in_campaign, $assegnazione->campaign_id ? (int) $assegnazione->campaign_id : null]; + if ($dopo !== $prima && ($dopo[0] || $prima[0])) { + $assegnazione->logCampagnaPercorso( + $assegnazione->campagna ?? ($prima[1] ? Campagna::find($prima[1]) : null), + $dopo[0], + 'Registro' + ); } $this->showModal = false; diff --git a/app/Models/Assegnazione.php b/app/Models/Assegnazione.php index f3ad3a2..7175304 100644 --- a/app/Models/Assegnazione.php +++ b/app/Models/Assegnazione.php @@ -197,6 +197,27 @@ class Assegnazione extends Model // ─── Business Logic ───────────────────────────────────────── + /** + * Registra nell'audit log la scelta dell'operatore sul conteggio in + * campagna: evento dedicato "campagna_percorso", leggibile senza dover + * interpretare le proprietà dell'evento "returned". + */ + public function logCampagnaPercorso(?Campagna $campagna, bool $percorso, string $origine): void + { + $this->loadMissing(['territorio', 'proclamatore']); + + activity()->causedBy(auth()->user()) + ->performedOn($this) + ->withProperties([ + 'territorio' => $this->territorio?->numero, + 'proclamatore' => $this->proclamatore?->nome_completo, + 'campagna' => $campagna?->descrizione, + 'percorso_in_campagna' => $percorso ? 'Sì' : 'No', + 'origine' => $origine, + ]) + ->log('campagna_percorso'); + } + /** * Check if a campaign prompt should be shown when returning this assignment. * Returns the matching campaign or null. diff --git a/resources/views/livewire/audit-log.blade.php b/resources/views/livewire/audit-log.blade.php index 8c99f1b..8a921c4 100644 --- a/resources/views/livewire/audit-log.blade.php +++ b/resources/views/livewire/audit-log.blade.php @@ -49,6 +49,7 @@ 'deleted' => 'bg-red-100 text-red-800', 'assigned' => 'bg-indigo-100 text-indigo-800', 'returned' => 'bg-amber-100 text-amber-800', + 'campagna_percorso' => 'bg-orange-100 text-orange-800', 'restored' => 'bg-purple-100 text-purple-800', 'login' => 'bg-cyan-100 text-cyan-800', default => 'bg-gray-100 text-gray-700',