++ gruppi: email fittizia iniziale+cognome per il sorvegliante; sciolto il gruppo l'utenza si elimina
- L'utenza del sorvegliante ha un'email fittizia creata dall'app: iniziale del nome e cognome @termanager.it (ffontana@termanager.it), come gli altri utenti. Via il nome utente: login di nuovo per email. - Sciolto il gruppo l'utenza si elimina, il sorvegliante torna un proclamatore come gli altri: assegnazioni a chi scioglie, registro a nome "Sorvegliante del gruppo ...". Via le utenze disattivate. - User::eliminaConservandoStorico(): l'eliminazione della pagina Utenti in un metodo solo, usato anche dallo scioglimento. - Migrazione 000030: elimina le utenze gia' disattivate, toglie users.username e users.disattivato_at, email di nuovo obbligatoria. - XML, 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,92 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Proclamatore;
|
||||
use App\Services\GruppiServizio;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
/**
|
||||
* Gruppi di servizio, 20 ottobre 2026 (decisioni dell'utente, che
|
||||
* sostituiscono il nome utente introdotto poche ore prima):
|
||||
*
|
||||
* - il sorvegliante entra con un'email fittizia, iniziale del nome e cognome
|
||||
* (ffontana@termanager.it), come gli altri utenti: via users.username, e
|
||||
* users.email torna obbligatoria;
|
||||
* - sciolto il gruppo l'utenza del sorvegliante si elimina, non si disattiva:
|
||||
* via users.disattivato_at e le utenze già disattivate. Le loro
|
||||
* assegnazioni passano al primo amministratore; nel registro le loro voci
|
||||
* restano, a nome "Ex sorvegliante di gruppo".
|
||||
*/
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
$amministratore = DB::table('model_has_roles')
|
||||
->join('roles', 'roles.id', '=', 'model_has_roles.role_id')
|
||||
->where('roles.name', 'amministratore')
|
||||
->where('model_has_roles.model_type', 'App\\Models\\User')
|
||||
->min('model_has_roles.model_id');
|
||||
|
||||
if (Schema::hasColumn('users', 'disattivato_at')) {
|
||||
foreach (DB::table('users')->whereNotNull('disattivato_at')->get() as $utente) {
|
||||
if (! $amministratore) {
|
||||
continue; // nessuno a cui passare le assegnazioni: resta
|
||||
}
|
||||
|
||||
DB::table('assegnazioni')->where('created_by', $utente->id)->update(['created_by' => $amministratore]);
|
||||
DB::table('assegnazioni')->where('returned_by', $utente->id)->update(['returned_by' => $amministratore]);
|
||||
|
||||
foreach (DB::table('activity_log')->where('causer_type', 'App\\Models\\User')->where('causer_id', $utente->id)->get() as $voce) {
|
||||
$proprieta = json_decode((string) $voce->properties, true) ?: [];
|
||||
$proprieta['causer_name'] = 'Ex sorvegliante di gruppo';
|
||||
$proprieta['causer_email'] = null;
|
||||
$proprieta['causer_deleted_at'] = now()->toDateTimeString();
|
||||
DB::table('activity_log')->where('id', $voce->id)->update(['properties' => json_encode($proprieta)]);
|
||||
}
|
||||
|
||||
DB::table('model_has_roles')->where('model_type', 'App\\Models\\User')->where('model_id', $utente->id)->delete();
|
||||
DB::table('model_has_permissions')->where('model_type', 'App\\Models\\User')->where('model_id', $utente->id)->delete();
|
||||
DB::table('users')->where('id', $utente->id)->delete();
|
||||
}
|
||||
}
|
||||
|
||||
// Chi è rimasto senza email (sorveglianti col nome utente): la fittizia.
|
||||
foreach (DB::table('users')->whereNull('email')->get() as $utente) {
|
||||
$proclamatore = $utente->proclamatore_id ? Proclamatore::withTrashed()->find($utente->proclamatore_id) : null;
|
||||
$email = $proclamatore
|
||||
? GruppiServizio::emailFittizia($proclamatore)
|
||||
: "utente{$utente->id}@" . GruppiServizio::DOMINIO_EMAIL;
|
||||
DB::table('users')->where('id', $utente->id)->update(['email' => $email]);
|
||||
}
|
||||
|
||||
if (Schema::hasColumn('users', 'username')) {
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropUnique(['username']);
|
||||
});
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('username');
|
||||
});
|
||||
}
|
||||
if (Schema::hasColumn('users', 'disattivato_at')) {
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('disattivato_at');
|
||||
});
|
||||
}
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('email')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('email')->nullable()->change();
|
||||
});
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('username', 60)->nullable()->unique()->after('email');
|
||||
$table->timestamp('disattivato_at')->nullable();
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user