# Arquitectura — INVENTORY-OPT

## Problema
La pantalla admin de inventario no escala a 10k+ productos porque hoy:
- pide `productsApi.list(limit=100)`
- por cada producto hace `getVariants`
- por cada fila hace `getAvailability`
- por cada fila hace `getVariantPrice`

Eso introduce N+1 HTTP + N+1 SQL y además no tiene paginación real del inventario.

## Diseño propuesto

### 1) Nuevo endpoint backend optimizado
Crear `GET /inventory/admin/overview` en el módulo `inventory`.

Query params:
- `q`
- `filter`
- `limit`
- `offset`

Respuesta:
- `items[]` con fila ya enriquecida (producto + variante + stock + precio + caducidad)
- `total`
- `stats` con conteos globales (`inStock`, `lowStock`, `outOfStock`)

### 2) Query única paginada
La query leerá directamente:
- `catalog_products`
- `catalog_product_variants`
- `inventory_stock`
- `pricing_variant_prices`

Con esto evitamos las múltiples rondas actuales desde el admin.

### 3) Filtros server-side
Mover al backend los filtros ya visibles en UI:
- `all`
- `in_stock`
- `low_stock`
- `out_of_stock`
- `expiring`
- `low_margin`

### 4) UI admin
Actualizar `project/apps/admin/src/app/(dashboard)/inventory/page.tsx` para:
- consumir el nuevo endpoint
- usar paginación real
- mantener búsqueda debounced
- mantener filtros existentes
- evitar llamadas por fila

## No entra
- Refactor de módulos no relacionados
- Reescritura de pricing o inventory core
- Cambios en TPV/storefront

## Validación
- typecheck backend/admin
- build backend/admin
- verify.sh
- prueba funcional manual de búsqueda/filtros/paginación
