120 lines
4.0 KiB
TypeScript
120 lines
4.0 KiB
TypeScript
/**
|
||
* Script: create-vendedor-fernando.ts
|
||
*
|
||
* Crea la cuenta de Fernando (fernando@horuxfin.com) como Vendedor de Horux 360.
|
||
* Rol de plataforma: platform_sales (Vendedor).
|
||
* Membership en el tenant Horux 360 con rol cliente (minimo, solo para login
|
||
* y acceso a configuracion/cambio de contraseña).
|
||
*
|
||
* Si el usuario ya existe, le asigna/actualiza los permisos y envia un correo
|
||
* de notificacion. Si es nuevo, genera password temporal y envia bienvenida.
|
||
*
|
||
* Uso:
|
||
* cd apps/api && npx tsx scripts/create-vendedor-fernando.ts
|
||
*/
|
||
import { randomBytes } from 'crypto';
|
||
import { prisma } from '../src/config/database.js';
|
||
import { hashPassword } from '../src/auth/passwords.js';
|
||
import { emailService } from '../src/services/email/email.service.js';
|
||
import { invalidatePlatformRolesCache } from '../src/utils/platform-admin.js';
|
||
|
||
const EMAIL = 'fernando@horuxfin.com';
|
||
const NOMBRE = 'Fernando';
|
||
const HORUX_RFC = 'HTS240708LJA';
|
||
|
||
function generarPassword(): string {
|
||
return randomBytes(6).toString('hex'); // 12 caracteres hex
|
||
}
|
||
|
||
async function main() {
|
||
console.log(`🌱 Creando cuenta de Vendedor para ${EMAIL}...\n`);
|
||
|
||
// 1. Tenant raiz Horux 360
|
||
const tenant = await prisma.tenant.findUnique({ where: { rfc: HORUX_RFC } });
|
||
if (!tenant) throw new Error(`Tenant Horux 360 (${HORUX_RFC}) no encontrado. Ejecuta primero el bootstrap admin global.`);
|
||
|
||
// 2. Rol "cliente" para la membership (minimo acceso)
|
||
const clienteRol = await prisma.rol.findUnique({ where: { nombre: 'cliente' } });
|
||
if (!clienteRol) throw new Error('Rol "cliente" no encontrado en BD central');
|
||
|
||
// 3. Buscar o crear usuario
|
||
let user = await prisma.user.findUnique({ where: { email: EMAIL } });
|
||
let tempPassword: string | null = null;
|
||
let esNuevo = false;
|
||
|
||
if (!user) {
|
||
tempPassword = generarPassword();
|
||
const passwordHash = await hashPassword(tempPassword);
|
||
user = await prisma.user.create({
|
||
data: {
|
||
email: EMAIL,
|
||
passwordHash,
|
||
nombre: NOMBRE,
|
||
lastTenantId: tenant.id,
|
||
active: true,
|
||
},
|
||
});
|
||
esNuevo = true;
|
||
console.log(`✅ Usuario creado: ${user.email}`);
|
||
console.log(` Password temporal: ${tempPassword}`);
|
||
} else {
|
||
await prisma.user.update({
|
||
where: { id: user.id },
|
||
data: { lastTenantId: tenant.id, active: true },
|
||
});
|
||
console.log(`ℹ️ Usuario ya existia: ${user.email}`);
|
||
}
|
||
|
||
// 4. Membership en Horux 360 con rol cliente
|
||
await prisma.tenantMembership.upsert({
|
||
where: { userId_tenantId: { userId: user.id, tenantId: tenant.id } },
|
||
update: { rolId: clienteRol.id, active: true, isOwner: false },
|
||
create: {
|
||
userId: user.id,
|
||
tenantId: tenant.id,
|
||
rolId: clienteRol.id,
|
||
active: true,
|
||
isOwner: false,
|
||
},
|
||
});
|
||
console.log(`✅ Membership "cliente" en ${tenant.nombre}`);
|
||
|
||
// 5. Rol de plataforma Vendedor (platform_sales)
|
||
await prisma.userPlatformRole.upsert({
|
||
where: { userId_role: { userId: user.id, role: 'platform_sales' } },
|
||
update: {},
|
||
create: { userId: user.id, role: 'platform_sales' },
|
||
});
|
||
console.log(`✅ Rol de plataforma "Vendedor" (platform_sales) asignado`);
|
||
|
||
// 6. Invalidar cache de roles de plataforma
|
||
invalidatePlatformRolesCache(user.id);
|
||
|
||
// 7. Enviar correo con accesos (solo si es nuevo; si ya existia, no se reenvia password)
|
||
if (esNuevo && tempPassword) {
|
||
await emailService.sendWelcome(EMAIL, {
|
||
nombre: NOMBRE,
|
||
email: EMAIL,
|
||
tempPassword,
|
||
});
|
||
console.log(`✅ Correo de bienvenida con credenciales enviado a ${EMAIL}`);
|
||
} else {
|
||
console.log(`ℹ️ El usuario ya existia; no se envio correo con password`);
|
||
}
|
||
|
||
console.log('\n🎉 Cuenta de Vendedor lista');
|
||
console.log(` Email: ${EMAIL}`);
|
||
if (tempPassword) console.log(` Password temporal: ${tempPassword}`);
|
||
console.log(` Tenant: ${tenant.nombre} (${tenant.rfc})`);
|
||
console.log(` Rol de plataforma: platform_sales (Vendedor)`);
|
||
}
|
||
|
||
main()
|
||
.catch((err) => {
|
||
console.error('\n❌ Error:', err.message || err);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|