Sembrar planes y usuarios demo (admin + owner logueable)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Carlos Narro
2026-05-30 19:47:11 +02:00
parent 6add2f93ea
commit e1f12f94c6

View File

@@ -5,6 +5,7 @@ import * as schema from './schema';
import { eq, sql } from 'drizzle-orm'; import { eq, sql } from 'drizzle-orm';
import { computeBudget } from '../budget'; import { computeBudget } from '../budget';
import type { BudgetInputs } from '../budget/types'; import type { BudgetInputs } from '../budget/types';
import { hashPassword } from '../lib/auth/password';
const connectionString = process.env.DATABASE_URL; const connectionString = process.env.DATABASE_URL;
if (!connectionString) { if (!connectionString) {
@@ -283,9 +284,52 @@ async function main() {
console.log('Limpiando datos previos...'); console.log('Limpiando datos previos...');
await db.execute( await db.execute(
sql`TRUNCATE TABLE ${schema.precisionHistory}, ${schema.leadPipelineEventos}, ${schema.leadEstadoHistory}, ${schema.leadFotos}, ${schema.leads}, ${schema.tenants} RESTART IDENTITY CASCADE` sql`TRUNCATE TABLE ${schema.precisionHistory}, ${schema.leadPipelineEventos}, ${schema.leadEstadoHistory}, ${schema.leadFotos}, ${schema.leads}, ${schema.sessions}, ${schema.users}, ${schema.plans}, ${schema.tenants} RESTART IDENTITY CASCADE`
); );
console.log('Sembrando planes...');
const [, pro] = await db
.insert(schema.plans)
.values([
{
slug: 'starter',
nombre: 'Starter',
precioMensual: 2900,
leadsIncluidos: 5,
features: ['5 leads procesados / mes', '3 €/lead extra', 'Hasta 100 contactos', 'Branding básico'],
},
{
slug: 'pro',
nombre: 'Pro',
precioMensual: 7900,
leadsIncluidos: 15,
features: [
'15 leads procesados / mes',
'2,50 €/lead extra',
'White-label completo',
'Sub-flujo licencia urbanística',
'Integraciones Holded/Stel',
'Soporte prioritario',
],
},
{
slug: 'business',
nombre: 'Business',
precioMensual: 19900,
leadsIncluidos: 50,
features: [
'50 leads procesados / mes',
'2 €/lead extra',
'Usuarios ilimitados',
'API',
'Multi-zona',
'Custom price book',
'Dashboard analytics',
],
},
])
.returning();
console.log('Creando tenant "Reformas Ejemplo"...'); console.log('Creando tenant "Reformas Ejemplo"...');
const [tenant] = await db const [tenant] = await db
.insert(schema.tenants) .insert(schema.tenants)
@@ -294,9 +338,30 @@ async function main() {
nombreEmpresa: 'Reformas Ejemplo', nombreEmpresa: 'Reformas Ejemplo',
provincia: 'Madrid', provincia: 'Madrid',
whatsappBusiness: '+34 600 000 000', whatsappBusiness: '+34 600 000 000',
planId: pro.id,
subscriptionStatus: 'trial',
trialEndsAt: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000),
}) })
.returning(); .returning();
console.log('Creando usuarios demo (admin + owner)...');
await db.insert(schema.users).values([
{
email: 'admin@reformix.es',
passwordHash: await hashPassword('AdminReformix2026!'),
nombre: 'Admin Reformix',
role: 'admin',
tenantId: null,
},
{
email: 'demo@reformas-ejemplo.es',
passwordHash: await hashPassword('DemoReformix2026!'),
nombre: 'Reformas Ejemplo',
role: 'reformista',
tenantId: tenant.id,
},
]);
console.log(`Insertando ${SEED_LEADS.length} leads...`); console.log(`Insertando ${SEED_LEADS.length} leads...`);
for (const l of SEED_LEADS) { for (const l of SEED_LEADS) {
const createdAt = new Date(Date.now() - l.daysAgo * 24 * 60 * 60 * 1000); const createdAt = new Date(Date.now() - l.daysAgo * 24 * 60 * 60 * 1000);