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