feat: resolve unit price from catalog with selection override
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
18
mvp/b2c/src/budget/resolve.ts
Normal file
18
mvp/b2c/src/budget/resolve.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import type { Calidad, CategoriaMaterial, CatalogItem } from './types';
|
||||
|
||||
export function resolvePrecioUnitario(
|
||||
categoria: CategoriaMaterial,
|
||||
calidad: Calidad,
|
||||
catalog: CatalogItem[],
|
||||
selections: Partial<Record<CategoriaMaterial, string>>,
|
||||
): { item: CatalogItem | null } {
|
||||
const selectedId = selections[categoria];
|
||||
if (selectedId) {
|
||||
const selected = catalog.find((c) => c.id === selectedId);
|
||||
if (selected) return { item: selected };
|
||||
}
|
||||
const def = catalog.find(
|
||||
(c) => c.categoria === categoria && c.calidad === calidad && c.esDefault,
|
||||
);
|
||||
return { item: def ?? null };
|
||||
}
|
||||
25
mvp/b2c/tests/budget/resolve.test.ts
Normal file
25
mvp/b2c/tests/budget/resolve.test.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import { resolvePrecioUnitario } from '@/budget/resolve';
|
||||
import type { CatalogItem } from '@/budget/types';
|
||||
|
||||
const catalog: CatalogItem[] = [
|
||||
{ id: 's-media', categoria: 'suelo', nombre: 'Cerámico medio', calidad: 'media', precioUnit: 2800, unidad: 'm2', descriptorRender: 'suelo cerámico gris', esDefault: true, sku: 'SUE-M' },
|
||||
{ id: 's-premium', categoria: 'suelo', nombre: 'Porcelánico roble', calidad: 'premium', precioUnit: 4500, unidad: 'm2', descriptorRender: 'porcelánico símil roble', esDefault: true, sku: 'SUE-P' },
|
||||
];
|
||||
|
||||
describe('resolvePrecioUnitario', () => {
|
||||
it('devuelve el default de la calidad cuando no hay selección', () => {
|
||||
const { item } = resolvePrecioUnitario('suelo', 'media', catalog, {});
|
||||
expect(item?.id).toBe('s-media');
|
||||
});
|
||||
|
||||
it('prioriza la selección exacta sobre la calidad global', () => {
|
||||
const { item } = resolvePrecioUnitario('suelo', 'media', catalog, { suelo: 's-premium' });
|
||||
expect(item?.id).toBe('s-premium');
|
||||
});
|
||||
|
||||
it('devuelve null si no hay default para esa calidad ni selección', () => {
|
||||
const { item } = resolvePrecioUnitario('pared', 'media', catalog, {});
|
||||
expect(item).toBeNull();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user