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

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