import { db } from './connection'; import { branches, employees, candidates, settings, voteRecords } from './schema'; import { eq } from 'drizzle-orm'; import crypto from 'crypto'; // Simple hash function for PIN function hashPin(pin: string): string { return crypto.createHash('sha256').update(pin).digest('hex'); } function generateId(): string { return crypto.randomUUID(); } async function seed() { console.log('ðŸŒą Seeding database...'); // Check if already seeded const existingBranches = await db.select().from(branches).limit(1); if (existingBranches.length > 0) { console.log('⏭ïļ Database already seeded, skipping...'); return; } // ===== BRANCHES ===== const branchData = [ { id: generateId(), name: 'āļŠāļģāļ™āļąāļāļ‡āļēāļ™āđƒāļŦāļāđˆ (āļāļĨāļēāļ‡)', code: 'HQ' }, { id: generateId(), name: 'āļŠāļēāļ‚āļēāđ€āļŠāļĩāļĒāļ‡āđƒāļŦāļĄāđˆ', code: 'CNX' }, { id: generateId(), name: 'āļŠāļēāļ‚āļēāļ‚āļ­āļ™āđāļāđˆāļ™', code: 'KKC' }, { id: generateId(), name: 'āļŠāļēāļ‚āļēāļ āļđāđ€āļāđ‡āļ•', code: 'PKT' }, { id: generateId(), name: 'āļŠāļēāļ‚āļēāļ™āļ™āļ—āļšāļļāļĢāļĩ', code: 'NBI' }, { id: generateId(), name: 'āļŠāļēāļ‚āļēāļŠāļĨāļšāļļāļĢāļĩ', code: 'CBI' }, ]; for (const branch of branchData) { await db.insert(branches).values(branch); } console.log(`✅ Created ${branchData.length} branches`); // ===== EMPLOYEES ===== const hqBranch = branchData[0]; const cnxBranch = branchData[1]; const kkcBranch = branchData[2]; const pktBranch = branchData[3]; const nbiBranch = branchData[4]; const cbiBranch = branchData[5]; const employeeData = [ // Admin { id: generateId(), employeeId: 'ADMIN001', name: 'āļœāļđāđ‰āļ”āļđāđāļĨāļĢāļ°āļšāļš', branchId: hqBranch.id, isAdmin: true, pin: hashPin('1234'), isActive: true }, // HQ employees { id: generateId(), employeeId: 'EMP001', name: 'āļŠāļĄāļŠāļēāļĒ āđƒāļˆāļ”āļĩ', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP002', name: 'āļŠāļĄāļŦāļāļīāļ‡ āļĢāļąāļāđ€āļĢāļĩāļĒāļ™', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP003', name: 'āļ§āļīāļŠāļąāļĒ āļĄāļļāđˆāļ‡āļĄāļąāđˆāļ™', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP004', name: 'āļžāļĢāļ—āļīāļžāļĒāđŒ āļŠāļ§āđˆāļēāļ‡āļˆāļīāļ•', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP005', name: 'āļ˜āļ™āļāļĢ āđ€āļˆāļĢāļīāļāļŠāļļāļ‚', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP006', name: 'āļĢāļąāļ•āļ™āļē āļœāļ”āļļāļ‡āļĻāļĢāļĩ', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP007', name: 'āļāļīāļ•āļ•āļīāļžāļ‡āļĐāđŒ āļ§āļ‡āļĻāđŒāļ—āļ­āļ‡', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP008', name: 'āļ™āļ āļąāļŠāļŠāļĢ āļĻāļĢāļĩāļŠāļļāļ‚', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP009', name: 'āļ›āļĢāļ°āđ€āļŠāļĢāļīāļ āļāļīāļˆāļŠāļļāļ‚', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP010', name: 'āļ­āļĢāļļāļ“āļĩ āđāļŠāļ‡āļˆāļąāļ™āļ—āļĢāđŒ', branchId: hqBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, // Chiang Mai employees { id: generateId(), employeeId: 'EMP011', name: 'āđ€āļāļĢāļĩāļĒāļ‡āļĻāļąāļāļ”āļīāđŒ āļžāļ‡āļĐāđŒāļ›āļĢāļ°āđ€āļŠāļĢāļīāļ', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP012', name: 'āļĻāļīāļĢāļīāļĨāļąāļāļĐāļ“āđŒ āļ”āļ­āļāđ„āļĄāđ‰', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP013', name: 'āļ āļēāļ“āļļāļžāļ‡āļĻāđŒ āļ™āļ„āļĢ', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP014', name: 'āļˆāļīāļĢāļēāļ āļĢāļ“āđŒ āļĻāļĢāļĩāļŠāļĄāļšāļđāļĢāļ“āđŒ', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP015', name: 'āļ­āļ”āļīāļĻāļĢ āļ āļđāļĄāļīāļžāļąāļ’āļ™āđŒ', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP016', name: 'āļ§āļīāļ āļēāļ”āļē āđ€āļĢāļ·āļ­āļ‡āļĻāļĢāļĩ', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP017', name: 'āļŠāļēāļ•āļĢāļĩ āđāļŠāļ™āļŠāļļāļ‚', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP018', name: 'āļžāļīāļĄāļžāđŒāđƒāļˆ āļĢāļļāđˆāļ‡āđ€āļĢāļ·āļ­āļ‡', branchId: cnxBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, // Khon Kaen employees { id: generateId(), employeeId: 'EMP019', name: 'āļŠāļļāļĢāļŠāļąāļĒ āļžāļĨāđ€āļĄāļ·āļ­āļ‡', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP020', name: 'āļ§āļĢāļĢāļ“āļē āļŠāļīāļ—āļ˜āļīāļœāļĨ', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP021', name: 'āļ˜āļĩāļĢāļžāļ‡āļĐāđŒ āļˆāļąāļ™āļ—āļĢāđŒāđ€āļžāđ‡āļ', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP022', name: 'āļĨāļĨāļīāļ•āļē āļŠāļļāļ‚āļŠāļąāļ™āļ•āđŒ', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP023', name: 'āļšāļļāļāļĄāļĩ āļĻāļĢāļĩāđ€āļĄāļ·āļ­āļ‡', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP024', name: 'āļˆāļīāļ•āļĢāļē āļ—āļ­āļ‡āļ”āļĩ', branchId: kkcBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, // Phuket employees { id: generateId(), employeeId: 'EMP025', name: 'āļ§āļīāļŠāļąāļĒ āļ—āļ°āđ€āļĨāđƒāļŠ', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP026', name: 'āļŠāļĄāļĻāļĢāļĩ āļŦāļēāļ”āļ—āļ­āļ‡', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP027', name: 'āļ›āļĢāļ°āļ āļēāļŠ āđāļāđ‰āļ§āļĄāļļāļ', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP028', name: 'āļ™āļīāļ•āļĒāļē āļŠāļĄāļļāļ—āļĢ', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP029', name: 'āļāļĄāļĨāļŠāļ™āļ āļ§āļīāđ„āļĨāļĨāļąāļāļĐāļ“āđŒ', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP030', name: 'āļžāļĩāļĢāļžāļ‡āļĻāđŒ āļŠāļĨāļ˜āļĩ', branchId: pktBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, // Nonthaburi employees { id: generateId(), employeeId: 'EMP031', name: 'āļ˜āļ™āļ§āļąāļ’āļ™āđŒ āļšāļļāļāđ€āļĢāļ·āļ­āļ‡', branchId: nbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP032', name: 'āļŠāļļāļ™āļĩāļĒāđŒ āļĢāļļāđˆāļ‡āļ­āļĢāļļāļ“', branchId: nbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP033', name: 'āļŠāļąāļĒāļ§āļąāļ’āļ™āđŒ āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāđŒ', branchId: nbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP034', name: 'āļ§āļīāļĄāļĨ āļˆāļąāļ™āļ—āļĢāđŒāđāļāđ‰āļ§', branchId: nbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP035', name: 'āļŠāļĄāļšāļąāļ•āļī āļ—āļ­āļ‡āļ„āļģ', branchId: nbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, // Chonburi employees { id: generateId(), employeeId: 'EMP036', name: 'āļ§āļĩāļĢāļŠāļąāļĒ āļĻāļĢāļĩāļŠāļĄāļļāļ—āļĢ', branchId: cbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP037', name: 'āļˆāļąāļ™āļ—āļĢāđŒāđ€āļžāđ‡āļ āđāļŠāļ‡āļ—āļ­āļ‡', branchId: cbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP038', name: 'āļ­āļ™āļąāļ™āļ•āđŒ āļŠāļąāļĒāļŠāļ™āļ°', branchId: cbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP039', name: 'āļŠāļēāļĒāļāļ™ āļžāļĢāļĄāđ€āļĒāđ‡āļ™', branchId: cbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, { id: generateId(), employeeId: 'EMP040', name: 'āļŠāļđāļĻāļĢāļĩ āļšāļļāļāļĄāļēāļ', branchId: cbiBranch.id, isAdmin: false, pin: hashPin('1234'), isActive: true }, ]; for (const emp of employeeData) { await db.insert(employees).values(emp); } console.log(`✅ Created ${employeeData.length} employees`); // ===== CANDIDATES (some sample ones) ===== // Use existing employees as candidates const candidateEmployees = employeeData.filter(e => !e.isAdmin && [ 'EMP001', 'EMP003', 'EMP005', 'EMP007', 'EMP009', // HQ 'EMP011', 'EMP013', 'EMP015', 'EMP017', // CNX 'EMP019', 'EMP021', 'EMP023', // KKC 'EMP025', 'EMP027', 'EMP029', // PKT 'EMP031', 'EMP033', // NBI 'EMP036', 'EMP038', // CBI ].includes(e.employeeId)); const candidateData = candidateEmployees.map(emp => ({ id: generateId(), employeeId: emp.id, branchId: emp.branchId, position: 'āļžāļ™āļąāļāļ‡āļēāļ™', statement: `āļžāļĢāđ‰āļ­āļĄāļ—āļĩāđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđāļ—āļ™āļžāļ™āļąāļāļ‡āļēāļ™ āđ€āļžāļ·āđˆāļ­āļŠāđˆāļ‡āđ€āļŠāļĢāļīāļĄāļŠāļīāļ—āļ˜āļīāđāļĨāļ°āļ„āļļāļ“āļ āļēāļžāļŠāļĩāļ§āļīāļ•āđƒāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™`, isApproved: true, })); for (const cand of candidateData) { await db.insert(candidates).values(cand); } console.log(`✅ Created ${candidateData.length} candidates`); // ===== SETTINGS ===== const now = new Date(); const votingStart = new Date(now.getTime() - 1 * 24 * 60 * 60 * 1000); // 1 day ago (voting is open) const votingEnd = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000); // 7 days from now const settingsData = [ { id: generateId(), key: 'maxVotesPerPerson', value: '5' }, { id: generateId(), key: 'votingStartDate', value: votingStart.toISOString() }, { id: generateId(), key: 'votingEndDate', value: votingEnd.toISOString() }, { id: generateId(), key: 'votingEnabled', value: 'true' }, { id: generateId(), key: 'resultsVisible', value: 'false' }, // Only show results after voting ends (admin can toggle) { id: generateId(), key: 'systemName', value: 'āļĢāļ°āļšāļšāđ€āļĨāļ·āļ­āļāļ•āļąāđ‰āļ‡āļ•āļąāļ§āđāļ—āļ™āļžāļ™āļąāļāļ‡āļēāļ™' }, ]; for (const setting of settingsData) { await db.insert(settings).values(setting); } console.log(`✅ Created ${settingsData.length} settings`); console.log('🎉 Seeding complete!'); console.log(''); console.log('📋 Login credentials:'); console.log(' Admin: ADMIN001 / 1234'); console.log(' Employee: EMP001-EMP040 / 1234'); } seed().catch(console.error);