netgescon-day0/docs/90-UI-interfaccia-unica/90-01-content/07-database-config.md

8.2 KiB

📊 DATABASE CONFIG E CONNESSIONI

Configurazione database NetGescon standard


🔑 CREDENZIALI DATABASE NETGESCON

Environment Produzione:

# File: /var/www/netgescon/.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=netgescon
DB_USERNAME=netgescon_user
DB_PASSWORD=NetGescon2024!

Paths Configurazione:

  • Laravel .env: /var/www/netgescon/.env
  • Database config: /var/www/netgescon/config/database.php
  • Migrations folder: /var/www/netgescon/database/migrations/
  • Seeders folder: /var/www/netgescon/database/seeders/

🗄️ TABELLE CORE NETGESCON

Schema Base Sempre Presente:

-- Tabelle fondamentali del sistema
stabili (
    id INT PRIMARY KEY,
    denominazione VARCHAR(255),
    indirizzo VARCHAR(255),
    amministratore_id INT,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
)

gestioni (
    id_gestione INT PRIMARY KEY,
    stabile_id INT,
    anno_gestione YEAR,
    tipo_gestione VARCHAR(50),
    data_inizio DATE,
    data_fine DATE,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
)

unita_immobiliari (
    id INT PRIMARY KEY,
    stabile_id INT,
    scala VARCHAR(10),
    piano VARCHAR(10),
    interno VARCHAR(10),
    denominazione VARCHAR(255),
    created_at TIMESTAMP,
    updated_at TIMESTAMP
)

amministratori (
    id INT PRIMARY KEY,
    nome VARCHAR(255),
    cognome VARCHAR(255),
    email VARCHAR(255),
    created_at TIMESTAMP,
    updated_at TIMESTAMP
)

📊 PATTERN QUERY STANDARD

Query Base per Listing:

use Illuminate\Support\Facades\DB;

// Pattern query con relazioni standard
$items = DB::table('main_table')
    ->leftJoin('stabili', 'main_table.stabile_id', '=', 'stabili.id')
    ->leftJoin('gestioni', 'main_table.gestione_id', '=', 'gestioni.id_gestione')
    ->select([
        'main_table.*',
        'stabili.denominazione as stabile_nome',
        'gestioni.anno_gestione',
        'gestioni.tipo_gestione'
    ])
    ->where('stabili.amministratore_id', auth()->user()->amministratore_id ?? null)
    ->orderBy('main_table.created_at', 'desc')
    ->paginate(20);

Query Statistiche per Cards:

// Pattern stats query standard
$stats = [
    'totale' => DB::table('main_table')->count(),
    'questo_mese' => DB::table('main_table')
        ->whereMonth('created_at', now()->month)
        ->whereYear('created_at', now()->year)
        ->count(),
    'attivi' => DB::table('main_table')
        ->where('stato', 'attivo')
        ->count(),
    'problemi' => DB::table('main_table')
        ->where('stato', 'errore')
        ->orWhere('stato', 'sospeso')
        ->count()
];

Query con Filtro Amministratore:

// IMPORTANTE: Sempre filtrare per amministratore
$query = DB::table('main_table')
    ->join('stabili', 'main_table.stabile_id', '=', 'stabili.id')
    ->where('stabili.amministratore_id', auth()->user()->amministratore_id);

// Se l'utente è super admin, non filtrare
if (auth()->user()->is_super_admin ?? false) {
    $query = DB::table('main_table'); // Senza filtro
}

🔧 CONFIGURAZIONE LARAVEL DATABASE

File: /var/www/netgescon/config/database.php

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'netgescon'),
        'username' => env('DB_USERNAME', 'netgescon_user'),
        'password' => env('DB_PASSWORD', 'NetGescon2024!'),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => true,
        'engine' => null,
    ],
],

Test Connessione Database:

// In qualsiasi controller
try {
    $connection = DB::connection();
    $tables = DB::select('SHOW TABLES');
    echo "Connessione DB: OK - Tabelle trovate: " . count($tables);
} catch (\Exception $e) {
    echo "Errore DB: " . $e->getMessage();
}

🗂️ NAMING CONVENTION TABELLE

Pattern Nomi Tabelle per Nuovi Moduli:

-- Modulo base
{modulo}                    -- es: fornitori, gestioni
{modulo}_categorie         -- es: fornitori_categorie
{modulo}_registrazioni     -- es: contabilita_registrazioni
{modulo}_configurazioni    -- es: fornitori_configurazioni
{modulo}_statistiche       -- es: fornitori_statistiche

-- Tabelle di relazione
{modulo}_{altro_modulo}    -- es: fornitori_stabili
{modulo}_documenti         -- es: fornitori_documenti

Campi Standard per Ogni Tabella:

-- Campi obbligatori
id INT PRIMARY KEY AUTO_INCREMENT
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

-- Campi relazione (se applicabili)
stabile_id INT               -- Relazione con stabili
gestione_id INT              -- Relazione con gestioni  
amministratore_id INT        -- Relazione con amministratori

-- Campi audit (opzionali)
created_by INT               -- Chi ha creato
updated_by INT               -- Chi ha modificato
deleted_at TIMESTAMP NULL    -- Soft delete

🚀 MIGRATION TEMPLATE STANDARD

Template Nuova Tabella:

<?php
// database/migrations/YYYY_MM_DD_create_{modulo}_table.php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Create{Modulo}Table extends Migration
{
    public function up()
    {
        Schema::create('{modulo}', function (Blueprint $table) {
            $table->id();
            $table->string('denominazione');
            $table->text('descrizione')->nullable();
            $table->enum('stato', ['attivo', 'inattivo', 'sospeso'])->default('attivo');
            
            // Relazioni standard
            $table->foreignId('stabile_id')->nullable()->constrained('stabili')->onDelete('cascade');
            $table->foreignId('gestione_id')->nullable()->constrained('gestioni', 'id_gestione')->onDelete('cascade');
            $table->integer('amministratore_id')->nullable();
            
            // Audit fields
            $table->integer('created_by')->nullable();
            $table->integer('updated_by')->nullable();
            
            $table->timestamps();
            $table->softDeletes();
            
            // Indexes
            $table->index(['stabile_id', 'stato']);
            $table->index('amministratore_id');
        });
    }

    public function down()
    {
        Schema::dropIfExists('{modulo}');
    }
}

🔍 TROUBLESHOOTING DATABASE

Problemi Comuni e Soluzioni:

1. Errore Connessione:

# Verifica servizio MySQL
sudo systemctl status mysql
sudo systemctl start mysql

# Verifica credenziali
mysql -u netgescon_user -p netgescon

2. Permessi Denied:

-- Ricrea utente database
DROP USER IF EXISTS 'netgescon_user'@'localhost';
CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'NetGescon2024!';
GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost';
FLUSH PRIVILEGES;

3. Tabelle Non Trovate:

# Esegui migrations
cd /var/www/netgescon
php artisan migrate:status
php artisan migrate

4. Cache Database:

# Pulisci cache config
php artisan config:clear
php artisan config:cache

📋 CHECKLIST DATABASE

Prima di Creare Nuovo Modulo:

  • Connessione DB - Testata e funzionante
  • Tabelle core - Stabili, gestioni, unita_immobiliari esistenti
  • Migration pronta - Con naming convention
  • Foreign keys - Relazioni con tabelle esistenti
  • Indexes - Su campi di ricerca frequente
  • Soft deletes - Per preservare dati
  • Audit fields - Created_by, updated_by

Dopo Creazione Tabella:

  • Seeder dati test - Per development
  • Model Eloquent - Con relazioni
  • Factory - Per testing automatico
  • Backup schema - Prima di modifiche

🔗 FILES COLLEGATI

Aggiornare Anche:

  • Controller: 04-controller-standard.md → Metodi per query DB
  • Model: Creare Eloquent model corrispondente
  • Routes: Aggiungere route per nuovo modulo
  • Seeder: Dati iniziali per testing

📖 Prossimo file: 08-manuali-collegati.md