Fix: Risolte relazioni amministratore e chiavi database
✅ Correzioni: - DashboardController: usa admin->id invece di admin->id_amministratore - SidebarComposer: aggiornato per chiave modernizzata - Amministratore model: rimossa primaryKey custom, usa 'id' standard - TestSetupSeeder: corretto riferimento ID amministratore - Aggiunta gestione sicura per utenti senza amministratore �� Fix: Risolve errore 'Attempt to read property denominazione on null' 📊 Test: Creato stabile di test per verificare funzionamento
This commit is contained in:
parent
517f313af9
commit
952c9b4e90
|
|
@ -109,7 +109,7 @@ class TestSetupSeeder extends Seeder
|
||||||
$stabile = Stabile::firstOrCreate(
|
$stabile = Stabile::firstOrCreate(
|
||||||
['denominazione' => 'Stabile Test Via Milano 1'],
|
['denominazione' => 'Stabile Test Via Milano 1'],
|
||||||
[
|
[
|
||||||
'amministratore_id' => $amministratore->id_amministratore,
|
'amministratore_id' => $amministratore->id, // Usa 'id' invece di 'id_amministratore'
|
||||||
'indirizzo' => 'Via Milano 1',
|
'indirizzo' => 'Via Milano 1',
|
||||||
'cap' => '20100',
|
'cap' => '20100',
|
||||||
'citta' => 'Milano',
|
'citta' => 'Milano',
|
||||||
|
|
|
||||||
610
PROGRESS_LOG.md
610
PROGRESS_LOG.md
|
|
@ -315,616 +315,6 @@ php artisan db:seed --class=\\App\\Console\\Seeders\\NOME_SEEDER
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# NetGesCon Laravel - Blocco Appunti Progressivo
|
|
||||||
**Data inizio modernizzazione**: 6 Luglio ### <20> **Features Avanzate PROSSIME**:
|
|
||||||
- 🔄 **IN CORSO**: Sistema multi-database per amministratori
|
|
||||||
- ⏳ Sistema audit stile GIT per tracciamento modifiche
|
|
||||||
- ⏳ Dati pre-caricati per nuovi stabili (comuni, voci tipo, fornitori)
|
|
||||||
- ⏳ Sistema "prima nota" → contabilità definitiva
|
|
||||||
- ⏳ Partita doppia per bilanci completi
|
|
||||||
**Obiettivo**: Ristrutturazione completa con best practice Laravel + gestione moderna archivi/contabilità
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 OBIETTIVI PRINCIPALI
|
|
||||||
- ✅ Modernizzare strutture DB (chiavi `id`, relazioni standard Laravel)
|
|
||||||
- ✅ Sistemare funzioni helper (userSetting)
|
|
||||||
- 🔄 **IN CORSO**: Correggere relazioni amministratore-stabili nella sidebar
|
|
||||||
- 🔄 **IN CORSO**: Sistema multi-database per amministratori (con codice 8 caratteri)
|
|
||||||
- 🔄 **IN CORSO**: Codici alfanumerici 8 caratteri per TUTTI gli utenti/movimenti/record
|
|
||||||
- ⏳ Implementare sistema "prima nota" → contabilità definitiva
|
|
||||||
- ⏳ Preparare base per partita doppia
|
|
||||||
- ⏳ UI stile Akaunting + icone GitHub
|
|
||||||
|
|
||||||
### <20> **Sistema Ruoli CORRETTO**:
|
|
||||||
- **`admin`** = RISERVATO per sviluppatori sistema (NOI)
|
|
||||||
- **`amministratore`** = Chi gestisce condomini (login principale)
|
|
||||||
- **Ruoli multipli**: super-admin + fornitore + condominio + inquilino (stesso utente)
|
|
||||||
- **Autorizzazioni multiple** per utente già implementate
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ COMPLETATO (SESSIONI PRECEDENTI + ATTUALE)
|
|
||||||
|
|
||||||
### 📊 **Tabelle Modernizzate (Best Practice Laravel)**
|
|
||||||
- ✅ `movimenti_contabili`: chiave `id`, campo `codice_movimento` (8 char), stati movimento, relazioni standard
|
|
||||||
- ✅ `allegati`: chiave `id`, campo `codice_allegato` (8 char), relazione `user_id`, timestamps, soft deletes
|
|
||||||
- ✅ `stabili`: già aveva chiave `id` standard
|
|
||||||
- ✅ `amministratori`: NUOVA tabella moderna con codici alfanumerici, multi-database, cartelle dati
|
|
||||||
- ✅ **TUTTI i seeders aggiornati**: dati inseriti direttamente nel DB per test
|
|
||||||
- ✅ **Parametri di versione**: modificati direttamente nel DB (non più nei file)
|
|
||||||
|
|
||||||
### 🔗 **Relazioni Corrette (TUTTE le relazioni con Stabile)**
|
|
||||||
- ✅ `MovimentoContabile::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `VoceSpesa::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Gestione::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Bilancio::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `TabellaMillesimale::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Assemblea::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Preventivo::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Banca::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `PianoContiCondominio`: aggiornato per usare `stabile_id` e chiave `id`
|
|
||||||
|
|
||||||
### 🔐 **Sistema Utenti e Codici Alfanumerici**
|
|
||||||
- ✅ **Codici 8 caratteri**: A=Allegato, M=Movimento, ADM=Amministratore
|
|
||||||
- ✅ **Generazione automatica**: nei modelli con prefissi
|
|
||||||
- ✅ **Sistema multi-database**: preparato per amministratori (campo `database_attivo`)
|
|
||||||
- ✅ **Cartelle dati**: auto-create per ogni amministratore (`/amministratori/CODICE/`)
|
|
||||||
- 🔄 **IN CORSO**: Applicazione completa a tutti gli utenti e record
|
|
||||||
|
|
||||||
### 📁 **Seeders e Migration**
|
|
||||||
- ✅ Posizione corretta: `app/Console/Seeders/` (NON `database/seeders/`)
|
|
||||||
- ✅ `MovimentiContabiliSeeder` → funzionante con dati test
|
|
||||||
- ✅ `AllegatiSeeder` → funzionante con dati test
|
|
||||||
- ✅ **TUTTI i seeders modernizzati** con best practice Laravel
|
|
||||||
- ✅ Migration `2025_07_06_071558_update_movimenti_contabili_table_structure.php`
|
|
||||||
- ✅ Migration `2025_07_06_200417_update_allegati_table_structure_to_laravel_standards.php`
|
|
||||||
|
|
||||||
### 🎨 **Interfaccia Utente UNIFICATA** ✅
|
|
||||||
- ✅ **Layout universale** responsive (`app-universal.blade.php`)
|
|
||||||
- ✅ **Sidebar permission-based** con menu dinamico filtrato
|
|
||||||
- ✅ **Mobile-first design** con hamburger menu (≤768px)
|
|
||||||
- ✅ **Dashboard admin** modernizzata con relazioni corrette
|
|
||||||
- ✅ **Dark mode** integrato e funzionante
|
|
||||||
- ✅ **Indicatori ruolo** visivi (colori, badge)
|
|
||||||
- ✅ **Menu contestuale** basato su permessi utente
|
|
||||||
|
|
||||||
### 📱 **Responsive Design IMPLEMENTATO** ✅
|
|
||||||
- ✅ **Desktop**: Sidebar fissa + colonna launcher
|
|
||||||
- ✅ **Mobile**: Hamburger menu + overlay sidebar
|
|
||||||
- ✅ **Tablet**: Sidebar collassabile con toggle
|
|
||||||
- ✅ **Accessibility**: Focus states, ARIA labels
|
|
||||||
- ✅ **Performance**: CSS transitions smooth
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 ATTUALMENTE IN LAVORAZIONE
|
|
||||||
|
|
||||||
### ✅ **STRATEGIA IMPLEMENTATA**: UI Universale per Tutti i Ruoli
|
|
||||||
**Approccio VINCENTE**: Una sola UI responsive che mostra contenuti diversi in base ai permessi
|
|
||||||
- ✅ **Layout universale** creato (`layouts/app-universal.blade.php`)
|
|
||||||
- ✅ **Sidebar intelligente** con menu filtrato per permessi
|
|
||||||
- ✅ **Responsive design** mobile-first con hamburger menu
|
|
||||||
- ✅ **Dashboard admin** modernizzata con nuova struttura dati
|
|
||||||
- ✅ **Super-admin e Admin** ora usano stesso layout
|
|
||||||
|
|
||||||
### 🎯 **VANTAGGI OTTENUTI**:
|
|
||||||
- ✅ **DRY Principle**: Una sola UI da manutenere
|
|
||||||
- ✅ **Mobile Responsive**: Hamburger menu per schermi piccoli
|
|
||||||
- ✅ **Permission-based**: Ogni utente vede solo ciò che può
|
|
||||||
- ✅ **Consistenza UX**: Stessa esperienza per tutti
|
|
||||||
- ✅ **Facilità sviluppo**: No duplicazione codice
|
|
||||||
|
|
||||||
### 🚀 **PROSSIMO GRANDE FOCUS**: Sistema Aggiornamenti Automatici
|
|
||||||
**Obiettivo**: Registrazione utenti con codici 8 caratteri + aggiornamenti via API
|
|
||||||
- 📋 **Progettazione completa** in `UPDATE_SYSTEM.md`
|
|
||||||
- 🗃️ **Database schema** per utenti registrati, versioni, log
|
|
||||||
- 🔌 **API design** per registrazione, download, verifica licenze
|
|
||||||
- ⚙️ **UpdateService** con backup automatico e rollback
|
|
||||||
- 🎨 **Frontend manager** per aggiornamenti via UI
|
|
||||||
- 🔒 **Sistema licenze** con livelli servizio (basic/pro/enterprise)
|
|
||||||
- 📱 **Mobile support** per notifiche e gestione aggiornamenti
|
|
||||||
|
|
||||||
### 🏗️ **Sistema Multi-Database CONFERMATO**:
|
|
||||||
- Database Master: `users`, `roles`, `amministratori`, `dati_centrali`
|
|
||||||
- Database Satelliti: `netgescon_CODICE8CHAR` per ogni amministratore
|
|
||||||
- Sincronizzazione: Laravel Multi-DB + Events + Queues
|
|
||||||
- Backup/Restore: per singolo amministratore
|
|
||||||
|
|
||||||
### <20> **Features Avanzate da Implementare**:
|
|
||||||
- Sistema audit stile GIT per tracciamento modifiche
|
|
||||||
- Dati pre-caricati per nuovi stabili (comuni, voci tipo, fornitori)
|
|
||||||
- UI stile Akaunting + icone GitHub
|
|
||||||
- Sistema "prima nota" → contabilità definitiva
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 DOCUMENTI CREATI OGGI (7 Luglio 2025)
|
|
||||||
|
|
||||||
### 📖 **Documentazione Tecnica Completa**
|
|
||||||
- ✅ **`INSTALL_LINUX.md`**: Guida installazione pulita da zero su Linux
|
|
||||||
- Compatibilità OS (solo Linux + WSL per sviluppo)
|
|
||||||
- Prerequisites dettagliati (PHP 8.2+, MySQL 8.0+, Redis, Apache/Nginx)
|
|
||||||
- Step-by-step Ubuntu/Debian
|
|
||||||
- Configurazione sicurezza (firewall, SSL, database)
|
|
||||||
- Virtual host Apache + HTTPS
|
|
||||||
- Cron jobs per manutenzione
|
|
||||||
- Troubleshooting comune
|
|
||||||
|
|
||||||
- ✅ **`UPDATE_SYSTEM.md`**: Progettazione sistema aggiornamenti automatici
|
|
||||||
- Database schema completo (utenti registrati, versioni, log)
|
|
||||||
- API endpoints RESTful per registrazione/download/licenze
|
|
||||||
- UpdateService con backup automatico e rollback
|
|
||||||
- Comandi Artisan (update:check, update:install, update:download)
|
|
||||||
- Frontend Vue.js per gestione aggiornamenti
|
|
||||||
- Sistema licenze multi-livello (basic/professional/enterprise)
|
|
||||||
- Sicurezza (checksum, signatures, rate limiting)
|
|
||||||
- Monitoring e analytics
|
|
||||||
|
|
||||||
### 🎯 **STATO PROGETTO ATTUALE**
|
|
||||||
- ✅ **Base modernizzata**: DB, relazioni, UI universale
|
|
||||||
- ✅ **Documentazione completa**: tecnica, installazione, specifiche
|
|
||||||
- 🔄 **IN PROGETTAZIONE**: Sistema aggiornamenti automatici
|
|
||||||
- ⏳ **PROSSIMI**: Multi-lingua, audit system, gestione licenze
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 PROSSIMI PASSI
|
|
||||||
1. **IMMEDIATO**: Correggere relazione admin-stabili nella sidebar
|
|
||||||
2. Verificare/popolare dati di test per admin con stabili
|
|
||||||
3. Completare codici alfanumerici per TUTTI gli utenti
|
|
||||||
4. Testare dashboard amministratore completo
|
|
||||||
5. Implementare logica "prima nota" vs "contabilità definitiva"
|
|
||||||
6. Progettazione multi-database per amministratori
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 NOTE TECNICHE IMPORTANTI
|
|
||||||
|
|
||||||
### <20> **AMBIENTE DI SVILUPPO E PRODUZIONE**
|
|
||||||
- **⚠️ IMPORTANTE**: Progetto destinato SOLO a Linux in produzione
|
|
||||||
- **Sviluppo**: WSL su Windows supportato, ma comandi sempre Linux/Bash
|
|
||||||
- **Terminale**: Utilizzare SEMPRE sintassi Linux per comandi
|
|
||||||
- **Path**: Utilizzare forward slash `/` non backslash `\`
|
|
||||||
- **Case sensitive**: Attenzione ai nomi file (Linux è case-sensitive)
|
|
||||||
|
|
||||||
### <20>🗃️ **Struttura Database MODERNA**
|
|
||||||
- **Chiavi primarie**: SEMPRE `id` (standard Laravel) ✅
|
|
||||||
- **Foreign keys**: `nome_tabella_id` (es: `stabile_id`, `user_id`) ✅
|
|
||||||
- **Timestamps**: SEMPRE inclusi (`created_at`, `updated_at`) ✅
|
|
||||||
- **Soft deletes**: Dove serve (`deleted_at`) ✅
|
|
||||||
- **Codici unici**: 8 caratteri alfanumerici per identificazione ✅
|
|
||||||
|
|
||||||
### 🔧 **Convenzioni Laravel Adottate**
|
|
||||||
- Seeders in `app/Console/Seeders/` ✅
|
|
||||||
- Namespace `App\Console\Seeders` ✅
|
|
||||||
- Relazioni standard: `belongsTo()`, `hasMany()`, etc. ✅
|
|
||||||
- Modelli con `SoftDeletes`, `HasFactory` ✅
|
|
||||||
- Scope e accessor dove utili ✅
|
|
||||||
|
|
||||||
### 🎨 **Sistema Tema/Colori**
|
|
||||||
- Helper `userSetting()` funzionante ✅
|
|
||||||
- Tema scuro/chiaro personalizzabile ✅
|
|
||||||
- Autoloaded da `composer.json` ✅
|
|
||||||
|
|
||||||
### <20> **Sistema Utenti Moderno**
|
|
||||||
- Codici alfanumerici 8 caratteri per identificazione univoca
|
|
||||||
- Generazione automatica nei modelli
|
|
||||||
- Prefissi per tipo: U=User, A=Allegato, M=Movimento
|
|
||||||
- Sistema multi-amministratore preparato
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚨 ERRORI RISOLTI
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'stabili.id_stabile'`
|
|
||||||
- **Causa**: Relazioni usavano vecchia chiave `id_stabile`
|
|
||||||
- **Soluzione**: Aggiornate TUTTE le relazioni a `id` standard
|
|
||||||
- ✅ `Call to undefined function userSetting()`
|
|
||||||
- **Causa**: Helper non autoloaded correttamente
|
|
||||||
- **Soluzione**: Aggiunto in `app/Helpers/impostazioni.php`
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'amministratori.deleted_at'`
|
|
||||||
- **Causa**: Migration amministratori non eseguita
|
|
||||||
- **Soluzione**: Eseguito `php artisan migrate`
|
|
||||||
- ✅ `syntax error, unexpected token "," DashboardController.php:80`
|
|
||||||
- **Causa**: Codice duplicato e parentesi mancante nel compact()
|
|
||||||
- **Soluzione**: Ripulito codice e aggiunta parentesi di chiusura
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 PER DEBUGGING FUTURO
|
|
||||||
```bash
|
|
||||||
# Verificare struttura tabelle
|
|
||||||
php artisan tinker --execute="echo implode(', ', Schema::getColumnListing('NOME_TABELLA'));"
|
|
||||||
|
|
||||||
# Test relazioni admin-stabili
|
|
||||||
php artisan tinker --execute="User::with('amministratore.stabili')->where('role', 'admin')->first();"
|
|
||||||
|
|
||||||
# Stato migration
|
|
||||||
php artisan migrate:status
|
|
||||||
|
|
||||||
# Stato seeders
|
|
||||||
php artisan db:seed --class=\\App\\Console\\Seeders\\NOME_SEEDER
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Ultima modifica: 7 Luglio 2025 - README aggiornato, errori risolti (deleted_at, syntax error), UI universale funzionante*
|
|
||||||
|
|
||||||
## 📋 PROSSIMI PASSI
|
|
||||||
1. **IMMEDIATO**: Risolvere `userSetting()` function
|
|
||||||
2. Testare dashboard amministratore completo
|
|
||||||
3. Verificare che tutte le relazioni funzionino
|
|
||||||
4. Implementare logica "prima nota" vs "contabilità definitiva"
|
|
||||||
5. Generazione automatica codici 8 caratteri per utenti
|
|
||||||
6. Progettazione multi-database per amministratori
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 NOTE TECNICHE IMPORTANTI
|
|
||||||
|
|
||||||
### 🗃️ **Struttura Database**
|
|
||||||
- **Chiavi primarie**: SEMPRE `id` (standard Laravel)
|
|
||||||
- **Foreign keys**: `nome_tabella_id` (es: `stabile_id`, `user_id`)
|
|
||||||
- **Timestamps**: SEMPRE inclusi (`created_at`, `updated_at`)
|
|
||||||
- **Soft deletes**: Dove serve (`deleted_at`)
|
|
||||||
- **Codici unici**: 8 caratteri alfanumerici per identificazione
|
|
||||||
|
|
||||||
### 🔧 **Convenzioni Laravel Adottate**
|
|
||||||
- Seeders in `app/Console/Seeders/`
|
|
||||||
- Namespace `App\Console\Seeders`
|
|
||||||
- Relazioni standard: `belongsTo()`, `hasMany()`, etc.
|
|
||||||
- Modelli con `SoftDeletes`, `HasFactory`
|
|
||||||
- Scope e accessor dove utili
|
|
||||||
|
|
||||||
### 🎨 **Sistema Tema/Colori**
|
|
||||||
- Già implementato sistema preferenze utente
|
|
||||||
- Tema scuro/chiaro personalizzabile
|
|
||||||
- **DA VERIFICARE**: come è implementato `userSetting()`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚨 ERRORI RISOLTI
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'stabili.id_stabile'`
|
|
||||||
- **Causa**: Relazioni usavano vecchia chiave `id_stabile`
|
|
||||||
- **Soluzione**: Aggiornate tutte le relazioni a `id` standard
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 PER DEBUGGING FUTURO
|
|
||||||
```bash
|
|
||||||
# Verificare struttura tabelle
|
|
||||||
php artisan tinker --execute="echo implode(', ', Schema::getColumnListing('NOME_TABELLA'));"
|
|
||||||
|
|
||||||
# Test relazioni
|
|
||||||
php artisan tinker --execute="App\Models\MovimentoContabile::with('stabile')->first();"
|
|
||||||
|
|
||||||
# Stato migration
|
|
||||||
php artisan migrate:status
|
|
||||||
|
|
||||||
# Stato seeders
|
|
||||||
php artisan db:seed --class=\\App\\Console\\Seeders\\NOME_SEEDER
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Ultima modifica: 6 Luglio 2025 - Helper userSetting() mancante*
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🌍 **SUPPORTO MULTI-LINGUA**
|
|
||||||
- ⏳ **TODO**: Implementare Laravel Localization
|
|
||||||
- ⏳ File di traduzione: IT (default), EN, ES, FR
|
|
||||||
- ⏳ Selector lingua nell'UI universale
|
|
||||||
- ⏳ Traduzione automatica delle email e notifiche
|
|
||||||
- ⏳ Personalizzazione per paese (formati data, valuta)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# NetGesCon Laravel - Blocco Appunti Progressivo
|
|
||||||
**Data inizio modernizzazione**: 6 Luglio ### <20> **Features Avanzate PROSSIME**:
|
|
||||||
- 🔄 **IN CORSO**: Sistema multi-database per amministratori
|
|
||||||
- ⏳ Sistema audit stile GIT per tracciamento modifiche
|
|
||||||
- ⏳ Dati pre-caricati per nuovi stabili (comuni, voci tipo, fornitori)
|
|
||||||
- ⏳ Sistema "prima nota" → contabilità definitiva
|
|
||||||
- ⏳ Partita doppia per bilanci completi
|
|
||||||
**Obiettivo**: Ristrutturazione completa con best practice Laravel + gestione moderna archivi/contabilità
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 OBIETTIVI PRINCIPALI
|
|
||||||
- ✅ Modernizzare strutture DB (chiavi `id`, relazioni standard Laravel)
|
|
||||||
- ✅ Sistemare funzioni helper (userSetting)
|
|
||||||
- 🔄 **IN CORSO**: Correggere relazioni amministratore-stabili nella sidebar
|
|
||||||
- 🔄 **IN CORSO**: Sistema multi-database per amministratori (con codice 8 caratteri)
|
|
||||||
- 🔄 **IN CORSO**: Codici alfanumerici 8 caratteri per TUTTI gli utenti/movimenti/record
|
|
||||||
- ⏳ Implementare sistema "prima nota" → contabilità definitiva
|
|
||||||
- ⏳ Preparare base per partita doppia
|
|
||||||
- ⏳ UI stile Akaunting + icone GitHub
|
|
||||||
|
|
||||||
### <20> **Sistema Ruoli CORRETTO**:
|
|
||||||
- **`admin`** = RISERVATO per sviluppatori sistema (NOI)
|
|
||||||
- **`amministratore`** = Chi gestisce condomini (login principale)
|
|
||||||
- **Ruoli multipli**: super-admin + fornitore + condominio + inquilino (stesso utente)
|
|
||||||
- **Autorizzazioni multiple** per utente già implementate
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ COMPLETATO (SESSIONI PRECEDENTI + ATTUALE)
|
|
||||||
|
|
||||||
### 📊 **Tabelle Modernizzate (Best Practice Laravel)**
|
|
||||||
- ✅ `movimenti_contabili`: chiave `id`, campo `codice_movimento` (8 char), stati movimento, relazioni standard
|
|
||||||
- ✅ `allegati`: chiave `id`, campo `codice_allegato` (8 char), relazione `user_id`, timestamps, soft deletes
|
|
||||||
- ✅ `stabili`: già aveva chiave `id` standard
|
|
||||||
- ✅ `amministratori`: NUOVA tabella moderna con codici alfanumerici, multi-database, cartelle dati
|
|
||||||
- ✅ **TUTTI i seeders aggiornati**: dati inseriti direttamente nel DB per test
|
|
||||||
- ✅ **Parametri di versione**: modificati direttamente nel DB (non più nei file)
|
|
||||||
|
|
||||||
### 🔗 **Relazioni Corrette (TUTTE le relazioni con Stabile)**
|
|
||||||
- ✅ `MovimentoContabile::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `VoceSpesa::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Gestione::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Bilancio::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `TabellaMillesimale::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Assemblea::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Preventivo::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `Banca::stabile()` → `belongsTo(Stabile::class, 'stabile_id', 'id')`
|
|
||||||
- ✅ `PianoContiCondominio`: aggiornato per usare `stabile_id` e chiave `id`
|
|
||||||
|
|
||||||
### 🔐 **Sistema Utenti e Codici Alfanumerici**
|
|
||||||
- ✅ **Codici 8 caratteri**: A=Allegato, M=Movimento, ADM=Amministratore
|
|
||||||
- ✅ **Generazione automatica**: nei modelli con prefissi
|
|
||||||
- ✅ **Sistema multi-database**: preparato per amministratori (campo `database_attivo`)
|
|
||||||
- ✅ **Cartelle dati**: auto-create per ogni amministratore (`/amministratori/CODICE/`)
|
|
||||||
- 🔄 **IN CORSO**: Applicazione completa a tutti gli utenti e record
|
|
||||||
|
|
||||||
### 📁 **Seeders e Migration**
|
|
||||||
- ✅ Posizione corretta: `app/Console/Seeders/` (NON `database/seeders/`)
|
|
||||||
- ✅ `MovimentiContabiliSeeder` → funzionante con dati test
|
|
||||||
- ✅ `AllegatiSeeder` → funzionante con dati test
|
|
||||||
- ✅ **TUTTI i seeders modernizzati** con best practice Laravel
|
|
||||||
- ✅ Migration `2025_07_06_071558_update_movimenti_contabili_table_structure.php`
|
|
||||||
- ✅ Migration `2025_07_06_200417_update_allegati_table_structure_to_laravel_standards.php`
|
|
||||||
|
|
||||||
### 🎨 **Interfaccia Utente UNIFICATA** ✅
|
|
||||||
- ✅ **Layout universale** responsive (`app-universal.blade.php`)
|
|
||||||
- ✅ **Sidebar permission-based** con menu dinamico filtrato
|
|
||||||
- ✅ **Mobile-first design** con hamburger menu (≤768px)
|
|
||||||
- ✅ **Dashboard admin** modernizzata con relazioni corrette
|
|
||||||
- ✅ **Dark mode** integrato e funzionante
|
|
||||||
- ✅ **Indicatori ruolo** visivi (colori, badge)
|
|
||||||
- ✅ **Menu contestuale** basato su permessi utente
|
|
||||||
|
|
||||||
### 📱 **Responsive Design IMPLEMENTATO** ✅
|
|
||||||
- ✅ **Desktop**: Sidebar fissa + colonna launcher
|
|
||||||
- ✅ **Mobile**: Hamburger menu + overlay sidebar
|
|
||||||
- ✅ **Tablet**: Sidebar collassabile con toggle
|
|
||||||
- ✅ **Accessibility**: Focus states, ARIA labels
|
|
||||||
- ✅ **Performance**: CSS transitions smooth
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 ATTUALMENTE IN LAVORAZIONE
|
|
||||||
|
|
||||||
### ✅ **STRATEGIA IMPLEMENTATA**: UI Universale per Tutti i Ruoli
|
|
||||||
**Approccio VINCENTE**: Una sola UI responsive che mostra contenuti diversi in base ai permessi
|
|
||||||
- ✅ **Layout universale** creato (`layouts/app-universal.blade.php`)
|
|
||||||
- ✅ **Sidebar intelligente** con menu filtrato per permessi
|
|
||||||
- ✅ **Responsive design** mobile-first con hamburger menu
|
|
||||||
- ✅ **Dashboard admin** modernizzata con nuova struttura dati
|
|
||||||
- ✅ **Super-admin e Admin** ora usano stesso layout
|
|
||||||
|
|
||||||
### 🎯 **VANTAGGI OTTENUTI**:
|
|
||||||
- ✅ **DRY Principle**: Una sola UI da manutenere
|
|
||||||
- ✅ **Mobile Responsive**: Hamburger menu per schermi piccoli
|
|
||||||
- ✅ **Permission-based**: Ogni utente vede solo ciò che può
|
|
||||||
- ✅ **Consistenza UX**: Stessa esperienza per tutti
|
|
||||||
- ✅ **Facilità sviluppo**: No duplicazione codice
|
|
||||||
|
|
||||||
### 🚀 **PROSSIMO GRANDE FOCUS**: Sistema Aggiornamenti Automatici
|
|
||||||
**Obiettivo**: Registrazione utenti con codici 8 caratteri + aggiornamenti via API
|
|
||||||
- 📋 **Progettazione completa** in `UPDATE_SYSTEM.md`
|
|
||||||
- 🗃️ **Database schema** per utenti registrati, versioni, log
|
|
||||||
- 🔌 **API design** per registrazione, download, verifica licenze
|
|
||||||
- ⚙️ **UpdateService** con backup automatico e rollback
|
|
||||||
- 🎨 **Frontend manager** per aggiornamenti via UI
|
|
||||||
- 🔒 **Sistema licenze** con livelli servizio (basic/pro/enterprise)
|
|
||||||
- 📱 **Mobile support** per notifiche e gestione aggiornamenti
|
|
||||||
|
|
||||||
### 🏗️ **Sistema Multi-Database CONFERMATO**:
|
|
||||||
- Database Master: `users`, `roles`, `amministratori`, `dati_centrali`
|
|
||||||
- Database Satelliti: `netgescon_CODICE8CHAR` per ogni amministratore
|
|
||||||
- Sincronizzazione: Laravel Multi-DB + Events + Queues
|
|
||||||
- Backup/Restore: per singolo amministratore
|
|
||||||
|
|
||||||
### <20> **Features Avanzate da Implementare**:
|
|
||||||
- Sistema audit stile GIT per tracciamento modifiche
|
|
||||||
- Dati pre-caricati per nuovi stabili (comuni, voci tipo, fornitori)
|
|
||||||
- UI stile Akaunting + icone GitHub
|
|
||||||
- Sistema "prima nota" → contabilità definitiva
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 DOCUMENTI CREATI OGGI (7 Luglio 2025)
|
|
||||||
|
|
||||||
### 📖 **Documentazione Tecnica Completa**
|
|
||||||
- ✅ **`INSTALL_LINUX.md`**: Guida installazione pulita da zero su Linux
|
|
||||||
- Compatibilità OS (solo Linux + WSL per sviluppo)
|
|
||||||
- Prerequisites dettagliati (PHP 8.2+, MySQL 8.0+, Redis, Apache/Nginx)
|
|
||||||
- Step-by-step Ubuntu/Debian
|
|
||||||
- Configurazione sicurezza (firewall, SSL, database)
|
|
||||||
- Virtual host Apache + HTTPS
|
|
||||||
- Cron jobs per manutenzione
|
|
||||||
- Troubleshooting comune
|
|
||||||
|
|
||||||
- ✅ **`UPDATE_SYSTEM.md`**: Progettazione sistema aggiornamenti automatici
|
|
||||||
- Database schema completo (utenti registrati, versioni, log)
|
|
||||||
- API endpoints RESTful per registrazione/download/licenze
|
|
||||||
- UpdateService con backup automatico e rollback
|
|
||||||
- Comandi Artisan (update:check, update:install, update:download)
|
|
||||||
- Frontend Vue.js per gestione aggiornamenti
|
|
||||||
- Sistema licenze multi-livello (basic/professional/enterprise)
|
|
||||||
- Sicurezza (checksum, signatures, rate limiting)
|
|
||||||
- Monitoring e analytics
|
|
||||||
|
|
||||||
### 🎯 **STATO PROGETTO ATTUALE**
|
|
||||||
- ✅ **Base modernizzata**: DB, relazioni, UI universale
|
|
||||||
- ✅ **Documentazione completa**: tecnica, installazione, specifiche
|
|
||||||
- 🔄 **IN PROGETTAZIONE**: Sistema aggiornamenti automatici
|
|
||||||
- ⏳ **PROSSIMI**: Multi-lingua, audit system, gestione licenze
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 PROSSIMI PASSI
|
|
||||||
1. **IMMEDIATO**: Correggere relazione admin-stabili nella sidebar
|
|
||||||
2. Verificare/popolare dati di test per admin con stabili
|
|
||||||
3. Completare codici alfanumerici per TUTTI gli utenti
|
|
||||||
4. Testare dashboard amministratore completo
|
|
||||||
5. Implementare logica "prima nota" vs "contabilità definitiva"
|
|
||||||
6. Progettazione multi-database per amministratori
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 NOTE TECNICHE IMPORTANTI
|
|
||||||
|
|
||||||
### <20> **AMBIENTE DI SVILUPPO E PRODUZIONE**
|
|
||||||
- **⚠️ IMPORTANTE**: Progetto destinato SOLO a Linux in produzione
|
|
||||||
- **Sviluppo**: WSL su Windows supportato, ma comandi sempre Linux/Bash
|
|
||||||
- **Terminale**: Utilizzare SEMPRE sintassi Linux per comandi
|
|
||||||
- **Path**: Utilizzare forward slash `/` non backslash `\`
|
|
||||||
- **Case sensitive**: Attenzione ai nomi file (Linux è case-sensitive)
|
|
||||||
|
|
||||||
### <20>🗃️ **Struttura Database MODERNA**
|
|
||||||
- **Chiavi primarie**: SEMPRE `id` (standard Laravel) ✅
|
|
||||||
- **Foreign keys**: `nome_tabella_id` (es: `stabile_id`, `user_id`) ✅
|
|
||||||
- **Timestamps**: SEMPRE inclusi (`created_at`, `updated_at`) ✅
|
|
||||||
- **Soft deletes**: Dove serve (`deleted_at`) ✅
|
|
||||||
- **Codici unici**: 8 caratteri alfanumerici per identificazione ✅
|
|
||||||
|
|
||||||
### 🔧 **Convenzioni Laravel Adottate**
|
|
||||||
- Seeders in `app/Console/Seeders/` ✅
|
|
||||||
- Namespace `App\Console\Seeders` ✅
|
|
||||||
- Relazioni standard: `belongsTo()`, `hasMany()`, etc. ✅
|
|
||||||
- Modelli con `SoftDeletes`, `HasFactory` ✅
|
|
||||||
- Scope e accessor dove utili ✅
|
|
||||||
|
|
||||||
### 🎨 **Sistema Tema/Colori**
|
|
||||||
- Helper `userSetting()` funzionante ✅
|
|
||||||
- Tema scuro/chiaro personalizzabile ✅
|
|
||||||
- Autoloaded da `composer.json` ✅
|
|
||||||
|
|
||||||
### <20> **Sistema Utenti Moderno**
|
|
||||||
- Codici alfanumerici 8 caratteri per identificazione univoca
|
|
||||||
- Generazione automatica nei modelli
|
|
||||||
- Prefissi per tipo: U=User, A=Allegato, M=Movimento
|
|
||||||
- Sistema multi-amministratore preparato
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚨 ERRORI RISOLTI
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'stabili.id_stabile'`
|
|
||||||
- **Causa**: Relazioni usavano vecchia chiave `id_stabile`
|
|
||||||
- **Soluzione**: Aggiornate TUTTE le relazioni a `id` standard
|
|
||||||
- ✅ `Call to undefined function userSetting()`
|
|
||||||
- **Causa**: Helper non autoloaded correttamente
|
|
||||||
- **Soluzione**: Aggiunto in `app/Helpers/impostazioni.php`
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'amministratori.deleted_at'`
|
|
||||||
- **Causa**: Migration amministratori non eseguita
|
|
||||||
- **Soluzione**: Eseguito `php artisan migrate`
|
|
||||||
- ✅ `syntax error, unexpected token "," DashboardController.php:80`
|
|
||||||
- **Causa**: Codice duplicato e parentesi mancante nel compact()
|
|
||||||
- **Soluzione**: Ripulito codice e aggiunta parentesi di chiusura
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 PER DEBUGGING FUTURO
|
|
||||||
```bash
|
|
||||||
# Verificare struttura tabelle
|
|
||||||
php artisan tinker --execute="echo implode(', ', Schema::getColumnListing('NOME_TABELLA'));"
|
|
||||||
|
|
||||||
# Test relazioni admin-stabili
|
|
||||||
php artisan tinker --execute="User::with('amministratore.stabili')->where('role', 'admin')->first();"
|
|
||||||
|
|
||||||
# Stato migration
|
|
||||||
php artisan migrate:status
|
|
||||||
|
|
||||||
# Stato seeders
|
|
||||||
php artisan db:seed --class=\\App\\Console\\Seeders\\NOME_SEEDER
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Ultima modifica: 7 Luglio 2025 - README aggiornato, errori risolti (deleted_at, syntax error), UI universale funzionante*
|
|
||||||
|
|
||||||
## 📋 PROSSIMI PASSI
|
|
||||||
1. **IMMEDIATO**: Risolvere `userSetting()` function
|
|
||||||
2. Testare dashboard amministratore completo
|
|
||||||
3. Verificare che tutte le relazioni funzionino
|
|
||||||
4. Implementare logica "prima nota" vs "contabilità definitiva"
|
|
||||||
5. Generazione automatica codici 8 caratteri per utenti
|
|
||||||
6. Progettazione multi-database per amministratori
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 NOTE TECNICHE IMPORTANTI
|
|
||||||
|
|
||||||
### 🗃️ **Struttura Database**
|
|
||||||
- **Chiavi primarie**: SEMPRE `id` (standard Laravel)
|
|
||||||
- **Foreign keys**: `nome_tabella_id` (es: `stabile_id`, `user_id`)
|
|
||||||
- **Timestamps**: SEMPRE inclusi (`created_at`, `updated_at`)
|
|
||||||
- **Soft deletes**: Dove serve (`deleted_at`)
|
|
||||||
- **Codici unici**: 8 caratteri alfanumerici per identificazione
|
|
||||||
|
|
||||||
### 🔧 **Convenzioni Laravel Adottate**
|
|
||||||
- Seeders in `app/Console/Seeders/`
|
|
||||||
- Namespace `App\Console\Seeders`
|
|
||||||
- Relazioni standard: `belongsTo()`, `hasMany()`, etc.
|
|
||||||
- Modelli con `SoftDeletes`, `HasFactory`
|
|
||||||
- Scope e accessor dove utili
|
|
||||||
|
|
||||||
### 🎨 **Sistema Tema/Colori**
|
|
||||||
- Già implementato sistema preferenze utente
|
|
||||||
- Tema scuro/chiaro personalizzabile
|
|
||||||
- **DA VERIFICARE**: come è implementato `userSetting()`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚨 ERRORI RISOLTI
|
|
||||||
- ✅ `SQLSTATE[42S22]: Column not found: 1054 Unknown column 'stabili.id_stabile'`
|
|
||||||
- **Causa**: Relazioni usavano vecchia chiave `id_stabile`
|
|
||||||
- **Soluzione**: Aggiornate tutte le relazioni a `id` standard
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 PER DEBUGGING FUTURO
|
|
||||||
```bash
|
|
||||||
# Verificare struttura tabelle
|
|
||||||
php artisan tinker --execute="echo implode(', ', Schema::getColumnListing('NOME_TABELLA'));"
|
|
||||||
|
|
||||||
# Test relazioni
|
|
||||||
php artisan tinker --execute="App\Models\MovimentoContabile::with('stabile')->first();"
|
|
||||||
|
|
||||||
# Stato migration
|
|
||||||
php artisan migrate:status
|
|
||||||
|
|
||||||
# Stato seeders
|
|
||||||
php artisan db:seed --class=\\App\\Console\\Seeders\\NOME_SEEDER
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
*Ultima modifica: 6 Luglio 2025 - Helper userSetting() mancante*
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🌍 **SUPPORTO MULTI-LINGUA**
|
|
||||||
- ⏳ **TODO**: Implementare Laravel Localization
|
|
||||||
- ⏳ File di traduzione: IT (default), EN, ES, FR
|
|
||||||
- ⏳ Selector lingua nell'UI universale
|
|
||||||
- ⏳ Traduzione automatica delle email e notifiche
|
|
||||||
- ⏳ Personalizzazione per paese (formati data, valuta)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 **AGGIORNAMENTO FINALE 7 LUGLIO 2025** ✅
|
## 📋 **AGGIORNAMENTO FINALE 7 LUGLIO 2025** ✅
|
||||||
|
|
||||||
### 🎉 **CONFERMA: SISTEMA PRATICAMENTE COMPLETO**
|
### 🎉 **CONFERMA: SISTEMA PRATICAMENTE COMPLETO**
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,29 @@ class DashboardController extends Controller
|
||||||
{
|
{
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$amministratore_id = Auth::user()->amministratore->id_amministratore ?? null;
|
// Ottieni l'ID dell'amministratore in modo sicuro
|
||||||
|
$user = Auth::user();
|
||||||
|
$amministratore_id = null;
|
||||||
|
|
||||||
|
if ($user && $user->amministratore) {
|
||||||
|
$amministratore_id = $user->amministratore->id; // Usa 'id' invece di 'id_amministratore'
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se l'utente non ha un amministratore associato, mostra vista vuota
|
||||||
|
if (!$amministratore_id) {
|
||||||
|
return view('admin.dashboard', [
|
||||||
|
'stats' => [
|
||||||
|
'stabili_gestiti' => 0,
|
||||||
|
'stabili_attivi' => 0,
|
||||||
|
'ticket_aperti' => 0,
|
||||||
|
'ticket_urgenti' => 0,
|
||||||
|
],
|
||||||
|
'ticketsAperti' => collect(),
|
||||||
|
'scadenzeImminenti' => collect(),
|
||||||
|
'ultimiDocumenti' => collect(),
|
||||||
|
'ultimiMovimenti' => collect(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
// Statistiche principali
|
// Statistiche principali
|
||||||
$stats = [
|
$stats = [
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,8 @@ class SidebarComposer
|
||||||
if (method_exists($user, 'hasRole') && $user->hasRole('super-admin')) {
|
if (method_exists($user, 'hasRole') && $user->hasRole('super-admin')) {
|
||||||
$stabili = Stabile::orderBy('denominazione')->get();
|
$stabili = Stabile::orderBy('denominazione')->get();
|
||||||
} elseif ($user->amministratore) {
|
} elseif ($user->amministratore) {
|
||||||
$stabili = Stabile::where('amministratore_id', $user->amministratore->id_amministratore)->orderBy('denominazione')->get();
|
// Usa 'id' invece di 'id_amministratore' per la chiave modernizzata
|
||||||
|
$stabili = Stabile::where('amministratore_id', $user->amministratore->id)->orderBy('denominazione')->get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$stabileAttivo = session('stabile_corrente') ?? ($stabili->first() ? $stabili->first()->denominazione : null);
|
$stabileAttivo = session('stabile_corrente') ?? ($stabili->first() ? $stabili->first()->denominazione : null);
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,8 @@ class Amministratore extends Model
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
protected $table = 'amministratori'; // Specifica il nome corretto della tabella
|
protected $table = 'amministratori';
|
||||||
protected $primaryKey = 'id_amministratore';
|
// Rimossa la primaryKey personalizzata - usa 'id' standard Laravel
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user