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>
93 lines
2.7 KiB
PHP
93 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Gruppi;
|
|
|
|
use App\Livewire\Concerns\Avvisa;
|
|
use App\Models\GruppoServizio;
|
|
use App\Models\Proclamatore;
|
|
use App\Services\GruppiServizio;
|
|
use InvalidArgumentException;
|
|
use Livewire\Attributes\Locked;
|
|
use Livewire\Component;
|
|
|
|
/**
|
|
* Gruppi di servizio (solo amministratore): elenco e creazione. Creando un
|
|
* gruppo si sceglie il sorvegliante, che riceve un'utenza con l'email
|
|
* indicata e una password temporanea, mostrata qui una volta sola.
|
|
* Membri e pacchetto si gestiscono nella pagina del gruppo (GruppoShow).
|
|
*/
|
|
class GruppiIndex extends Component
|
|
{
|
|
use Avvisa;
|
|
|
|
public string $nome = '';
|
|
|
|
public ?int $sorveglianteId = null;
|
|
|
|
public string $email = '';
|
|
|
|
/** Gruppo appena creato e password temporanea del sorvegliante, da consegnare. */
|
|
#[Locked]
|
|
public ?int $creatoId = null;
|
|
|
|
#[Locked]
|
|
public ?string $passwordTemporanea = null;
|
|
|
|
public function crea(): void
|
|
{
|
|
$this->authorize('settings.manage');
|
|
|
|
$this->validate([
|
|
'nome' => 'required|string|max:100',
|
|
'sorveglianteId' => 'required|integer|exists:proclamatori,id',
|
|
'email' => 'required|email|max:255',
|
|
], [
|
|
'sorveglianteId.required' => 'Scegli il sorvegliante.',
|
|
'email.required' => "Serve l'email con cui il sorvegliante entrerà.",
|
|
]);
|
|
|
|
try {
|
|
[$gruppo, $password] = app(GruppiServizio::class)->crea(
|
|
$this->nome,
|
|
Proclamatore::findOrFail($this->sorveglianteId),
|
|
trim($this->email),
|
|
);
|
|
} catch (InvalidArgumentException $e) {
|
|
$this->addError('sorveglianteId', $e->getMessage());
|
|
|
|
return;
|
|
}
|
|
|
|
$this->reset(['nome', 'sorveglianteId', 'email']);
|
|
$this->creatoId = $gruppo->id;
|
|
$this->passwordTemporanea = $password;
|
|
}
|
|
|
|
public function chiudiPassword(): void
|
|
{
|
|
$this->reset(['creatoId', 'passwordTemporanea']);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
$gruppi = GruppoServizio::with('sorvegliante')
|
|
->withCount(['membri', 'territori'])
|
|
->orderByRaw('sciolto_at IS NOT NULL')
|
|
->orderBy('nome')
|
|
->get();
|
|
|
|
// Possono diventare sorveglianti i proclamatori attivi senza gruppo e
|
|
// senza già un'utenza.
|
|
$candidati = Proclamatore::attivi()
|
|
->whereNull('gruppo_servizio_id')
|
|
->whereDoesntHave('utente')
|
|
->get();
|
|
|
|
return view('livewire.gruppi.gruppi-index', [
|
|
'gruppi' => $gruppi,
|
|
'opzioniSorveglianti' => Proclamatore::opzioniScelta($candidati),
|
|
'creato' => $this->creatoId ? GruppoServizio::with('sorvegliante.utente')->find($this->creatoId) : null,
|
|
]);
|
|
}
|
|
}
|