const reservationModel = require('../models/reservationModel'); const tableModel = require('../models/tableModel'); const invoiceModel = require('../models/invoiceModel'); // Helper pour filtrer selon la période const filterByPeriod = (reservations, period) => { const today = new Date(); const todayStr = today.toISOString().slice(0, 10); return reservations.filter((res) => { const resDate = new Date(res.date_reservation).toISOString().slice(0, 10); switch (period) { case 'aujourdhui': return resDate === todayStr; case 'demain': const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); return resDate === tomorrow.toISOString().slice(0, 10); case 'cette-semaine': const day = today.getDay(); const diffToMonday = today.getDate() - day + (day === 0 ? -6 : 1); const monday = new Date(today.setDate(diffToMonday)); const sunday = new Date(monday); sunday.setDate(monday.getDate() + 6); return new Date(res.date_reservation) >= monday && new Date(res.date_reservation) <= sunday; case 'toutes': default: return true; } }); }; // GET /reservations const index = async (req, res) => { const period = req.query.period || 'aujourdhui'; const allReservations = await reservationModel.getAll(); const tables = await tableModel.getAll(); const filteredReservations = filterByPeriod(allReservations, period); const confirmedReservations = filteredReservations.filter(r => r.statut_reservation === 'Confirmée').length; const pendingReservations = filteredReservations.filter(r => r.statut_reservation === 'En attente').length; const estimatedRevenue = filteredReservations.reduce((acc, r) => acc + (parseFloat(r.montant_estime_mga) || 0), 0); const reservedTables = [...new Set( filteredReservations .filter(r => r.type_reservation === 'table' && !['Annulée', 'Terminée'].includes(r.statut_reservation)) .map(r => r.numero_table_chambre) )].length; const occupancyRate = tables.length > 0 ? Math.round((reservedTables / tables.length) * 100) : 0; res.json({ currentPeriod: period, filteredReservations, tables, confirmedReservations, pendingReservations, estimatedRevenue, occupancyRate }); }; // POST /reservations const store = async (req, res) => { try { const data = req.body; const reservationId = await reservationModel.insert(data); if (reservationId) { const lastInvoice = await invoiceModel.getLast(); let newInvoiceNumber = 'F00001'; if (lastInvoice && lastInvoice.invoice_number.match(/F(\d+)/)) { const num = parseInt(RegExp.$1); newInvoiceNumber = 'F' + String(num + 1).padStart(5, '0'); } await invoiceModel.insert({ invoice_number: newInvoiceNumber, client_name: data.client_nom, client_email: data.email || null, invoice_date: new Date(), due_date: null, total_amount: parseFloat(data.montant_estime_mga) || 0, status: 'Draft', reservation_id: reservationId, notes: data.notes_speciales || null }); } res.status(201).json({ message: 'Réservation et facture ajoutées avec succès.' }); } catch (err) { console.error('Erreur dans store():', err.message); res.status(500).json({ error: err.message }); } }; // DELETE /reservations/:id const destroy = async (req, res) => { const { id } = req.params; await reservationModel.delete(id); res.json({ message: 'Réservation supprimée.' }); }; // GET /reservations/:id/edit const edit = async (req, res) => { const { id } = req.params; const reservation = await reservationModel.findById(id); if (!reservation) { return res.status(404).json({ error: 'Réservation introuvable.' }); } res.json({ reservation }); }; // PUT /reservations/:id const update = async (req, res) => { const { id } = req.params; const data = req.body; if (!data.client_nom || data.client_nom.length < 3) { return res.status(400).json({ error: 'Nom client invalide.' }); } // Autres validations manuelles ici si besoin await reservationModel.update(id, data); res.json({ message: 'Réservation mise à jour.' }); }; // GET /reservations/create?table=3 const create = (req, res) => { const tableId = req.query.table; res.json({ table: tableId }); }; module.exports = { index, store, destroy, edit, update, create };