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