const { Router } = require('express'); const pool = require('../config/db'); const { authenticate } = require('../middleware/auth'); const router = Router(); router.get('/:date', authenticate, async (req, res) => { if (req.user.role !== 'admin') return res.status(403).json({ error: 'Admin seulement' }); try { const { date } = req.params; if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) { return res.status(400).json({ error: 'Format de date invalide (AAAA-MM-JJ)' }); } const [absences] = await pool.query(` SELECT a.membre_id, a.prevenu, a.motif, a.remplace_par_type, a.remplace_par_id, a.remplace_par_guest_id, r.prenom AS remplace_prenom, r.nom AS remplace_nom, rg.prenom AS remplace_guest_prenom, rg.nom AS remplace_guest_nom FROM absences a LEFT JOIN users r ON r.id = a.remplace_par_id AND (a.remplace_par_type = 'member' OR a.remplace_par_type IS NULL) LEFT JOIN invites rg ON rg.id = a.remplace_par_guest_id AND a.remplace_par_type = 'guest' WHERE a.date_absence = ? `, [date]); const [allMembers] = await pool.query( `SELECT id, prenom, nom, societe, activite, photo_url, merged_display_name, fonction, fonction_emoji, telephone, site_web, email FROM users WHERE actif = 1 ORDER BY fonction IS NULL, fonction, prenom` ); const absentWithoutReplacement = new Set( absences.filter(a => !a.remplace_par_id && !a.remplace_par_guest_id).map(a => a.membre_id) ); const members = allMembers.filter(m => !absentWithoutReplacement.has(m.id)); const [guests] = await pool.query( `SELECT i.id, i.prenom, i.nom, i.societe, i.activite, i.photo_url, i.telephone, i.site_web, i.email, i.statut, u.prenom AS invite_par_prenom, u.nom AS invite_par_nom FROM invites i LEFT JOIN users u ON u.id = i.invite_par_id WHERE i.date_club = ? AND (i.statut != 'refusee' OR i.statut IS NULL) ORDER BY i.prenom`, [date] ); const [currentHonorRow] = await pool.query( `SELECT CONCAT(u.prenom, ' ', u.nom) AS currentHonor FROM mises_en_honneur mh JOIN users u ON u.id = mh.membre_id WHERE mh.date = ? LIMIT 1`, [date] ); const currentHonor = currentHonorRow[0]?.currentHonor || null; const [nextHonorRow] = await pool.query( `SELECT CONCAT(u.prenom, ' ', u.nom) AS nextHonor FROM mises_en_honneur mh JOIN users u ON u.id = mh.membre_id WHERE mh.date > ? ORDER BY mh.date ASC LIMIT 1`, [date] ); const nextHonor = nextHonorRow[0]?.nextHonor || null; const [events] = await pool.query( `SELECT nom_evenement AS titre, date AS date_event, horaire AS heure_debut, lieu FROM evenements WHERE date >= ? ORDER BY date ASC LIMIT 5`, [date] ); const [y, m] = date.split('-') const monthStart = `${y}-${m}-01` const lastDay = new Date(y, m, 0).getDate() const monthEnd = `${y}-${m}-${lastDay}` const [recommendations] = await pool.query( `SELECT r.id, r.type, r.nom_prospect, r.ca_realise, r.created_at, u.prenom, u.nom, u.societe FROM recommandations r JOIN users u ON u.id = r.membre_id WHERE r.created_at >= ? AND r.created_at <= ? ORDER BY r.created_at DESC LIMIT 10`, [monthStart, monthEnd] ); const [yr, mo, dy] = date.split('-') const dateKey = `${dy}${mo}${yr}` const [memberSlides] = await pool.query( 'SELECT id, member_id, filename FROM member_slides WHERE date_key = ?', [dateKey] ); const [topInviters] = await pool.query( `SELECT u.id, u.prenom, u.nom, u.photo_url, COUNT(i.id) AS total FROM users u LEFT JOIN invites i ON i.invite_par_id = u.id AND i.created_at >= DATE_SUB(NOW(), INTERVAL 12 MONTH) WHERE u.actif = 1 GROUP BY u.id, u.prenom, u.nom, u.photo_url ORDER BY total DESC LIMIT 3` ); const [topDonnees] = await pool.query( `SELECT u.id, u.prenom, u.nom, u.photo_url, COUNT(r.id) AS total FROM users u LEFT JOIN recommandations r ON r.membre_id = u.id WHERE u.actif = 1 GROUP BY u.id, u.prenom, u.nom, u.photo_url ORDER BY total DESC LIMIT 3` ); const [topConversion] = await pool.query( `SELECT u.id, u.prenom, u.nom, u.photo_url, COUNT(m2.id) AS total FROM users u LEFT JOIN invites i ON i.invite_par_id = u.id AND i.statut = 'acceptee' LEFT JOIN users m2 ON m2.email = i.email WHERE u.actif = 1 GROUP BY u.id, u.prenom, u.nom, u.photo_url HAVING total > 0 ORDER BY total DESC LIMIT 3` ); const [overrides] = await pool.query( 'SELECT slide_key, content, hidden, sort_order FROM presentation_overrides WHERE date_key = ?', [dateKey] ); res.json({ members, guests, absences, currentHonor: currentHonor || null, nextHonor: nextHonor || null, events, recommendations, memberSlides, topInviters, topDonnees, topConversion, overrides }); } catch (err) { console.error(err); res.status(500).json({ error: 'Erreur serveur' }); } }); module.exports = router;