feat: add budget domain types and partida labels

This commit is contained in:
Carlos Narro
2026-05-30 12:17:04 +02:00
parent 515e9fd7a2
commit 9b14dbfac5
2 changed files with 84 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
import type { PartidaKey } from './types';
export const PARTIDA_ORDER: PartidaKey[] = [
'demolicion',
'alicatado',
'fontaneria',
'electricidad',
'carpinteria',
'mano_de_obra',
'extras',
'licencia',
];
export const PARTIDA_LABEL: Record<PartidaKey, string> = {
demolicion: 'Demolición',
alicatado: 'Alicatado y solado',
fontaneria: 'Fontanería',
electricidad: 'Electricidad',
carpinteria: 'Carpintería y mobiliario',
mano_de_obra: 'Mano de obra',
extras: 'Pintura y extras',
licencia: 'Licencia + Proyecto técnico',
};

View File

@@ -0,0 +1,61 @@
export type Calidad = 'basica' | 'media' | 'premium';
export type Unidad = 'm2' | 'ml' | 'ud';
export type CategoriaMaterial = 'suelo' | 'pared' | 'pintura' | 'mobiliario';
export type TipoReforma = 'cocina' | 'bano' | 'salon' | 'comedor' | 'integral' | 'otro';
export type PartidaKey =
| 'demolicion'
| 'alicatado'
| 'fontaneria'
| 'electricidad'
| 'carpinteria'
| 'mano_de_obra'
| 'extras'
| 'licencia';
export type ManoObraKey = 'demolicion' | 'fontaneria' | 'electricidad' | 'mano_de_obra';
export interface CatalogItem {
id: string;
categoria: CategoriaMaterial;
nombre: string;
calidad: Calidad;
precioUnit: number; // céntimos por unidad
unidad: Unidad;
descriptorRender: string;
esDefault: boolean;
sku: string;
}
export interface PricingConfig {
alturaTechoDefault: number; // metros
factorZona: Record<string, number>; // provincia -> multiplicador
manoObra: Record<ManoObraKey, number>; // céntimos por m² de suelo
}
export interface BudgetInputs {
tipoReforma: TipoReforma;
m2Suelo: number | null;
alturaTecho: number | null;
calidadGlobal: Calidad;
estructural: boolean;
provincia: string | null;
materialSelections: Partial<Record<CategoriaMaterial, string>>; // categoria -> catalogItemId
}
export interface PartidaResult {
key: PartidaKey;
label: string;
importe: number; // céntimos (base, antes de factor zona)
}
export interface BudgetResult {
partidas: PartidaResult[];
subtotal: number; // céntimos
factorZona: number;
total: number; // céntimos = round(subtotal * factorZona)
rango: { min: number; max: number }; // céntimos
confianza: 'baja' | 'media' | 'alta';
materialesRender: string[]; // descriptores para el prompt del render
avisos: string[];
}