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