You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

144 lines
4.4 KiB

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