102 lines
4.7 KiB
JavaScript
102 lines
4.7 KiB
JavaScript
const config = require('../../config');
|
|
const { getRoomPrice } = config;
|
|
|
|
let db;
|
|
|
|
function init(database) {
|
|
db = database;
|
|
}
|
|
|
|
function calculateBasePrice(roomType, checkin, checkout) {
|
|
const pricePerNight = getRoomPrice(roomType);
|
|
const nights = config.calculateNights(checkin, checkout);
|
|
return pricePerNight * nights;
|
|
}
|
|
|
|
function validatePromocode(promocode, callback) {
|
|
if (!promocode) return callback(null, null);
|
|
const now = new Date().toISOString();
|
|
db.get(`SELECT * FROM promocodes WHERE code = ? AND is_active = 1`, [promocode], (err, row) => {
|
|
if (err || !row) return callback(null, null);
|
|
if (row.valid_from && row.valid_from > now) return callback(null, null);
|
|
if (row.valid_to && row.valid_to < now) return callback(null, null);
|
|
if (row.valid_days) {
|
|
const createdDate = new Date(row.created_at);
|
|
const expireDate = new Date(createdDate.getTime() + row.valid_days * 24 * 60 * 60 * 1000);
|
|
if (expireDate < new Date()) return callback(null, null);
|
|
}
|
|
callback(null, row);
|
|
});
|
|
}
|
|
|
|
function createBooking(req, res) {
|
|
const { name, phone, adults, children, checkin, checkout, wishes, room, room_id, promocode } = req.body;
|
|
if (!name || !phone || !adults || !checkin || !checkout) {
|
|
return res.status(400).json({ error: 'Missing required fields' });
|
|
}
|
|
const basePrice = calculateBasePrice(room, checkin, checkout) * (parseInt(adults) || 1);
|
|
validatePromocode(promocode, (err, promo) => {
|
|
if (err) return res.status(500).json({ error: 'Database error' });
|
|
let discountPercent = 0;
|
|
let promocodeId = null;
|
|
if (promo) {
|
|
discountPercent = promo.discount_percent;
|
|
promocodeId = promo.id;
|
|
}
|
|
const safeBasePrice = basePrice || 0;
|
|
const discountAmount = Math.round(safeBasePrice * discountPercent / 100);
|
|
const totalPrice = safeBasePrice - discountAmount;
|
|
const roomIdValue = room_id ? parseInt(room_id) : null;
|
|
const stmt = db.prepare(`INSERT INTO bookings (name, phone, adults, children, checkin_date, checkout_date, wishes, status, room_type, room_id, base_price, discount_percent, discount_amount, total_price, promocode_id)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, 'новая', ?, ?, ?, ?, ?, ?, ?)`);
|
|
stmt.run(name, phone, parseInt(adults), parseInt(children || 0), checkin, checkout, wishes || null, room || null, roomIdValue,
|
|
safeBasePrice || null, discountPercent || 0, discountAmount || 0, totalPrice || null, promocodeId, function(err) {
|
|
if (err) {
|
|
console.error(err);
|
|
return res.status(500).json({ error: 'Database error' });
|
|
}
|
|
res.status(201).json({ id: this.lastID, message: 'Booking saved', base_price: safeBasePrice, discount_percent: discountPercent, discount_amount: discountAmount, total_price: totalPrice });
|
|
});
|
|
stmt.finalize();
|
|
});
|
|
}
|
|
|
|
function getBookings(req, res) {
|
|
const providedKey = req.headers['x-api-key'];
|
|
if (!providedKey) return res.status(401).json({ error: 'Invalid or missing API key' });
|
|
const API_KEY = process.env.HOTEL777KEY;
|
|
if (providedKey !== API_KEY) return res.status(401).json({ error: 'Invalid or missing API key' });
|
|
db.all(`SELECT b.*, p.code as promocode_code FROM bookings b
|
|
LEFT JOIN promocodes p ON b.promocode_id = p.id
|
|
ORDER BY b.checkin_date ASC`, (err, rows) => {
|
|
if (err) {
|
|
console.error(err);
|
|
return res.status(500).json({ error: 'Database error' });
|
|
}
|
|
res.json(rows);
|
|
});
|
|
}
|
|
|
|
function getBookingHistory(req, res) {
|
|
const bookingId = parseInt(req.params.id);
|
|
db.all(`SELECT id, booking_id, user_id, user_login, field, old_value, new_value, created_at
|
|
FROM booking_history WHERE booking_id = ? ORDER BY created_at DESC`, [bookingId], (err, rows) => {
|
|
if (err) return res.status(500).json({ error: 'Database error' });
|
|
res.json(rows);
|
|
});
|
|
}
|
|
|
|
function logHistory(bookingId, userId, userLogin, field, oldValue, newValue) {
|
|
db.run(`INSERT INTO booking_history (booking_id, user_id, user_login, field, old_value, new_value) VALUES (?, ?, ?, ?, ?, ?)`,
|
|
[bookingId, userId, userLogin, field, oldValue, newValue], (err) => {
|
|
if (err) console.error('History log error:', err);
|
|
});
|
|
}
|
|
|
|
function setupRoutes(app, authenticateToken, requireAdmin) {
|
|
app.post('/api/bookings', createBooking);
|
|
app.get('/api/bookings', getBookings);
|
|
app.get('/api/admin/bookings/:id/history', authenticateToken, getBookingHistory);
|
|
}
|
|
|
|
module.exports = { init, setupRoutes, validatePromocode, logHistory, calculateBasePrice }; |