Añade impermeabilización, extras fijos y zonas al motor de presupuesto
Acerca el cálculo a tarifas de mercado sin rehacer el modelo lineal €/m²: - Impermeabilización como partida propia en zonas húmedas (cocina/baño/integral) - Extras fijos que no escalan con m²: boletín (siempre), tuberías (piso anterior a 2000) y cambio de distribución (mover inodoro/ducha/bañera) - Intensidad por tipo en fontanería/electricidad (baseline cocina) para que un integral no escale como un baño - Factor de zona por provincia en tramos (Madrid/BCN 1.40, islas 1.30, capitales 1.20, rural 0.85, resto 1.00) - 2 preguntas nuevas en el formulario del cliente para disparar los extras - Panel de precios: campo de impermeabilización + sección de extras fijos - Seed recalibrado (mano de obra, extras, catálogo suelo/pared) - Migración 0009 (leads.anterior_a_2000, leads.cambio_distribucion, pricing_config.extras) - Tests del motor ampliados (impermeabilización, extras, intensidad por tipo) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -199,6 +199,9 @@ export const leads = pgTable(
|
||||
alturaTecho: doublePrecision('altura_techo'),
|
||||
calidadGlobal: calidad('calidad_global'),
|
||||
estructural: boolean('estructural').notNull().default(false),
|
||||
// Inputs de los extras fijos del presupuesto (no escalan con m²).
|
||||
anteriorA2000: boolean('anterior_a_2000').notNull().default(false),
|
||||
cambioDistribucion: boolean('cambio_distribucion').notNull().default(false),
|
||||
materialSelections: jsonb('material_selections')
|
||||
.$type<Record<string, string>>()
|
||||
.notNull()
|
||||
@@ -340,6 +343,11 @@ export const pricingConfig = pgTable('pricing_config', {
|
||||
alturaTechoDefault: doublePrecision('altura_techo_default').notNull().default(2.5),
|
||||
factorZona: jsonb('factor_zona').$type<Record<string, number>>().notNull().default({}),
|
||||
manoObra: jsonb('mano_obra').$type<Record<string, number>>().notNull().default({}),
|
||||
// Extras fijos en céntimos: { tuberias, boletin, distribucion }.
|
||||
extras: jsonb('extras')
|
||||
.$type<{ tuberias: number; boletin: number; distribucion: number }>()
|
||||
.notNull()
|
||||
.default({ tuberias: 0, boletin: 0, distribucion: 0 }),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user