++ gruppi: il gruppo sciolto si elimina; il sorvegliante entra con un nome utente dal nome del gruppo

- Sciolto, il gruppo non resta nello storico: si elimina (via sciolto_at;
  la migrazione elimina anche quelli gia' sciolti). I territori solo nel
  pacchetto tornano in reparto; quelli gia' dati restano ai membri, e
  l'assegnazione conserva il nome del gruppo (assegnazioni.gruppo_nome).
- Creando il gruppo non si chiede l'email: users.username dal nome del
  gruppo ("Gruppo Zisa" -> gruppo.zisa), users.email facoltativa. Login con
  "Email o nome utente". Nome del gruppo unico.
- Sciolto il gruppo il nome utente si libera (l'utenza disattivata prende
  ex.sorvegliante.<id>). XML: nome utente e gruppo_nome.
- Profilo, testata, cambio password e Utenti mostrano il nome utente dove
  manca l'email. Informativa privacy, README, HANDOFF e test aggiornati.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Francesco Picone
2026-10-20 11:45:00 +02:00
parent a93539242a
commit aaffeb7de7
29 changed files with 408 additions and 199 deletions

View File

@@ -13,8 +13,11 @@ class LoginController extends Controller
{
public function __invoke(Request $request): RedirectResponse
{
// Il campo si chiama "email" ma accetta anche il nome utente del
// sorvegliante di gruppo, che l'email non ce l'ha: con la chiocciola è
// un'email, senza un nome utente (che la chiocciola non la contiene mai).
$credentials = $request->validate([
'email' => ['required', 'email'],
'email' => ['required', 'string', 'max:255'],
'password' => ['required', 'string', 'min:6'],
'remember' => ['nullable', 'boolean'],
]);
@@ -29,8 +32,11 @@ class LoginController extends Controller
->withInput($request->only('email', 'remember'));
}
$identificativo = trim($credentials['email']);
$campo = str_contains($identificativo, '@') ? 'email' : 'username';
if (! Auth::attempt([
'email' => $credentials['email'],
$campo => $campo === 'username' ? Str::lower($identificativo) : $identificativo,
'password' => $credentials['password'],
], $request->boolean('remember'))) {
RateLimiter::hit($throttleKey);