const sqlite3 = require('sqlite3').verbose(); const path = require('path'); const fs = require('fs'); const dbPath = process.env.DATABASE_PATH || path.join(__dirname, 'database.db'); // Ensure database directory exists const dbDir = path.dirname(dbPath); if (!fs.existsSync(dbDir)) { fs.mkdirSync(dbDir, { recursive: true }); } // Database schema is initialized safely using CREATE TABLE IF NOT EXISTS below. const db = new sqlite3.Database(dbPath, (err) => { if (err) { console.error('Error opening database:', err.message); } else { console.log('Connected to SQLite database at:', dbPath); initializeTables(); } }); function run(sql, params = []) { return new Promise((resolve, reject) => { db.run(sql, params, function (err) { if (err) reject(err); else resolve({ id: this.lastID, changes: this.changes }); }); }); } function get(sql, params = []) { return new Promise((resolve, reject) => { db.get(sql, params, (err, row) => { if (err) reject(err); else resolve(row); }); }); } function all(sql, params = []) { return new Promise((resolve, reject) => { db.all(sql, params, (err, rows) => { if (err) reject(err); else resolve(rows); }); }); } async function initializeTables() { try { // 1. Create Departments Table await run(` CREATE TABLE IF NOT EXISTS departments ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL ) `); // 2. Create Companies Table (New dictionary table) await run(` CREATE TABLE IF NOT EXISTS companies ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL ) `); // 3. Create Employees Table (Updated Schema with foreign keys) await run(` CREATE TABLE IF NOT EXISTS employees ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, company_id INTEGER, job_title TEXT NOT NULL, department_id INTEGER, phone TEXT, email TEXT, building TEXT, floor TEXT, FOREIGN KEY (department_id) REFERENCES departments(id) ON DELETE SET NULL, FOREIGN KEY (company_id) REFERENCES companies(id) ON DELETE SET NULL ) `); // Seed data if database is fresh const deptCount = await get('SELECT COUNT(*) as count FROM departments'); if (deptCount.count === 0) { console.log('Seeding initial departments, companies, and employees...'); await seedData(); } } catch (error) { console.error('Error initializing tables:', error); } } async function seedData() { // Seed Departments const depts = [ 'Руководство', 'Производственно-технический отдел', 'Бухгалтерия', 'Отдел кадров', 'Информационные технологии', 'Монтажный участок', 'Цех металлоконструкций', 'Служба безопасности' ]; const deptIds = {}; for (const dept of depts) { const res = await run('INSERT INTO departments (name) VALUES (?)', [dept]); deptIds[dept] = res.id; } // Seed Companies (Melto Raboty) const companiesList = [ 'АО КМУ Гидромонтаж', 'ООО Гидромонтаж-Услуги', 'ООО Спецтранс' ]; const companyIds = {}; for (const comp of companiesList) { const res = await run('INSERT INTO companies (name) VALUES (?)', [comp]); companyIds[comp] = res.id; } // Seed Employees const employees = [ { name: 'Иванов Александр Сергеевич', company: 'АО КМУ Гидромонтаж', job_title: 'Генеральный директор', department: 'Руководство', phone: '+7 (391) 234-56-78', email: 'a.ivanov@gidrom24.ru', building: 'Административный корпус', floor: '3' }, { name: 'Петров Дмитрий Васильевич', company: 'АО КМУ Гидромонтаж', job_title: 'Руководитель IT-отдела', department: 'Информационные технологии', phone: '+7 (391) 234-56-79', email: 'd.petrov@gidrom24.ru', building: 'Административный корпус', floor: '2' }, { name: 'Сидоров Алексей Михайлович', company: 'АО КМУ Гидромонтаж', job_title: 'Системный администратор', department: 'Информационные технологии', phone: '+7 (923) 456-78-90', email: 'sysadmin@gidrom24.ru', building: 'Административный корпус', floor: '2' }, { name: 'Смирнова Елена Николаевна', company: 'ООО Гидромонтаж-Услуги', job_title: 'Главный бухгалтер', department: 'Бухгалтерия', phone: '+7 (391) 234-56-80', email: 'e.smirnova@gidrom24.ru', building: 'Административный корпус', floor: '3' }, { name: 'Кузнецов Сергей Петрович', company: 'АО КМУ Гидромонтаж', job_title: 'Начальник ПТО', department: 'Производственно-технический отдел', phone: '+7 (391) 234-56-81', email: 's.kuznetsov@gidrom24.ru', building: 'Производственный корпус №1', floor: '2' }, { name: 'Козлова Мария Игоревна', company: 'АО КМУ Гидромонтаж', job_title: 'Начальник отдела кадров', department: 'Отдел кадров', phone: '+7 (391) 234-56-82', email: 'm.kozlova@gidrom24.ru', building: 'Административный корпус', floor: '3' }, { name: 'Морозов Артем Александрович', company: 'ООО Спецтранс', job_title: 'Начальник цеха металлоконструкций', department: 'Цех металлоконструкций', phone: '+7 (913) 765-43-21', email: 'a.morozov@gidrom24.ru', building: 'Производственный корпус №1', floor: '1' }, { name: 'Васильев Игорь Олегович', company: 'ООО Гидромонтаж-Услуги', job_title: 'Бригадир монтажников', department: 'Монтажный участок', phone: '+7 (902) 123-45-67', email: 'i.vasiliev@gidrom24.ru', building: 'Складской терминал', floor: '1' }, { name: 'Федоров Роман Геннадьевич', company: 'ООО Спецтранс', job_title: 'Начальник службы безопасности', department: 'Служба безопасности', phone: '+7 (391) 234-56-99', email: 'security@gidrom24.ru', building: 'Административный корпус', floor: '1' } ]; for (const emp of employees) { await run(` INSERT INTO employees (name, company_id, job_title, department_id, phone, email, building, floor) VALUES (?, ?, ?, ?, ?, ?, ?, ?) `, [ emp.name, companyIds[emp.company], emp.job_title, deptIds[emp.department], emp.phone, emp.email, emp.building, emp.floor ]); } console.log('Database initialized and seeded successfully.'); } module.exports = { db, run, get, all };