247 lines
7.6 KiB
JavaScript
247 lines
7.6 KiB
JavaScript
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
|
|
};
|