Jake Vanderwerf
2026-01-25 b38f03c0e7218762d90fa5092696b127f24f36db
inc/managers/ReferralManager.php
@@ -24,7 +24,9 @@
{
   protected $wpdb;
   protected MagicLinkManager $magic_link;
   protected CacheManager $cache;
   protected Cache $cache;
   protected Cache $requestCache;
   protected Cache $statsCache;
   protected string $referrals_table;
   protected ?int $referralPage = null;
   protected string $rewards_table;
@@ -48,7 +50,10 @@
   {
      global $wpdb;
      $this->wpdb = $wpdb;
      $this->cache = CacheManager::for('referrals', WEEK_IN_SECONDS);
      $this->cache = Cache::for('referrals', WEEK_IN_SECONDS);
      $this->requestCache = Cache::for('referral_requests', WEEK_IN_SECONDS)->connect('referrals', true);
      $this->statsCache = Cache::for('referral_stats', WEEK_IN_SECONDS)->connect('referrals', true);
      $this->referrals_table = $wpdb->prefix . BASE . 'referrals';
      $this->rewards_table = $wpdb->prefix . BASE . 'referral_rewards';
@@ -355,7 +360,7 @@
      }
      // Clear caches
      $this->cache->clear();
      $this->cache->flush();
      // Fire action for tracking
      do_action('jvb_referral_processed', $user_id, $referrer->ID, $referral_code);
@@ -519,19 +524,19 @@
    */
   public function getUserReferrals(int $user_id, array $args = []): array
   {
      return $this->cache->remember(
         $user_id,
      $defaults = [
         'status' => 'all',
         'limit' => 100,
         'offset' => 0,
         'orderby' => 'referred_at',
         'order' => 'DESC'
      ];
      $args = wp_parse_args($args, $defaults);
      return $this->requestCache->remember(
         $this->requestCache->generateKey(array_merge(['user'=>$user_id], $args)),
         function() use ($user_id, $args) {
            $defaults = [
               'status' => 'all',
               'limit' => 100,
               'offset' => 0,
               'orderby' => 'referred_at',
               'order' => 'DESC'
            ];
            $args = wp_parse_args($args, $defaults);
            $where = $this->wpdb->prepare("WHERE referrer_id = %d", $user_id);
            if ($args['status'] !== 'all') {
@@ -575,37 +580,33 @@
    */
   public function getUserStats(int $user_id): array
   {
      $cache_key = 'stats_' . $user_id;
      $cached = $this->cache->get($cache_key);
      if ($cached !== false) {
         return $cached;
      }
      $stats = $this->wpdb->get_row($this->wpdb->prepare(
         "SELECT
      return $this->statsCache->remember(
         $user_id,
         function() use ($user_id) {
            $stats = $this->wpdb->get_row($this->wpdb->prepare(
               "SELECT
         COUNT(*) as code_used,
         SUM(CASE WHEN status IN ('consulted', 'treated') THEN 1 ELSE 0 END) as consultations,
         SUM(CASE WHEN status = 'treated' THEN 1 ELSE 0 END) as treatments,
         SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending
      FROM {$this->referrals_table}
      WHERE referrer_id = %d",
         $user_id
      ), ARRAY_A);
               $user_id
            ), ARRAY_A);
      // Get total rewards earned (available + redeemed)
      $rewards = $this->wpdb->get_var($this->wpdb->prepare(
         "SELECT SUM(amount)
            // Get total rewards earned (available + redeemed)
            $rewards = $this->wpdb->get_var($this->wpdb->prepare(
               "SELECT SUM(amount)
      FROM {$this->rewards_table}
      WHERE user_id = %d AND reward_type = 'referrer'",
         $user_id
      ));
               $user_id
            ));
      $stats['total_rewards'] = floatval($rewards ?? 0);
      $stats['user_id'] = $user_id;
      $this->cache->set($cache_key, $stats, HOUR_IN_SECONDS);
      return $stats;
            $stats['total_rewards'] = floatval($rewards ?? 0);
            $stats['user_id'] = $user_id;
            return $stats;
         }
      );
   }
   /**
@@ -617,20 +618,23 @@
    */
   public function getTopReferrers(int $limit = 10, string $period = 'all'): array
   {
      $where = '';
      return $this->statsCache->remember(
         $this->statsCache->generateKey(['limit'=>$limit, 'period' => $period]),
         function() use ($limit, $period) {
            $where = '';
      if ($period !== 'all') {
         $date_where = match($period) {
            'day' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 DAY)",
            'week' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK)",
            'month' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)",
            default => "1=1"
         };
            if ($period !== 'all') {
               $date_where = match($period) {
                  'day' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 DAY)",
                  'week' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 WEEK)",
                  'month' => "referred_at >= DATE_SUB(NOW(), INTERVAL 1 MONTH)",
                  default => "1=1"
               };
         $where = "WHERE {$date_where}";
      }
               $where = "WHERE {$date_where}";
            }
      $query = "SELECT
            $query = "SELECT
                    referrer_id,
                    COUNT(*) as referral_count,
                    SUM(CASE WHEN status = 'treated' THEN 1 ELSE 0 END) as treated_count
@@ -640,16 +644,19 @@
                  ORDER BY referral_count DESC
                  LIMIT {$limit}";
      $results = $this->wpdb->get_results($query);
            $results = $this->wpdb->get_results($query);
      // Enrich with user data
      foreach ($results as &$result) {
         $user = get_user_by('ID', $result->referrer_id);
         $result->user_name = $user ? $user->display_name : 'Unknown';
         $result->user_email = $user ? $user->user_email : '';
      }
            // Enrich with user data
            foreach ($results as &$result) {
               $user = get_user_by('ID', $result->referrer_id);
               $result->user_name = $user ? $user->display_name : 'Unknown';
               $result->user_email = $user ? $user->user_email : '';
            }
      return $results;
            return $results;
         }
      );
   }
   /**
@@ -772,23 +779,30 @@
    */
   protected function generateCSV(array $referrals): string
   {
      $csv = "Referred By,Referee Name,Referee Email,Referee Phone,Referral Code,Status,Referred At,Treated At\n";
      $cache = Cache::for('referralCSV', HOUR_IN_SECONDS)->connect('referrals');
      return $cache->remember(
         'csv',
         function () use ($referrals) {
            $csv = "Referred By,Referee Name,Referee Email,Referee Phone,Referral Code,Status,Referred At,Treated At\n";
      foreach ($referrals as $referral) {
         $csv .= sprintf(
            '"%s","%s","%s","%s","%s","%s","%s","%s"' . "\n",
            $referral->referrer_name ?? 'Unknown',
            $referral->referee_name,
            $referral->referee_email,
            $referral->referee_phone,
            $referral->referral_code,
            $referral->status,
            $referral->referred_at,
            $referral->treated_at ?? 'Not yet'
         );
      }
            foreach ($referrals as $referral) {
               $csv .= sprintf(
                  '"%s","%s","%s","%s","%s","%s","%s","%s"' . "\n",
                  $referral->referrer_name ?? 'Unknown',
                  $referral->referee_name,
                  $referral->referee_email,
                  $referral->referee_phone,
                  $referral->referral_code,
                  $referral->status,
                  $referral->referred_at,
                  $referral->treated_at ?? 'Not yet'
               );
            }
      return $csv;
            return $csv;
         }
      );
   }
   /**