the-tip-top-backend/scripts/check-eligible-participants.js
2025-11-17 23:47:54 +01:00

127 lines
4.1 KiB
JavaScript

/**
* 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();