66 lines
2.8 KiB
JavaScript
66 lines
2.8 KiB
JavaScript
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' });
|
|
}
|
|
};
|