metallkart-erp/scripts/seed-beta-users.ts
louis f1d9d88526 feat(seed): BETA-SEED-S107 — bootstrap scripts for VPS BETA opening
- seed-beta-users.ts: 7 users (1 per ERP role), bcrypt 12, idempotent by email
- seed-beta-demo-data.ts: 2 clients + 2 suppliers + 3 products ACTIVE (smeta LOCKED + 10 pricings)
- ADM_GENERAL absent from Role enum → mapped to USER
- All ДЕМО_ prefixed for visual identification
- Login test 7/7 PASS, re-run safe (password NOT overwritten)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-18 17:38:16 +04:00

68 lines
2.9 KiB
TypeScript

import { PrismaClient, Role } from '@prisma/client';
import bcrypt from 'bcryptjs';
const prisma = new PrismaClient();
const BCRYPT_ROUNDS = 12;
const BETA_USERS: { email: string; name: string; nameRu: string; role: Role; password: string }[] = [
{ email: 'admin@metallcart.ru', name: 'Louis-André Gruart', nameRu: 'Луи-Андре Грюар', role: 'ADMIN', password: 'MetallKart_admin_2026!' },
{ email: 'direction-ops@metallcart.ru', name: 'Maksim (DIRECTION_OPS)',nameRu: 'Максим (DIRECTION_OPS)', role: 'DIRECTION_OPS', password: 'MetallKart_dirops_2026!' },
{ email: 'production@metallcart.ru', name: 'Darya (ADM_PRODUCTION)',nameRu: 'Дарья (ADM_PRODUCTION)', role: 'ADM_PRODUCTION', password: 'MetallKart_prod_2026!' },
{ email: 'achat@metallcart.ru', name: 'Evgeny (ACHETEUR)', nameRu: 'Евгений (ACHETEUR)', role: 'ACHETEUR', password: 'MetallKart_achat_2026!' },
{ email: 'commercial@metallcart.ru', name: 'Manager (COMMERCIAL)', nameRu: 'Менеджер коммерции', role: 'COMMERCIAL', password: 'MetallKart_com_2026!' },
{ email: 'direction-fin@metallcart.ru', name: 'FIN Director', nameRu: 'Финансовый директор', role: 'DIRECTION_FIN', password: 'MetallKart_dirfin_2026!' },
// ADM_GENERAL does not exist in Role enum — mapped to USER (closest generic role)
{ email: 'admin-general@metallcart.ru', name: 'General Admin', nameRu: 'Общая администрация', role: 'USER', password: 'MetallKart_admgen_2026!' },
];
async function main() {
console.log('=== SEED BETA USERS ===');
const validRoles = Object.values(Role);
let created = 0;
let skipped = 0;
for (const u of BETA_USERS) {
if (!validRoles.includes(u.role)) {
console.warn(` SKIP ${u.email} — role "${u.role}" does not exist in Role enum`);
skipped++;
continue;
}
const existing = await prisma.user.findUnique({ where: { email: u.email } });
if (existing) {
console.log(` EXISTS ${u.email} (role=${existing.role}) — password NOT overwritten`);
skipped++;
continue;
}
const hash = bcrypt.hashSync(u.password, BCRYPT_ROUNDS);
await prisma.user.create({
data: {
email: u.email,
password: hash,
name: u.name,
nameRu: u.nameRu,
role: u.role,
active: true,
},
});
console.log(` CREATED ${u.email} (role=${u.role})`);
created++;
}
console.log(`\nDone: ${created} created, ${skipped} skipped`);
const total = await prisma.user.count({ where: { email: { endsWith: '@metallcart.ru' } } });
console.log(`Total @metallcart.ru users in DB: ${total}`);
if (total > 30) {
console.error('WARNING: More than 30 @metallcart.ru users — verify this is expected');
}
}
main()
.catch(e => { console.error(e); process.exit(1); })
.finally(() => prisma.$disconnect());