Jake Vanderwerf
2026-05-03 9bbeea742424837fb58207d88e10dbca0b2cae04
inc/managers/ReferralManager.php
@@ -1,12 +1,10 @@
<?php
namespace JVBase\managers;
use JVBase\managers\MagicLinkManager;
use JVBase\integrations\Cloudflare;
use JVBase\meta\Form;
use JVBase\ui\CRUDSkeleton;
use JVBase\ui\Tabs;
use JVBase\utility\Features;
use JVBase\base\Site;
use WP_User;
use WP_Error;
@@ -45,16 +43,17 @@
      'referee_reward_type' => 'percentage',  // 'percentage' or 'fixed'
      'referee_reward_amount' => 20,  // 20% or $20
      'referee_reward_applies_to' => 'first_order',  // 'first_order' or 'all_orders'
      'referral_role'   => BASE.'client'
   ];
   protected string $role = BASE.'client';
   protected string $role;
   protected array $settings;
   public function __construct()
   {
      $this->defineTables();
      $this->role = Site::getDefaultReferralRole();
      $this->default_settings['referral_role'] = $this->role;
      global $wpdb;
      $this->wpdb = $wpdb;
      $this->cache = Cache::for('referrals', WEEK_IN_SECONDS);
@@ -134,7 +133,7 @@
         $table->setKeys([
            ['key' => 'PRIMARY', 'value' => 'id'],
            ['key' => 'UNIQUE', 'value' => 'to_user (`to_user`)'],
            ['key' => 'UNIQUE', 'value' => '(`to_user`)'],
            'from_user (`from_user`)',
            'status (`status`)',
            'code (`referral_code`)',
@@ -165,8 +164,8 @@
         ]);
         $table->setKeys([
            ['key' => 'PRIMARY', 'value' => 'id'],
            ['key' => 'UNIQUE', 'value' => 'code (`code`)'],
            ['key' => 'PRIMARY', 'value' => '(`id`)'],
            ['key' => 'UNIQUE', 'value' => '(`code`)'],
            'user (`user_id`)',
         ]);
@@ -195,7 +194,7 @@
         $table->setKeys([
            ['key' => 'PRIMARY', 'value' => '(`id`)'],
            ['key' => 'UNIQUE', 'value' => 'patient_guid (`patient_guid`)'],
            ['key' => 'UNIQUE', 'value' => '(`patient_guid`)'],
            'user (`user_id`)',
            'email (`email`)',
         ]);
@@ -238,9 +237,9 @@
         $base = BASE;
         $table->setConstraints([
            "CONSTRAINT `{$base}reward_referral` FOREIGN KEY (`referral_id`)
            REFERENCES {$this->referrals->getFullTableName()} (`id`) ON DELETE CASCADE",
            REFERENCES `{$this->referrals->getFullTableName()}` (`id`) ON DELETE CASCADE",
            "CONSTRAINT `{$base}reward_user` FOREIGN KEY (`user_id`)
            REFERENCES {$table->getUserTable()}` (`ID`) ON DELETE CASCADE"
            REFERENCES `{$table->getUserTable()}` (`ID`) ON DELETE CASCADE"
         ]);
         $table->defineTable();
         $this->rewards = $table;
@@ -329,7 +328,7 @@
         'jvb-data-store',
      ];
      if (Features::hasIntegration('cloudflare') && JVB()->connect('cloudflare')->isSetUp()) {
      if (Site::hasIntegration('cloudflare') && JVB()->connect('cloudflare')->isSetUp()) {
         JVB()->connect('cloudflare')->enqueueTurnstileScripts();
      }
      if (is_singular(BASE.'dash')) {
@@ -396,24 +395,24 @@
    * @param string|null $custom_code Optional custom code
    * @return string|WP_Error
    */
   public function getUserReferralCode(int $user_id, ?string $custom_code = null):array|wp_error
   public function getUserReferralCode(int $user_id, ?string $custom_code = null):string|false
   {
      $user = get_userdata($user_id);
      if (!$user) {
         return new WP_Error('invalid_user', 'User not found');
         return false;
      }
      $existing = $this->codes->pluck('code', ['user_id' => $user_id],'created_at', 'DESC');
      if ($existing && !$custom_code) {
         return $existing;
      if (!empty($existing) && !$custom_code) {
         return $existing[0];
      }
      if ($custom_code && !in_array($custom_code, $existing)) {
      if ($custom_code && !empty($existing) && !in_array($custom_code, $existing)) {
         $test = $this->createCode($user_id, $custom_code);
         if ($test) {
            return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC');
         } else {
            return $existing[0];
         }
      } else {
         return $existing;
      }
      // Generate new code if custom provided or none exists
@@ -421,10 +420,10 @@
      $success = $this->createCode($user_id, $code);
      if ($success) {
         return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC');
         return $this->codes->pluck('code', ['user_id' => $user_id], 'created_at', 'DESC')[0];
      }
      return $code;
      return false;
   }
   /**
@@ -1395,7 +1394,7 @@
   public function getLoggedInReferral(int $user_id): string
   {
      $referral_code = $this->getUserReferralCode($user_id);
      if (is_wp_error($referral_code)) {
      if (!$referral_code) {
         return '';
      }
@@ -1494,7 +1493,7 @@
      $code = $this->getUserReferralCode($user->ID);
      $yourCode = '';
      if (!is_wp_error($code)) {
      if ($code) {
         $share_url = $this->getShareURL($code);
         $yourCode = sprintf(
            '<div class="callout">
@@ -1556,7 +1555,7 @@
      $referrer = get_user_by('ID', $user_id);
      $referral_code = $this->getUserReferralCode($user_id);
      if (is_wp_error($referral_code)) {
      if ($referral_code) {
         return $referral_code;
      }
@@ -2621,10 +2620,10 @@
      // Regular users get their referral dashboard
      $user_id = get_current_user_id();
      $referral_code = get_user_meta($user_id, BASE . 'referral_code', true);
      $referral_code = $this->getUserReferralCode($user_id);
      if (!$referral_code) {
         $referral_code = $this->getUserReferralCode($user_id);
         $referral_code = $this->generateReferralCode($user_id);
      }
      $referrals = $this->getUserReferrals($user_id, ['limit' => 20]);
@@ -2839,7 +2838,7 @@
         update_option(BASE . 'referral_page_id', $page_id);
         // Save client import role
         $import_role = sanitize_text_field($post_data[BASE . 'referral_role'] ?? JVB_USER);
         $import_role = sanitize_text_field($post_data[BASE . 'referral_role'] ?? Site::getDefaultReferralRole());
         update_option(BASE . 'referral_role', $import_role);
         // Save reward settings
@@ -2892,7 +2891,7 @@
   public function getShareButtons(int $user_id):void
   {
      $referral_code = $this->getUserReferralCode($user_id);
      if (is_wp_error($referral_code)) {
      if (!$referral_code) {
         return;
      }