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.
 

313 lines
6.9 KiB

// controllers/commandesController.js
const Commande = require('../models/Commande');
const { Op } = require('sequelize');
// Get all commandes
const getAllCommandes = async (req, res) => {
try {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 10;
const offset = (page - 1) * limit;
const where = {};
// Filters
if (req.query.statut) {
where.statut = req.query.statut;
}
if (req.query.client_id) {
where.client_id = req.query.client_id;
}
if (req.query.table_id) {
where.table_id = req.query.table_id;
}
if (req.query.serveur) {
where.serveur = { [Op.like]: `%${req.query.serveur}%` };
}
if (req.query.date_debut && req.query.date_fin) {
where.date_commande = {
[Op.between]: [req.query.date_debut, req.query.date_fin]
};
}
const { count, rows } = await Commande.findAndCountAll({
where,
limit,
offset,
order: [['date_commande', 'DESC']]
});
res.status(200).json({
success: true,
data: {
commandes: rows,
pagination: {
currentPage: page,
totalPages: Math.ceil(count / limit),
totalItems: count,
itemsPerPage: limit
}
}
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération des commandes',
error: error.message
});
}
};
// Get commande by ID
const getCommandeById = async (req, res) => {
try {
const commande = await Commande.findByPk(req.params.id);
if (!commande) {
return res.status(404).json({
success: false,
message: 'Commande non trouvée'
});
}
res.status(200).json({
success: true,
data: commande
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération de la commande',
error: error.message
});
}
};
// Create new commande
const createCommande = async (req, res) => {
try {
const {
client_id,
table_id,
reservation_id,
numero_commande,
statut,
total_ht,
total_tva,
total_ttc,
mode_paiement,
commentaires,
serveur,
date_commande,
date_service
} = req.body;
const newCommande = await Commande.create({
client_id,
table_id,
reservation_id,
numero_commande,
statut: statut || 'en_attente',
total_ht: total_ht || 0.00,
total_tva: total_tva || 0.00,
total_ttc: total_ttc || 0.00,
mode_paiement,
commentaires,
serveur,
date_commande: date_commande || new Date(),
date_service
});
res.status(201).json({
success: true,
message: 'Commande créée avec succès',
data: newCommande
});
} catch (error) {
res.status(400).json({
success: false,
message: 'Erreur lors de la création de la commande',
error: error.message
});
}
};
// Update commande
const updateCommande = async (req, res) => {
try {
const commandeId = req.params.id;
const updateData = req.body;
const commande = await Commande.findByPk(commandeId);
if (!commande) {
return res.status(404).json({
success: false,
message: 'Commande non trouvée'
});
}
await commande.update(updateData);
res.status(200).json({
success: true,
message: 'Commande mise à jour avec succès',
data: commande
});
} catch (error) {
res.status(400).json({
success: false,
message: 'Erreur lors de la mise à jour de la commande',
error: error.message
});
}
};
// Delete commande
const deleteCommande = async (req, res) => {
try {
const commandeId = req.params.id;
const commande = await Commande.findByPk(commandeId);
if (!commande) {
return res.status(404).json({
success: false,
message: 'Commande non trouvée'
});
}
await commande.destroy();
res.status(200).json({
success: true,
message: 'Commande supprimée avec succès'
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la suppression de la commande',
error: error.message
});
}
};
// Update commande status
const updateStatut = async (req, res) => {
try {
const commandeId = req.params.id;
const { statut } = req.body;
if (!statut) {
return res.status(400).json({
success: false,
message: 'Le statut est requis'
});
}
const commande = await Commande.findByPk(commandeId);
if (!commande) {
return res.status(404).json({
success: false,
message: 'Commande non trouvée'
});
}
const updateData = { statut };
if (statut === 'servie' && !commande.date_service) {
updateData.date_service = new Date();
}
await commande.update(updateData);
res.status(200).json({
success: true,
message: 'Statut de la commande mis à jour avec succès',
data: commande
});
} catch (error) {
res.status(400).json({
success: false,
message: 'Erreur lors de la mise à jour du statut',
error: error.message
});
}
};
// Get commandes by status
const getCommandesByStatut = async (req, res) => {
try {
const { statut } = req.params;
const commandes = await Commande.findAll({
where: { statut },
order: [['date_commande', 'DESC']]
});
res.status(200).json({
success: true,
data: commandes
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération des commandes par statut',
error: error.message
});
}
};
// Get daily statistics
const getDailyStats = async (req, res) => {
try {
const date = req.query.date || new Date().toISOString().split('T')[0];
const startOfDay = new Date(date + 'T00:00:00.000Z');
const endOfDay = new Date(date + 'T23:59:59.999Z');
const stats = await Commande.findAll({
where: {
date_commande: {
[Op.between]: [startOfDay, endOfDay]
}
},
attributes: [
'statut',
[sequelize.fn('COUNT', sequelize.col('id')), 'count'],
[sequelize.fn('SUM', sequelize.col('total_ttc')), 'total_amount']
],
group: ['statut']
});
res.status(200).json({
success: true,
data: {
date,
statistics: stats
}
});
} catch (error) {
res.status(500).json({
success: false,
message: 'Erreur lors de la récupération des statistiques',
error: error.message
});
}
};
// IMPORTANT: Make sure this export is at the very end of the file
module.exports = {
getAllCommandes,
getCommandeById,
createCommande,
updateCommande,
deleteCommande,
updateStatut,
getCommandesByStatut,
getDailyStats
};