import { hash } from "bcrypt"; import { db } from "../config/database.ts"; import { config } from "../config/env.ts"; 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 hash("admin123", config.BCRYPT_ROUNDS); 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 hash("supervisor123", config.BCRYPT_ROUNDS); 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 hash("contractor123", config.BCRYPT_ROUNDS); const contractors = [ { username: "contractor1", name: "Contractor One", email: "contractor1@workallocate.com", deptId: groundnutId }, { username: "contractor2", name: "Contractor Two", email: "contractor2@workallocate.com", deptId: groundnutId } ]; 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) VALUES (?, ?, ?, ?, ?, ?, ?)", [con.username, con.name, con.email, contractorPassword, "Contractor", con.deptId, true] ); 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 hash("employee123", config.BCRYPT_ROUNDS); if (contractor1.length > 0) { const employees = [ { username: "employee1", name: "Employee One", email: "employee1@workallocate.com" }, { username: "employee2", name: "Employee Two", email: "employee2@workallocate.com" }, { username: "employee3", name: "Employee Three", email: "employee3@workallocate.com" } ]; 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) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", [emp.username, emp.name, emp.email, employeePassword, "Employee", groundnutId, contractor1[0].id, true] ); 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();