feat: [TESIS-144] take the product detail status and units in flight from the API - #60
Conversation
…ht from the API The detail computed its badge with its own thresholds (500/200) and four levels, so NOR-003 read "available" in the catalog and "critical" in the detail. The header and every warehouse row now show the stock_status the API sends, through the same stockStatus mapping the catalog uses, and the front keeps no stock threshold of its own. It also shows what the API already sent and the screen discarded: the category, the API total, the units in flight apart from the total, and the incoming units of each warehouse, including warehouses that only wait for a transfer and have no stock row yet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Revisado. Lo veo bien para implementar. Arregla un bug que se ve en la demo: Lo que verifiqué
Antes de mergear Depende de proyecto-api#99, que expone |
TomasMartin2004
left a comment
There was a problem hiding this comment.
Revisión del diff completo. El código es idéntico al que leí cuando los PRs estaban en draft —ningún commit nuevo—, así que lo que sigue es el veredicto formal.
✅ Aprobado
Arregla un bug que se ve en la demo: NOR-003 sale «Disponible» en el catálogo y «Crítico» en el detalle del mismo producto, porque el front tenía umbrales propios (LOW_STOCK_UNITS = 500, CRITICAL_STOCK_UNITS = 200) y un cuarto nivel que el backend no tiene, mientras la API usa LOW_STOCK_THRESHOLD = 100.
Lo que verifiqué
- La dirección del fix es la correcta: se borran los umbrales del front y el estado pasa a venir del backend, en vez de copiar el 100 en el cliente. Copiarlo habría arreglado el síntoma y dejado la misma trampa para la próxima vez.
- El comentario de cabecera de
utils/stock.tsqueda actualizado y corrige la afirmación sobre el desglose de S12: el en tránsito está fuera del total, no adentro. Que eso quede escrito donde estaba la versión equivocada vale más que el fix en sí. - Comprometido y disponible-para-prometer se siguen mostrando sin dato en vez de en cero. Mismo criterio que el dashboard y correcto en el momento en que se escribió.
⚠️ Antes de mergear
- Depende de proyecto-api#99, que va primero.
- Choca con mi proyecto-web#79 (TESIS-163), que hace que esos dos números dejen de ser «—» y pasen a traer dato real desde la API (proyecto-api#115 los modela). No se contradicen —acá «sin dato» era la verdad; allá deja de serlo— pero tocan el mismo archivo. Sugiero mergear éste primero: el mío se apoya en que el
stock_statusya venga del backend.
…from the API (#60) The detail computed its badge with its own thresholds (500/200) and four levels, so NOR-003 read "available" in the catalog and "critical" in the detail. The header and every warehouse row now show the stock_status the API sends, through the same stockStatus mapping the catalog uses, and the front keeps no stock threshold of its own. It also shows what the API already sent and the screen discarded: the category, the API total, the units in flight apart from the total, and the incoming units of each warehouse, including warehouses that only wait for a transfer and have no stock row yet. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Ticket de Jira
https://proyectofinalfrlp.atlassian.net/browse/TESIS-144
Descripción
El detalle de producto (S12) calculaba el badge con umbrales propios del front (
LOW_STOCK_UNITS = 500,CRITICAL_STOCK_UNITS = 200) y un cuarto nivel «Crítico» que el backend no tiene. El catálogo usa elstock_statusde la API (umbral 100), así queNOR-003(130 unidades) salía «Disponible» en el catálogo y «Crítico» en el detalle. Este PR hace que el encabezado y cada fila de la distribución muestren el estado que manda el backend, con el mismo mapeo que el catálogo, y borra la regla duplicada.De paso muestra lo que la API ya enviaba y la pantalla descartaba: la categoría, el total calculado por la API y las unidades en tránsito.
Depende de proyecto-api#99 (card 001): ahí se agregan
stock_statusal detalle,stocks[].stock_statusein_transit_by_warehouse. Mergear la API primero.Decisiones que conviene mirar:
El en tránsito no es una porción del total. El diseño reparte el total en tres cubetas que suman el on hand. En el modelo real las unidades en tránsito ya salieron del depósito de origen y no llegaron al destino, así que la API las deja fuera de
total_stock. La cubeta «En tránsito» muestrainTransitQuantitycomo un número aparte y el pie del Stock maestro lo dice. Comprometido y disponible para prometer siguen en—.Depósitos que sólo esperan unidades. El destino de una transferencia puede no tener fila en
stockshasta recibirla. Se lista al final de la tabla con 0 en depósito y sus entrantes. El estado que se le muestra esout_of_stock: es lo único que el backend puede responder para cero unidades, no una regla nueva del front (está escrito endistributionPositions). El pie cuenta «depósitos con stock o en camino».El resalte de fila sigue al catálogo (
stockRowTone: sóloout_of_stock). Antes se resaltaban también las filas «Crítico» del umbral propio.ApiProduct/Productcategory,totalStock,stockStatus,inTransitQuantityeinTransitByWarehouse, y aApiStock/ProductStockstockStatus; los mapeatoProduct.ProductDetailPageel badge calculado porstockLabel/stockVariantdelstockStatusde la API (encabezado y filas).distributionPositionsenutils/stock.ts, que une las filas de stock con sus entrantes y suma los depósitos sólo-entrantes.LOW_STOCK_UNITS,CRITICAL_STOCK_UNITS,stockLevel,StockLevel,STOCK_LEVEL_STATUS,totalOnHandydetail.statusdecontent.ts.—si no tiene) y toma el total del Stock maestro detotalStock.Producten los tests deEditProductModal,conflictypayload.Evidencia visual
Pendiente de captura con la API de proyecto-api#99 levantada (los datos de la pantalla dependen de ese contrato). El comportamiento está cubierto por los tests de
ProductDetailPage.Cómo probar
Precondición: API con proyecto-api#99,
bin/rails db:seed, login con un usuario de Norte./inventoryy buscarNOR-003→ «Disponible».Electronics.Verificación:
npm run test(679 tests, 0 fallas),npm run lint,prettier --checkynpm run buildlimpios.Impacto y consideraciones
¿Introduce breaking changes?
No para el usuario. Requiere el contrato de proyecto-api#99: contra una API sin esos campos, el badge del detalle quedaría sin estado.
¿Requiere nuevas variables de entorno?
No
¿Afecta la arquitectura o genera un nuevo patrón?
No. Reutiliza
utils/stockStatus.ts, que ya era el lugar del mapeo de estados del catálogo.Posible conflicto:
TESIS-139-shopify-integrationtambién tocaProductDetailPage.tsx,api.tsytypes.ts(agrega la card de canales de venta). Son zonas distintas del archivo.🤖 Generated with Claude Code