# Plan: Módulo de Inventario Físico

## Contexto

La empresa necesita realizar inventario físico sin cerrar el negocio (inventario rodante). Los productos actualmente están cargados sin depósito asignado, por lo que el inventario sirve también para asignar productos a depósitos por primera vez.

## Decisiones confirmadas

| Decisión | Valor |
|---|---|
| Depósitos | Múltiples, se crean manualmente antes de empezar |
| Modalidad de carga | Mixto: planilla impresa + carga directa en sistema |
| Tipo de conteo | Simple (una persona por zona) |
| Ventas durante conteo | Ignorar — ajuste se aplica con lo contado |
| Organización del trabajo | Por depósito + categoría dentro de cada depósito |
| Aplicación del ajuste | Automática al cerrar zona (sin aprobación previa) |
| Identificación de productos | Manual por código o nombre |
| Productos no contados en zona | Se ponen en 0 al cerrar la zona |

---

## Estrategia general

1. El **supervisor** crea una sesión de inventario (ej: "Inventario Abril 2026")
2. Los empleados se asignan a zonas: **depósito + categoría**
3. Cada empleado abre su zona, busca productos por código/nombre y carga la cantidad encontrada
4. Al **cerrar una zona**: el sistema ajusta el stock automáticamente
   - Productos contados → stock = cantidad ingresada
   - Productos NO contados → stock = 0
   - Se asigna el depósito al producto si no estaba asignado
5. Para los que prefieren papel: se imprime una **planilla PDF** por depósito+categoría con columna en blanco para anotar

---

## Tablas nuevas

```sql
inventario_sesiones
  id            UUID PK
  empresa_id    UUID FK
  nombre        VARCHAR        -- "Inventario Abril 2026"
  estado        VARCHAR        -- 'abierto' | 'cerrado'
  created_at    TIMESTAMP
  cerrado_at    TIMESTAMP NULL

inventario_conteos
  id               UUID PK
  sesion_id        UUID FK → inventario_sesiones
  deposito_id      UUID FK → depositos
  categoria_id     UUID FK → categorias (NULL = sin categoría)
  producto_id      UUID FK → productos
  cantidad_contada DECIMAL
  usuario_id       UUID FK → usuarios
  created_at       TIMESTAMP
```

---

## Pantallas

### 1. Gestión de sesiones (supervisor)
- Crear nueva sesión con nombre
- Ver lista de sesiones con estado
- Ver zonas (depósito+categoría) dentro de cada sesión y su progreso (pendiente/en curso/completado)
- Cerrar sesión completa cuando todo esté listo

### 2. Pantalla de conteo (empleado)
- Selecciona sesión activa → depósito → categoría
- Lista de productos de esa combinación con campo de cantidad editable
- Búsqueda por código de producto o descripción
- Indicador visual: contado ✓ / pendiente
- Botón **"Cerrar zona"** → aplica ajuste automático en stock

### 3. Planilla imprimible (PDF)
- Filtro: depósito + categoría
- Genera PDF con columnas: Código | Descripción | Cantidad contada (en blanco)
- Ordenado alfabéticamente o por código

---

## Lógica de ajuste al cerrar zona

```
Para cada producto en (depósito + categoría):
  Si fue contado en esta sesión:
    → UPDATE stock_deposito SET cantidad_disponible = cantidad_contada
       WHERE producto_id = X AND deposito_id = Y
       (INSERT si no existe)
  Si NO fue contado:
    → UPDATE stock_deposito SET cantidad_disponible = 0
       (o INSERT con 0 si no existe)
  
  En ambos casos:
    → Asignar producto al depósito si no tenía stock_deposito registrado
```

---

## Endpoints backend

| Método | Ruta | Descripción |
|---|---|---|
| POST | `/inventario/sesiones` | Crear sesión |
| GET | `/inventario/sesiones` | Listar sesiones |
| PATCH | `/inventario/sesiones/:id/cerrar` | Cerrar sesión |
| GET | `/inventario/sesiones/:id/zonas` | Ver progreso por zona |
| POST | `/inventario/conteos` | Registrar/actualizar conteo de producto |
| GET | `/inventario/conteos` | Listar conteos de una sesión (filtros: deposito, categoria) |
| POST | `/inventario/zonas/cerrar` | Cerrar zona y aplicar ajuste de stock |
| GET | `/inventario/planilla/pdf` | Generar PDF planilla por depósito+categoría |

---

## Archivos a crear/modificar

| Archivo | Cambio |
|---|---|
| `prisma/migrations/...` | Nuevas tablas `inventario_sesiones` + `inventario_conteos` |
| `src/inventario/inventario.module.ts` | **NUEVO** módulo |
| `src/inventario/inventario.controller.ts` | **NUEVO** endpoints |
| `src/inventario/inventario.service.ts` | **NUEVO** lógica |
| `pos-ventas/src/pages/Inventario.jsx` | Agregar tab "Inventario Físico" |
| `pos-ventas/src/components/inventario/SesionesPanel.jsx` | **NUEVO** gestión de sesiones |
| `pos-ventas/src/components/inventario/ConteoPanel.jsx` | **NUEVO** pantalla de conteo |

---

## Flujo de trabajo típico

```
Supervisor:
  1. Crea sesión "Inventario Mayo 2026"
  2. Imprime planillas PDF por zona para empleados con papel

Empleado A (Heladeras - Depósito Principal):
  3a. Abre ConteoPanel → selecciona sesión → Depósito Principal → Heladeras
  3b. Va contando y cargando cantidades (o carga desde planilla papel)
  4a. Termina → click "Cerrar zona" → stock ajustado automáticamente

Empleado B (Celulares - Depósito Secundario):
  3c. Mismo proceso en paralelo

Supervisor:
  5. Ve progreso en SesionesPanel
  6. Cuando todas las zonas están completadas → cierra la sesión
```
