++ 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:
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
* Gruppi di servizio, 20 ottobre 2026 (decisioni dell'utente):
|
||||
*
|
||||
* - un gruppo sciolto non resta nello storico: si elimina. Le assegnazioni
|
||||
* già date dal sorvegliante conservano il nome del gruppo
|
||||
* (assegnazioni.gruppo_nome), così "via gruppo …" resta leggibile;
|
||||
* - il sorvegliante entra con un nome utente ricavato dal nome del gruppo,
|
||||
* non con l'email: users.username, e users.email diventa facoltativa.
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('username', 60)->nullable()->unique()->after('email');
|
||||
});
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('email')->nullable()->change();
|
||||
});
|
||||
|
||||
Schema::table('assegnazioni', function (Blueprint $table) {
|
||||
$table->string('gruppo_nome', 100)->nullable()->after('gruppo_servizio_id');
|
||||
});
|
||||
|
||||
foreach (DB::table('gruppi_servizio')->get() as $gruppo) {
|
||||
DB::table('assegnazioni')->where('gruppo_servizio_id', $gruppo->id)->update(['gruppo_nome' => $gruppo->nome]);
|
||||
|
||||
if ($gruppo->sciolto_at !== null) {
|
||||
// Già sciolto: pacchetto e membri erano già stati liberati.
|
||||
DB::table('territori')->where('gruppo_servizio_id', $gruppo->id)->update(['gruppo_servizio_id' => null]);
|
||||
DB::table('proclamatori')->where('gruppo_servizio_id', $gruppo->id)->update(['gruppo_servizio_id' => null]);
|
||||
DB::table('assegnazioni')->where('gruppo_servizio_id', $gruppo->id)->update(['gruppo_servizio_id' => null]);
|
||||
DB::table('gruppi_servizio')->where('id', $gruppo->id)->delete();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Sorvegliante di un gruppo attivo: il nome utente dal nome del gruppo.
|
||||
$utente = DB::table('users')->where('proclamatore_id', $gruppo->sorvegliante_id)->first();
|
||||
if ($utente && $utente->username === null) {
|
||||
$base = Str::slug($gruppo->nome, '.') ?: 'gruppo';
|
||||
$base = Str::limit($base, 50, '');
|
||||
$username = $base;
|
||||
for ($n = 2; DB::table('users')->where('username', $username)->exists(); $n++) {
|
||||
$username = $base . $n;
|
||||
}
|
||||
DB::table('users')->where('id', $utente->id)->update(['username' => $username]);
|
||||
}
|
||||
}
|
||||
|
||||
Schema::table('gruppi_servizio', function (Blueprint $table) {
|
||||
$table->dropColumn('sciolto_at');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('gruppi_servizio', function (Blueprint $table) {
|
||||
$table->timestamp('sciolto_at')->nullable();
|
||||
});
|
||||
|
||||
Schema::table('assegnazioni', function (Blueprint $table) {
|
||||
$table->dropColumn('gruppo_nome');
|
||||
});
|
||||
|
||||
// Senza email l'utenza non si può tenere com'era: chi non ce l'ha
|
||||
// riceve un indirizzo segnaposto, da correggere a mano.
|
||||
DB::table('users')->whereNull('email')->orderBy('id')->each(function ($u) {
|
||||
DB::table('users')->where('id', $u->id)->update(['email' => ($u->username ?? "utente-{$u->id}") . '@senza-email.invalid']);
|
||||
});
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropUnique(['username']);
|
||||
$table->dropColumn('username');
|
||||
});
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('email')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user