Files
hotel777-manager/db.js
2026-05-03 16:36:18 +05:00

70 lines
2.0 KiB
JavaScript

const Database = require('better-sqlite3');
const path = require('path');
const fs = require('fs');
const dataDir = path.join(__dirname, 'data');
if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir);
const db = new Database(path.join(dataDir, 'database.sqlite'));
db.pragma('journal_mode = WAL');
db.pragma('foreign_keys = ON');
db.exec(`
-- Таблица администраторов (логин/пароль)
CREATE TABLE IF NOT EXISTS admins (
id INTEGER PRIMARY KEY AUTOINCREMENT,
login TEXT UNIQUE NOT NULL,
password TEXT NOT NULL
);
-- Карточки клиентов
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
phone TEXT UNIQUE NOT NULL,
name TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Заявки на заселение
CREATE TABLE IF NOT EXISTS bookings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
external_id INTEGER UNIQUE,
user_id INTEGER,
name TEXT,
phone_raw TEXT,
adults INTEGER DEFAULT 1,
children INTEGER DEFAULT 0,
checkin_date TEXT,
checkout_date TEXT,
status TEXT DEFAULT 'Новая',
comments TEXT DEFAULT '',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Журнал действий
CREATE TABLE IF NOT EXISTS audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
action TEXT NOT NULL,
details TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
`);
function normalizePhone(phone) {
let digits = phone.replace(/\D/g, '');
if (/^[78]\d{10}$/.test(digits)) {
digits = '7' + digits.slice(1);
}
return digits;
}
function logAction(action, details = {}) {
const stmt = db.prepare('INSERT INTO audit_log (action, details) VALUES (?, ?)');
stmt.run(action, JSON.stringify(details));
}
module.exports = { db, normalizePhone, logAction };