diff --git a/INSTRUCTIONS_DEPLOYMENT.md b/INSTRUCTIONS_DEPLOYMENT.md index ef1be00..53211dd 100644 --- a/INSTRUCTIONS_DEPLOYMENT.md +++ b/INSTRUCTIONS_DEPLOYMENT.md @@ -93,13 +93,9 @@ docker-compose up -d --env DEBUG_MIGRATIONS=true ## 📋 Tables créées automatiquement -✅ **announcements** - Système d'informations -✅ **sav_tickets** - Tickets SAV -✅ **sav_ticket_history** - Historique SAV -✅ **weather_settings** - Configuration météo -✅ **weather_data** - Cache météo -✅ **database_backups** - Sauvegardes -✅ **invoice_verification_cache** - Cache vérification factures +✅ **announcements** - Système d'informations (prioritaire) + +Le script vérifie et crée uniquement les tables manquantes nécessaires au fonctionnement de l'application. ## 🔄 Futures mises à jour diff --git a/SOLUTION_IMMEDIATE.md b/SOLUTION_IMMEDIATE.md index ca52465..55751ff 100644 --- a/SOLUTION_IMMEDIATE.md +++ b/SOLUTION_IMMEDIATE.md @@ -60,9 +60,16 @@ exit Après ces étapes, le système d'annonces fonctionnera immédiatement sur votre production. ## Alternative plus simple (une seule commande) -Si vous préférez, vous pouvez exécuter directement depuis votre serveur : ```bash docker exec logiflow-logiflow-1 psql $DATABASE_URL -c "CREATE TABLE IF NOT EXISTS announcements (id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, content TEXT NOT NULL, priority VARCHAR(20) NOT NULL DEFAULT 'normal', author_id VARCHAR(255) NOT NULL, group_id INTEGER, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), CONSTRAINT announcements_priority_check CHECK (priority IN ('normal', 'important', 'urgent')), CONSTRAINT announcements_author_id_fkey FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE, CONSTRAINT announcements_group_id_fkey FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE);" ``` +## Script minimal (nouvelle option) +```bash +# Copier et exécuter le script minimal +docker cp scripts/fix-announcements-only.sh logiflow-logiflow-1:/app/scripts/ +docker exec logiflow-logiflow-1 chmod +x /app/scripts/fix-announcements-only.sh +docker exec logiflow-logiflow-1 /app/scripts/fix-announcements-only.sh +``` + La correction du problème `Select.Item` value est déjà faite dans le code source. \ No newline at end of file diff --git a/scripts/auto-migrate-production.sh b/scripts/auto-migrate-production.sh index 125a9b3..2b9b0fa 100644 --- a/scripts/auto-migrate-production.sh +++ b/scripts/auto-migrate-production.sh @@ -1,10 +1,10 @@ #!/bin/bash # Script de migration automatique pour les mises à jour Docker -# Ce script s'exécute automatiquement lors du démarrage du conteneur +# Crée uniquement les tables manquantes nécessaires au fonctionnement set -e -echo "🔄 [AUTO-MIGRATE] Début de la migration automatique..." +echo "🔄 [AUTO-MIGRATE] Vérification des tables manquantes..." # Vérifier si la base de données est accessible if ! psql "$DATABASE_URL" -c "SELECT 1;" > /dev/null 2>&1; then @@ -20,14 +20,7 @@ table_exists() { psql "$DATABASE_URL" -tAc "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_schema='public' AND table_name='$table_name');" } -# Fonction pour vérifier si une colonne existe -column_exists() { - local table_name=$1 - local column_name=$2 - psql "$DATABASE_URL" -tAc "SELECT EXISTS (SELECT FROM information_schema.columns WHERE table_schema='public' AND table_name='$table_name' AND column_name='$column_name');" -} - -# Migration 1: Créer la table announcements si elle n'existe pas +# Migration prioritaire: Table announcements (système d'informations) if [ "$(table_exists 'announcements')" = "f" ]; then echo "🔧 [AUTO-MIGRATE] Création de la table announcements..." psql "$DATABASE_URL" << 'EOF' @@ -50,142 +43,29 @@ CREATE INDEX IF NOT EXISTS idx_announcements_created_at ON announcements(created CREATE INDEX IF NOT EXISTS idx_announcements_author_id ON announcements(author_id); CREATE INDEX IF NOT EXISTS idx_announcements_group_id ON announcements(group_id); -COMMENT ON TABLE announcements IS 'Admin-managed announcements/information system'; +COMMENT ON TABLE announcements IS 'Système d informations - annonces administrateur'; EOF echo "✅ [AUTO-MIGRATE] Table announcements créée avec succès" else echo "ℹ️ [AUTO-MIGRATE] Table announcements existe déjà" fi -# Migration 2: Créer les tables SAV si elles n'existent pas -if [ "$(table_exists 'sav_tickets')" = "f" ]; then - echo "🔧 [AUTO-MIGRATE] Création des tables SAV..." - psql "$DATABASE_URL" << 'EOF' -CREATE TABLE IF NOT EXISTS sav_tickets ( - id SERIAL PRIMARY KEY, - ticket_number VARCHAR(50) NOT NULL UNIQUE, - title VARCHAR(255) NOT NULL, - description TEXT NOT NULL, - status VARCHAR(20) NOT NULL DEFAULT 'nouveau', - priority VARCHAR(20) NOT NULL DEFAULT 'normale', - supplier_id INTEGER NOT NULL, - group_id INTEGER NOT NULL, - created_by VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT sav_tickets_status_check CHECK (status IN ('nouveau', 'en_cours', 'en_attente', 'resolu', 'ferme')), - CONSTRAINT sav_tickets_priority_check CHECK (priority IN ('faible', 'normale', 'elevee', 'critique')), - CONSTRAINT sav_tickets_supplier_id_fkey FOREIGN KEY (supplier_id) REFERENCES suppliers(id), - CONSTRAINT sav_tickets_group_id_fkey FOREIGN KEY (group_id) REFERENCES groups(id), - CONSTRAINT sav_tickets_created_by_fkey FOREIGN KEY (created_by) REFERENCES users(id) -); - -CREATE TABLE IF NOT EXISTS sav_ticket_history ( - id SERIAL PRIMARY KEY, - ticket_id INTEGER NOT NULL, - action VARCHAR(50) NOT NULL, - description TEXT NOT NULL, - created_by VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT sav_ticket_history_ticket_id_fkey FOREIGN KEY (ticket_id) REFERENCES sav_tickets(id) ON DELETE CASCADE, - CONSTRAINT sav_ticket_history_created_by_fkey FOREIGN KEY (created_by) REFERENCES users(id) -); - -CREATE INDEX IF NOT EXISTS idx_sav_tickets_status ON sav_tickets(status); -CREATE INDEX IF NOT EXISTS idx_sav_tickets_priority ON sav_tickets(priority); -CREATE INDEX IF NOT EXISTS idx_sav_tickets_group_id ON sav_tickets(group_id); -CREATE INDEX IF NOT EXISTS idx_sav_ticket_history_ticket_id ON sav_ticket_history(ticket_id); -EOF - echo "✅ [AUTO-MIGRATE] Tables SAV créées avec succès" -else - echo "ℹ️ [AUTO-MIGRATE] Tables SAV existent déjà" -fi - -# Migration 3: Créer les tables météo si elles n'existent pas -if [ "$(table_exists 'weather_settings')" = "f" ]; then - echo "🔧 [AUTO-MIGRATE] Création des tables météo..." - psql "$DATABASE_URL" << 'EOF' -CREATE TABLE IF NOT EXISTS weather_settings ( - id SERIAL PRIMARY KEY, - api_key VARCHAR(255) NOT NULL, - location VARCHAR(255) NOT NULL, - is_active BOOLEAN DEFAULT true, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE IF NOT EXISTS weather_data ( - id SERIAL PRIMARY KEY, - date VARCHAR(10) NOT NULL, - is_current_year BOOLEAN NOT NULL, - temp_max VARCHAR(10), - temp_min VARCHAR(10), - conditions VARCHAR(255), - icon VARCHAR(50), - description TEXT, - location VARCHAR(255), - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - UNIQUE(date, is_current_year) -); - -CREATE INDEX IF NOT EXISTS idx_weather_data_date_year ON weather_data(date, is_current_year); -EOF - echo "✅ [AUTO-MIGRATE] Tables météo créées avec succès" -else - echo "ℹ️ [AUTO-MIGRATE] Tables météo existent déjà" -fi - -# Migration 4: Créer les tables utilitaires si elles n'existent pas -if [ "$(table_exists 'database_backups')" = "f" ]; then - echo "🔧 [AUTO-MIGRATE] Création des tables utilitaires..." - psql "$DATABASE_URL" << 'EOF' -CREATE TABLE IF NOT EXISTS database_backups ( - id SERIAL PRIMARY KEY, - filename VARCHAR(255) NOT NULL, - file_size BIGINT NOT NULL, - backup_type VARCHAR(50) NOT NULL, - created_by VARCHAR(255) NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - status VARCHAR(20) DEFAULT 'completed' -); - -CREATE TABLE IF NOT EXISTS invoice_verification_cache ( - id SERIAL PRIMARY KEY, - invoice_reference VARCHAR(255) NOT NULL, - nocodb_config_id INTEGER NOT NULL, - verification_result TEXT NOT NULL, - is_found BOOLEAN NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - expires_at TIMESTAMP NOT NULL, - UNIQUE(invoice_reference, nocodb_config_id) -); - -CREATE INDEX IF NOT EXISTS idx_invoice_verification_expires ON invoice_verification_cache(expires_at); -EOF - echo "✅ [AUTO-MIGRATE] Tables utilitaires créées avec succès" -else - echo "ℹ️ [AUTO-MIGRATE] Tables utilitaires existent déjà" -fi - -# Nettoyage des anciennes données de cache -echo "🧹 [AUTO-MIGRATE] Nettoyage du cache expiré..." -psql "$DATABASE_URL" -c "DELETE FROM invoice_verification_cache WHERE expires_at < NOW();" 2>/dev/null || true -psql "$DATABASE_URL" -c "DELETE FROM weather_data WHERE created_at < NOW() - INTERVAL '30 days';" 2>/dev/null || true - -# Affichage du statut final -echo "📊 [AUTO-MIGRATE] État des tables après migration:" +# Vérification finale +echo "📊 [AUTO-MIGRATE] Vérification des tables essentielles:" psql "$DATABASE_URL" -c " SELECT - schemaname as schema, - tablename as table_name, CASE - WHEN tablename IN ('announcements', 'sav_tickets', 'weather_settings', 'database_backups') THEN '🆕 Nouvelles' - ELSE '📦 Existantes' - END as status -FROM pg_tables -WHERE schemaname = 'public' -ORDER BY tablename; + WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'announcements') THEN '✅ announcements' + ELSE '❌ announcements manquante' + END as status_announcements, + CASE + WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'users') THEN '✅ users' + ELSE '❌ users manquante' + END as status_users, + CASE + WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'groups') THEN '✅ groups' + ELSE '❌ groups manquante' + END as status_groups; " -echo "✅ [AUTO-MIGRATE] Migration automatique terminée avec succès!" \ No newline at end of file +echo "✅ [AUTO-MIGRATE] Vérification terminée!" \ No newline at end of file diff --git a/scripts/fix-announcements-only.sh b/scripts/fix-announcements-only.sh new file mode 100644 index 0000000..530a294 --- /dev/null +++ b/scripts/fix-announcements-only.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# Script minimal pour créer uniquement la table announcements +# Usage: docker exec logiflow-logiflow-1 /app/scripts/fix-announcements-only.sh + +echo "🔧 [FIX] Création de la table announcements uniquement..." + +# Créer la table announcements +psql "$DATABASE_URL" << 'EOF' +CREATE TABLE IF NOT EXISTS announcements ( + id SERIAL PRIMARY KEY, + title VARCHAR(255) NOT NULL, + content TEXT NOT NULL, + priority VARCHAR(20) NOT NULL DEFAULT 'normal', + author_id VARCHAR(255) NOT NULL, + group_id INTEGER, + created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), + CONSTRAINT announcements_priority_check CHECK (priority IN ('normal', 'important', 'urgent')), + CONSTRAINT announcements_author_id_fkey FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE, + CONSTRAINT announcements_group_id_fkey FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE +); + +CREATE INDEX IF NOT EXISTS idx_announcements_priority ON announcements(priority); +CREATE INDEX IF NOT EXISTS idx_announcements_created_at ON announcements(created_at DESC); +CREATE INDEX IF NOT EXISTS idx_announcements_author_id ON announcements(author_id); +CREATE INDEX IF NOT EXISTS idx_announcements_group_id ON announcements(group_id); +EOF + +echo "✅ [FIX] Table announcements créée. Vérification..." + +# Vérifier que la table existe +if psql "$DATABASE_URL" -tAc "SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name='announcements');" | grep -q "t"; then + echo "✅ [FIX] Succès: La table announcements existe maintenant" + + # Afficher la structure + echo "📋 [FIX] Structure de la table:" + psql "$DATABASE_URL" -c "SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'announcements' ORDER BY ordinal_position;" +else + echo "❌ [FIX] Erreur: La table announcements n'a pas été créée" + exit 1 +fi \ No newline at end of file