/** * Database Seeding Script * Adds initial test data to the database * * Run: node scripts/seed.js */ require('dotenv').config(); const bcrypt = require('bcryptjs'); const { query } = require('../config/database'); async function seedDatabase() { console.log('🌱 Starting database seeding...\n'); try { // 1. Seed regions console.log('Adding regions...'); const regions = ['East', 'West', 'North', 'South', 'Central']; for (const region of regions) { await query( `INSERT INTO master_regions (region_name) VALUES ($1) ON CONFLICT (region_name) DO NOTHING`, [region] ); } console.log('āœ… Regions added\n'); // 2. Seed zones console.log('Adding zones...'); const zones = [ { region: 'West', name: 'Mumbai Zone', code: 'MUM-01' }, { region: 'West', name: 'Pune Zone', code: 'PUN-01' }, { region: 'North', name: 'Delhi Zone', code: 'DEL-01' }, { region: 'South', name: 'Bangalore Zone', code: 'BLR-01' }, { region: 'East', name: 'Kolkata Zone', code: 'KOL-01' }, ]; for (const zone of zones) { const regionResult = await query('SELECT id FROM master_regions WHERE region_name = $1', [zone.region]); if (regionResult.rows.length > 0) { await query( `INSERT INTO master_zones (region_id, zone_name, zone_code) VALUES ($1, $2, $3) ON CONFLICT (zone_code) DO NOTHING`, [regionResult.rows[0].id, zone.name, zone.code] ); } } console.log('āœ… Zones added\n'); // 3. Seed users console.log('Adding users...'); const hashedPassword = await bcrypt.hash('Password@123', 10); const users = [ { email: 'admin@royalenfield.com', name: 'Super Admin', role: 'Super Admin', region: null, zone: null }, { email: 'ddlead@royalenfield.com', name: 'DD Lead', role: 'DD Lead', region: 'West', zone: null }, { email: 'ddhead@royalenfield.com', name: 'DD Head', role: 'DD Head', region: 'West', zone: null }, { email: 'nbh@royalenfield.com', name: 'NBH', role: 'NBH', region: null, zone: null }, { email: 'finance@royalenfield.com', name: 'Finance Admin', role: 'Finance', region: null, zone: null }, { email: 'legal@royalenfield.com', name: 'Legal Admin', role: 'Legal Admin', region: null, zone: null }, { email: 'dd@royalenfield.com', name: 'DD Mumbai', role: 'DD', region: 'West', zone: 'Mumbai Zone' }, { email: 'rbm@royalenfield.com', name: 'RBM West', role: 'RBM', region: 'West', zone: 'Mumbai Zone' }, { email: 'zbh@royalenfield.com', name: 'ZBH Mumbai', role: 'ZBH', region: 'West', zone: 'Mumbai Zone' }, { email: 'dealer@example.com', name: 'Amit Sharma', role: 'Dealer', region: 'West', zone: 'Mumbai Zone' }, ]; for (const user of users) { const result = await query( `INSERT INTO users (email, password, full_name, role, region, zone, phone) VALUES ($1, $2, $3, $4, $5, $6, $7) ON CONFLICT (email) DO NOTHING RETURNING id`, [user.email, hashedPassword, user.name, user.role, user.region, user.zone, '+91-9876543210'] ); if (result.rows.length > 0) { console.log(` Added: ${user.email} (${user.role})`); } } console.log('āœ… Users added\n'); // 4. Seed outlets for dealer console.log('Adding outlets...'); const dealerResult = await query('SELECT id FROM users WHERE email = $1', ['dealer@example.com']); if (dealerResult.rows.length > 0) { const dealerId = dealerResult.rows[0].id; const outlets = [ { code: 'DL-MH-001', name: 'Royal Enfield Mumbai', type: 'Dealership', address: 'Plot No. 45, Linking Road, Bandra West', city: 'Mumbai', state: 'Maharashtra', lat: 19.0596, lon: 72.8295 }, { code: 'ST-MH-002', name: 'Royal Enfield Andheri Studio', type: 'Studio', address: 'Shop 12, Phoenix Market City, Kurla', city: 'Mumbai', state: 'Maharashtra', lat: 19.0822, lon: 72.8912 }, { code: 'DL-MH-003', name: 'Royal Enfield Thane Dealership', type: 'Dealership', address: 'Eastern Express Highway, Thane West', city: 'Thane', state: 'Maharashtra', lat: 19.2183, lon: 72.9781 }, { code: 'ST-MH-004', name: 'Royal Enfield Pune Studio', type: 'Studio', address: 'FC Road, Deccan Gymkhana', city: 'Pune', state: 'Maharashtra', lat: 18.5204, lon: 73.8567 } ]; for (const outlet of outlets) { await query( `INSERT INTO outlets (dealer_id, code, name, type, address, city, state, status, established_date, latitude, longitude) VALUES ($1, $2, $3, $4, $5, $6, $7, 'Active', '2020-01-15', $8, $9) ON CONFLICT (code) DO NOTHING`, [dealerId, outlet.code, outlet.name, outlet.type, outlet.address, outlet.city, outlet.state, outlet.lat, outlet.lon] ); } console.log('āœ… Outlets added\n'); } console.log('āœ… Database seeding completed successfully!'); console.log('\nšŸ“ Test Credentials:'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); console.log('Email: admin@royalenfield.com'); console.log('Email: dealer@example.com'); console.log('Email: finance@royalenfield.com'); console.log('Email: ddlead@royalenfield.com'); console.log('\nPassword (all users): Password@123'); console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n'); process.exit(0); } catch (error) { console.error('āŒ Seeding failed:', error); process.exit(1); } } seedDatabase();