# US-MGN-005-004-001: Visualizar Stock por Ubicación (Quants)

**RF Asociado:** [RF-MGN-005-003](../../02-modelado/requerimientos-funcionales/mgn-005/RF-MGN-005-003-movimientos-de-stock.md)
**Módulo:** MGN-005 - Inventario Básico
**Epic:** Stock Quants
**Prioridad:** P0
**Story Points:** 4
**Sprint:** Sprint 10
**Estado:** Ready for Development
**Fecha:** 2025-11-24

---

## User Story

**Como** usuario de inventario,
**Quiero** visualizar el stock disponible por producto y ubicación (quants),
**Para** conocer dónde está almacenado cada producto y sus cantidades.

---

## Descripción Detallada

Los stock quants (inventory.stock_quants) representan cantidades físicas de producto en ubicaciones específicas. Cada quant tiene:
- product_id: Producto
- location_id: Ubicación
- quantity: Cantidad disponible
- reserved_quantity: Cantidad reservada para pedidos

Esta US permite visualizar quants con filtros por producto, ubicación, almacén y estado (disponible, reservado).

---

## Criterios de Aceptación

### Escenario 1: Listar quants de un producto (Camino Feliz)
**Dado que** consulto quants del producto_id=1,
**Cuando** obtengo la lista,
**Entonces** el sistema retorna todos los quants con location, quantity, available_quantity.

### Escenario 2: Filtrar quants por ubicación
**Dado que** consulto quants con location_id=10,
**Cuando** obtengo la lista,
**Entonces** el sistema retorna solo quants de esa ubicación.

### Escenario 3: Calcular stock disponible (available = quantity - reserved)
**Dado que** quant tiene quantity=10 y reserved_quantity=3,
**Cuando** consulto el quant,
**Entonces** el sistema muestra available_quantity=7.

### Escenario 4: Visualizar stock agregado por producto
**Dado que** consulto stock total de product_id=1,
**Cuando** obtengo el agregado,
**Entonces** el sistema suma quantities de todos los quants del producto.

---

## Reglas de Negocio

- **RN-1:** Quants muestran stock por ubicación específica.
- **RN-2:** available_quantity = quantity - reserved_quantity.
- **RN-3:** Quants con quantity=0 pueden ocultarse en la vista.
- **RN-4:** RLS filtra quants por empresa.

---

## Tareas Técnicas

### Backend
- [ ] Endpoint: GET /api/v1/inventory/stock-quants
- [ ] Endpoint: GET /api/v1/inventory/stock-quants/by-product/:productId
- [ ] Endpoint: GET /api/v1/inventory/stock-quants/by-location/:locationId
- [ ] Service: QuantService.findAll(filters)
- [ ] Service: QuantService.getStockByProduct(productId)
- [ ] DTO: QueryQuantsDto (product_id, location_id, warehouse_id, include_zero)
- [ ] Calcular available_quantity
- [ ] Agregación por producto/ubicación
- [ ] Unit tests
- [ ] Integration tests
- [ ] Swagger docs

### Frontend
- [ ] Componente: StockQuantsTable.tsx
- [ ] Página: StockQuantsPage.tsx (/inventory/stock-quants)
- [ ] Filtros: producto, ubicación, almacén
- [ ] API client: quantApi.getAll(filters)
- [ ] State management: useQuantStore
- [ ] Component tests
- [ ] E2E test: "should view stock quants"

### Database
- [ ] Tabla: inventory.stock_quants
- [ ] Índices: idx_stock_quants_product_location
- [ ] View: vw_stock_available (con available_quantity calculado)
- [ ] RLS policy: company_isolation_quants

---

## Mockups / Wireframes

**Lista Stock Quants:**
```
┌─────────────────────────────────────────────────────┐
│ Stock por Ubicación                                │
├─────────────────────────────────────────────────────┤
│ Filtros:                                           │
│ Producto: [Select ▼] Ubicación: [Select ▼]       │
│ [ Ocultar stock cero ]                            │
├─────────────────────────────────────────────────────┤
│ Producto      │Ubicación │Cantidad│Reservado│Disp.│
│───────────────┼──────────┼────────┼─────────┼─────│
│ Laptop HP     │Zona A-P1 │  10    │   3     │  7  │
│ Laptop HP     │Zona B-P2 │   5    │   0     │  5  │
│ Mouse Óptico  │Zona A-P1 │  50    │  10     │ 40  │
│───────────────┼──────────┼────────┼─────────┼─────│
│ TOTAL:                   │  65    │  13     │ 52  │
└─────────────────────────────────────────────────────┘
```

---

## Casos de Prueba

### Funcionales
1. **TC-001:** Listar quants por producto
2. **TC-002:** Filtrar quants por ubicación
3. **TC-003:** Calcular available_quantity correctamente
4. **TC-004:** Agregado de stock por producto
5. **TC-005:** RLS filtra por empresa

### No Funcionales
1. **Performance:** < 300ms para listar quants
2. **Seguridad:** JWT + permiso inventory_user

---

## Dependencias

- **US bloqueantes:** US-MGN-005-003-002 (Validar Movimiento - crea quants)
- **Módulos requeridos:** MGN-001, MGN-002
- **Datos maestros:** Ninguno

---

## Notas de Implementación

- Considerar crear vista materializada para consultas frecuentes
- Frontend: Actualizar en tiempo real con polling o WebSocket
- Agregar indicador visual para stock bajo (threshold)

---

## Estimación Detallada

| Tarea | Horas |
|-------|-------|
| Backend | 2 |
| Frontend | 2.5 |
| Testing | 1.5 |
| Code Review | 0.5 |
| **TOTAL** | **6.5 horas = 4 SP** |

---

## Definition of Done

- [ ] Código implementado según ET
- [ ] Tests pasando (>80%)
- [ ] Code review aprobado
- [ ] Documentación actualizada
- [ ] Swagger docs completo
- [ ] RLS aplicado
- [ ] QA validado
- [ ] PO aprobado

---

## Referencias

- [RF-MGN-005-003](../../02-modelado/requerimientos-funcionales/mgn-005/RF-MGN-005-003-movimientos-de-stock.md)
- [ET Backend](../../02-modelado/especificaciones-tecnicas/backend/mgn-005/ET-BACKEND-MGN-005-003-movimientos-de-stock.md)
- [ET Frontend](../../02-modelado/especificaciones-tecnicas/frontend/mgn-005/ET-FRONTEND-MGN-005-003-movimientos-de-stock.md)
- [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-005.yaml)
- [Schema](../../02-modelado/database-design/schemas/inventory-schema-ddl.sql)
