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