# US-MGN-007-006-001: Dashboard de Ventas **RF Asociado:** [RF-MGN-007-006](../../02-modelado/requerimientos-funcionales/mgn-007/RF-MGN-007-006-reportes-de-ventas.md) **Módulo:** MGN-007 - Ventas Básico **Epic:** Reportes de Ventas **Prioridad:** P1 **Story Points:** 3 **Sprint:** Sprint 17 **Estado:** Ready for Development **Fecha:** 2025-11-24 --- ## User Story **Como** gerente de ventas, **Quiero** ver un dashboard con KPIs y métricas de ventas, **Para** monitorear el rendimiento del equipo y tomar decisiones informadas. --- ## Descripción Detallada Dashboard de ventas muestra: - **KPIs principales:** - Total ventas del mes (revenue) - # órdenes confirmadas - # cotizaciones pendientes - Ticket promedio - Tasa de conversión cotización → orden - **Gráficos:** - Ventas por mes (últimos 12 meses) - Top 10 productos más vendidos - Top 10 clientes por revenue - Pipeline de cotizaciones por estado - **Filtros:** - Rango de fechas - Vendedor - Cliente - Producto --- ## Criterios de Aceptación ### Escenario 1: Ver dashboard con datos del mes actual (Camino Feliz) **Dado que** hay 50 SO confirmadas en el mes actual con total=$100,000, **Cuando** accedo al dashboard, **Entonces** veo KPI "Ventas del mes: $100,000", "Órdenes: 50", "Ticket promedio: $2,000". ### Escenario 2: Filtrar por rango de fechas **Dado que** selecciono rango "01/01/2024 - 31/01/2024", **Cuando** aplico filtro, **Entonces** dashboard muestra solo datos del rango seleccionado. ### Escenario 3: Filtrar por vendedor **Dado que** soy sales_manager, **Cuando** selecciono vendedor "Juan Pérez", **Entonces** dashboard muestra solo ventas de Juan. ### Escenario 4: Gráfico de ventas mensuales **Dado que** hay ventas en los últimos 12 meses, **Cuando** veo el dashboard, **Entonces** gráfico de barras muestra ventas agrupadas por mes. ### Escenario 5: Top productos más vendidos **Dado que** Producto A vendió 100 unidades, Producto B vendió 80, **Cuando** veo el dashboard, **Entonces** tabla "Top Productos" muestra A en primer lugar, B en segundo. ### Escenario 6: Tasa de conversión **Dado que** hay 20 cotizaciones creadas, 15 convertidas a SO, **Cuando** veo el dashboard, **Entonces** KPI muestra "Conversión: 75%". --- ## Reglas de Negocio - **RN-1:** Dashboard filtra por empresa del usuario (RLS). - **RN-2:** sales_user solo ve sus propias ventas, sales_manager ve todas. - **RN-3:** Datos se calculan en tiempo real (no cache por defecto). - **RN-4:** Montos en moneda de la empresa (company.currency_id). - **RN-5:** Filtros son opcionales, default: mes actual. --- ## Tareas Técnicas ### Backend - [ ] Endpoint: `GET /api/v1/sales/dashboard/kpis?date_from&date_to&user_id&customer_id` - [ ] Endpoint: `GET /api/v1/sales/dashboard/monthly-sales` - [ ] Endpoint: `GET /api/v1/sales/dashboard/top-products` - [ ] Endpoint: `GET /api/v1/sales/dashboard/top-customers` - [ ] Service: `SalesDashboardService.getKPIs(filters)` - [ ] Query: Calcular total_revenue, order_count, avg_ticket - [ ] Query: Calcular conversion_rate (quotations → orders) - [ ] Query: Top productos por qty_sold y revenue - [ ] Query: Top clientes por revenue - [ ] Query: Ventas mensuales agrupadas - [ ] Aplicar RLS y permisos - [ ] Unit tests (>80%) - [ ] Integration tests - [ ] Swagger docs ### Frontend - [ ] Página: `SalesDashboardPage.tsx` (/sales/dashboard) - [ ] Componente: `SalesKPICards.tsx` (4 cards con KPIs) - [ ] Componente: `MonthlySalesChart.tsx` (bar chart) - [ ] Componente: `TopProductsTable.tsx` - [ ] Componente: `TopCustomersTable.tsx` - [ ] Componente: `ConversionFunnelChart.tsx` - [ ] Filtros: DateRangePicker, UserSelector, CustomerSelector - [ ] API client: `dashboardApi.getSalesKPIs(filters)` - [ ] State management: `useSalesDashboardStore` - [ ] Charts: Usar recharts o chart.js - [ ] Component tests - [ ] E2E test: "should display sales dashboard with KPIs" ### Database - [ ] View (opcional): `sales_dashboard_kpis` para optimizar queries - [ ] Índices: Optimizar queries de dashboard (orders.date, orders.state) --- ## Mockups / Wireframes **Dashboard de Ventas:** ``` ┌─────────────────────────────────────────────────────┐ │ Dashboard de Ventas │ ├─────────────────────────────────────────────────────┤ │ Filtros: [Rango: Este mes ▼] [Vendedor: Todos ▼] │ ├─────────────────────────────────────────────────────┤ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │Revenue │ │Órdenes │ │Ticket │ │Conver. │ │ │ │$100K │ │ 50 │ │$2,000 │ │ 75% │ │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ ├─────────────────────────────────────────────────────┤ │ Ventas Mensuales (últimos 12 meses) │ │ ┌─────────────────────────────────────────────┐ │ │ │ [Gráfico de barras] │ │ │ └─────────────────────────────────────────────┘ │ ├──────────────────────────┬──────────────────────────┤ │ Top 10 Productos │ Top 10 Clientes │ │ 1. Laptop HP - 100 unid. │ 1. ABC Corp - $50K │ │ 2. Mouse - 80 unid. │ 2. XYZ Ltd - $30K │ │ ... │ ... │ └──────────────────────────┴──────────────────────────┘ ``` --- ## Casos de Prueba ### Funcionales 1. **TC-001:** Dashboard muestra KPIs correctamente 2. **TC-002:** Filtro por fecha funciona 3. **TC-003:** Filtro por vendedor funciona 4. **TC-004:** Gráfico mensual muestra datos correctos 5. **TC-005:** Top productos ordenados por qty 6. **TC-006:** Top clientes ordenados por revenue 7. **TC-007:** Tasa de conversión calculada correctamente 8. **TC-008:** RLS filtra por empresa 9. **TC-009:** sales_user solo ve sus datos 10. **TC-010:** sales_manager ve todos los datos ### No Funcionales 1. **Performance:** < 2s para cargar dashboard completo 2. **Seguridad:** JWT + permiso sales_user --- ## Dependencias - **US bloqueantes:** - US-MGN-007-002-001 (Crear SO) - US-MGN-007-001-001 (Crear Cotización) - **Módulos requeridos:** MGN-003 (Partners), MGN-005 (Productos) --- ## Notas de Implementación - Queries optimizadas con índices en date y state - Considerar cache de 5 minutos para KPIs si hay muchos datos - Frontend: Skeleton loaders mientras cargan datos - Exportar dashboard a PDF como feature futura --- ## Estimación Detallada | Tarea | Horas | |-------|-------| | Backend | 2 | | Frontend | 2.5 | | Testing | 1 | | Code Review | 0.5 | | **TOTAL** | **6 horas = 3 SP** | --- ## Definition of Done - [ ] Código implementado según ET - [ ] Tests pasando (>80%) - [ ] Code review aprobado - [ ] KPIs se calculan correctamente - [ ] Gráficos muestran datos correctos - [ ] Filtros funcionan - [ ] RLS y permisos aplicados - [ ] Swagger docs actualizado - [ ] QA validado - [ ] PO aprobado --- ## Referencias - [RF-MGN-007-006](../../02-modelado/requerimientos-funcionales/mgn-007/RF-MGN-007-006-reportes-de-ventas.md) - [ET Backend](../../02-modelado/especificaciones-tecnicas/backend/mgn-007/ET-BACKEND-MGN-007-006-reportes.md) - [ET Frontend](../../02-modelado/especificaciones-tecnicas/frontend/mgn-007/ET-FRONTEND-MGN-007-006-reportes.md) - [Traceability](../../02-modelado/trazabilidad/TRACEABILITY-MGN-007.yaml)