From e1f12f94c6f618b51ab448bc0f88907d7b687159 Mon Sep 17 00:00:00 2001 From: Carlos Narro Date: Sat, 30 May 2026 19:47:11 +0200 Subject: [PATCH] Sembrar planes y usuarios demo (admin + owner logueable) Co-Authored-By: Claude Sonnet 4.6 --- mvp/b2c/src/db/seed.ts | 67 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/mvp/b2c/src/db/seed.ts b/mvp/b2c/src/db/seed.ts index e96dfbe..fb7cb5c 100644 --- a/mvp/b2c/src/db/seed.ts +++ b/mvp/b2c/src/db/seed.ts @@ -5,6 +5,7 @@ import * as schema from './schema'; import { eq, sql } from 'drizzle-orm'; import { computeBudget } from '../budget'; import type { BudgetInputs } from '../budget/types'; +import { hashPassword } from '../lib/auth/password'; const connectionString = process.env.DATABASE_URL; if (!connectionString) { @@ -283,9 +284,52 @@ async function main() { console.log('Limpiando datos previos...'); 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"...'); const [tenant] = await db .insert(schema.tenants) @@ -294,9 +338,30 @@ async function main() { nombreEmpresa: 'Reformas Ejemplo', provincia: 'Madrid', whatsappBusiness: '+34 600 000 000', + planId: pro.id, + subscriptionStatus: 'trial', + trialEndsAt: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000), }) .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...`); for (const l of SEED_LEADS) { const createdAt = new Date(Date.now() - l.daysAgo * 24 * 60 * 60 * 1000);