DavixDavix ERPX
Modulos

Reportes de avances de ventas

Consulta y analiza el avance de ventas por vendedor, cliente, punto de venta, zona y distrito con filtros avanzados y exportación a Excel

Desde Reportes Avances Ventas puedes consultar un informe detallado del avance de ventas de tu equipo comercial. El reporte cruza los datos de documentos de venta del Data Warehouse (DWH) con las metas mensuales asignadas, mostrando para cada combinación vendedor-cliente-punto de venta el monto vendido, la cuota (meta) y el porcentaje de alcance. Incluye filtros avanzados por vendedor, cliente, distrito, zona y rango de monto, además de exportación a Excel.

Esta vista se encuentra en la ruta Inicio > Sistema de Inteligencia Comercial > Reportes Avances Ventas dentro del sistema. Requieres un perfil con permisos de acceso al módulo de analíticas para operar.


Vista principal — Reporte de avances

Al ingresar al módulo, el sistema carga automáticamente los datos del mes actual (desde el día 1 del mes hasta la fecha y hora actual). La vista se compone de tres áreas: barra de herramientas, panel de filtros y tabla de datos.

Título de la página

En la parte superior izquierda se muestra el encabezado:

REPORTES AVANCES VENTAS

Este es un título <h1> sin breadcrumb de navegación.


Barra de herramientas

En la parte superior derecha se encuentran dos botones de acción:

BotónIconoEstiloDescripción
Exportarpi pi-file-excelp-button-outlinedAbre un diálogo modal para exportar los datos filtrados a un archivo Excel (.xlsx)
Actualizarpi pi-refreshp-button-outlinedRecarga todos los datos del reporte ejecutando nuevamente las consultas al DWH

El botón Actualizar reinicia completamente el estado del reporte: limpia las listas de vendedores, clientes, zonas, distritos, los filtros seleccionados y los datos de la tabla. Luego ejecuta una nueva consulta al DWH con las fechas actuales.


Panel de filtros

Debajo de la barra de herramientas se encuentra un panel con 7 filtros organizados en una grilla responsiva de 4 columnas en escritorio (lg:col-3), 3 columnas en tablet (md:col-4) y columna completa en móvil.

Filtro de fechas

CampoComponenteFormatoValor por defectoDescripción
Fecha de iniciop-calendardd/mm/yyPrimer día del mes actual (YYYY-MM-01 00:00:00)Fecha desde la cual se consultan los datos de ventas
Fecha de finp-calendardd/mm/yyFecha y hora actual (YYYY-MM-DD HH:mm:ss)Fecha hasta la cual se consultan los datos de ventas

Ambos calendarios tienen las siguientes propiedades:

PropiedadValor
Mostrar íconoSí ([showIcon]="true")
Mostrar horaNo ([showTime]="false")
Mostrar segundosNo ([showSeconds]="false")
Formato de hora12 horas ([hourFormat]="'12'")
Posición del popupAnexado al body (appendTo="body")

Validaciones al cambiar fechas

Al modificar cualquiera de las dos fechas, el sistema ejecuta las siguientes validaciones antes de recargar los datos:

Validar fecha de inicio no sea futura

Si la Fecha de inicio es posterior a la fecha actual (hoy), se restablece automáticamente a la fecha de hoy (YYYY-MM-DD 00:00:00).

Validar que fecha fin no sea anterior a fecha inicio

Si la Fecha de fin es anterior a la Fecha de inicio, se restablece automáticamente a la fecha y hora actual (YYYY-MM-DD HH:mm:ss).

Recargar datos

Si las fechas son válidas (o después de corregirlas), el sistema ejecuta automáticamente la consulta al DWH con el nuevo rango de fechas.

Filtro de vendedores

PropiedadValor
Componentep-multiSelect
EtiquetaVendedores
Modo de visualizaciónChips (display="chip")
Campo de opcióntext (formato: \{apellido_paterno\} \{apellido_materno\} \{nombres\})
BúsquedaHabilitada, filtra por text
Botón limpiarSí ([showClear]="true")
PlaceholderSELECCIONE
Mensaje vacío"No se encontraron registros."
Mensaje filtro vacío"No se han encontrado resultados"

La lista de vendedores se genera dinámicamente a partir de los datos devueltos por el DWH. Solo aparecen los vendedores que tienen al menos un registro de venta en el rango de fechas seleccionado. Los vendedores se identifican por su campo vendedor en los registros del DWH.

Filtro de clientes

PropiedadValor
Componentep-multiSelect
EtiquetaClientes
Modo de visualizaciónChips (display="chip")
Campo de opcióntext
BúsquedaHabilitada, filtra por text
Botón limpiarSí ([showClear]="true")
PlaceholderSELECCIONE
Mensaje vacío"No se encontraron registros."
Mensaje filtro vacío"No se han encontrado resultados"

El nombre del cliente se determina así: si el cliente tiene razon_social (y no es cadena vacía), se usa la razón social. Si no, se construye como \{apellido_paterno\} \{apellido_materno\} \{nombres\}. La lista solo incluye clientes con registros en el rango de fechas consultado.

Filtro de distritos

PropiedadValor
Componentep-multiSelect
EtiquetaDistritos
Modo de visualizaciónChips (display="chip")
Campo de opcióntext
BúsquedaHabilitada, filtra por text
Botón limpiarSí ([showClear]="true")
PlaceholderSELECCIONE
Mensaje vacío"No se encontraron registros."
Mensaje filtro vacío"No se han encontrado resultados"

Los distritos se obtienen del campo ubigeo_codigo de cada punto de venta. El sistema traduce el código de ubigeo al nombre del distrito usando la tabla de ubigeos almacenada en caché local (erpx-global-ubigeos). La lista se ordena alfabéticamente y elimina duplicados.

Filtro de zonas

PropiedadValor
Componentep-multiSelect
EtiquetaZonas
Modo de visualizaciónChips (display="chip")
Campo de opciónnombre
BúsquedaHabilitada, filtra por nombre
Botón limpiarSí ([showClear]="true")
PlaceholderSELECCIONE
Mensaje vacío"No se encontraron registros."
Mensaje filtro vacío"No se han encontrado resultados"

Las zonas se extraen del campo zona de los registros del DWH. Se eliminan duplicados por id y solo se muestran las zonas presentes en los datos del rango consultado.

Filtro de alcance de venta (rango de monto)

PropiedadValor
ComponenteDos campos p-inputNumber en un p-inputgroup separados por un guion (-)
EtiquetaAlcance venta
Mododecimal
Decimales mínimos2
Decimales máximos2
LocaleES-PE
Valor mínimo0
Valor máximoSe calcula dinámicamente: es el monto de venta más alto entre todos los registros. Si no hay datos, el máximo es 100,000
Valor inicial[0, máximo] (rango completo)

Si alguno de los dos campos del rango se deja vacío (null), el sistema lo restablece automáticamente al valor mínimo o máximo respectivo antes de aplicar el filtro.


Lógica de filtrado

Los filtros se aplican del lado del cliente sobre los datos ya cargados (data_complete). Cada filtro reduce progresivamente el conjunto de datos mostrados en la tabla:

Filtrar por vendedores

Si hay vendedores seleccionados en el multiselect, solo se muestran los registros cuyo vendedor_id coincida con alguno de los vendedores elegidos. Si no se selecciona ningún vendedor, se muestran todos.

Filtrar por clientes

Si hay clientes seleccionados, solo se muestran los registros cuyo cliente_id coincida. Si no se selecciona ninguno, pasan todos.

Filtrar por distritos

Si hay distritos seleccionados, solo se muestran los registros cuyo cliente_punto_venta.ubigeo_nombre coincida con alguno de los distritos elegidos.

Filtrar por zonas

Si hay zonas seleccionadas, solo se muestran los registros cuyo zona_id coincida con alguna de las zonas elegidas.

Filtrar por rango de monto de venta

Solo se muestran los registros cuyo venta_monto esté dentro del rango definido por los dos campos numéricos (mínimo y máximo, ambos inclusive).

Todos los filtros (vendedores, clientes, distritos, zonas y alcance de venta) se ejecutan en cascada. Cada vez que se cambia cualquier filtro, se recalcula el resultado desde el conjunto completo de datos (data_complete), aplicando todos los filtros activos simultáneamente.


Tabla de datos

La tabla utiliza el componente p-table de PrimeNG con las siguientes propiedades:

PropiedadValor
Clave de filavendedor_id
Desplazamiento horizontalHabilitado ([scrollable]="true", responsiveLayout="scroll")
Columnas redimensionablesSí ([resizableColumns]="true", columnResizeMode="expand")
PaginaciónSí, 50 registros por página
Mostrar página actualSí ([showCurrentPageReport]="true")
Estilop-datatable-gridlines erpx-main
Indicador de cargaSpinner de carga mientras se consultan los datos

Columnas de la tabla

#ColumnaAnchoAlineaciónContenido
1VENDEDOR125px (fijo)DerechaNombre completo del vendedor (\{apellido_paterno\} \{apellido_materno\} \{nombres\})
2CLIENTEAutoIzquierdaRazón social o nombre completo del cliente
3CLIENTE PUNTO VENTA150px (fijo)DerechaNombre del punto de venta del cliente
4DIRECCION150px (fijo)IzquierdaDirección del punto de venta
5DISTRITO125px (fijo)IzquierdaNombre del distrito obtenido del código de ubigeo
6ZONA150px (fijo)IzquierdaNombre de la zona comercial asignada
7DIA VISITA125px (fijo)DerechaDía programado de visita (puede ser null)
8FRECUENCIA125px (fijo)DerechaFrecuencia de visita programada (puede ser null)
9VISITAS125px (fijo)DerechaCantidad de visitas realizadas (longitud del array visitas)
10ALCANCE VENTA125px (fijo)DerechaMonto total de ventas en Soles (S/. X,XXX.XX), formato es-PE con 2 decimales
11CUOTA125px (fijo)DerechaMeta de monto mensual en Soles (S/. X,XXX.XX), formato es-PE con 2 decimales
12% ALCANCE125px (fijo)DerechaPorcentaje de alcance de la meta (XX.XXX %), con 3 decimales y redondeo hacia arriba

Formato de moneda

Los montos en las columnas ALCANCE VENTA y CUOTA se muestran con:

  • Prefijo: S/. (Soles peruanos)
  • Separador de miles: punto (.) — locale es-PE
  • Separador de decimales: coma (,)
  • Decimales: exactamente 2

Ejemplo: S/. 1.234,56

Cálculo de % Alcance

El porcentaje de alcance se calcula con la librería BigNumber.js para precisión decimal:

% Alcance = (venta_monto / meta_monto) × 100
  • Si meta_monto es 0, el % Alcance es 0 (evita división por cero).
  • Se muestra con 3 decimales y redondeo hacia arriba (BigNumber.ROUND_UP).
  • Ejemplo: si venta_monto = 5000 y meta_monto = 12000, entonces % Alcance = 41.667 %.

Agrupación de datos

Los registros del DWH se agrupan por la combinación de tres claves:

vendedor_id + cliente_id + cliente_punto_venta_id

Para cada grupo, se calcula:

DatoCálculo
venta_montoSuma de valor de todos los registros del grupo cuyo indicador_codigo sea DOCUMENTOS_VENTAS_MONTO
meta_montoSuma de valor de los registros de metas (indicador_codigo: METAS_MONTO) que coincidan con el vendedor_id del grupo
avance_monto_alcance(venta_monto / meta_monto) × 100, con 3 decimales y redondeo hacia arriba

La meta (CUOTA) se consulta por mes completo (tipo:4, indicador_codigo:METAS_MONTO). El formato de fecha para la meta usa el primer día del mes de la fecha de inicio con formato YYYYMM00000000. Esto significa que la meta siempre corresponde al mes de la fecha de inicio seleccionada.


Consultas al Data Warehouse (DWH)

Al cargar o actualizar el reporte, el sistema ejecuta dos consultas paralelas (forkJoin) al DWH:

Consulta 1 — Documentos de ventas (montos)

search=** AND fecha:[{fecha_inicio} TO {fecha_fin}] AND tipo:1 AND indicador_codigo:DOCUMENTOS_VENTAS_MONTO
ParámetroValor
fecha_inicioFecha de inicio a las 00:00:00 en formato YYYYMMDD000000
fecha_finFecha de fin al final del día en formato YYYYMMDDHHmmss
tipo1
indicador_codigoDOCUMENTOS_VENTAS_MONTO
from0
size100,000,000

Consulta 2 — Metas de monto mensual

search=** AND fecha:[{fecha_mes} TO {fecha_mes}] AND tipo:4 AND indicador_codigo:METAS_MONTO
ParámetroValor
fecha_mesPrimer día del mes de la fecha de inicio en formato YYYYMM00000000 (ejemplo: 20260300000000 para marzo 2026)
tipo4
indicador_codigoMETAS_MONTO
from0
size100,000,000

Endpoint DWH

EndpointMétodoURL base
v2.0.1/erpx/analiticas/dwhGEThttps://msserver1.davix.app

Procesamiento de datos del DWH

Una vez recibidos los datos del DWH, el sistema realiza el siguiente procesamiento:

Formatear nombres de clientes

Para cada registro, si el cliente tiene razon_social no vacía, se usa como texto de identificación. Si razon_social es null o cadena vacía, se construye el nombre como \{apellido_paterno\} \{apellido_materno\} \{nombres\}.

Formatear nombres de vendedores

Para cada registro, se construye el nombre del vendedor como \{apellido_paterno\} \{apellido_materno\} \{nombres\}.

Resolver nombres de distritos

Para cada punto de venta, se toma el ubigeo_codigo y se busca en la tabla de ubigeos en caché local (erpx-global-ubigeos) para obtener el nombre del distrito correspondiente.

Extraer listas únicas para filtros

Se generan las listas de opciones para los multiselects:

  • Zonas: Objetos zona únicos por id (sin duplicados)
  • Distritos: Nombres de distritos únicos, ordenados alfabéticamente
  • Clientes: Objetos cliente únicos por id
  • Vendedores: Objetos vendedor únicos por id

Agrupar registros

Se agrupan los registros por la clave compuesta vendedor_id-cliente_id-cliente_punto_venta_id. Para cada grupo se calcula el monto de venta, la meta y el porcentaje de alcance.

Calcular rango de alcance de venta

Se determina el monto de venta más alto entre todos los registros agrupados para establecer el valor máximo del filtro de rango. El filtro se inicializa con el rango completo [0, máximo].


Ubigeos — Resolución de distritos

El sistema utiliza una tabla de ubigeos almacenada en el caché local del navegador bajo la clave erpx-global-ubigeos. Esta tabla contiene los códigos de ubigeo de Perú con su estructura jerárquica:

NivelCriterio de identificaciónEjemplo de código
DepartamentoLos últimos 4 dígitos son 0000150000 (Lima)
ProvinciaLos dígitos 3-4 no son 00 y los dígitos 5-6 son 00150100 (Lima provincia)
DistritoLos últimos 2 dígitos no son 00150101 (Lima distrito)

El campo ubigeo_codigo del punto de venta se busca en la lista de distritos para obtener el nombre correspondiente, que se muestra en la columna DISTRITO de la tabla.


Exportar a Excel

Al hacer clic en el botón Exportar, se abre un diálogo dinámico (DynamicDialog) con las opciones de exportación.

PropiedadValor
TítuloExportar
Z-index base10000
Ancho50vw (50% del ancho de la ventana)
PosiciónPegado arriba (top: 0, bottom: 0, maxHeight: 100%)
ModalNo (modal: false)
Cerrar con EscapeNo (closeOnEscape: false)
Datos enviadosLos datos actualmente filtrados de la tabla (reportesAvancesVentas.data)

Campos del diálogo de exportación

Nombre de archivo personalizado

PropiedadValor
Etiqueta"Customizar nombre de archivo"
Tooltip"Puede customizar el nombre del archivo a exportar." (ícono pi pi-exclamation-circle)
Componenteinput[type="text"] con pInputText dentro de un p-inputgroup
Valor por defectoreporte-export-\{timestamp\} (donde \{timestamp\} es new Date().getTime())
Botón de reinicioÍcono pi pi-refresh a la derecha del campo. Al hacer clic, restablece el nombre a pedidos-export-\{timestamp\} con un nuevo timestamp

El nombre por defecto al abrir el diálogo es reporte-export-\{timestamp\}. Sin embargo, al hacer clic en el botón de reinicio (ícono de refrescar), el nombre cambia a pedidos-export-\{timestamp\} con un nuevo timestamp generado en ese momento.

Tipo de exportación

PropiedadValor
Etiqueta"Exportar"
Tooltip"Seleccione la exportación a realizar." (ícono pi pi-exclamation-circle)
Componentep-dropdown
OpcionesUna única opción: LISTA DE REPORTE (valor: 1)
Valor por defecto1 (LISTA DE REPORTE)
BúsquedaHabilitada ([filter]="true", filtra por name)
PlaceholderSELECCIONE
Mensaje vacío"No se encontraron registros."
Mensaje filtro vacío"No se han encontrado resultados"

Los botones se ubican en un footer fijo en la parte inferior de la pantalla (position: fixed, bottom: 0, z-index: 10000):

BotónIconoEstiloAcción
Cancelarpi pi-timesp-button-primary p-button-textCierra el diálogo sin exportar
Guardarpi pi-checkp-button-primaryGenera y descarga el archivo Excel. Muestra un indicador de carga ([loading]="submitLoading") mientras procesa

Estructura del archivo Excel generado

El archivo se genera con la librería xlsx-js-style y tiene las siguientes características:

PropiedadValor
Nombre del archivo\{nombre_personalizado\}.xlsx
Nombre de la hojaPedidos
Estilo de bordesmedium, color #FFFFAA00
EncabezadosNegrita, tamaño 11, centrados horizontal y verticalmente, con ajuste de texto
CuerpoNormal, tamaño 10, centrados, con ajuste de texto

Columnas del Excel

El Excel contiene las mismas 12 columnas de la tabla, con los siguientes anchos:

ColumnaAncho (caracteres)
VENDEDOR30
CLIENTE30
CLIENTE PUNTO VENTA30
DIRECCION30
DISTRITO30
ZONA30
DIA VISITA15
FRECUENCIA15
VISITAS15
ALCANCE VENTA15
CUOTA15
% ALCANCE15

El Excel exporta únicamente los datos que están visibles en la tabla en ese momento, es decir, los datos ya filtrados por vendedores, clientes, distritos, zonas y rango de monto. Si deseas exportar todos los datos, asegúrate de que no haya filtros activos.


Flujo completo de carga del reporte

Inicialización

Al ingresar a la vista, el sistema establece la fecha de inicio como el primer día del mes actual y la fecha de fin como la fecha y hora actual. Se cargan los ubigeos desde la caché local del navegador.

Consulta al DWH

Se ejecutan en paralelo dos consultas al Data Warehouse:

  1. Documentos de ventas (tipo:1, indicador_codigo:DOCUMENTOS_VENTAS_MONTO) para el rango de fechas seleccionado.
  2. Metas de monto (tipo:4, indicador_codigo:METAS_MONTO) para el mes de la fecha de inicio.

Procesamiento de datos

Se formatean los nombres de clientes y vendedores, se resuelven los distritos por ubigeo, se extraen las listas únicas para los filtros y se agrupan los registros por vendedor-cliente-punto de venta.

Cálculos

Para cada grupo se calcula el monto de venta (suma de valores), la meta mensual y el porcentaje de alcance con 3 decimales.

Presentación

Los datos se muestran en la tabla paginada con 50 registros por página. Los filtros se llenan con las opciones disponibles en los datos cargados. El indicador de carga desaparece.


Autenticación

Todas las peticiones al servidor incluyen las siguientes cabeceras HTTP:

CabeceraValor
acceptapplication/json
AuthorizationBearer \{token\}
enterprise-idID de la empresa del usuario autenticado

Problemas comunes

ProblemaCausaSolución
La tabla no muestra datosNo hay registros de venta en el DWH para el rango de fechas seleccionadoAmplía el rango de fechas o verifica que existan documentos de venta registrados
La columna DISTRITO aparece vacíaEl punto de venta no tiene ubigeo_codigo configurado o el código no existe en la tabla de ubigeos localVerifica que los puntos de venta tengan el código de ubigeo correctamente asignado
El % Alcance muestra 0%La meta del vendedor (METAS_MONTO) es 0 o no existe para el mes consultadoConfigura las metas mensuales del vendedor en el módulo correspondiente
Los filtros de vendedores/clientes están vacíosNo hay datos en el DWH para el rango de fechas seleccionadoLas listas de filtros se generan dinámicamente con los datos disponibles; si no hay datos, no hay opciones
El botón Actualizar no cambia los datosLas fechas no han sido modificadas y no hay datos nuevos en el DWHLos datos se refrescan con los mismos parámetros; si la información no ha cambiado en el servidor, el resultado será el mismo
El Excel se descarga con el nombre incorrectoSe usó el botón de reinicio del nombre que genera un nombre diferente (pedidos-export-...)Edita manualmente el nombre del archivo antes de hacer clic en Guardar
La fecha de inicio se restablece solaSe seleccionó una fecha futuraEl sistema no permite fechas de inicio posteriores a la fecha actual y la corrige automáticamente
La fecha de fin se restablece solaSe seleccionó una fecha de fin anterior a la fecha de inicioEl sistema corrige la fecha de fin a la fecha y hora actual
Los montos muestran S/. 0.00No hay documentos de venta para esa combinación vendedor-cliente-punto de ventaVerifica los registros de venta en el sistema de facturación

Páginas relacionadas

  • Métricas — Configuración de métricas de rendimiento con indicadores personalizados.
  • Métricas — Detalles — Visualización de gráficos y datos de métricas configuradas.
  • Mapas de calor — Visualización geográfica de vendedores y puntos de venta en mapa interactivo.