Cargando Sistema Iniciando interfaz...
{{ notif.message }}

Acceso Seguro

ERP Corporate OS

{{ errorMessage }}

Sucursal Activa

Selecciona la sucursal de trabajo

{{ errorMessage }}

Verificación 2FA

Ingresa el código de Google Authenticator

{{ errorMessage }}

ERP Corporate

Tasas de Cambio

{{ userData?.nombre }}

{{ userData?.tipo }}

Bienvenido, {{ userData?.nombre ? userData.nombre.split(' ')[0] : 'Usuario' }}

Panel principal del sistema.

Ventas

POS y facturación

Cajas (POS)

Turnos y Arqueos

Compras

Proveedores y pedidos

Inventario

Productos y stock

{{ (totalChatsNoLeidosGlobal > 0 ? totalChatsNoLeidosGlobal : totalNoLeidosGlobal) > 99 ? '99+' : (totalChatsNoLeidosGlobal > 0 ? totalChatsNoLeidosGlobal : totalNoLeidosGlobal) }}

WhatsApp Hub

{{ totalChatsNoLeidosGlobal > 0 ? totalChatsNoLeidosGlobal + ' chats nuevos' : totalNoLeidosGlobal + ' no leídos' }}

Gestión multi-cuenta y chat

Tesorería

Ingresos y Egresos

Usuarios y Permisos

Gestión de usuarios y roles

Taller & SAT

Servicio técnico y reacondicionamiento

Configuración

Ajustes del sistema

Configuración del Sistema

Gestiona los parámetros y preferencias de la empresa.

Datos de la Empresa

Información General

Ubicación y Contacto

Configuración de Correo

Ajustes Operativos y Financieros

$
$
%
%

Categorías de Ingreso/Egreso

Administra las categorías para los flujos de caja.

Categorías de Ingreso

Cargando...
No hay ingresos registrados.
{{ cat.cie_descripcion }}

Categorías de Egreso

Cargando...
No hay egresos registrados.
{{ cat.cie_descripcion }}

Categorías de Productos

Organiza tu catálogo en categorías y subcategorías.

Código Nombre Categoría Padre Productos Acciones

Cargando categorías...

No hay categorías registradas.
{{ cat.cat_codigo }} {{ cat.cat_nombre }} {{ cat.cat_padre || '—' }} {{ cat.total_productos ?? 0 }}

Sucursales

Gestiona las diferentes sucursales de tu empresa.

Nombre Dirección Teléfono Acciones

Cargando sucursales...

No hay sucursales registradas.
{{ suc.su_nombre }} {{ suc.su_direccion }} {{ suc.su_telefono }}

Impuestos

Configuración de tasas de impuestos.

Código Descripción Valor (%) Predeterminado Estatus Retención Acciones

Cargando impuestos...

No hay impuestos registrados.
{{ imp.imp_codigo }} ★ Por Defecto
{{ imp.imp_descripcion }} {{ imp.imp_valor }}% Sí (Principal) No Activo Inactivo Sí No

Almacenes

Gestión de depósitos y almacenes físicos.

Código Nombre Sucursales Asociadas Ciudad Master Garantía Acciones
{{ alm.alm_codigo }} {{ alm.alm_nombre }} 🏬 {{ alm.sucursales_nombres }} Sin sucursales asignadas {{ alm.alm_ciudad || '—' }} Sí Garantía

Entidades Bancarias

Administra los bancos del sistema.

Código Banco Estatus Acciones
{{ ban.ban_codigo }} {{ ban.ban_descripcion }} Activo Inactivo

Cajas (POS)

Administra los puntos de facturación.

Código Descripción Impresora / Serie Sucursal Estatus Acciones
No hay cajas registradas.
{{ caja.caj_codigo }} {{ caja.caj_descripcion }}
{{ caja.impresora_codigo }} - {{ caja.impresora_nombre }} Serie: {{ caja.serie_codigo }}
Sin impresora
{{ caja.sucursal_nombre }} Sin sucursal Activa Inactiva

Divisas (Monedas)

Administra las divisas manejadas en el sistema.

Moneda Símbolo Decimales Estatus Acciones
{{ div.div_nombre }} {{ div.div_simbolo }} {{ div.div_decimal }} Activa Inactiva

Métodos de Pago

Administra las formas de pago aceptadas.

Método Descripción Divisas Habilitadas Estatus Acciones
{{ mp.mp_nombre }} {{ mp.mp_descripcion }}
{{ d.simbolo }} ({{ d.nombre }}) ⚠️ Sin divisas
Activo Inactivo

Cuentas Bancarias

Cuenta / Banco Nº de Cuenta Divisa Métodos Aceptados Acciones
No hay registros de cuentas bancarias.
{{ c.cue_descripcion }}
{{ c.cue_alias }} • {{ c.banco_nombre || 'N/A' }}
{{ c.cue_codigo }}
{{ c.cue_tipo || 'CORRIENTE' }}
{{ c.div_simbolo || '$' }} {{ c.div_nombre || 'USD' }}
{{ m.nombre }} ⚠️ Sin métodos

Impresoras

Código Descripción Tipo Serie Asociada IP / Puerto Estatus Acciones
No hay impresoras registradas.
{{ i.imp_codigo }} {{ i.imp_descripcion }} 🧾 Fiscal 🎫 Ticket 🖥️ Punto
{{ i.serie_codigo || 'SERIE' }} {{ i.serie_nombre }} {{ i.sucursal_nombre }}
Sin serie asignada
{{ i.imp_ip || '127.0.0.1' }}:{{ i.imp_puerto || '9100' }} Activa Inactiva

Ejercicios Fiscales

Código Nombre Inicio - Fin Acciones
No hay registros.
{{ e.ej_codigo }} {{ e.ej_nombre }} {{ e.ej_fechainicio }} / {{ e.ej_fechafin }}

Marcas de Productos

Gestiona las marcas disponibles para asociar a los productos.

No hay marcas registradas

Comienza agregando la primera marca de tus productos.

ID Nombre de la Marca Acciones
{{ item.m_id }}
{{ item.m_marca }}

Tarifas de Precio

Define las tarifas de venta asignadas a productos y clientes.

costo

Costo + (Costo × X%) + Y

costoiva

(Costo+IVA) + ((Costo+IVA) × X%) + Y

pvp

PVP − (PVP × X%) − Y

pvpiva

(PVP+IVA) − ((PVP+IVA) × X%) − Y

Cód. Nombre Base % (X) Fijo (Y) Fórmula resultante Visible Acciones

Cargando tarifas...

No hay tarifas registradas.
{{ tar.tar_codigo }} {{ tar.tar_nombre }} {{ tar.tar_aplicar }} {{ tar.tar_valorx }}% {{ tar.tar_valory }} ✓ Sí —

Series Documentales

Gestión de series y prefijos para documentos.

Código Descripción Sucursal Sin IVA Acciones
{{ ser.ser_codigo }} {{ ser.ser_descripcion }} {{ ser.sucursal_nombre }} Todas / Global Sí
Arquitectura Relacional • Flujo Maestro del Sistema

Mapa de Flujos y Jerarquía

Guía visual e interactiva para la creación y encadenamiento de Sucursales, Series, Impresoras, Cajas y Empleados.

1

SUCURSAL (Sede Física)

{{ cfgSucursales.length }} Registradas

Define la sede física, dirección fiscal, teléfono y zona horaria (ej. EMOCA, CC CIMA, SUCURSAL NUEVA).

2
ALMACÉN
{{ cfgAlmacenes.length }}

Depósito de inventario y stock físico.

Se vincula a una o varias sucursales para controlar existencias y traslados.

3
SERIE DOCUMENTAL
{{ cfgSeries.length }}

Prefijo fiscal (ej. A, B, FISCAL SUCURSAL 2).

Asignada obligatoriamente a la Sucursal correspondiente.

4
CORRELATIVOS DE SERIE

Contadores para Facturas, Notas de Entrega, Presupuestos y Pedidos.

5
IMPRESORA / MÁQUINA FISCAL
{{ cfgImpresoras.length }}

Fiscal (Reportes X/Z), Ticketera o Comandera.

Ligada a la Serie. Configura su IP de red, puerto, límite fiscal y pie de página.

6
CAJA (POS / Facturación)
{{ cfgCajas.length }}

Punto de cobro físico en mostrador.

Ligada obligatoriamente a la Impresora. Hereda automáticamente su Serie y Sucursal.

7
EMPLEADO / CAJERO

Se le asignan permisos sobre la Sucursal, la Serie y la Caja.

¿Cómo opera en Facturación / Ventas?
  • El empleado inicia sesión y el sistema detecta sus Sucursales permitidas.
  • Al emitir un documento, se listan únicamente las Series de esa sucursal.
  • Al elegir la Serie, el sistema deduce automáticamente la Impresora y Caja asignada sin que el usuario deba elegirlas manualmente.
Regla de Oro de Integridad
  • No se puede eliminar una Sucursal con Series o Almacenes activos.
  • No se puede eliminar una Serie si tiene Impresoras vinculadas.
  • No se puede eliminar una Impresora si tiene Cajas asociadas.

Alertas y Notificaciones WhatsApp

Configura plantillas, frecuencia de recordatorios y automatizaciones enviadas por WhatsApp Business.

Cargando módulos de alertas...

{{ alerta.titulo }}

{{ alerta.activo == 1 ? 'Activa' : 'Desactivada' }}

{{ alerta.descripcion }}

{{ alerta.activo == 1 ? 'Alerta Habilitada' : 'Alerta Inactiva' }}
Cada días de corte/vencimiento
Cada días (1 = diario)
Al instante en cada operación
Se enviará automáticamente al número de teléfono registrado en la ficha del Cliente titular de la cuota.
Soporta formato WhatsApp (*negrita*, _cursiva_, ~tachado~)

Variables Disponibles (Clic para insertar en el texto):

Vista Previa del Mensaje Simulador en Tiempo Real
ERP

Bot de Notificaciones

Cuenta de Empresa Oficial

{{ alerta.hora_envio || '12:00' }}
Las variables entre {} se sustituyen con datos reales ✓✓ Entregado

Probar Notificación

{{ testModalAlerta.alerta ? testModalAlerta.alerta.titulo : '' }}

Incluye el código internacional de país (ej: 58 para Venezuela).

Nota sobre la prueba:

Se enviará el mensaje utilizando la plantilla configurada con datos de demostración para que verifiques el formato final en tu celular.

⚠ Zona de Riesgo — Acciones Irreversibles

Estas acciones eliminan datos transaccionales permanentemente. Úsalas solo para iniciar el sistema desde cero. Los catálogos (productos, clientes, proveedores, configuración) NO se eliminan. Solo se limpian movimientos y documentos.

Ventas & Facturación

Facturas, N/C, N/E, Presupuestos, Pedidos, Cuotas

Compras & Proveedores

Compras, notas de compra, crédito proveedor, pedidos

Inventario & Stocks

Elimina stocks, seriales/IMEI, transferencias y bitácoras de movimiento

Tesorería & Cajas

Movimientos, sesiones de caja, arqueos y saldos de cuentas bancarias

WhatsApp Hub & Chats

Elimina conversaciones, historial de mensajes y logs (conserva las cuentas y plantillas)

Reinicio Total del Sistema

Limpia todos los módulos simultáneamente y reinicia los correlativos de documentos a cero. El sistema quedará listo para comenzar operaciones reales.

Ventas Compras Inventario Tesorería + Saldos Banco WhatsApp Chats Correlativos → 0

Confirmar Limpieza

Módulo: {{ limpieza.target === 'todo' ? 'Todo el sistema + correlativos' : limpieza.target }}

Esta acción es permanente e irreversible. Para confirmar, escribe LIMPIAR en el campo a continuación:

Catálogo de Productos

Gestión de inventario, equipos y accesorios.

Resultados: {{ filteredProductos.length }}
Código Producto Precio Stock
No hay productos registrados o no coinciden con los filtros seleccionados.
{{ pro.pro_codigo }}
IMEI
{{ pro.pro_descripcion || pro.pro_nombrecorto || 'Sin nombre' }}
{{ pro.pro_nombrecorto }}
{{ [pro.fab_nombre, pro.cat_nombre].filter(Boolean).join(' • ') }}
${{ formatMoney(pro.pro_precio || 0) }} Servicio
{{ pro.pro_stockfis }} u. ⚠️ Mín: {{ pro.pro_stockmin }}

{{ currentProducto.pro_id ? 'Editar Producto: ' + currentProducto.pro_codigo : 'Nuevo Producto' }}

Gestión integral del catálogo

Galería de Imágenes

Subir/Reemplazar Imagen Principal

Puedes seleccionar varias imágenes a la vez (Max 2MB c/u)

Haz clic en cualquier miniatura para convertirla en la imagen principal.

Información Básica

Seleccionar categorías... {{ getCatLabel(cid) }}
No se encontraron categorías.
Seleccionar proveedores... {{ catProveedores.find(p => p.id == pid)?.nombre || 'Proveedor' }}
No se encontraron proveedores.
Compras (Automático)
Costo promedio ponderado calculado según compras e inventario disponible.
Obligatorio
Precio fijado manualmente para las ventas y punto de venta.

Componentes del Kit

Construye este producto seleccionando otros productos simples de tu inventario.

{{ res.descripcion }}
Stock: {{ res.stock }} | Precio Base: ${{ res.precio }}
No se encontraron productos simples con ese criterio.

Productos Incluidos en este Kit

Producto Cantidad Precio en Kit ($) Subtotal ($)
{{ comp.descripcion }}
Stock Actual: {{ comp.stock }}
{{ formatMoney(comp.cantidad * comp.precio) }}
TOTAL SUGERIDO DEL KIT: ${{ formatMoney(currentProducto.compuestos.reduce((acc, c) => acc + (c.cantidad * c.precio), 0)) }}

* Puedes trasladar este "Total Sugerido" manualmente a la pestaña "Precios y Tarifas" o usarlo como referencia.

Usa el buscador para añadir los productos que conforman este kit.

Atributos y Variantes

Construye combinaciones de productos (ej. Color y Capacidad). Selecciona hasta 2 atributos base.

Seleccione un atributo primero para cargar sus valores.

Combinaciones Generadas

Variante Código Barras Costo ($) Precio ($) Stock Físico
{{ getVarianteName(v.attrs) }}
Selecciona atributos arriba para generar las combinaciones posibles.

Cálculo de Precios e Impuestos

El costo es el promedio ponderado calculado de las compras y el precio de venta se define manualmente.

Automático
$
Ganancia
%
Obligatorio
$
Utilidad Neta por Unidad: ${{ (Math.max(0, (parseFloat(String(currentProducto.pro_precio || 0).replace(',', '.')) || 0) - (parseFloat(String(currentProducto.pro_costo || 0).replace(',', '.')) || 0))).toFixed(2) }}
Precio Final al Público (Inc. Impuesto) ${{ precio_con_impuesto }}

Catálogo de Tarifas Base

Asigna precios específicos para mayoristas, revendedores u otros esquemas.

Tarifa Fórmula Precio ($) % Utilidad
{{ getTarifaName(tar.id) }}
{{ computeTarifaFormula(tar) }} {{ getTarifaFormula(tar.id) }}
{{ (currentProducto.pro_costo > 0) ? formatMoney(((getPrecioEfectivo(tar) - currentProducto.pro_costo) / currentProducto.pro_costo) * 100) : 100 }}%
No se han configurado precios para tarifas específicas.

Existencias por Almacén

Añade stock o modifica directamente las existencias de cada almacén.

Stock Total: {{ (currentProducto.stocks || []).reduce((acc, s) => acc + (parseFloat(s.cantidad || 0) + parseFloat(s.cantidad_add || 0)), 0) }}

Agregar / Modificar Almacén

Almacén Físico Sumar (+) Mín / Máx Reservado Disponible
{{ st.almacen }}
/
{{ st.reservada || 0 }} {{ Math.max(0, (parseFloat(st.cantidad || 0) + parseFloat(st.cantidad_add || 0)) - parseFloat(st.reservada || 0)) }}
No hay almacenes asignados a este producto.

Seriales / IMEI {{ seriales.length }}

Control y trazabilidad de cada número de serie o IMEI.

Agregar Serial / IMEI

Importar masivo (pegar varios IMEIs)

No se encontraron seriales

{{ serialSearchQuery ? 'No hay resultados que coincidan con la búsqueda.' : 'No hay seriales en este estado.' }}

Serial / IMEI Almacén Estado Calidad Batería
{{ s.serial }} {{ getVarianteNameByPvid(s.pvid) }}
{{ s.almacen || 'Almacén no asignado' }} {{ s.stock == 1 ? 'En Stock' : 'Vendido / Sin Stock' }} {{ s.calidad == 0 ? 'Nuevo' : s.calidad == 1 ? 'Usado' : 'Reacond.' }} {{ s.bateria }}% —
🔒

Historial de Compras y Recepciones

{{ filteredComprasProducto.length }} {{ filteredComprasProducto.length === 1 ? 'documento' : 'documentos' }}

Trazabilidad completa de facturas, notas y pedidos de compras donde ingresó este producto.

Costo Promedio Ponderado
${{ formatMoney(comprasProductoStats.costo_promedio_ponderado || 0) }}
Base para cálculo de utilidad
Último Costo de Compra
${{ formatMoney(comprasProductoStats.ultimo_costo || 0) }}
Última factura/nota procesada
Rango de Precios Histórico
${{ formatMoney(comprasProductoStats.costo_minimo || 0) }} — ${{ formatMoney(comprasProductoStats.costo_maximo || 0) }}
Variación histórica de compras
Total Comprado
{{ comprasProductoStats.total_unidades_compradas || 0 }} unidades
Inversión: ${{ formatMoney(comprasProductoStats.total_inversion_compras || 0) }}
Fecha Documento Proveedor Ubicación Detalle / Condición Cant. Costo Unit. ($) Total ($) Estatus
Cargando historial de compras del producto...

No se encontraron documentos de compra

Este producto aún no ha sido ingresado mediante Factura, Nota de Entrega u Orden de Pedido en el módulo de Compras.

{{ c.fecha ? new Date(c.fecha).toLocaleDateString('es-VE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : '—' }}
{{ c.doc_tipo === 'FACTURA' ? 'FAC' : (c.doc_tipo === 'NOTA' ? 'NOTA' : 'PED') }} #{{ c.doc_numero || c.doc_id }}
{{ c.prov_nombre }}
{{ c.prov_cifnif }}
{{ c.almacen_nombre || 'Almacén Principal' }} {{ c.sucursal_nombre }}
{{ [c.variante_color, c.variante_capacidad].filter(Boolean).join(' - ') }} {{ c.condicion || 'Nuevo' }} 🔋 {{ c.bateria }}%
{{ c.cantidad }} ${{ formatMoney(c.precio_unitario || 0) }} ${{ formatMoney(c.total_renglon || (c.cantidad * c.precio_unitario) || 0) }} Ingresado Por Aprobar Anulado

Administrar Atributos y Valores

Crea atributos (ej. Color) y asígnales valores (ej. Rojo, Azul).

Atributos

No hay atributos.
{{ attr.nombre }}

Valores para: {{ catAtributos.find(a => a.id == selectedAtributoId)?.nombre }}

{{ val.valor }}
Este atributo no tiene valores registrados.

Selecciona un Atributo

Haz clic en un atributo de la lista izquierda para administrar sus posibles valores.

Modificar / Corregir IMEI

{{ editingSerial.oldSerial || editingSerial.serial }}

Trazabilidad / Bitácora de Vida del IMEI

No se encontraron movimientos registrados para este serial.
Producto {{ imeiTrackerData[0].pro_codigo }} — {{ imeiTrackerData[0].pro_descripcion }}
IMEI / Serial {{ imeiTrackerData[0].bts_serial }}
{{ mov.bts_descripcion }}
{{ mov.bts_fecha }}
{{ mov.bts_doc }}
Ver PDF

Reporte de Inventario en PDF

Stock actual, costos, PVP y seriales/IMEIs por categoría.

Solo con Stock Disponible Ocultar productos en 0 o negativos
|
{{ cat.parentLabel ? cat.parentLabel + ' > ' : '' }}{{ cat.label }}

Si no selecciona ninguna categoría, se incluirán todas por defecto.

Control de Inventario

Movimientos globales de productos — Entradas, Salidas y Disponible.

Productos

{{ kardexData.length }}

Total Entradas

{{ kardexData.reduce((s,r)=> s + Number(r.entradas_compras) + Number(r.entradas_nc_ventas) + Number(r.ajustes_entrada) + Number(r.transferencias_entrada), 0) }}

Total Salidas

{{ kardexData.reduce((s,r)=> s + Number(r.salidas_ventas) + Number(r.salidas_nc_compras) + Number(r.ajustes_baja) + Number(r.transferencias_salida), 0) }}

Stock Disponible

{{ kardexData.reduce((s,r)=> s + Number(r.stock_actual), 0) }}

Aplica los filtros y haz clic en Filtrar para ver el kardex.

Código Producto Inicial Compras NC Venta Ajuste+ Transf+ Ventas NC Compra Ajuste- Transf- Disponible
{{ row.pro_codigo }} {{ row.nombre }} Servicio {{ row.pro_tipo == 3 ? '—' : row.stock_inicial }} {{ row.entradas_compras > 0 ? '+' + row.entradas_compras : '—' }} {{ row.entradas_nc_ventas > 0 ? '+' + row.entradas_nc_ventas : '—' }} {{ row.ajustes_entrada > 0 ? '+' + row.ajustes_entrada : '—' }} {{ row.transferencias_entrada > 0 ? '+' + row.transferencias_entrada : '—' }} {{ row.salidas_ventas > 0 ? '-' + row.salidas_ventas : '—' }} {{ row.salidas_nc_compras > 0 ? '-' + row.salidas_nc_compras : '—' }} {{ row.ajustes_baja > 0 ? '-' + row.ajustes_baja : '—' }} {{ row.transferencias_salida > 0 ? '-' + row.transferencias_salida : '—' }} {{ row.pro_tipo == 3 ? 'Intangible' : row.stock_actual }}

Bitácora de Movimientos

{{ kardexDetalleProducto.pro_codigo }} — {{ kardexDetalleProducto.nombre }}

No hay movimientos registrados en la bitácora para este producto.
Doc Fecha Tipo Almacén Empleado Antes Entrada Salida Después
#{{ mov.doc_id }} — {{ mov.fecha }} {{ mov.tipo }} {{ mov.almacen || '—' }} {{ mov.empleado || '—' }} {{ mov.stock_antes }} {{ mov.entrada > 0 ? '+' + mov.entrada : '—' }} {{ mov.salida > 0 ? '-' + mov.salida : '—' }} {{ mov.stock_despues }}

Rastreo de Vida de IMEI

Ingresa un IMEI para ver todo su historial de movimientos.
Producto {{ imeiTrackerData[0].pro_codigo }} — {{ imeiTrackerData[0].pro_descripcion }}
IMEI Registrado {{ imeiTrackerData[0].bts_serial }}
{{ mov.bts_descripcion }}
{{ mov.bts_fecha }}
Doc: {{ mov.bts_doc }} #{{ mov.bts_docid }}

{{ compraForm.id ? 'Editar' : 'Nueva' }} {{ compraForm.tipo_documento === 'NOTA' ? 'Nota de Entrega' : (compraForm.tipo_documento === 'PEDIDO' ? 'Orden de Pedido' : 'Factura de Compra') }} #{{ compraForm.id }}

Pagada Abonada (Pendiente: ${{ formatMoney(Math.max(0, parseFloat(compraForm.total || 0) - parseFloat(compraForm.total_pagado || 0))) }}) Pendiente por Pagar Por Aprobar Anulada Borrador / Nueva

Workspace completo para recepción de mercancía y carga de compras

Bloqueado (Afectó Inventario)
{{ selectedProveedorName }}
{{ p.nombre }} {{ p.cifnif || 'Sin RIF' }}
No se encontraron resultados.

Renglones de Mercancía ({{ compraForm.items.length }})

Se permite ingresar el mismo producto en múltiples renglones
Código Producto / Condición Cantidad Costo U. ($) Desc. ($) IVA % Neto Total
No hay productos cargados en este documento. Utilice el buscador para añadir renglones.
{{ item.codigo }}
{{ item.nombre }}
🔋 Batería: %
🏢
SERIAL / IMEI: {{ typeof s === 'object' ? s.serial : s }} 🔋 {{ s.bateria }}%
${{ formatMoney(((item.cantidad * item.precio) - item.descuento) * (1 + (item.iva_pct/100))) }}

Resumen Financiero

Subtotal Neto: ${{ formatMoney(compraSubtotal) }}
Descuento Global (%):
Impuesto IVA Total: ${{ formatMoney(compraIva) }}
TOTAL USD: ${{ formatMoney(compraTotal) }}
Total Bs (Tasa {{ tasaPrincipal.df_factor }}): Bs {{ (compraTotal * parseFloat(tasaPrincipal.df_factor)).toLocaleString('es-VE', {minimumFractionDigits:2}) }}

Condición de Pago

Transporte y Logística

Módulo de Compras y Proveedores

Gestión de facturación de compras, recepción de mercancía, cuentas por pagar y sugerencias de stock

ID / Factura Sucursal Proveedor Almacén Serie Fecha Total Pendiente Estatus Acciones
Cargando facturas de compra...
No se encontraron facturas con los filtros seleccionados.
#{{ c.id }} {{ c.numfactura }} {{ c.sucursal_nombre || 'General' }} {{ c.proveedor_nombre || 'Proveedor N/A' }} {{ c.proveedor_cifnif }} {{ c.almacen_nombre || 'Principal' }} {{ c.serie_nombre || 'N/A' }} {{ c.fecha }} ${{ formatMoney(c.total || 0) }} ${{ formatMoney(Math.max(0, parseFloat(c.total || 0) - parseFloat(c.total_pagado || 0))) }} Anulada Por Aprobar Pagada Abonado ({{ Math.round((c.total_pagado / c.total) * 100) }}%) Pendiente Pago
Acciones
Factura Anulada
Sin acciones
Totales: ${{ formatMoney(calculateTotalsCompras(filteredFacturasCompras).total) }} ${{ formatMoney(calculateTotalsCompras(filteredFacturasCompras).pendiente) }}
Mostrando {{ ((currentPageFacturasCompras - 1) * pageSizeFacturasCompras) + 1 }} a {{ Math.min(currentPageFacturasCompras * pageSizeFacturasCompras, filteredFacturasCompras.length) }} de {{ filteredFacturasCompras.length }} facturas
Por pág:
ID / N° Documento Sucursal Proveedor Almacén Serie Fecha Total Pendiente Estatus Acciones
Cargando notas de entrega...
No se encontraron notas de entrega con los filtros seleccionados.
#{{ n.id }} {{ n.numfactura }} {{ n.sucursal_nombre || 'General' }} {{ n.proveedor_nombre || 'Proveedor N/A' }} {{ n.almacen_nombre || 'Principal' }} {{ n.serie_nombre || 'N/A' }} {{ n.fecha }} ${{ formatMoney(n.total || 0) }} ${{ formatMoney(Math.max(0, parseFloat(n.total || 0) - parseFloat(n.total_pagado || 0))) }} Convertida a Factura Por Aprobar Pagada Abonado ({{ Math.round((n.total_pagado / n.total) * 100) }}%) Pendiente Pago
Acciones
Convertida a Factura / Anulada
Sin acciones
Totales: ${{ formatMoney(calculateTotalsCompras(filteredNotasCompras).total) }} ${{ formatMoney(calculateTotalsCompras(filteredNotasCompras).pendiente) }}
Mostrando {{ ((currentPageNotasCompras - 1) * pageSizeNotasCompras) + 1 }} a {{ Math.min(currentPageNotasCompras * pageSizeNotasCompras, filteredNotasCompras.length) }} de {{ filteredNotasCompras.length }} notas
Por pág:
ID / Correlativo Sucursal Proveedor Almacén Target Serie Fecha Emisión Total Est. Pendiente Estatus Acciones
Cargando órdenes de pedido...
No se encontraron órdenes de pedido con los filtros seleccionados.
#{{ p.id }} {{ p.correlativo }} {{ p.sucursal_nombre || 'General' }} {{ p.proveedor_nombre || 'Proveedor N/A' }} {{ p.almacen_nombre || 'Principal' }} {{ p.serie_nombre || 'N/A' }} {{ p.fecha }} ${{ formatMoney(p.total || 0) }} ${{ formatMoney(Math.max(0, parseFloat(p.total || 0) - parseFloat(p.total_pagado || 0))) }} Emitida Anulada Borrador
Acciones
Anulado
Sin acciones
Totales: ${{ formatMoney(calculateTotalsCompras(filteredPedidosCompras).total) }} ${{ formatMoney(calculateTotalsCompras(filteredPedidosCompras).pendiente) }}
Mostrando {{ ((currentPagePedidosCompras - 1) * pageSizePedidosCompras) + 1 }} a {{ Math.min(currentPagePedidosCompras * pageSizePedidosCompras, filteredPedidosCompras.length) }} de {{ filteredPedidosCompras.length }} pedidos
Por pág:

Directorio de Proveedores

Gestión integral 360°, facturas de compra, cuentas por pagar y catálogo de productos suministrados.

Total Proveedores {{ proveedoresStats.total }}
Proveedores Activos {{ proveedoresStats.activos }}
Con Saldo Pendiente {{ proveedoresStats.conDeuda }}
Total Deuda por Pagar ${{ Number(proveedoresStats.totalDeuda || 0).toFixed(2) }}
Proveedor / Razón Social Contacto Total Comprado Saldo Deuda Estatus Acciones

No se encontraron proveedores coincidentes.

{{ (prov.nombre || 'P').substring(0, 2).toUpperCase() }}
{{ prov.cifnif || prov.documento || 'RIF N/A' }} JURÍDICA
{{ prov.telefono }}
{{ prov.email }}
Sin contacto
${{ Number(prov.total_comprado || 0).toFixed(2) }} {{ (parseInt(prov.total_facturas || 0) + parseInt(prov.total_notas || 0)) }} compras
${{ Number(prov.total_deuda).toFixed(2) }} Pendiente
Al Día
Mostrando {{ ((proveedoresPage - 1) * proveedoresPerPage) + 1 }} a {{ Math.min(proveedoresPage * proveedoresPerPage, filteredProveedoresList.length) }} de {{ filteredProveedoresList.length }} proveedores
Por pág:
{{ (selectedProveedor.nombre || 'P').substring(0, 2).toUpperCase() }}

{{ selectedProveedor.nombre }}

{{ parseInt(selectedProveedor.estatus) === 1 ? 'Activo' : 'Inactivo' }}

RIF: {{ selectedProveedor.cifnif || selectedProveedor.documento || 'N/A' }} • Tel: {{ selectedProveedor.telefono }} • {{ selectedProveedor.email }}

Total Comprado ${{ Number(selectedProveedor.total_comprado || 0).toFixed(2) }}
Saldo Deuda ${{ Number(selectedProveedor.total_deuda || 0).toFixed(2) }}

Información del Proveedor

Datos de identificación, contacto y parámetros fiscales de compras.

Documento Fecha Renglones Neto IVA Total ($) Pagado Saldo Estatus Acciones
No hay documentos de compra registrados para este proveedor.
{{ doc.tipo_label }} {{ doc.num_documento || (doc.serie + '-' + doc.correlativo) }}
{{ doc.fecha }} {{ doc.articulos_total || '-' }} ${{ Number(doc.neto || 0).toFixed(2) }} ${{ Number(doc.iva || 0).toFixed(2) }} ${{ Number(doc.total || 0).toFixed(2) }} ${{ Number(doc.total_pagado || 0).toFixed(2) }} ${{ Number(doc.saldo_restante || 0).toFixed(2) }} {{ parseInt(doc.estatus) === 2 ? 'Anulado' : (parseFloat(doc.saldo_restante || 0) <= 0.01 ? 'Pagado' : 'Pendiente') }}
Total Crédito ${{ Number(proveedorCuentasPagarData.resumen?.total_credito || 0).toFixed(2) }}
Total Pagado ${{ Number(proveedorCuentasPagarData.resumen?.total_pagado || 0).toFixed(2) }}
Saldo Pendiente ${{ Number(proveedorCuentasPagarData.resumen?.total_saldo || 0).toFixed(2) }}
Cuentas Vencidas {{ proveedorCuentasPagarData.resumen?.cuentas_vencidas || 0 }}
Documento Emisión Vencimiento Monto Total Monto Pagado Saldo Deuda Estatus Acción
No se registran cuentas por pagar en este criterio.
{{ c.tipo }} {{ c.num_documento || (c.serie + '-' + c.correlativo) }}
{{ c.fecha_emision }} {{ c.fecha_vencimiento || c.fecha_emision }} {{ Math.abs(c.dias_diferencia) }} días vencido {{ c.dias_diferencia }} días restantes ${{ Number(c.monto_total).toFixed(2) }} ${{ Number(c.monto_pagado || 0).toFixed(2) }} ${{ Number(c.saldo_pendiente).toFixed(2) }} {{ parseFloat(c.saldo_pendiente) <= 0.01 ? 'Saldada' : (parseInt(c.dias_diferencia) < 0 ? 'Vencida' : 'Al Día') }} Pagada
Catálogo {{ proveedorArticulosData.length }} productos
Producto / Código Total Comprado Costo Promedio Último Costo Total Gastado ($) Seriales / IMEIs Última Compra
No se registran artículos adquiridos con este proveedor.

{{ art.pro_nombre }}

{{ art.pro_codigo }}
{{ Number(art.total_unidades || 0) }} unds ${{ Number(art.costo_promedio || 0).toFixed(2) }} ${{ Number(art.ultimo_costo || art.costo_promedio || 0).toFixed(2) }} ${{ Number(art.total_gastado || 0).toFixed(2) }} {{ art.seriales_ingresados }} seriales - {{ art.ultima_compra }}

{{ proveedorModalForm.id ? 'Editar Proveedor' : 'Nuevo Proveedor' }}

Complete los datos de contacto y facturación del proveedor.

Cuentas por Pagar

Gestión de facturas a crédito pendientes con proveedores.

Deuda Total

${{ formatMoney(cuentasPagarCompras.reduce((sum, cp) => sum + (parseFloat(cp.monto_total || 0) - parseFloat(cp.monto_pagado || 0)), 0)) }}

Proveedor Sucursal Factura Vencimiento Estatus Deuda / Total Acciones

{{ cp.proveedor_nombre }}

Días crédito: {{ cp.dias_credito }}

{{ cp.sucursal_nombre || 'General' }} #{{ cp.numfactura || cp.id }}

{{ formatDate(cp.fecha_deuda) }}

{{ cp.fecha_vencimiento ? formatDate(cp.fecha_vencimiento) : 'N/A' }}

PAGADO VENCIDO PENDIENTE

${{ formatMoney((parseFloat(cp.monto_total || 0) - parseFloat(cp.monto_pagado || 0))) }}

de ${{ formatMoney(cp.monto_total || 0) }}

No hay deudas registradas con los filtros seleccionados

Las cuentas por pagar aparecerán aquí.

Totales Filtrados ({{ filteredCuentasPagarCompras.length }} facturas):

${{ formatMoney(filteredCuentasPagarCompras.reduce((sum, cp) => sum + (parseFloat(cp.monto_total || 0) - parseFloat(cp.monto_pagado || 0)), 0)) }}

de ${{ formatMoney(filteredCuentasPagarCompras.reduce((sum, cp) => sum + parseFloat(cp.monto_total || 0), 0)) }}

Mostrando {{ ((currentPageCuentasPagarCompras - 1) * pageSizeCuentasPagarCompras) + 1 }} a {{ Math.min(currentPageCuentasPagarCompras * pageSizeCuentasPagarCompras, filteredCuentasPagarCompras.length) }} de {{ filteredCuentasPagarCompras.length }} facturas
Por pág:

Sugerencias Inteligentes de Compra

Productos sugeridos para reabastecimiento basados en nivel de stock

Código Producto Costo Estimado Stock Actual Stock Mínimo Cantidad Sugerida
Analizando inventario...
No hay sugerencias de compra urgentes por el momento.
{{ s.codigo }} {{ s.nombre }} ${{ formatMoney(s.costo || 0) }} {{ s.stock_actual }} {{ s.stock_minimo }} +{{ s.sugerido_comprar }}

Alertas de Stock Crítico

Productos agotados o por debajo del mínimo crítico en almacén

Código Producto Costo Stock Actual Stock Mínimo Sugerido para Orden
Consultando niveles de stock...
No existen alertas de stock mínimo crítico.
{{ ps.codigo }} {{ ps.nombre }} ${{ formatMoney(ps.costo || 0) }} {{ ps.stock_actual }} {{ ps.stock_minimo }} +{{ ps.sugerido_comprar }}

Trazabilidad de IMEIs y Seriales

Historial de vida de cada equipo, su origen de compra y estatus actual.

Producto IMEI / Serial Batería/Condición Origen Estatus

{{ t.producto_nombre }}

{{ t.producto_codigo }} • {{ t.categoria_nombre || 'Sin categoría' }}

{{ t.serial }}
{{ t.condicion || 'Nuevo' }} {{ t.bateria }}%

FACTURA NOTA #{{ t.doc_origen_id }}

{{ formatDate(t.fecha_registro) }}

{{ t.almacen_nombre }}

EN STOCK VENDIDO / SALIDA

No se encontraron resultados

Busque por un número de IMEI, Serial o modelo.

Mostrando {{ ((currentPageTrazabilidadCompras - 1) * pageSizeTrazabilidadCompras) + 1 }} a {{ Math.min(currentPageTrazabilidadCompras * pageSizeTrazabilidadCompras, filteredTrazabilidadCompras.length) }} de {{ filteredTrazabilidadCompras.length }} registros
Por pág:

Resumen de Compras por Período

Estadísticas consolidadas de facturación de compras

Mes #{{ r.mes_num }}
${{ formatMoney(r.total_mes || 0) }}
{{ r.total_compras }} factura(s) procesada(s)

{{ proveedorForm.id ? 'Editar' : 'Nuevo' }} Proveedor

Registrar Pago a Proveedor (Factura #{{ pagoForm.compra_id }})

Gestión de abonos sincronizados con Tesorería y Cuentas Bancarias

Documento / Factura #{{ pagoForm.cabecera.id }} ({{ pagoForm.cabecera.numfactura }})
Fecha Emisión {{ pagoForm.cabecera.fecha || 'N/A' }}
Proveedor / Razón Social: {{ pagoForm.cabecera.proveedor_nombre }} {{ pagoForm.cabecera.proveedor_cifnif }}
Total Factura: ${{ formatMoney(pagoForm.cabecera.total || 0) }}
Saldo Restante Pendiente: ${{ formatMoney(pagoForm.cabecera.restante || 0) }}
Saldo Disponible en Cuenta: {{ getDivisaSimbolo() }} {{ formatMoney(getSaldoCuentaSeleccionada()) }}
$ {{ formatMoney(getMontoUsdCalculado()) }}

Calculador de Abono

Tasa: {{ pagoForm.factor }}
Total Factura ($): ${{ formatMoney(pagoForm.total_documento || 0) }}
Saldo Restante Pendiente: (Haga clic para auto-llenar restante)
${{ formatMoney(pagoForm.restante || 0) }} Bs {{ formatMoney(((pagoForm.restante || 0) * (pagoForm.factor || 1))) }}
Monto Ingresado ({{ getDivisaSimbolo() }}): {{ getDivisaSimbolo() }} {{ formatMoney(pagoForm.monto || 0) }}
Equivalente a Abonar ($): (Calculado a tasa {{ pagoForm.factor }})
${{ formatMoney(getMontoUsdCalculado()) }}
Monto Excede Saldo Pendiente El abono ingresar (${{ formatMoney(getMontoUsdCalculado()) }}) supera el saldo pendiente (${{ formatMoney(pagoForm.restante || 0) }}).
Balance Resultante ($): ${{ formatMoney(Math.max(0, (pagoForm.restante || 0) - getMontoUsdCalculado())) }}

Historial de Abonos de este Documento ({{ pagosDocumento.length }})

Total Abonado: ${{ formatMoney(pagosDocumento.filter(p => p.estatus == 1).reduce((acc, p) => acc + parseFloat(p.conversion || p.monto || 0), 0)) }}
ID # Referencia Método / Divisa Cuenta / Caja Tasa (Bs/$) Monto Original Monto USD ($) Fecha
No se han registrado abonos anteriores para esta factura.
#{{ p.id }} {{ p.referencia || 'S/R' }} {{ p.metodo_nombre || 'Pago' }} {{ p.divisa_nombre }} ({{ p.divisa_simbolo }}) {{ p.cuenta_alias || 'Caja' }} {{ p.banco_nombre }} {{ parseFloat(p.factor) > 1 ? formatMoney(p.factor) : '1.00' }} {{ p.divisa_simbolo || '$' }} {{ formatMoney(p.monto) }} ${{ formatMoney(p.conversion || p.monto) }} {{ p.fecha }} Anulado

Registro de IMEIs / Seriales

{{ compraForm.items[activeImeiIndex].nombre }} — {{ compraForm.items[activeImeiIndex].seriales ? compraForm.items[activeImeiIndex].seriales.length : 0 }} de {{ compraForm.items[activeImeiIndex].cantidad }} requeridos
Validación reactiva: Cada IMEI se asocia de forma permanente a este modelo y no podrá cambiar.
🔋 %
No se han registrado seriales aún. Escanee el primer IMEI.
#{{ sIdx + 1 }} {{ s.serial }}
🔋 %

Detalle de {{ currentComprasItem.tipo_documento === 'NOTA' ? 'Nota de Entrega' : (currentComprasItem.tipo_documento === 'PEDIDO' ? 'Orden de Pedido' : 'Factura de Compra') }}

N° Documento: {{ currentComprasItem.cmp_numfactura || currentComprasItem.cmpn_numfactura || currentComprasItem.cmppe_numfactura || currentComprasItem.numfactura || 'S/N' }} • Fecha: {{ currentComprasItem.cmp_fecha || currentComprasItem.cmpn_fecha || currentComprasItem.cmppe_fecha || currentComprasItem.fecha || 'N/A' }}

Proveedor

{{ currentComprasItem.proveedor_nombre || currentComprasItem.prov_nombre || 'Proveedor N/A' }}

{{ currentComprasItem.proveedor_cifnif || currentComprasItem.prov_cifnif || '' }}

Estatus del Documento Anulada Por Aprobar Pagada (100%) Abonada (Pendiente: ${{ formatMoney(Math.max(0, parseFloat(currentComprasItem.cmp_total || currentComprasItem.cmpn_total || currentComprasItem.cmppe_total || currentComprasItem.total || 0) - parseFloat(currentComprasItem.total_pagado || 0))) }}) Pendiente por Pagar
Total del Documento

${{ formatMoney(currentComprasItem.cmp_total || currentComprasItem.cmpn_total || currentComprasItem.cmppe_total || currentComprasItem.total || 0) }}

Productos / Artículos de Compra {{ (currentComprasItem.items || []).length }} ítem(s)
Código Producto / IMEIs Cantidad Precio Unit. Total
{{ it.cmpart_procodigo || it.cmpnart_procodigo || it.codigo || '—' }}
{{ it.cmpart_propnombre || it.cmpnart_propnombre || it.cmppeart_propnombre || it.nombre }}
{{ it.cmpart_condicion || it.cmpnart_condicion || it.cmppeart_condicion || it.condicion || 'Nuevo' }} {{ it.cmpart_variante_color || it.cmpnart_variante_color || it.cmppeart_variante_color || it.variante_color }} {{ it.cmpart_variante_capacidad || it.cmpnart_variante_capacidad || it.cmppeart_variante_capacidad || it.variante_capacidad }} 🔋 {{ it.cmpart_bateria || it.cmpnart_bateria || it.cmppeart_bateria || it.bateria }}%
SERIAL / IMEI: Sin seriales registrados
{{ it.cmpart_procantidad || it.cmpnart_procantidad || it.cantidad }} ${{ formatMoney(it.cmpart_proprecio || it.cmpnart_proprecio || it.precio) }} ${{ formatMoney(it.cmpart_prototal || it.cmpnart_prototal || ((it.cantidad || 1) * (it.precio || 0))) }}
Observaciones / Notas

{{ currentComprasItem.cmp_observaciones || currentComprasItem.cmpn_observaciones || currentComprasItem.observaciones }}

Cargando entorno de venta y dependencias... Sincronizando sucursales, series, cajas e inventario

POS — {{ docType === 'NOTA' ? 'Nota de Entrega' : (docType === 'PRESUPUESTO' ? 'Presupuesto' : (docType === 'PEDIDO' ? 'Orden de Pedido' : 'Factura de Venta')) }}

{{ docType }} {{ presupuestoAfectaStock ? '⚡ Descuenta Stock y Seriales' : '📄 Informativo (Sin afectar stock)' }}
MODO EDICIÓN ACTIVO: {{ documentoEnEdicion.tipo }} #{{ documentoEnEdicion.correlativo }} Cliente: {{ documentoEnEdicion.cliente_nombre }} — Modifique los artículos, cantidades o precios y guarde para actualizar.

{{ p.codigo }} — {{ p.nombre }}

IMEI Servicio
Stock: {{ p.stock }} • Precio: {{ formatMoney(p.precio) }}
{{ p.variantes.length }} Variante{{ p.variantes.length > 1 ? 's' : '' }} {{ p.seriales ? p.seriales.length : 0 }} Seriales
{{ p.variantes.length === 1 ? 'Variante del producto:' : 'Variantes del producto:' }}
Seriales / IMEIs generales disponibles:
Click sobre el serial/IMEI para agregar a la venta:

⚠ Sin seriales en stock para este almacén

El carrito está vacío

Busca un producto arriba para comenzar la venta

{{ r.codigo }}
Precio: {{ formatMoney(r.precio) }} Desc: -{{ formatMoney(r.descuento) }} [IMEI: {{ r.seriales.filter(s=>s?.trim()).length }}/{{ r.cantidad }}]
📱 Serial: {{ r.seriales.join(', ') }}
🎨 {{ r.variante_color }} 💾 {{ r.variante_capacidad }} 🔋 {{ r.bateria }}% {{ r.condicion }}

{{ formatMoney(((r.cantidad * r.precio) - (r.descuento || 0)) * (1 + (r.iva_pct || 0) / 100)) }}

{{ clienteSeleccionado.nombre || clienteSeleccionado.razon_social || clienteSeleccionado.cli_razon_social || 'Cliente General' }}

{{ clienteSeleccionado.documento || clienteSeleccionado.dni || clienteSeleccionado.cli_dni || '' }}

📍 {{ clienteSeleccionado.direccion || clienteSeleccionado.cli_direccion }}

Caja Fiscal: {{ cajaDeducida ? cajaDeducida.nombre : '⚠ Sin Caja' }}

Impresora: {{ impresoraDeducida ? impresoraDeducida.nombre : '—' }}

Turno de Caja: Turno #{{ sesionActiva ? sesionActiva.cs_id : 'Activo' }} ({{ sesionActiva && sesionActiva.caja_nombre ? sesionActiva.caja_nombre : (cajaDeducida ? cajaDeducida.nombre : 'Caja Asignada') }}) Sin Turno Activo

Turno Requerido en Ventas Debes aperturar turno en la caja "{{ cajaDeducida.nombre }}" desde el módulo de Cajas para facturar en esta serie. Debes tener una caja asignada y un turno activo en el módulo de Cajas antes de poder facturar o procesar ventas.
Subtotal{{ formatMoney(totalesFactura.subtotal) }}
Descuento-{{ formatMoney(totalesFactura.descuento) }}
Base Imponible{{ formatMoney(totalesFactura.neto) }}
IVA{{ formatMoney(totalesFactura.iva) }}
TOTAL {{ formatMoney(totalesFactura.total) }}

Módulo de Ventas (Facturación)

Gestión de facturas, notas de entrega, cotizaciones y cobros.

Historial de Ventas

Facturas y Notas de Entrega emitidas

Documento Cliente Fecha Total Estatus Acciones

{{ f.serie_nombre }}-{{ String(f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }}

{{ formatMoney(f.total) }}

Pagado: {{ formatMoney(f.total_pagado) }}

Anulada Pendiente Pagada Cuota Abonada ({{ Math.round((f.total_pagado / f.total) * 100) }}%)
No se encontraron facturas.
Totales ({{ facturasListFiltered.length }} doc):

${{ formatMoney(calculateTotals(facturasListFiltered).total) }}

Pagado: ${{ formatMoney(calculateTotals(facturasListFiltered).pagado) }}

Por cobrar: ${{ formatMoney(calculateTotals(facturasListFiltered).pendiente) }}

Mostrando {{ ((currentPage - 1) * pageSize) + 1 }} a {{ Math.min(currentPage * pageSize, facturasListFiltered.length) }} de {{ facturasListFiltered.length }} facturas
Por pág:

Notas de Entrega

Historial de notas de entrega emitidas

Documento Cliente Fecha Neto Total Estatus Acciones

{{ f.serie_nombre }}-{{ String(f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }} {{ formatMoney(f.neto) }}

{{ formatMoney(f.total) }}

Pagado: {{ formatMoney(f.total_pagado) }}

{{ f.estatus == 2 ? 'Anulada' : (f.estatus == 1 ? 'Entregada' : 'Pendiente') }}

100% Pagada

Abonado {{ Math.round((f.total_pagado / f.total) * 100) }}%

No se encontraron notas de entrega con los filtros seleccionados.
Totales ({{ notasListFiltered.length }} doc): ${{ formatMoney(calculateTotals(notasListFiltered).neto) }}

${{ formatMoney(calculateTotals(notasListFiltered).total) }}

Pagado: ${{ formatMoney(calculateTotals(notasListFiltered).pagado) }}

Por cobrar: ${{ formatMoney(calculateTotals(notasListFiltered).pendiente) }}

Mostrando {{ ((currentPageNotas - 1) * pageSizeNotas) + 1 }} a {{ Math.min(currentPageNotas * pageSizeNotas, notasListFiltered.length) }} de {{ notasListFiltered.length }} notas
Por pág:

Presupuestos y Cotizaciones

Historial de cotizaciones enviadas a clientes

Documento Cliente Fecha Total Presupuesto Estatus Acciones

{{ f.serie_nombre }}-{{ String(f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }}

{{ formatMoney(f.total) }}

{{ f.estatus == 2 ? 'Rechazado' : (f.estatus == 3 ? 'Procesado' : (f.estatus == 1 ? 'Aprobado' : 'Cotizado')) }}
No se encontraron presupuestos con los filtros seleccionados.
Totales ({{ presupuestosListFiltered.length }} doc):

${{ formatMoney(calculateTotals(presupuestosListFiltered).total) }}

Mostrando {{ ((currentPagePresupuestos - 1) * pageSizePresupuestos) + 1 }} a {{ Math.min(currentPagePresupuestos * pageSizePresupuestos, presupuestosListFiltered.length) }} de {{ presupuestosListFiltered.length }} presupuestos
Por pág:

Órdenes de Pedido

Historial de pedidos registrados

Documento Cliente Fecha Neto Total Estatus Acciones

{{ f.serie_nombre }}-{{ String(f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }} {{ formatMoney(f.neto) }}

{{ formatMoney(f.total) }}

Pagado: {{ formatMoney(f.total_pagado) }}

{{ f.estatus == 2 ? 'Anulado' : (f.estatus == 1 ? 'Procesado' : 'Pendiente') }}
No se encontraron pedidos con los filtros seleccionados.
Totales ({{ pedidosListFiltered.length }} doc): ${{ formatMoney(calculateTotals(pedidosListFiltered).neto) }}

${{ formatMoney(calculateTotals(pedidosListFiltered).total) }}

Pagado: ${{ formatMoney(calculateTotals(pedidosListFiltered).pagado) }}

Por cobrar: ${{ formatMoney(calculateTotals(pedidosListFiltered).pendiente) }}

Mostrando {{ ((currentPagePedidos - 1) * pageSizePedidos) + 1 }} a {{ Math.min(currentPagePedidos * pageSizePedidos, pedidosListFiltered.length) }} de {{ pedidosListFiltered.length }} pedidos
Por pág:

Cuentas por Cobrar y Plan de Cuotas

Control de financiamientos, cobro de cuotas, pagos próximos y alertas de mora.

Total por Cobrar ${{ formatMoney(cuotasCounts.totalMontoPendiente) }}
{{ cuotasCounts.todos }}
Cuotas en cartera
Pagos Atrasados (Mora) {{ cuotasCounts.atrasados }}
Cuotas con fecha vencida
Pagos Próximos
días
{{ cuotasCounts.proximos }}
🔔 {{ cuotasCounts.hoy }} cuota(s) vencen hoy Vencen en ≤ {{ diasProximosFiltro || 15 }} días
Cuotas Pagadas {{ cuotasCounts.pagados }}
Histórico cobrado con éxito
Ver próximos:
días
Documento / Cuota Cliente Vencimiento & Estado Monto Cuota Abonado Saldo Pendiente Acciones
{{ c.doc_tipo }} {{ c.serie }}-{{ String(c.correlativo).padStart(6, '0') }}

{{ c.descripcion || 'Cuota de Financiamiento' }}

{{ c.cliente_nombre || 'Cliente General' }}

{{ c.cliente_dni }} 📱 {{ c.cliente_telefono }}
Pagada {{ c.fecha_vence }}
Vencido hace {{ Math.abs(c.dias_para_vencer) }} día(s) Venció: {{ c.fecha_vence }}
🔔 ¡Vence Hoy! {{ c.fecha_vence }}
Vence en {{ c.dias_para_vencer }} día(s) {{ c.fecha_vence }}
{{ c.fecha_vence }} En {{ c.dias_para_vencer }} días
${{ formatMoney(c.monto) }} ${{ formatMoney(c.abonado || 0) }} ${{ formatMoney(c.saldo_pendiente) }}

No hay cuotas que coincidan con el filtro seleccionado

Prueba cambiando el filtro de estado o el término de búsqueda.

Mostrando {{ ((currentPageCuotas - 1) * pageSizeCuotas) + 1 }} a {{ Math.min(currentPageCuotas * pageSizeCuotas, filteredCuotasList.length) }} de {{ filteredCuotasList.length }} cuotas
Por pág:
Documento Cliente Emisión Total Factura Monto Abonado Saldo Restante Acciones
{{ f.doc_type || 'FACTURA' }} {{ f.serie_nombre }}-{{ String(f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }} {{ formatMoney(f.total) }} {{ formatMoney(f.total_pagado || 0) }}

{{ formatMoney(parseFloat(f.total || 0) - parseFloat(f.total_pagado || 0)) }}

¡Felicidades! No hay cuentas pendientes por cobrar.
Mostrando {{ ((currentPageCuentasCobrar - 1) * pageSizeCuentasCobrar) + 1 }} a {{ Math.min(currentPageCuentasCobrar * pageSizeCuentasCobrar, filteredCuentasCobrarList.length) }} de {{ filteredCuentasCobrarList.length }} facturas
Por pág:
Saldo Disponible a Favor ${{ formatMoney(notasListCredito.filter(n => n.estatus === 0).reduce((acc, n) => acc + (parseFloat(n.disponible) || 0), 0)) }}

Total en circulación para compras

Total Crédito Consumido ${{ formatMoney(notasListCredito.reduce((acc, n) => acc + (parseFloat(n.consumido) || 0), 0)) }}

Aplicado en ventas y facturas

Notas de Crédito Emitidas {{ notasListCredito.length }}

Por devoluciones / anulaciones

# NC Fecha Cliente Documento Origen Monto Original Consumido Saldo Disponible Estado Acciones
No se encontraron notas de crédito con los filtros seleccionados.
NC-{{ String(nc.correlativo || nc.id).padStart(5, '0') }} {{ nc.fecha ? nc.fecha.slice(0, 16) : 'N/A' }} {{ nc.cliente_nombre }} {{ nc.cliente_dni }} {{ nc.doc_type }} #{{ nc.doc_id }} {{ nc.descripcion }} ${{ formatMoney(nc.monto) }} ${{ formatMoney(nc.consumido) }} ${{ formatMoney(nc.disponible) }}
Anulada {{ nc.observacion }}
Disponible Consumida
Anulada —
Mostrando {{ ((currentPageNotasCredito - 1) * pageSizeNotasCredito) + 1 }} a {{ Math.min(currentPageNotasCredito * pageSizeNotasCredito, notasListCreditoFiltered.length) }} de {{ notasListCreditoFiltered.length }} notas de crédito
Por pág:

Directorio de Clientes

Gestión integral 360°, cuentas por cobrar, cuotas de financiamiento y catálogo de compras.

Total Clientes {{ clientesStats.total }}
Clientes Activos {{ clientesStats.activos }}
Con Saldo Pendiente {{ clientesStats.conDeuda }}
Cartera por Cobrar ${{ Number(clientesStats.totalDeuda || 0).toFixed(2) }}
Cliente / Razón Social Contacto Tarifa Total Comprado Saldo Deuda Estatus Acciones

No se encontraron clientes coincidentes.

{{ (cli.nombre || 'C').substring(0, 2).toUpperCase() }}
{{ cli.documento }} JURÍDICA
{{ cli.telefono }}
{{ cli.email }}
📍 {{ cli.direccion }}
Sin contacto
{{ cli.tarifa_nombre || 'General' }} ${{ Number(cli.total_comprado || 0).toFixed(2) }} ${{ Number(cli.total_deuda || 0).toFixed(2) }}
{{ cli.total_cuotas_pendientes }} cuota(s) pend.
Mostrando {{ ((clientesPage - 1) * clientesPerPage) + 1 }} a {{ Math.min(clientesPage * clientesPerPage, filteredClientesList.length) }} de {{ filteredClientesList.length }} clientes
Por pág:
{{ (selectedCliente.nombre || 'C').substring(0, 2).toUpperCase() }}

{{ selectedCliente.nombre }}

{{ parseInt(selectedCliente.estatus) === 1 ? 'Activo' : 'Inactivo' }}

Doc: {{ selectedCliente.documento }} • Tel: {{ selectedCliente.telefono }} • {{ selectedCliente.email }} • 📍 {{ selectedCliente.direccion }}

Total Comprado ${{ Number(selectedCliente.total_comprado || 0).toFixed(2) }}
Saldo Deuda ${{ Number(selectedCliente.total_deuda || 0).toFixed(2) }}

Información Personal y Fiscal

Datos generales, canales de contacto y condiciones comerciales.

Documento Fecha Sucursal Neto IVA Total ($) Pagado Saldo Estatus Acciones
No hay documentos registrados para este cliente.
{{ doc.tipo_doc }} {{ doc.serie }}-{{ doc.correlativo }}
{{ doc.fecha }} {{ doc.sucursal || 'N/A' }} ${{ Number(doc.neto || 0).toFixed(2) }} ${{ Number(doc.iva || 0).toFixed(2) }} ${{ Number(doc.total || 0).toFixed(2) }} ${{ Number(doc.total_pagado || 0).toFixed(2) }} ${{ Number(doc.saldo || 0).toFixed(2) }} {{ parseInt(doc.estatus) === 2 ? 'Anulado' : (parseFloat(doc.saldo || 0) <= 0.01 ? 'Pagado' : 'Pendiente') }}
Total Financiado ${{ Number(clienteCuotasData.resumen?.total_financiado || 0).toFixed(2) }}
Total Pagado ${{ Number(clienteCuotasData.resumen?.total_pagado || 0).toFixed(2) }}
Saldo Pendiente ${{ Number(clienteCuotasData.resumen?.total_saldo || 0).toFixed(2) }}
Cuotas Vencidas {{ clienteCuotasData.resumen?.cuotas_vencidas || 0 }}
Cuota / Detalle Documento Origen Vencimiento Monto Cuota Monto Pagado Saldo Restante Estatus Acción
No se registran cuotas en este criterio.
{{ c.descripcion || ('Cuota #' + c.id) }}
{{ c.origen_tipo }} {{ c.serie }}-{{ c.correlativo }}
{{ c.fecha_vencimiento }} ${{ Number(c.monto).toFixed(2) }} ${{ Number(c.pagado || 0).toFixed(2) }} ${{ Number(c.saldo).toFixed(2) }} {{ c.estado_label }} Saldada
Unidades {{ clienteArticulosData.resumen?.total_unidades || 0 }}
Invertido ${{ Number(clienteArticulosData.resumen?.total_invertido || 0).toFixed(2) }}
Producto / Descripción IMEIs / Seriales Cant. Precio Unit. Desc. Total ($) Documento Fecha
No se registran artículos adquiridos en este historial.

{{ art.nombre }}

{{ art.codigo }}
{{ art.seriales }}
Sin serial
{{ Number(art.cantidad) }} ${{ Number(art.precio).toFixed(2) }} ${{ Number(art.descuento || 0).toFixed(2) }} ${{ Number(art.total).toFixed(2) }}
{{ art.doc_tipo }} {{ art.serie }}-{{ art.correlativo }}
{{ art.fecha }}

{{ clienteModalForm.id > 0 ? 'Editar Cliente' : 'Nuevo Cliente' }}

Dinámica y Reportes de Ventas

Análisis cronológico (Días, Meses, Años) y desglose por Clientes con márgenes y rentabilidad.

Documentos Emitidos
{{ reporteResumen.total_docs || 0 }} docs
Total operaciones del período
Artículos Vendidos
{{ formatNumber(reporteResumen.total_items || 0, 0) }} unid
Volumen físico despachado
Venta Bruta Total
${{ formatNumber(reporteResumen.total_venta || 0) }}
Facturación total acumulada
Utilidad Bruta
${{ formatNumber(reporteResumen.total_ganancia || 0) }}
Ventas menos costo reposición
Margen Comercial Prom.
{{ formatNumber(reporteResumen.margen_promedio || 0, 1) }}%
Rentabilidad sobre venta

Desglose Cronológico de Ventas ({{ reporteFilas.length }} registros)

Período / Fecha Docs Unidades Costo Total Venta Total Utilidad Margen % Acumulado Progresivo
No se encontraron operaciones de venta con los filtros seleccionados.
{{ fila.periodo_label }} {{ fila.total_docs }} {{ formatNumber(fila.total_items, 0) }} ${{ formatNumber(fila.total_costo) }} ${{ formatNumber(fila.total_venta) }} ${{ formatNumber(fila.ganancia) }} {{ formatNumber(fila.margen_porcentaje, 1) }}% ${{ formatNumber(fila.acumulado_venta) }}
Totales Generales {{ reporteResumen.total_docs }} {{ formatNumber(reporteResumen.total_items, 0) }} ${{ formatNumber(reporteResumen.total_costo) }} ${{ formatNumber(reporteResumen.total_venta) }} ${{ formatNumber(reporteResumen.total_ganancia) }} {{ formatNumber(reporteResumen.margen_promedio, 1) }}% ${{ formatNumber(reporteResumen.total_venta) }}
🚫 Facturas y Documentos Anulados en el Período ({{ reporteAnulados.length }})
Total Anulado: ${{ formatNumber(reporteResumen.monto_anulados || 0) }}
Fecha / Hora Documento Cliente Emitido Por Motivo de Anulación / Observaciones Monto ($)
{{ a.fecha }} {{ a.tipo_documento }} #{{ a.correlativo }}
{{ a.cliente_nombre }}
{{ a.cliente_dni }}
{{ a.usuario }} {{ a.observaciones || 'Sin observación registrada' }} ${{ formatNumber(a.total) }}

Ventas Desglosadas por Cliente ({{ reporteClientesFiltrados.length }} clientes)

# Cliente / Razón Social Cédula / RIF Docs Unidades Costo Venta Total Utilidad Margen % Última Compra
No se encontraron clientes con operaciones para este rango o búsqueda.
{{ idx + 1 }} {{ cli.cliente_nombre }} {{ cli.cliente_dni || '—' }} {{ cli.total_docs }} {{ formatNumber(cli.total_items, 0) }} ${{ formatNumber(cli.total_costo) }} ${{ formatNumber(cli.total_venta) }} ${{ formatNumber(cli.ganancia) }} {{ formatNumber(cli.margen_porcentaje, 1) }}% {{ cli.ultima_venta ? formatDate(cli.ultima_venta) : '—' }}

Ventas Desglosadas por Producto ({{ reporteProductosFiltrados.length }} productos)

# Código Descripción del Producto Categoría Cant. Vendida Docs Costo Total Venta Total Utilidad Margen % Última Venta
No se encontraron productos con operaciones para este rango o búsqueda.
{{ idx + 1 }} {{ pro.pro_codigo }} {{ pro.pro_descripcion }} {{ pro.categoria }} {{ formatNumber(pro.total_cant, 0) }} {{ pro.total_docs }} ${{ formatNumber(pro.total_costo) }} ${{ formatNumber(pro.total_venta) }} ${{ formatNumber(pro.ganancia) }} {{ formatNumber(pro.margen_porcentaje, 1) }}% {{ pro.ultima_venta ? formatDate(pro.ultima_venta) : '—' }}

Tesorería

Control de ingresos, egresos, saldos de cuentas y traspasos.

Resumen de Liquidez y Saldos

Capital Invertido
${{ formatMoney(stockCosto || 0) }}

Costo total de mercancía en almacén

Valor Proyectado
${{ formatMoney(stockVenta || 0) }}

Ingresos si se vende todo al precio base

Ganancia Bruta Estimada
${{ formatMoney(stockGanancia || 0) }}

Diferencia entre valor proyectado e invertido

Saldos de Cuentas, Bancos y Cajas

{{ cuenta.bc_alias }}
{{ cuenta.banco_nombre || 'Efectivo/Caja' }}
ID: {{ cuenta.bc_id }}
{{ cuenta.div_simbolo }} {{ formatMoney(cuenta.bc_saldo || 0) }}
No hay cuentas activas registradas.
hasta
ID Fecha Cuenta Afectada Categoría Concepto Monto Estatus Acciones
#{{ mov.fab_id }} {{ mov.fab_fecha }}
Nota de Crédito / Saldo Favor
Crédito en Cuenta (No Monetario Directo)
Trade-In (Equipo Usado)
Valoración de Equipo Recibido
{{ mov.cuenta_nombre || 'N/A' }}
{{ mov.banco_nombre }}
{{ mov.categoria_nombre || (mov.fab_modulo === 'Cobranza Saldo a Favor' ? 'Aplicación Saldo Favor' : (mov.fab_modulo === 'Trade-In' ? 'Trade-In' : 'Venta')) }} {{ mov.fab_observacion || mov.fab_descripcion }} {{ mov.div_simbolo }} {{ formatMoney(mov.fab_monto) }}
No se encontraron ingresos para estos filtros.
Total Mostrado: ${{ formatMoney(movimientosTotales) }}
hasta
ID Fecha Cuenta Afectada Categoría Concepto Monto Estatus Acciones
#{{ mov.fab_id }} {{ mov.fab_fecha }}
{{ mov.cuenta_nombre || 'N/A' }}
{{ mov.banco_nombre }}
{{ mov.categoria_nombre || 'Sin Categoría' }} {{ mov.fab_observacion || mov.fab_descripcion }} {{ mov.div_simbolo }} {{ formatMoney(mov.fab_monto) }}
No se encontraron egresos para estos filtros.
Total Mostrado: ${{ formatMoney(movimientosTotales) }}
Origen (Sale de)
Destino (Entra a)
ID Fecha Concepto Origen → Destino Monto Estatus
#{{ t.id }} {{ t.fecha }} {{ t.concepto || 'Traspaso interno' }}
{{ t.cuenta_origen_nombre || '—' }}
{{ t.banco_origen }}
{{ t.metodo_origen }}
{{ t.cuenta_destino_nombre || '—' }}
{{ t.banco_destino }}
{{ t.metodo_destino }}
{{ t.simbolo_origen }} {{ parseFloat(t.monto_origen || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
{{ t.simbolo_destino }} {{ parseFloat(t.monto_destino || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
No se encontraron traspasos para estos filtros.
{{ cfgTraspasos.length }} traspaso(s) {{ cfgTraspasos[0]?.simbolo_origen || '$' }} {{ cfgTraspasos.reduce((s,t) => s + parseFloat(t.monto_origen||0), 0).toLocaleString('de-DE',{minimumFractionDigits:2}) }}
hasta
Fecha / Hora Ref / Doc Descripción de la Cuenta Debe (Ingreso) Haber (Egreso)
{{ mov.fab_fecha }} #{{ mov.fab_id }}
{{ mov.cuenta_nombre || 'Cuenta N/A' }} {{ mov.fab_observacion || mov.fab_descripcion }}
{{ mov.div_simbolo }} {{ formatMoney(mov.fab_monto) }} {{ mov.div_simbolo }} {{ formatMoney(Math.abs(mov.fab_monto)) }}
No hay movimientos contables en este período.

Estado de Cuenta Bancario & Flujo de Caja

Conciliación cronológica entre fechas, consolidado diario y saldo progresivo continuo.

Seleccione una cuenta bancaria o caja para consultar su estado de cuenta.

Podrá ver el resumen de saldos, el consolidado de cada día y el historial ordenado de movimientos.

Saldo Inicial (al {{ estadoCuentaFiltros.f_desde }})
{{ estadoCuentaData.cuenta?.div_simbolo || '$' }} {{ formatNumber(estadoCuentaData.resumen?.saldo_inicial || 0) }}
Flujo histórico acumulado
Total Ingresos (+)
+{{ estadoCuentaData.cuenta?.div_simbolo || '$' }} {{ formatNumber(estadoCuentaData.resumen?.total_ingresos || 0) }}
Créditos en el período
Total Egresos (-)
-{{ estadoCuentaData.cuenta?.div_simbolo || '$' }} {{ formatNumber(estadoCuentaData.resumen?.total_egresos || 0) }}
Débitos en el período
Saldo Final (al {{ estadoCuentaFiltros.f_hasta }})
{{ estadoCuentaData.cuenta?.div_simbolo || '$' }} {{ formatNumber(estadoCuentaData.resumen?.saldo_final || 0) }}
{{ estadoCuentaData.resumen?.total_movs || 0 }} movimientos
Dinero Invertido en Stock ${{ formatMoney(totalesValuacionFiltrados?.dinero_invertido || 0) }}

{{ (totalesValuacionFiltrados?.unidades_stock || 0).toLocaleString() }} unidades físicas valoradas

📦
Proyección Total de Venta ${{ formatMoney(totalesValuacionFiltrados?.proyeccion_venta || 0) }}

Recaudación total estimada a PVP

💰
Utilidad Proyectada (Ganancia) +${{ formatMoney(totalesValuacionFiltrados?.utilidad_proyectada || 0) }}

Margen Rentabilidad: {{ totalesValuacionFiltrados?.margen_promedio_pct || 0 }}%

📈
Inventario en Stock
{{ (totalesValuacionFiltrados?.unidades_stock || 0).toLocaleString() }} unidades

{{ totalesValuacionFiltrados?.total_equipos_seriales || 0 }} seriales/IMEIs activos

📱
🔍
Filtro activo "{{ liquidezBusqueda }}": {{ totalesValuacionFiltrados.total_productos }} modelos encontrados | Invertido: ${{ formatMoney(totalesValuacionFiltrados.dinero_invertido) }} | PVP Proyectado: ${{ formatMoney(totalesValuacionFiltrados.proyeccion_venta) }} | Ganancia: +${{ formatMoney(totalesValuacionFiltrados.utilidad_proyectada) }} ({{ totalesValuacionFiltrados.margen_promedio_pct }}%)
No se encontraron categorías ni productos para los filtros o búsqueda seleccionados.
🏷️

{{ catGroup.categoria_nombre }}

{{ catGroup.total_productos }} modelos · {{ catGroup.unidades_stock }} uds.
Invertido: ${{ formatMoney(catGroup.dinero_invertido) }} Venta: ${{ formatMoney(catGroup.proyeccion_venta) }} Ganancia: +${{ formatMoney(catGroup.utilidad_proyectada) }} ({{ catGroup.margen_pct }}%)
Código Producto / Modelo Tipo Stock Costo Prom. ($) Dinero Invertido ($) PVP ($) Proy. Venta ($) Ganancia Neta ($) Margen % Detalle
{{ p.pro_codigo || 'N/A' }}
{{ p.pro_nombre }}
{{ p.seriales_activos }} seriales/IMEIs en inventario
Usado Nuevo Reacond. Mixto Equipo Serial General {{ p.stock }} ${{ formatMoney(p.costo_promedio) }} ${{ formatMoney(p.dinero_invertido) }} ${{ formatMoney(p.precio_venta) }} ${{ formatMoney(p.proyeccion_venta) }} +${{ formatMoney(p.utilidad_proyectada) }} {{ p.margen_pct }}% —
Código Producto / Descripción Categoría Tipo Stock Costo Promedio ($) Dinero Invertido ($) PVP ($) Proyección Venta ($) Ganancia Neta ($) Margen % Acción
No se encontraron productos para el criterio de búsqueda o filtro.
{{ p.pro_codigo || 'N/A' }}
{{ p.pro_nombre }}
{{ p.seriales_activos }} seriales/IMEIs activos
{{ p.categoria_nombre }} Usado Nuevo Reacond. Mixto Equipo Serial General {{ p.stock }} ${{ formatMoney(p.costo_promedio) }} ${{ formatMoney(p.dinero_invertido) }} ${{ formatMoney(p.precio_venta) }} ${{ formatMoney(p.proyeccion_venta) }} +${{ formatMoney(p.utilidad_proyectada) }} {{ p.margen_pct }}% —
Totales Evaluados: {{ (totalesValuacionFiltrados?.unidades_stock || 0).toLocaleString() }} — ${{ formatMoney(totalesValuacionFiltrados?.dinero_invertido || 0) }} — ${{ formatMoney(totalesValuacionFiltrados?.proyeccion_venta || 0) }} +${{ formatMoney(totalesValuacionFiltrados?.utilidad_proyectada || 0) }} {{ totalesValuacionFiltrados?.margen_promedio_pct || 0 }}% —

🏢 Distribución de Capital y Proyección por Almacén

Almacén Sucursal Unidades en Stock Dinero Invertido ($) Proyección Venta ($) Ganancia Proyectada ($) Margen %
{{ alm.alm_nombre }} {{ alm.sucursal_nombre }} {{ alm.unidades_stock.toLocaleString() }} ${{ formatMoney(alm.dinero_invertido) }} ${{ formatMoney(alm.proyeccion_venta) }} +${{ formatMoney(alm.utilidad_proyectada) }} {{ alm.margen_pct }}%
📱

Seriales / IMEIs en Stock: {{ modalSerialesLiquidez.producto?.pro_nombre }}

Código: {{ modalSerialesLiquidez.producto?.pro_codigo }} · Costo Promedio: ${{ formatMoney(modalSerialesLiquidez.producto?.costo_promedio) }} · PVP: ${{ formatMoney(modalSerialesLiquidez.producto?.precio_venta) }}

⏳ Cargando seriales del equipo...
No hay seriales activos en stock para este producto.
# Serial / IMEI Almacén Batería Condición Fecha Ingreso
{{ idx + 1 }} {{ ser.serial }} {{ ser.almacen || 'Principal' }} {{ ser.bateria }}% — Usado Reacondicionado Nuevo {{ ser.fecha }}
Total: {{ modalSerialesLiquidez.seriales.length }} equipos disponibles

Registrar {{ currentItem.tipo === 'ingreso' ? 'Ingreso' : 'Egreso' }}

⚠️ Sin cuentas para este método en {{ getDivisaSimbolo(currentItem.divisa_id) }}. Asigne en Configuración.

Saldo actual en cuenta: {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(getSaldoCuenta(currentItem.cuenta_id)) }}
Saldo insuficiente: La cuenta dispone de {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(getSaldoCuenta(currentItem.cuenta_id)) }}. El egreso solicitado es de {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(currentItem.monto || 0) }}.
{{ getDivisaSimbolo(currentItem.divisa_id) }}
≈ ${{ formatMoney(currentItem.monto / currentItem.factor) }} USD

Traspaso entre Cuentas

Compra / Venta de Divisas

Pagas con (Sale de tu caja/cuenta)

Saldo insuficiente en cuenta origen: Disponible: {{ catDivisas.find(d => d.div_id == currentItem.origen_divisa_id)?.div_simbolo || '$' }} {{ formatMoney(getSaldoCuenta(currentItem.origen_id)) }}. Egreso requerido: {{ catDivisas.find(d => d.div_id == currentItem.origen_divisa_id)?.div_simbolo || '$' }} {{ formatMoney(currentItem.monto_entrega || 0) }}.
Tasa: {{ currentItem.monto_entrega && currentItem.monto_recibe ? (parseFloat(currentItem.monto_entrega) / parseFloat(currentItem.monto_recibe)).toFixed(4) : '—' }}

Recibes en (Entra a tu caja/cuenta)

Cajas y Cierres Z

Gestión de turnos, arqueos y control de efectivo.

Cargando...

Sin Turno Activo

No tienes una sesión de caja abierta con tu usuario. Abre tu turno para comenzar a facturar y registrar cobros.

Turnos Abiertos en la Empresa ({{ cfgTurnosAbiertos.length }})
#{{ t.cs_id }}

{{ t.cajero }} (@{{ t.username }})

{{ t.caja_codigo }} - {{ t.caja_nombre }} • Apertura: {{ t.cs_fecha_apertura }}

Fondo Inicial ${{ parseFloat(t.cs_fondo_inicial || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Turno Activo #{{ cfgSesionActiva.cs_id }}

Cajero: {{ cfgSesionActiva.cajero }} (@{{ cfgSesionActiva.username }})
Caja Asignada: {{ cfgSesionActiva.caja_codigo ? (cfgSesionActiva.caja_codigo + ' - ') : '' }}{{ cfgSesionActiva.caja_nombre }}
Serie / Sucursal: [{{ cfgSesionActiva.serie_codigo || 'SERIE' }}] {{ cfgSesionActiva.serie_nombre || 'Principal' }} 🏢 {{ cfgSesionActiva.sucursal_nombre }}
Fecha de Apertura: {{ cfgSesionActiva.cs_fecha_apertura }}
Fondo Inicial en Gaveta: ${{ parseFloat(cfgSesionActiva.cs_fondo_inicial || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Historial de Cierres de Caja

Consulta los cierres Z y arqueos previos.

Turno ID Caja Cajero Apertura Cierre Fondo Inicial Descuadre Acciones
No hay cierres registrados.
#{{ c.cs_id }} {{ c.caja_nombre }} {{ c.cajero }} {{ c.cs_fecha_apertura }} {{ c.cs_fecha_cierre }} ${{ parseFloat(c.cs_fondo_inicial).toLocaleString('de-DE', {minimumFractionDigits:2}) }} Cuadrado {{ parseFloat(c.descuadre_total).toLocaleString('de-DE', {minimumFractionDigits:2}) }} Faltante +{{ parseFloat(c.descuadre_total).toLocaleString('de-DE', {minimumFractionDigits:2}) }} Sobrante

Taller & Servicio Técnico (SAT)

Gestión de órdenes de reparación, reacondicionamiento y atención al cliente.

Tipo:
Estado:
Técnico:

No hay órdenes activas en este momento

Registra una nueva orden de servicio o ajusta los filtros de búsqueda.

{{ orden.codigo }} {{ orden.categoria }}

{{ orden.equipo_nombre }}

{{ orden.estatus_nombre }}
👤 Cliente: {{ orden.cliente_nombre }}
🔢 Serial/IMEI: {{ orden.imei }}
🔑 Clave/PIN: {{ orden.clave_bloqueo }}
👨‍🔧 Técnico: {{ orden.tecnico_nombre }}
🎒 Custodia: {{ orden.accesorios }}
⏱️ Tiempo en Taller: {{ orden.dias_en_taller }} días
Falla Reportada:

{{ orden.falla }}

Piezas / Insumos: ${{ parseFloat(orden.costo_total || 0).toFixed(2) }}
Total Presupuesto: ${{ parseFloat(orden.presupuesto || orden.precio_total || 0).toFixed(2) }}
Sin teléfono registrado Garantía: {{ orden.dias_garantia || 30 }}d

⚡ Enviar Teléfono de Almacén a Taller Costeo Compuesto

Selecciona un teléfono del inventario para iniciar su proceso de reacondicionamiento técnico.

{{ s.pros_serial }}
{{ s.pro_nombre }}
Costo Base: ${{ parseFloat(s.costo_base || 0).toFixed(2) }} • {{ s.alm_nombre }}

Teléfonos Propios en Proceso de Reacondicionamiento

Carga repuestos a cada IMEI para actualizar su costo compuesto real antes de ponerlo a la venta.

{{ ordenesReacondicionamiento.length }} en proceso

No hay teléfonos propios en taller en este momento.

Código / Orden Equipo / Modelo IMEI / Serial Técnico Asignado Inversión en Piezas Estado Acciones
{{ ord.codigo }} {{ ord.equipo_nombre }} {{ ord.imei || 'Sin IMEI' }} {{ ord.tecnico_nombre }} ${{ parseFloat(ord.costo_total || 0).toFixed(2) }} {{ ord.total_repuestos }} repuestos {{ ord.estatus_nombre }}

Historial de Órdenes y Reacondicionamientos Finalizados

Auditoría completa de equipos reparados, piezas utilizadas e impacto financiero.

No hay registros en el historial todavía.

Código Tipo Equipo / Modelo IMEI Cliente / Destino Técnico Inversión Repuestos Facturado / Cobrado Estado Acciones
{{ ord.codigo }} {{ ord.tipo == 2 ? 'Stock' : 'Cliente' }} {{ ord.equipo_nombre }} {{ ord.imei || '—' }} {{ ord.cliente_nombre }} {{ ord.tecnico_nombre }} ${{ parseFloat(ord.costo_total || 0).toFixed(2) }} {{ ord.tipo == 1 ? '$' + parseFloat(ord.precio_total || 0).toFixed(2) : 'Stock Vendible' }} {{ ord.estatus_nombre }}

⚙️ Estados de Servicio Técnico (SAT) Personalizables

Configura las etapas por las que transita una orden de reparación técnica.

ID Nombre del Estado Color / Badge Activo Acciones
{{ st.id }} {{ st.nombre }}
{{ st.nombre }}
{{ st.activo == 1 ? 'Activo' : 'Inactivo' }}

WhatsApp Hub Multi-Cuenta {{ totalNoLeidos }} no leídos

Gestión omnicanal centralizada de líneas de WhatsApp para atención y ventas.

Línea:

No se encontraron conversaciones con estos filtros.

{{ conv.contacto_nombre || conv.contacto_telefono }}

{{ conv.ultimo_at ? conv.ultimo_at.substring(11, 16) : '' }}

Tú: {{ conv.ultimo_mensaje || 'Conversación activa' }}

{{ conv.estado ? conv.estado.toUpperCase() : 'PENDIENTE' }} {{ conv.cuenta_nombre }}
{{ conv.no_leidos }}

📱 Líneas y Cuentas de WhatsApp Conectadas Multi-Cuenta

Administra los números de WhatsApp asociados al sistema para recepción y envío omnicanal.

Nombre de Línea Número Conectado Identificador Único (Unique ID) Mensajes No Leídos Estado Acciones
No hay líneas de WhatsApp registradas.
{{ c.nombre }} +{{ c.numero }} {{ c.unique_id }} {{ c.unread_count }} — {{ c.estado }}

⚡ Respuestas Rápidas y Plantillas de Atención

Configura atajos de texto (/hola, /pagos, /sat) para agilizar la atención de tus asesores de ventas.

No hay respuestas rápidas configuradas aún.

{{ p.atajo }}

{{ p.titulo }}

{{ p.categoria }}
{{ p.mensaje }}
⚡

Conexión Automática con WapiSMS 1-Clic

Ingresa solo tu correo y contraseña de WapiSMS. El ERP se conectará vía API, obtendrá automáticamente tu Secret Key y sincronizará tus líneas de WhatsApp.

✉️
🔒

⚙️ Parámetros de API y Webhook de WhatsApp Base de Datos

Todos los parámetros se almacenan y gestionan directamente en la tabla wa_config de la base de datos.

Endpoint oficial del proveedor de mensajería (WapiSMS / Meta).
Llave secreta para autenticación de envíos y validación de webhook.
Instancia utilizada para avisos automáticos de pedidos y cobros.
Números telefónicos separados por coma que reciben alertas del sistema.

Este endpoint procesa en tiempo real los mensajes entrantes (`message:received`), salientes y estados de entrega utilizando el secret configurado en la base de datos.

¿Cómo conectar una nueva línea o número?

  1. Dirígete a tu panel de WhatsApp Gateway (WapiSMS o proveedor).
  2. Copia el Unique ID / Token de la instancia o número que deseas conectar.
  3. En la pestaña "Cuentas / Líneas" del ERP, presiona "Nueva Línea WhatsApp".
  4. Ingresa el nombre de la sucursal/departamento (ej. *CIMA*, *EMOCA*, *Soporte*), el número telefónico y pega el Unique ID.
  5. Guarda y listo: todos los mensajes recibidos en ese número entrarán automáticamente a la bandeja de entrada unificada.

Usuarios y Permisos

Gestión de cuentas, roles de acceso y matriz de permisos por módulo.

Total usuarios: {{ filteredUsuarios.length }}

Sin usuarios registrados

Haz clic en "Nuevo Usuario" para crear la primera cuenta.

{{ (u.nombres || u.username || 'U').charAt(0).toUpperCase() }}

{{ (u.nombres || '') + ' ' + (u.apellidos || '') }}

@{{ u.username }}

Rol: {{ u.tipo || 'USUARIO' }}
Email: {{ u.email }}
Teléfono: {{ u.telefono }}

{{ isEditMode ? 'Editar: @' + usuarioForm.username : 'Nuevo Usuario del Sistema' }}

Configura el rol, accesos y permisos permitidos.

Información de Acceso y Usuario

Matriz de Permisos por Módulo

Configuración individual o clonación desde otro usuario

👑
Usuario con Rol Administrador

Este usuario tiene acceso total automático a todos los módulos y funciones del ERP. No requiere marcar permisos individuales.

Asignaciones del Usuario

Sucursales Permitidas
No hay sucursales registradas
Monedas / Divisas Permitidas
No hay monedas registradas
Cuentas Bancarias Permitidas
No hay cuentas registradas
Series Permitidas
No hay series registradas
Cajas Físicas Permitidas
No hay cajas registradas
Rol: Administrador (Acceso total automático) Rol: {{ usuarioForm.tipo }} · {{ usuarioForm.modules.length }} módulos permitidos

Mi Perfil

Gestiona tu información personal y seguridad.

{{ userData?.nombre }}

{{ userData?.tipo }}

Información Personal

Tus datos de contacto y perfil dentro de la empresa.

Cambiar Contraseña

Actualiza tu clave de acceso al sistema.

Doble Factor de Autenticación (2FA)

Añade una capa extra de seguridad usando Google Authenticator.

Configurar Aplicación 2FA

QR 2FA
Generando QR...
  1. Descarga Google Authenticator en tu teléfono.
  2. Presiona el botón + y escanea el código QR de la izquierda.
  3. Ingresa el código numérico que aparece en la app para confirmar.
Tu cuenta está protegida por Autenticación de Dos Pasos.

Deshabilitar 2FA

Por seguridad, ingresa tu contraseña actual para continuar.

Menú Corporativo

{{ userData?.nombre }} ({{ userData?.tipo }})

Sucursal:

¿Estás completamente seguro?

{{ confirmMessage || '¿Deseas confirmar y procesar esta acción en el sistema?' }}

Anular {{ anularDocInfo?.label || 'Documento' }}

Reversión segura de existencias, seriales y saldos contables.

Verificando movimientos y equipos en Trade-In...
Equipos en Trade-In Recibidos ${{ parseFloat(anularInfoData.total_tradein || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

{{ t.producto_nombre }}

IMEI: {{ t.pros_serial }}

${{ parseFloat(t.monto).toLocaleString('de-DE', {minimumFractionDigits:2}) }} En Stock Ya Vendido

Aviso: El equipo de Trade-In ya fue vendido

El teléfono recibido en Trade-In ya no está en inventario disponible. Se generará automáticamente un crédito a favor del cliente por el monto total recibido (${{ parseFloat(anularInfoData.total_general_recibido).toLocaleString('de-DE', {minimumFractionDigits:2}) }}) incluyendo el valor tasado del equipo.

Nota de Crédito / Saldo a Favor a generar: ${{ parseFloat((anularInfoData.has_tradein && anularTradeInChecked && anularInfoData.hay_en_stock) ? anularInfoData.total_dinero : anularInfoData.total_general_recibido).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
⚠️ Se registrará formalmente en la bitácora del sistema la fecha, el usuario y el motivo obligatorio de esta anulación.

{{ anularError }}

{{ isEditMode ? 'Editar: @' + usuarioForm.username : 'Nuevo Usuario del Sistema' }}

Configura el rol, accesos y permisos permitidos.

Información de Acceso y Usuario

Matriz de Permisos por Módulo

Configuración individual o clonación desde otro usuario

👑
Usuario con Rol Administrador

Este usuario tiene acceso total automático a todos los módulos y funciones del ERP. No requiere marcar permisos individuales.

Asignaciones del Usuario

Sucursales Permitidas
No hay sucursales registradas
Monedas / Divisas Permitidas
No hay monedas registradas
Cuentas Bancarias Permitidas
No hay cuentas registradas
Series Permitidas
No hay series registradas
Cajas Físicas Permitidas
No hay cajas registradas
Rol: Administrador (Acceso total automático) Rol: {{ usuarioForm.tipo }} · {{ usuarioForm.modules.length }} módulos permitidos

{{ currentProducto.pro_id ? 'Editar Producto: ' + currentProducto.pro_codigo : 'Nuevo Producto' }}

Gestión integral del catálogo

Galería de Imágenes

Subir/Reemplazar Imagen Principal

Puedes seleccionar varias imágenes a la vez (Max 2MB c/u)

Haz clic en cualquier miniatura para convertirla en la imagen principal.

Información Básica

Seleccionar categorías... {{ getCatLabel(cid) }}
No se encontraron categorías.
Seleccionar proveedores... {{ catProveedores.find(p => p.id == pid)?.nombre || 'Proveedor' }}
No se encontraron proveedores.
Compras (Automático)
Costo promedio ponderado calculado según compras e inventario disponible.
Obligatorio
Precio fijado manualmente para las ventas y punto de venta.

Componentes del Kit

Construye este producto seleccionando otros productos simples de tu inventario.

{{ res.descripcion }}
Stock: {{ res.stock }} | Precio Base: ${{ res.precio }}
No se encontraron productos simples con ese criterio.

Productos Incluidos en este Kit

Producto Cantidad Precio en Kit ($) Subtotal ($)
{{ comp.descripcion }}
Stock Actual: {{ comp.stock }}
{{ formatMoney(comp.cantidad * comp.precio) }}
TOTAL SUGERIDO DEL KIT: ${{ formatMoney(currentProducto.compuestos.reduce((acc, c) => acc + (c.cantidad * c.precio), 0)) }}

* Puedes trasladar este "Total Sugerido" manualmente a la pestaña "Precios y Tarifas" o usarlo como referencia.

Usa el buscador para añadir los productos que conforman este kit.

Atributos y Variantes

Construye combinaciones de productos (ej. Color y Capacidad). Selecciona hasta 2 atributos base.

Seleccione un atributo primero para cargar sus valores.

Combinaciones Generadas

Variante Código Barras Costo ($) Precio ($) Stock Físico
{{ getVarianteName(v.attrs) }}
Selecciona atributos arriba para generar las combinaciones posibles.

Cálculo de Precios e Impuestos

El costo es el promedio ponderado calculado de las compras y el precio de venta se define manualmente.

Automático
$
Ganancia
%
Obligatorio
$
Utilidad Neta por Unidad: ${{ (Math.max(0, (parseFloat(String(currentProducto.pro_precio || 0).replace(',', '.')) || 0) - (parseFloat(String(currentProducto.pro_costo || 0).replace(',', '.')) || 0))).toFixed(2) }}
Precio Final al Público (Inc. Impuesto) ${{ precio_con_impuesto }}

Catálogo de Tarifas Base

Asigna precios específicos para mayoristas, revendedores u otros esquemas.

Tarifa Fórmula Precio ($) % Utilidad
{{ getTarifaName(tar.id) }}
{{ computeTarifaFormula(tar) }} {{ getTarifaFormula(tar.id) }}
{{ (currentProducto.pro_costo > 0) ? formatMoney(((getPrecioEfectivo(tar) - currentProducto.pro_costo) / currentProducto.pro_costo) * 100) : 100 }}%
No se han configurado precios para tarifas específicas.

Existencias por Almacén

Añade stock o modifica directamente las existencias de cada almacén.

Stock Total: {{ (currentProducto.stocks || []).reduce((acc, s) => acc + (parseFloat(s.cantidad || 0) + parseFloat(s.cantidad_add || 0)), 0) }}

Agregar / Modificar Almacén

Almacén Físico Sumar (+) Mín / Máx Reservado Disponible
{{ st.almacen }}
/
{{ st.reservada || 0 }} {{ Math.max(0, (parseFloat(st.cantidad || 0) + parseFloat(st.cantidad_add || 0)) - parseFloat(st.reservada || 0)) }}
No hay almacenes asignados a este producto.

Seriales / IMEI {{ seriales.length }}

Control y trazabilidad de cada número de serie o IMEI.

Agregar Serial / IMEI

Importar masivo (pegar varios IMEIs)

No se encontraron seriales

{{ serialSearchQuery ? 'No hay resultados que coincidan con la búsqueda.' : 'No hay seriales en este estado.' }}

Serial / IMEI Almacén Estado Calidad Batería
{{ s.serial }} {{ getVarianteNameByPvid(s.pvid) }}
{{ s.almacen || 'Almacén no asignado' }} {{ s.stock == 1 ? 'En Stock' : 'Vendido / Sin Stock' }} {{ s.calidad == 0 ? 'Nuevo' : s.calidad == 1 ? 'Usado' : 'Reacond.' }} {{ s.bateria }}% —
🔒

Historial de Compras y Recepciones

{{ filteredComprasProducto.length }} {{ filteredComprasProducto.length === 1 ? 'documento' : 'documentos' }}

Trazabilidad completa de facturas, notas y pedidos de compras donde ingresó este producto.

Costo Promedio Ponderado
${{ formatMoney(comprasProductoStats.costo_promedio_ponderado || 0) }}
Base para cálculo de utilidad
Último Costo de Compra
${{ formatMoney(comprasProductoStats.ultimo_costo || 0) }}
Última factura/nota procesada
Rango de Precios Histórico
${{ formatMoney(comprasProductoStats.costo_minimo || 0) }} — ${{ formatMoney(comprasProductoStats.costo_maximo || 0) }}
Variación histórica de compras
Total Comprado
{{ comprasProductoStats.total_unidades_compradas || 0 }} unidades
Inversión: ${{ formatMoney(comprasProductoStats.total_inversion_compras || 0) }}
Fecha Documento Proveedor Ubicación Detalle / Condición Cant. Costo Unit. ($) Total ($) Estatus
Cargando historial de compras del producto...

No se encontraron documentos de compra

Este producto aún no ha sido ingresado mediante Factura, Nota de Entrega u Orden de Pedido en el módulo de Compras.

{{ c.fecha ? new Date(c.fecha).toLocaleDateString('es-VE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : '—' }}
{{ c.doc_tipo === 'FACTURA' ? 'FAC' : (c.doc_tipo === 'NOTA' ? 'NOTA' : 'PED') }} #{{ c.doc_numero || c.doc_id }}
{{ c.prov_nombre }}
{{ c.prov_cifnif }}
{{ c.almacen_nombre || 'Almacén Principal' }} {{ c.sucursal_nombre }}
{{ [c.variante_color, c.variante_capacidad].filter(Boolean).join(' - ') }} {{ c.condicion || 'Nuevo' }} 🔋 {{ c.bateria }}%
{{ c.cantidad }} ${{ formatMoney(c.precio_unitario || 0) }} ${{ formatMoney(c.total_renglon || (c.cantidad * c.precio_unitario) || 0) }} Ingresado Por Aprobar Anulado

Administrar Atributos y Valores

Crea atributos (ej. Color) y asígnales valores (ej. Rojo, Azul).

Atributos

No hay atributos.
{{ attr.nombre }}

Valores para: {{ catAtributos.find(a => a.id == selectedAtributoId)?.nombre }}

{{ val.valor }}
Este atributo no tiene valores registrados.

Selecciona un Atributo

Haz clic en un atributo de la lista izquierda para administrar sus posibles valores.

Modificar / Corregir IMEI

{{ editingSerial.oldSerial || editingSerial.serial }}

Trazabilidad / Bitácora de Vida del IMEI

No se encontraron movimientos registrados para este serial.
Producto {{ imeiTrackerData[0].pro_codigo }} — {{ imeiTrackerData[0].pro_descripcion }}
IMEI / Serial {{ imeiTrackerData[0].bts_serial }}
{{ mov.bts_descripcion }}
{{ mov.bts_fecha }}
{{ mov.bts_doc }}
Ver PDF

Reporte de Inventario en PDF

Stock actual, costos, PVP y seriales/IMEIs por categoría.

Solo con Stock Disponible Ocultar productos en 0 o negativos
|
{{ cat.parentLabel ? cat.parentLabel + ' > ' : '' }}{{ cat.label }}

Si no selecciona ninguna categoría, se incluirán todas por defecto.

{{ proveedorForm.id ? 'Editar' : 'Nuevo' }} Proveedor

Registrar Pago a Proveedor (Factura #{{ pagoForm.compra_id }})

Gestión de abonos sincronizados con Tesorería y Cuentas Bancarias

Documento / Factura #{{ pagoForm.cabecera.id }} ({{ pagoForm.cabecera.numfactura }})
Fecha Emisión {{ pagoForm.cabecera.fecha || 'N/A' }}
Proveedor / Razón Social: {{ pagoForm.cabecera.proveedor_nombre }} {{ pagoForm.cabecera.proveedor_cifnif }}
Total Factura: ${{ formatMoney(pagoForm.cabecera.total || 0) }}
Saldo Restante Pendiente: ${{ formatMoney(pagoForm.cabecera.restante || 0) }}
Saldo Disponible en Cuenta: {{ getDivisaSimbolo() }} {{ formatMoney(getSaldoCuentaSeleccionada()) }}
$ {{ formatMoney(getMontoUsdCalculado()) }}

Calculador de Abono

Tasa: {{ pagoForm.factor }}
Total Factura ($): ${{ formatMoney(pagoForm.total_documento || 0) }}
Saldo Restante Pendiente: (Haga clic para auto-llenar restante)
${{ formatMoney(pagoForm.restante || 0) }} Bs {{ formatMoney(((pagoForm.restante || 0) * (pagoForm.factor || 1))) }}
Monto Ingresado ({{ getDivisaSimbolo() }}): {{ getDivisaSimbolo() }} {{ formatMoney(pagoForm.monto || 0) }}
Equivalente a Abonar ($): (Calculado a tasa {{ pagoForm.factor }})
${{ formatMoney(getMontoUsdCalculado()) }}
Monto Excede Saldo Pendiente El abono ingresar (${{ formatMoney(getMontoUsdCalculado()) }}) supera el saldo pendiente (${{ formatMoney(pagoForm.restante || 0) }}).
Balance Resultante ($): ${{ formatMoney(Math.max(0, (pagoForm.restante || 0) - getMontoUsdCalculado())) }}

Historial de Abonos de este Documento ({{ pagosDocumento.length }})

Total Abonado: ${{ formatMoney(pagosDocumento.filter(p => p.estatus == 1).reduce((acc, p) => acc + parseFloat(p.conversion || p.monto || 0), 0)) }}
ID # Referencia Método / Divisa Cuenta / Caja Tasa (Bs/$) Monto Original Monto USD ($) Fecha
No se han registrado abonos anteriores para esta factura.
#{{ p.id }} {{ p.referencia || 'S/R' }} {{ p.metodo_nombre || 'Pago' }} {{ p.divisa_nombre }} ({{ p.divisa_simbolo }}) {{ p.cuenta_alias || 'Caja' }} {{ p.banco_nombre }} {{ parseFloat(p.factor) > 1 ? formatMoney(p.factor) : '1.00' }} {{ p.divisa_simbolo || '$' }} {{ formatMoney(p.monto) }} ${{ formatMoney(p.conversion || p.monto) }} {{ p.fecha }} Anulado

Registro de IMEIs / Seriales

{{ compraForm.items[activeImeiIndex].nombre }} — {{ compraForm.items[activeImeiIndex].seriales ? compraForm.items[activeImeiIndex].seriales.length : 0 }} de {{ compraForm.items[activeImeiIndex].cantidad }} requeridos
Validación reactiva: Cada IMEI se asocia de forma permanente a este modelo y no podrá cambiar.
🔋 %
No se han registrado seriales aún. Escanee el primer IMEI.
#{{ sIdx + 1 }} {{ s.serial }}
🔋 %

Detalle de {{ currentComprasItem.tipo_documento === 'NOTA' ? 'Nota de Entrega' : (currentComprasItem.tipo_documento === 'PEDIDO' ? 'Orden de Pedido' : 'Factura de Compra') }}

N° Documento: {{ currentComprasItem.cmp_numfactura || currentComprasItem.cmpn_numfactura || currentComprasItem.cmppe_numfactura || currentComprasItem.numfactura || 'S/N' }} • Fecha: {{ currentComprasItem.cmp_fecha || currentComprasItem.cmpn_fecha || currentComprasItem.cmppe_fecha || currentComprasItem.fecha || 'N/A' }}

Proveedor

{{ currentComprasItem.proveedor_nombre || currentComprasItem.prov_nombre || 'Proveedor N/A' }}

{{ currentComprasItem.proveedor_cifnif || currentComprasItem.prov_cifnif || '' }}

Estatus del Documento Anulada Por Aprobar Pagada (100%) Abonada (Pendiente: ${{ formatMoney(Math.max(0, parseFloat(currentComprasItem.cmp_total || currentComprasItem.cmpn_total || currentComprasItem.cmppe_total || currentComprasItem.total || 0) - parseFloat(currentComprasItem.total_pagado || 0))) }}) Pendiente por Pagar
Total del Documento

${{ formatMoney(currentComprasItem.cmp_total || currentComprasItem.cmpn_total || currentComprasItem.cmppe_total || currentComprasItem.total || 0) }}

Productos / Artículos de Compra {{ (currentComprasItem.items || []).length }} ítem(s)
Código Producto / IMEIs Cantidad Precio Unit. Total
{{ it.cmpart_procodigo || it.cmpnart_procodigo || it.codigo || '—' }}
{{ it.cmpart_propnombre || it.cmpnart_propnombre || it.cmppeart_propnombre || it.nombre }}
{{ it.cmpart_condicion || it.cmpnart_condicion || it.cmppeart_condicion || it.condicion || 'Nuevo' }} {{ it.cmpart_variante_color || it.cmpnart_variante_color || it.cmppeart_variante_color || it.variante_color }} {{ it.cmpart_variante_capacidad || it.cmpnart_variante_capacidad || it.cmppeart_variante_capacidad || it.variante_capacidad }} 🔋 {{ it.cmpart_bateria || it.cmpnart_bateria || it.cmppeart_bateria || it.bateria }}%
SERIAL / IMEI: Sin seriales registrados
{{ it.cmpart_procantidad || it.cmpnart_procantidad || it.cantidad }} ${{ formatMoney(it.cmpart_proprecio || it.cmpnart_proprecio || it.precio) }} ${{ formatMoney(it.cmpart_prototal || it.cmpnart_prototal || ((it.cantidad || 1) * (it.precio || 0))) }}
Observaciones / Notas

{{ currentComprasItem.cmp_observaciones || currentComprasItem.cmpn_observaciones || currentComprasItem.observaciones }}

Registrar {{ currentItem.tipo === 'ingreso' ? 'Ingreso' : 'Egreso' }}

⚠️ Sin cuentas para este método en {{ getDivisaSimbolo(currentItem.divisa_id) }}. Asigne en Configuración.

Saldo actual en cuenta: {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(getSaldoCuenta(currentItem.cuenta_id)) }}
Saldo insuficiente: La cuenta dispone de {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(getSaldoCuenta(currentItem.cuenta_id)) }}. El egreso solicitado es de {{ getDivisaSimbolo(currentItem.divisa_id) }} {{ formatMoney(currentItem.monto || 0) }}.
{{ getDivisaSimbolo(currentItem.divisa_id) }}
≈ ${{ formatMoney(currentItem.monto / currentItem.factor) }} USD

Traspaso entre Cuentas

Compra / Venta de Divisas

Pagas con (Sale de tu caja/cuenta)

Saldo insuficiente en cuenta origen: Disponible: {{ catDivisas.find(d => d.div_id == currentItem.origen_divisa_id)?.div_simbolo || '$' }} {{ formatMoney(getSaldoCuenta(currentItem.origen_id)) }}. Egreso requerido: {{ catDivisas.find(d => d.div_id == currentItem.origen_divisa_id)?.div_simbolo || '$' }} {{ formatMoney(currentItem.monto_entrega || 0) }}.
Tasa: {{ currentItem.monto_entrega && currentItem.monto_recibe ? (parseFloat(currentItem.monto_entrega) / parseFloat(currentItem.monto_recibe)).toFixed(4) : '—' }}

Recibes en (Entra a tu caja/cuenta)

Anular Cierre Z

Turno #{{ currentItem.sesion_id }}

Esto revertirá el cierre Z del turno.

  • Se eliminarán los registros de arqueo
  • Se anularán los ajustes automáticos de diferencias
  • El turno quedará activo nuevamente para re-cerrarse
  • Solo ADMIN o GERENTE pueden ejecutar esta acción

Queda registrado en el log de movimientos para auditoría.

Apertura de Turno

Asigna la caja y el cajero responsable

El turno, movimientos y montos cobrados se registrarán bajo este usuario.

La caja define la Serie y Sucursal fiscal en la que este turno emitirá facturas.

$

Dinero con el que arranca la gaveta el día de hoy.

Arqueo y Cierre Z #{{ detalleCierreCabecera.cs_id }}

Caja: {{ detalleCierreCabecera.caja_codigo || '' }} - {{ detalleCierreCabecera.caja_nombre }} • Cajero: {{ detalleCierreCabecera.cajero }}

Apertura de Turno

{{ detalleCierreCabecera.cs_fecha_apertura }}

Cierre de Turno

{{ detalleCierreCabecera.cs_fecha_cierre || 'Turno Abierto' }}

Fondo Inicial Gaveta

${{ parseFloat(detalleCierreCabecera.cs_fondo_inicial || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Consolidado de Dinero Ingresado por el Cajero Total Cobrado: ${{ parseFloat(detalleCierreResumen.total_general_cobrado_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Efectivo USD (Gaveta): ${{ parseFloat(detalleCierreResumen.total_efectivo_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Efectivo Bolívares: Bs {{ parseFloat(detalleCierreResumen.total_efectivo_bs || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Transferencias USD / Zelle: ${{ parseFloat(detalleCierreResumen.total_transferencias_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Transferencias / Pago Móvil Bs: Bs {{ parseFloat(detalleCierreResumen.total_transferencias_bs || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Detalle de Arqueo por Cuenta / Método

Cuenta Destino / Método Monto Esperado Monto Declarado Diferencia
{{ item.metodo_pago }}
{{ item.tipo_flujo || 'CUENTA BANCARIA' }}
{{ parseFloat(item.csa_monto_esperado).toLocaleString('de-DE', {minimumFractionDigits:2}) }} {{ parseFloat(item.csa_monto_declarado).toLocaleString('de-DE', {minimumFractionDigits:2}) }} Cuadrado (0.00) Faltante: {{ parseFloat(item.csa_diferencia).toLocaleString('de-DE', {minimumFractionDigits:2}) }} Sobrante: +{{ parseFloat(item.csa_diferencia).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Operaciones Especiales (Sin Flujo Físico Directo)
Crédito / Saldo Favor Usado: ${{ parseFloat(detalleCierreCabecera.operaciones_especiales.saldo_favor_aplicado || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Trade-In Recibidos: ${{ parseFloat(detalleCierreCabecera.operaciones_especiales.tradein_recibido || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
NC Emitidas (Devoluciones): ${{ parseFloat(detalleCierreCabecera.operaciones_especiales.notas_credito_emitidas || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Resultado Global del Arqueo

{{ parseFloat(detalleCierreItems.reduce((acc, curr) => acc + parseFloat(curr.csa_diferencia), 0)).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Todos los pagos y cobros procesados en este turno, marcados por su caja física de cobro. {{ detalleCierreMovimientos.length }} transacciones
Caja de Origen Documento & Cliente Monto Equiv. USD Cuenta Destino / Método Referencia / Hora
{{ mv.caja_origen }}
{{ mv.documento }}
{{ mv.cliente }}
{{ mv.retiro == 1 ? '-' : '+' }}{{ mv.simbolo }} {{ parseFloat(mv.monto).toLocaleString('de-DE', {minimumFractionDigits:2}) }} ${{ parseFloat(mv.monto_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
{{ mv.cuenta_destino }}
{{ mv.metodo }}
{{ mv.referencia || 'N/A' }}
{{ mv.fecha }}

Cierre de Turno (Corte Z)

Caja: {{ currentItem.caja_codigo || '' }} - {{ currentItem.caja_nombre }} • Cajero: {{ currentItem.cajero }} • Turno #{{ currentItem.sesion_id }}

Dinero Ingresado en el Turno

Consolidación de cobros procesados por el cajero

Total Cobrado: ${{ parseFloat(currentItem.resumen_flujo?.total_general_cobrado_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Efectivo USD (Gaveta): ${{ parseFloat(currentItem.resumen_flujo?.total_efectivo_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Efectivo Bolívares: Bs {{ parseFloat(currentItem.resumen_flujo?.total_efectivo_bs || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Transferencias USD / Zelle: ${{ parseFloat(currentItem.resumen_flujo?.total_transferencias_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Transferencias / Pago Móvil: Bs {{ parseFloat(currentItem.resumen_flujo?.total_transferencias_bs || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Facturas Emitidas:
${{ parseFloat(currentItem.resumen_ventas.total_facturado || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }} ({{ currentItem.resumen_ventas.cant_facturas || 0 }} facturas)
Notas de Entrega:
${{ parseFloat(currentItem.resumen_ventas.total_notas || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }} ({{ currentItem.resumen_ventas.cant_notas || 0 }} notas)
Fondo Inicial Gaveta: ${{ parseFloat(currentItem.fondo_inicial || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}

Cuentas y Métodos Activos a Declarar

Solo se muestran las cuentas con actividad en este turno. Ingresa lo contado físicamente.

Cuenta Destino / Método Divisa Monto Físico / Declarado
{{ item.descripcion }}
{{ item.tipo_flujo }} Banco: {{ item.banco }}
{{ item.simbolo }} ({{ item.divisa }})
{{ item.simbolo || '$' }}
Operaciones Especiales Registradas en Turno
Crédito / Saldo Favor Usado: ${{ parseFloat(currentItem.operaciones_especiales.saldo_favor_aplicado || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Trade-In Recibidos: ${{ parseFloat(currentItem.operaciones_especiales.tradein_recibido || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
NC Emitidas (Devoluciones): ${{ parseFloat(currentItem.operaciones_especiales.notas_credito_emitidas || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
Transacciones de cobro recibidas en este turno, con la Caja física donde se cobraron. {{ (currentItem.movimientos || []).length }} movimientos
Caja de Origen Documento & Cliente Monto Equiv. USD Cuenta Destino / Método Referencia / Hora
{{ mv.caja_origen }}
{{ mv.documento }}
{{ mv.cliente }}
{{ mv.retiro == 1 ? '-' : '+' }}{{ mv.simbolo }} {{ parseFloat(mv.monto).toLocaleString('de-DE', {minimumFractionDigits:2}) }} ${{ parseFloat(mv.monto_usd || 0).toLocaleString('de-DE', {minimumFractionDigits:2}) }}
{{ mv.cuenta_destino }}
{{ mv.metodo }}
{{ mv.referencia || 'N/A' }}
{{ mv.fecha }}

Asignar Cliente

Buscar Cliente Existente

Buscando...
No se encontraron resultados.
Escribe al menos 2 caracteres...

Registrar Nuevo Cliente

IMEIs para {{ currentFacItem?.nombre }}

Asignación obligatoria e inmutable por producto

Debe ingresar exactamente {{ currentFacItem?.cantidad }} serial(es). Cada IMEI se valida en tiempo real con el lector o teclado.

Validando... Disponible
Color: {{ currentFacItem.imeiStatus[i].data.color }} Capacidad: {{ currentFacItem.imeiStatus[i].data.capacidad }} Batería: {{ currentFacItem.imeiStatus[i].data.bateria }}%
{{ currentFacItem.imeiStatus[i].errorMsg }}
Presione Enter tras escanear

{{ currentFacItem?.is_cuota ? 'Abonar a Cuota' : 'Procesar Cobro' }}

{{ currentFacItem?.is_cuota ? 'SALDO CUOTA:' : 'A COBRAR:' }} {{ formatMoney(currentFacItem?.is_cuota ? (currentFacItem?.saldo_pendiente || 0) : totalVentaAjustado) }} (+{{ formatMoney(diferenciaRecargo) }} por redondeo) ({{ formatMoney(diferenciaRecargo) }} por descuento)

Artículos a Cobrar

{{ art.fa_propnombre }} {{ art.fa_procantidad }}x {{ formatMoney(art.fa_prototal) }}
¡Cliente con Saldo a Favor Disponible! Disponible en Nota de Crédito: ${{ formatMoney(saldoFavorCliente) }}

Agregar Pago

Tasa de cambio editable y reactiva
$ {{ formatMoney(montoEquivalenteFormPago) }}

Recibir Equipo (Trade-In)

{{ p.nombre }}

{{ p.codigo }}

{{ formTradeIn.pro_nombre }}

Plan de Cuotas del Documento

Selecciona una o más cuotas con los checks para pagar varias juntas:

{{ currentFacItem.cuotas_existentes.length }} Cuotas Registradas
# Vencimiento Monto Cuota Abonado Falta por Pagar Estado Acción
✓ {{ idx + 1 }} {{ cuota.cout_fecha }} {{ formatMoney(cuota.cout_monto) }} {{ formatMoney(cuota.cout_monto_acumulado || 0) }} {{ formatMoney(Math.max(0, parseFloat(cuota.cout_monto) - parseFloat(cuota.cout_monto_acumulado || 0))) }} Pagada Parcial Pendiente Al día

{{ cuotasSeleccionadas.length }} Cuota(s) Seleccionada(s)

Haz clic para cargar el monto total de estas cuotas al formulario de pago:

Generar Financiamiento (Cuotas)

Total Venta: {{ formatMoney(currentFacItem?.totales?.total || 0) }}
Precio Base {{ formatMoney(currentFacItem?.totales?.total || 0) }}
Inicial (Pest. 1) {{ formatMoney(formFinanciamiento.tipo === 2 ? (formFinanciamiento.inicial || montoInicialCalculado) : 0) }}
En Cuotas {{ formatMoney(formFinanciamiento.monto) }}
Nuevo Total {{ formatMoney(totalVentaAjustado) }}
Días
# Fecha de Vencimiento Monto Cuota ($)
{{ cuota.num }}
$
Suma Total de Cuotas: ${{ formatMoney(totalCuotasSum) }}

Bandeja de Cobertura

Pagos Anteriores

{{ p.md_nombre }} ({{ p.cmp_nombre }})

{{ p.fab_fecha }} - Ref: {{ p.fab_observacion || 'N/A' }}

{{ p.div_simbolo }} {{ formatMoney(p.fab_monto) }}

No hay coberturas agregadas... Agregue nuevos pagos para cubrir el saldo restante...

{{ p.metodo_nombre }} ({{ p.cuenta_nombre }})

{{ p.divisa_simbolo }} {{ formatMoney(p.monto) }} (Tasa: {{ p.factor }}) | Ref: {{ p.referencia }}

${{ formatMoney(p.monto_base) }}

Trade-In: {{ t.pro_nombre }}

IMEI: {{ t.imei }} | Cond: {{ t.condicion }} ({{ t.bateria }}%)

Variante: {{ t.pv_nombre }}

{{ formatMoney(t.monto_tasado) }}

Financiamiento ({{ financiamiento.tipo === 2 ? 'Con Inicial' : 'Sin Inicial' }})

{{ financiamiento.cuotas }} cuotas ({{ financiamiento.frecuencia }})

Inicial Abonada: {{ formatMoney(financiamiento.inicial) }}

{{ formatMoney(financiamiento.monto) }}
Total Factura: {{ formatMoney(currentFacItem?.totales?.total) }}
{{ diferenciaRecargo > 0 ? '+ Recargo Financiamiento:' : '- Ajuste Cuotas:' }} {{ (diferenciaRecargo > 0 ? '+ ' : '') + formatMoney(diferenciaRecargo) }}
Total a Cobrar: {{ formatMoney(totalVentaAjustado) }}
Pagado Anteriormente: - {{ formatMoney(currentFacItem?.totales?.pagado_previo) }}
Total Cubierto: {{ formatMoney(totalCubierto) }}
SALDO RESTANTE: {{ formatMoney(Math.max(0, currentFacItem?.is_recuperada ? ((currentFacItem?.totales?.restante_previo || 0) - totalCubierto) : (totalVentaAjustado - totalCubierto))) }}

💰 Vuelto / Cambio a Devolver al Cliente

{{ v.metodo_nombre }}
{{ v.divisa_simbolo }} {{ formatMoney(v.vuelto_local) }} (= ${{ formatMoney(v.vuelto_usd) }})

Historial de Ventas

Facturas y Notas de Entrega emitidas

Documento Cliente Fecha Total Estatus Acciones

{{ f.serie_codigo || f.serie_nombre }}-{{ String(f.correlativo || f.numfactura).padStart(6, '0') }}

{{ f.cliente_nombre }}

{{ f.cliente_dni }}

{{ f.fecha }} {{ formatMoney(f.total) }} Pendiente Pagada Anulado
No se encontraron facturas.

Detalle de {{ currentFacItem?.master?.doc_type === 'NOTA' ? 'Nota de Entrega' : (currentFacItem?.master?.doc_type === 'PRESUPUESTO' ? 'Presupuesto' : (currentFacItem?.master?.doc_type === 'PEDIDO' ? 'Orden de Pedido' : 'Factura de Venta')) }}

Documento {{ currentFacItem?.master?.fm_serie ? (currentFacItem.master.fm_serie + '-') : '' }}#{{ currentFacItem?.master?.fm_correlativo || 0 }} Procesada / Aprobada Anulada Pendiente

Datos del Cliente

Razón Social

{{ currentFacItem?.master?.cli_razon_social }}

Documento (CI/RIF)

{{ currentFacItem?.master?.cli_dni }}

Dirección

{{ currentFacItem?.master?.cli_direccion || 'No especificada' }}

Datos Internos

Fecha de Emisión

{{ currentFacItem?.master?.fm_fecha }}

Serie / Caja

{{ currentFacItem?.master?.ser_codigo || 'N/A' }}

Vendedor Asociado

{{ currentFacItem?.master?.emp_nombres }}

Observaciones

{{ currentFacItem?.master?.fm_observacion }}

Total Facturado

{{ formatMoney(currentFacItem?.master?.fm_total) }}

Total Abonado

{{ formatMoney(currentFacItem?.pagos?.reduce((sum, p) => sum + parseFloat(p.fab_monto), 0) || 0) }}

Deuda Restante

{{ formatMoney(parseFloat(currentFacItem?.master?.fm_total || 0) - (currentFacItem?.pagos?.reduce((sum, p) => sum + parseFloat(p.fab_monto), 0) || 0)) }}

Observaciones / Notas

{{ currentFacItem?.master?.fm_observaciones || currentFacItem?.master?.observaciones }}

Producto / Servicio Cant. Precio Unit. Monto Total

{{ art.fa_propnombre }}

SERIAL / IMEI: Sin serial registrado
{{ art.fa_procantidad }} {{ formatMoney(art.fa_proprecio) }} {{ formatMoney(art.fa_prototal) }}
Subtotal Neto: {{ formatMoney(currentFacItem?.master?.fm_subtotal) }}
Impuestos (IVA): {{ formatMoney(currentFacItem?.master?.fm_iva) }}
Total a Pagar: {{ formatMoney(currentFacItem?.master?.fm_total) }}
Plan de Financiamiento / Compromiso de Pago

Imprima el documento de cuotas para el cliente con los productos adquiridos sin montos por línea.

# Cuota Vencimiento Monto Cuota Abonado Falta Estatus
Cuota {{ idx + 1 }} {{ c.cout_fecha }} ${{ parseFloat(c.cout_monto).toFixed(2) }} ${{ parseFloat(c.cout_monto_acumulado || 0).toFixed(2) }} ${{ Math.max(0, parseFloat(c.cout_monto) - parseFloat(c.cout_monto_acumulado || 0)).toFixed(2) }} Pagada Parcial Pendiente

Sin Plan de Financiamiento

Este documento fue procesado con pago directo o al contado.

Fecha Método de Pago Caja / Cuenta Destino Referencia Monto Acciones
{{ pago.fab_fecha }} {{ pago.md_nombre }} {{ pago.cmp_nombre }} {{ pago.fab_observacion }} - {{ pago.div_simbolo }} {{ parseFloat(pago.fab_monto).toLocaleString('en-US', {minimumFractionDigits:2, maximumFractionDigits:2}) }}
Suma Total Abonada: {{ formatMoney(currentFacItem?.pagos?.reduce((sum, p) => sum + parseFloat(p.fab_monto), 0) || 0) }}

No hay pagos registrados

Esta factura no ha recibido ningún abono a su favor.

Línea de Tiempo y Trazabilidad del Documento

Historial cronológico de creación, modificaciones y conversiones

{{ ev.bitdoc_descripcion }}

🕒 {{ ev.bitdoc_fecha }}
👤 Registrado por: {{ ev.usuario_nombre || 'Sistema' }}
No hay eventos adicionales registrados en la trazabilidad.

Opciones de Impresión ✓ Impreso en Fiscal

{{ docImpresionInfo?.doc?.tipo }} #{{ docImpresionInfo?.doc?.serie }}-{{ docImpresionInfo?.doc?.correlativo }} • Cliente: {{ docImpresionInfo?.doc?.cliente }} • Total: $ {{ Number(docImpresionInfo?.doc?.total || 0).toFixed(2) }}

Formatos PDF Digitales (5 Versiones)

Carta
Página Completa

Formato vertical estándar. Ideal para clientes corporativos y archivo contable.

210x148mm
Media Página

Formato condensado media carta. Ahorra 50% de papel en mostrador.

+ Pagos
Página + Pagos

Con plan de financiamiento (cuotas), abonos, cuentas bancarias y saldo.

Cliente
Cliente + Pagos

Formato para entregar al cliente con historial de abonos y cuotas, sin cuentas bancarias.

Financiamiento
Plan de Pagos

Productos adquiridos (sin precios unitarios) con cronograma de cuotas y firmas de compromiso.

Impresión Directa por Hardware (Red Local)

{{ docImpresionInfo.impresora.nombre }} {{ docImpresionInfo.impresora.tipo_nombre }}
Spooler: {{ docImpresionInfo.impresora.ip_puerto || 'IP no asignada' }}
El documento se emitirá directamente a través del protocolo fiscal SENIAT conectado a la IP del spooler. Al finalizar, el comprobante se marcará automáticamente como impreso en el sistema.
Esta serie de venta no tiene una impresora fiscal ni ticket asociada en la configuración de series. Utilice cualquiera de los formatos PDF superiores.

Envío de Factura / Documento por WhatsApp

API WapiSMS Activa API No Configurada
📱
Se compilará el comprobante PDF. Para números de EE.UU. (+1), asegúrate de ingresar los 10 dígitos locales completos.
La API de WhatsApp no está configurada o no tiene líneas activas.

Active sus credenciales de WhatsApp en el módulo de WhatsApp para habilitar el envío automático de facturas y notas de entrega a sus clientes.

⚖️ Regularizar Líneas con Monto $0.00 {{ ventasLineasCero.length }} documento(s)

Asigna el monto de compra a productos en $0 y descuenta ese importe de la línea de mayor valor.

Fecha:

Buscando ventas con productos en $0.00...

¡Todo en orden!

No se encontraron facturas ni notas de entrega con artículos en monto $0.00{{ fechaFiltroRegularizar ? ' para la fecha seleccionada' : '' }}.

💡 Haz clic en cada fila para desplegar la propuesta de redistribución de montos.
{{ doc.tipo }}
#{{ doc.serie }}-{{ String(doc.correlativo).padStart(6, '0') }} • {{ doc.cliente_nombre }}
{{ doc.fecha }} • {{ doc.lineas_cero.length }} línea(s) en $0
$ {{ Number(doc.total).toFixed(2) }}
Ajuste: +$ {{ Number(doc.total_ajuste).toFixed(2) }} Sin margen en línea mayor
🎁 Líneas en $0.00 (Se asignará Monto de Compra)
{{ lc.nombre }}
Cant: {{ lc.cantidad }} • Código: {{ lc.codigo }}
+$ {{ Number(lc.monto_a_sumar).toFixed(2) }}
Costo de compra: $ {{ Number(lc.precio_compra).toFixed(2) }}
📉 Línea Mayor (Absorberá la resta del monto)
{{ doc.max_linea.nombre }}
Cant: {{ doc.max_linea.cantidad }} • Precio Actual: $ {{ Number(doc.max_linea.precio_actual).toFixed(2) }}
-$ {{ Number(doc.max_linea.monto_descontado).toFixed(2) }}
Nuevo Precio Unitario: $ {{ Number(doc.max_linea.precio_nuevo).toFixed(2) }}
No se encontró una línea de mayor precio para absorber el ajuste.
El total del documento permanece 100% idéntico e invariable.
$ {{ Number(doc.total).toFixed(2) }}
{{ selectedVentasLineasCero.length }} documento(s) seleccionado(s) para regularizar.

Desglose Cronológico de Ventas (PDF)

Auditoría diaria y por rangos: equipos vendidos, seriales/IMEIs y recaudación.

El reporte compilará cada artículo y equipo vendido en estricto orden cronológico con sus respectivos seriales / IMEIs, clientes, montos y métodos de pago.
💵

Devolución / Liquidación en Efectivo

Entrega de dinero al cliente por saldo a favor restante

NC-{{ String(liquidarNCItem?.correlativo || liquidarNCItem?.id).padStart(5, '0') }} {{ liquidarNCItem?.fecha ? liquidarNCItem.fecha.slice(0, 10) : '' }}
Cliente: {{ liquidarNCItem?.cliente_nombre }} ({{ liquidarNCItem?.cliente_dni }})
Monto Original: ${{ formatMoney(liquidarNCItem?.monto) }}
Total Consumido: ${{ formatMoney(liquidarNCItem?.consumido) }}
Saldo Disponible Actual: ${{ formatMoney(liquidarNCItem?.disponible) }}
Saldo en cuenta: ${{ formatMoney(cuentaSeleccionadaLiquidarNC.saldo) }}
$

⚠️ El monto no puede superar el saldo disponible de la Nota de Crédito (${{ formatMoney(liquidarNCItem?.disponible) }}).

⚠️ Saldo insuficiente en {{ cuentaSeleccionadaLiquidarNC.alias }}. Disponible: ${{ formatMoney(cuentaSeleccionadaLiquidarNC.saldo) }}.

Esta operación registrará un Egreso de Caja en el turno activo para cuadrar el efectivo en gaveta y marcará el saldo de la Nota de Crédito como amortizado.

{{ ordenForm.id ? 'Editar Orden SAT' : 'Recepción de Equipo SAT' }}

{{ ordenForm.tipo == 2 ? 'Reacondicionamiento de inventario de tienda' : 'Servicio técnico a cliente particular' }}

{{ ordenForm.cliente_nombre }}
Doc: {{ ordenForm.cliente_dni }} • Tel: {{ ordenForm.cliente_telefono }}
{{ cli.nombre }}
DNI: {{ cli.documento }}
{{ cli.telefono }}
{{ ordenForm.imei }}
{{ ordenForm.equipo_nombre }}
{{ s.pros_serial }}
{{ s.pro_nombre }}
${{ parseFloat(s.costo_base || 0).toFixed(2) }} {{ s.alm_nombre }}

👤 Registro Rápido de Cliente

{{ currentOrden.sm_codigo }} {{ currentOrden.sm_nombre }}

Asignación de repuestos del inventario y control de costo compuesto.

➕ Agregar Repuesto o Servicio a esta Reparación

{{ p.nombre || p.descripcion }}
Cod: {{ p.codigo }}
Costo: ${{ parseFloat(p.costo || 0).toFixed(2) }}
PVP: ${{ parseFloat(p.precio1 || p.precio || 0).toFixed(2) }}
Al agregar un repuesto del inventario, se descontará automáticamente del stock.

Piezas y Repuestos Consumidos en este Dispositivo:

Descripción Cant. Costo Unit. Total Costo Acción
Aún no se han asignado repuestos a esta orden.
{{ r.sd_descripcion }} {{ r.sd_cantidad }} ${{ parseFloat(r.sd_costo).toFixed(2) }} ${{ (parseFloat(r.sd_costo) * parseFloat(r.sd_cantidad)).toFixed(2) }}
Mano de Obra: ${{ parseFloat(currentOrden.sm_mano_obra || 0).toFixed(2) }}
Total Presupuesto Cliente: ${{ parseFloat(currentOrden.sm_presupuesto || currentOrden.sm_precio_total || 0).toFixed(2) }}
{{ currentOrden.sm_codigo }} {{ currentOrden.sm_nombre }}

Trazabilidad completa, repuestos aplicados y bitácora de estados.

Cliente:{{ currentOrden.cliente_nombre }}
Técnico:{{ currentOrden.tecnico_nombre }}
Serial:{{ currentOrden.sm_imei || '—' }}
Custodia:{{ currentOrden.sm_accesorios || 'Ninguno' }}

📜 Línea de Tiempo de Estados

{{ h.estatus_nombre }} {{ h.sed_creado }}

{{ h.sed_nota }}

Por: {{ h.empleado_nombre }}

Finalizar Reacondicionamiento

Devolver el equipo a stock activo con su costo compuesto.

Equipo: {{ currentOrden.sm_nombre }}
Serial/IMEI: {{ currentOrden.sm_imei }}
Inversión en Piezas: ${{ parseFloat(currentOrden.sm_costo_total || 0).toFixed(2) }}
% de Salud Operativa

COMPROBANTE DE SERVICIO TÉCNICO

Taller Especializado & SAT

{{ currentOrden.sm_codigo }}
Fecha Ingreso:{{ currentOrden.sm_creado }}
Cliente:{{ currentOrden.cliente_nombre }}
Tipo Equipo:{{ currentOrden.sm_categoria_equipo || 'Electrónica' }}
Modelo:{{ currentOrden.sm_nombre }}
Serial/IMEI:{{ currentOrden.sm_imei || 'N/A' }}
Custodia / Accesorios:{{ currentOrden.sm_accesorios || 'Ninguno' }}
Técnico Responsable:{{ currentOrden.tecnico_nombre }}
Trabajo / Falla:

{{ currentOrden.sm_descripcion }}

Presupuesto Estimado: ${{ parseFloat(currentOrden.sm_presupuesto || currentOrden.sm_precio_total || 0).toFixed(2) }}
Garantía de Servicio: {{ currentOrden.sm_dias_garantia || 30 }} días

Conserve este comprobante para el retiro del equipo.

La garantía cubre exclusivamente la mano de obra y repuestos instalados.

Equipos no retirados pasados 90 días entran a disposición de almacenaje legal.

{{ estatusForm.id ? 'Editar Estado SAT' : 'Nuevo Estado SAT' }}

Iniciar Nueva Conversación de WhatsApp

Escribe a un cliente registrado en el ERP o a un nuevo número.

{{ cli.nombre }}
{{ cli.documento }}
{{ cli.telefono }}

{{ cuentaForm.id ? 'Editar Línea WhatsApp' : 'Vincular Línea WhatsApp' }}

Emparejamiento oficial mediante WapiSMS Gateway

Generando sesión con WapiSMS...

Obteniendo enlace seguro de WhatsApp

Código QR WhatsApp
Esperando escaneo desde WhatsApp... ({{ qrCountdown }}s)

Pasos para vincular:

  1. Abre WhatsApp en tu teléfono móvil.
  2. Toca Ajustes (iOS) o Menú ⋮ (Android) > Dispositivos vinculados.
  3. Presiona Vincular un dispositivo y apunta tu cámara a este código QR.

¡Teléfono Emparejado Exitosamente!

+{{ cuentaForm.numero }}

Guardando y sincronizando con el ERP...

El código QR ha expirado

Por seguridad, los códigos QR de WhatsApp se invalidan al minuto.

No se pudo obtener el código QR

Verifica que el Secret de WapiSMS esté configurado correctamente.

Cuentas vinculadas en WapiSMS Gateway

Si ya vinculaste una línea en el panel de WapiSMS, puedes importarla directamente al ERP.

Cargando cuentas desde WapiSMS... No se encontraron cuentas activas en WapiSMS.

{{ gw.phone }}

ID: {{ gw.unique }}

{{ gw.status === 'connected' ? 'Conectado' : 'Desconectado' }}
✓ Registrada en ERP ({{ gw.local_nombre }})
API WapiSMS Gateway activa

{{ plantillaForm.id ? 'Editar Respuesta Rápida' : 'Nueva Respuesta Rápida' }}

🖼️ 🎙️ 🎬 📄

{{ lightboxMedia.title || 'Archivo adjunto' }}

{{ lightboxMedia.type }}
🎙️
{{ lightboxMedia.title }}

Audio / Nota de Voz de WhatsApp

📄

{{ lightboxMedia.title }}

Este tipo de documento se puede descargar para abrir en tu equipo.

⬇️ Descargar Documento

Ficha del Cliente / Contacto

Registra los datos del cliente para este chat y vincúlalo al ERP.