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