/**
 * Create/Edit referral form.
 */
function affiliates_admin_referral_edit($referral_id = null)
{
    global $wpdb, $affiliates_options;
    $output = '';
    if (!current_user_can(AFFILIATES_ADMINISTER_AFFILIATES)) {
        wp_die(__('Access denied.', AFFILIATES_PLUGIN_DOMAIN));
    }
    $current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    $cancel_url = remove_query_arg('referral_id', remove_query_arg('action', $current_url));
    $current_url = remove_query_arg('paged', $current_url);
    $current_url = remove_query_arg('affiliate_id', $current_url);
    if ($referral_id === null) {
        $referral_id = isset($_POST['referral_id']) ? intval($_POST['referral_id']) : null;
    }
    $affiliate_id = isset($_POST['affiliate_id']) ? intval($_POST['affiliate_id']) : null;
    $datetime = isset($_POST['datetime']) ? date('Y-m-d H:i:s', strtotime($_POST['datetime'])) : date('Y-m-d H:i:s', time());
    $description = isset($_POST['description']) ? wp_strip_all_tags($_POST['description']) : '';
    $amount = !empty($_POST['amount']) ? bcadd('0', $_POST['amount'], AFFILIATES_REFERRAL_AMOUNT_DECIMALS) : null;
    $currency_id = substr(strtoupper(isset($_POST['currency_id']) ? wp_strip_all_tags($_POST['currency_id']) : ''), 0, 3);
    $status = $affiliates_options->get_option('referrals_status', AFFILIATES_REFERRAL_STATUS_ACCEPTED);
    if (isset($_POST['status'])) {
        switch ($_POST['status']) {
            case AFFILIATES_REFERRAL_STATUS_ACCEPTED:
            case AFFILIATES_REFERRAL_STATUS_CLOSED:
            case AFFILIATES_REFERRAL_STATUS_PENDING:
            case AFFILIATES_REFERRAL_STATUS_REJECTED:
                $status = $_POST['status'];
                break;
        }
    }
    $reference = isset($_POST['reference']) ? wp_strip_all_tags($_POST['reference']) : '';
    $saved = false;
    if (isset($_POST['save'])) {
        if (!wp_verify_nonce($_POST['referral-nonce'], 'save')) {
            wp_die(__('Access denied.', AFFILIATES_PLUGIN_DOMAIN));
        } else {
            if (!empty($affiliate_id)) {
                if (empty($referral_id)) {
                    add_action('affiliates_referral', 'affiliates_admin_referral_capture_id');
                    if (class_exists('Affiliates_Referral_WordPress')) {
                        $r = new Affiliates_Referral_WordPress();
                        $r->add_referrals(array($affiliate_id), null, $description, null, null, $amount, $currency_id, $status, 'manual', $reference);
                    } else {
                        affiliates_add_referral($affiliate_id, null, $description, null, $amount, $currency_id, $status, 'manual', $reference);
                    }
                    remove_action('affiliates_referral', 'affiliates_admin_referral_capture_id');
                    global $captured_referral_id;
                    if (isset($captured_referral_id)) {
                        $referral_id = $captured_referral_id;
                        $output .= '<br/>';
                        $output .= '<div class="info">' . __('The referral has been created.', AFFILIATES_PLUGIN_DOMAIN) . '</div>';
                        $saved = true;
                    } else {
                        $output .= '<br/>';
                        $output .= '<div class="warning">' . __('The referral has not been created. Duplicate?', AFFILIATES_PLUGIN_DOMAIN) . '</div>';
                    }
                } else {
                    if (class_exists('Affiliates_Referral_WordPress')) {
                        try {
                            $r = new Affiliates_Referral_WordPress($referral_id);
                            if ($r->update(array('affiliate_id' => intval($affiliate_id), 'datetime' => $datetime, 'description' => $description, 'amount' => $amount, 'currency_id' => $currency_id, 'status' => $status, 'reference' => $reference))) {
                                $output .= '<br/>';
                                $output .= '<div class="info">' . __('The referral has been saved.', AFFILIATES_PLUGIN_DOMAIN) . '</div>';
                                $saved = true;
                            }
                        } catch (Exception $ex) {
                            $output .= '<br/>';
                            $output .= '<div class="error">' . __('The referral could not be saved.', AFFILIATES_PLUGIN_DOMAIN) . '</div>';
                        }
                    } else {
                        if (affiliates_update_referral($referral_id, array('affiliate_id' => intval($affiliate_id), 'datetime' => $datetime, 'description' => $description, 'amount' => $amount, 'currency_id' => $currency_id, 'status' => $status, 'reference' => $reference))) {
                            $output .= '<br/>';
                            $output .= '<div class="info">' . __('The referral has been saved.', AFFILIATES_PLUGIN_DOMAIN) . '</div>';
                            $saved = true;
                        }
                    }
                }
            }
        }
    }
    if ($referral_id !== null) {
        $referrals_table = _affiliates_get_tablename('referrals');
        if ($referrals = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$referrals_table} WHERE referral_id = %d", $referral_id))) {
            if (count($referrals) > 0) {
                $referral = $referrals[0];
                $affiliate_id = $referral->affiliate_id;
                $datetime = $referral->datetime;
                $description = $referral->description;
                $amount = $referral->amount;
                $currency_id = $referral->currency_id;
                $status = $referral->status;
                $reference = $referral->reference;
            }
        }
    }
    $output .= '<div class="referral">';
    $output .= '<h2>';
    if (empty($referral_id)) {
        $output .= __('New Referral', AFFILIATES_PLUGIN_DOMAIN);
    } else {
        $output .= __('Edit Referral', AFFILIATES_PLUGIN_DOMAIN);
    }
    $output .= '</h2>';
    $output .= '<form id="referral" action="' . $current_url . '" method="post">';
    $output .= '<div>';
    if ($referral_id) {
        $output .= sprintf('<input type="hidden" name="referral_id" value="%d" />', intval($referral_id));
    }
    $output .= '<input type="hidden" name="action" value="edit" />';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Affiliate', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $affiliates = affiliates_get_affiliates(true, true);
    $output .= '<select name="affiliate_id">';
    foreach ($affiliates as $affiliate) {
        if ($affiliate_id == $affiliate['affiliate_id']) {
            $selected = ' selected="selected" ';
        } else {
            $selected = '';
        }
        $output .= '<option ' . $selected . ' value="' . esc_attr($affiliate['affiliate_id']) . '">' . esc_attr(stripslashes($affiliate['name'])) . '</option>';
    }
    $output .= '</select>';
    $output .= '</label>';
    $output .= '</p>';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Date & Time', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= sprintf('<input type="text" name="datetime" value="%s" />', esc_attr($datetime));
    $output .= ' ';
    $output .= '<span class="description">' . __('Format : YYYY-MM-DD HH:MM:SS', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= '</label>';
    $output .= '</p>';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Description', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= '<textarea name="description">';
    $output .= stripslashes($description);
    $output .= '</textarea>';
    $output .= '</label>';
    $output .= '</p>';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Amount', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= sprintf('<input type="text" name="amount" value="%s" />', esc_attr($amount));
    $output .= '</label>';
    $output .= '</p>';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Currency ID', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= sprintf('<input type="text" name="currency_id" value="%s" />', esc_attr($currency_id));
    $output .= ' ';
    $output .= '<span class="description">' . __('* Required when an amount is provided. Examples: USD, GBP, EUR, ...', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= '</label>';
    $output .= '</p>';
    $status_descriptions = array(AFFILIATES_REFERRAL_STATUS_ACCEPTED => __('Accepted', AFFILIATES_PLUGIN_DOMAIN), AFFILIATES_REFERRAL_STATUS_CLOSED => __('Closed', AFFILIATES_PLUGIN_DOMAIN), AFFILIATES_REFERRAL_STATUS_PENDING => __('Pending', AFFILIATES_PLUGIN_DOMAIN), AFFILIATES_REFERRAL_STATUS_REJECTED => __('Rejected', AFFILIATES_PLUGIN_DOMAIN));
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Status', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= '<select name="status">';
    foreach ($status_descriptions as $key => $label) {
        $selected = $key == $status ? ' selected="selected" ' : '';
        $output .= '<option ' . $selected . ' value="' . esc_attr($key) . '">' . $label . '</option>';
    }
    $output .= '</select>';
    $output .= '</label>';
    $output .= '</p>';
    $output .= '<p>';
    $output .= '<label>';
    $output .= '<span class="title">' . __('Reference', AFFILIATES_PLUGIN_DOMAIN) . '</span>';
    $output .= ' ';
    $output .= sprintf('<input type="text" name="reference" value="%s" />', esc_attr($reference));
    $output .= '</label>';
    $output .= '</p>';
    $output .= wp_nonce_field('save', 'referral-nonce', true, false);
    $output .= sprintf('<input class="button" type="submit" name="save" value="%s"/>', __('Save', AFFILIATES_PLUGIN_DOMAIN));
    $output .= ' ';
    $output .= sprintf('<a class="cancel" href="%s">%s</a>', $cancel_url, $saved ? __('Back', AFFILIATES_PLUGIN_DOMAIN) : __('Cancel', AFFILIATES_PLUGIN_DOMAIN));
    $output .= '</div>';
    $output .= '</form>';
    $output .= '</div>';
    echo $output;
    affiliates_footer();
}
 /**
  * Record a referral when a new user has been referred by an affiliate.
  * 
  * @param int $user_id
  * @param array $params registration parameters
  */
 public static function user_register($user_id, $params = array())
 {
     extract($params);
     if (!isset($force)) {
         $force = false;
     }
     if (!isset($type)) {
         $type = null;
     }
     if (!$force && is_admin()) {
         if (!apply_filters('affiliates_user_registration_on_admin', false)) {
             return;
         }
     }
     if ($user = get_user_by('id', $user_id)) {
         $post_id = null;
         if ($post = get_post()) {
             $post_id = $post->ID;
         }
         switch ($type) {
             case 'customer':
                 $description = sprintf('Customer Registration %s', esc_html($user->user_login));
                 break;
             default:
                 $description = sprintf('User Registration %s', esc_html($user->user_login));
         }
         $base_amount = null;
         if (AFFILIATES_PLUGIN_NAME != 'affiliates') {
             $base_amount = get_option('aff_user_registration_base_amount', null);
         }
         $amount = null;
         if (empty($base_amount)) {
             $amount = get_option('aff_user_registration_amount', '0');
         }
         $currency = get_option('aff_user_registration_currency', Affiliates::DEFAULT_CURRENCY);
         $user_registration_referral_status = get_option('aff_user_registration_referral_status', get_option('aff_default_referral_status', AFFILIATES_REFERRAL_STATUS_ACCEPTED));
         $data = array('user_login' => array('title' => 'Username', 'domain' => AFFILIATES_PLUGIN_DOMAIN, 'value' => $user->user_login), 'user_email' => array('title' => 'Email', 'domain' => AFFILIATES_PLUGIN_DOMAIN, 'value' => $user->user_email), 'first_name' => array('title' => 'First Name', 'domain' => AFFILIATES_PLUGIN_DOMAIN, 'value' => $user->first_name), 'last_name' => array('title' => 'Last Name', 'domain' => AFFILIATES_PLUGIN_DOMAIN, 'value' => $user->last_name), 'base_amount' => array('title' => 'Base Amount', 'domain' => AFFILIATES_PLUGIN_DOMAIN, 'value' => $base_amount));
         if (class_exists('Affiliates_Referral_WordPress')) {
             $r = new Affiliates_Referral_WordPress();
             $affiliate_id = $r->evaluate($post_id, $description, $data, $base_amount, $amount, $currency, $user_registration_referral_status, self::REFERRAL_TYPE);
         } else {
             $affiliate_id = affiliates_suggest_referral($post_id, $description, $data, $amount, $currency, $user_registration_referral_status, self::REFERRAL_TYPE);
         }
     }
 }