const { pool } = require('../config/databases'); const { validationResult } = require('express-validator'); // Lister les clients avec recherche et stats exports.index = async (req, res) => { const query = req.query.query || ''; try { let [clients] = query ? await pool.query( `SELECT * FROM clients WHERE name LIKE ? OR email LIKE ?`, [`%${query}%`, `%${query}%`] ) : await db.query(`SELECT * FROM clients`); const [totalClientsResult] = await pool.query(`SELECT COUNT(*) as total FROM clients`); const [loyalResult] = await pool.query(`SELECT COUNT(*) as loyal FROM clients WHERE membership IN ('Or', 'Argent')`); const [bronzeResult] = await pool.query(`SELECT COUNT(*) as bronze FROM clients WHERE membership = 'Bronze'`); const [argentResult] = await pool.query(`SELECT COUNT(*) as argent FROM clients WHERE membership = 'Argent'`); const [orResult] = await pool.query(`SELECT COUNT(*) as gold FROM clients WHERE membership = 'Or'`); const avgSatisfaction = '4.6/5'; // À calculer depuis table avis const avgCart = '€45'; // À calculer depuis commandes const fidelityLevels = { Bronze: { count: bronzeResult[0].bronze, benefits: ['5% de réduction', 'Offre anniversaire'] }, Argent: { count: argentResult[0].argent, benefits: ['10% de réduction', 'Réservation prioritaire', 'Menu dégustation offert'] }, Or: { count: orResult[0].gold, benefits: ['15% de réduction', 'Service VIP', 'Événements exclusifs', 'Livraison gratuite'] } }; const marketingCampaigns = [ { name: 'Newsletter hebdomadaire', description: 'Envoyée tous les vendredis', subscribers: 1247, type: 'newsletter' }, { name: 'Offre spéciale Saint-Valentin', description: 'SMS ciblé', target: 342, type: 'sms' } ]; res.json({ searchQuery: query, clients, totalClients: totalClientsResult[0].total, loyalClients: loyalResult[0].loyal, avgSatisfaction, avgCart, fidelityLevels, marketingCampaigns }); } catch (error) { res.status(500).json({ error: 'Erreur serveur', details: error.message }); } }; // Ajouter un nouveau client avec validation exports.save = async (req, res) => { const errors = validationResult(req); if (!errors.isEmpty()) return res.status(400).json({ errors: errors.array() }); const { name, email, phone, visits, spent, rating, preferences } = req.body; let membership = ''; if (visits >= 20 && spent >= 1000000) membership = 'Or'; else if (visits >= 10 && spent >= 500000) membership = 'Argent'; else if (visits >= 10 && spent >= 300000) membership = 'Bronze'; try { await pool.query( `INSERT INTO clients (name, email, phone, visits, spent, rating, membership, preferences) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [ name, email, phone || '', visits, spent, rating, membership, JSON.stringify(preferences || []) ] ); res.status(201).json({ message: `Client "${name}" ajouté avec succès !` }); } catch (err) { res.status(500).json({ error: 'Erreur serveur', details: err.message }); } }; // Afficher les détails d'un client exports.show = async (req, res) => { const id = req.params.id; try { const [result] = await pool.query(`SELECT * FROM clients WHERE id = ?`, [id]); if (result.length === 0) return res.status(404).json({ error: 'Client non trouvé' }); const client = result[0]; res.json({ niveauAdhesion: client.membership, evaluation: client.rating }); } catch (err) { res.status(500).json({ error: 'Erreur serveur', details: err.message }); } }; // Éditer un client (renvoyer les infos + moyenne des avis) exports.edit = async (req, res) => { const clientId = req.params.id; try { const [result] = await pool.query(`SELECT * FROM clients WHERE id = ?`, [clientId]); if (result.length === 0) return res.status(404).json({ error: 'Client non trouvé' }); const client = result[0]; const [noteResult] = await pool.query(`SELECT AVG(note) as note FROM avis WHERE client_id = ?`, [clientId]); const evaluation = noteResult[0].note || 0; res.json({ client, evaluation }); } catch (err) { res.status(500).json({ error: 'Erreur serveur', details: err.message }); } };