# Checklist de pruebas WMS — Layout 2D + módulo completo

> **Cómo usar este documento:**
> - Marca `[x]` cuando el item funciona como esperás.
> - Si algo falla o tenés observaciones, escribe en la columna **Notas** o agregá un bloque debajo con detalles, screenshots, pasos para reproducir.
> - Si encontrás un bug bloqueante, marcalo con 🔴. Si es UX/menor, con 🟡.
> - Cuando termines, podés pasarme este MD y trabajamos sobre cada Nota pendiente.

**Setup previo recomendado:** `migrate:fresh --seed` para empezar limpio. Después abrir `/pos/wms/layout` y crear el layout de la bodega demo.

---

## 1 · Bodegas y layout

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Lista de bodegas | Abrir `/pos/wms/layout` | Muestra "Bodega Demo" con badge "Sin layout" |  |
| [ ] | Crear layout | Click `+` en una bodega sin layout | Redirige a `/pos/wms/layout/{id}`, auto-crea Piso 1 (L-12) |  |
| [ ] | Abrir editor existente | Click ícono `vector-pen` en una bodega con layout | Abre el editor del layout |  |
| [ ] | Versión del layout visible | Header del editor | Badge `v1` junto al nombre de la bodega |  |

---

## 2 · Pisos (multi-piso)

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Selector siempre visible | Toolbar | Aparece aunque haya un solo piso (L-10) |  |
| [ ] | Crear piso | Click `+` en grupo de pisos del toolbar | Modal con número/nombre/altura. Tras crear, queda activo y aparece en el dropdown |  |
| [ ] | Renombrar piso activo | Click `✏` | Modal con valores actuales pre-fill, guarda |  |
| [ ] | Eliminar piso vacío | Click `🗑` con piso vacío | Modal de confirmación. Tras confirmar, queda eliminado y se puede crear otro con el mismo número (L-23) |  |
| [ ] | Eliminar piso con contenido | Click `🗑` con habitaciones/racks/zonas adentro | Modal bloquea con conteo de hijos. NO permite confirmar (L-23) |  |
| [ ] | Cambiar piso activo | Dropdown del toolbar | Cambia lo que se muestra en el canvas (habitaciones, zonas, racks, elementos del piso) |  |
| [ ] | Onboarding piso vacío | Layout nuevo, primer entry al editor | Card central "Piso N sin contorno" con CTA "Dibujar contorno" (L-12) |  |

---

## 3 · Contorno del piso (paredes exteriores)

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Dibujar contorno manual | Botón "Contorno" (`C`) → click vértices → Enter o doble-click | Polígono cerrado con stroke azul grueso, label "Piso N · X m²" arriba-fuera del contorno (L-27) |  |
| [ ] | Crear contorno por medidas | "Por medidas" (`M`) → Tipo=Contorno → ancho×largo → Crear | Rectángulo centrado en viewport con 4 paredes acotadas (L-16) |  |
| [ ] | Reemplazar contorno existente | Dibujar contorno cuando ya hay uno | Modal de confirmación advierte que se reemplaza |  |
| [ ] | Aristas del contorno son paredes externas | Click sobre cualquier arista del contorno | Panel: tipo=pared, subtipo=exterior, grosor=0.15m (L-19) |  |
| [ ] | Medidas hacia el exterior | Mirá las labels de distancia | Quedan fuera del contorno, no encima del stroke (L-28) |  |
| [ ] | Click sobre el contorno | En modo Seleccionar | Marca el piso, panel lateral muestra info, vértices se hacen visibles (L-20) |  |
| [ ] | Eliminar contorno (eliminando vértices) | Click derecho sobre un vértice del contorno → Eliminar (cascade) | Borra vértice + aristas + entradas en pivot wms_piso_vertices (L-17) |  |

---

## 4 · Habitaciones

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Dibujar habitación manual | "Habitación" (`P`) → click vértices → Enter | Polígono con paredes interiores (`pared`/`interior`/0.10m). Modal pide solo nombre (L-14, L-19) |  |
| [ ] | Crear habitación por medidas | "Por medidas" (`M`) → Tipo=Habitación → ancho×largo+nombre | Rectángulo centrado, 4 paredes interiores |  |
| [ ] | Nombre en centroide | Hover sobre habitación | Label "Nombre · X m²" en el centro del polígono (L-27) |  |
| [ ] | Drag habitación como bloque | Modo Seleccionar → arrastrar el polígono | Mueve todos los vértices manteniendo forma (L-15) |  |
| [ ] | Magnetismo habitación → contorno | Arrastrar cerca del contorno del piso | Al soltar, se acopla si algún vértice queda a ≤14px (L-21) |  |
| [ ] | Editar medidas (resize) | Seleccionar → "Medidas" → cambiar ancho/largo | Polígono se reescala, distancias de paredes recalculan (L-24) |  |
| [ ] | Panel muestra zonas contenidas | Seleccionar habitación | Lista de zonas dentro con color y tipo, o "Ninguna" (L-14) |  |
| [ ] | Eliminar habitación | Click derecho → Eliminar | Borra habitación + pivot + vértices/aristas huérfanos (L-17) |  |

---

## 5 · Zonas operativas

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Dibujar zona dentro de habitación | Dropdown "Zona" → tipo → click vértices → Enter | Polígono con color del tipo, enlazada a la habitación contenedora (L-14) |  |
| [ ] | Dibujar zona en el hall | Dibujar zona fuera de habitaciones pero dentro del contorno del piso | Se crea sin habitación, validada contra contorno (L-26) |  |
| [ ] | Crear zona por medidas dentro de habitación | "Por medidas" → Tipo=Zona → centro cae en habitación | Se enlaza automáticamente (L-16, L-26) |  |
| [ ] | Crear zona por medidas en hall | "Por medidas" → Tipo=Zona → centro cae fuera de habitación | Se crea sin habitación (L-26) |  |
| [ ] | Crear zona fuera del contorno | "Por medidas" → ancho muy grande o cae afuera | Backend rechaza con "La zona se sale del contorno del piso" (L-26) |  |
| [ ] | Una habitación con N zonas | Crear 2+ zonas con tipos distintos dentro de la misma habitación | Conviven, cada una con su color (L-14) |  |
| [ ] | Nombre en TR del bbox | Hover sobre zona | Label "Nombre · tipo · X m²" en esquina superior derecha (L-28) |  |
| [ ] | Drag zona como bloque | Modo Seleccionar → arrastrar | Mueve todos los vértices (L-15) |  |
| [ ] | Magnetismo zona → contorno o habitación | Arrastrar cerca de paredes externas/internas | Se acopla a vértices o aristas a ≤14px (L-22) |  |
| [ ] | Editar medidas | Seleccionar → "Medidas" → nuevo ancho/largo | Se reescala preservando forma (L-24) |  |
| [ ] | Eliminar zona | Click derecho o panel → Eliminar | Borra zona + pivot + vértices huérfanos (L-17) |  |
| [ ] | Cambiar color | Seleccionar → input color en panel | Se actualiza inmediatamente |  |

---

## 6 · Aristas (paredes)

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Seleccionar arista | Click sobre stroke en modo Seleccionar | Panel lateral con tipo, distancia, grosor, subtipo |  |
| [ ] | Cambiar tipo de pared | Panel → dropdown tipo | Cambia entre pared/guía/borde_habitacion |  |
| [ ] | Cambiar grosor pared | Panel → input cm | Stroke se engrosa visualmente, opciones de subtipo aparecen |  |
| [ ] | Cambiar subtipo (interior/exterior/portón) | Panel → dropdown subtipo | Persiste, sin error |  |
| [ ] | Editar distancia (reescalado geométrico) | Panel → input "Distancia real" o modal `Editar distancia` | Vértice B se mueve a lo largo de A→B para reflejar nueva medida (L-15) |  |
| [ ] | Labels al exterior del polígono | Ver labels de distancia en habitación/contorno | Quedan en el lado de fuera del polígono (L-28) |  |
| [ ] | Halo blanco en labels | Acercar labels a otros shapes | Sigue legible aún cuando se superpone (L-27) |  |
| [ ] | Dividir arista (modo +Vértice) | Modo "+Vértice" (`N`) → click sobre arista | Se inserta vértice en el punto del click, divide en 2 aristas |  |
| [ ] | Eliminar arista | Click derecho → Eliminar | Borra arista + aberturas + vértices huérfanos (L-17) |  |

---

## 7 · Aberturas (puertas, ventanas, vanos, portones)

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Crear abertura | Modo "Abertura" (`A`) → click sobre arista tipo pared | Modal con tipo/ancho/posición/alto. Se crea sobre la pared |  |
| [ ] | Tipos visualmente distintos | Crear puerta, ventana, vano, portón | Colores distintivos cada uno |  |
| [ ] | Drag abertura a lo largo de la pared | Modo Seleccionar → arrastrar puerta | Se desliza solo en la dirección de la pared (constrained) (L-20) |  |
| [ ] | Drag con zoom ≠ 100% | Zoom in (Ctrl+wheel) → arrastrar puerta | Sin drift vertical: queda donde la soltás (L-25) |  |
| [ ] | Constraint en los extremos | Intentar arrastrar la puerta más allá del final de la pared | Se queda en el límite (no sale) |  |
| [ ] | Eliminar abertura | Click sobre abertura → Eliminar | Borra solo la abertura, la arista queda |  |

---

## 8 · Vértices

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Vértices ocultos por defecto | Modo Seleccionar sin selección | No se ven puntos azules (L-20) |  |
| [ ] | Vértices visibles al seleccionar | Click sobre habitación/zona/piso | Aparecen los vértices del shape seleccionado |  |
| [ ] | Vértices visibles en modos draw/edit | Entrar a Contorno/Habitación/Zona/Mover/+Vértice/Conectar | Aparecen todos los vértices del piso |  |
| [ ] | Drag de vértice individual | Modo "Mover" (`V`) → arrastrar vértice | Vértice se mueve, paredes conectadas se redibujan |  |
| [ ] | Snap a otros vértices al soltar | Arrastrar vértice cerca de otro | Se pega si está a ≤12px |  |
| [ ] | Eliminar vértice (cascade) | Click derecho → Eliminar | Borra vértice + aristas conectadas + entradas en pivots (L-17) |  |
| [ ] | Conectar dos vértices sueltos | Modo "Conectar" (`K`) → click vértice A → click vértice B | Crea pared interior 0.10m entre ambos (L-18, L-19) |  |
| [ ] | Encadenar conexiones | Después del primer connect, click otro vértice | El segundo del primero se vuelve el nuevo "primero" |  |
| [ ] | Rechazar duplicado | Conectar dos vértices que ya están conectados | Mensaje: "Ya conectados" (L-18) |  |

---

## 9 · Racks

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Crear rack | Botón "Rack" → click en canvas | Modal con código/tipo/dimensiones/niveles/material |  |
| [ ] | Niveles + ubicaciones auto | Crear rack con niveles_count > 0 | Genera N niveles + N ubicaciones (B-5a) |  |
| [ ] | Drag rack en el plano | Modo Seleccionar → arrastrar | Se mueve libremente, persiste posición (L-8) |  |
| [ ] | Tooltip de hover | Pasar mouse sobre rack | Muestra código, dimensiones, tipo, niveles, rotación |  |
| [ ] | Handle de rotación | Seleccionar rack | Handle visual que permite rotar |  |
| [ ] | Vista lateral | Panel → "Vista lateral" o desde lista de racks | Abre `/pos/wms/racks/{id}/elevacion` con render de niveles |  |
| [ ] | Cambiar niveles_count | Editar rack | Si no hay stock, regenera niveles + ubicaciones. Si hay stock, rechaza (B-5c) |  |
| [ ] | Eliminar rack | Click derecho → Eliminar | Soft-delete cascade de niveles + ubicaciones (B-5c) |  |
| [ ] | Listado de racks | `/pos/wms/racks` | Tabla con todos los racks + botones Vista lateral y Niveles |  |

---

## 10 · Elementos arquitectónicos

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Crear columna | Dropdown "Elemento" → Columna → click canvas | Modal con dimensiones |  |
| [ ] | Crear escalera | Dropdown → Escalera → click | Marca amarilla con letra E |  |
| [ ] | Configurar piso destino de escalera | Seleccionar escalera → panel → "Piso destino" | Select con los demás pisos del layout |  |
| [ ] | Click en escalera navega al destino | En modo Seleccionar, click sobre escalera con destino configurado | Cambia pisoActivoId al destino (L-7) |  |
| [ ] | Crear muelle / otro | Dropdown → Muelle/Otro | Marcas con letra M/? |  |

---

## 11 · Operaciones POS↔WMS

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Listado tareas | `/pos/wms/operaciones/tareas` | Tabla con filtros estado/tipo |  |
| [ ] | Crear venta → tarea pick_list automática | Generar venta POS de un artículo con `requiere_gestion_wms` y stock | Aparece tarea pick_list nueva (Observer B-5b) |  |
| [ ] | Crear compra → tarea put_list automática | Generar compra POS | Aparece tarea put_list |  |
| [ ] | Iniciar tarea | Botón "Iniciar" | Estado cambia a en_proceso |  |
| [ ] | Completar línea | Modal completar con ubicación real + unidades | Stock se descuenta/agrega, movimiento queda registrado |  |
| [ ] | Scanner QR en completar | Click QR en modal completar | Abre scanner, completa el campo Ubicación real (R-6) |  |
| [ ] | Conteo cíclico | `/pos/wms/operaciones/conteo` → crear → contar | Genera ajustes con `WmsMovimiento tipo=ajuste` (R-7) |  |
| [ ] | Ajustes manuales | `/pos/wms/operaciones/ajustes-stock` | CRUD funciona, genera movimientos de ajuste (R-4) |  |
| [ ] | Reportes | `/pos/wms/reportes/{ocupacion,rotacion,vencimientos}` | Render correcto con datos del layout (R-1) |  |
| [ ] | Reconcile (CLI) | `php artisan wms:reconcile` | "Sin diferencias" o reporta deltas (R-4) |  |

---

## 12 · Otros

| ✓ | Item | Pasos | Esperado | Notas / correcciones |
|---|---|---|---|---|
| [ ] | Pan con click medio | Click medio + arrastrar | El stage se mueve |  |
| [ ] | Zoom Ctrl+wheel | Hover en canvas + Ctrl+rueda | Acerca/aleja, indicador % en toolbar |  |
| [ ] | Reset vista | Botón reset (`R`) | Vuelve a 100% sin pan |  |
| [ ] | Panel de artículos drag-drop | Botón "Artículos" → drag a rack | Crea ubicación stock con el artículo |  |
| [ ] | Editor rack `/pos/wms/racks/{id}/elevacion` | Abrir vista lateral | Render de niveles + subdivisiones con drag-drop de artículos |  |
| [ ] | Empaques de artículos | `/pos/wms/empaques` | CRUD con dimensiones, orientación, etc. |  |
| [ ] | Reglas slotting | `/pos/wms/reglas-slotting` | CRUD con estrategias FIFO/FEFO/LIFO/ABC/MIXTA, auto_sugerir |  |
| [ ] | Pisos CRUD standalone | `/pos/wms/pisos` | Listado y edición de pisos (R-8) |  |

---

## 13 · Atajos de teclado (verificar)

| ✓ | Tecla | Acción | Notas |
|---|---|---|---|
| [ ] | `Esc` | Cancelar dibujo / deseleccionar / cerrar context menu |  |
| [ ] | `C` | Modo Contorno del piso |  |
| [ ] | `P` | Modo Habitación |  |
| [ ] | `V` | Modo Mover (drag de vértices) |  |
| [ ] | `N` | Modo +Vértice (split de arista) |  |
| [ ] | `A` | Modo Abertura |  |
| [ ] | `E` | Modo Elemento |  |
| [ ] | `K` | Modo Conectar vértices |  |
| [ ] | `M` | Abrir modal "Por medidas" |  |
| [ ] | `O` | Toggle Ortho snap |  |
| [ ] | `R` | Reset vista |  |
| [ ] | `Z` | Deshacer último vértice draft |  |
| [ ] | `Enter` | Cerrar polígono (en modos draw-*) |  |
| [ ] | `Del` | Eliminar shape seleccionado |  |

---

## 14 · Bugs / observaciones generales

Espacio libre para anotar cosas que no encajan en las categorías anteriores:

### 🔴 Bloqueantes

- 

### 🟡 Mejoras UX / visuales

- 

### 💡 Ideas / nice-to-have

- 

---

## 15 · Estado de la prueba

- **Empezado:** _(fecha)_
- **Terminado:** _(fecha)_
- **Resumen ejecutivo:**
