Features: - Copy Previous Week (entries duplication) - Bulk Approve/Reject (admin workflow) - Overtime tracking (employee + admin views) - DayCard component with auto-save - PDF generation, email notifications - React + Tailwind frontend, Prisma + PostgreSQL backend - Docker deployment (3 containers)
101 lines
2.1 KiB
JavaScript
101 lines
2.1 KiB
JavaScript
const { PrismaClient } = require('@prisma/client');
|
||
const bcrypt = require('bcryptjs');
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
const DEFAULT_HOMEOWNERS = [
|
||
'Anderson, 217',
|
||
'Bakos',
|
||
'Beckstead, 111',
|
||
'Bentley, 310',
|
||
'Best, 103',
|
||
'Caraway, 132',
|
||
'Carmichael, M, 216',
|
||
'Casa Blanca',
|
||
'Chapin, 106',
|
||
'Conner, 309',
|
||
'Cook, 118',
|
||
'Coyle, 109',
|
||
'Davis, 114a',
|
||
'Dimmitt, 213',
|
||
'Dockery, 502',
|
||
'Fassett, 303C',
|
||
'Gypsy Wind',
|
||
'Hager, 108',
|
||
'Hanford, 308',
|
||
'Hitchcox – Clarry, 218',
|
||
'Hughes, 215',
|
||
'Kaufman 129 (Blue View)',
|
||
'Kuchman, 104',
|
||
'Lockhart, 301A',
|
||
'Lokey, 136',
|
||
'McColgan, 312',
|
||
'Mercurio, 523',
|
||
'Moff – Dean Elect',
|
||
'Rogers, 501',
|
||
'Rusten, 204A',
|
||
'Ryan, 301B',
|
||
'Salas, 144',
|
||
'Sear 128 (Twin Shores)',
|
||
'Shimp, 517',
|
||
'Sipprelle, 202',
|
||
'Trino, 131',
|
||
'Useppa Fire',
|
||
'Vogt',
|
||
'Weinsz, 141',
|
||
'Wendorf, 306',
|
||
'White (Rogan)',
|
||
'Williams, Bob, 140',
|
||
'Williams, Dan, 137B',
|
||
'Williamson-Whetstone, 102',
|
||
'Wilson, George, 516',
|
||
'Wright, 137A',
|
||
];
|
||
|
||
async function main() {
|
||
console.log('🌱 Seeding database...');
|
||
|
||
// Create admin user
|
||
const passwordHash = await bcrypt.hash('CoastalAdmin2026!', 12);
|
||
const admin = await prisma.user.upsert({
|
||
where: { email: 'admin@coastal.com' },
|
||
update: {},
|
||
create: {
|
||
email: 'admin@coastal.com',
|
||
name: 'Admin',
|
||
role: 'super_admin',
|
||
passwordHash,
|
||
},
|
||
});
|
||
console.log(`✅ Admin user created: ${admin.email}`);
|
||
|
||
// Create homeowners
|
||
let created = 0;
|
||
let skipped = 0;
|
||
for (const name of DEFAULT_HOMEOWNERS) {
|
||
try {
|
||
await prisma.homeowner.upsert({
|
||
where: { name },
|
||
update: {},
|
||
create: { name },
|
||
});
|
||
created++;
|
||
} catch (err) {
|
||
console.warn(`⚠️ Skipped homeowner "${name}": ${err.message}`);
|
||
skipped++;
|
||
}
|
||
}
|
||
console.log(`✅ Homeowners: ${created} created, ${skipped} skipped`);
|
||
|
||
console.log('🌱 Seed complete!');
|
||
}
|
||
|
||
main()
|
||
.catch((err) => {
|
||
console.error('❌ Seed failed:', err);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|