Files
LogiFlow/debug-production-suppliers-schema.js
T
michaelschal c8a8b138e7 Add missing email column to suppliers to fix order and delivery errors
Adds the 'email' column to the 'suppliers' table via SQL script to resolve 500 errors on `/api/orders` and `/api/deliveries` caused by missing schema information required by Drizzle ORM.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: b163d4c0-de5e-4f4e-a9c0-aed4c7049718
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/b163d4c0-de5e-4f4e-a9c0-aed4c7049718/FyjZ5oh
2025-08-12 10:22:08 +00:00

101 lines
3.3 KiB
JavaScript

#!/usr/bin/env node
/**
* Script de debug pour vérifier le schéma de la table suppliers en production
* et corriger les colonnes manquantes si nécessaire
*/
import pg from 'pg';
import fs from 'fs';
const { Pool } = pg;
// Configuration de la base de données de production
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
});
async function checkSuppliersSchema() {
console.log('🔍 Vérification du schéma de la table suppliers en production...');
try {
// Vérifier les colonnes existantes
const result = await pool.query(`
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_name = 'suppliers'
AND table_schema = 'public'
ORDER BY ordinal_position
`);
console.log('\n📊 Colonnes actuelles dans la table suppliers:');
console.log('='.repeat(60));
const columns = result.rows;
columns.forEach((col, index) => {
const nullable = col.is_nullable === 'YES' ? 'NULL' : 'NOT NULL';
const defaultVal = col.column_default ? ` DEFAULT ${col.column_default}` : '';
console.log(`${index + 1:2}. ${col.column_name.padEnd(25)} : ${col.data_type} ${nullable}${defaultVal}`);
});
// Vérifier les colonnes requises
const requiredColumns = ['email', 'automatic_reconciliation'];
const existingColumns = columns.map(col => col.column_name);
const missingColumns = requiredColumns.filter(col => !existingColumns.includes(col));
if (missingColumns.length > 0) {
console.log(`\n❌ Colonnes manquantes: ${missingColumns.join(', ')}`);
console.log('\n📝 Script SQL généré pour corriger le problème:');
console.log('='.repeat(60));
let sqlScript = 'BEGIN;\n\n';
if (missingColumns.includes('email')) {
sqlScript += 'ALTER TABLE suppliers ADD COLUMN email VARCHAR;\n';
sqlScript += 'COMMENT ON COLUMN suppliers.email IS \'Email du fournisseur\';\n\n';
}
if (missingColumns.includes('automatic_reconciliation')) {
sqlScript += 'ALTER TABLE suppliers ADD COLUMN automatic_reconciliation BOOLEAN DEFAULT false;\n';
sqlScript += 'COMMENT ON COLUMN suppliers.automatic_reconciliation IS \'Mode rapprochement automatique BL/Factures\';\n\n';
}
sqlScript += 'COMMIT;';
console.log(sqlScript);
// Sauvegarder le script
fs.writeFileSync('fix-suppliers-missing-columns.sql', sqlScript);
console.log('\n💾 Script sauvegardé dans: fix-suppliers-missing-columns.sql');
} else {
console.log('\n✅ Toutes les colonnes requises sont présentes');
}
// Compter les enregistrements
const countResult = await pool.query('SELECT COUNT(*) as total FROM suppliers');
console.log(`\n📈 Nombre de fournisseurs: ${countResult.rows[0].total}`);
} catch (error) {
console.error('❌ Erreur lors de la vérification:', error.message);
process.exit(1);
} finally {
await pool.end();
}
}
// Exécuter le script
checkSuppliersSchema()
.then(() => {
console.log('\n✅ Vérification terminée');
process.exit(0);
})
.catch((error) => {
console.error('❌ Erreur:', error);
process.exit(1);
});