Seed catálogo y presupuesto calculado para lead demo
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 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,8 @@ import { drizzle } from 'drizzle-orm/postgres-js';
|
|||||||
import postgres from 'postgres';
|
import postgres from 'postgres';
|
||||||
import * as schema from './schema';
|
import * as schema from './schema';
|
||||||
import { eq, sql } from 'drizzle-orm';
|
import { eq, sql } from 'drizzle-orm';
|
||||||
|
import { computeBudget } from '../budget';
|
||||||
|
import type { BudgetInputs } from '../budget/types';
|
||||||
|
|
||||||
const connectionString = process.env.DATABASE_URL;
|
const connectionString = process.env.DATABASE_URL;
|
||||||
if (!connectionString) {
|
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.catalogItems).where(eq(schema.catalogItems.tenantId, tenantRow.id));
|
||||||
await db.delete(schema.pricingConfig).where(eq(schema.pricingConfig.tenantId, tenantRow.id));
|
await db.delete(schema.pricingConfig).where(eq(schema.pricingConfig.tenantId, tenantRow.id));
|
||||||
|
|
||||||
await db.insert(schema.pricingConfig).values({
|
const [config] = await db
|
||||||
|
.insert(schema.pricingConfig)
|
||||||
|
.values({
|
||||||
tenantId: tenantRow.id,
|
tenantId: tenantRow.id,
|
||||||
alturaTechoDefault: 2.5,
|
alturaTechoDefault: 2.5,
|
||||||
factorZona: { Madrid: 1.1, Barcelona: 1.15, Valencia: 1.0, Sevilla: 0.95 },
|
factorZona: { Madrid: 1.1, Barcelona: 1.15, Valencia: 1.0, Sevilla: 0.95 },
|
||||||
manoObra: { demolicion: 1800, fontaneria: 2200, electricidad: 1600, mano_de_obra: 3500 },
|
manoObra: { demolicion: 1800, fontaneria: 2200, electricidad: 1600, mano_de_obra: 3500 },
|
||||||
});
|
})
|
||||||
|
.returning();
|
||||||
|
|
||||||
const cat = (
|
const cat = (
|
||||||
categoria: 'suelo' | 'pared' | 'pintura' | 'mobiliario',
|
categoria: 'suelo' | 'pared' | 'pintura' | 'mobiliario',
|
||||||
@@ -401,7 +406,7 @@ async function main() {
|
|||||||
sku,
|
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', '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 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'),
|
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 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 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'),
|
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.
|
// 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: 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
|
await db
|
||||||
.update(schema.leads)
|
.update(schema.leads)
|
||||||
.set({ m2Suelo: 12, calidadGlobal: 'media', estructural: false })
|
.set({
|
||||||
.where(eq(schema.leads.email, 'roberto.salas@example.com'));
|
presupuestoEstimado: result.total,
|
||||||
|
desgloseSnapshot: { stage: roberto.pipelineStage, result },
|
||||||
|
})
|
||||||
|
.where(eq(schema.leads.id, roberto.id));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Seed completado.');
|
console.log('Seed completado.');
|
||||||
|
|||||||
Reference in New Issue
Block a user