ADR-0006 · Un factor de categoría menor a 1 significa "precio sugerido de venta" y desactiva el margen mínimo¶
- Estado: aceptado
- Decisores: hquintero
- Fecha de la decisión: 2026-09-15
Contexto extenso: Auditoría del cálculo de precios de supplier_products, hallazgo H1 y decisiones D1–D3.
Contexto y problema¶
SupplierProduct::calculateAndStorePrices() asume que regular_price es un costo:
calcula precio × factor y le aplica como piso precio + margen_mínimo. Algunos
proveedores (NGO hoy) no envían costo sino precio sugerido de venta, y el negocio
quiere vender por debajo de ese precio con un factor como 0,90. Con la fórmula
original el piso siempre gana cuando el factor es menor a 1, así que el factor no
tenía ningún efecto y el producto se publicaba más caro que el precio sugerido.
Había que decidir cómo expresar "este precio es un precio de venta" sin agregar más configuración al ABM ni cambiar los syncs de proveedores.
Opciones consideradas¶
- Factor < 1 desactiva el margen mínimo (elegida). La magnitud del factor ya expresa la semántica: mayor o igual a 1 es un recargo sobre costo, menor a 1 es un descuento sobre precio de venta. El margen mínimo sólo tiene sentido en el primer caso.
- Flag explícito
price_is_retailensuppliersocategories. Más claro, pero agrega una columna, una migración, un campo en dos ABMs y una combinación inválida (flag activo con factor > 1) que habría que validar. - Aplicar el margen como porcentaje del precio final en lugar de piso absoluto. Cambia el comportamiento de todos los proveedores actuales; fuera de alcance.
Decisión¶
Se adopta la opción 1. En el cálculo de precios, el piso precio + margen_mínimo se
aplica sólo cuando el factor es mayor o igual a 1, tanto para el precio regular
como para el especial. El IVA sigue dependiendo únicamente de suppliers.iva_incl:
un proveedor que envía precios con IVA incluido debe estar marcado así en su
configuración. Al momento de esta decisión NGO sigue con iva_incl = 0 en dev y debe
marcarse desde el ABM de proveedores antes del recálculo masivo.
Para que la pérdida de la red que daba el margen no deje pasar errores de tipeo, el factor queda acotado en el ABM de categorías y de escalas al rango 0,5 a 3, y el formulario explica la semántica de cada lado del 1.
Consecuencias¶
Positivas¶
- Corrige el precio publicado de los proveedores con precio sugerido sin tocar syncs ni esquema.
- La regla es una sola línea de decisión, visible en el ABM.
- Permite recalcular masivamente con
php artisan prices:recalculatey validar antes con--dry-run.
Negativas / deuda asumida¶
- La semántica queda implícita en un número. Un factor exactamente 1 sobre un precio sugerido aplica el margen mínimo, que en ese caso es un recargo no deseado; hay que configurar 0,99 o menos, o margen 0.
- Los factores existentes menores a 0,5 o mayores a 3 (hoy no hay ninguno) no pasarían la validación al editar la categoría.
- Sigue sin existir recálculo automático al cambiar la configuración de una categoría; hasta que se implemente, el comando de recálculo es el camino.