Checkpoint: Corrections multiples :
- Renommage questionnaire.nom → questionnaire.titre dans QuestionnaireReponse.tsx, AdminQuestionnaireEdit.tsx, questionnaireScheduler.ts, questionnaireExport.ts - Correction des requêtes SQL dans questionnaireDb.ts (suppression de la condition complete inexistante) - Ajout des colonnes valeurMin et valeurMax dans la table questions - Renommage de la colonne nom en titre dans la table questionnaires
This commit is contained in:
281
fix-all-database-schema-FINAL.sh
Executable file
281
fix-all-database-schema-FINAL.sh
Executable file
@@ -0,0 +1,281 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script de correction COMPLÈTE et DÉFINITIVE du schéma de base de données
|
||||
# Formation Manager Itinova - Janvier 2026
|
||||
# Ce script corrige TOUTES les colonnes manquantes identifiées
|
||||
|
||||
DB_USER="app_user"
|
||||
DB_PASS="Itinova69!"
|
||||
DB_NAME="formation_manager"
|
||||
|
||||
echo "=========================================="
|
||||
echo "CORRECTION DÉFINITIVE DU SCHÉMA"
|
||||
echo "Formation Manager Itinova"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "⚠️ Ce script va MODIFIER la base de données"
|
||||
echo "Appuyez sur Entrée pour continuer ou Ctrl+C pour annuler..."
|
||||
read
|
||||
|
||||
echo ""
|
||||
echo "=== DÉBUT DES CORRECTIONS ==="
|
||||
echo ""
|
||||
|
||||
# Fonction pour exécuter une requête SQL avec gestion d'erreur
|
||||
execute_sql() {
|
||||
local description="$1"
|
||||
local query="$2"
|
||||
echo "→ $description"
|
||||
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "$query" 2>&1 | grep -v "Warning: Using a password")
|
||||
if [ -z "$result" ]; then
|
||||
echo " ✓ OK"
|
||||
return 0
|
||||
else
|
||||
if echo "$result" | grep -q "Duplicate column name"; then
|
||||
echo " ⚠ Colonne existe déjà"
|
||||
return 0
|
||||
elif echo "$result" | grep -q "Can't DROP"; then
|
||||
echo " ⚠ Colonne n'existe pas"
|
||||
return 0
|
||||
else
|
||||
echo " ✗ Erreur: $result"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
echo "=========================================="
|
||||
echo "1. CORRECTION DE LA TABLE formateurs"
|
||||
echo "=========================================="
|
||||
|
||||
# CRITIQUE: La colonne email manque dans formateurs
|
||||
execute_sql "Ajout de la colonne email" \
|
||||
"ALTER TABLE formateurs ADD COLUMN email VARCHAR(320) AFTER nom;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "2. CORRECTION DE LA TABLE rappels"
|
||||
echo "=========================================="
|
||||
|
||||
# CRITIQUE: La colonne timing manque dans rappels
|
||||
execute_sql "Ajout de la colonne timing" \
|
||||
"ALTER TABLE rappels ADD COLUMN timing ENUM('pre_formation', 'post_formation') NOT NULL DEFAULT 'pre_formation' AFTER heureEnvoi;"
|
||||
|
||||
execute_sql "Ajout de la colonne nomFichier" \
|
||||
"ALTER TABLE rappels ADD COLUMN nomFichier VARCHAR(255) AFTER timing;"
|
||||
|
||||
execute_sql "Ajout de la colonne urlFichier" \
|
||||
"ALTER TABLE rappels ADD COLUMN urlFichier VARCHAR(500) AFTER nomFichier;"
|
||||
|
||||
execute_sql "Ajout de la colonne s3Key" \
|
||||
"ALTER TABLE rappels ADD COLUMN s3Key VARCHAR(500) AFTER urlFichier;"
|
||||
|
||||
execute_sql "Ajout de la colonne typeFichier" \
|
||||
"ALTER TABLE rappels ADD COLUMN typeFichier VARCHAR(100) AFTER s3Key;"
|
||||
|
||||
execute_sql "Ajout de la colonne tailleFichier" \
|
||||
"ALTER TABLE rappels ADD COLUMN tailleFichier INT AFTER typeFichier;"
|
||||
|
||||
execute_sql "Ajout de la colonne derniereExecution" \
|
||||
"ALTER TABLE rappels ADD COLUMN derniereExecution DATETIME AFTER actif;"
|
||||
|
||||
execute_sql "Modification de l'ENUM templateType" \
|
||||
"ALTER TABLE rappels MODIFY COLUMN templateType ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "3. CORRECTION DE LA TABLE sequences"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Modification de l'ENUM statut" \
|
||||
"ALTER TABLE sequences MODIFY COLUMN statut ENUM('ouverte','bloquee','terminee','fermee','annulee') NOT NULL DEFAULT 'ouverte';"
|
||||
|
||||
execute_sql "Modification de l'ENUM publicCible" \
|
||||
"ALTER TABLE sequences MODIFY COLUMN publicCible ENUM('directeur','chef_service','autre','tous') NOT NULL DEFAULT 'tous';"
|
||||
|
||||
execute_sql "Modification de la taille de lieu" \
|
||||
"ALTER TABLE sequences MODIFY COLUMN lieu VARCHAR(255) NOT NULL;"
|
||||
|
||||
execute_sql "Modification de la taille de qrCodeToken" \
|
||||
"ALTER TABLE sequences MODIFY COLUMN qrCodeToken VARCHAR(100) UNIQUE;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "4. CORRECTION DE LA TABLE formations"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Ajout de la colonne modeAttestation" \
|
||||
"ALTER TABLE formations ADD COLUMN modeAttestation ENUM('auto', 'manuel') NOT NULL DEFAULT 'auto' AFTER actif;"
|
||||
|
||||
execute_sql "Ajout de la colonne modeEnvoi" \
|
||||
"ALTER TABLE formations ADD COLUMN modeEnvoi ENUM('auto', 'manuel') NOT NULL DEFAULT 'manuel' AFTER modeAttestation;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "5. CORRECTION DE LA TABLE users"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Ajout de la colonne username" \
|
||||
"ALTER TABLE users ADD COLUMN username VARCHAR(100) UNIQUE AFTER email;"
|
||||
|
||||
execute_sql "Ajout de la colonne password" \
|
||||
"ALTER TABLE users ADD COLUMN password VARCHAR(255) AFTER username;"
|
||||
|
||||
execute_sql "Ajout de la colonne isActive" \
|
||||
"ALTER TABLE users ADD COLUMN isActive BOOLEAN NOT NULL DEFAULT TRUE AFTER role;"
|
||||
|
||||
execute_sql "Ajout de la colonne formateurId" \
|
||||
"ALTER TABLE users ADD COLUMN formateurId INT AFTER isActive;"
|
||||
|
||||
execute_sql "Modification de l'ENUM role" \
|
||||
"ALTER TABLE users MODIFY COLUMN role ENUM('user', 'admin', 'formateur') NOT NULL DEFAULT 'user';"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "6. CORRECTION DE LA TABLE apprenants"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Modification de codeEtablissement" \
|
||||
"ALTER TABLE apprenants MODIFY COLUMN codeEtablissement VARCHAR(50) NULL;"
|
||||
|
||||
execute_sql "Modification de fonction" \
|
||||
"ALTER TABLE apprenants MODIFY COLUMN fonction VARCHAR(100) NULL;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "7. CORRECTION DE LA TABLE emailConfig"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Modification de l'ENUM provider" \
|
||||
"ALTER TABLE emailConfig MODIFY COLUMN provider ENUM('resend', 'smtp', 'simulation') NOT NULL DEFAULT 'simulation';"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "8. CORRECTION DE LA TABLE emailTemplates"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Modification de l'ENUM type" \
|
||||
"ALTER TABLE emailTemplates MODIFY COLUMN type ENUM('inscription', 'teaser', 'rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL UNIQUE;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "9. CORRECTION DE LA TABLE logsRappels"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Ajout de la colonne email" \
|
||||
"ALTER TABLE logsRappels ADD COLUMN email VARCHAR(320) NOT NULL AFTER apprenantId;"
|
||||
|
||||
execute_sql "Modification de l'ENUM type" \
|
||||
"ALTER TABLE logsRappels MODIFY COLUMN type ENUM('rappel', 'rappelJ1', 'rappel3', 'rappel4', 'rappel5', 'rappel6') NOT NULL;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "10. CORRECTION DE LA TABLE questionnaires"
|
||||
echo "=========================================="
|
||||
|
||||
# Vérifier si la colonne nom existe et la renommer en titre
|
||||
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='questionnaires' AND COLUMN_NAME='nom';" 2>/dev/null)
|
||||
|
||||
if [ "$result" = "1" ]; then
|
||||
execute_sql "Renommage de nom en titre" \
|
||||
"ALTER TABLE questionnaires CHANGE COLUMN nom titre VARCHAR(255) NOT NULL;"
|
||||
else
|
||||
echo "→ La colonne titre existe déjà"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "11. CORRECTION DE LA TABLE reponsesQuestionnaires"
|
||||
echo "=========================================="
|
||||
|
||||
# Vérifier si la colonne complete existe et la supprimer
|
||||
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='reponsesQuestionnaires' AND COLUMN_NAME='complete';" 2>/dev/null)
|
||||
|
||||
if [ "$result" = "1" ]; then
|
||||
execute_sql "Suppression de la colonne complete" \
|
||||
"ALTER TABLE reponsesQuestionnaires DROP COLUMN complete;"
|
||||
else
|
||||
echo "→ La colonne complete n'existe pas (OK)"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "12. CORRECTION DE LA TABLE attestations"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Ajout de la colonne documentUrl" \
|
||||
"ALTER TABLE attestations ADD COLUMN documentUrl VARCHAR(500) AFTER s3Key;"
|
||||
|
||||
execute_sql "Ajout de la colonne documentS3Key" \
|
||||
"ALTER TABLE attestations ADD COLUMN documentS3Key VARCHAR(500) AFTER documentUrl;"
|
||||
|
||||
execute_sql "Ajout de la colonne uploadedBy" \
|
||||
"ALTER TABLE attestations ADD COLUMN uploadedBy INT AFTER documentS3Key;"
|
||||
|
||||
execute_sql "Ajout de la colonne uploadedAt" \
|
||||
"ALTER TABLE attestations ADD COLUMN uploadedAt TIMESTAMP AFTER uploadedBy;"
|
||||
|
||||
execute_sql "Ajout de la colonne emailEnvoye" \
|
||||
"ALTER TABLE attestations ADD COLUMN emailEnvoye BOOLEAN NOT NULL DEFAULT FALSE AFTER uploadedAt;"
|
||||
|
||||
execute_sql "Ajout de la colonne dateEnvoiEmail" \
|
||||
"ALTER TABLE attestations ADD COLUMN dateEnvoiEmail TIMESTAMP AFTER emailEnvoye;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "13. CORRECTION DE LA TABLE parametres"
|
||||
echo "=========================================="
|
||||
|
||||
# Supprimer envoiAutomatiqueAttestations si elle existe
|
||||
result=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='$DB_NAME' AND TABLE_NAME='parametres' AND COLUMN_NAME='envoiAutomatiqueAttestations';" 2>/dev/null)
|
||||
|
||||
if [ "$result" = "1" ]; then
|
||||
execute_sql "Suppression de la colonne envoiAutomatiqueAttestations" \
|
||||
"ALTER TABLE parametres DROP COLUMN envoiAutomatiqueAttestations;"
|
||||
else
|
||||
echo "→ La colonne envoiAutomatiqueAttestations n'existe pas (OK)"
|
||||
fi
|
||||
|
||||
execute_sql "Ajout de la colonne urlPublique" \
|
||||
"ALTER TABLE parametres ADD COLUMN urlPublique VARCHAR(500) NOT NULL DEFAULT 'https://formations.itinova.org' AFTER id;"
|
||||
|
||||
execute_sql "Ajout de la colonne delaiExpirationQR" \
|
||||
"ALTER TABLE parametres ADD COLUMN delaiExpirationQR INT NOT NULL DEFAULT 30 AFTER urlPublique;"
|
||||
|
||||
execute_sql "Ajout de la colonne dureeValiditeToken" \
|
||||
"ALTER TABLE parametres ADD COLUMN dureeValiditeToken INT NOT NULL DEFAULT 24 AFTER delaiExpirationQR;"
|
||||
|
||||
execute_sql "Ajout de la colonne notificationsActives" \
|
||||
"ALTER TABLE parametres ADD COLUMN notificationsActives BOOLEAN NOT NULL DEFAULT TRUE AFTER dureeValiditeToken;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "14. CORRECTION DES AUTRES TABLES"
|
||||
echo "=========================================="
|
||||
|
||||
execute_sql "Ajout de userId dans passwordResetTokens" \
|
||||
"ALTER TABLE passwordResetTokens ADD COLUMN userId INT NOT NULL AFTER id;"
|
||||
|
||||
execute_sql "Ajout de ordre dans datesFormation" \
|
||||
"ALTER TABLE datesFormation ADD COLUMN ordre INT NOT NULL AFTER sequenceId;"
|
||||
|
||||
execute_sql "Ajout de validateurId dans presences" \
|
||||
"ALTER TABLE presences ADD COLUMN validateurId INT AFTER modeValidation;"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "✅ TOUTES LES CORRECTIONS APPLIQUÉES"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Compter les tables
|
||||
total_tables=$(mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -se "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='$DB_NAME';" 2>/dev/null)
|
||||
|
||||
echo "✓ Nombre total de tables: $total_tables"
|
||||
echo ""
|
||||
echo "=== PROCHAINES ÉTAPES ==="
|
||||
echo "1. Redémarrer l'application: pm2 restart formation-manager"
|
||||
echo "2. Vérifier les logs: pm2 logs formation-manager --lines 30"
|
||||
echo "3. Tester l'application dans le navigateur"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
Reference in New Issue
Block a user