// app/modules/loyalty/static/admin/js/loyalty-analytics.js // noqa: js-006 - async init pattern is safe, loadData has try/catch // Use centralized logger const loyaltyAnalyticsLog = window.LogConfig.loggers.loyaltyAnalytics || window.LogConfig.createLogger('loyaltyAnalytics'); // ============================================ // LOYALTY ANALYTICS FUNCTION // ============================================ function adminLoyaltyAnalytics() { return { // Inherit base layout functionality ...data(), // Page identifier for sidebar active state currentPage: 'loyalty-analytics', // Stats stats: { total_programs: 0, active_programs: 0, total_cards: 0, active_cards: 0, transactions_30d: 0, points_issued_30d: 0, points_redeemed_30d: 0, merchants_with_programs: 0 }, // State loading: false, error: null, // Computed: Redemption rate percentage get redemptionRate() { if (this.stats.points_issued_30d === 0) return 0; return Math.round((this.stats.points_redeemed_30d / this.stats.points_issued_30d) * 100); }, // Computed: Issued percentage for progress bar get issuedPercentage() { const total = this.stats.points_issued_30d + this.stats.points_redeemed_30d; if (total === 0) return 50; return Math.round((this.stats.points_issued_30d / total) * 100); }, // Computed: Redeemed percentage for progress bar get redeemedPercentage() { return 100 - this.issuedPercentage; }, // Initialize async init() { loyaltyAnalyticsLog.info('=== LOYALTY ANALYTICS PAGE INITIALIZING ==='); // Prevent multiple initializations if (window._loyaltyAnalyticsInitialized) { loyaltyAnalyticsLog.warn('Loyalty analytics page already initialized, skipping...'); return; } window._loyaltyAnalyticsInitialized = true; loyaltyAnalyticsLog.group('Loading analytics data'); await this.loadStats(); loyaltyAnalyticsLog.groupEnd(); loyaltyAnalyticsLog.info('=== LOYALTY ANALYTICS PAGE INITIALIZATION COMPLETE ==='); }, // Load platform stats async loadStats() { this.loading = true; this.error = null; try { loyaltyAnalyticsLog.info('Fetching loyalty analytics...'); const response = await apiClient.get('/admin/loyalty/stats'); if (response) { this.stats = { total_programs: response.total_programs || 0, active_programs: response.active_programs || 0, total_cards: response.total_cards || 0, active_cards: response.active_cards || 0, transactions_30d: response.transactions_30d || 0, points_issued_30d: response.points_issued_30d || 0, points_redeemed_30d: response.points_redeemed_30d || 0, merchants_with_programs: response.merchants_with_programs || 0 }; loyaltyAnalyticsLog.info('Analytics loaded:', this.stats); } } catch (error) { loyaltyAnalyticsLog.error('Failed to load analytics:', error); this.error = error.message || 'Failed to load analytics'; } finally { this.loading = false; } }, // Format number with thousands separator formatNumber(num) { if (num === null || num === undefined) return '0'; return new Intl.NumberFormat('en-US').format(num); } }; } // Register logger for configuration if (!window.LogConfig.loggers.loyaltyAnalytics) { window.LogConfig.loggers.loyaltyAnalytics = window.LogConfig.createLogger('loyaltyAnalytics'); } loyaltyAnalyticsLog.info('Loyalty analytics module loaded');