138 lines
4.8 KiB
JavaScript
138 lines
4.8 KiB
JavaScript
import pkg from "pg";
|
|
const { Pool } = pkg;
|
|
|
|
// Configuration de la base de données
|
|
const pool = new Pool({
|
|
host: "51.75.24.29",
|
|
port: 5433,
|
|
user: "postgres",
|
|
password: "postgres",
|
|
database: "thetiptop_dev",
|
|
});
|
|
|
|
async function displayAdminTickets() {
|
|
try {
|
|
console.log('🎫 GESTION DES TICKETS - INTERFACE ADMIN\n');
|
|
console.log('━'.repeat(80));
|
|
|
|
// Récupérer tous les tickets avec leurs détails
|
|
const ticketsResult = await pool.query(`
|
|
SELECT
|
|
t.id,
|
|
t.code,
|
|
t.status,
|
|
t.played_at,
|
|
t.claimed_at,
|
|
t.validated_at,
|
|
t.rejection_reason,
|
|
u.email as user_email,
|
|
u.first_name || ' ' || u.last_name as user_name,
|
|
u.phone as user_phone,
|
|
p.name as prize_name,
|
|
p.type as prize_type,
|
|
p.value as prize_value,
|
|
v.first_name || ' ' || v.last_name as validated_by_name
|
|
FROM tickets t
|
|
JOIN users u ON t.user_id = u.id
|
|
JOIN prizes p ON t.prize_id = p.id
|
|
LEFT JOIN users v ON t.validated_by = v.id
|
|
ORDER BY t.played_at DESC
|
|
`);
|
|
|
|
const tickets = ticketsResult.rows;
|
|
|
|
// Statistiques globales
|
|
const stats = {
|
|
total: tickets.length,
|
|
pending: tickets.filter(t => t.status === 'PENDING').length,
|
|
claimed: tickets.filter(t => t.status === 'CLAIMED').length,
|
|
rejected: tickets.filter(t => t.status === 'REJECTED').length,
|
|
};
|
|
|
|
console.log('📊 STATISTIQUES GLOBALES');
|
|
console.log('━'.repeat(80));
|
|
console.log(` Total de tickets: ${stats.total}`);
|
|
console.log(` ⏳ En attente (PENDING): ${stats.pending}`);
|
|
console.log(` ✅ Validés (CLAIMED): ${stats.claimed}`);
|
|
console.log(` ❌ Rejetés (REJECTED): ${stats.rejected}`);
|
|
console.log('━'.repeat(80));
|
|
|
|
// Afficher les tickets par statut
|
|
console.log('\n📋 TICKETS EN ATTENTE (PENDING)\n');
|
|
const pendingTickets = tickets.filter(t => t.status === 'PENDING');
|
|
|
|
if (pendingTickets.length === 0) {
|
|
console.log(' Aucun ticket en attente\n');
|
|
} else {
|
|
pendingTickets.forEach((ticket, index) => {
|
|
console.log(`${index + 1}. Code: ${ticket.code}`);
|
|
console.log(` Client: ${ticket.user_name} (${ticket.user_email})`);
|
|
console.log(` Téléphone: ${ticket.user_phone || 'N/A'}`);
|
|
console.log(` Prix: ${ticket.prize_name} - ${ticket.prize_value}€`);
|
|
console.log(` Type: ${ticket.prize_type}`);
|
|
console.log(` Joué le: ${new Date(ticket.played_at).toLocaleString('fr-FR')}`);
|
|
console.log(' ' + '─'.repeat(76));
|
|
});
|
|
}
|
|
|
|
console.log('\n✅ TICKETS VALIDÉS (CLAIMED)\n');
|
|
const claimedTickets = tickets.filter(t => t.status === 'CLAIMED');
|
|
|
|
if (claimedTickets.length === 0) {
|
|
console.log(' Aucun ticket validé\n');
|
|
} else {
|
|
claimedTickets.forEach((ticket, index) => {
|
|
console.log(`${index + 1}. Code: ${ticket.code}`);
|
|
console.log(` Client: ${ticket.user_name} (${ticket.user_email})`);
|
|
console.log(` Prix: ${ticket.prize_name} - ${ticket.prize_value}€`);
|
|
console.log(` Validé le: ${new Date(ticket.validated_at).toLocaleString('fr-FR')}`);
|
|
console.log(` Validé par: ${ticket.validated_by_name || 'N/A'}`);
|
|
console.log(' ' + '─'.repeat(76));
|
|
});
|
|
}
|
|
|
|
console.log('\n❌ TICKETS REJETÉS (REJECTED)\n');
|
|
const rejectedTickets = tickets.filter(t => t.status === 'REJECTED');
|
|
|
|
if (rejectedTickets.length === 0) {
|
|
console.log(' Aucun ticket rejeté\n');
|
|
} else {
|
|
rejectedTickets.forEach((ticket, index) => {
|
|
console.log(`${index + 1}. Code: ${ticket.code}`);
|
|
console.log(` Client: ${ticket.user_name} (${ticket.user_email})`);
|
|
console.log(` Prix: ${ticket.prize_name}`);
|
|
console.log(` Raison du rejet: ${ticket.rejection_reason || 'Non spécifiée'}`);
|
|
console.log(` Rejeté le: ${new Date(ticket.validated_at).toLocaleString('fr-FR')}`);
|
|
console.log(` Rejeté par: ${ticket.validated_by_name || 'N/A'}`);
|
|
console.log(' ' + '─'.repeat(76));
|
|
});
|
|
}
|
|
|
|
// Statistiques par type de prix
|
|
console.log('\n🎁 RÉPARTITION PAR TYPE DE PRIX\n');
|
|
const prizeTypes = {};
|
|
tickets.forEach(ticket => {
|
|
if (!prizeTypes[ticket.prize_type]) {
|
|
prizeTypes[ticket.prize_type] = 0;
|
|
}
|
|
prizeTypes[ticket.prize_type]++;
|
|
});
|
|
|
|
Object.entries(prizeTypes).forEach(([type, count]) => {
|
|
const percentage = ((count / tickets.length) * 100).toFixed(1);
|
|
console.log(` ${type}: ${count} tickets (${percentage}%)`);
|
|
});
|
|
|
|
console.log('\n━'.repeat(80));
|
|
console.log('✅ Fin du rapport\n');
|
|
|
|
await pool.end();
|
|
} catch (error) {
|
|
console.error('❌ Erreur:', error.message);
|
|
await pool.end();
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
displayAdminTickets();
|