From 96dedaf60cd8768404cb3e4075cc75b181d266a4 Mon Sep 17 00:00:00 2001 From: Carlos Narro Date: Sat, 30 May 2026 17:56:05 +0200 Subject: [PATCH] =?UTF-8?q?Seed=20cat=C3=A1logo=20y=20presupuesto=20calcul?= =?UTF-8?q?ado=20para=20lead=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calcula y persiste el desglose de Roberto Salas con computeBudget para que el detalle muestre un presupuesto generado real al abrir el panel. Co-Authored-By: Claude Opus 4.7 --- mvp/b2c/src/db/seed.ts | 51 ++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/mvp/b2c/src/db/seed.ts b/mvp/b2c/src/db/seed.ts index 321c2e9..e96dfbe 100644 --- a/mvp/b2c/src/db/seed.ts +++ b/mvp/b2c/src/db/seed.ts @@ -3,6 +3,8 @@ import { drizzle } from 'drizzle-orm/postgres-js'; import postgres from 'postgres'; import * as schema from './schema'; import { eq, sql } from 'drizzle-orm'; +import { computeBudget } from '../budget'; +import type { BudgetInputs } from '../budget/types'; const connectionString = process.env.DATABASE_URL; if (!connectionString) { @@ -374,12 +376,15 @@ async function main() { await db.delete(schema.catalogItems).where(eq(schema.catalogItems.tenantId, tenantRow.id)); await db.delete(schema.pricingConfig).where(eq(schema.pricingConfig.tenantId, tenantRow.id)); - await db.insert(schema.pricingConfig).values({ - tenantId: tenantRow.id, - alturaTechoDefault: 2.5, - factorZona: { Madrid: 1.1, Barcelona: 1.15, Valencia: 1.0, Sevilla: 0.95 }, - manoObra: { demolicion: 1800, fontaneria: 2200, electricidad: 1600, mano_de_obra: 3500 }, - }); + const [config] = await db + .insert(schema.pricingConfig) + .values({ + tenantId: tenantRow.id, + alturaTechoDefault: 2.5, + factorZona: { Madrid: 1.1, Barcelona: 1.15, Valencia: 1.0, Sevilla: 0.95 }, + manoObra: { demolicion: 1800, fontaneria: 2200, electricidad: 1600, mano_de_obra: 3500 }, + }) + .returning(); const cat = ( categoria: 'suelo' | 'pared' | 'pintura' | 'mobiliario', @@ -401,7 +406,7 @@ async function main() { sku, }); - await db.insert(schema.catalogItems).values([ + const catalog = await db.insert(schema.catalogItems).values([ cat('suelo', 'Gres cerámico básico', 'basica', 16, 'm2', 'suelo gres beige liso', 'SUE-B'), cat('suelo', 'Porcelánico símil madera', 'media', 28, 'm2', 'porcelánico símil roble claro', 'SUE-M'), cat('suelo', 'Porcelánico gran formato', 'premium', 48, 'm2', 'porcelánico gran formato gris piedra', 'SUE-P'), @@ -414,13 +419,35 @@ async function main() { cat('mobiliario', 'Muebles melamina', 'basica', 180, 'ml', 'muebles cocina melamina blanca', 'MOB-B'), cat('mobiliario', 'Muebles laminado', 'media', 320, 'ml', 'muebles cocina laminado roble con tirador integrado', 'MOB-M'), cat('mobiliario', 'Muebles lacado', 'premium', 550, 'ml', 'muebles cocina lacado mate antracita y encimera porcelánica', 'MOB-P'), - ]); + ]).returning(); - // Inputs demo en un lead ya avanzado para poder recalcular su presupuesto. - await db + // Inputs demo en un lead ya avanzado + presupuesto ya calculado para que el + // desglose sea visible al abrir el detalle (Roberto: integral 70 m², Barcelona). + const [roberto] = await db .update(schema.leads) - .set({ m2Suelo: 12, calidadGlobal: 'media', estructural: false }) - .where(eq(schema.leads.email, 'roberto.salas@example.com')); + .set({ m2Suelo: 70, calidadGlobal: 'media', estructural: false }) + .where(eq(schema.leads.email, 'roberto.salas@example.com')) + .returning(); + + if (roberto) { + const inputs: BudgetInputs = { + tipoReforma: roberto.tipoReforma ?? 'integral', + m2Suelo: roberto.m2Suelo, + alturaTecho: roberto.alturaTecho ?? null, + calidadGlobal: roberto.calidadGlobal ?? 'media', + estructural: roberto.estructural, + provincia: roberto.provincia ?? null, + materialSelections: {}, + }; + const result = computeBudget(inputs, config, catalog); + await db + .update(schema.leads) + .set({ + presupuestoEstimado: result.total, + desgloseSnapshot: { stage: roberto.pipelineStage, result }, + }) + .where(eq(schema.leads.id, roberto.id)); + } } console.log('Seed completado.');