# Guía de prueba — Reglas de Precio y Planes de Cuotas (con alcance por categoría)

> Esta guía cubre las funcionalidades de **Reglas de Precio** y **Planes de Cuotas**, incluido el
> alcance opcional por categoría y el plan de cuotas automático (POS y Solicitud de Crédito). Cada
> caso de uso tiene los pasos exactos y un checklist para marcar qué anduvo bien y qué no.

---

## Antes de empezar

- Ambas funcionalidades son **addons pagos** (Gs. 80.000 cada uno) dentro de sus módulos: Reglas de
  Precio en INVENTARIO, Planes de Cuotas en VENTAS. Si no ves las pantallas que menciona esta guía
  en el menú, revisá que tu empresa tenga el addon contratado (`suscripcion_submodulos`).
- Tené a mano al menos **dos categorías de producto distintas** con productos cargados (ej.
  "Televisores" y "Zapateros", o las que uses en tu catálogo real) — varios casos de esta guía
  necesitan un carrito con productos de categorías distintas para ver la diferencia.
- Los ejemplos usan nombres genéricos ("Categoría A", "Producto X") — reemplazalos por productos y
  categorías reales de tu catálogo al probar.

---

## Parte 1 — Reglas de Precio

### Caso 1.1 — Crear una regla de precio global (sin categoría)

**Dónde:** `Productos → Listas Precios → Reglas de precio → Nueva regla`

**Qué hacer:**
1. Completá: Nombre, Lista de precios destino, Costo desde/hasta, Método de cálculo (Margen sobre
   costo / Markup sobre precio de venta / Precio fijo), Valor, Prioridad.
2. Dejá el campo **Categoría** en "Todas las categorías" (valor por defecto).
3. Guardar.
4. Botón **"Previsualizar impacto"** — revisá la tabla de ejemplo antes de aplicar nada.
5. Botón **"Recalcular lista"** → elegí la lista destino → confirmar.

**Qué verificar:**
- [ ] La regla queda listada con **Alcance = "Global"** en la tabla de reglas.
- [ ] "Previsualizar impacto" muestra productos de **cualquier** categoría que caiga en el rango de
      costo (no filtra por categoría, porque no elegiste ninguna).
- [ ] Después de "Recalcular lista", los productos en rango de costo muestran el precio nuevo con
      el chip **"Por regla"** en la pestaña Precios del producto.
- [ ] El precio calculado coincide con la fórmula esperada:
      - Margen sobre costo: `precio = costo × (1 + valor/100)`
      - Markup sobre precio de venta: `precio = costo / (1 − valor/100)`
      - Precio fijo: `precio = valor`

---

### Caso 1.2 — Crear una regla de precio acotada a una categoría específica

**Dónde:** mismo formulario que el Caso 1.1.

**Qué hacer:**
1. Nueva regla, mismos campos que antes.
2. En el campo **Categoría**, elegí una categoría "hoja" (ej. "Heladeras", no un grupo padre).
3. Guardar → Previsualizar impacto → Recalcular lista.

**Qué verificar:**
- [ ] La regla queda listada con **Alcance = <nombre de la categoría>** (chip), no "Global".
- [ ] "Previsualizar impacto" muestra **solo** productos de esa categoría exacta, aunque haya otros
      productos con costo en el mismo rango pero de otra categoría.
- [ ] Al recalcular, **solo** los productos de esa categoría cambian de precio — productos de otras
      categorías con el mismo costo NO se tocan (a menos que otra regla los cubra).

---

### Caso 1.3 — Regla acotada a una categoría padre (hereda a las hijas)

**Qué hacer:**
1. Nueva regla → en Categoría, elegí una categoría **padre** (ej. "Electrodomésticos", que agrupa
   "Heladeras", "Lavarropas", etc.), no una hoja.
2. Guardar → Recalcular.

**Qué verificar:**
- [ ] La regla aplica a productos de **cualquiera** de las categorías hijas directas de la
      categoría padre elegida (Heladeras, Lavarropas, etc. si son hijas directas).
- [ ] Si una categoría hija tiene a su vez sub-categorías (nietos de la categoría padre elegida),
      esos productos **NO** deberían verse afectados — el alcance mira **un solo nivel** hacia
      arriba, no cadenas de 3+ niveles. Si ves que sí se afectan, es un hallazgo a reportar.

---

### Caso 1.4 — Dos reglas compitiendo por el mismo producto (especificidad)

**Qué hacer:**
1. Creá una regla **global** (sin categoría) con un rango de costo que cubra un producto de prueba.
2. Creá una segunda regla acotada a la **categoría específica** de ese mismo producto, con un rango
   de costo que también lo cubra, pero con un valor/método distinto (para poder distinguir cuál
   ganó por el precio resultante).
3. Recalculá la lista.

**Qué verificar:**
- [ ] Gana la regla **más específica**: el producto queda con el precio de la regla de categoría
      específica, no el de la regla global.
- [ ] Repetí el caso con una regla de **categoría padre** en el medio (global vs. padre vs.
      específica, las tres compitiendo): debe ganar la de categoría específica, después la de
      categoría padre, y la global solo gana si ninguna de las otras dos aplica.

---

### Caso 1.5 — Editar el precio a mano después de una regla (permiso de override)

**Qué hacer:**
1. Con un producto que ya tiene precio "Por regla", intentá editar el precio a mano en la pestaña
   Precios.
2. Probá primero **sin** el permiso `INV_RGP_PRECIO_EDITAR`, después **con** el permiso.

**Qué verificar:**
- [ ] Sin el permiso: el campo aparece bloqueado (candado) con el tooltip "Este precio lo generó
      una regla automática. Necesitás el permiso de override para editarlo a mano."
- [ ] Con el permiso: se puede editar.
- [ ] Después de editar a mano, corré "Recalcular lista" de nuevo con **"Preservar precios editados
      manualmente"** activado (default) — el precio editado a mano **no** debe volver a pisarse.
- [ ] Apagá ese switch a propósito y recalculá de nuevo — ahora sí debe volver a aplicarse el
      precio de la regla, pisando la edición manual.

---

### Caso 1.6 — Selector de categoría sin el permiso de ver categorías

**Qué hacer:**
1. Con un usuario que **no** tenga el permiso `INV_CAT_CATEGORIA_VER`, abrí el formulario de Nueva
   regla.

**Qué verificar:**
- [ ] El selector de Categoría no falla ni rompe la pantalla — se degrada mostrando solo la opción
      "Todas las categorías", sin listar categorías reales.
- [ ] La regla se puede guardar igual (sin categoría específica).

---

## Parte 2 — Planes de Cuotas (con alcance por categoría/precio)

### Caso 2.1 — Crear un plan de cuotas global (sin límites)

**Dónde:** `Configuración → Planes de Cuotas → Nuevo plan`

**Qué hacer:**
1. Completá los campos habituales del plan (nombre, cantidad de cuotas, interés si aplica, etc.).
2. En la sección **"Límites (opcional)"**, dejá Categoría en "Cualquier categoría" y los campos de
   precio de producto vacíos.
3. Guardar.

**Qué verificar:**
- [ ] El plan queda activo y visible para **cualquier producto** al usar el selector de cuotas por
      producto en el POS.
- [ ] El plan también aparece en el selector "Plan de cuotas automático" (POS y Nueva Solicitud de
      Crédito) sin importar qué haya en el carrito.

---

### Caso 2.2 — Plan acotado a una categoría específica

**Qué hacer:**
1. Nuevo plan → en "Límites (opcional)", elegí una **categoría específica** (ej. "Televisores").
2. Guardar.

**Qué verificar:**
- [ ] En el **selector de cuotas por producto** del POS: al agregar un producto de esa categoría,
      el plan aparece como opción; al agregar un producto de **otra** categoría, el plan **no**
      aparece para ese ítem.
- [ ] En el **selector "Plan de cuotas automático"** (ver Parte 3 más abajo): con el carrito
      conteniendo **solo** productos de esa categoría, el plan aparece entre las opciones.

---

### Caso 2.3 — Plan acotado por rango de precio de catálogo

**Qué hacer:**
1. Nuevo plan → en "Límites (opcional)", completá **"Precio de producto desde"** y/o **"Precio de
   producto hasta"** (dejá Categoría en "Cualquier categoría" para aislar el efecto del precio).
2. Guardar.

**Qué verificar:**
- [ ] El plan solo aplica a productos cuyo precio de catálogo (contado) caiga dentro del rango —
      no importa la categoría.
- [ ] Si cargás `hasta` menor que `desde`, el sistema debe rechazar con el mensaje
      "precioProductoHasta debe ser mayor a precioProductoDesde".
- [ ] **No confundir** este campo con "Monto Mínimo/Máximo" (si existe en el mismo formulario) —
      ese otro campo valida el monto de la venta al elegir el plan a mano, no el precio de catálogo
      del producto. Son dos validaciones distintas.

---

### Caso 2.4 — Varios planes conviviendo para el mismo producto (sin ganador único)

**Qué hacer:**
1. Creá dos planes distintos con cantidades de cuotas diferentes (ej. 3 cuotas y 6 cuotas), ambos
   acotados a la misma categoría (o ambos globales).
2. Recalculá la lista de precios de esa categoría (o esperá a que se regenere la grilla).

**Qué verificar:**
- [ ] A diferencia de las reglas de precio (que eligen un único ganador), los planes de cuotas
      **no compiten** — el producto debe mostrar **ambas** opciones de cuotas simultáneamente en el
      selector por producto.
- [ ] Si asignás la **misma cantidad de cuotas** a dos planes distintos que ambos aplican al mismo
      producto, es una limitación conocida: colapsan en una sola fila (gana el último recalculado).
      Evitalo usando cantidades de cuotas distintas entre planes que puedan solaparse en catálogo.

---

### Caso 2.5 — Un plan deja de aplicar tras un recálculo (cuotas removidas, no borradas)

**Qué hacer:**
1. Con un plan ya generando cuotas para un producto (Caso 2.1 o 2.2), editá el plan para acotarlo a
   una categoría distinta a la del producto (o cambiá el rango de precio para excluirlo).
2. Recalculá la lista / esperá la regeneración de la grilla.

**Qué verificar:**
- [ ] El resultado del recálculo informa cuántas filas de la grilla de cuotas se **removieron**
      (`cuotas_removidas`), además de las generadas.
- [ ] El producto ya no muestra esa opción de cuotas en el selector.
- [ ] Esa fila removida **no se borra** de la base — queda inactiva, para no romper facturas o
      solicitudes de crédito históricas que ya la referencian (esto se verifica mejor por consulta
      técnica a la base, si tenés acceso; desde la UI alcanza con confirmar que el producto no
      ofrece más esa opción).
- [ ] Si el producto tiene cuotas cargadas **manualmente** (por un CRUD aparte, con nombre libre,
      no generadas por el motor), esas filas **nunca** deben desaparecer por este recálculo —
      confirmá que sobreviven si tenés algún caso de prueba con cuotas manuales.

---

## Parte 3 — Plan de cuotas automático (POS y Nueva Solicitud de Crédito)

Estos casos verifican que el selector **"Plan de cuotas automático"** (distinto del selector de
cuotas por producto) también respeta el alcance por categoría/precio, que el plan elegido queda
guardado en la venta, y que el número de cuotas declarado en la factura es siempre el real.

### Caso 3.1 — El selector automático se reduce según el carrito (POS)

**Dónde:** POS → Nueva Factura → condición de pago "Crédito"/cuotas → selector "Plan de cuotas
automático".

**Qué hacer:**
1. Agregá al carrito **un solo producto** de una categoría que tenga un plan acotado (Caso 2.2).
2. Anotá qué planes aparecen en el selector automático (debería incluir el plan acotado + los
   globales).
3. Sin quitar el primero, agregá un **segundo producto de otra categoría** que ese plan acotado no
   cubra.

**Qué verificar:**
- [ ] Con un solo producto de la categoría cubierta: el plan acotado **aparece** en el selector.
- [ ] Al agregar el segundo producto de otra categoría: el plan acotado **desaparece** del
      selector, dejando solo los planes globales (o "Sin plan" si no queda ninguno aplicable).
- [ ] Quitá el segundo producto del carrito: el plan acotado debe **volver a aparecer**.

---

### Caso 3.2 — Mismo comportamiento en Nueva Solicitud de Crédito

**Dónde:** `Solicitudes de Crédito → Nueva solicitud` → agregar ítems → selector de plan
automático.

**Qué hacer:** repetir exactamente el Caso 3.1 pero en esta pantalla.

**Qué verificar:** mismos puntos que el Caso 3.1.

---

### Caso 3.3 — El plan elegido queda persistido en la factura

**Dónde:** POS.

**Qué hacer:**
1. Armá un carrito, elegí un plan mediante el selector automático.
2. Completá y confirmá la venta (factura real).

**Qué verificar:**
- [ ] La factura se crea sin error.
- [ ] Si tenés acceso a una consulta técnica (o a un reporte que lo muestre), confirmá que la
      factura quedó vinculada al plan elegido — no debería quedar "plan usado: ninguno" cuando sí
      elegiste uno con el selector automático.
- [ ] Repetí facturando **sin** usar el plan automático (contado, o crédito con cuotas cargadas a
      mano) — la factura debe seguir funcionando exactamente igual que siempre, sin ningún plan
      vinculado.

---

### Caso 3.4 — El plan elegido queda persistido en la solicitud de crédito

**Dónde:** Nueva Solicitud de Crédito.

**Qué hacer:** igual que el Caso 3.3, pero creando una solicitud de crédito con el plan automático
elegido.

**Qué verificar:**
- [ ] La solicitud se crea sin error, con el plan elegido.
- [ ] Cargá esa misma solicitud de nuevo (para editarla o para facturarla) — el selector de plan
      automático debe **recordar y mostrar preseleccionado** el plan que se usó originalmente,
      aunque ese plan ya no cubra un carrito distinto que armes después.

---

### Caso 3.5 — Flujo completo: Solicitud de Crédito → Facturación, con plan automático

**Dónde:** Solicitudes de Crédito → cargar una solicitud aprobada → Registrar Pago (factura desde
POS).

**Qué hacer:**
1. Creá una solicitud de crédito con plan automático (Caso 3.4), aprobala.
2. Desde "Solicitudes Crédito", cargá esa solicitud y facturala (Registrar Pago).

**Qué verificar:**
- [ ] El plan usado en la solicitud se **hereda** a la factura resultante (no hay que volver a
      elegirlo a mano).
- [ ] La cantidad de cuotas de la factura coincide con la cantidad real de cuotas que se generan
      (ver Caso 3.6 para el detalle).

---

### Caso 3.6 — El número de cuotas declarado coincide con las cuotas reales, en los 3 orígenes

Este caso es importante porque el número de cuotas viaja tal cual al comprobante fiscal.

**Qué hacer:** crear tres facturas de prueba (o usar facturas ya creadas), una por cada origen:
1. Con **plan de cuotas automático** (Caso 3.3).
2. Con el **selector de cuotas por producto** (sin usar el plan automático).
3. Con **cuotas cargadas manualmente** (sin ningún plan, tipeando la cantidad a mano).

**Qué verificar (para cada una de las 3 facturas):**
- [ ] La cantidad de cuotas que efectivamente se generaron para cobrar (la que ves en el detalle de
      cuenta a cobrar / cronograma de la factura) coincide **exactamente** con lo que dice el
      comprobante en el campo de cantidad de cuotas.
- [ ] Repetí este mismo caso con una solicitud de crédito que incluya **entrega inicial** (pago
      adelantado) — es el escenario más propenso a desincronizarse, así que vale la pena probarlo
      explícitamente aparte de un caso sin entrega.
- [ ] Facturá también un caso **sin ningún crédito** (contado): el campo de cantidad de cuotas debe
      quedar vacío/nulo, sin errores.

---

## Problemas frecuentes a tener en cuenta al probar

- Si el selector de categoría aparece vacío al crear una regla o un plan, revisá el permiso
  `INV_CAT_CATEGORIA_VER` del usuario con el que estás probando.
- Si "Reglas de Precio" o "Planes de Cuotas" no aparecen en el menú, es porque el addon
  correspondiente no está contratado para esa empresa — no es un bug, es el comportamiento
  esperado (403 al llamar los endpoints).
- El precio de un producto no cambia solo porque editaste una regla — siempre hay que ejecutar
  "Recalcular lista" después.
- El selector "Plan de cuotas automático" y el selector de cuotas **por producto** son dos cosas
  distintas dentro de la misma pantalla — esta guía (Parte 3) se enfoca en el automático, que es el
  que financia el carrito completo, no producto por producto.

## Documentos relacionados

- `docs/guias/guia-motor-precios-rentabilidad.md` — guía funcional completa (incluye Rentabilidad
  neta y Descuentos con tope, no cubiertos en esta guía de prueba).
- `docs/plan-motor-precios-rentabilidad.md` — diseño técnico completo (§11 Fase 6, §12 Fase 7).
