/** * Vérifier les participants éligibles pour le tirage au sort */ import 'dotenv/config'; import { pool } from '../db.js'; async function checkEligibleParticipants() { console.log('🔍 Vérification des participants éligibles...\n'); try { // Total de clients const totalClients = await pool.query(` SELECT COUNT(*) as count FROM users WHERE role = 'CLIENT' `); console.log(`👥 Total de clients: ${totalClients.rows[0].count}`); // Clients avec email vérifié const verifiedClients = await pool.query(` SELECT COUNT(*) as count FROM users WHERE role = 'CLIENT' AND is_verified = TRUE `); console.log(`✅ Clients avec email vérifié: ${verifiedClients.rows[0].count}`); // Total de tickets const totalTickets = await pool.query(` SELECT COUNT(*) as count FROM tickets `); console.log(`🎫 Total de tickets générés: ${totalTickets.rows[0].count}`); // Tickets joués (avec played_at) const playedTickets = await pool.query(` SELECT COUNT(*) as count FROM tickets WHERE played_at IS NOT NULL `); console.log(`🎮 Tickets joués: ${playedTickets.rows[0].count}`); // Clients ayant joué au moins 1 ticket const playersWithTickets = await pool.query(` SELECT COUNT(DISTINCT user_id) as count FROM tickets WHERE user_id IS NOT NULL AND played_at IS NOT NULL `); console.log(`👤 Clients ayant joué au moins 1 ticket: ${playersWithTickets.rows[0].count}`); // Participants éligibles (minTickets=1, verified=true) const eligibleParticipants = await pool.query(` SELECT u.id, u.email, u.first_name, u.last_name, u.is_verified, COUNT(DISTINCT t.id) as tickets_played FROM users u LEFT JOIN tickets t ON u.id = t.user_id AND t.played_at IS NOT NULL WHERE u.role = 'CLIENT' AND u.is_verified = TRUE GROUP BY u.id, u.email, u.first_name, u.last_name, u.is_verified HAVING COUNT(DISTINCT t.id) >= 1 ORDER BY tickets_played DESC `); console.log(`\n🎯 Participants éligibles (email vérifié + min 1 ticket joué): ${eligibleParticipants.rows.length}\n`); if (eligibleParticipants.rows.length > 0) { console.log('Liste des participants éligibles:\n'); eligibleParticipants.rows.slice(0, 10).forEach((p, i) => { console.log(`${i + 1}. ${p.first_name} ${p.last_name} (${p.email})`); console.log(` Tickets joués: ${p.tickets_played} | Vérifié: ${p.is_verified ? '✅' : '❌'}\n`); }); if (eligibleParticipants.rows.length > 10) { console.log(`... et ${eligibleParticipants.rows.length - 10} autres participants\n`); } } else { console.log('⚠️ AUCUN participant éligible trouvé!\n'); console.log('Raisons possibles:'); console.log('1. Aucun client n\'a d\'email vérifié'); console.log('2. Aucun ticket n\'a été joué (played_at IS NULL)'); console.log('3. Les tickets joués ne sont pas associés à des utilisateurs (user_id IS NULL)\n'); // Vérifier les tickets joués sans user_id const playedWithoutUser = await pool.query(` SELECT COUNT(*) as count FROM tickets WHERE played_at IS NOT NULL AND user_id IS NULL `); console.log(`🔍 Tickets joués sans utilisateur: ${playedWithoutUser.rows[0].count}`); } // Participants éligibles SANS filtre email vérifié (pour comparaison) const eligibleWithoutVerification = await pool.query(` SELECT COUNT(*) as count FROM ( SELECT u.id, COUNT(DISTINCT t.id) as tickets_played FROM users u LEFT JOIN tickets t ON u.id = t.user_id AND t.played_at IS NOT NULL WHERE u.role = 'CLIENT' GROUP BY u.id HAVING COUNT(DISTINCT t.id) >= 1 ) subquery `); console.log(`\n📊 Participants éligibles SANS filtre "email vérifié": ${eligibleWithoutVerification.rows[0].count}`); } catch (error) { console.error('❌ Erreur:', error.message); console.error(error); } finally { await pool.end(); } } checkEligibleParticipants();