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