find($assegnazioneId); if (! $assegnazione) { return; } abort_unless($this->puoInviare($assegnazione), 403); $this->invioId = $assegnazione->id; $this->canaleUsato = null; $this->erroreInvio = ''; } /** Copia link o Condividi: l'invio vero lo fa chi usa l'app, qui si annota il canale. */ public function canale(string $canale): void { $assegnazione = $this->assegnazioneInInvio(); if (! $assegnazione || ! in_array($canale, Assegnazione::CANALI_ATTIVI, true) || ! $assegnazione->shortPdfUrl()) { return; } $this->canaleUsato = $canale; $this->erroreInvio = ''; } /** * La risposta a "Hai inviato il link?": la si registra e solo adesso si * va avanti. "Sì" vuole un canale usato; "No" lascia il link da inviare. */ public function concludiInvio(bool $inviato) { $assegnazione = $this->assegnazioneInInvio(); if (! $assegnazione) { $this->invioId = null; return null; } if ($inviato && $this->canaleUsato === null) { $this->erroreInvio = 'Scegli prima come mandare il link.'; return null; } $assegnazione->registraInvioLink($inviato, $this->canaleUsato); // Nel log il canale e l'id del proclamatore, mai il nome. activity()->causedBy(auth()->user()) ->performedOn($assegnazione) ->withProperties([ 'territorio' => $assegnazione->territorio?->numero, 'proclamatore_id' => $assegnazione->proclamatore_id, 'canale' => $inviato ? $this->canaleUsato : null, ]) ->log($inviato ? 'link_inviato' : 'link_non_inviato'); $numero = $assegnazione->territorio?->numero; $nome = $assegnazione->proclamatore?->nome_completo; $this->reset(['invioId', 'canaleUsato', 'erroreInvio']); session()->flash('success', $inviato ? "Territorio {$numero} assegnato a {$nome}: link inviato." : "Territorio {$numero} assegnato a {$nome}. Il link è ancora da inviare: lo trovi segnalato nell'elenco."); return $this->redirect($this->paginaDopoInvio(), navigate: true); } /** L'invio in corso, per la vista; null se l'assegnazione nel frattempo è rientrata o sparita. */ protected function invioCorrente(): ?Assegnazione { $invio = $this->invioId ? Assegnazione::aperte()->with(['territorio', 'proclamatore'])->find($this->invioId) : null; if ($this->invioId && ! $invio) { $this->reset(['invioId', 'canaleUsato', 'erroreInvio']); } return $invio; } private function assegnazioneInInvio(): ?Assegnazione { if (! $this->invioId) { return null; } $assegnazione = Assegnazione::with(['territorio', 'proclamatore'])->find($this->invioId); abort_unless($assegnazione && $this->puoInviare($assegnazione), 403); return $assegnazione; } }