319 lines
8.2 KiB
Markdown
Executable File
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`**
|