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.
 

147 lines
4.4 KiB

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