---
audiencia: usuario
screen_key: presupuestos
titulo: Presupuestos / Cotizaciones
aliases:
  - presupuestos
  - cotizaciones
  - cotizar cliente
  - enviar presupuesto por email
  - portal cliente presupuesto
  - aprobar presupuesto
  - convertir presupuesto en venta
  - orden de venta desde presupuesto
---

# Presupuestos / Cotizaciones

Cubre el ciclo comercial completo de presupuestos: alta, motor de cálculo de IVA (5/10/exento), generación del PDF, envío por email con **portal público sin login**, tracking de apertura, aprobación interna por monto y conversión a **Orden de Venta** (que después se factura).

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

`Ventas → Presupuestos` — pantalla principal con lista, alta y detalle.
`Configuración → Presupuestos` — parámetros globales del módulo (numeración, umbrales de aprobación, plantilla de email, condiciones de pago).

## Conceptos generales

- Un **presupuesto** no es un documento fiscal (no se manda al SET). Es una propuesta comercial al cliente con vigencia, condiciones, productos, totales y plazo de respuesta.
- **Estados** del presupuesto: `DRAFT` → `IN_REVIEW` → `APPROVED` → `SENT` → `VIEWED` → `ACCEPTED` → `CONVERTED`. Camino alternativo `REJECTED`. Sistema: `SENT`/`VIEWED` con `fecha_vigencia` pasada → `EXPIRED`. Manual: cualquiera (salvo `CONVERTED`) → `CANCELLED`.
- **Versionado**: cada presupuesto puede tener versiones. Crear nueva versión deja el anterior intacto y vincula ambos con `presupuesto_origen_id`.
- **Aprobación por monto**: si el total supera el umbral configurado, antes de mandarlo al cliente debe aprobarlo un usuario con permiso `VEN_PRE_PRESUPUESTO_APROBAR`. Hay hasta 3 niveles configurables.
- **Numeración**: `prefijo + año + correlativo` (ej. `PRES-2026-0001`). Reinicia o no según configuración.
- **Conversión a venta**: cuando el cliente lo acepta, **una vez** se convierte en **Orden de Venta** confirmada y bloqueada. La factura sale después desde la OV — nunca directo del presupuesto.

Permisos (submódulo `VENTAS_PRESUPUESTOS`): `VEN_PRE_PRESUPUESTO_{VER,CREAR,EDITAR,ELIMINAR,IMPRIMIR}` + `VEN_PRE_PRESUPUESTO_APROBAR` (aprobar por monto) + `VEN_PRE_PRESUPUESTO_FACTURAR` (convertir a OV).

---

## 1. Configuración global (un set por empresa)

`Configuración → Presupuestos → Configuración Global`. Secciones:

### Numeración y vigencia

| Campo | Default | Detalle |
|---|---|---|
| Prefijo de numeración | `PRES-{YYYY}-` | Acepta `{YYYY}` (año 4 dígitos) y `{YY}` |
| Días de vigencia | 30 | Días entre emisión y vencimiento por defecto |
| Días de alerta de vencimiento | 3 | Anticipo con que el sistema avisa al vendedor |

### Aprobación por monto

| Campo | Default | Detalle |
|---|---|---|
| Monto umbral | 50.000.000 | Por encima de este total el envío al cliente queda bloqueado hasta `APPROVED` |
| Umbral nivel 1 / 2 / 3 | 10M / 50M / 200M | Tramos para escalar la aprobación a usuarios con distinto poder |

### Valores por defecto

- **Moneda base** (default PYG).
- **Condición de pago por defecto**: viene del catálogo `Condiciones de Pago` (se marca `es_default = ON` en una). Si no hay default, toma la primera activa por orden.

### Email

| Campo | Default | Detalle |
|---|---|---|
| Email remitente | — | Mail desde el que se envía el presupuesto. Si no se carga usa el de la empresa |
| Asunto del email | `Presupuesto {numero} — {empresa}` | Acepta `{numero}` y `{empresa}` |

### PDF

- **Texto legal** que aparece al pie del PDF (notas, condiciones, garantía, etc.).

---

## 2. Catálogo de Condiciones de Pago

Sub-pantalla dentro de Métodos de Pago, no de Presupuestos (`Configuración → Facturación → Métodos de Pago → Condiciones de Pago`).

Cada condición tiene: **Nombre** ("30 días", "Contado", "50% al pedido / 50% a la entrega"), **Días** (entero), **Es default** (uno solo), **Orden** y **Activa**.

Se usan en el alta del presupuesto y se traen también a la Orden de Venta.

---

## 3. Lista de presupuestos

`Ventas → Presupuestos`. Tabla con: **Número (versión)**, **Cliente**, **Vendedor**, **Total**, **Moneda**, **Fecha emisión**, **Vigencia**, **Estado** (chip de color por estado).

Filtros: cliente, vendedor, estado (incluye chip rápido **Por aprobar** = `IN_REVIEW`), rango de fechas, búsqueda por número.

Acciones por fila: Ver, Editar (solo en DRAFT), Duplicar, Nueva versión, Cancelar, Eliminar (soft delete a `CANCELLED`).

---

## 4. Alta / edición de presupuesto

Sólo se puede **editar** un presupuesto en estado `DRAFT`. Después se debe crear una **nueva versión** y trabajar sobre esa.

### 4.1 Cabecera

| Campo | Obligatorio | Detalle |
|---|---|---|
| Cliente | Sí | Selector buscable (`ClienteSelector`) |
| Vendedor | Sí | Selector contra `vendedores_cobradores` |
| Moneda | Sí | PYG / USD / etc. (de las habilitadas en la empresa) |
| Tipo de cambio | Auto | Se congela al emitir; al cambiar moneda se carga la cotización contable del día |
| Vigencia (fecha) | Sí | Default = hoy + días de vigencia |
| Título | No | Texto interno descriptivo |
| Condición de pago | No | Catálogo |
| Notas | No | Texto libre para el cliente, se imprime en el PDF |

### 4.2 Ítems

Cada línea puede ser:

| Tipo | Para qué |
|---|---|
| **PRODUCTO** | Producto del catálogo (con stock o no) |
| **SERVICIO** | Servicio sin producto base |
| **TEXTO_LIBRE** | Línea informativa (no suma) |
| **SUBTITULO** | Encabezado de sección dentro del PDF |
| **DESCUENTO_GLOBAL** | Línea especial — descuento sobre el total |

Campos por ítem:

- **Producto** (si tipo PRODUCTO), Descripción, Notas, **Cantidad**, **Unidad de medida**, **Precio unitario** (con IVA incluido), **Descuento %**, **Categoría IVA** (EXENTO / IVA_5 / IVA_10).

Los ítems se pueden **reordenar** arrastrando.

### 4.3 Motor de cálculo (Ley 125/91, IVA incluido)

- Subtotal por ítem = `precio_unitario × cantidad × (1 − descuento_pct/100)`.
- IVA 10 = `subtotal / 11`; Base IVA 10 = `subtotal − iva_10`.
- IVA 5 = `subtotal / 21`; Base IVA 5 = `subtotal − iva_5`.
- Exento = `subtotal`, IVA = 0.
- **Descuento global** (% o monto): se aplica sobre el total bruto.
- `total_usd = total / tipo_cambio` cuando la moneda principal es PYG y se factura en USD.

Los totales (exento, base+IVA 5/10, descuento global, total, total_usd) se guardan en la **cabecera** del presupuesto.

### 4.4 PDF

- **Vista previa** desde el detalle (`GET /:id/pdf`).
- **Descarga** directa.
- Plantilla `presupuesto.hbs` en el microservicio `generador-pdf`. Incluye logo de la empresa, datos del cliente, ítems con descuento, totales, condición de pago, vigencia y texto legal.

---

## 5. Aprobación interna por monto

Si el total **supera el umbral** de aprobación:

1. El presupuesto pasa a `IN_REVIEW` al apretar **Enviar a revisión**.
2. Se asigna a uno o más niveles de aprobación según el tramo del monto.
3. Un usuario con `VEN_PRE_PRESUPUESTO_APROBAR` puede **Aprobar** (pasa a `APPROVED`) o **Rechazar** (vuelve a `DRAFT` con motivo).
4. Hasta no estar `APPROVED`, **no se puede enviar al cliente**.

Si el total está **por debajo** del umbral, **`submit-review` auto-aprueba** el presupuesto y se puede enviar sin más trámite.

La bandeja **"Por aprobar"** en la lista filtra los `IN_REVIEW` del usuario.

---

## 6. Envío al cliente

Botón **Enviar** desde el detalle (estado `APPROVED` o sin umbral):

1. El sistema genera un **token único** por presupuesto.
2. Se manda un mail con: asunto configurado, PDF adjunto y un link al **portal público** `/pub/presupuesto/{token}` — sin login.
3. El presupuesto pasa a `SENT` y se registra la `fecha_envio_email` + el destinatario.

### Portal público del cliente

El cliente abre el link y puede:

- **Ver** el presupuesto en pantalla y descargar el PDF.
- **Aceptar** → presupuesto pasa a `ACCEPTED`. Se registra `fecha_respuesta_cliente`.
- **Rechazar** con motivo → pasa a `REJECTED`.

### Tracking

- Pixel transparente `track/open/{token}` en el HTML del email. Al abrir el mail, el presupuesto pasa a `VIEWED` (si estaba en `SENT`) y se registra `fecha_vista_cliente`.
- En el detalle del presupuesto aparece un **panel de seguimiento** con la fecha de envío, primera apertura, respuesta y motivo de rechazo si aplica.

---

## 7. Vencimiento automático

Un cron diario marca como `EXPIRED` los presupuestos en `SENT` o `VIEWED` cuya `fecha_vigencia` ya pasó. Los expirados no se pueden aceptar — para revivir uno hay que **crear una nueva versión** con vigencia nueva.

---

## 8. Conversión a Orden de Venta

Cuando el presupuesto está en `ACCEPTED` hay dos caminos para convertirlo:

### Vía 1 — desde el detalle del presupuesto

Botón **Convertir a Orden de Venta**. El sistema:

1. Crea la OV con `pedidos.presupuesto_id = presupuesto_id` (FK que liga origen).
2. Copia **sólo las líneas con producto_id** — las TEXTO_LIBRE / SUBTITULO / SERVICIO sin producto **no pasan** (advierte si hay líneas facturables sin producto).
3. Mapea IVA: `EXENTO → 0`, `IVA_5 → 5`, `IVA_10 → 10`. El `precio_unitario` (con IVA incluido) se carga como `precio_negociado` en la OV.
4. La OV nace **CONFIRMADA / APROBADA y bloqueada** (no editable).
5. El presupuesto pasa a `CONVERTED`, guarda `pedido_id`, `fecha_conversion`, `usuario_conversion_id` y el **token público se invalida**.

### Vía 2 — desde la pantalla de Orden de Venta nueva

En `Ventas → Órdenes de Venta → Nueva`, al elegir un cliente que tiene presupuestos **ACEPTADOS**, aparece un banner **"Presupuestos aceptados del cliente"** con la lista. Click en uno carga la OV desde ese presupuesto, igual que la vía 1.

### Después de la OV

La factura se hace **sobre la Orden de Venta** (`factura_cab.pedido_id`). Nunca se factura el presupuesto directo.

> La conversión a **Solicitud de Crédito** (`convert-to-credit`) está pendiente — todavía no está disponible en esta versión.

---

## 9. Dashboard y seguimiento comercial

`Dashboard → Widget Presupuestos` (módulo raíz del sidebar es "Dashboard", no "Inicio"). KPIs:

- Cantidad total y monto por estado.
- Embudo: emitidos → vistos → aceptados → convertidos.
- Serie mensual.
- Tasa de conversión.

Filtros: rango de fechas, vendedor, cliente.

---

## Validaciones (texto que ve el usuario)

- "Moneda es obligatoria" / "Vigencia es obligatoria" (alta).
- "Solo se puede editar un presupuesto en DRAFT".
- "El total supera el umbral y requiere aprobación antes de enviar".
- "El presupuesto está vencido — crear una nueva versión".
- "Algunas líneas no tienen producto y no se copiarán a la Orden de Venta".
- "El presupuesto ya fue convertido a una Orden de Venta".
- "El cliente ya respondió este presupuesto" (al intentar aceptar de nuevo desde el portal).

## Lo que NO se puede hacer

- **No se puede editar** un presupuesto fuera de `DRAFT` — hay que crear nueva versión.
- **No se puede enviar al cliente** un presupuesto en `DRAFT` ni en `IN_REVIEW`.
- **No se puede aceptar** un presupuesto `EXPIRED` o `CANCELLED`.
- **No se puede convertir** un presupuesto que ya está `CONVERTED` (segunda conversión bloqueada).
- **No se pueden copiar a la OV** líneas sin `producto_id`.
- **No se puede modificar la OV** generada — nace bloqueada.
- **No se puede facturar el presupuesto directo** — siempre vía OV.
- **No se puede acceder al portal público** después de la conversión (token invalidado).
- **No se puede convertir a Solicitud de Crédito** (función diferida).
- **No se puede borrar** un presupuesto con historial — se cancela.

## Qué ve cada usuario (alcance por sucursal)

Un usuario **asignado a una o más sucursales** ve en la lista de presupuestos únicamente los de esas sucursales. Uno **sin asignaciones** ve toda la empresa.

El presupuesto **guarda su sucursal**: el formulario la pide (es obligatoria en el alta) y viene precargada con la del usuario. El selector sólo ofrece las sucursales que tiene asignadas.

Un detalle que importa en la conversión: **la sucursal viaja del presupuesto a la Orden de Venta**. Si no lo hiciera, la OV nacería sin sucursal y después no aparecería en ningún listado filtrado — le pasaba a las OV convertidas antes de que se corrigiera.

Detalle completo en `guia-alcance-por-sucursal.md`.

---

## Problemas frecuentes

- **"No puedo enviar el presupuesto al cliente"**: revisar (1) estado debe ser `APPROVED` o que el total esté por debajo del umbral, (2) la empresa tenga email remitente y SMTP configurados (ver `guia-empresa.md`).
- **"El cliente dice que el link no funciona"**: el presupuesto pasó a `CONVERTED` o `EXPIRED`. Reenviar nueva versión.
- **"El total no me coincide"**: revisar que el precio unitario sea **con IVA incluido**. Las fórmulas asumen IVA incluido (Ley 125/91).
- **"Necesito modificar un presupuesto enviado"**: usar **Nueva versión** desde el detalle. La versión anterior queda como histórico.
- **"El pixel no marca VIEWED"**: algunos clientes de correo bloquean imágenes externas. Es esperable — `VIEWED` no es 100% confiable; lo importante es `ACCEPTED`.
- **"La OV no tiene todas las líneas del presupuesto"**: las líneas sin producto (TEXTO_LIBRE / SUBTITULO / SERVICIO sin FK a producto) no se copian. El sistema advierte antes.
- **"No aparezco en la bandeja Por aprobar"**: faltó el permiso `VEN_PRE_PRESUPUESTO_APROBAR` en el perfil del usuario. Provisión: `pnpm provision:presupuestos` (admin del sistema).
- **"Un usuario no ve presupuestos que sí existen"**: está asignado a una sucursal y sólo ve los de ella. Los presupuestos viejos que quedaron **sin sucursal** no los ve nadie restringido — hay que completárselas. Ver `guia-alcance-por-sucursal.md`.
- **"La OV convertida no aparece en el listado del vendedor"**: revisar que el presupuesto de origen tenga sucursal. La OV la hereda de ahí.

## Limitaciones actuales

- **No hay convertir a Solicitud de Crédito** desde el presupuesto (`convert-to-credit` pendiente).
- **No hay edición libre** post-`DRAFT` — sólo nueva versión.
- **No hay firma electrónica del cliente** en el portal — la aceptación es un click sin certificado.
- **No hay configuración por cliente** del umbral de aprobación: es global.
- **No hay reportes exportables** (CSV/Excel) más allá del dashboard. El PDF está, pero no listados.
- **Pixel de tracking** depende de que el cliente cargue imágenes; no es prueba legal.
- **No hay descuento por línea + descuento global** combinados con un orden claro: el global se aplica sobre el bruto, no después de los por línea ya descontados.

## Documentos relacionados

- `guia-alcance-por-sucursal.md` — qué presupuestos ve cada usuario según sus asignaciones.
- `guia-cobros-finanzas.md` — cobranza de la factura que viene del presupuesto.
- `guia-facturacion.md` — facturar la Orden de Venta convertida.
- `guia-monedas-metodos-pago.md` — tipo de cambio y condiciones de pago.
- `guia-contactos.md` — alta del cliente al que se envía.
