315 lines
10 KiB
TypeScript
315 lines
10 KiB
TypeScript
import { hash, genSalt } from "bcrypt";
|
||
import { db } from "../config/database.ts";
|
||
import { config } from "../config/env.ts";
|
||
|
||
// Helper function to hash password with proper salt generation
|
||
async function hashPassword(password: string): Promise<string> {
|
||
const salt = await genSalt(config.BCRYPT_ROUNDS);
|
||
return await hash(password, salt);
|
||
}
|
||
|
||
async function seedDatabase() {
|
||
try {
|
||
console.log("🔌 Connecting to database...");
|
||
await db.connect();
|
||
console.log("✅ Connected to database\n");
|
||
|
||
// 1. Seed Departments
|
||
console.log("📁 Seeding departments...");
|
||
const existingDepts = await db.query<{ count: number }[]>(
|
||
"SELECT COUNT(*) as count FROM departments"
|
||
);
|
||
|
||
if (existingDepts[0].count === 0) {
|
||
await db.execute(`
|
||
INSERT INTO departments (name) VALUES
|
||
('Tudki'),
|
||
('Dana'),
|
||
('Groundnut')
|
||
`);
|
||
console.log(" ✅ Departments created");
|
||
} else {
|
||
console.log(" ℹ️ Departments already exist");
|
||
}
|
||
|
||
// 2. Seed Sub-departments for Groundnut
|
||
console.log("📂 Seeding sub-departments...");
|
||
const groundnutDept = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM departments WHERE name = ?",
|
||
["Groundnut"]
|
||
);
|
||
|
||
let groundnutId: number | null = null;
|
||
|
||
if (groundnutDept.length > 0) {
|
||
groundnutId = groundnutDept[0].id;
|
||
const existingSubDepts = await db.query<{ count: number }[]>(
|
||
"SELECT COUNT(*) as count FROM sub_departments WHERE department_id = ?",
|
||
[groundnutId]
|
||
);
|
||
|
||
if (existingSubDepts[0].count === 0) {
|
||
const subDepts = [
|
||
"Mufali Aavak Katai",
|
||
"Mufali Aavak Dhang",
|
||
"Dhang Se Katai",
|
||
"Guthli Bori Silai Dhang",
|
||
"Guthali dada Pala Tulai Silai Dhang",
|
||
"Mufali Patthar Bori silai dhang",
|
||
"Mufali Patthar Bori Utrai",
|
||
"Bardana Bandal Loading Unloading",
|
||
"Bardana Gatthi Loading",
|
||
"Black Dana Loading/Unloading",
|
||
"Pre Cleaning",
|
||
"Destoner",
|
||
"Water",
|
||
"Decordicater",
|
||
"Round Chalna",
|
||
"Cleaning",
|
||
"Round Chalna No.1"
|
||
];
|
||
|
||
for (const name of subDepts) {
|
||
await db.execute(
|
||
"INSERT INTO sub_departments (department_id, name, primary_activity) VALUES (?, ?, ?)",
|
||
[groundnutId, name, "Loading/Unloading"]
|
||
);
|
||
}
|
||
console.log(" ✅ Sub-departments created");
|
||
} else {
|
||
console.log(" ℹ️ Sub-departments already exist");
|
||
}
|
||
}
|
||
|
||
// 3. Seed SuperAdmin
|
||
console.log("👤 Seeding SuperAdmin user...");
|
||
const existingAdmin = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM users WHERE username = ?",
|
||
["admin"]
|
||
);
|
||
|
||
const adminPassword = await hashPassword("admin123");
|
||
|
||
if (existingAdmin.length > 0) {
|
||
await db.execute(
|
||
"UPDATE users SET password = ?, is_active = TRUE WHERE username = ?",
|
||
[adminPassword, "admin"]
|
||
);
|
||
console.log(" ✅ SuperAdmin password updated");
|
||
} else {
|
||
await db.execute(
|
||
"INSERT INTO users (username, name, email, password, role, is_active) VALUES (?, ?, ?, ?, ?, ?)",
|
||
["admin", "Super Admin", "admin@workallocate.com", adminPassword, "SuperAdmin", true]
|
||
);
|
||
console.log(" ✅ SuperAdmin created");
|
||
}
|
||
|
||
// 4. Seed Sample Supervisors
|
||
console.log("👥 Seeding sample supervisors...");
|
||
const tudkiDept = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM departments WHERE name = ?",
|
||
["Tudki"]
|
||
);
|
||
const danaDept = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM departments WHERE name = ?",
|
||
["Dana"]
|
||
);
|
||
|
||
const supervisorPassword = await hashPassword("supervisor123");
|
||
|
||
const supervisors = [
|
||
{ username: "supervisor_tudki", name: "Tudki Supervisor", email: "supervisor.tudki@workallocate.com", deptId: tudkiDept[0]?.id },
|
||
{ username: "supervisor_dana", name: "Dana Supervisor", email: "supervisor.dana@workallocate.com", deptId: danaDept[0]?.id },
|
||
{ username: "supervisor_groundnut", name: "Groundnut Supervisor", email: "supervisor.groundnut@workallocate.com", deptId: groundnutId }
|
||
];
|
||
|
||
for (const sup of supervisors) {
|
||
if (sup.deptId) {
|
||
const existing = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM users WHERE username = ?",
|
||
[sup.username]
|
||
);
|
||
if (existing.length === 0) {
|
||
await db.execute(
|
||
"INSERT INTO users (username, name, email, password, role, department_id, is_active) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
||
[sup.username, sup.name, sup.email, supervisorPassword, "Supervisor", sup.deptId, true]
|
||
);
|
||
console.log(` ✅ ${sup.name} created`);
|
||
} else {
|
||
console.log(` ℹ️ ${sup.name} already exists`);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 5. Seed Sample Contractors
|
||
console.log("🏗️ Seeding sample contractors...");
|
||
const contractorPassword = await hashPassword("contractor123");
|
||
|
||
const contractors = [
|
||
{
|
||
username: "contractor1",
|
||
name: "Contractor One",
|
||
email: "contractor1@workallocate.com",
|
||
deptId: groundnutId,
|
||
phone: "9876543210",
|
||
aadhar: "123456789012",
|
||
bankAccount: "1234567890123456",
|
||
bankName: "State Bank of India",
|
||
bankIfsc: "SBIN0001234",
|
||
agreementNo: "AGR-2024-001",
|
||
pfNo: "PF/GJ/12345/67890",
|
||
esicNo: "12-34-567890-123-0001"
|
||
},
|
||
{
|
||
username: "contractor2",
|
||
name: "Contractor Two",
|
||
email: "contractor2@workallocate.com",
|
||
deptId: groundnutId,
|
||
phone: "9876543211",
|
||
aadhar: "234567890123",
|
||
bankAccount: "2345678901234567",
|
||
bankName: "HDFC Bank",
|
||
bankIfsc: "HDFC0001234",
|
||
agreementNo: "AGR-2024-002",
|
||
pfNo: "PF/GJ/12345/67891",
|
||
esicNo: "12-34-567890-123-0002"
|
||
}
|
||
];
|
||
|
||
for (const con of contractors) {
|
||
const existing = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM users WHERE username = ?",
|
||
[con.username]
|
||
);
|
||
if (existing.length === 0) {
|
||
await db.execute(
|
||
`INSERT INTO users (username, name, email, password, role, department_id, is_active,
|
||
phone_number, aadhar_number, bank_account_number, bank_name, bank_ifsc,
|
||
contractor_agreement_number, pf_number, esic_number)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||
[con.username, con.name, con.email, contractorPassword, "Contractor", con.deptId, true,
|
||
con.phone, con.aadhar, con.bankAccount, con.bankName, con.bankIfsc,
|
||
con.agreementNo, con.pfNo, con.esicNo]
|
||
);
|
||
console.log(` ✅ ${con.name} created`);
|
||
} else {
|
||
console.log(` ℹ️ ${con.name} already exists`);
|
||
}
|
||
}
|
||
|
||
// 6. Seed Sample Employees
|
||
console.log("👷 Seeding sample employees...");
|
||
const contractor1 = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM users WHERE username = ?",
|
||
["contractor1"]
|
||
);
|
||
const employeePassword = await hashPassword("employee123");
|
||
|
||
if (contractor1.length > 0) {
|
||
const employees = [
|
||
{
|
||
username: "employee1",
|
||
name: "Employee One",
|
||
email: "employee1@workallocate.com",
|
||
phone: "9876543220",
|
||
aadhar: "345678901234",
|
||
bankAccount: "3456789012345678",
|
||
bankName: "Punjab National Bank",
|
||
bankIfsc: "PUNB0001234"
|
||
},
|
||
{
|
||
username: "employee2",
|
||
name: "Employee Two",
|
||
email: "employee2@workallocate.com",
|
||
phone: "9876543221",
|
||
aadhar: "456789012345",
|
||
bankAccount: "4567890123456789",
|
||
bankName: "Bank of Baroda",
|
||
bankIfsc: "BARB0001234"
|
||
},
|
||
{
|
||
username: "employee3",
|
||
name: "Employee Three",
|
||
email: "employee3@workallocate.com",
|
||
phone: "9876543222",
|
||
aadhar: "567890123456",
|
||
bankAccount: "5678901234567890",
|
||
bankName: "ICICI Bank",
|
||
bankIfsc: "ICIC0001234"
|
||
}
|
||
];
|
||
|
||
for (const emp of employees) {
|
||
const existing = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM users WHERE username = ?",
|
||
[emp.username]
|
||
);
|
||
if (existing.length === 0) {
|
||
await db.execute(
|
||
`INSERT INTO users (username, name, email, password, role, department_id, contractor_id, is_active,
|
||
phone_number, aadhar_number, bank_account_number, bank_name, bank_ifsc)
|
||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||
[emp.username, emp.name, emp.email, employeePassword, "Employee", groundnutId, contractor1[0].id, true,
|
||
emp.phone, emp.aadhar, emp.bankAccount, emp.bankName, emp.bankIfsc]
|
||
);
|
||
console.log(` ✅ ${emp.name} created`);
|
||
} else {
|
||
console.log(` ℹ️ ${emp.name} already exists`);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 7. Seed Contractor Rates
|
||
console.log("💰 Seeding contractor rates...");
|
||
if (contractor1.length > 0) {
|
||
const existingRate = await db.query<{ id: number }[]>(
|
||
"SELECT id FROM contractor_rates WHERE contractor_id = ?",
|
||
[contractor1[0].id]
|
||
);
|
||
|
||
if (existingRate.length === 0) {
|
||
const today = new Date().toISOString().split("T")[0];
|
||
await db.execute(
|
||
"INSERT INTO contractor_rates (contractor_id, rate, effective_date) VALUES (?, ?, ?)",
|
||
[contractor1[0].id, 500.00, today]
|
||
);
|
||
console.log(" ✅ Contractor rates created");
|
||
} else {
|
||
console.log(" ℹ️ Contractor rates already exist");
|
||
}
|
||
}
|
||
|
||
console.log(`
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
✅ Database seeding completed successfully!
|
||
|
||
🔑 Default Login Credentials:
|
||
|
||
SuperAdmin:
|
||
Username: admin
|
||
Password: admin123
|
||
|
||
Supervisor (Groundnut):
|
||
Username: supervisor_groundnut
|
||
Password: supervisor123
|
||
|
||
Contractor:
|
||
Username: contractor1
|
||
Password: contractor123
|
||
|
||
Employee:
|
||
Username: employee1
|
||
Password: employee123
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
`);
|
||
|
||
} catch (error) {
|
||
console.error("❌ Error seeding database:", (error as Error).message);
|
||
Deno.exit(1);
|
||
} finally {
|
||
await db.close();
|
||
}
|
||
}
|
||
|
||
await seedDatabase();
|