# ANALISIS MODULO RT-008: REPORTES Y DASHBOARD **Fecha:** 2025-12-18 **Fase:** 2 - Analisis por Modulo **Modulo:** RT-008 Reportes **Herencia:** 70% **Story Points:** 30 **Prioridad:** P1 --- ## 1. DESCRIPCION GENERAL ### 1.1 Proposito Sistema de analytics con dashboards en tiempo real, reportes de ventas, inventario, clientes y metricas operativas. ### 1.2 Funcionalidades Principales | Funcionalidad | Descripcion | Criticidad | |---------------|-------------|------------| | Dashboard principal | KPIs tiempo real | Alta | | Reportes ventas | Por periodo/sucursal | Alta | | Analisis productos | Top vendidos, ABC | Media | | Reportes inventario | Stock, valoracion | Media | | Exportacion | Excel, PDF | Media | --- ## 2. HERENCIA DEL CORE ### 2.1 Componentes Heredados (70%) | Componente Core | % Uso | Accion | |-----------------|-------|--------| | MGN-009 Reports | 70% | EXTENDER | | Analytics module | 100% | HEREDAR | ### 2.2 Servicios a Heredar ```typescript import { ReportsService } from '@erp-core/reports'; import { AnalyticsService } from '@erp-core/analytics'; import { ExportService } from '@erp-core/reports'; ``` --- ## 3. COMPONENTES NUEVOS ### 3.1 Dashboard Principal ```typescript interface RetailDashboard { // Metricas del dia today: { totalSales: number; totalTransactions: number; avgTicket: number; newCustomers: number; returningCustomers: number; pointsRedeemed: number; refunds: number; }; // Comparativo comparison: { vsYesterday: PercentChange; vsLastWeek: PercentChange; vsLastMonth: PercentChange; }; // Graficos charts: { salesByHour: TimeSeriesData[]; salesByPaymentMethod: PieChartData[]; topProducts: BarChartData[]; topBranches: BarChartData[]; }; // Alertas alerts: { lowStock: number; pendingTransfers: number; unapprovedClosings: number; }; } ``` ### 3.2 Tipos de Reportes ```typescript // 1. Reporte de Ventas interface SalesReport { period: DateRange; groupBy: 'day' | 'week' | 'month' | 'branch' | 'cashier'; summary: { totalSales: number; totalTransactions: number; avgTicket: number; totalDiscounts: number; totalRefunds: number; netSales: number; }; byPaymentMethod: { cash: number; card: number; transfer: number; credit: number; mixed: number; }; details: SalesReportLine[]; } // 2. Reporte de Productos interface ProductReport { period: DateRange; branchId?: string; topSelling: ProductRanking[]; slowMoving: ProductRanking[]; noMovement: Product[]; abcAnalysis: { A: Product[]; // 80% ventas B: Product[]; // 15% ventas C: Product[]; // 5% ventas }; } // 3. Reporte de Inventario interface InventoryReport { branchId?: string; summary: { totalProducts: number; totalValue: number; lowStockItems: number; outOfStockItems: number; }; byCategory: CategoryStock[]; lowStockAlerts: StockAlert[]; valuationMethod: 'FIFO' | 'LIFO' | 'AVCO'; } // 4. Reporte de Clientes interface CustomerReport { period: DateRange; summary: { totalCustomers: number; newCustomers: number; activeCustomers: number; avgPurchaseFrequency: number; }; topCustomers: CustomerRanking[]; byMembershipLevel: MembershipBreakdown; loyaltyMetrics: { pointsIssued: number; pointsRedeemed: number; redemptionRate: number; }; } // 5. Reporte de Caja interface CashReport { period: DateRange; branchId?: string; closings: CashClosingSummary[]; differences: { total: number; count: number; byReason: DifferenceBreakdown[]; }; movements: { totalIn: number; totalOut: number; byReason: MovementBreakdown[]; }; } ``` ### 3.3 Servicios Backend | Servicio | Metodos Principales | |----------|-------------------| | DashboardService | getDashboard(), refresh() | | SalesReportService | generate(), getByPeriod(), export() | | ProductReportService | getTopSelling(), getABCAnalysis() | | InventoryReportService | getStockReport(), getValuation() | | CustomerReportService | getCustomerMetrics(), getLoyaltyStats() | | CashReportService | getClosingsReport(), getDifferences() | | ExportService | toExcel(), toPDF() | ### 3.4 Controladores ```typescript @Controller('reports') export class ReportsController { // Dashboard @Get('dashboard') getDashboard(@Query('branchId') branchId?: string): Promise; // Ventas @Get('sales') getSalesReport(@Query() filters: SalesFilters): Promise; @Get('sales/by-hour') getSalesByHour(@Query('date') date: string): Promise; @Get('sales/by-cashier') getSalesByCashier(@Query() filters: DateFilters): Promise; // Productos @Get('products/top-selling') getTopSelling(@Query() filters: ProductFilters): Promise; @Get('products/abc-analysis') getABCAnalysis(@Query('branchId') branchId?: string): Promise; @Get('products/slow-moving') getSlowMoving(@Query() filters: ProductFilters): Promise; // Inventario @Get('inventory') getInventoryReport(@Query('branchId') branchId?: string): Promise; @Get('inventory/valuation') getValuation(@Query('branchId') branchId?: string): Promise; // Clientes @Get('customers') getCustomerReport(@Query() filters: CustomerFilters): Promise; @Get('customers/loyalty') getLoyaltyMetrics(@Query() filters: DateFilters): Promise; // Caja @Get('cash/closings') getClosingsReport(@Query() filters: CashFilters): Promise; @Get('cash/differences') getDifferencesReport(@Query() filters: CashFilters): Promise; // Exportacion @Get(':type/export/excel') exportToExcel(@Param('type') type: string, @Query() filters: any): Promise; @Get(':type/export/pdf') exportToPDF(@Param('type') type: string, @Query() filters: any): Promise; } ``` --- ## 4. VISTAS MATERIALIZADAS ### 4.1 Para Performance ```sql -- Vista materializada de ventas diarias CREATE MATERIALIZED VIEW retail.mv_daily_sales AS SELECT DATE(po.order_date) as sale_date, po.tenant_id, ps.branch_id, ps.user_id as cashier_id, COUNT(*) as transaction_count, SUM(po.total) as total_sales, SUM(po.discount_amount) as total_discounts, AVG(po.total) as avg_ticket, SUM(CASE WHEN po.status = 'refunded' THEN po.total ELSE 0 END) as refunds FROM retail.pos_orders po JOIN retail.pos_sessions ps ON po.session_id = ps.id WHERE po.status IN ('done', 'refunded') GROUP BY DATE(po.order_date), po.tenant_id, ps.branch_id, ps.user_id; CREATE UNIQUE INDEX idx_mv_daily_sales ON retail.mv_daily_sales(sale_date, tenant_id, branch_id, cashier_id); -- Vista materializada de productos mas vendidos CREATE MATERIALIZED VIEW retail.mv_product_sales AS SELECT pol.product_id, pol.tenant_id, ps.branch_id, DATE_TRUNC('month', po.order_date) as sale_month, SUM(pol.quantity) as qty_sold, SUM(pol.total) as revenue, COUNT(DISTINCT po.id) as order_count FROM retail.pos_order_lines pol JOIN retail.pos_orders po ON pol.order_id = po.id JOIN retail.pos_sessions ps ON po.session_id = ps.id WHERE po.status = 'done' GROUP BY pol.product_id, pol.tenant_id, ps.branch_id, DATE_TRUNC('month', po.order_date); -- Refresh cada hora -- REFRESH MATERIALIZED VIEW CONCURRENTLY retail.mv_daily_sales; ``` --- ## 5. GRAFICOS Y VISUALIZACIONES ### 5.1 Componentes Frontend | Componente | Tipo | Datos | |------------|------|-------| | SalesChart | Line | Ventas por hora/dia | | PaymentPieChart | Pie | Por metodo de pago | | TopProductsChart | Bar | Top 10 productos | | BranchComparison | Bar | Ventas por sucursal | | TrendIndicator | KPI | Variacion % | | AlertsBadge | Badge | Alertas pendientes | ### 5.2 Configuracion ```typescript interface ChartConfig { refreshInterval: number; // segundos defaultPeriod: 'today' | 'week' | 'month'; colors: { primary: string; success: string; warning: string; danger: string; }; } const defaultConfig: ChartConfig = { refreshInterval: 300, // 5 minutos defaultPeriod: 'today', colors: { primary: '#3B82F6', success: '#10B981', warning: '#F59E0B', danger: '#EF4444' } }; ``` --- ## 6. DEPENDENCIAS ### 6.1 Dependencias de Core | Modulo | Estado | Requerido Para | |--------|--------|---------------| | MGN-009 Reports | 0% | Base de reportes | ### 6.2 Dependencias de Retail | Modulo | Tipo | |--------|------| | RT-001 Fundamentos | Prerequisito | | RT-002 POS | Datos de ventas | | RT-003 Inventario | Datos de stock | | RT-005 Clientes | Datos de lealtad | | RT-007 Caja | Datos de cortes | --- ## 7. CRITERIOS DE ACEPTACION ### 7.1 Dashboard - [ ] Cargar dashboard < 3s - [ ] Auto-refresh cada 5 min - [ ] Mostrar KPIs del dia - [ ] Grafico de ventas por hora - [ ] Top 5 productos - [ ] Alertas visibles ### 7.2 Reportes - [ ] Filtrar por sucursal - [ ] Filtrar por periodo - [ ] Comparar periodos - [ ] Exportar a Excel - [ ] Exportar a PDF ### 7.3 Performance - [ ] Dashboard < 3s - [ ] Reportes < 5s - [ ] Vistas materializadas --- ## 8. ESTIMACION DETALLADA | Componente | SP Backend | SP Frontend | Total | |------------|-----------|-------------|-------| | Dashboard Service | 3 | - | 3 | | Sales Report Service | 3 | - | 3 | | Product Report Service | 2 | - | 2 | | Inventory Report Service | 2 | - | 2 | | Customer Report Service | 2 | - | 2 | | Cash Report Service | 2 | - | 2 | | Export Service | 3 | - | 3 | | Vistas Materializadas | 2 | - | 2 | | Dashboard UI | - | 8 | 8 | | Report Pages | - | 3 | 3 | | **TOTAL** | **19** | **11** | **30** | --- **Estado:** ANALISIS COMPLETO **Bloqueado por:** RT-002, RT-003, RT-005, RT-007