const pool = require('../config/db'); function escapeCsv(val) { if (val == null) return ''; const s = String(val); return s.includes(',') || s.includes('"') || s.includes('\n') || s.includes('\r') ? `"${s.replace(/"/g, '""')}"` : s; } function rowsToCsv(headers, rows) { const lines = [headers.map(escapeCsv).join(',')]; for (const row of rows) { lines.push(headers.map((h) => escapeCsv(row[h])).join(',')); } return '\uFEFF' + lines.join('\r\n'); } exports.exportCsv = async (req, res) => { try { const [members] = await pool.query( 'SELECT id, prenom, nom, email, telephone, societe, fonction, activite, site_web, role, actif, date_echeance, created_at FROM users ORDER BY nom, prenom' ); const [guests] = await pool.query( `SELECT i.id, i.prenom, i.nom, i.email, i.telephone, i.societe, i.activite, i.site_web, i.statut, i.visit_number, i.invite_par_id, u.prenom AS invite_par_prenom, u.nom AS invite_par_nom, i.date_club, i.commentaires, i.created_at FROM invites i LEFT JOIN users u ON u.id = i.invite_par_id ORDER BY i.date_club DESC, i.nom, i.prenom` ); const [recs] = await pool.query( `SELECT r.id, r.date, r.nom_prospect, r.type, r.transformee, r.ca_realise, m.prenom AS membre_prenom, m.nom AS membre_nom, m.societe AS membre_societe, d.prenom AS dest_prenom, d.nom AS dest_nom, d.societe AS dest_societe FROM recommandations r LEFT JOIN users m ON m.id = r.membre_id LEFT JOIN users d ON d.id = r.destinataire_id ORDER BY r.date DESC` ); const membresCsv = rowsToCsv( ['id', 'prenom', 'nom', 'email', 'telephone', 'societe', 'fonction', 'activite', 'site_web', 'role', 'actif', 'date_echeance', 'date_inscription'], members ); const invitesCsv = rowsToCsv( ['id', 'prenom', 'nom', 'email', 'telephone', 'societe', 'activite', 'site_web', 'statut', 'visite_numero', 'invite_par_id', 'invite_par_prenom', 'invite_par_nom', 'date_club', 'commentaires', 'date_creation'], guests ); const recosCsv = rowsToCsv( ['id', 'date', 'nom_prospect', 'type', 'transformee', 'ca_realise', 'membre_prenom', 'membre_nom', 'membre_societe', 'destinataire_prenom', 'destinataire_nom', 'destinataire_societe'], recs ); const date = new Date().toISOString().slice(0, 10); res.setHeader('Content-Type', 'text/csv; charset=utf-8'); res.setHeader('Content-Disposition', `attachment; filename="dyna-biz-export-${date}.csv"`); res.write('=== MEMBRES ===\r\n' + membresCsv + '\r\n\r\n'); res.write('=== INVITES ===\r\n' + invitesCsv + '\r\n\r\n'); res.write('=== RECOMMANDATIONS ===\r\n' + recosCsv); res.end(); } catch (err) { console.error(err); res.status(500).json({ error: 'Erreur export' }); } };