Sembrar planes y usuarios demo (admin + owner logueable)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user