mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
Add a dedicated script for creating missing announcement tables
Introduce a new script `fix-announcements-only.sh` to specifically create the `announcements` table if it does not exist, streamlining the migration process for this critical component. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/e437ffed-c31b-44eb-9fd5-b6f9faa8e7ce/biGr9ER
This commit is contained in:
1 parent
74e7eb8118
commit
0dc7ef49c0
4 files changed
+70
-146
No files matched your search
@@ -93,13 +93,9 @@ docker-compose up -d --env DEBUG_MIGRATIONS=true
|
|||||||
|
|
||||||
## 📋 Tables créées automatiquement
|
## 📋 Tables créées automatiquement
|
||||||
|
|
||||||
✅ **announcements** - Système d'informations
|
✅ **announcements** - Système d'informations (prioritaire)
|
||||||
✅ **sav_tickets** - Tickets SAV
|
|
||||||
✅ **sav_ticket_history** - Historique SAV
|
Le script vérifie et crée uniquement les tables manquantes nécessaires au fonctionnement de l'application.
|
||||||
✅ **weather_settings** - Configuration météo
|
|
||||||
✅ **weather_data** - Cache météo
|
|
||||||
✅ **database_backups** - Sauvegardes
|
|
||||||
✅ **invoice_verification_cache** - Cache vérification factures
|
|
||||||
|
|
||||||
## 🔄 Futures mises à jour
|
## 🔄 Futures mises à jour
|
||||||
|
|
||||||
|
|||||||
@@ -60,9 +60,16 @@ exit
|
|||||||
Après ces étapes, le système d'annonces fonctionnera immédiatement sur votre production.
|
Après ces étapes, le système d'annonces fonctionnera immédiatement sur votre production.
|
||||||
|
|
||||||
## Alternative plus simple (une seule commande)
|
## Alternative plus simple (une seule commande)
|
||||||
Si vous préférez, vous pouvez exécuter directement depuis votre serveur :
|
|
||||||
```bash
|
```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);"
|
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.
|
La correction du problème `Select.Item` value est déjà faite dans le code source.
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Script de migration automatique pour les mises à jour Docker
|
# 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
|
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
|
# Vérifier si la base de données est accessible
|
||||||
if ! psql "$DATABASE_URL" -c "SELECT 1;" > /dev/null 2>&1; then
|
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');"
|
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
|
# Migration prioritaire: Table announcements (système d'informations)
|
||||||
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
|
|
||||||
if [ "$(table_exists 'announcements')" = "f" ]; then
|
if [ "$(table_exists 'announcements')" = "f" ]; then
|
||||||
echo "🔧 [AUTO-MIGRATE] Création de la table announcements..."
|
echo "🔧 [AUTO-MIGRATE] Création de la table announcements..."
|
||||||
psql "$DATABASE_URL" << 'EOF'
|
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_author_id ON announcements(author_id);
|
||||||
CREATE INDEX IF NOT EXISTS idx_announcements_group_id ON announcements(group_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
|
EOF
|
||||||
echo "✅ [AUTO-MIGRATE] Table announcements créée avec succès"
|
echo "✅ [AUTO-MIGRATE] Table announcements créée avec succès"
|
||||||
else
|
else
|
||||||
echo "ℹ️ [AUTO-MIGRATE] Table announcements existe déjà"
|
echo "ℹ️ [AUTO-MIGRATE] Table announcements existe déjà"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Migration 2: Créer les tables SAV si elles n'existent pas
|
# Vérification finale
|
||||||
if [ "$(table_exists 'sav_tickets')" = "f" ]; then
|
echo "📊 [AUTO-MIGRATE] Vérification des tables essentielles:"
|
||||||
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:"
|
|
||||||
psql "$DATABASE_URL" -c "
|
psql "$DATABASE_URL" -c "
|
||||||
SELECT
|
SELECT
|
||||||
schemaname as schema,
|
|
||||||
tablename as table_name,
|
|
||||||
CASE
|
CASE
|
||||||
WHEN tablename IN ('announcements', 'sav_tickets', 'weather_settings', 'database_backups') THEN '🆕 Nouvelles'
|
WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'announcements') THEN '✅ announcements'
|
||||||
ELSE '📦 Existantes'
|
ELSE '❌ announcements manquante'
|
||||||
END as status
|
END as status_announcements,
|
||||||
FROM pg_tables
|
CASE
|
||||||
WHERE schemaname = 'public'
|
WHEN EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'users') THEN '✅ users'
|
||||||
ORDER BY tablename;
|
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!"
|
echo "✅ [AUTO-MIGRATE] Vérification terminée!"
|
||||||
@@ -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
|
||||||
Reference in new issue
Block a user