feat: migrate and seed pricing config + demo catalog
This commit is contained in:
@@ -363,6 +363,66 @@ async function main() {
|
||||
}
|
||||
}
|
||||
|
||||
// --- Precios + catálogo demo (motor de presupuesto) ---
|
||||
const [tenantRow] = await db
|
||||
.select()
|
||||
.from(schema.tenants)
|
||||
.where(eq(schema.tenants.slug, 'reformas-ejemplo'))
|
||||
.limit(1);
|
||||
|
||||
if (tenantRow) {
|
||||
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 cat = (
|
||||
categoria: 'suelo' | 'pared' | 'pintura' | 'mobiliario',
|
||||
nombre: string,
|
||||
calidad: 'basica' | 'media' | 'premium',
|
||||
precioEuros: number,
|
||||
unidad: 'm2' | 'ml' | 'ud',
|
||||
descriptorRender: string,
|
||||
sku: string,
|
||||
) => ({
|
||||
tenantId: tenantRow.id,
|
||||
categoria,
|
||||
nombre,
|
||||
calidad,
|
||||
precioUnit: Math.round(precioEuros * 100),
|
||||
unidad,
|
||||
descriptorRender,
|
||||
esDefault: true,
|
||||
sku,
|
||||
});
|
||||
|
||||
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'),
|
||||
cat('pared', 'Azulejo blanco brillo', 'basica', 14, 'm2', 'azulejo blanco brillo 20x20', 'PAR-B'),
|
||||
cat('pared', 'Azulejo rectificado', 'media', 24, 'm2', 'azulejo rectificado blanco mate 30x60', 'PAR-M'),
|
||||
cat('pared', 'Porcelánico decorativo', 'premium', 42, 'm2', 'porcelánico decorativo símil mármol', 'PAR-P'),
|
||||
cat('pintura', 'Plástica mate', 'basica', 6, 'm2', 'pintura plástica blanca mate', 'PIN-B'),
|
||||
cat('pintura', 'Plástica lavable', 'media', 9, 'm2', 'pintura lavable blanco roto', 'PIN-M'),
|
||||
cat('pintura', 'Esmalte premium', 'premium', 14, 'm2', 'esmalte al agua acabado seda gris perla', 'PIN-P'),
|
||||
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'),
|
||||
]);
|
||||
|
||||
// Inputs demo en un lead ya avanzado para poder recalcular su presupuesto.
|
||||
await db
|
||||
.update(schema.leads)
|
||||
.set({ m2Suelo: 12, calidadGlobal: 'media', estructural: false })
|
||||
.where(eq(schema.leads.email, 'roberto.salas@example.com'));
|
||||
}
|
||||
|
||||
console.log('Seed completado.');
|
||||
await client.end();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user