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
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
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
// 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
@Controller('reports')
export class ReportsController {
// Dashboard
@Get('dashboard')
getDashboard(@Query('branchId') branchId?: string): Promise<RetailDashboard>;
// Ventas
@Get('sales')
getSalesReport(@Query() filters: SalesFilters): Promise<SalesReport>;
@Get('sales/by-hour')
getSalesByHour(@Query('date') date: string): Promise<HourlySales[]>;
@Get('sales/by-cashier')
getSalesByCashier(@Query() filters: DateFilters): Promise<CashierSales[]>;
// Productos
@Get('products/top-selling')
getTopSelling(@Query() filters: ProductFilters): Promise<ProductRanking[]>;
@Get('products/abc-analysis')
getABCAnalysis(@Query('branchId') branchId?: string): Promise<ABCAnalysis>;
@Get('products/slow-moving')
getSlowMoving(@Query() filters: ProductFilters): Promise<Product[]>;
// Inventario
@Get('inventory')
getInventoryReport(@Query('branchId') branchId?: string): Promise<InventoryReport>;
@Get('inventory/valuation')
getValuation(@Query('branchId') branchId?: string): Promise<ValuationReport>;
// Clientes
@Get('customers')
getCustomerReport(@Query() filters: CustomerFilters): Promise<CustomerReport>;
@Get('customers/loyalty')
getLoyaltyMetrics(@Query() filters: DateFilters): Promise<LoyaltyMetrics>;
// Caja
@Get('cash/closings')
getClosingsReport(@Query() filters: CashFilters): Promise<CashClosingSummary[]>;
@Get('cash/differences')
getDifferencesReport(@Query() filters: CashFilters): Promise<DifferenceReport>;
// Exportacion
@Get(':type/export/excel')
exportToExcel(@Param('type') type: string, @Query() filters: any): Promise<Buffer>;
@Get(':type/export/pdf')
exportToPDF(@Param('type') type: string, @Query() filters: any): Promise<Buffer>;
}
4. VISTAS MATERIALIZADAS
4.1 Para Performance
-- 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
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
7.2 Reportes
7.3 Performance
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