netgescon-day0/database/seeders/DemoUsersSeeder.php

331 lines
12 KiB
PHP
Executable File

<?php
namespace Database\Seeders;
use App\Models\Proprieta;
use App\Models\Soggetto;
use App\Models\Stabile;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Schema;
use Spatie\Permission\PermissionRegistrar;
class DemoUsersSeeder extends Seeder
{
public function run(): void
{
app(PermissionRegistrar::class)->forgetCachedPermissions();
$this->call(RoleSeeder::class);
$superAdmin = $this->upsertUser('superadmin@demo.netgescon.it', 'Demo Super Admin');
$superAdmin->assignRole('super-admin');
$adminUser = $this->upsertUser('amministratore@demo.netgescon.it', 'Demo Amministratore');
$adminUser->assignRole('amministratore');
$amministratoreId = $this->upsertAmministratore($adminUser);
$this->fillUserColumnsIfPresent($adminUser, [
'amministratore_id' => $amministratoreId,
'last_stabile_id' => null,
]);
$stabile = Stabile::updateOrCreate(
['codice_stabile' => 'DEMO001'],
[
'amministratore_id' => $amministratoreId,
'denominazione' => 'Condominio Demo NetGescon',
'codice_fiscale' => '97234560152',
'indirizzo' => 'Via Demo 24',
'cap' => '00100',
'citta' => 'Roma',
'provincia' => 'RM',
'stato' => 'attivo',
'attivo' => true,
'amministratore_nome' => 'Demo Amministratore',
'amministratore_email' => $adminUser->email,
]
);
$this->fillUserColumnsIfPresent($adminUser, ['last_stabile_id' => $stabile->id]);
$secondaryAdminUser = $this->upsertUser('amministratore2@demo.netgescon.it', 'Demo Amministratore 2');
$secondaryAdminUser->syncRoles(['amministratore']);
$secondaryAmministratoreId = $this->upsertAmministratore($secondaryAdminUser, [
'nome' => 'Demo',
'cognome' => 'Amministratore Due',
'denominazione_studio' => 'Studio Demo NetGescon Due',
'partita_iva' => '97123450988',
'codice_fiscale_studio' => 'DMDMTR80A01H501Y',
'indirizzo_studio' => 'Via Demo 26',
'cap_studio' => '00100',
'citta_studio' => 'Roma',
'provincia_studio' => 'RM',
'telefono_studio' => '0612345680',
'email_studio' => 'demo2@netgescon.it',
'pec_studio' => 'demo2@pec.netgescon.it',
'codice_amministratore' => 'DEMOADM2',
]);
$this->fillUserColumnsIfPresent($secondaryAdminUser, [
'amministratore_id' => $secondaryAmministratoreId,
'last_stabile_id' => null,
]);
$secondaryStabile = Stabile::updateOrCreate(
['codice_stabile' => 'DEMO002'],
[
'amministratore_id' => $secondaryAmministratoreId,
'denominazione' => 'Condominio Demo NetGescon Due',
'codice_fiscale' => '97234560153',
'indirizzo' => 'Via Demo 26',
'cap' => '00100',
'citta' => 'Roma',
'provincia' => 'RM',
'stato' => 'attivo',
'attivo' => true,
'amministratore_nome' => 'Demo Amministratore 2',
'amministratore_email' => $secondaryAdminUser->email,
]
);
$this->fillUserColumnsIfPresent($secondaryAdminUser, ['last_stabile_id' => $secondaryStabile->id]);
$unitaProprietarioId = $this->upsertUnitaImmobiliare(
['stabile_id' => $stabile->id, 'scala' => 'A', 'interno' => '1'],
[
'palazzina' => 'Principale',
'piano' => '1',
'denominazione' => 'Appartamento Demo 1',
'categoria_catastale' => 'A/3',
'tipo_unita' => 'abitazione',
'stato_occupazione' => 'occupata_proprietario',
'superficie' => 92,
'attiva' => true,
'unita_demo' => true,
]
);
$unitaInquilinoId = $this->upsertUnitaImmobiliare(
['stabile_id' => $stabile->id, 'scala' => 'A', 'interno' => '2'],
[
'palazzina' => 'Principale',
'piano' => '2',
'denominazione' => 'Appartamento Demo 2',
'categoria_catastale' => 'A/3',
'tipo_unita' => 'abitazione',
'stato_occupazione' => 'occupata_inquilino',
'superficie' => 78,
'attiva' => true,
'unita_demo' => true,
]
);
$condominoUser = $this->upsertUser('condomino@demo.netgescon.it', 'Demo Condomino');
$condominoUser->syncRoles(['condomino']);
$inquilinoUser = $this->upsertUser('inquilino@demo.netgescon.it', 'Demo Inquilino');
$inquilinoUser->syncRoles(['inquilino']);
$collaboratoreUser = $this->upsertUser('collaboratore@demo.netgescon.it', 'Demo Collaboratore');
$collaboratoreUser->syncRoles(['collaboratore']);
$fornitoreUser = $this->upsertUser('fornitore@demo.netgescon.it', 'Demo Fornitore');
$fornitoreUser->syncRoles(['fornitore']);
$soggettoCondomino = Soggetto::updateOrCreate(
['email' => $condominoUser->email],
[
'nome' => 'Paolo',
'cognome' => 'Condomini',
'tipo' => 'proprietario',
'codice_fiscale' => 'CNDPLA80A01H501Z',
'telefono' => '3331001001',
'indirizzo' => 'Via Demo 24',
'cap' => '00100',
'citta' => 'Roma',
'provincia' => 'RM',
]
);
$soggettoInquilino = Soggetto::updateOrCreate(
['email' => $inquilinoUser->email],
[
'nome' => 'Luca',
'cognome' => 'Inquilini',
'tipo' => 'inquilino',
'codice_fiscale' => 'NQILCU90B02H501Z',
'telefono' => '3331001002',
'indirizzo' => 'Via Demo 24',
'cap' => '00100',
'citta' => 'Roma',
'provincia' => 'RM',
]
);
Proprieta::updateOrCreate(
['unita_immobiliare_id' => $unitaProprietarioId, 'soggetto_id' => $soggettoCondomino->id],
[
'tipo_diritto' => 'proprietario',
'percentuale_possesso' => 100,
'data_inizio' => '2024-01-01',
]
);
Proprieta::updateOrCreate(
['unita_immobiliare_id' => $unitaInquilinoId, 'soggetto_id' => $soggettoInquilino->id],
[
'tipo_diritto' => 'inquilino',
'percentuale_possesso' => 100,
'data_inizio' => '2025-01-01',
]
);
$this->command?->info('Demo users ready: superadmin/amministratore/amministratore2/condomino/inquilino/collaboratore/fornitore @demo.netgescon.it (password: demo12345)');
}
private function upsertUser(string $email, string $name): User
{
$user = User::firstOrNew(['email' => $email]);
$attributes = [
'name' => $name,
'password' => Hash::make('demo12345'),
'email_verified_at' => now(),
];
if (Schema::hasColumn('users', 'is_active')) {
$attributes['is_active'] = true;
}
if (Schema::hasColumn('users', 'registration_status')) {
$attributes['registration_status'] = 'approved';
}
if (Schema::hasColumn('users', 'approved_at')) {
$attributes['approved_at'] = now();
}
$user->fill($attributes);
$user->save();
return $user;
}
/**
* @param array<string, mixed> $overrides
*/
private function upsertAmministratore(User $adminUser, array $overrides = []): int
{
$availableColumns = array_flip(Schema::getColumnListing('amministratori'));
$attributes = array_merge([
'user_id' => $adminUser->id,
'nome' => 'Demo',
'cognome' => 'Amministratore',
'denominazione_studio' => 'Studio Demo NetGescon',
'partita_iva' => '97123450987',
'codice_fiscale_studio' => 'DMNMTT80A01H501X',
'indirizzo_studio' => 'Via Demo 24',
'cap_studio' => '00100',
'citta_studio' => 'Roma',
'provincia_studio' => 'RM',
'telefono_studio' => '0612345678',
'email_studio' => 'demo@netgescon.it',
'pec_studio' => 'demo@pec.netgescon.it',
'codice_amministratore' => 'DEMOADM',
'attivo' => true,
], $overrides);
$payload = [];
foreach ($attributes as $column => $value) {
if (isset($availableColumns[$column])) {
$payload[$column] = $value;
}
}
if (isset($availableColumns['updated_at'])) {
$payload['updated_at'] = now();
}
$lookupColumn = isset($availableColumns['user_id']) ? 'user_id' : 'email_studio';
$lookupValue = $lookupColumn === 'user_id'
? $adminUser->id
: ($payload['email_studio'] ?? 'demo@netgescon.it');
$existing = DB::table('amministratori')->where($lookupColumn, $lookupValue)->first();
if ($existing) {
DB::table('amministratori')->where('id', $existing->id)->update($payload);
return (int) $existing->id;
}
if (isset($availableColumns['created_at'])) {
$payload['created_at'] = now();
}
return (int) DB::table('amministratori')->insertGetId($payload);
}
/**
* @param array<string, mixed> $lookup
* @param array<string, mixed> $attributes
*/
private function upsertUnitaImmobiliare(array $lookup, array $attributes): int
{
$availableColumns = array_flip(Schema::getColumnListing('unita_immobiliari'));
$payload = [];
foreach (array_merge($lookup, $attributes) as $column => $value) {
if (isset($availableColumns[$column])) {
$payload[$column] = $value;
}
}
if (isset($availableColumns['updated_at'])) {
$payload['updated_at'] = now();
}
$query = DB::table('unita_immobiliari');
foreach ($lookup as $column => $value) {
if (isset($availableColumns[$column])) {
$query->where($column, $value);
}
}
$existing = $query->first();
if ($existing) {
DB::table('unita_immobiliari')->where('id', $existing->id)->update($payload);
return (int) $existing->id;
}
if (isset($availableColumns['created_at'])) {
$payload['created_at'] = now();
}
return (int) DB::table('unita_immobiliari')->insertGetId($payload);
}
/**
* @param array<string, mixed> $attributes
*/
private function fillUserColumnsIfPresent(User $user, array $attributes): void
{
$fillable = [];
foreach ($attributes as $column => $value) {
if (Schema::hasColumn('users', $column)) {
$fillable[$column] = $value;
}
}
if ($fillable === []) {
return;
}
$user->forceFill($fillable)->save();
}
}