Initial commit
This commit is contained in:
+246
@@ -0,0 +1,246 @@
|
||||
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
|
||||
};
|
||||
Reference in New Issue
Block a user