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ón | Icono | Estilo | Descripción |
|---|---|---|---|
| Exportar | pi pi-file-excel | p-button-outlined | Abre un diálogo modal para exportar los datos filtrados a un archivo Excel (.xlsx) |
| Actualizar | pi pi-refresh | p-button-outlined | Recarga 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
| Campo | Componente | Formato | Valor por defecto | Descripción |
|---|---|---|---|---|
| Fecha de inicio | p-calendar | dd/mm/yy | Primer día del mes actual (YYYY-MM-01 00:00:00) | Fecha desde la cual se consultan los datos de ventas |
| Fecha de fin | p-calendar | dd/mm/yy | Fecha 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:
| Propiedad | Valor |
|---|---|
| Mostrar ícono | Sí ([showIcon]="true") |
| Mostrar hora | No ([showTime]="false") |
| Mostrar segundos | No ([showSeconds]="false") |
| Formato de hora | 12 horas ([hourFormat]="'12'") |
| Posición del popup | Anexado 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
| Propiedad | Valor |
|---|---|
| Componente | p-multiSelect |
| Etiqueta | Vendedores |
| Modo de visualización | Chips (display="chip") |
| Campo de opción | text (formato: \{apellido_paterno\} \{apellido_materno\} \{nombres\}) |
| Búsqueda | Habilitada, filtra por text |
| Botón limpiar | Sí ([showClear]="true") |
| Placeholder | SELECCIONE |
| 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
| Propiedad | Valor |
|---|---|
| Componente | p-multiSelect |
| Etiqueta | Clientes |
| Modo de visualización | Chips (display="chip") |
| Campo de opción | text |
| Búsqueda | Habilitada, filtra por text |
| Botón limpiar | Sí ([showClear]="true") |
| Placeholder | SELECCIONE |
| 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
| Propiedad | Valor |
|---|---|
| Componente | p-multiSelect |
| Etiqueta | Distritos |
| Modo de visualización | Chips (display="chip") |
| Campo de opción | text |
| Búsqueda | Habilitada, filtra por text |
| Botón limpiar | Sí ([showClear]="true") |
| Placeholder | SELECCIONE |
| 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
| Propiedad | Valor |
|---|---|
| Componente | p-multiSelect |
| Etiqueta | Zonas |
| Modo de visualización | Chips (display="chip") |
| Campo de opción | nombre |
| Búsqueda | Habilitada, filtra por nombre |
| Botón limpiar | Sí ([showClear]="true") |
| Placeholder | SELECCIONE |
| 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)
| Propiedad | Valor |
|---|---|
| Componente | Dos campos p-inputNumber en un p-inputgroup separados por un guion (-) |
| Etiqueta | Alcance venta |
| Modo | decimal |
| Decimales mínimos | 2 |
| Decimales máximos | 2 |
| Locale | ES-PE |
| Valor mínimo | 0 |
| Valor máximo | Se 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:
| Propiedad | Valor |
|---|---|
| Clave de fila | vendedor_id |
| Desplazamiento horizontal | Habilitado ([scrollable]="true", responsiveLayout="scroll") |
| Columnas redimensionables | Sí ([resizableColumns]="true", columnResizeMode="expand") |
| Paginación | Sí, 50 registros por página |
| Mostrar página actual | Sí ([showCurrentPageReport]="true") |
| Estilo | p-datatable-gridlines erpx-main |
| Indicador de carga | Spinner de carga mientras se consultan los datos |
Columnas de la tabla
| # | Columna | Ancho | Alineación | Contenido |
|---|---|---|---|---|
| 1 | VENDEDOR | 125px (fijo) | Derecha | Nombre completo del vendedor (\{apellido_paterno\} \{apellido_materno\} \{nombres\}) |
| 2 | CLIENTE | Auto | Izquierda | Razón social o nombre completo del cliente |
| 3 | CLIENTE PUNTO VENTA | 150px (fijo) | Derecha | Nombre del punto de venta del cliente |
| 4 | DIRECCION | 150px (fijo) | Izquierda | Dirección del punto de venta |
| 5 | DISTRITO | 125px (fijo) | Izquierda | Nombre del distrito obtenido del código de ubigeo |
| 6 | ZONA | 150px (fijo) | Izquierda | Nombre de la zona comercial asignada |
| 7 | DIA VISITA | 125px (fijo) | Derecha | Día programado de visita (puede ser null) |
| 8 | FRECUENCIA | 125px (fijo) | Derecha | Frecuencia de visita programada (puede ser null) |
| 9 | VISITAS | 125px (fijo) | Derecha | Cantidad de visitas realizadas (longitud del array visitas) |
| 10 | ALCANCE VENTA | 125px (fijo) | Derecha | Monto total de ventas en Soles (S/. X,XXX.XX), formato es-PE con 2 decimales |
| 11 | CUOTA | 125px (fijo) | Derecha | Meta de monto mensual en Soles (S/. X,XXX.XX), formato es-PE con 2 decimales |
| 12 | % ALCANCE | 125px (fijo) | Derecha | Porcentaje 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 (
.) — localees-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_montoes0, el% Alcancees0(evita división por cero). - Se muestra con 3 decimales y redondeo hacia arriba (
BigNumber.ROUND_UP). - Ejemplo: si
venta_monto = 5000ymeta_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:
| Dato | Cálculo |
|---|---|
| venta_monto | Suma de valor de todos los registros del grupo cuyo indicador_codigo sea DOCUMENTOS_VENTAS_MONTO |
| meta_monto | Suma 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ámetro | Valor |
|---|---|
| fecha_inicio | Fecha de inicio a las 00:00:00 en formato YYYYMMDD000000 |
| fecha_fin | Fecha de fin al final del día en formato YYYYMMDDHHmmss |
| tipo | 1 |
| indicador_codigo | DOCUMENTOS_VENTAS_MONTO |
| from | 0 |
| size | 100,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ámetro | Valor |
|---|---|
| fecha_mes | Primer día del mes de la fecha de inicio en formato YYYYMM00000000 (ejemplo: 20260300000000 para marzo 2026) |
| tipo | 4 |
| indicador_codigo | METAS_MONTO |
| from | 0 |
| size | 100,000,000 |
Endpoint DWH
| Endpoint | Método | URL base |
|---|---|---|
v2.0.1/erpx/analiticas/dwh | GET | https://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 porid(sin duplicados) - Distritos: Nombres de distritos únicos, ordenados alfabéticamente
- Clientes: Objetos
clienteúnicos porid - Vendedores: Objetos
vendedorúnicos porid
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:
| Nivel | Criterio de identificación | Ejemplo de código |
|---|---|---|
| Departamento | Los últimos 4 dígitos son 0000 | 150000 (Lima) |
| Provincia | Los dígitos 3-4 no son 00 y los dígitos 5-6 son 00 | 150100 (Lima provincia) |
| Distrito | Los últimos 2 dígitos no son 00 | 150101 (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.
Propiedades del diálogo
| Propiedad | Valor |
|---|---|
| Título | Exportar |
| Z-index base | 10000 |
| Ancho | 50vw (50% del ancho de la ventana) |
| Posición | Pegado arriba (top: 0, bottom: 0, maxHeight: 100%) |
| Modal | No (modal: false) |
| Cerrar con Escape | No (closeOnEscape: false) |
| Datos enviados | Los datos actualmente filtrados de la tabla (reportesAvancesVentas.data) |
Campos del diálogo de exportación
Nombre de archivo personalizado
| Propiedad | Valor |
|---|---|
| Etiqueta | "Customizar nombre de archivo" |
| Tooltip | "Puede customizar el nombre del archivo a exportar." (ícono pi pi-exclamation-circle) |
| Componente | input[type="text"] con pInputText dentro de un p-inputgroup |
| Valor por defecto | reporte-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
| Propiedad | Valor |
|---|---|
| Etiqueta | "Exportar" |
| Tooltip | "Seleccione la exportación a realizar." (ícono pi pi-exclamation-circle) |
| Componente | p-dropdown |
| Opciones | Una única opción: LISTA DE REPORTE (valor: 1) |
| Valor por defecto | 1 (LISTA DE REPORTE) |
| Búsqueda | Habilitada ([filter]="true", filtra por name) |
| Placeholder | SELECCIONE |
| Mensaje vacío | "No se encontraron registros." |
| Mensaje filtro vacío | "No se han encontrado resultados" |
Botones del diálogo
Los botones se ubican en un footer fijo en la parte inferior de la pantalla (position: fixed, bottom: 0, z-index: 10000):
| Botón | Icono | Estilo | Acción |
|---|---|---|---|
| Cancelar | pi pi-times | p-button-primary p-button-text | Cierra el diálogo sin exportar |
| Guardar | pi pi-check | p-button-primary | Genera 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:
| Propiedad | Valor |
|---|---|
| Nombre del archivo | \{nombre_personalizado\}.xlsx |
| Nombre de la hoja | Pedidos |
| Estilo de bordes | medium, color #FFFFAA00 |
| Encabezados | Negrita, tamaño 11, centrados horizontal y verticalmente, con ajuste de texto |
| Cuerpo | Normal, 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:
| Columna | Ancho (caracteres) |
|---|---|
| VENDEDOR | 30 |
| CLIENTE | 30 |
| CLIENTE PUNTO VENTA | 30 |
| DIRECCION | 30 |
| DISTRITO | 30 |
| ZONA | 30 |
| DIA VISITA | 15 |
| FRECUENCIA | 15 |
| VISITAS | 15 |
| ALCANCE VENTA | 15 |
| CUOTA | 15 |
| % ALCANCE | 15 |
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:
- Documentos de ventas (
tipo:1,indicador_codigo:DOCUMENTOS_VENTAS_MONTO) para el rango de fechas seleccionado. - 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:
| Cabecera | Valor |
|---|---|
accept | application/json |
Authorization | Bearer \{token\} |
enterprise-id | ID de la empresa del usuario autenticado |
Problemas comunes
| Problema | Causa | Solución |
|---|---|---|
| La tabla no muestra datos | No hay registros de venta en el DWH para el rango de fechas seleccionado | Amplía el rango de fechas o verifica que existan documentos de venta registrados |
| La columna DISTRITO aparece vacía | El punto de venta no tiene ubigeo_codigo configurado o el código no existe en la tabla de ubigeos local | Verifica 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 consultado | Configura las metas mensuales del vendedor en el módulo correspondiente |
| Los filtros de vendedores/clientes están vacíos | No hay datos en el DWH para el rango de fechas seleccionado | Las 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 datos | Las fechas no han sido modificadas y no hay datos nuevos en el DWH | Los 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 incorrecto | Se 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 sola | Se seleccionó una fecha futura | El sistema no permite fechas de inicio posteriores a la fecha actual y la corrige automáticamente |
| La fecha de fin se restablece sola | Se seleccionó una fecha de fin anterior a la fecha de inicio | El sistema corrige la fecha de fin a la fecha y hora actual |
Los montos muestran S/. 0.00 | No hay documentos de venta para esa combinación vendedor-cliente-punto de venta | Verifica 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.
Mapas de calor
Visualiza en un mapa interactivo la ubicación de tus vendedores, puntos de venta pendientes y visitados, zonas comerciales y mapas de calor basados en oportunidades
Reportes de documentos de ventas
Consulta detallada de documentos de ventas y pedidos por vendedor, cliente, punto de venta y distrito con tarjeta de resumen, filtros avanzados y exportación a Excel