ADR-0003 · Selección automática de componentes: uno por categoría, con prioridad → supplier preferido → stock¶
- Estado: aceptado
- Decisores: desarrollador de PC Manager (equipo TI Compulandia)
- Fecha de la decisión: la regla base no tiene fecha registrada (commits
de 2025-05);
always_includese agregó el 2025-11-13 y el criterio de supplier preferido el 2026-07-31
Contexto y problema¶
Un combo define varias relaciones componente-candidato por categoría (ej.: tres discos SSD alternativos), pero la receta publicada lleva uno solo por categoría. Si el elegido se queda sin stock, el combo debe sustituirlo solo, sin intervención del operador — y a la vez el operador necesita poder forzar elecciones (un componente específico, más de uno de la misma categoría, un regalo).
Opciones consideradas¶
- Selección automática por categoría con criterios ordenados y excepciones marcadas por el operador (implementada)
- Asignación 100 % manual del operador (estado previo implícito: sin sustitución automática, combos caídos hasta intervención humana)
Decisión¶
Product.select_components() elige, entre los candidatos activos y con
stock, un componente por categoría comparando en orden: 1) prioridad
explícita del operador (menor número gana), 2) supplier preferido
(PCM_PREFERRED_SUPPLIER_ID, default 1 = Compulandia), 3) mayor stock.
Excepciones: los componentes de categoría SERVICIO se asignan todos siempre,
y los marcados always_include se asignan además del ganador de su
categoría (permite N componentes de una misma categoría, ej. combos 2x1 o
con regalo). La reevaluación corre en cada guardado del combo, en el pull
diario (sync_components) y al recibir cambios por la API de recepción; si
la receta asignada cambió, se empuja al Integrador.
Consecuencias¶
Positivas¶
- Sustitución automática: un componente sin stock no tira el combo si hay alternativa en la categoría.
- El operador conserva control fino (prioridad,
always_include, regalos) sin renunciar a la automatización.
Negativas / deuda asumida¶
- Las sustituciones cambian la receta publicada sin intervención humana: un cambio de criterio (como el de supplier preferido de 2026-07-31) puede disparar sustituciones y pushes masivos en la siguiente reevaluación.
- Un
always_includesin stock deja el combo no disponible aunque el resto de la categoría tenga alternativas (falla frecuente n.º 1 del runbook). - La regla vive en un método largo y sin tests automatizados.