netgescon-master/scripts/diagnosi-contabilita.sh
Michele Windows e68ee85a18 🚀 CHECKPOINT STABILE - Sistema Contabile Avanzato
📋 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
2025-07-26 15:11:19 +02:00

348 lines
12 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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}"