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