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

319 lines
8.2 KiB
Markdown
Executable File

# 📊 DATABASE CONFIG E CONNESSIONI
## Configurazione database NetGescon standard
---
## 🔑 **CREDENZIALI DATABASE NETGESCON**
### **Environment Produzione**:
```env
# 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**:
```sql
-- 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**:
```php
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**:
```php
// 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**:
```php
// 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`
```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**:
```php
// 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**:
```sql
-- 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**:
```sql
-- 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
<?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**:
```bash
# Verifica servizio MySQL
sudo systemctl status mysql
sudo systemctl start mysql
# Verifica credenziali
mysql -u netgescon_user -p netgescon
```
#### **2. Permessi Denied**:
```sql
-- 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**:
```bash
# Esegui migrations
cd /var/www/netgescon
php artisan migrate:status
php artisan migrate
```
#### **4. Cache Database**:
```bash
# 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`**