fix: correct factorZona zero handling and confidence for unresolved selections

This commit is contained in:
Carlos Narro
2026-05-30 12:28:10 +02:00
parent 58d3f62a76
commit e6f8b47205
2 changed files with 29 additions and 2 deletions

View File

@@ -81,10 +81,12 @@ export function computeBudget(
}));
const subtotal = partidas.reduce((s, p) => s + p.importe, 0);
const factorZona = (inputs.provincia && config.factorZona[inputs.provincia]) || 1;
const factorZona = config.factorZona[inputs.provincia ?? ''] ?? 1;
const total = Math.round(subtotal * factorZona);
const hasExact = Object.keys(inputs.materialSelections).length > 0;
const hasExact = (Object.values(inputs.materialSelections) as string[]).some(
(id) => catalog.some((c) => c.id === id),
);
const hasM2 = inputs.m2Suelo != null && inputs.m2Suelo > 0;
let confianza: BudgetResult['confianza'];
let band: number;

View File

@@ -76,4 +76,29 @@ describe('computeBudget', () => {
const r = computeBudget(inputs({}), config, sinPintura);
expect(r.avisos.some((a) => a.includes('pintura'))).toBe(true);
});
it('usa factor zona 1 para provincia desconocida', () => {
const r = computeBudget(inputs({ provincia: 'Cuenca' }), config, catalog);
expect(r.factorZona).toBe(1);
expect(r.total).toBe(536000); // subtotal sin factor
});
it('respeta un factor zona explícito de 0', () => {
const configZero: PricingConfig = { ...config, factorZona: { ...config.factorZona, Madrid: 0 } };
const r = computeBudget(inputs({ provincia: 'Madrid' }), configZero, catalog);
expect(r.factorZona).toBe(0);
expect(r.total).toBe(0);
});
it('no sube la confianza si la selección apunta a un material inexistente', () => {
const r = computeBudget(inputs({ materialSelections: { suelo: 'no-existe' } }), config, catalog);
expect(r.confianza).toBe('media'); // tiene m² pero la selección no resuelve -> no es alta
});
it('omite carpintería y no rompe para tipos sin mobiliario (salón)', () => {
const r = computeBudget(inputs({ tipoReforma: 'salon' }), config, catalog);
const byKey = Object.fromEntries(r.partidas.map((p) => [p.key, p.importe]));
expect(byKey.carpinteria).toBeUndefined();
expect(r.total).toBeGreaterThan(0);
});
});