📋 AGGIUNTE PRINCIPALI: - Sistema contabile partita doppia con gestioni multiple - Documentazione implementazione completa - Models Laravel: GestioneContabile, MovimentoPartitaDoppia - Controller ContabilitaAvanzataController - Migration sistema contabile completo - Scripts automazione e trasferimento - Manuali utente e checklist implementazione 📊 FILES PRINCIPALI: - docs/10-IMPLEMENTAZIONE-CONTABILITA-PARTITA-DOPPIA-GESTIONI.md - SPECIFICHE-SISTEMA-CONTABILE-COMPLETO.md - netgescon-laravel/database/migrations/2025_07_20_100000_create_complete_accounting_system.php - netgescon-laravel/app/Models/GestioneContabile.php ✅ CHECKPOINT SICURO PER ROLLBACK
348 lines
12 KiB
Bash
Executable File
348 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
||
# 🔍 SCRIPT DIAGNOSTICO: VERIFICA SISTEMA CONTABILE NETGESCON
|
||
# File: scripts/diagnosi-contabilita.sh
|
||
|
||
set -e
|
||
|
||
# 🎨 Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 📋 Configuration
|
||
LARAVEL_PATH="/var/www/netgescon"
|
||
DATE=$(date +"%Y-%m-%d %H:%M:%S")
|
||
|
||
echo -e "${BLUE}🔍 ===== DIAGNOSI SISTEMA CONTABILE NETGESCON =====${NC}"
|
||
echo -e "${CYAN}📅 Eseguito il: $DATE${NC}"
|
||
echo ""
|
||
|
||
# ✅ 1. VERIFICA CONNESSIONE DATABASE
|
||
echo -e "${YELLOW}🗄️ 1. VERIFICA CONNESSIONE DATABASE${NC}"
|
||
|
||
cd $LARAVEL_PATH
|
||
|
||
DB_NAME=$(php artisan tinker --execute="echo config('database.connections.mysql.database');" 2>/dev/null | tail -1)
|
||
DB_USER=$(php artisan tinker --execute="echo config('database.connections.mysql.username');" 2>/dev/null | tail -1)
|
||
|
||
if [ -n "$DB_NAME" ]; then
|
||
echo -e "${GREEN} ✅ Database: $DB_NAME${NC}"
|
||
echo -e "${GREEN} ✅ User: $DB_USER${NC}"
|
||
else
|
||
echo -e "${RED} ❌ Impossibile leggere configurazione database${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# ✅ 2. VERIFICA TABELLE SISTEMA CONTABILE
|
||
echo ""
|
||
echo -e "${YELLOW}🗃️ 2. VERIFICA TABELLE SISTEMA CONTABILE${NC}"
|
||
|
||
# Lista tabelle attese
|
||
TABELLE_ATTESE=(
|
||
"gestioni_contabili"
|
||
"piano_conti_mastri"
|
||
"piano_conti_conti"
|
||
"piano_conti_sottoconti"
|
||
"registrazioni_contabili"
|
||
"movimenti_contabili"
|
||
"ripartizioni_condomini"
|
||
)
|
||
|
||
TABELLE_TROVATE=0
|
||
TABELLE_MANCANTI=()
|
||
|
||
for tabella in "${TABELLE_ATTESE[@]}"; do
|
||
if mysql -u "$DB_USER" -p"$(php artisan tinker --execute="echo config('database.connections.mysql.password');" 2>/dev/null | tail -1)" "$DB_NAME" -e "SHOW TABLES LIKE '$tabella'" 2>/dev/null | grep -q "$tabella"; then
|
||
echo -e "${GREEN} ✅ $tabella${NC}"
|
||
TABELLE_TROVATE=$((TABELLE_TROVATE + 1))
|
||
else
|
||
echo -e "${RED} ❌ $tabella (MANCANTE)${NC}"
|
||
TABELLE_MANCANTI+=("$tabella")
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo -e "${CYAN}📊 RISULTATO TABELLE: ${TABELLE_TROVATE}/${#TABELLE_ATTESE[@]} presenti${NC}"
|
||
|
||
if [ ${#TABELLE_MANCANTI[@]} -gt 0 ]; then
|
||
echo -e "${RED}⚠️ TABELLE MANCANTI:${NC}"
|
||
for mancante in "${TABELLE_MANCANTI[@]}"; do
|
||
echo -e "${RED} - $mancante${NC}"
|
||
done
|
||
fi
|
||
|
||
# ✅ 3. VERIFICA MODELS ELOQUENT
|
||
echo ""
|
||
echo -e "${YELLOW}🏗️ 3. VERIFICA MODELS ELOQUENT${NC}"
|
||
|
||
MODELS_ATTESI=(
|
||
"GestioneContabile"
|
||
"PianoContiMastro"
|
||
"PianoContiConto"
|
||
"PianoContiSottoconto"
|
||
"RegistrazioneContabile"
|
||
"MovimentoContabile"
|
||
"RipartizioneCondomino"
|
||
)
|
||
|
||
for model in "${MODELS_ATTESI[@]}"; do
|
||
if [ -f "app/Models/$model.php" ]; then
|
||
echo -e "${GREEN} ✅ $model.php${NC}"
|
||
else
|
||
echo -e "${RED} ❌ $model.php (MANCANTE)${NC}"
|
||
fi
|
||
done
|
||
|
||
# ✅ 4. VERIFICA STATO MIGRAZIONI
|
||
echo ""
|
||
echo -e "${YELLOW}📊 4. STATO MIGRAZIONI${NC}"
|
||
|
||
echo -e "${CYAN} Migrazioni in sospeso:${NC}"
|
||
MIGRAZIONI_PENDING=$(php artisan migrate:status | grep "Ran?" | wc -l)
|
||
if [ $MIGRAZIONI_PENDING -gt 0 ]; then
|
||
php artisan migrate:status | grep "Ran?" | head -10
|
||
echo -e "${YELLOW} ⚠️ $MIGRAZIONI_PENDING migrazioni in sospeso${NC}"
|
||
else
|
||
echo -e "${GREEN} ✅ Tutte le migrazioni sono state eseguite${NC}"
|
||
fi
|
||
|
||
# ✅ 5. CONTEGGIO DATI ESISTENTI
|
||
echo ""
|
||
echo -e "${YELLOW}📈 5. ANALISI DATI ESISTENTI${NC}"
|
||
|
||
# Conta condomini
|
||
php artisan tinker --execute="
|
||
\$condomini = App\Models\Stabile::count();
|
||
\$unita = App\Models\UnitaImmobiliare::count();
|
||
\$persone = App\Models\Persona::count();
|
||
|
||
echo '🏢 Condomini: ' . \$condomini . PHP_EOL;
|
||
echo '🏠 Unità immobiliari: ' . \$unita . PHP_EOL;
|
||
echo '👥 Persone: ' . \$persone . PHP_EOL;
|
||
|
||
if (class_exists('App\Models\GestioneContabile')) {
|
||
\$gestioni = App\Models\GestioneContabile::count();
|
||
echo '📊 Gestioni contabili: ' . \$gestioni . PHP_EOL;
|
||
}
|
||
|
||
if (class_exists('App\Models\RegistrazioneContabile')) {
|
||
\$registrazioni = App\Models\RegistrazioneContabile::count();
|
||
echo '💰 Registrazioni contabili: ' . \$registrazioni . PHP_EOL;
|
||
}
|
||
" 2>/dev/null
|
||
|
||
# ✅ 6. VERIFICA PIANO CONTI
|
||
echo ""
|
||
echo -e "${YELLOW}🗂️ 6. VERIFICA PIANO CONTI${NC}"
|
||
|
||
if [ $TABELLE_TROVATE -ge 3 ]; then
|
||
MASTRI=$(mysql -u "$DB_USER" -p"$(php artisan tinker --execute="echo config('database.connections.mysql.password');" 2>/dev/null | tail -1)" "$DB_NAME" -se "SELECT COUNT(*) FROM piano_conti_mastri WHERE attivo=1" 2>/dev/null || echo "0")
|
||
CONTI=$(mysql -u "$DB_USER" -p"$(php artisan tinker --execute="echo config('database.connections.mysql.password');" 2>/dev/null | tail -1)" "$DB_NAME" -se "SELECT COUNT(*) FROM piano_conti_conti WHERE attivo=1" 2>/dev/null || echo "0")
|
||
SOTTOCONTI=$(mysql -u "$DB_USER" -p"$(php artisan tinker --execute="echo config('database.connections.mysql.password');" 2>/dev/null | tail -1)" "$DB_NAME" -se "SELECT COUNT(*) FROM piano_conti_sottoconti WHERE attivo=1" 2>/dev/null || echo "0")
|
||
|
||
echo -e "${CYAN} 📊 Mastri: $MASTRI${NC}"
|
||
echo -e "${CYAN} 📂 Conti: $CONTI${NC}"
|
||
echo -e "${CYAN} 📄 Sottoconti: $SOTTOCONTI${NC}"
|
||
|
||
if [ $MASTRI -eq 0 ] && [ $CONTI -eq 0 ] && [ $SOTTOCONTI -eq 0 ]; then
|
||
echo -e "${YELLOW} ⚠️ Piano conti vuoto - eseguire: php artisan db:seed --class=PianoContiSeeder${NC}"
|
||
elif [ $MASTRI -gt 0 ] && [ $CONTI -gt 0 ] && [ $SOTTOCONTI -gt 0 ]; then
|
||
echo -e "${GREEN} ✅ Piano conti popolato correttamente${NC}"
|
||
else
|
||
echo -e "${YELLOW} ⚠️ Piano conti parzialmente popolato${NC}"
|
||
fi
|
||
else
|
||
echo -e "${RED} ❌ Impossibile verificare piano conti - tabelle mancanti${NC}"
|
||
fi
|
||
|
||
# ✅ 7. VERIFICA PARTITA DOPPIA (se dati presenti)
|
||
echo ""
|
||
echo -e "${YELLOW}⚖️ 7. VERIFICA PARTITA DOPPIA${NC}"
|
||
|
||
if [ $TABELLE_TROVATE -ge 6 ]; then
|
||
php artisan tinker --execute="
|
||
if (class_exists('App\Models\RegistrazioneContabile')) {
|
||
\$registrazioni = App\Models\RegistrazioneContabile::with('movimenti')->get();
|
||
\$errori = 0;
|
||
\$totali_dare = 0;
|
||
\$totali_avere = 0;
|
||
|
||
foreach (\$registrazioni as \$reg) {
|
||
\$dare = \$reg->movimenti->sum('importo_dare');
|
||
\$avere = \$reg->movimenti->sum('importo_avere');
|
||
\$totali_dare += \$dare;
|
||
\$totali_avere += \$avere;
|
||
|
||
if (abs(\$dare - \$avere) > 0.01) {
|
||
\$errori++;
|
||
}
|
||
}
|
||
|
||
echo '💰 Totale DARE: €' . number_format(\$totali_dare, 2) . PHP_EOL;
|
||
echo '💰 Totale AVERE: €' . number_format(\$totali_avere, 2) . PHP_EOL;
|
||
echo '⚖️ Saldo: €' . number_format(\$totali_dare - \$totali_avere, 2) . PHP_EOL;
|
||
|
||
if (\$errori > 0) {
|
||
echo '❌ Errori partita doppia: ' . \$errori . PHP_EOL;
|
||
} else if (\$registrazioni->count() > 0) {
|
||
echo '✅ Partita doppia bilanciata' . PHP_EOL;
|
||
} else {
|
||
echo '📝 Nessuna registrazione presente' . PHP_EOL;
|
||
}
|
||
}
|
||
" 2>/dev/null
|
||
else
|
||
echo -e "${RED} ❌ Impossibile verificare partita doppia - tabelle mancanti${NC}"
|
||
fi
|
||
|
||
# ✅ 8. VERIFICA MILLESIMI UNITÀ IMMOBILIARI
|
||
echo ""
|
||
echo -e "${YELLOW}📏 8. VERIFICA MILLESIMI UNITÀ IMMOBILIARI${NC}"
|
||
|
||
php artisan tinker --execute="
|
||
\$unita_senza_millesimi = App\Models\UnitaImmobiliare::where('millesimi', '<=', 0)->count();
|
||
\$unita_totali = App\Models\UnitaImmobiliare::count();
|
||
|
||
echo '🏠 Unità totali: ' . \$unita_totali . PHP_EOL;
|
||
echo '❌ Unità senza millesimi: ' . \$unita_senza_millesimi . PHP_EOL;
|
||
|
||
if (\$unita_senza_millesimi > 0) {
|
||
echo '⚠️ ATTENZIONE: ' . \$unita_senza_millesimi . ' unità necessitano configurazione millesimi' . PHP_EOL;
|
||
} else if (\$unita_totali > 0) {
|
||
echo '✅ Tutte le unità hanno millesimi configurati' . PHP_EOL;
|
||
}
|
||
" 2>/dev/null
|
||
|
||
# ✅ 9. CONTROLLO PERMISSIONS FILES
|
||
echo ""
|
||
echo -e "${YELLOW}🔐 9. VERIFICA PERMISSIONS${NC}"
|
||
|
||
if [ -w "storage/app" ] && [ -w "storage/logs" ] && [ -w "bootstrap/cache" ]; then
|
||
echo -e "${GREEN} ✅ Permissions storage corrette${NC}"
|
||
else
|
||
echo -e "${RED} ❌ Permissions storage non corrette${NC}"
|
||
echo -e "${YELLOW} 💡 Eseguire: sudo chown -R www-data:www-data storage bootstrap/cache${NC}"
|
||
fi
|
||
|
||
# ✅ 10. VERIFICA COMANDI ARTISAN DISPONIBILI
|
||
echo ""
|
||
echo -e "${YELLOW}⚙️ 10. COMANDI ARTISAN CONTABILITÀ${NC}"
|
||
|
||
COMANDI_CONTABILITA=$(php artisan list | grep -c "contabilita:" || echo "0")
|
||
echo -e "${CYAN} 📊 Comandi disponibili: $COMANDI_CONTABILITA${NC}"
|
||
|
||
if [ $COMANDI_CONTABILITA -gt 0 ]; then
|
||
echo -e "${GREEN} ✅ Comandi contabilità disponibili:${NC}"
|
||
php artisan list | grep "contabilita:" | sed 's/^/ /'
|
||
fi
|
||
|
||
# ✅ 11. RIEPILOGO FINALE E RACCOMANDAZIONI
|
||
echo ""
|
||
echo -e "${BLUE}📋 ===== RIEPILOGO DIAGNOSI =====${NC}"
|
||
echo ""
|
||
|
||
# Calcola punteggio di completezza
|
||
PUNTEGGIO=0
|
||
PUNTEGGIO_MASSIMO=10
|
||
|
||
# Tabelle presenti
|
||
if [ $TABELLE_TROVATE -eq ${#TABELLE_ATTESE[@]} ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 3))
|
||
elif [ $TABELLE_TROVATE -gt $((${#TABELLE_ATTESE[@]} / 2)) ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 2))
|
||
elif [ $TABELLE_TROVATE -gt 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 1))
|
||
fi
|
||
|
||
# Models presenti
|
||
MODELS_PRESENTI=0
|
||
for model in "${MODELS_ATTESI[@]}"; do
|
||
if [ -f "app/Models/$model.php" ]; then
|
||
MODELS_PRESENTI=$((MODELS_PRESENTI + 1))
|
||
fi
|
||
done
|
||
|
||
if [ $MODELS_PRESENTI -eq ${#MODELS_ATTESI[@]} ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 2))
|
||
elif [ $MODELS_PRESENTI -gt 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 1))
|
||
fi
|
||
|
||
# Migrazioni complete
|
||
if [ $MIGRAZIONI_PENDING -eq 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 2))
|
||
elif [ $MIGRAZIONI_PENDING -lt 5 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 1))
|
||
fi
|
||
|
||
# Piano conti
|
||
if [ $MASTRI -gt 0 ] && [ $CONTI -gt 0 ] && [ $SOTTOCONTI -gt 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 2))
|
||
elif [ $MASTRI -gt 0 ] || [ $CONTI -gt 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 1))
|
||
fi
|
||
|
||
# Comandi disponibili
|
||
if [ $COMANDI_CONTABILITA -gt 0 ]; then
|
||
PUNTEGGIO=$((PUNTEGGIO + 1))
|
||
fi
|
||
|
||
# Determina stato sistema
|
||
if [ $PUNTEGGIO -ge 8 ]; then
|
||
STATO_SISTEMA="${GREEN}🎉 SISTEMA COMPLETAMENTE CONFIGURATO${NC}"
|
||
RACCOMANDAZIONE="${GREEN}Il sistema contabile è pronto per l'uso!${NC}"
|
||
elif [ $PUNTEGGIO -ge 5 ]; then
|
||
STATO_SISTEMA="${YELLOW}⚠️ SISTEMA PARZIALMENTE CONFIGURATO${NC}"
|
||
RACCOMANDAZIONE="${YELLOW}Completare la configurazione mancante prima dell'uso.${NC}"
|
||
else
|
||
STATO_SISTEMA="${RED}❌ SISTEMA NON CONFIGURATO${NC}"
|
||
RACCOMANDAZIONE="${RED}Eseguire setup completo prima dell'uso.${NC}"
|
||
fi
|
||
|
||
echo -e "${CYAN}📊 Completezza: $PUNTEGGIO/$PUNTEGGIO_MASSIMO${NC}"
|
||
echo -e "$STATO_SISTEMA"
|
||
echo ""
|
||
echo -e "${PURPLE}💡 RACCOMANDAZIONE:${NC}"
|
||
echo -e "$RACCOMANDAZIONE"
|
||
echo ""
|
||
|
||
# ✅ 12. ISTRUZIONI NEXT STEPS
|
||
echo -e "${BLUE}🚀 PROSSIMI PASSI:${NC}"
|
||
echo ""
|
||
|
||
if [ ${#TABELLE_MANCANTI[@]} -gt 0 ]; then
|
||
echo -e "${YELLOW}1️⃣ Completare setup sistema:${NC}"
|
||
echo -e " ${CYAN}./scripts/setup-contabilita-condominiale.sh${NC}"
|
||
echo ""
|
||
fi
|
||
|
||
if [ $MIGRAZIONI_PENDING -gt 0 ]; then
|
||
echo -e "${YELLOW}2️⃣ Eseguire migrazioni pending:${NC}"
|
||
echo -e " ${CYAN}cd $LARAVEL_PATH && php artisan migrate${NC}"
|
||
echo ""
|
||
fi
|
||
|
||
if [ $MASTRI -eq 0 ]; then
|
||
echo -e "${YELLOW}3️⃣ Popolare piano conti:${NC}"
|
||
echo -e " ${CYAN}php artisan db:seed --class=PianoContiSeeder${NC}"
|
||
echo ""
|
||
fi
|
||
|
||
echo -e "${YELLOW}4️⃣ Configurare gestioni per condomini:${NC}"
|
||
echo -e " ${CYAN}php artisan contabilita:setup {condominio_id} {anno}${NC}"
|
||
echo ""
|
||
|
||
echo -e "${YELLOW}5️⃣ Verificare partita doppia periodicamente:${NC}"
|
||
echo -e " ${CYAN}php artisan contabilita:verifica${NC}"
|
||
echo ""
|
||
|
||
echo -e "${GREEN}📚 DOCUMENTAZIONE:${NC}"
|
||
echo -e " 📖 docs/07-SISTEMA-CONTABILE-CONDOMINIALE.md"
|
||
echo -e " 🔧 docs/08-IMPLEMENTAZIONE-SISTEMA-CONTABILE-PRATICO.md"
|
||
echo ""
|
||
echo -e "${BLUE}🔍 Diagnosi completata!${NC}"
|