Facturación Desktop AY-004

Manual completo del módulo de facturación para escritorio

Menú Ayuda

Introducción

Facturación Desktop es el módulo principal de facturación de FactuPOS, diseñado para uso en computadoras de escritorio. Permite crear cotizaciones, facturar de contado o crédito, imprimir en POS y enviar documentos electrónicos a Hacienda.

Flujo general de trabajo

Seleccionar cliente
Agregar artículos
Revisar y ajustar
Procesar (F4)
Imprimir / Enviar
Documento de trabajo Al ingresar al módulo se crea automáticamente un documento de trabajo (cotización). Puede agregar artículos sin necesidad de guardar primero.

Pantalla principal

La pantalla se divide en las siguientes áreas:

Panel Cliente (izquierda)

  • Datos del cliente seleccionado
  • Crédito disponible y deuda
  • Descuento, precio y actividad
  • Agente y referido

Panel Documento (derecha)

  • Número de documento
  • Fecha, tipo y moneda
  • Modo código de barras
  • Configuración de estación

Panel Líneas (centro)

  • Barra de búsqueda de artículos
  • Cantidad y botón Agregar
  • Tabla de líneas del documento

Panel Totales (inferior)

  • Gravado, exento, exonerado
  • Descuento total, IVA
  • Total general en moneda

Barra de herramientas superior

BotónFunción
AbrirAbrir una cotización guardada o de histórico
GuardarGuardar el documento actual como cotización
ClientesAbrir búsqueda rápida de clientes (F3)
OpcionesMAG, cambio de bodega, adelantos
UtilsHerramientas adicionales

Atajos de teclado

Los atajos permiten trabajar sin usar el ratón, ideal para facturación rápida:

TeclaAcciónCuándo usar
F1Mostrar ayuda rápidaEn cualquier momento
F2Buscar artículo (modal MBA-001)Para agregar artículos al documento
F3Buscar clientePara cambiar el cliente
F4Procesar documentoCuando el documento esté listo para facturar
F6Consulta rápida de artículoSolo para consultar precios y stock, sin agregar
F7Factura de contado directoAtajo directo sin pasar por modal de procesar
F8Factura de crédito directoAtajo directo sin pasar por modal de procesar
*Factura de contado rápidaDesde la barra de búsqueda
EnterBuscar / Agregar artículoEn la barra de búsqueda o campo de cantidad
EscCerrar modal activoEn cualquier modal abierto
Navegar filasEn listas de artículos y modales
Consejo Memorice F2 (buscar), F3 (cliente) y F4 (procesar). Con estos tres atajos puede facturar sin tocar el ratón.

Panel Cliente

Ubicado en la parte izquierda, muestra la información completa del cliente seleccionado.

Campos visibles

CampoDescripción
CódigoIdentificador del cliente en el sistema
CédulaNúmero de identificación. Muestra badge MAG si aplica
Nombre FacturaNombre que aparecerá en la factura. Editable para ajustes puntuales
JurídicoRazón social (solo lectura)
ComercialNombre comercial (solo lectura)
Teléfono / EmailDatos de contacto del cliente
DirecciónDirección registrada

Fila de configuración

CampoDescripción
PrecioNivel de precio asignado al cliente (1-10). Determina qué lista de precios se usa
DescPorcentaje de descuento automático del cliente
ExentoSi el cliente está exento de IVA
ActividadCódigo de actividad económica. Clic para cambiar

Botones de cliente

  • Nuevo — Crear un cliente nuevo sin salir de facturación
  • Editar — Modificar datos del cliente actual
  • Historial — Ver las últimas compras del cliente con filtros y exportación
Cliente genérico (SN) Si no se selecciona un cliente, se usa el cliente genérico "SN". Las facturas electrónicas (tipo 01) requieren un cliente con cédula; para SN se genera un tiquete electrónico (tipo 04).

Panel Crédito

Muestra la situación crediticia del cliente seleccionado:

CampoDescripción
LímiteMonto máximo de crédito autorizado
PlazoDías de crédito del cliente
DisponeCrédito disponible (Límite - Debe). Clic para ver menú de opciones
DebeSaldo total de cuentas por cobrar
TieneSaldo a favor / adelantos. Clic para aplicar o revertir
Crédito insuficiente Si el total del documento excede el crédito disponible, el sistema mostrará una alerta al intentar facturar a crédito. El usuario con permisos adecuados puede forzar la aprobación.

Panel Vendedor

Controla quién se registra como agente de ventas en la factura:

  • Usuario — Código del usuario que está facturando (no editable)
  • Agente — Vendedor asignado. Clic en el nombre (morado) para cambiar
  • Referido — Persona que refirió al cliente
Agente obligatorio (Parámetro 3) Si el parámetro 3 está activo, el agente debe ser diferente al usuario actual. Si intenta procesar con el mismo código, el sistema lo bloqueará. Cambie el agente haciendo clic en su nombre.
Usuarios del sistema no pueden ser agente NUEVO 2026-06-15

Los usuarios 09029 y 59999 son cuentas internas del sistema y nunca pueden quedar como agente de ventas. El sistema lo protege en tres momentos:

  • Al cambiar el agente: si intenta elegir uno de esos usuarios, no se asigna y aparece un aviso.
  • Al abrir una cotización: si la cotización tenía a uno de ellos como agente, se reemplaza automáticamente por el usuario del documento y se guarda corregido.
  • Al tramitar o enviar a cajas: si el agente es uno de esos usuarios, el sistema no deja facturar ni enviar a cajas y le pide cambiar el agente.
Parámetro 922 — Cambiar cliente ya no cambia el agente NUEVO 2026-07-08

Antes, al cambiar el cliente de la cotización, el sistema reemplazaba el agente del documento por el agente configurado en la ficha del cliente (o lo dejaba sin vendedor si el cliente no tenía uno). Ahora el comportamiento se controla con el parámetro 922:

  • Parámetro 922 = 0 (default) — Al cambiar el cliente, el agente del documento NO se toca. El agente por defecto es el usuario que creó la cotización, y solo cambia si usted lo cambia manualmente.
  • Parámetro 922 = 1 — Al cambiar el cliente, el documento hereda el agente configurado en la ficha del cliente. Si el cliente no tiene agente asignado, se conserva el agente actual (nunca queda sin vendedor).

Aplica igual en facturación desktop, SmartPOS, FactuMóvil y FactuDesk.

Usuario Ventas Última actualización: 2026-04-20

En la barra de búsqueda de artículos aparece el campo Usr. Ventas junto con un botón Cambiar. Este campo indica quién se registrará como el usuario del documento de venta.

¿Cómo funciona?

  1. Al iniciar sesión (login), el sistema asigna automáticamente su código y nombre como Usuario Ventas.
  2. Si otra persona necesita facturar desde su sesión, presione el botón Cambiar.
  3. Se abrirá un modal donde debe ingresar la clave del vendedor.
  4. El sistema busca al empleado por su clave y actualiza el Usuario Ventas con su código y nombre.
  5. El cambio se mantiene hasta que se vuelva a cambiar o se inicie sesión de nuevo.

¿Cuándo se usa en la factura?

Parámetro 390 — Usuario de la factura

Controla quién queda como UsuarioCodigo en VentaMadre:

  • Parámetro 390 = 0 — El usuario de la factura es el mismo que creó la cotización (comportamiento tradicional).
  • Parámetro 390 = 1 — El usuario de la factura es el Usuario Ventas activo en ese momento, es decir, quien realmente está vendiendo.
Parámetro 392 — Agente de la factura NUEVO 2026-04-20

Controla quién queda como AgenteCodigo en VentaMadre. Requiere que el parámetro 390 también esté en 1.

  • Parámetro 392 = 0 (default) — Se preserva el agente original asignado en la proforma.
  • Parámetro 392 = 1 — El agente de la factura también será el Usuario Ventas activo (mismo valor que el UsuarioCodigo).

Matriz combinada de parámetros 390 + 392

390392UsuarioCodigoAgenteCodigo
0Quien creó la proformaAgente original de la proforma
10Usuario Ventas activoAgente original de la proforma (preservado)
11Usuario Ventas activoUsuario Ventas activo (mismo código)
Impacto en Comisiones

Si su empresa usa comisiones por agente (reporte VE-023), NO active el parámetro 392. De lo contrario, todas las comisiones se pagarán al cajero/usuario de ventas que factura, no al vendedor original que creó la cotización. Deje 392 = 0 y use la función "Cambiar Agente" en la proforma para asignar el vendedor correcto.

Ejemplo práctico

María (00003) inicia sesión en la computadora. Juan (00005) necesita hacer una venta desde esa misma computadora. Juan presiona Cambiar, ingresa su clave, y ahora el campo muestra 00005 Juan.

  • Con 390=1, 392=0: La factura queda con UsuarioCodigo=00005 (Juan) pero el AgenteCodigo se mantiene como el agente original de la proforma (por ejemplo, SARA).
  • Con 390=1, 392=1: La factura queda con UsuarioCodigo=00005 Y AgenteCodigo=00005 (ambos Juan). Recomendado solo para empresas donde el cajero es el mismo vendedor.

Panel Documento

Ubicado en la esquina superior derecha, controla las propiedades del documento:

CampoDescripción
NúmeroNúmero único del documento de trabajo
FechaFecha del documento (se actualiza automáticamente)
Tipo01 = Factura Electrónica, 04 = Tiquete Electrónico
MonedaCRC (colones), USD (dólares), EUR (euros), etc.
(piñón)Abre configuración de estación: oficina, caja, bodega, tipo de precio

Toggles y modos

  • Código de barras — Activa modo escáner. Si el artículo ya existe en la lista, suma la cantidad en vez de crear nueva línea
  • Solo stock — Solo busca artículos con existencias en bodega

Panel Líneas

El área central donde se agregan los artículos del documento.

Barra de búsqueda

Escriba el código o nombre del artículo y presione Enter. Si encuentra coincidencia exacta por código, agrega directamente. Si hay varias coincidencias, abre el modal de búsqueda.

Campo de cantidad

A la derecha de la barra de búsqueda. Escriba la cantidad deseada antes de agregar. Presione Enter en el campo de cantidad para agregar el artículo.

Botón Agregar (verde)

Equivale a presionar Enter sobre la cantidad. Agrega el artículo con la cantidad especificada.

Columnas de la tabla

ColumnaDescripción
#Número de línea
CódigoCódigo del artículo
DescripciónNombre del artículo
CantCantidad (clic para editar)
PrecioPrecio unitario (clic para editar si tiene permiso 024)
%DcPorcentaje de descuento (requiere permiso 004)
IVAPorcentaje de IVA aplicado
TotalTotal de la línea con IVA
BodBodega asignada
UtilMargen de utilidad (solo con permiso 064)

Panel Totales

Muestra el desglose completo del documento en la parte inferior:

  • Total Venta — Suma de todas las líneas sin descuento ni IVA
  • Descuento — Total de descuentos aplicados
  • Gravado / Exento / Exonerado — Desglose según tipo impositivo
  • IVA — Total del impuesto al valor agregado
  • TOTAL — Monto final a cobrar

Buscar artículo — Modal MBA-001

Presione F2 o haga clic en el botón Buscar para abrir el modal de búsqueda avanzada.

Barra de búsqueda del modal

  • Campo de texto — Busca por código, nombre o código de barras
  • Categoría — Filtro por categoría de artículos
  • Solo Stock — Muestra solo artículos con existencias
  • Buscar — Ejecuta la búsqueda
  • Agregar — Agrega todos los artículos que tengan cantidad ingresada

Lista de resultados (panel superior)

Muestra los artículos encontrados con: código, nombre, stock, precio, IVA y precio neto. Cada fila tiene un campo de cantidad para ingresar directamente.

El precio de cada fila es el del nivel que realmente aplica según las reglas (parámetro 57 / cliente / estación), no siempre el P1. Junto al precio aparece un badge con el nivel (ej. P2) para confirmar de un vistazo cuál se está mostrando — coincide con el precio que se factura.

Panel de detalle (4 fichas inferiores)

Al seleccionar un artículo, se cargan 4 fichas con información detallada:

Imagen NUEVO

  • Foto del artículo seleccionado (`/img/{db}/articulos/{codigo}.png`)
  • Si no hay imagen subida → placeholder gris

Stock Externo MEJORADO

  • Stock en TODAS las BDs configuradas en `EmpresasExternas` (incluyendo la BD actual marcada con badge azul "ACTUAL")
  • Toolbar con checkbox "Solo con stock > 0" (persiste en localStorage)
  • Estados visuales: stock>0 normal · stock=0 italic gris · "(No existe)" gris claro · "(Error)" rojo
  • Footer con TOTAL stock sumando todas las empresas donde existe el artículo
  • Click en fila con stock → muestra bodegas de esa empresa

Precios

  • 10 niveles de precio (P1 a P10)
  • Precio base e IVA incluido
  • Clic para seleccionar, doble clic para agregar

Bodegas

  • Stock por bodega
  • Clic para seleccionar bodega

Información

  • Datos adicionales del artículo
  • Unidad de medida, CABYS

Navegación con teclado en el modal

TeclaAcción
Navegar entre filas de resultados
EnterSi hay cantidad: agregar. Si no: buscar o navegar a cantidad
0-9Ir directamente al campo de cantidad de la fila
EscCerrar el modal
Agregar múltiples artículos Puede ingresar cantidades en varias filas y luego presionar el botón Agregar para agregarlos todos de una vez.

Flujo Enter → Bodega → Cantidad (Parámetro 383)

Cuando el Parámetro 383 está activo (= 1) y el Parámetro 102 permite seleccionar bodega (= 0), la tecla Enter sigue un flujo guiado de 3 pasos para confirmar artículo + bodega + cantidad antes de agregar la línea:

  1. Paso 1 — En la lista de artículos: seleccione la fila con / y presione Enter. El modal mueve automáticamente el foco a la ficha Bodegas y resalta la primera bodega con stock disponible.
  2. Paso 2 — En la ficha Bodegas: use / para elegir otra bodega si es necesario y presione Enter. El modal se cierra, el código del artículo se coloca en el campo de búsqueda principal de la factura y el foco salta al campo cantidad principal (no agrega aún). Aparece un toast: "Bodega: X. Ingrese cantidad y Enter."
  3. Paso 3 — En el campo cantidad principal: digite la cantidad y presione Enter. Recién acá se agrega la línea, usando la bodega que eligió en el paso 2.
Cuándo conviene activar el Parámetro 383 En empresas donde el cajero necesita elegir conscientemente la bodega de cada artículo antes de agregarlo (no usar la bodega default de la estación). Pasa el foco por las 3 decisiones (artículo → bodega → cantidad) sin requerir el mouse.
Param 102Param 383Comportamiento del Enter
01Flujo de 3 pasos — Artículo → Bodega → Cantidad (recomendado para multibodega)
00Enter agrega la línea directo con la bodega default
1cualquieraEnter agrega directo. El Param 383 se ignora porque 102 bloquea la selección de bodega

Sugerencia de cambio de bodega (línea sin existencia)

Cuando el Parámetro 102 permite seleccionar bodega (= 0) y usted agrega un artículo que no tiene existencia en la bodega usada, el sistema verifica automáticamente si hay stock en otra bodega. Si lo hay, abre el modal "Sin existencia en esta bodega" con la lista de bodegas que sí tienen el artículo y su existencia.

  • Cada bodega muestra su existencia; las que cubren la cantidad solicitada se resaltan en verde.
  • Al hacer clic en una bodega, la línea recién agregada se mueve a esa bodega (cambia solo esa línea) y la tabla se actualiza.
  • Si prefiere dejarla como está, use "Conservar bodega actual".
  • Los servicios (no manejan inventario) nunca disparan esta sugerencia.
Nota Si el Parámetro 102 = 1 (bloquea la selección de bodega), la sugerencia no aparece, porque el usuario no puede cambiar de bodega.

Agregar líneas

Existen varias formas de agregar artículos al documento:

1. Búsqueda directa (barra principal)

  1. Escriba el código o nombre en la barra de búsqueda
  2. Ajuste la cantidad en el campo a la derecha
  3. Presione Enter o el botón Agregar

2. Modal de búsqueda (F2)

  1. Presione F2 para abrir el modal
  2. Busque el artículo por código o nombre
  3. Opcionalmente seleccione un precio o bodega específica
  4. Ingrese la cantidad y presione Enter

3. Desde historial del cliente

  1. Clic en Historial en el panel de cliente
  2. Busque la compra anterior por fecha o artículo
  3. Doble clic en el artículo para agregarlo al documento actual con el precio sugerido

4. Escáner de códigos de barras

Active el modo "Código de barras" y escanee directamente. El artículo se agrega automáticamente.

Editar líneas

Una vez agregada una línea, puede modificar:

  • Cantidad — Clic en la celda de cantidad para editar
  • Precio — Clic en la celda de precio (requiere permiso 024)
  • Descuento — Clic en la celda de descuento (requiere permiso 004)
  • Bodega — Clic en la celda de bodega para cambiar
  • Eliminar — Botón rojo en la línea (requiere permiso 059)
Protección de utilidad El sistema protege el margen de utilidad. Si un descuento o cambio de precio genera pérdida, se mostrará una alerta y se ajustará automáticamente al mínimo permitido.

Modal de utilidad negativa

Cualquier cambio de precio o descuento que genere pérdida (precio sin IVA, con el descuento, < costo) dispara un modal centralizado, con dos modos según el permiso del usuario:

PermisoModalAcción
Con permiso 021 (Facturar a costo)Modal rojo de confirmaciónEl usuario debe escribir SI para autorizar el cambio.
Sin permiso 021Modal amarillo informativo "No autorizado"Muestra el descuento máximo permitido para el artículo. No permite continuar; solo cerrar.

Si el usuario no tiene permiso 064 (ver utilidad), el modal oculta el costo y los valores de utilidad calculada — sólo informa el descuento máximo permitido.

Excepción: Cortesía total (Tipo 03 + 100%) Cuando se aplica un descuento con Tipo 03 — Descuento por bonificación al 100%, las validaciones de utilidad mínima y descuento máximo se omiten automáticamente. El artículo se entrega como cortesía oficial, sin necesidad de permiso 021.

Artículos con precio 0

Si un artículo tiene precio 0 en el nivel asignado al cliente, la línea se agrega al documento respetando ese precio (entra en 0). El cajero puede editar el precio inline para establecer el valor de venta. El sistema sólo dispara el modal de "bajo costo" cuando el nuevo precio queda por debajo del costo — establecer un precio inicial mayor al costo es válido sin restricciones.

Niveles de precio

El sistema soporta hasta 10 niveles de precio (P1 a P10) por artículo. La selección del precio sigue estas reglas:

Reglas de asignación de precio

PrioridadCondiciónPrecio usado
1Parámetro 57 activo (precio fijo estación)Precio de la estación (siempre, sin excepción)
2Cliente es SN (genérico)Precio de la estación
3Precio seleccionado manualmente en modalEl precio seleccionado (P1, P2, P3, etc.)
4Cliente tiene TipoPrecioVenta asignadoEl precio del nivel del cliente
5Ninguna de las anterioresPrecio de la estación
Precio fijo de estación (Parámetro 57) Si el parámetro 57 está en 1, los precios en el modal aparecen bloqueados (gris) y no se puede seleccionar manualmente un nivel diferente. Solo se usa el precio configurado en la estación.
Cliente genérico (SN) Cuando el cliente es SN, siempre se usa el precio de la estación, sin importar lo que se seleccione en el modal de precios.

Cómo seleccionar un precio diferente

  1. Asegúrese de tener un cliente real (no SN) y que el parámetro 57 esté inactivo
  2. Abra el modal de búsqueda (F2) y busque el artículo
  3. En la ficha Precios (panel inferior), haga clic en el nivel deseado (P1, P2, P3...)
  4. La fila se resaltará en azul indicando la selección
  5. Agregue el artículo: doble clic en la fila de precio, Enter, o ingrese cantidad y presione Agregar
Listado completo de niveles (incluso en 0) El panel Precios del modal muestra todos los niveles definidos para el artículo (P1, P2, P3, P4, P5), incluso los que están en 0. Esto permite al cajero ver qué niveles existen y agregarlos al documento aunque no tengan precio configurado — luego se edita el precio en la línea.

Cambio de nivel sobre una línea existente

Cuando se cambia el nivel de precio de una línea ya agregada (por ejemplo P1 → P2) usando la barra de precio masiva:

  1. Se actualiza el precio al del nuevo nivel.
  2. El descuento previo se resetea a 0 (siempre, sin excepción de permisos). Esto evita que un descuento aplicado al nivel anterior arrastre al nuevo bajo reglas distintas.
  3. Si el nuevo nivel tiene un Descuento Fijo configurado, se aplica automáticamente — siempre que cumpla con el Descuento Máximo y la Utilidad Mínima de ese nivel. Si no cumple, queda en 0% y la razón se registra en bitácora.

Descuentos

El sistema maneja múltiples tipos de descuento con prioridades definidas:

Tipos de descuento

TipoOrigenPermiso
Descuento del clienteConfigurado en ficha del clienteNinguno (se aplica automáticamente)
Descuento recordadoÚltimo descuento aplicado al mismo cliente+artículoParámetro 277 activo
Descuento fijo del artículoConfigurado en el artículoNinguno
Descuento manualEditado por el usuario en la líneaPermiso 004
Descuento sobre el máximoSupera el descuento máximo configurado en el artículoPermiso 023

Prioridad de descuentos

  1. Descuento recordado (param 277) — Tiene prioridad máxima si está activo
  2. Descuento del cliente — Se aplica automáticamente
  3. Descuento fijo del artículo — Se usa si el cliente no tiene descuento
Descuento bloqueado por precio (Parámetros 153-158) Se puede configurar que ciertos niveles de precio no admitan descuento. Si el precio activo está bloqueado, el descuento se fuerza a 0% automáticamente.
Cortesía total (Tipo 03 + 100%) Cuando se aplica un descuento con Tipo 03 — Descuento por bonificación al 100%, las validaciones de utilidad mínima y descuento máximo se omiten. El artículo se considera entregado como cortesía oficial. Se puede aplicar línea por línea o de forma masiva desde el modal de opciones (MV-OPC).

Validación en 3 etapas (descuento → utilidad mínima → costo)

Cuando se aplica un descuento o se edita el precio de una línea, el sistema valida en orden, etapa por etapa. Cada etapa tiene su propio permiso: si el usuario no lo tiene, esa etapa lo detiene (se capa el descuento o se ajusta el precio).

Todo se compara SIN IVA Las tres etapas comparan el precio sin IVA (el precio de lista ya con el descuento aplicado) contra el costo (también sin IVA). El IVA se suma después y no interviene en la validación de utilidad ni de costo.
#Qué revisa (precios sin IVA)Permiso
1El descuento supera el descuento máximo del artículo023 — Hacer descuento mayor al permitido del artículo
2El precio (con el descuento) queda bajo la utilidad mínima (parámetro 16 o por nivel de precio), pero todavía ≥ al costo006 — Facturar bajo la utilidad mínima
3El precio (con el descuento) queda por debajo del costo021 — Facturar bajo el costo
Ejemplo (todos los montos sin IVA) Artículo con precio ₡130, costo ₡100, descuento máximo 10% y utilidad mínima 20% (precio mínimo ₡120). El cajero aplica un descuento del 12% → precio con descuento ₡114.40:
  • Etapa 1 — 12% > 10% (máximo del artículo): necesita el permiso 023. Sin él, el descuento se capa al 10%.
  • Etapa 2 — ₡114.40 < ₡120 (utilidad mínima): necesita el permiso 006. Sin él, se le quita el descuento o se sube el precio al mínimo permitido.
  • Etapa 3 — ₡114.40 ≥ ₡100 (costo): no aplica; la línea pasa sin pedir el permiso 021.
Si en cambio el descuento fuera del 30% → precio con descuento ₡91, que queda por debajo del costo (₡100): además del 023 y el 006, el cajero necesitaría el permiso 021 para poder facturar esa línea.
Autorización de un supervisor (Etapa 1 — descuento sobre el máximo) Si el cajero no tiene el permiso 023 e intenta un descuento mayor al máximo del artículo, ya no se capa en silencio: aparece automáticamente una ventana pidiendo la clave de un supervisor. Si la clave corresponde a un usuario que tiene el permiso 023, el descuento completo se aplica y queda registrado quién lo autorizó (el cajero sigue siendo el responsable de la venta). Si se cancela, el descuento queda topado al máximo del artículo, como antes.
  • Funciona en los tres puntos donde se aplica descuento: la barra de descuentos de líneas seleccionadas, el campo %Dc de cada fila y el modal de Opciones (MV-OPC).
  • La autorización cubre solo la Etapa 1 (descuento sobre el máximo). Si el descuento además queda bajo la utilidad mínima (Etapa 2) o bajo costo (Etapa 3), siguen pidiéndose los permisos 006 / 021 respectivamente; un aviso lo indica.
Regla rápida Mientras el precio sin IVA (con el descuento) cumpla la utilidad mínima → libre. Si queda bajo la utilidad mínima pero ≥ al costo → permiso 006. Si queda por debajo del costo → permiso 021 (que también requiere el 006 porque ya cruzó la utilidad mínima). La cortesía total (Tipo 03 al 100%) omite las tres etapas.

Cálculo de precios y totales

Esta sección explica exactamente cómo el sistema calcula cada línea y los totales del documento, con las fórmulas que se ejecutan tanto en el backend (_funciones_calculo.php) como en el frontend (calcularTotales()).

Fórmula única compartida Todas las APIs (agregar línea, cambiar precio, aplicar descuento, exonerar) ejecutan la misma función de cálculo para garantizar resultados consistentes. Cualquier cambio en una línea dispara el recálculo completo.

Paso 1 — De dónde sale el precio unitario

El precio de una línea se resuelve en el momento de agregar el artículo siguiendo esta prioridad (se detiene en la primera que aplique):

#CondiciónPrecio usado
1Parámetro 57 = 1 (precio fijo de estación)Estaciones.PrecioVenta — siempre, sin excepción
2Cliente SN (genérico, sin código)Precio de la estación
3Usuario seleccionó un nivel en el modal de búsquedavista_articulo.Precio{N} (N = 1-10)
4Cliente tiene TipoPrecioVenta asignadovista_articulo.Precio{TipoCliente}
5Ninguna anteriorPrecio de la estación
Fallback si el nivel está en 0 Si el precio del nivel elegido es 0, el sistema usa Precio1 como fallback. Al cambiar de nivel desde el modal de utilidades con un precio 0, el cambio se omite silenciosamente y se registra en bitácora (ver cotizacion_cambia_tipo_precio.php).

Paso 2 — Cadena de cálculo de la línea

Con el precio resuelto, la línea pasa por 10 cálculos en cadena. El nombre entre paréntesis es el campo físico en ProformaHija:

#CálculoFórmula
1SubTotal bruto (ArticuloVentaSubTotal1)Cantidad × Precio
2Monto de descuento (ArticuloDescuentoMonto)SubTotal1 × (Descuento% ÷ 100)
3SubTotal con descuento (ArticuloVentaSubTotal2)SubTotal1 − DescuentoMonto
4SubTotal con otros cargos (ArticuloVentaSubTotal3)SubTotal2 + OtrosCargos
5Monto exonerado (ArticuloVentaExonerado)SubTotal3 × (ExoneradoPct ÷ IvaPct) si IvaPct > 0
6Monto gravado (ArticuloVentaGravado)SubTotal3 − Exonerado si IvaPct > 0
7Monto exento (ArticuloVentaExento)SubTotal3 − Gravado − Exonerado (cuando IvaPct = 0 → todo es Exento)
8IVA calculado (ArticuloIvaMonto)SubTotal3 × ((IvaPct − ExoneradoPct) ÷ 100)
9IVA devuelto (ArticuloIvaDevuelto)IvaMonto si MedioPago = '02' (tarjeta) y IvaPct = 4; si no, 0
10Total de línea (ArticuloVentaTotal)Gravado + Exonerado + Exento + IvaMonto − IvaDevuelto
Orden crítico Primero se aplica el descuento, luego se suma OtrosCargos, después se calcula exoneración, y finalmente el IVA. El IVA NUNCA se calcula sobre el precio original — siempre sobre SubTotal3 (después de descuento + otros cargos).

Paso 3 — Redondeo (Parámetros 190 y 195)

Parámetro 195 — Decimales del IVA

Controla con cuántos decimales se redondea el campo ArticuloIvaMonto. Rango permitido: 0 a 6. Default: 2. El resto de campos (SubTotales, Gravado, Exonerado, Total) siempre se redondean a 2 decimales.

Parámetro 190 — Redondear total factura

Controla si el IVA se calcula sobre el subtotal redondeado o sobre el subtotal sin redondear. Es clave cuando el precio unitario sin IVA tiene 4 decimales y el total con IVA debe cuadrar con un precio "redondo" al cliente (ej: ₡1,700.00).

ValorBase del IVAEjemplo PU 1,504.4248 × 1 × 13%
0 (default)ROUND(SubTotal3, 2)Subtotal 1,504.42 · IVA 195.57 · Total 1,699.99
1SubTotal3 sin redondearSubtotal 1,504.42 · IVA 195.58 · Total 1,700.00 ✓

Ver detalles y cuándo activarlo en Parámetros → 190.

Paso 4 — Casos especiales

IVA devuelto (tarjeta con tarifa 4%)

Cuando el documento tiene MedioPagoCodigo = '02' (tarjeta) y una línea tiene IVA del 4%, ese IVA se marca como "devuelto" y se resta del total de la línea. Esto aplica principalmente a canasta básica cuando se paga con tarjeta.

Exoneración parcial o total

Si el cliente tiene exoneración sobre el artículo, el campo ArticuloIvaExonerado guarda el porcentaje exonerado (no el monto). La fórmula distribuye:

  • Gravado = parte del SubTotal3 que sigue afecta al IVA
  • Exonerado = parte del SubTotal3 liberada del IVA
  • IVA neto = SubTotal3 × ((IvaPct − ExoPct) ÷ 100)

Si la exoneración es total (ExoPct = IvaPct), el IVA queda en 0 y todo el SubTotal3 se reporta como Exonerado.

Artículo Exento (IvaPct = 0)

Si el artículo no grava IVA, todo el SubTotal3 se clasifica como Exento (ni gravado ni exonerado). El IVA y el IVA devuelto quedan en 0.

Otros cargos

Campo ArticuloOtrosCargos — se suma al SubTotal2 antes de calcular el IVA, por lo que sí paga IVA (si la línea es gravada).

Paso 5 — Totales del documento

Cuando una línea cambia, el sistema recalcula ProformaMadre sumando todas las líneas y agrupando por naturaleza CABYS (hacienda.dbo.VistaNaturalezaArticulo):

Campo en ProformaMadreFuente
TotalCostoΣ ArticuloCosto × ArticuloCantidad
TotalVentaΣ ArticuloVentaSubTotal1 (sin descuento, sin IVA)
TotalDescuentoΣ ArticuloDescuentoMonto
TotalMercGravado / Exonerado / ExentoΣ líneas con Naturaleza CABYS = 1 (mercancía)
TotalServGravado / Exonerado / ExentoΣ líneas con Naturaleza CABYS = 2 (servicio)
TotalIvaΣ ArticuloIvaMonto
TotalIvaDevueltoΣ ArticuloIvaDevuelto
TotalΣ ArticuloVentaTotal + TotalImpuestoServicio
Impuesto de servicio (servicio 10%) TotalImpuestoServicio es un cargo adicional (típico en restaurantes: 10% de servicio) que se suma al total final pero NO se incluye en cada línea individual. Se calcula a nivel documento.

Paso 6 — Cálculo en tiempo real (frontend)

Mientras el usuario edita líneas, el panel "Totales" se actualiza instantáneamente en JavaScript sin esperar al backend. Luego de 300ms sin cambios, se envía al servidor la actualización definitiva (debounce).

Los totales visibles en pantalla suman cada línea así:

  • Gravado / Exonerado / Exento mercancía — Σ campos de línea (todos van a mercancía en frontend; el servidor los reclasifica por CABYS)
  • IVA — Σ l.ivaTotal (ojo: el campo JS se llama ivaTotal, no impuesto)
  • IVA devuelto — Σ l.ivaDevuelto
  • Total — Σ l.total

Paso 7 — Margen de utilidad

El porcentaje de margen se calcula solo para productos (excluye servicios, naturaleza = 2). Se muestra en el panel de totales si el usuario tiene permiso 064.

CálculoFórmula
Venta neta de líneaGravado + Exonerado + Exento (después de descuento, sin IVA)
Costo total productosΣ Costo × Cantidad (solo naturaleza ≠ 2)
Venta total productosΣ venta neta (solo naturaleza ≠ 2)
Margen %((VentaTotal − CostoTotal) ÷ CostoTotal) × 100
Base del margen El margen usa la venta post-descuento sin IVA. Si descuenta 10%, el margen que ve reflejará esa rebaja real. No se calcula sobre el precio de lista.

Paso 8 — Moneda extranjera

En facturas con moneda distinta a la nacional (ver parámetro 249), el cálculo de la línea se hace en la moneda del documento. La conversión a moneda nacional ocurre al momento de contabilizar:

  • Pagos — siempre en la moneda del documento. Si el cliente paga con otra moneda, se convierte usando el tipo de cambio y se guarda en la moneda del documento.
  • Asiento contable — cada línea de DocumentoDetallePago se multiplica por su TipoCambio para llevarla a la moneda nacional.
  • Ajuste de redondeo — si DEBE/HABER difieren por menos de 1.00 (por redondeos), se agrega automáticamente una línea de ajuste en la cuenta del parámetro 83 (Caja Efectivo).

Paso 9 — Validación de límites (constraints BD)

Antes del UPDATE, la función calcularTotalesLinea() proyecta los valores y valida que no excedan los check constraints de la base:

CampoLímite
ArticuloVentaSubTotal1500,000,000
ArticuloVentaGravado100,000,000
ArticuloVentaTotal100,000,000

Si alguna proyección excede, el sistema auto-corrige la línea: cantidad pasa a 1 y si el precio excede 500,000 se pone a 0, evitando así un error SQL que bloquearía el documento.

Resumen visual del flujo

Precio
Descuento
Otros Cargos
Exoneración
IVA
Total línea

Ejemplo completo

Artículo con Precio = 1,000, Cantidad = 2, Descuento = 10%, IVA = 13%, sin exoneración, sin otros cargos, MedioPago = efectivo:

PasoCálculoValor
SubTotal12 × 1,0002,000.00
DescuentoMonto2,000 × 0.10200.00
SubTotal22,000 − 2001,800.00
SubTotal31,800 + 01,800.00
Exonerado1,800 × (0 ÷ 13)0.00
Gravado1,800 − 01,800.00
Exento1,800 − 1,800 − 00.00
IvaMonto1,800 × ((13 − 0) ÷ 100)234.00
IvaDevuelto(efectivo, no aplica)0.00
Total línea1,800 + 0 + 0 + 234 − 02,034.00
Ubicación del código
  • Backend — /api/proformas/_funciones_calculo.php — función calcularTotalesLinea() y actualizarTotalesProforma()
  • Frontend — /modulos/facturacion/factura_desktop/facturacion_factura_desktop.js — función calcularTotales()
  • Selección de precio — /api/proformas/cotizacion_cambia_tipo_precio.php
  • Agregar línea — /api/proformas/cotizacion_agrega_linea.php

Factura de contado

Genera una factura con pago inmediato. Acceso: F4 > Fact. Contado o F7 directo.

Flujo de factura contado

  1. Se valida el documento (precio > 0, artículos válidos, agente si es obligatorio)
  2. Se abre el modal de pago con el total a cobrar
  3. Seleccione el medio de pago: efectivo, tarjeta, transferencia, etc.
  4. Para efectivo: ingrese el monto recibido. El sistema calcula el vuelto
  5. Para tarjeta/transferencia: ingrese la referencia
  6. Confirme el pago. La factura se genera y se envía a Hacienda
  7. Se imprime automáticamente (según configuración)

Denominaciones de efectivo

El modal de pago muestra botones con las denominaciones de la moneda activa. Haga clic para sumar al monto recibido. Por ejemplo, para CRC: 1.000, 2.000, 5.000, 10.000, 20.000.

Facturación con Caja (Parámetro 19) Si el parámetro 19 está activo, el botón "Fact. Contado" aparece deshabilitado. La facturación de contado solo puede hacerse desde el módulo de Cajas.

Factura de crédito MV-005

Genera una factura con pago a plazo. Acceso: F4 > Fact. Crédito o F8 directo.

Requisitos

  • Cliente con código diferente a SN (debe estar registrado)
  • El cliente debe tener crédito disponible suficiente
  • Se calcula automáticamente la fecha de vencimiento según los días de crédito del cliente

Flujo

  1. Se valida el documento y el crédito disponible
  2. Se confirma la fecha de vencimiento
  3. La factura se genera con condición "Crédito"
  4. Se crea automáticamente la cuenta por cobrar (CxC)
  5. Se envía a Hacienda y se imprime
  6. Si se ingresó un adelanto, se aplica automáticamente un recibo CxC sobre la factura recién creada (ver sección abajo)

Adelanto al convertir (2026-05-11)

Cuando el cliente entrega un pago parcial al momento de generar la factura a crédito, se puede registrar el adelanto dentro del mismo modal. Tras crear la factura, el sistema aplica automáticamente un recibo CxC contra ese documento.

CampoDescripción
Monto adelantoImporte del pago inmediato. Se capea al total de la factura. Dejar en 0 si no hay adelanto.
Medio de pagoCuenta contable activa (caja, banco, etc) que recibe el adelanto. Lista cargada desde vista_catalogo_contable filtrando cuentas que inician con 1 (activos).
ComprobanteN° de transferencia, voucher, depósito, etc. Obligatorio si el monto es mayor a 0.
DetalleDescripción del pago. Obligatorio si el monto es mayor a 0.
Cómo funciona El adelanto se procesa después de que la factura ya está creada, la CxC registrada y el asiento contabilizado. Si la aplicación del adelanto falla por algún motivo (cuenta inválida, conexión, etc), la factura queda creada igual y el adelanto se puede aplicar manualmente luego desde CxC → Aplicar Recibo (MC-001). La validación de comprobante y detalle se hace antes de iniciar la conversión.

Impresión automática del recibo (2026-05-15)

Cuando el adelanto se aplica con éxito, el recibo CxC se imprime automáticamente en la misma impresora que la factura, justo después de la factura, para que ambos comprobantes salgan uno seguido del otro y se puedan entregar juntos al cliente.

  • La impresión usa la misma impresora configurada en la estación para facturas crédito.
  • Si la opción de imprimir está desmarcada en el modal, tampoco se imprime el recibo.
  • Si la impresión del recibo falla, queda registrado en el log del modal pero la factura y el recibo ya están guardados en BD — se puede re-imprimir el recibo desde el módulo CxC.

Validaciones previas

Si el monto del adelanto es mayor a 0 y falta cualquiera de los tres campos obligatorios (medio de pago, comprobante o detalle), el sistema muestra un aviso y enfoca el campo faltante antes de iniciar la transacción — no se crea la factura hasta que estén completos.

Archivar cotización

Guarda la cotización en el histórico sin generar factura. Útil para cotizaciones que se concretan sin pasar por Hacienda.

Flujo

  1. Presione F4 y seleccione Archivar Cot.
  2. Se valida que los artículos tengan stock (si aplica la restricción)
  3. Se agrega automáticamente un pago en efectivo
  4. El documento se copia a CotizaMadre/CotizaHija
  5. Se elimina de ProformaMadre (documento de trabajo)
  6. Opcionalmente se imprime en POS
Validación de stock al archivar Si un artículo tiene Sobregira = 0 (no permite sobregiro) y no tiene stock en la bodega asignada, el proceso se detiene y muestra la lista de artículos sin stock.

Enviar a Cajas

Transfiere la cotización al módulo de Cajas para que sea facturada desde ahí. Útil cuando un vendedor prepara la cotización y otro usuario la cobra.

  • Requiere permiso 123
  • El documento queda disponible en el módulo de Cajas
  • Se limpia el documento de trabajo actual

Imprimir

Múltiples formatos disponibles desde F4 > Imprimir:

Formatos de impresión

FormatoDescripción
POS CompletoTiquete para impresora térmica con precios, descuentos e IVA por línea
POS SimpleTiquete simplificado: solo cantidad, código y nombre (sin precios por línea)
PDFDocumento en formato PDF para descargar o enviar
Pantalla CompletaVista del documento en pantalla, estilo factura, con opción de imprimir desde el navegador

Modal "Imprimir cotización" — Texto vs Con Imágenes NUEVO

El botón Imprimir en la ficha Documento del panel principal abre un modal (código MV-PRT) con dos opciones para visualizar la cotización en pantalla:

OpciónDescripciónArchivo
TEXTO Vista clásica sin imágenes — más compacta, ideal para impresión rápida o envío por email ver_cotizacion_desktop.php
CON IMÁGENES Incluye una columna "Foto" al inicio de cada artículo. Útil cuando el cliente necesita identificar visualmente los productos cotizados ver_cotizacion_desktop_imagenes.php
Código del artículo en la vista TEXTO La cotización en formato TEXTO muestra el código del artículo en una columna propia, entre Cant y Descripción, con el mismo tamaño de letra que la cantidad para que sea fácil de leer.
Imágenes de artículos Las imágenes se cargan desde /img/{empresa}/articulos/{codigo}.png. Subirlas desde Inventarios → Editar artículo. Si un artículo no tiene imagen subida, aparece un placeholder gris en su lugar.
Copias En el modal de impresión puede seleccionar la cantidad de copias. El valor se guarda en localStorage para futuras impresiones.
Facturas a crédito sin "vuelto" En el tiquete POS de una factura a crédito ya no se imprimen las líneas PAGA CON ni Vuelto, porque en crédito no hay pago en efectivo al momento. Las facturas de contado siguen mostrando el vuelto normalmente.

Cálculo de totales en reportes FIX 2026-04-28

Los reportes ahora calculan VENTA BRUTA y SUB TOTAL desde las líneas individuales (no desde campos cabecera) para mayor precisión:

TotalFórmula
VENTA BRUTAΣ (ArticuloVenta × ArticuloCantidad) — precio unitario × cantidad, ANTES de descuento
DESCUENTOΣ ArticuloDescuentoMonto
SUB TOTALΣ (Gravado + Exonerado + Exento) — DESPUÉS de descuento, sin IVA
TOTAL IVASuma de IVA por línea
TOTALSUB TOTAL + TOTAL IVA − IVA DEVUELTO

Aplicado en: ver_cotizacion_desktop.php, ver_cotizacion_desktop_imagenes.php, ver_factura_desktop.php, correos de cotización (HTML + PDF) y correos de factura (HTML + PDF).

Enviar correo

Envía la cotización por correo electrónico al cliente. Desde F4 > Enviar Correo.

  • Se adjunta el PDF de la cotización
  • Se envía al email registrado del cliente
  • Opcionalmente copia al emisor (parámetro 74)
  • Opcionalmente copia al agente de ventas (parámetro 318)

Envío automático de la factura al cliente

Cuando convertís una cotización en factura, el envío del PDF al cliente depende de si la empresa usa factura electrónica o no:

  • Empresas con factura electrónica: el correo con la factura (PDF + XML firmado + XML de respuesta) se envía automáticamente después, cuando Hacienda acepta o rechaza el documento. No hay que hacer nada manual.
  • Empresas sin factura electrónica (régimen tradicional/simplificado, sin envío a Hacienda): el PDF de la factura se envía al cliente de una vez, en el momento de facturar. Antes esto solo pasaba con envío manual; ahora es automático.

En ambos casos el correo va al EmailFactura del cliente; si está marcado, se agrega copia al agente de ventas (parámetro 318) y al email de respaldo (parámetro 149). A los clientes genéricos (SN) no se les envía. Si el cliente no tiene email registrado, no se envía nada.

Compartir y exportar

Opciones disponibles desde F4:

OpciónDescripción
CompartirUsa Web Share API del navegador o descarga PDF
WhatsApp ClienteAbre WhatsApp Web con el detalle de la cotización
WhatsApp AgenteEnvía al agente de ventas por WhatsApp
Exportar ExcelDescarga archivo Excel con el detalle
Exportar XMLDescarga archivo XML con la estructura del documento

Guardar cotización

El documento se guarda automáticamente conforme agrega líneas. Sin embargo, puede usar el botón Guardar de la barra de herramientas para:

  • Asegurar que todos los cambios estén persistidos
  • Generar un número de cotización definitivo
  • Permitir que otros usuarios puedan abrir el documento

Abrir cotización

Presione el botón Abrir de la barra de herramientas para recuperar una cotización guardada.

Filtros disponibles

  • Fecha desde / hasta — Rango de búsqueda
  • Número — Búsqueda por número exacto
  • Cliente — Filtrar por código o nombre de cliente
  • Origen — Activas, Históricas o Archivadas

Columnas ACTUALIZADO

El listado muestra dos columnas para identificar al cliente:

  • N. Comercial (italic gris) — nombre comercial registrado en el catálogo de clientes (Clientes.ClienteNombreComercial)
  • Nombre Cot. (bold) — nombre manual escrito en la cotización (ProformaMadre.ClienteNombre) — es el dato editable e identificativo

Para clientes genéricos (SN, 0) que no tienen registro en el catálogo, la columna N. Comercial muestra el mismo nombre manual de la cotización para evitar quedar vacía.

Ordenamiento

Haga clic en las columnas (Número, Fecha, N. Comercial, Nombre Cot., Total, Usuario) para ordenar. La fecha ordena por defecto de más reciente a más antigua.

Exportar e imprimir listado

Al lado del botón Buscar aparecen dos botones adicionales:

  • Excel — Descarga un archivo .xlsx con los resultados filtrados. Columnas: Número, Fecha, Cliente ID, Cliente Nombre, Total, Moneda, Usuario, Agente, Estado, Líneas.
  • Imprimir — Abre una vista imprimible con los filtros aplicados, totales y tabla de cotizaciones.
Permiso 069: Ver cotizaciones de otros Sin este permiso, solo puede ver sus propias cotizaciones. Con el permiso, puede ver y recuperar cotizaciones de cualquier usuario.

Pedidos en línea y comprobante de pago NUEVO

Los pedidos que sus clientes hacen desde la tienda en línea (ecommerce) llegan al sistema como pedidos y se ven en el módulo Facturación → Pedidos en línea (requiere el permiso 115). Desde ahí, con doble clic en un pedido se abre en Facturación Desktop para revisarlo y convertirlo en factura.

Comprobante de pago (SINPE / transferencia)

Si el cliente pagó por SINPE Móvil o transferencia, al hacer el pedido puede adjuntar el número de comprobante y una imagen del pago. Ese comprobante se ve en dos momentos:

  • En la lista de “Pedidos en línea” — una columna Comprobante muestra el número de SINPE y un enlace para abrir la imagen del pago.
  • Al abrir el pedido en Facturación — aparece un banner verde en la parte superior con el texto “Comprobante de pago (SINPE/transferencia): N° …” y un botón Ver comprobante que abre la imagen en una pestaña nueva.
Recomendación Verifique que el pago realmente ingresó (revisando la imagen y su cuenta SINPE) antes de facturar el pedido. Si el pedido no trae comprobante adjunto, la columna muestra “—” y el banner no aparece.
Disponibilidad El comprobante se guarda en la tabla ProformaComprobantePago y la imagen en /img/{empresa}/comprobantes/. Si su empresa aún no tiene activada esta función, el sistema sigue funcionando igual: el pedido se ve normal, solo sin la columna de comprobante.

Historial del cliente

Desde el panel de cliente > botón Historial, puede consultar las últimas compras del cliente seleccionado.

  • Muestra las últimas 1,000 líneas de compra
  • Filtros por fecha, categoría y monto
  • Agrupamiento por categoría (toggle)
  • Doble clic para agregar un artículo al documento actual con el precio sugerido
  • Exportación a Excel y PDF

Modo código de barras

El checkbox "Código de barras" en el panel de documento controla el comportamiento al agregar artículos repetidos:

ModoArtículo repetido
ActivadoSuma la cantidad a la línea existente del mismo artículo
DesactivadoCrea una nueva línea independiente (permite mismo código varias veces)
Uso con escáner Active este modo cuando use un escáner de códigos de barras. Cada escaneo sumará +1 a la cantidad del artículo. Desactívelo si necesita varias líneas del mismo artículo con diferentes precios o bodegas.

Compuestos manuales

Permite agregar artículos compuestos (kits o paquetes) que contienen múltiples componentes. Requiere permiso 119.

Cómo usar

  1. Agregue el artículo principal al documento
  2. Abra la pestaña "Compuestos" en el panel lateral
  3. Busque y agregue los artículos componentes
  4. Ajuste las cantidades de cada componente
Tabla VentaHijaCompuesto Los componentes se guardan en la tabla VentaHijaCompuesto al facturar, vinculados a la línea principal.

Exoneración MAG

El MAG (Ministerio de Agricultura) permite a productores agropecuarios comprar con IVA reducido del 1% en lugar del 13%.

Cómo aplicar

  1. Seleccione un cliente que tenga registro MAG vigente
  2. Vaya a Opciones > pestaña MAG
  3. El sistema consulta automáticamente la vigencia del MAG
  4. Si está vigente, haga clic en Aplicar MAG
  5. Todos los artículos con IVA 13% cambian automáticamente a 1%
Vigencia La exoneración MAG tiene fecha de vencimiento. Si está vencida, el sistema no permite aplicarla. Consulte el badge MAG en el panel de cliente para ver el estado.

Exonerar con validación CABYS

Además de MAG, los clientes con exoneración autorizada (orden de exoneración, ZF, misión diplomática, etc.) pueden tener uno o varios documentos de exoneración, y cada uno con su propia lista de códigos CABYS permitidos. El sistema asigna a cada línea el documento de exoneración cuyo CABYS le corresponde.

Varios documentos de exoneración por cliente Si el cliente tiene varios códigos de exoneración, al aplicar la exoneración el sistema revisa el CABYS de cada artículo y le pone automáticamente el documento que lo cubre. En una misma factura pueden quedar líneas con documentos de exoneración distintos. No hace falta exonerar de a un documento por vez.

Cómo aplicar

  1. Agregue las líneas al documento normalmente
  2. Abra Opciones > pestaña Exonerar
  3. Se abre un modal transaccional con todas las líneas
  4. Las líneas con un CABYS autorizado aparecen con ✓ verde y muestran en la columna Cód. Exo el documento de exoneración que les corresponde
  5. Las líneas cuyo CABYS no está en ninguna exoneración aparecen con ✗ rojo y quedan gravadas (omitidas)
  6. Confirme. El sistema procesa línea por línea, cada una con su documento
¿Qué documento se elige si un CABYS está en varios? Cuando un mismo CABYS aparece en más de un documento de exoneración del cliente, gana el de vencimiento más lejano (el más vigente). El documento marcado como "predeterminado" ya no tiene prioridad: lo que manda es el CABYS de cada artículo.
Lo que ve la cotización es lo que va al XML El documento de exoneración que se asigna a cada línea queda guardado y es exactamente el que sale en el comprobante electrónico (XML) de Hacienda. Las líneas sin CABYS autorizado salen gravadas.

Quitar exoneración

Desde Opciones > Quitar Exo.. El modal muestra las líneas que tienen exoneración aplicada y al confirmar las revierte al IVA original.

Tipo de exoneración 01 La validación estricta por CABYS aplica solamente para exoneraciones tipo 01 (Compras autorizadas DGT). Para otros tipos (02 Zonas Francas, 03 Diplomáticos, etc.), no se valida el CABYS.

Moneda extranjera

FactuPOS permite facturar en moneda distinta a la nacional (USD, EUR, etc.) con conversión automática a moneda local para el asiento contable.

Cambiar la moneda del documento

  1. En el Panel Documento, haga clic en el campo Moneda
  2. Seleccione la moneda deseada (USD, EUR, etc.)
  3. El sistema usa el tipo de cambio del día (configurado en Contabilidad > Tipos de cambio)
  4. Agregue los artículos normalmente — los precios se convierten a la moneda elegida

Pagos en moneda mixta

En el modal de pago de contado puede recibir efectivo en cualquier moneda configurada. El sistema siempre guarda el pago en la moneda del documento, convirtiendo el monto recibido si es necesario:

Factura enUsuario pagaSe registra
CRC (faltante 500)500 CRC500 CRC
CRC (faltante 500)50 USD (TC=498)500 CRC + vuelto 24.400 CRC
USD (faltante $10)$10 USD10 USD
USD (faltante $10)6.000 CRC (TC=500)10 USD + vuelto $2

Asiento contable

El asiento contable se registra siempre en moneda nacional. El sistema convierte usando el tipo de cambio del documento. Si aparece una diferencia de centavos por redondeo, agrega automáticamente una línea de ajuste con la cuenta del parámetro 83 (Caja efectivo).

Parámetro 249 — Moneda nacional La moneda nacional no está fija en CRC. Se define en el parámetro 249, permitiendo operar el sistema en otros países (Panamá = PAB, El Salvador = USD, etc.).
Parámetro 110 — Conversión USD visible Si el parámetro 110 = 1 y la factura está en moneda nacional, se muestra el equivalente en USD debajo del total, calculado con el tipo de cambio actual.

Saldo a favor del cliente

Los adelantos y saldos a favor del cliente se muestran en el Panel Crédito, línea Tiene:. Cuando es mayor a 0, el monto titila suavemente para llamar la atención del cajero.

Menú del saldo a favor

Haga clic sobre el monto de Tiene: para abrir el menú con estas opciones:

OpciónQué hace
Aplicar a pagoUsa el saldo a favor como medio de pago del documento actual
Ver movimientosAbre el modal de movimientos de la cuenta de adelantos (últimos 5 años)
Imprimir saldoEmite un comprobante del saldo actual por impresora POS

Generar adelanto

Desde el botón Utils:

  • Adelanto Cliente — Registra un adelanto a favor. Requiere cliente con código.
  • Retirar Adelanto — Devuelve al cliente parte o todo su saldo a favor.
  • Retiro Adelantos SN — Caso especial para clientes sin código, abre el modal Saldos Notas de Crédito MV-040.

Modal Saldos Notas de Crédito MV-040

Ruta: UtilsRetiro Adelantos SN. Lista las facturas que generaron NC con saldo a favor disponible para clientes sin código (cuenta 2104SN, tabla SaldosAFavor).

  • Columnas: Factura · Cliente · Movimientos · Caja · Saldo
  • Buscador por número de factura o nombre de cliente
  • Tipo de devolución: Efectivo (param 83) o Tarjeta (param 84 — requiere número de comprobante de anulación del datáfono)
  • Saldo Requerido: monto a retirar. Se calcula automáticamente el Saldo a Retirar (mín. entre requerido y disponible)

Botones de acción

BotónAcción
Exportar ExcelCSV con todas las filas visibles (Nota Crédito, Caja, Usuario, Saldo, Moneda)
Imprimir SaldoImprime comprobante POS del saldo de la factura seleccionada, con detalle de movimientos (fecha + monto con signo) y saldo final
AceptarProcesa el retiro. Genera asiento contable (UDE), registra en SaldosAFavor, imprime comprobante contable y a continuación imprime el comprobante del saldo restante (incluso si queda en 0)
Doble impresión al retirar Al presionar Aceptar, la impresora emite dos tiquetes: (1) comprobante contable del movimiento UDE y (2) comprobante de saldo a favor con el detalle de movimientos. El cliente queda con constancia del retiro y del saldo que queda pendiente.

Cuenta contable del saldo a favor

La cuenta contable donde se registra el saldo a favor se construye concatenando la cuenta base (parámetro 89, por defecto 2104) con el código del cliente:

ClienteCuenta generadaNombre
1082104108Adelanto - {Nombre del cliente}
3120252104312025Adelanto - {Nombre del cliente}
SN (genérico)2104SNSaldo a Favor - Sin Cliente (SN)
Creación automática Si la cuenta no existe en el catálogo contable, se crea automáticamente al emitir la primera NC/ND o al hacer el primer retiro. No requiere configuración manual.
Cambio 2026-04-20 Antes, las NC con cliente genérico (SN) registraban el saldo directamente en caja. Ahora lo registran en 2104SN como un pasivo real. Esto permite hacer el Retiro Adelantos SN correctamente, cancelando el pasivo contra caja.
Documentación contable Los adelantos generan movimientos en la cuenta de saldos a favor del cliente. Todos los movimientos (ingresos, retiros, aplicaciones) quedan disponibles en "Ver movimientos".

Envío Express y Boletillas BO-001

Desde F4 > Envío Express, puede abrir el módulo de boletillas para gestionar envíos a domicilio / guías de transporte del día.

  • Pasa automáticamente el código y nombre del cliente actual (auto-abre el modal "Nueva Boletilla")
  • Funciona con cualquier cliente, incluyendo SN
  • Abre el módulo de boletillas en una nueva pestaña

Filtros del listado

Todos los filtros aplican auto-submit: al cambiar un valor la lista se recarga sola (los inputs de texto usan un debounce de 500ms, Enter también envía).

FiltroDescripción
Desde / HastaRango de fechas. Formato visible DD/MM/YYYY vía Flatpickr (independiente del idioma del navegador). Por defecto: mes actual.
EstadoPendiente (default) · Calle · Entregado · Todos. Nota: si no ve resultados al aplicar un filtro, revise que Estado no esté restringido a "Pendiente".
UsuarioFiltra por el cajero/usuario que creó la boletilla. Coincidencia exacta (aplica RTRIM para tolerar espacios).
AgenteFiltra por agente asignado. Incluye opción (sin agente) para ver boletillas sin asignar.
ClienteBusca por código o nombre de cliente (LIKE).
OrdenFecha descendente (default) / ascendente. Se recuerda en localStorage.

Estados

EstadoSignificado
Pendiente (0)Boletilla creada, aún sin salir a ruta.
Calle (1)El agente tiene la boletilla en ruta (con fecha/hora de Salida).
Entregado (2)Boletilla devuelta / entregada (con fecha/hora de Entrada).

Acciones masivas

Al marcar boletillas con los checkboxes aparece una barra azul con acciones:

  • Asignar Agente (MB-002) — asigna un agente a todas las seleccionadas y las pasa a estado Calle.
  • Marcar Entrada — registra hora de entrada y pasa a Entregado. Solo aplica a boletillas en estado "Calle".
  • Reset — limpia Agente a 59999, Estado a Pendiente y vacía Salida/Entrada. Útil para corregir errores.

Códigos del módulo

CódigoElemento
BO-001Listado principal de boletillas
MB-001Modal Crear / Editar Boletilla
MB-002Modal Asignar Agente (masivo)
MB-003Modal Buscar Cliente

Validación de monto alto

Cuando una línea supera los 5 millones de colones (cantidad x precio), el sistema muestra un modal de confirmación de seguridad.

Comportamiento

  1. Al agregar o editar una línea que supera el umbral, aparece un modal rojo
  2. Debe escribir la palabra "SI" (en mayúsculas) para confirmar
  3. Si cancela, la línea se elimina automáticamente
  4. Se envía una alerta por correo al email del parámetro 194
Protección contra errores Esta validación previene errores de digitación. Un artículo de 1,000 con cantidad 10,000 generaría una factura de 10 millones. El modal obliga a verificar antes de continuar.

Configuración de estación

La estación define los valores predeterminados para facturar. Acceda con el botón (piñón) en el panel Documento.

CampoDescripción
OficinaSucursal o punto de venta
CajaNúmero de caja/terminal
BodegaBodega predeterminada para las líneas
Tipo de precioNivel de precio predeterminado (1-10)
Estación por sesión La estación se asigna al iniciar sesión y se libera al salir. Solo un usuario puede usar una estación a la vez.

Modal Buscar Artículo MBA-001

Modal principal de búsqueda y selección de artículos durante la facturación. Se abre con F2 o el botón de búsqueda. Permite filtrar por categoría, por stock y muestra precios y existencias en tiempo real.

Barra de búsqueda

  • Texto — busca por código, código de barras, nombre, descripción o serie.
  • Todas las categorías — combo para limitar a una categoría específica.
  • Solo stock — checkbox que filtra a artículos con existencia positiva.
  • Buscar / Agregar — ejecuta búsqueda o agrega el primer resultado al documento.

Lista de resultados (con imagen lateral)

A la izquierda de la lista aparece la ficha de imagen del artículo seleccionado (130px de ancho, ocupa todo el alto del panel superior). Si el artículo tiene varias imágenes en su carrusel, se muestran apiladas verticalmente con scroll. Click sobre cualquier imagen la abre en grande (lightbox) sobre toda la pantalla; cierra con Esc, click fuera o el botón ✕.

Tabla con las columnas: Código, Nombre, Stock, Precio (sin IVA), IVA %, Neto (con IVA) y Cant (cantidad a agregar). Al pasar el mouse, se muestra además la categoría y subcategoría del artículo.

  • Enter sobre una fila → agrega el artículo al documento.
  • Clic sobre una fila → marca la fila como seleccionada y carga los paneles laterales de detalle.

Paneles de detalle (parte inferior)

PanelContenido
Stock ExternoExistencias en otras empresas del grupo (según configuración). La BD del usuario actual aparece resaltada en azul fuerte (sin badge). Filas en gris itálico indican que el artículo no existe en esa empresa; rojo claro = error de conexión a la BD.
PreciosLos niveles de precio (P1..Pn dinámicos) con columna Base y Base+IVA. Cada fila muestra badges de qué nivel corresponde a Estación (E) y Cliente (C). El nivel default aplicado se resalta con fondo azul.
BodegasExistencia por bodega con ubicación física. Total al encabezado.

Reglas de selección de precio (versión 2026-05-11)

El cajero puede elegir un nivel de precio diferente clickeando sobre la fila correspondiente en el panel Precios — esto se respeta al agregar la línea. Hay UNA regla que bloquea esa selección manual:

EscenarioDefault aplicadoPermite cambiar
Parámetro 57 = 1 (precio fijo de estación)P{ESTACION.tipoPrecio} forzado❌ NO. Las filas salen grises con cursor 'no permitido' y aviso amarillo "P{n} fijo".
Param 57 = 0 + Cliente SN (genérico)P{ESTACION.tipoPrecio}✅ SÍ. El cajero puede elegir cualquier otro nivel y se respeta.
Param 57 = 0 + Cliente real con TipoPrecioVentaP{TipoPrecioVenta del cliente}✅ SÍ.
Param 57 = 0 + Cliente real sin TipoPrecioP{ESTACION.tipoPrecio}✅ SÍ.

Flujo Enter — selección de precio + bodega + cantidad (bidireccional)

El Enter funciona en cualquier orden. Pasos:

  1. Buscás el artículo y se selecciona (fila marcada azul).
  2. Tipeás la cantidad en el input de la fila (default 1).
  3. Click en un nivel de precio (ej: P3) y click en una bodega (ej: Bodega A) — en cualquier orden.
  4. Enter con el foco en cualquier lado del modal → agrega con cantidad + P3 + Bodega A automáticamente.

Lo mismo aplica con doble clic en cualquier fila de precio o bodega (atajo equivalente al Enter). Tras agregar, el modal se cierra y las selecciones globales se limpian.

Cantidad por monto (Precio→Cant en barra de búsqueda)

Junto al input "Cantidad" hay un campo "Precio→Cant" que solo se activa para artículos fraccionados (azúcar, harina, líquidos a granel...). Tipeás el monto que el cliente quiere gastar (con IVA) y al hacer Enter / Tab el sistema calcula la cantidad fraccionada y la pone en Cantidad.

Fórmula: cantidad = (monto ÷ (1 + IVA/100)) ÷ precio redondeada a 3 decimales. Misma función disponible también dentro del modal Editar Artículo (MV-ART) usando el precio virtual (con descuento aplicado).

Imagen IA con Claude Vision Si el artículo se creó vía búsqueda con IA, el sistema usa Claude Vision para validar que la imagen elegida realmente sea del producto — descarta automáticamente personas, dibujos, ingredientes sueltos y logos sin marca. Reduce drásticamente las imágenes incorrectas en catálogos nuevos.

Modal Editar Artículo MV-ART

Al hacer doble clic (o usar la opción Editar) sobre una línea del documento se abre este modal para ajustar cantidad, precio, descuento, IVA, compuestos, lotes y vencimientos.

Campos principales

CampoDescripción
CantidadControlada con / +. Respeta la configuración de decimales (parámetro 25).
Precio Real / Precio Real c/IVAPrecio unitario original del artículo, sin y con IVA.
Precio Deseado / Precio c/IVA DeseadoPrecio virtual al que querés que quede el artículo. Al escribirlo, el sistema calcula solo el % de descuento necesario — NO cambia el precio base. Por eso requiere permiso 004 (descuentos), no el 024.
Desc. % / Desc. MontoDescuento manual sobre la línea. Requiere permiso 004.
Precio deseado (sin / con IVA)Campo de la ficha “Descuento desde precio virtual”: escribís el precio al que querés que quede el artículo y el sistema calcula solo el % de descuento necesario. Es un precio virtual — NO cambia el precio base. Solo requiere permiso 004 (descuentos), igual que escribir el descuento directamente.
Tarifa IVACombo con las tarifas Hacienda: 01 Exento, 02 Reducida 1%, 03 Reducida 2%, 04 Reducida 4%, 08 General 13%, 10 Exonerada, etc.
IVA %Porcentaje calculado a partir de la tarifa (solo lectura).
Detalle / SerieTexto libre adicional que se imprime y viaja al XML. Ideal para número de serie, lote o nota.

Totales del modal

En la parte inferior del modal se muestran Subtotal, IVA y Total calculados en tiempo real al cambiar cualquier campo.

Pestañas especiales

PestañaFunción
Compuestos ManualPermite agregar sub-artículos (kit) que se descuentan de bodega al aplicar. Requiere permiso 119. Tabla: Id, Código, Nombre, Uds, Bodega, Costo/Ud, Total.
LOTESSelección de lotes específicos cuando el artículo maneja control de lotes. Se distribuye la cantidad por lote.
VENCIMIENTOSSelección de lote por fecha de vencimiento. Útil para FIFO / FEFO.
Recalculo automático Al cambiar cantidad, precio o descuento, los totales (subtotal, IVA, total) se recalculan inmediatamente. Los valores se redondean a 2 decimales para evitar errores IEEE 754.
Descuento por “precio deseado” y permisos Aplicar un descuento escribiendo el precio deseado (con o sin IVA) solo requiere el permiso de descuentos (004) — igual que escribirlo en la lista de la factura. El permiso de editar precio (024) se pide únicamente si cambiás el precio base del artículo (campos “Precio Real” / “Precio Real c/IVA”), no al calcular un descuento.

Utilidades VE-UTL

Menú de funciones adicionales accesible durante la facturación. Cada utilidad abre un modal o ejecuta una acción sobre el documento actual o sobre la caja.

Inventario y artículos

UtilidadQué hace
Stock de lotesConsulta existencia por lote para el artículo seleccionado.
Kardex LotesHistorial de movimientos por lote (entradas, salidas, saldo).
Facturar a CostoAplica el costo promedio como precio de venta. Requiere permiso 021.
Sincronizar líneas con BDRefresca precios, stock y costos desde la base de datos sin perder el detalle capturado.

Cliente y saldos

UtilidadQué hace
Ingreso de adelanto de clienteRegistra un adelanto a favor del cliente (genera documento de abono).
Retiro de saldo a favorDevuelve parte o todo el saldo a favor del cliente.
Retiro Adelantos SNRetiro de adelantos del cliente genérico (Sin Nombre).

Documentos

UtilidadQué hace
Clonar CotizaciónDuplica una cotización existente en una nueva (con consecutivo nuevo).
Clonar FacturaCrea una cotización basada en una factura existente.
Reimprimir FacturaAbre el modal MV-007 para reimprimir una factura con la configuración actual de estación.
Nota de CréditoCrea una nota de crédito parcial o total sobre una factura existente.
BoletillasEnvío Express / guías de transporte.

Caja y efectivo

UtilidadQué hace
Contador MonedasHerramienta para contar billetes y monedas (arqueo de caja).
Contabilizar CierreEnvía el cierre de caja actual a Contabilidad.
Mov. ContableRegistra un movimiento contable manual asociado a la caja.
Ingreso Fondo CajaRegistra una inyección de efectivo a la caja.
Retiro Fondo CajaRegistra un retiro de efectivo de la caja.
Abrir CajónEnvía el comando ESC/POS para abrir la gaveta de dinero.

Import / Export de cotizaciones

UtilidadFormato
Exportar Cotización a Excel.xlsx con líneas y totales.
Exportar Cotización a XMLXML estructurado (útil para traspaso a otros sistemas).
Exportar Cotización a CSVSeparado por coma.
Importar Cotización (CSV/XML)Carga líneas desde archivo externo al documento actual.

Configuración

UtilidadQué hace
Romana / BalanzaAbre el modal MCF-ROM para configurar la lectura de códigos de balanzas (peso o precio embebido). Ver MCF-ROM.

Configuración Romana / Balanza MCF-ROM

Permite que el lector de barras interprete los códigos que imprimen las balanzas (romanas) cuando un código no se encuentra ni como Cod_Articulo ni como CodigoBarra. Se accede desde Utilidades VE-UTL → Configuración → Romana / Balanza.

Cómo funciona

Cuando escaneás un código en el campo de búsqueda de artículos, el sistema lo busca en este orden:

  1. Busca por Cod_Articulo exacto.
  2. Si no existe, busca en CodigoBarra.
  3. Si no existe y la romana está activa, intenta interpretarlo como código de balanza extrayendo el código del artículo y el valor (peso o precio).

El código de la balanza siempre arranca en la posición 1 y el valor sigue inmediatamente después. Solo hay que indicar 2 longitudes.

Campos del modal

CampoDescripción
Activa para toda la empresaSi está apagado, el sistema ignora la romana y los códigos no encontrados marcan error normalmente. La configuración es por empresa (compartida entre todas las estaciones).
Tipo: Cantidad / PrecioCantidad = el valor representa el peso en gramos, se divide por 1000 para obtener kg. Precio = el valor es el precio final con IVA, se calcula la cantidad como precio ÷ precio_unitario_artículo.
Largo del código del artículoCantidad de dígitos que ocupa el código del artículo desde la posición 1.
Largo del valor (peso o precio)Cantidad de dígitos del valor, arrancando justo después del código.
Probar parseo (no guarda)Pegá un código de prueba y mostrá qué extrae el sistema con la configuración actual. Útil para validar antes de guardar.

Ejemplo: EAN-13 estándar de balanza

Para un código como 2600101056111 (13 dígitos):

ConfiguraciónValor
TipoPrecio (con IVA)
Largo del código del artículo7 → extrae 2600101
Largo del valor5 → extrae 05611 = ¢5,611
Dígito 13Check digit del EAN-13, se ignora.

El artículo en la base de datos debe llamarse exactamente 2600101. Al escanear, el sistema agrega 1 unidad (en modo precio se usa la cantidad precio_balanza ÷ precio_artículo).

Configuraciones típicas

FormatoLargo cód.Largo val.Total dígitos
EAN-13 (con check digit)7513 (12 + check)
EAN-13 alterno6613 (12 + check)
Código corto6511

Importante: el último dígito de un EAN-13 es el check digit y NO debe entrar al cálculo. Por eso para 13 dígitos totales se configura código + valor = 12.

Almacenamiento

La configuración vive en la tabla dbo.RomanaConfig (singleton, 1 fila por empresa). La migración 20260511104634 la crea con valores default desactivados.

Opciones de línea MV-OPC

Modal que aplica acciones masivas sobre las líneas seleccionadas del documento. Se accede desde el menú Opciones o con el botón correspondiente de la barra de acciones.

Acciones disponibles

AcciónEfecto sobre las líneas seleccionadasPermiso
DescuentoAplica un % de descuento con tipo de descuento seleccionable.004
IVACambia la tarifa de IVA de las líneas.
PrecioAsigna un precio manual específico.024
Tipo PrecioCambia el nivel de precio (P1..P10) de las líneas.
ExonerarAplica la exoneración del cliente a las líneas.
Quitar Exo.Revierte la exoneración aplicada.
Exon. MAGAplica exoneración MAG (sector agropecuario) si el cliente la tiene vigente.
PescaMarca las líneas como actividad pesquera (exoneración especial).
BodegaCambia la bodega de origen de las líneas seleccionadas.
Saldo a favorAplica saldo a favor del cliente como forma de pago.

Aplicar descuento (modal detallado)

Al elegir "Descuento" se abre el panel con:

  • Tipo de Descuento — combo con las 10 clases Hacienda (01 Descuento general, 02 Bonificación, 07 Descuento comercial, etc.).
  • Porcentaje (%) — campo numérico con botones rápidos: 0, 5, 10, 15, 20, 25, 40, 50.
  • Descuento Máximo — checkbox que aplica el descuento máximo permitido por artículo.
  • Aplicar Descuento — botón primario que efectúa la acción sobre todas las líneas seleccionadas.
Requiere selección previa Debe marcar al menos una línea con el checkbox antes de abrir Opciones. Sin selección, las acciones no tienen efecto y se muestra un aviso.

Novedades 2026-04-23 NUEVO

Actualización mayor del módulo con migración visual completa y nuevas funcionalidades.

Migración visual Banking Bold

Todo el módulo fue migrado al estándar visual Banking Bold: fichas, modales, tabla de artículos, barra de búsqueda y totales. Características:

  • Headers azul corporativo sólido (#0047AB) con texto blanco uppercase
  • Códigos de módulo/modal (MV-001, MV-042, etc.) en amarillo puro destacado
  • Tabla de artículos con fuente 16px negro para mejor legibilidad
  • Inputs con borde visible #64748b y focus azul
  • Labels en negras 700 uppercase
  • Radius 0 en todos los elementos (esquinas rectas profesionales)
  • Soporte completo de modo oscuro con paleta adaptada

Nueva funcionalidad: Otros Datos (MV-042)

Se agregó el módulo Otros Datos (equivalente al Frm_FacturaOtrosDatos del sistema legacy VB6). Permite agregar campos adicionales arbitrarios a cualquier factura o proforma.

Cómo acceder
  • Desde Facturación Desktop: Botón Utils → Opción "Otros Datos"
  • Desde Detalle Factura (VE-030): Botón "Otros Datos" en la barra de acciones

Flujo de uso

  1. Abra el modal "Otros Datos" desde cualquiera de los dos lugares
  2. Panel izquierdo: CRUD de favoritos (agregar / renombrar / quitar nombres de campos reutilizables)
  3. Panel derecho: formulario Nombre + Valor → click en un favorito lo pre-llena
  4. "Aceptar" guarda en FacturaVentaOtrosDatos y auto-registra el nombre en favoritos
  5. Lista inferior muestra los datos actuales — clic en fila para editar, 🗑️ para eliminar

Integración con Hacienda

Los campos guardados se emiten automáticamente en el nodo <Otros> del XML enviado a Hacienda como <OtroTexto codigo="NombreCampo">valor</OtroTexto>. Paridad completa con el sistema VB6 anterior.

Transfer proforma → factura

Al convertir una proforma a factura, los datos extras se migran automáticamente del número de proforma al nuevo consecutivo de factura (sin intervención del usuario).

Auto-refresh de costos al abrir cotización

Cada vez que se abre o recupera una cotización/proforma, el sistema ahora sincroniza automáticamente los costos de las líneas con el costo actual del catálogo de artículos.

Problema que resuelve Antes, si el usuario actualizaba el costo de un artículo en Inventarios, las líneas ya existentes en proformas mantenían el costo viejo → el margen mostrado era incorrecto. Ahora al abrir la cotización, los costos se recalculan automáticamente.

Detalles técnicos:

  • Función central: actualizarCostoCotizacion(PDO, numero)
  • Respeta la moneda del documento: si está en USD, el costo se divide entre el tipo de cambio
  • Solo actualiza líneas cuyo costo difiera (tolerancia 0.0001)
  • Tras actualizar, recalcula totales de línea y totales del documento
  • Endpoint standalone disponible: POST /api/proformas/cotizacion_actualizar_costos.php

Preview del último artículo encontrado

En la barra de búsqueda, después del input de código ahora aparece un preview visual del artículo buscado:

EstadoApariencia
Sin buscarGris claro con
Artículo encontradoVerde con código + nombre completo
No existeRojo con mensaje "No encontrado"

Margen de utilidad — validaciones

La columna %Marg de la tabla tiene 4 estados según la calidad del dato:

CondiciónSe muestra
Costo ≤ 0.01 (sin costo o residual) (em dash gris)
Margen calculado entre 0% y 1000%XX.XX% verde, 2 decimales
Margen negativo (precio menor al costo)−X.XX% parpadeando rojo ↔ amarillo
Margen > 1000% (costo mal configurado)ERROR parpadeando rojo ↔ amarillo
Margen negativo — venta con pérdida Si la casilla del margen aparece parpadeando con un porcentaje negativo, significa que el precio de venta es menor al costo del artículo. Revise que:
  • El descuento aplicado no sea excesivo
  • El precio editado manualmente no esté por debajo del costo
  • El costo del artículo sea correcto (si está inflado artificialmente)
ERROR en %Marg Cuando vea una celda parpadeando con "ERROR" en la columna margen, significa que el costo del artículo está mal configurado en el catálogo de Inventarios. Corrija el costo en Inventarios → Artículos (IN-002).

Filas sin stock — formato visible

Cuando una línea de artículo tiene cantidad mayor al stock disponible (faltante en bodega), toda la fila se marca en rojo:

  • Fondo: rojo claro (#fef2f2)
  • Texto: rojo oscuro (#dc2626) en peso 600 y tamaño completo (no se ve más pequeño)
  • Todos los campos de la fila (código, nombre, cantidad, precio, totales) mantienen el mismo tamaño que filas normales

Esto permite detectar visualmente artículos que provocarían sobregiro antes de procesar la factura.

Doble clic inteligente en tabla artículos

Se intercambió la acción del doble clic para mejor UX:

  • Doble clic en el CÓDIGO del artículo → abre el Kardex (consulta histórica de movimientos)
  • Doble clic en el NOMBRE del artículo → abre Editar Línea (MV-ART)

Indicador de conexión en el Total

El header de la ficha Total ahora muestra:

  • Moneda activa del documento (CRC, USD, EUR) como chip amarillo
  • Botón 💱 Cambiar que abre un popup para cambiar la moneda del documento
  • Puntito • de conexión al extremo derecho:
    • Verde pulsando → servidor en línea
    • Rojo pulsando → sin conexión

El sistema hace un ping automático al servidor cada 30 segundos, y también escucha los eventos online/offline del navegador.

Número de documento — últimos 10 dígitos

El número del documento mostrado en la ficha Documento se recorta a los últimos 10 dígitos cuando es un consecutivo electrónico (20 caracteres). Para proformas cortas se mantiene completo. El número completo sigue enviándose correctamente a todas las APIs.

Botón "Nueva" reubicado

El botón Nueva (abrir nueva venta en pestaña aparte) se movió del panel de Herramientas a la ficha Documento, junto al botón Imprimir. Solo es visible cuando la proforma tiene consecutivo real (no en documento de trabajo).

Parámetro 380 — control completo del teléfono

El parámetro 380 (Imprimir teléfono del cliente) ahora aplica en todos los formatos de salida:

  • ✅ POS térmica (FIPVIVI002)
  • ✅ Hoja carta centrado (FIPVIVI003)
  • ✅ Hoja carta 2 columnas (FIPVIVI004)
  • ✅ PDF DataReport (FIPVIVI005)
  • ✅ Matricial GDI (FIPVIVI006)
  • ✅ Vista HTML web
  • ✅ PDF del correo electrónico
  • ✅ Cuerpo HTML del correo
  • ✅ Bluetooth

Si 380 = 0, el teléfono del cliente no se imprime y la etiqueta cambia de "Tel/Email:" a "Email:" automáticamente.

Parámetros clave

El comportamiento del módulo se controla mediante parámetros de empresa:

Parámetros 49 y 249 — Monedas 2026-04-30

El sistema maneja dos parámetros distintos para moneda:

ParámetroConceptoEditableUso
49 Moneda predeterminada ✅ Sí La que se asigna a documentos nuevos al abrir Facturación. Cambiala desde Configuración para que las cotizaciones por default arranquen en USD, EUR, etc.
249 Código moneda nacional ❌ No (fija) La moneda del país. Es la base de los tipos de cambio (TC = 1). No se cambia.

Comportamiento al abrir Facturación

  • Si el documento de trabajo (u#####u) no existe → se crea con la moneda predeterminada (param 49)
  • Si existe pero está vacío → se sincroniza con la predeterminada actual al recargar
  • Si tiene líneas → respeta la moneda original (no rompe precios convertidos)
  • Si el cliente seleccionado tiene una moneda específica configurada en su ficha → esa gana sobre la predeterminada
Conversión automática de moneda al agregar artículo 2026-04-30

Cada artículo del catálogo tiene una moneda asignada (campo Cod_TipoMoneda). Al agregar el artículo a una cotización, el sistema decide:

Moneda ArtículoMoneda DocumentoAcción
USDUSDNo convierte — inserta el precio tal cual del catálogo
CRCCRCNo convierte
CRC (nacional)USDDivide entre el TC del USD → precio en USD
USDCRC (nacional)Multiplica por el TC del USD → precio en CRC
USDEURConversión cruzada vía la moneda nacional (factor TC_USD / TC_EUR)

El TC siempre se busca actualizado en la tabla TipoCambio al agregar la línea (no se confía en valores guardados que pudieran estar desactualizados).

Configurar la moneda de cada artículo Verificá en Inventarios → Editar artículo que el campo "Moneda" coincida con la moneda en que están registrados los precios. Si los precios están en USD pero la moneda dice CRC, las cotizaciones en USD quedarán con valores incorrectos.
Tipo de cambio visible en ficha Impuestos 2026-05-02

Cuando una cotización está en moneda extranjera (USD, EUR, etc.), aparece una fila adicional en la columna Impuestos del panel de totales:

💱 T.C. USD       500.00
  • Solo se muestra si la moneda del documento difiere de la moneda nacional (param 249).
  • El valor es el TC guardado en la cotización al crearla o cambiar la moneda — se "congela" para que cotizaciones viejas mantengan su histórico.
  • Si se modifica el TC en el catálogo de Tipos de Cambio, las cotizaciones existentes no se actualizan; solo las nuevas tomarán el TC nuevo.
  • Para forzar refresco del TC en el doc de trabajo: borrar todas las líneas y recargar el módulo.
Parámetro 45 — Orden de líneas en cotización 2026-04-27

Controla cómo se ordenan los artículos al abrir/recargar una cotización. Aplicado en cotizacion_carga_desktop.php.

ValorOrden aplicadoSQL
1Por nombre del artículo (alfabético)ORDER BY a.ArticuloNombre, h.NumeroLinea
2Por código del artículoORDER BY h.ArticuloCodigo, h.NumeroLinea
3 (default)Por línea (cronológico de inserción)ORDER BY h.NumeroLinea

El segundo criterio (NumeroLinea) es desempate por si hay nombres/códigos repetidos. El frontend NO re-ordena después de agregar líneas — para ver el orden correcto hay que recargar.

Editar fecha de la cotización NUEVO

En el panel Documento, hacer click sobre la fecha (icono ✏️ a la derecha) abre un selector Flatpickr para cambiar la fecha de la cotización.

  • Conserva la hora original de la cotización — solo cambia la parte fecha
  • Funciona sin importar el estado del documento (borrador, guardada, pedido, en cajas, histórica)
  • API: POST /api/proformas/cotizacion_actualiza_fecha.php — body { numero, fecha: "YYYY-MM-DD" }
Parámetro 190 — Redondear total factura NUEVO 2026-04-22

Controla cómo se calcula el IVA de cada línea cuando el precio unitario sin IVA tiene decimales que, al sumarse con el IVA, deben cuadrar con un precio objetivo "redondo" con IVA incluido.

Caso típico: un artículo "vale" ₡1,700.00 con IVA al público. Para que eso cuadre con IVA 13%, el precio unitario sin IVA se guarda como 1,504.4248 (4 decimales). Sin este parámetro, el sistema redondea el subtotal antes de calcular el IVA y el total queda en ₡1,699.99 (pierde 1 céntimo).

ValorCálculo del IVAEjemplo PU 1,504.4248 × 1 × 13%
0 (default) IVA = Subtotal redondeado × tarifa Subtotal 1,504.42 · IVA 195.57 · Total 1,699.99
1 IVA = Subtotal sin redondear × tarifa Subtotal 1,504.42 · IVA 195.58 · Total 1,700.00

¿Cuándo activarlo?

  • El catálogo tiene precios "con IVA redondos" (₡500, ₡1,000, ₡1,700, etc.) y el cliente espera ver ese mismo total en la factura.
  • El usuario edita el campo Total con IVA en la línea y quiere que el valor digitado se respete tal cual al facturar.
  • Facturas POS / tiquetes donde el subtotal + IVA deben sumar exactamente el precio mostrado al cliente.

Nota Hacienda v4.4

Con el parámetro activo (190=1) puede haber una diferencia de ±0.01 entre Gravado × Tarifa e IvaMonto declarado en el XML. Esta diferencia está dentro de la tolerancia oficial de Hacienda (±0.05 por línea) y es el patrón estándar en sistemas de facturación electrónica que respetan el precio "con IVA objetivo".

Cómo activarlo

Desde Configuración → Parámetros de Empresa (CF-004), editar el parámetro 190 y poner valor 1. Toma efecto inmediato en la próxima línea agregada o modificada.

ParamDescripciónValores
3Agente obligatorio diferente al usuario0 = No, 1 = Sí
19Facturación solo por Cajas0 = Normal, 1 = Solo Cajas
25Decimales en cantidades0-3 decimales
50Permitir sobregiro global0 = No, 1 = Sí
57Precio fijo por estación0 = Libre, 1 = Fijo
65Relleno de código de artículo a 15 caracteres (pad con ceros a la derecha al buscar)0 = No, 1 = Sí
83Cuenta contable de Caja Efectivo (usada para ajuste de redondeo en moneda extranjera)Cuenta contable
102Bloquear selección de bodega0 = Libre, 1 = Fija
110Mostrar equivalente en USD debajo del total0 = No, 1 = Sí
125Generar factura electrónica0 = No, 1 = Sí
153-158Bloquear descuento por nivel de precio0 = Permitir, 1 = Bloquear
190Redondear total factura — cuadra el total de línea con el precio objetivo con IVA (ver detalle)0 = Tradicional, 1 = Total cuadra exacto
194Email alerta montos altosDirección email
249Código de moneda nacional (configurable por país)CRC / USD / PAB / etc.
277Recordar último descuento cliente+artículo0 = No, 1 = Sí
343Mostrar serie como nombre artículo0 = Normal, 1 = Solo serie
344Mostrar % descuento por línea en factura física, pantalla y PDF. El monto del descuento por línea y el total DESCUENTO al pie siempre se imprimen (no se ocultan).1 = Mostrar, 0 = Ocultar
385Mostrar artículos con precio 0 en el modal de búsqueda0 = Ocultar, 1 = Mostrar
390Usuario de la factura: 0 = creador de la cotización, 1 = Usuario Ventas activo0 / 1
392Agente de la factura = Usuario Ventas (requiere 390=1). Con 1 sobreescribe el agente original de la proforma. No activar si usa comisiones por agente.0 / 1

Permisos

Los permisos controlan qué acciones puede realizar cada usuario en el módulo de facturación. Se configuran desde Configuración > Usuarios asignando los códigos correspondientes.

Acceso al módulo

CódigoPermisoEfecto si NO tiene
653Acceso a Facturación DesktopNo puede abrir el módulo

Edición de líneas

CódigoPermisoEfecto si NO tiene
024Editar precio de ventaEl campo de precio aparece como solo lectura, no puede cambiar el precio unitario ni el total con IVA en las líneas
004Aplicar descuentos manualesEl campo de descuento aparece como texto, no puede modificar el % de descuento en líneas
023Hacer descuento mayor al permitido del artículoEl descuento queda limitado al máximo configurado por artículo (no puede superarlo)
006Facturar bajo la utilidad mínimaSi el precio sin IVA (con el descuento) queda bajo la utilidad mínima (parámetro 16 o por nivel) aunque siga ≥ al costo, no puede aplicarlo: el descuento se quita o el precio se ajusta al mínimo
021Facturar bajo el costoSi el precio sin IVA (con el descuento) queda por debajo del costo, no puede continuar (modal "No autorizado"). También controla la opción "Facturar a Costo" del menú de acciones
059Eliminar líneasNo puede borrar artículos individuales ni seleccionados del documento

Visualización

CódigoPermisoEfecto si NO tiene
064Ver margen de utilidadNo ve la columna "Util %" en la tabla de artículos ni el monto total de margen en el pie del documento
656Ver stock de inventarioNo ve la columna "Stock" con la existencia disponible por bodega en la tabla de artículos

Acciones del documento

CódigoPermisoEfecto si NO tiene
104Guardar cotizacionesBotón "Guardar" deshabilitado, no puede guardar proformas/cotizaciones
060Eliminar cotizacionesNo puede eliminar cotizaciones completas desde el modal de recuperar
069Ver cotizaciones de otros usuariosSolo ve sus propias cotizaciones al recuperar; con el permiso ve las de todos
119Compuestos manualesNo ve la pestaña de artículos compuestos (kits)
123Enviar a CajasBotón "Enviar a Cajas" deshabilitado
Botones deshabilitados Los botones de acciones sin permiso no se ocultan, sino que aparecen en gris con un tooltip "Sin permiso". Así el usuario sabe que la función existe pero no tiene acceso.
Cómo se asignan los permisos Los permisos se asignan por usuario en Configuración > Usuarios > Editar > Permisos. Los cambios aplican inmediatamente la próxima vez que el usuario recarga el módulo (no requiere cerrar sesión).