netgescon-day0/database/seeders/AmministratoreTestSeeder.php

347 lines
12 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Amministratore;
use Spatie\Permission\Models\Role;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
class AmministratoreTestSeeder extends Seeder
{
/**
* Crea amministratore test con codice 00000000
*/
public function run(): void
{
DB::transaction(function () {
// 1. Verifica se esiste già
$existingAdmin = Amministratore::where('codice_univoco', '00000000')->first();
if ($existingAdmin) {
$this->command->info('⚠️ Amministratore test 00000000 già esistente');
return;
}
// 2. Verifica/crea ruolo admin
if (!Role::where('name', 'admin')->exists()) {
Role::create(['name' => 'admin', 'guard_name' => 'web']);
}
// 3. Crea utente per amministratore test
$user = User::create([
'name' => 'Amministratore Test',
'email' => 'admin.test@netgescon.local',
'password' => Hash::make('Test123!'),
'email_verified_at' => now(),
]);
// 4. Assegna ruolo admin
$user->assignRole('admin');
// 5. Crea record amministratore con codice fisso
$amministratore = Amministratore::create([
'user_id' => $user->id,
'nome' => 'Amministratore',
'cognome' => 'Test',
'denominazione_studio' => 'Studio Test NetGescon',
'partita_iva' => '00000000000',
'codice_fiscale_studio' => 'TSTNGS00A01H501X',
'indirizzo_studio' => 'Via Test 123',
'cap_studio' => '00100',
'citta_studio' => 'Test City',
'provincia_studio' => 'TC',
'telefono_studio' => '000-0000000',
'email_studio' => 'studio.test@netgescon.local',
'pec_studio' => 'pec.test@netgescon.pec.it',
'codice_univoco' => '00000000',
]);
// 6. Crea database dedicato
$this->createDedicatedDatabase($amministratore);
// 7. Crea struttura cartelle avanzata
$this->createAdvancedFolderStructure($amministratore);
$this->command->info('✅ Amministratore test 00000000 creato con successo');
$this->command->info(" 👤 User ID: {$user->id}");
$this->command->info(" 🏢 Admin ID: {$amministratore->id}");
$this->command->info(" 📧 Email: {$user->email}");
$this->command->info(" 🗂️ Cartella: {$amministratore->getFolderPath()}");
$this->command->info(" 💾 Database: {$amministratore->getDatabaseName()}");
});
}
/**
* Crea database dedicato per amministratore
*/
private function createDedicatedDatabase(Amministratore $amministratore): void
{
$dbName = "netgescon_admin_{$amministratore->codice_univoco}";
try {
// Crea database
DB::statement("CREATE DATABASE IF NOT EXISTS `{$dbName}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
// Aggiorna record amministratore
$amministratore->update(['database_attivo' => $dbName]);
$this->command->info(" 💾 Database {$dbName} creato");
// TODO: Popola con struttura base tabelle
$this->populateBaseTables($dbName);
} catch (\Exception $e) {
$this->command->error(" ❌ Errore creazione database: " . $e->getMessage());
}
}
/**
* Popola database con struttura base
*/
private function populateBaseTables(string $dbName): void
{
// Switch temporaneo al database dedicato
$originalDb = DB::getDatabaseName();
try {
config(['database.connections.mysql.database' => $dbName]);
DB::purge('mysql');
DB::reconnect('mysql');
// Esegui migrazioni base per amministratore
$baseTables = [
"CREATE TABLE IF NOT EXISTS stabili (
id bigint unsigned NOT NULL AUTO_INCREMENT,
codice_stabile varchar(20) NOT NULL,
denominazione varchar(255) NOT NULL,
indirizzo varchar(255) NOT NULL,
cap varchar(10) NOT NULL,
citta varchar(100) NOT NULL,
provincia varchar(5) NOT NULL,
amministratore_id bigint unsigned NOT NULL,
database_dedicato varchar(100) NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY stabili_codice_unique (codice_stabile),
KEY stabili_amministratore_idx (amministratore_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
"CREATE TABLE IF NOT EXISTS condomini (
id bigint unsigned NOT NULL AUTO_INCREMENT,
stabile_id bigint unsigned NOT NULL,
codice_condominio varchar(20) NOT NULL,
denominazione varchar(255) NOT NULL,
numero_unita int DEFAULT 0,
database_dedicato varchar(100) NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY condomini_codice_unique (codice_condominio),
KEY condomini_stabile_idx (stabile_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
"CREATE TABLE IF NOT EXISTS unita (
id bigint unsigned NOT NULL AUTO_INCREMENT,
condominio_id bigint unsigned NOT NULL,
numero_unita varchar(10) NOT NULL,
piano varchar(10) NULL,
superficie decimal(8,2) NULL,
millesimi decimal(8,3) NULL,
proprietario_nome varchar(255) NULL,
proprietario_cognome varchar(255) NULL,
created_at timestamp NULL DEFAULT NULL,
updated_at timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
KEY unita_condominio_idx (condominio_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
];
foreach ($baseTables as $sql) {
DB::statement($sql);
}
$this->command->info(" 📋 Tabelle base create nel database dedicato");
} catch (\Exception $e) {
$this->command->error(" ❌ Errore popolamento tabelle: " . $e->getMessage());
} finally {
// Ripristina connessione originale
config(['database.connections.mysql.database' => $originalDb]);
DB::purge('mysql');
DB::reconnect('mysql');
}
}
/**
* Crea struttura cartelle avanzata
*/
private function createAdvancedFolderStructure(Amministratore $amministratore): void
{
$basePath = "amministratori/{$amministratore->codice_univoco}";
// Struttura cartelle per amministratore
$adminFolders = [
// Documenti amministratore
'documenti/studio/contratti',
'documenti/studio/certificazioni',
'documenti/studio/assicurazioni',
'documenti/studio/comunicazioni',
// Database e backup
'database/backups/full',
'database/backups/incremental',
'database/migrations',
'database/exports',
// Log e monitoring
'logs/sistema',
'logs/accessi',
'logs/operazioni',
'logs/errori',
// File temporanei
'temp/uploads',
'temp/processing',
'temp/exports',
'temp/imports',
// Reports e esportazioni
'reports/mensili',
'reports/annuali',
'reports/custom',
// Archivi documenti
'archivio/per_anno',
'archivio/comunicazioni',
'archivio/assemblee',
];
foreach ($adminFolders as $folder) {
Storage::disk('local')->makeDirectory("{$basePath}/{$folder}");
}
// Crea file configurazione amministratore
$config = [
'amministratore' => [
'codice' => $amministratore->codice_univoco,
'nome_completo' => $amministratore->nome_completo,
'denominazione_studio' => $amministratore->denominazione_studio,
'database_dedicato' => $amministratore->getDatabaseName(),
'created_at' => $amministratore->created_at->toISOString(),
],
'settings' => [
'backup_automatico' => true,
'backup_frequency' => 'daily',
'retention_days' => 30,
'log_level' => 'info',
'max_file_size' => '50MB',
],
'paths' => [
'database_backups' => 'database/backups',
'documents' => 'documenti',
'logs' => 'logs',
'temp' => 'temp',
'reports' => 'reports',
'archive' => 'archivio',
]
];
Storage::disk('local')->put(
"{$basePath}/amministratore_config.json",
json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)
);
// Crea README dettagliato
$readme = $this->generateAdminReadme($amministratore);
Storage::disk('local')->put("{$basePath}/README.md", $readme);
$this->command->info(" 📁 Struttura cartelle avanzata creata");
}
/**
* Genera README per amministratore
*/
private function generateAdminReadme(Amministratore $amministratore): string
{
return "# 🏢 Amministratore: {$amministratore->nome_completo}
## 📋 Informazioni Generali
- **Codice Univoco**: `{$amministratore->codice_univoco}`
- **Denominazione Studio**: {$amministratore->denominazione_studio}
- **Database Dedicato**: `{$amministratore->getDatabaseName()}`
- **Creato**: {$amministratore->created_at->format('d/m/Y H:i')}
## 📁 Struttura Archivio
### 🏗️ Documenti Studio
- `documenti/studio/` - Documenti dell'amministratore
- `documenti/studio/contratti/` - Contratti di amministrazione
- `documenti/studio/certificazioni/` - Certificazioni professionali
- `documenti/studio/assicurazioni/` - Polizze assicurative
### 💾 Database e Backup
- `database/backups/full/` - Backup completi database
- `database/backups/incremental/` - Backup incrementali
- `database/migrations/` - Script migrazione
- `database/exports/` - Esportazioni dati
### 📊 Log e Monitoring
- `logs/sistema/` - Log sistema
- `logs/accessi/` - Log accessi utenti
- `logs/operazioni/` - Log operazioni CRUD
- `logs/errori/` - Log errori applicazione
### 🔄 File Temporanei
- `temp/uploads/` - Upload temporanei
- `temp/processing/` - Elaborazioni in corso
- `temp/exports/` - Export temporanei
- `temp/imports/` - Import temporanei
### 📈 Reports
- `reports/mensili/` - Report mensili
- `reports/annuali/` - Report annuali
- `reports/custom/` - Report personalizzati
### 📚 Archivio
- `archivio/per_anno/` - Archivio per anno
- `archivio/comunicazioni/` - Comunicazioni archiviate
- `archivio/assemblee/` - Verbali assemblee
## 🏘️ Struttura Stabili
Ogni stabile amministrato avrà:
- Database dedicato separato
- Cartella fisica dedicata
- Backup indipendenti
- Log separati
## 🔧 Funzionalità Avanzate
### 📦 Migrazione/Trasferimento
- Backup automatico completo
- Archivio ZIP per trasferimento
- Metadata per ricostruzione ambiente
- Verifica integrità dati
### 🔄 Backup e Recovery
- Backup automatici programmati
- Backup incrementali
- Recovery point-in-time
- Test integrità automatici
### 📊 Monitoring
- Utilizzo spazio disco
- Performance database
- Log errori centralizzati
- Statistiche utilizzo
---
*Generato automaticamente da NetGescon v2.1.0*
*Ultimo aggiornamento: " . date('d/m/Y H:i') . "*
";
}
}