127 lines
4.1 KiB
JavaScript
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();
|