++ gruppi: sorvegliante non piu' attivo scioglie il gruppo; dettagli del gruppo nella scheda e nel profilo
- Proclamatore::booted: reso non attivo, spostato nel cestino o anonimizzato, il sorvegliante scioglie il gruppo (territori non dati in reparto, membri liberi, utenza disattivata); il motivo va nel registro. L'elenco chiede conferma, la modifica avvisa sotto "Attivo". Un membro nel cestino esce dal gruppo. - Scheda del proclamatore: gruppo guidato con membri, pacchetto, da dare, assegnazioni dal gruppo, utenza e ultimo accesso; oppure gruppo di cui e' membro; gruppi sciolti guidati in passato. - Profilo del sorvegliante: il suo gruppo con gli stessi numeri. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -72,4 +72,24 @@ class GruppoServizio extends Model
|
||||
{
|
||||
return $query->whereNull('sciolto_at');
|
||||
}
|
||||
|
||||
/**
|
||||
* I numeri del gruppo per la scheda del proclamatore e il profilo del
|
||||
* sorvegliante: solo conteggi in SQL, nessun nome da decifrare.
|
||||
*
|
||||
* @return array{membri: int, pacchetto: int, da_dare: int, dati: int, assegnazioni: int}
|
||||
*/
|
||||
public function riepilogo(): array
|
||||
{
|
||||
$pacchetto = $this->territori()->count();
|
||||
$dati = $this->territori()->whereHas('assegnazioni', fn ($q) => $q->whereNull('returned_at'))->count();
|
||||
|
||||
return [
|
||||
'membri' => $this->membri()->count(),
|
||||
'pacchetto' => $pacchetto,
|
||||
'da_dare' => $pacchetto - $dati,
|
||||
'dati' => $dati,
|
||||
'assegnazioni' => $this->assegnazioni()->count(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,6 +30,46 @@ class Proclamatore extends Model
|
||||
return $this->hasOne(User::class, 'proclamatore_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* Un sorvegliante che non è più attivo — reso non attivo, spostato nel
|
||||
* cestino o anonimizzato — non guida più il gruppo: il gruppo si scioglie
|
||||
* (GruppiServizio::sciogli), da qualunque pagina arrivi la modifica. Un
|
||||
* membro nel cestino lascia il gruppo.
|
||||
*/
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::updated(function (self $proclamatore) {
|
||||
if ($proclamatore->wasChanged('attivo') && ! $proclamatore->attivo) {
|
||||
$proclamatore->lasciaIlGruppo('sorvegliante non più attivo');
|
||||
}
|
||||
});
|
||||
|
||||
static::deleted(function (self $proclamatore) {
|
||||
$proclamatore->lasciaIlGruppo('sorvegliante eliminato');
|
||||
});
|
||||
}
|
||||
|
||||
/** Il gruppo attivo di cui è sorvegliante, se c'è. */
|
||||
public function gruppoSorvegliato(): ?GruppoServizio
|
||||
{
|
||||
return GruppoServizio::attivi()->where('sorvegliante_id', $this->id)->first();
|
||||
}
|
||||
|
||||
private function lasciaIlGruppo(string $motivo): void
|
||||
{
|
||||
$gruppo = $this->gruppoSorvegliato();
|
||||
if ($gruppo) {
|
||||
app(\App\Services\GruppiServizio::class)->sciogli($gruppo, $motivo);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->trashed() && $this->gruppo_servizio_id) {
|
||||
static::withTrashed()->whereKey($this->id)->update(['gruppo_servizio_id' => null]);
|
||||
$this->gruppo_servizio_id = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected function casts(): array
|
||||
{
|
||||
return [
|
||||
|
||||
Reference in New Issue
Block a user