Il gruppo ha un sorvegliante (proclamatore con utenza: email e password temporanea, senza conferma dell'email) e dei membri; l'amministratore mette in blocco dei territori nel pacchetto del gruppo. Il pacchetto non e' un'assegnazione e non tocca le statistiche; quando il sorvegliante da' un territorio a un membro nasce un'assegnazione normale con gruppo_servizio_id. Al rientro il territorio torna in reparto. Sciogliere il gruppo libera pacchetto e membri e disattiva l'utenza. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
133 lines
4.5 KiB
PHP
133 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Concerns;
|
|
|
|
use App\Models\Assegnazione;
|
|
use Livewire\Attributes\Locked;
|
|
use Livewire\Attributes\On;
|
|
|
|
/**
|
|
* Invio del link della piantina dopo un'assegnazione, condiviso dalla pagina
|
|
* Assegna e da "Il mio gruppo" del sorvegliante. La vista è il partial
|
|
* livewire/assegnazioni/_invio-link.
|
|
*
|
|
* Dopo l'assegnazione non si va avanti: si sceglie il canale (copia link o
|
|
* Condividi: il destinatario lo sceglie chi usa l'app dai suoi contatti, i
|
|
* proclamatori non hanno numero né email), si dice se il link è partito, e
|
|
* solo allora si va avanti. Se la procedura si interrompe, l'assegnazione
|
|
* resta con link_da_inviare e lo si segnala dove compare.
|
|
*
|
|
* Chi usa il trait dice chi può mandare il link di un'assegnazione
|
|
* (puoInviare) e dove si va dopo (paginaDopoInvio).
|
|
*/
|
|
trait InviaLink
|
|
{
|
|
/** L'assegnazione di cui si sta mandando il link. */
|
|
#[Locked]
|
|
public ?int $invioId = null;
|
|
|
|
/** Il canale usato in questo invio (Assegnazione::CANALI_LINK). */
|
|
#[Locked]
|
|
public ?string $canaleUsato = null;
|
|
|
|
public string $erroreInvio = '';
|
|
|
|
abstract protected function puoInviare(Assegnazione $assegnazione): bool;
|
|
|
|
abstract protected function paginaDopoInvio(): string;
|
|
|
|
/**
|
|
* Apre l'invio: subito dopo l'assegnazione, o da un'assegnazione rimasta
|
|
* in sospeso ("Invia link" nell'elenco, che lo chiede con apri-invio).
|
|
*/
|
|
#[On('apri-invio')]
|
|
public function apriInvio(int $assegnazioneId): void
|
|
{
|
|
$assegnazione = Assegnazione::aperte()->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;
|
|
}
|
|
}
|