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.
 

244 lines
7.3 KiB

const { Client } = require('../models/associations');
const { Op } = require('sequelize');
class ClientController {
// Get all clients with search and pagination
async getAllClients(req, res) {
try {
const {
page = 1,
limit = 10,
search,
actif,
sort_by = 'created_at',
sort_order = 'DESC'
} = req.query;
const offset = (parseInt(page) - 1) * parseInt(limit);
const whereClause = {};
// Search filter
if (search) {
whereClause[Op.or] = [
{ nom: { [Op.like]: `%${search}%` } },
{ prenom: { [Op.like]: `%${search}%` } },
{ email: { [Op.like]: `%${search}%` } },
{ telephone: { [Op.like]: `%${search}%` } }
];
}
// Active filter
if (actif !== undefined) {
whereClause.actif = actif === 'true';
}
const { count, rows } = await Client.findAndCountAll({
where: whereClause,
limit: parseInt(limit),
offset: offset,
order: [[sort_by, sort_order.toUpperCase()]],
attributes: { exclude: ['updated_at'] }
});
res.json({
success: true,
data: {
clients: rows,
pagination: {
currentPage: parseInt(page),
totalPages: Math.ceil(count / parseInt(limit)),
totalItems: count,
itemsPerPage: parseInt(limit)
}
}
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération des clients',
error: error.message
});
}
}
// Get client by ID
async getClientById(req, res) {
try {
const { id } = req.params;
const client = await Client.findByPk(id, {
include: [
{
association: 'reservations',
limit: 5,
order: [['date_reservation', 'DESC']]
},
{
association: 'commandes',
limit: 5,
order: [['date_commande', 'DESC']]
}
]
});
if (!client) {
return res.status(404).json({
success: false,
message: 'Client non trouvé'
});
}
res.json({
success: true,
data: client
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération du client',
error: error.message
});
}
}
// Create new client
async createClient(req, res) {
try {
const clientData = req.body;
const client = await Client.create(clientData);
res.status(201).json({
success: true,
message: 'Client créé avec succès',
data: client
});
} catch (error) {
if (error.name === 'SequelizeValidationError') {
return res.status(400).json({
success: false,
message: 'Données invalides',
errors: error.errors.map(e => ({
field: e.path,
message: e.message
}))
});
}
if (error.name === 'SequelizeUniqueConstraintError') {
return res.status(400).json({
success: false,
message: 'Email déjà utilisé'
});
}
res.status(500).json({
success: false,
message: 'Erreur lors de la création du client',
error: error.message
});
}
}
// Update client
async updateClient(req, res) {
try {
const { id } = req.params;
const updateData = req.body;
const client = await Client.findByPk(id);
if (!client) {
return res.status(404).json({
success: false,
message: 'Client non trouvé'
});
}
await client.update(updateData);
res.json({
success: true,
message: 'Client mis à jour avec succès',
data: client
});
} catch (error) {
if (error.name === 'SequelizeValidationError') {
return res.status(400).json({
success: false,
message: 'Données invalides',
errors: error.errors.map(e => ({
field: e.path,
message: e.message
}))
});
}
res.status(500).json({
success: false,
message: 'Erreur lors de la mise à jour du client',
error: error.message
});
}
}
// Delete client
async deleteClient(req, res) {
try {
const { id } = req.params;
const client = await Client.findByPk(id);
if (!client) {
return res.status(404).json({
success: false,
message: 'Client non trouvé'
});
}
await client.destroy();
res.json({
success: true,
message: 'Client supprimé avec succès'
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la suppression du client',
error: error.message
});
}
}
// Get client statistics
async getClientStats(req, res) {
try {
const totalClients = await Client.count();
const activeClients = await Client.count({ where: { actif: true } });
const inactiveClients = await Client.count({ where: { actif: false } });
const topClients = await Client.findAll({
order: [['points_fidelite', 'DESC']],
limit: 5,
attributes: ['nom', 'prenom', 'email', 'points_fidelite']
});
res.json({
success: true,
data: {
totalClients,
activeClients,
inactiveClients,
topClients
}
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération des statistiques',
error: error.message
});
}
}
}
module.exports = new ClientController();