the-tip-top-backend/scripts/fix-validated-tickets.js
2025-11-17 23:47:54 +01:00

93 lines
2.7 KiB
JavaScript

import { pool } from '../db.js';
const fixValidatedTickets = async () => {
try {
console.log('\n🔧 CORRECTION DES TICKETS AVEC STATUS INVALIDE\n');
// D'abord, vérifier s'il y a des tickets avec un status invalide
console.log('📊 Recherche des tickets avec status invalide...\n');
const checkResult = await pool.query(`
SELECT id, code, status, validated_at, claimed_at
FROM tickets
WHERE status::text NOT IN ('PENDING', 'CLAIMED', 'REJECTED')
OR status IS NULL
LIMIT 10
`);
if (checkResult.rows.length === 0) {
console.log('✅ Aucun ticket avec status invalide trouvé.');
console.log('✅ La base de données est cohérente.\n');
await pool.end();
process.exit(0);
}
console.log(`⚠️ ${checkResult.rows.length} ticket(s) avec status invalide trouvé(s):\n`);
checkResult.rows.forEach(ticket => {
console.log(` - ${ticket.code}: status = ${ticket.status || 'NULL'}`);
});
console.log('');
// Compter le total
const countResult = await pool.query(`
SELECT COUNT(*) as total
FROM tickets
WHERE status::text NOT IN ('PENDING', 'CLAIMED', 'REJECTED')
OR status IS NULL
`);
const total = parseInt(countResult.rows[0].total);
console.log(`📊 Total de tickets à corriger: ${total}\n`);
if (total === 0) {
console.log('✅ Aucune correction nécessaire.\n');
await pool.end();
process.exit(0);
}
// Corriger les tickets:
// - Si validated_at ou claimed_at existe -> CLAIMED
// - Sinon -> PENDING
console.log('🔄 Correction en cours...\n');
const updateResult = await pool.query(`
UPDATE tickets
SET status = CASE
WHEN validated_at IS NOT NULL OR claimed_at IS NOT NULL THEN 'CLAIMED'::ticket_status
ELSE 'PENDING'::ticket_status
END
WHERE status::text NOT IN ('PENDING', 'CLAIMED', 'REJECTED')
OR status IS NULL
`);
console.log(`${updateResult.rowCount} ticket(s) corrigé(s)!\n`);
// Vérifier le résultat
const finalCheck = await pool.query(`
SELECT status, COUNT(*) as count
FROM tickets
GROUP BY status
ORDER BY status
`);
console.log('📊 Répartition finale des tickets:\n');
finalCheck.rows.forEach(row => {
const statusLabel = row.status || 'NULL';
console.log(` ${statusLabel.padEnd(12)}: ${row.count}`);
});
console.log('');
console.log('🎉 Correction terminée avec succès!\n');
await pool.end();
process.exit(0);
} catch (error) {
console.error('❌ Erreur:', error.message);
console.error('Détails:', error);
await pool.end();
process.exit(1);
}
};
fixValidatedTickets();