---
audiencia: usuario
screen_key: listas-precios
titulo: Listas de Precios
aliases:
  - listas de precios
  - configuracion de precios
  - precio por cliente
  - precio por zona
  - precio mayorista
  - precio minorista
  - lista vip
  - descuento por lista
  - prioridad de lista
---

# Listas de Precios

Cubre la **configuración global de precios** (reglas que aplican a todo el ERP) y las **listas concretas** donde se cargan productos con precio, descuento, recargo y vigencia. El POS, la facturación y las órdenes de venta consumen estas listas en tiempo real para decidir **qué precio mostrar** a cada cliente.

## Dónde está esto en el menú

**"Configuración de Precios" (reglas globales) hoy NO está accesible desde el menú.** El ítem vive comentado/deshabilitado en el código, bajo `Configuración → Empresa` (no bajo "Facturación" — esa categoría de Configuración solo tiene Monedas, Métodos de Pago, Configuración de Compras y Planes de Cuotas Automáticos). La pantalla (`PreciosConfig`) y su ruta interna siguen existiendo, pero no hay ningún link en el menú que lleve ahí; hace falta reactivar el ítem en el código para que un usuario pueda llegar por su cuenta.
`Productos → pestaña "Listas Precios"` — alta y mantenimiento de listas, productos y asignaciones (no está bajo "Ventas").

## Conceptos generales

- **Configuración de Precios** = las **reglas** (moneda, redondeo, decimales, multi-lista ON/OFF, descuentos automáticos). Vive en `empresa.configuracion_precios` (JSON en `empresas`).
- **Lista de Precios** = los **datos** (productos con precios, descuentos, recargos, vigencia, asignación). Vive en la tabla `listas_precios`.
- **Tipo de lista**: define a quién aplica.
  - **General**: a todos. Es la base.
  - **Cliente**: a uno o varios clientes específicos.
  - **Zona**: a clientes de una zona geográfica.
  - **Canal**: por canal de venta (mostrador, mayorista, e-commerce, etc.).
- **Prioridad**: 1 a 10. **Menor número = se aplica primero**. La primera lista que tenga el producto **gana**.
- **Fallback**: si ninguna lista tiene el producto, el POS usa el `productos.precio` base.
- **Multi-lista**: si está OFF en la configuración global, sólo se permite **una lista general** activa. Si está ON, se pueden tener varias en paralelo.

Permisos: `INV_LP_LISTA_VER / CREAR / EDITAR` (módulo INVENTARIO; desactivar una lista también usa EDITAR, no hay un permiso ELIMINAR separado) + `ADM_EMP_EMPRESA_VER` (para tocar las reglas globales, hoy sin acceso desde el menú — ver más abajo).

---

## 1. Configuración de Precios (reglas globales)

No accesible desde el menú actualmente (ver nota arriba). El componente vive dentro de la sección "Empresa" de Configuración pero el ítem del menú está comentado en el código.

| Campo | Default | Qué hace |
|---|---|---|
| **Tipo de Lista Principal** | General | Modo por defecto al crear listas nuevas: `general`, `cliente`, `zona`, `canal` |
| **Moneda Principal** | PYG | Moneda de referencia de los cálculos |
| **Permitir Múltiples Listas** | OFF | OFF = una sola lista general. ON = varias listas en paralelo |
| **Descuentos Automáticos** | OFF | ON = los descuentos cargados en las listas se aplican solos al vender |
| **Redondeo** | Normal | Normal / Arriba / Abajo / Ninguno. Afecta cómo se cierran los decimales |
| **Decimales** | 0 (PYG) | Cuántos decimales muestra el precio final (0 a 4) |
| **Validar Stock al mostrar precios** | OFF | ON = no muestra precio si no hay stock. Útil en mayoristas |
| **Mostrar precios sin stock** | ON | ON = muestra el precio aunque haya 0 stock |

> Modo de edición: la pantalla arranca en **solo lectura**. Botón **Configurar** habilita los campos. Al guardar se persiste como JSON en `empresa.configuracion_precios`.

---

## 2. Lista de precios — alta

`Productos → pestaña Listas Precios → botón «Nueva Lista de Precios»`. El wizard tiene 4 pasos:

### Paso 1 — Datos generales

| Campo | Obligatorio | Detalle |
|---|---|---|
| Código | Sí | Identificador corto único (`LP-MAYORISTA`, `LP-VIP-2026`) |
| Nombre | Sí | Descripción amigable |
| Tipo | Sí | General / Cliente / Zona / Canal |
| Moneda | Sí | De las habilitadas en la empresa |
| Prioridad | Sí | 1 a 10. Menor = se evalúa primero |
| Vigencia desde / hasta | Sí | Rango de fechas. Fuera del rango la lista no aplica |
| Activa | Auto | Toggle |
| Descripción / notas | No | Para uso interno |

### Paso 2 — Productos

Se cargan los productos que la lista quiere cubrir. Por cada producto:

| Campo | Detalle |
|---|---|
| Producto | Selector buscable (por código, nombre o código de barras) |
| Precio base | Precio antes de descuentos/recargos |
| Descuento % | Resta al precio base |
| Recargo % | Suma al precio base |
| Precio mínimo / máximo | Topes opcionales para evitar precios fuera de rango (ej. minoristas, descuentos) |

**Precio final** que ve el POS:

```
precio_final = precio_base × (1 − descuento%/100) × (1 + recargo%/100)
```

Si el resultado queda fuera del rango `[mínimo, máximo]`, el sistema lo trunca al límite.

**Carga masiva**: para listas grandes hay un import desde CSV/Excel con las columnas `producto_codigo, precio_base, descuento_pct, recargo_pct, precio_min, precio_max`.

### Paso 3 — Asignaciones (no aplica al tipo General)

Define a quién aplica la lista:

- **Tipo Cliente**: lista de clientes (selector multi).
- **Tipo Zona**: una o varias zonas (catálogo de zonas comerciales).
- **Tipo Canal**: canal del cliente (mostrador / mayorista / e-commerce / corporativo / etc.).

Una lista puede tener múltiples asignaciones del mismo tipo.

### Paso 4 — Resumen y guardar

Muestra: nombre, tipo, prioridad, vigencia, cantidad de productos, cantidad de asignaciones. Botón **Crear lista**.

---

## 3. Lista de precios — mantenimiento

Desde la tabla principal:

- **Editar**: actualizar datos generales (no la prioridad si afecta a ventas en curso — el cambio aplica inmediato).
- **Productos**: agregar / quitar / ajustar precios. Cada cambio queda con fecha + usuario en el historial.
- **Asignaciones**: agregar/quitar clientes/zonas/canales.
- **Duplicar**: crea una copia con nuevo código (útil para versiones temporales: "Lista Black Friday" duplicada de la lista mayorista).
- **Activar/desactivar**: toggle sin borrar.
- **Eliminar**: soft delete (active=false). La lista no aparece en el POS pero sigue ahí para reportes históricos.

---

## 4. Cómo se eligen los precios en el POS

Cuando el cajero / orden de venta / presupuesto pide el precio de un producto, el backend ejecuta `obtenerPrecioProducto(productoId, clienteId, zona, canal, moneda, empresaId)`:

1. Filtra **listas activas y vigentes** (`active = true`, `fecha_inicio ≤ hoy ≤ fecha_fin`).
2. Filtra por **moneda** del pedido.
3. Filtra por **tipo de aplicación**:
   - `general` → siempre incluida.
   - `cliente` → sólo si el cliente está asignado a esa lista.
   - `zona` → sólo si la zona del cliente coincide.
   - `canal` → sólo si el canal del cliente coincide.
4. Ordena las listas por **prioridad ascendente** (1 antes que 5).
5. Recorre listas y devuelve el precio de la **primera lista que tenga el producto**.
6. Si ninguna lista tiene el producto → devuelve `productos.precio` base.

Si **Descuentos Automáticos** está OFF, el POS muestra el precio base de la lista sin aplicarle el `descuento%` cargado en la lista. Si está ON, se aplica solo.

### Ejemplo

Configuración: Multi-lista ON, Descuentos Automáticos ON, Moneda PYG.

```
1. Lista VIP    (prio 1, tipo Cliente) → Cliente ABC S.A. / Prod X = 80.000
2. Lista Mayor. (prio 3, tipo Zona)    → Zona Central       / Prod X = 90.000
3. Lista Gen.   (prio 5, tipo General) → todos              / Prod X = 100.000
```

Casos:

| Cliente | Zona | Resultado |
|---|---|---|
| ABC S.A. | Central | 80.000 (gana Lista VIP por prioridad 1) |
| XYZ S.R.L. | Central | 90.000 (no es VIP, gana Mayorista) |
| Nuevo (sin zona, sin canal) | — | 100.000 (gana General) |
| Cliente sin asignación, producto fuera de listas | — | Precio base del producto |

---

## 5. Reglas para multi-lista

- **Solo una lista** tiene prioridad 1 entre las listas activas del mismo tipo de aplicación; el sistema **no obliga** pero si dos listas elegibles tienen igual prioridad gana la **más reciente** (por `created_at`).
- Si **Multi-lista = OFF**, el sistema rechaza el alta de una segunda lista General activa.
- Una lista vencida (`fecha_fin < hoy`) ya no se evalúa: hay que **extender la vigencia** o crear una nueva.
- La lista **General** es la red de seguridad: si no hay nada más, asegura que todo el catálogo tenga precio.

---

## Validaciones (texto que ve el usuario)

- "El código de lista debe ser único".
- "La fecha fin no puede ser anterior a la fecha inicio".
- "La prioridad debe estar entre 1 y 10".
- "Esta lista ya está cubriendo este producto".
- "Multi-lista está desactivado: solo puede haber una lista General activa".
- "El descuento debe estar entre 0 y 100".
- "El precio mínimo no puede ser mayor al máximo".
- "El cliente ya está asignado a otra lista de tipo Cliente con vigencia activa".

## Lo que NO se puede hacer

- **No se puede tener más de una lista General activa** si Multi-lista está OFF.
- **No se puede asignar el mismo cliente a dos listas tipo Cliente** con vigencia superpuesta — el sistema elige una y queda ambiguo. Cerrar la vigencia de la anterior primero.
- **No se puede vender en una moneda** que no tiene listas vigentes para ese cliente — usa el precio base del producto.
- **No se puede borrar** una lista con historial de uso en ventas — se desactiva.
- **No se pueden combinar** dos listas en la misma venta — sólo gana la primera por prioridad.
- **No se pueden cargar precios negativos** ni descuentos mayores al 100%.
- **No se puede dejar al producto fuera de toda lista y sin precio base** — el POS muestra error.
- **No se pueden cambiar las reglas globales** (decimales, redondeo) si ya hay documentos emitidos — el cambio aplica para los nuevos.

## Problemas frecuentes

- **"El POS le cobra el precio de la lista equivocada"**: revisar (1) la **prioridad** de las listas, (2) que el cliente esté correctamente asignado a la lista esperada, (3) que la vigencia esté activa.
- **"No me deja crear una segunda lista"**: Multi-lista está OFF. Hoy esa opción no se puede cambiar desde el menú (el ítem "Configuración de Precios" está deshabilitado en el código) — hay que pedir a soporte/desarrollo que lo ajuste, o reactivar el ítem del menú.
- **"El producto siempre sale con el precio base"**: el producto no está cargado en ninguna lista vigente que aplique al cliente. Agregarlo a la lista correspondiente.
- **"Necesito un descuento por temporada sin cambiar las listas habituales"**: crear una lista con vigencia acotada (ej. del 1 al 15 de mayo) y prioridad **menor** que las otras para que gane mientras esté vigente.
- **"El precio queda con muchos decimales"**: depende de **Decimales** y **Redondeo** en Configuración de Precios — hoy esa pantalla no tiene acceso desde el menú (ver nota al inicio), así que el ajuste requiere pedirlo a soporte/desarrollo.
- **"Vencí la lista y los vendedores siguen ofreciendo precios viejos"**: la lista vencida ya no se evalúa, pero los presupuestos / órdenes de venta abiertos guardan precios congelados. Re-emitir o crear nuevas versiones.
- **"Carga masiva de productos falla"**: revisar que los códigos de producto del CSV coincidan con `productos.codigo`. Productos no encontrados se reportan al final.

## Limitaciones actuales

- **No hay precio por cantidad** (volumen / escala) en la misma lista — para eso se usan **ofertas** (`guia-ofertas-promociones.md`).
- **No hay versionado de listas** (cambiar un precio reemplaza el anterior; sólo queda en log de cambios).
- **No hay precio por sucursal** dentro de una misma lista — para diferenciar por sucursal se crean listas distintas y se asignan por canal/zona.
- **No hay precio promocional con cuenta regresiva** en el POS (eso se logra con ofertas).
- **No se pueden mezclar dos monedas en la misma lista** — una lista, una moneda.

> Dos limitaciones que estaban acá ya no aplican: ahora **sí existe** marcación automática del
> precio contado a partir del costo (reglas de precio) y **sí existe** un tope de descuento
> derivado del margen real, con autorización de supervisor si se excede — ver
> `guia-motor-precios-rentabilidad.md`.

## Documentos relacionados

- `guia-motor-precios-rentabilidad.md` — reglas de precio (marcación automática desde el costo),
  rentabilidad neta y descuentos con tope + autorización, todo construido sobre estas listas.
- `guia-empresa.md` — Configuración de Precios global está agrupada junto a los ítems de la categoría "Empresa" en Configuración (no dentro de la pantalla "Datos de la Empresa"), aunque hoy el ítem de menú está deshabilitado.
- `guia-ofertas-promociones.md` — descuentos temporales o por evento, complementan a las listas.
- `guia-monedas-metodos-pago.md` — monedas disponibles para las listas.
- `guia-inventario.md` — productos que se cargan en cada lista.
- `guia-contactos.md` — clientes y zonas que reciben las asignaciones.
