Saltar a contenido

ADR-0002 · Stock real de combos: min(floor(stock/cantidad)), no exclusivo entre combos

  • Estado: aceptado
  • Decisores: desarrollador de PC Manager (equipo TI Compulandia)
  • Fecha de la decisión: 2026-07-17

Contexto y problema

Hasta 2026-07 el stock que se enviaba al Integrador por un combo era binario (1 disponible / 0 no disponible). Eso produjo un bug real: un combo "2x1" que requería 2 unidades de un componente con stock 1 figuraba disponible. Además la tienda no podía mostrar cuántas unidades del combo se podían vender.

Opciones consideradas

  1. Stock real: min(floor(stock_componente / cantidad_requerida)) sobre los componentes asignados, sin reservar unidades entre combos
  2. Mantener el binario 1/0
  3. Stock exclusivo con reserva de unidades entre combos que comparten componentes (no se implementó por su complejidad)

Decisión

Product.calculate_component_stock() calcula cuántos combos completos se pueden armar: el mínimo de floor(stock/cantidad) entre los componentes asignados. Los componentes de categoría SERVICIO no participan (no limitan stock físico); los regalos sí. Si el resultado es 0, el combo pasa además a is_available = False. Se acepta deliberadamente que los stocks no son exclusivos: dos combos que comparten un componente cuentan las mismas unidades físicas.

Consecuencias

Positivas

  • La tienda recibe una cantidad vendible real, no un binario.
  • Corrigió el bug del combo 2x1 con stock insuficiente (verificado end-to-end con PCM-12163).

Negativas / deuda asumida

  • Sobreventa posible entre combos que comparten componentes: vender uno no descuenta el stock reportado del otro hasta que el ciclo push→recepción→ push propague el nuevo stock del componente. La API de recepción (contrato en docs/integraciones/integrador/) reduce esa ventana al round-trip de dos requests, pero no la elimina.
  • Los combos creados antes del cambio conservan el stock guardado hasta que algo los reevalúe (pendiente: reevaluación masiva inicial).