/**
 * Saves an edited discount
 *
 * @since 1.0
 * @param array $data Discount code data
 * @return void
 */
function edd_edit_discount($data)
{
    if (isset($data['edd-discount-nonce']) && wp_verify_nonce($data['edd-discount-nonce'], 'edd_discount_nonce')) {
        // Setup the discount code details
        $discount = array();
        foreach ($data as $key => $value) {
            if ($key != 'edd-discount-nonce' && $key != 'edd-action' && $key != 'discount-id' && $key != 'edd-redirect') {
                if (is_string($value) || is_int($value)) {
                    $discount[$key] = strip_tags(addslashes($value));
                } elseif (is_array($value)) {
                    $discount[$key] = array_map('absint', $value);
                }
            }
        }
        $old_discount = edd_get_discount_by('code', $data['code']);
        $discount['uses'] = edd_get_discount_uses($old_discount->ID);
        if (edd_store_discount($discount, $data['discount-id'])) {
            wp_redirect(add_query_arg('edd-message', 'discount_updated', $data['edd-redirect']));
            edd_die();
        } else {
            wp_redirect(add_query_arg('edd-message', 'discount_update_failed', $data['edd-redirect']));
            edd_die();
        }
    }
}
 /**
  * Process Get Discounts API Request
  *
  * @access public
  * @since 1.6
  * @global object $wpdb Used to query the database using the WordPress
  *   Database API
  * @param int $discount Discount ID
  * @return array $discounts Multidimensional array of the discounts
  */
 public function get_discounts($discount = null)
 {
     $discount_list = array();
     if (!user_can($this->user_id, 'manage_shop_discounts') && !$this->override) {
         return $discount_list;
     }
     $error = array();
     if (empty($discount)) {
         global $wpdb;
         $paged = $this->get_paged();
         $per_page = $this->per_page();
         $discounts = edd_get_discounts(array('posts_per_page' => $per_page, 'paged' => $paged));
         $count = 0;
         if (empty($discounts)) {
             $error['error'] = __('No discounts found!', 'easy-digital-downloads');
             return $error;
         }
         foreach ($discounts as $discount) {
             $discount_list['discounts'][$count]['ID'] = $discount->ID;
             $discount_list['discounts'][$count]['name'] = $discount->post_title;
             $discount_list['discounts'][$count]['code'] = edd_get_discount_code($discount->ID);
             $discount_list['discounts'][$count]['amount'] = edd_get_discount_amount($discount->ID);
             $discount_list['discounts'][$count]['min_price'] = edd_get_discount_min_price($discount->ID);
             $discount_list['discounts'][$count]['type'] = edd_get_discount_type($discount->ID);
             $discount_list['discounts'][$count]['uses'] = edd_get_discount_uses($discount->ID);
             $discount_list['discounts'][$count]['max_uses'] = edd_get_discount_max_uses($discount->ID);
             $discount_list['discounts'][$count]['start_date'] = edd_get_discount_start_date($discount->ID);
             $discount_list['discounts'][$count]['exp_date'] = edd_get_discount_expiration($discount->ID);
             $discount_list['discounts'][$count]['status'] = $discount->post_status;
             $discount_list['discounts'][$count]['product_requirements'] = edd_get_discount_product_reqs($discount->ID);
             $discount_list['discounts'][$count]['requirement_condition'] = edd_get_discount_product_condition($discount->ID);
             $discount_list['discounts'][$count]['global_discount'] = edd_is_discount_not_global($discount->ID);
             $discount_list['discounts'][$count]['single_use'] = edd_discount_is_single_use($discount->ID);
             $count++;
         }
     } else {
         if (is_numeric($discount) && get_post($discount)) {
             $discount_list['discounts'][0]['ID'] = $discount;
             $discount_list['discounts'][0]['name'] = get_post_field('post_title', $discount);
             $discount_list['discounts'][0]['code'] = edd_get_discount_code($discount);
             $discount_list['discounts'][0]['amount'] = edd_get_discount_amount($discount);
             $discount_list['discounts'][0]['min_price'] = edd_get_discount_min_price($discount);
             $discount_list['discounts'][0]['type'] = edd_get_discount_type($discount);
             $discount_list['discounts'][0]['uses'] = edd_get_discount_uses($discount);
             $discount_list['discounts'][0]['max_uses'] = edd_get_discount_max_uses($discount);
             $discount_list['discounts'][0]['start_date'] = edd_get_discount_start_date($discount);
             $discount_list['discounts'][0]['exp_date'] = edd_get_discount_expiration($discount);
             $discount_list['discounts'][0]['status'] = get_post_field('post_status', $discount);
             $discount_list['discounts'][0]['product_requirements'] = edd_get_discount_product_reqs($discount);
             $discount_list['discounts'][0]['requirement_condition'] = edd_get_discount_product_condition($discount);
             $discount_list['discounts'][0]['global_discount'] = edd_is_discount_not_global($discount);
             $discount_list['discounts'][0]['single_use'] = edd_discount_is_single_use($discount);
         } else {
             $error['error'] = sprintf(__('Discount %s not found!', 'easy-digital-downloads'), $discount);
             return $error;
         }
     }
     return $discount_list;
 }
/**
 * Increase Discount Usage
 *
 * Increases the use count of a discount code.
 *
 * @since 1.0
 * @param string $code Discount code to be incremented
 * @return int
 */
function edd_increase_discount_usage($code)
{
    $id = edd_get_discount_id_by_code($code);
    $uses = edd_get_discount_uses($id);
    if ($uses) {
        $uses++;
    } else {
        $uses = 1;
    }
    update_post_meta($id, '_edd_discount_uses', $uses);
    do_action('edd_discount_increase_use_count', $uses, $id, $code);
    return $uses;
}
 /**
  * Retrieve all the data for all the discount codes
  *
  * @access public
  * @since 1.4
  * @return array $discount_codes_data Array of all the data for the discount codes
  */
 public function discount_codes_data()
 {
     $discount_codes_data = array();
     $per_page = $this->per_page;
     $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : 'ID';
     $order = isset($_GET['order']) ? $_GET['order'] : 'DESC';
     $status = isset($_GET['status']) ? $_GET['status'] : array('active', 'inactive');
     $meta_key = isset($_GET['meta_key']) ? $_GET['meta_key'] : null;
     $search = isset($_GET['s']) ? sanitize_text_field($_GET['s']) : null;
     $discounts = edd_get_discounts(array('posts_per_page' => $per_page, 'paged' => isset($_GET['paged']) ? $_GET['paged'] : 1, 'orderby' => $orderby, 'order' => $order, 'post_status' => $status, 'meta_key' => $meta_key, 's' => $search));
     if ($discounts) {
         foreach ($discounts as $discount) {
             if (edd_get_discount_max_uses($discount->ID)) {
                 $uses = edd_get_discount_uses($discount->ID) . '/' . edd_get_discount_max_uses($discount->ID);
             } else {
                 $uses = edd_get_discount_uses($discount->ID);
             }
             if (edd_get_discount_max_uses($discount->ID)) {
                 $max_uses = edd_get_discount_max_uses($discount->ID) ? edd_get_discount_max_uses($discount->ID) : __('unlimited', 'edd');
             } else {
                 $max_uses = __('Unlimited', 'edd');
             }
             $start_date = edd_get_discount_start_date($discount->ID);
             if (!empty($start_date)) {
                 $discount_start_date = date_i18n(get_option('date_format'), strtotime($start_date));
             } else {
                 $discount_start_date = __('No start date', 'edd');
             }
             if (edd_get_discount_expiration($discount->ID)) {
                 $expiration = date_i18n(get_option('date_format'), strtotime(edd_get_discount_expiration($discount->ID)));
             } else {
                 $expiration = __('No expiration', 'edd');
             }
             $discount_codes_data[] = array('ID' => $discount->ID, 'name' => get_the_title($discount->ID), 'code' => edd_get_discount_code($discount->ID), 'amount' => edd_format_discount_rate(edd_get_discount_type($discount->ID), edd_get_discount_amount($discount->ID)), 'uses' => $uses, 'max_uses' => $max_uses, 'start_date' => $discount_start_date, 'expiration' => $expiration, 'status' => edd_is_discount_expired($discount->ID) ? 'expired' : $discount->post_status);
         }
     }
     return $discount_codes_data;
 }
/**
 * Saves an edited discount
 *
 * @since 1.0
 * @param array $data Discount code data
 * @return void
 */
function edd_edit_discount($data)
{
    if (!isset($data['edd-discount-nonce']) || !wp_verify_nonce($data['edd-discount-nonce'], 'edd_discount_nonce')) {
        return;
    }
    if (!current_user_can('manage_shop_discounts')) {
        wp_die(__('You do not have permission to edit discount codes', 'easy-digital-downloads'), __('Error', 'easy-digital-downloads'), array('response' => 403));
    }
    // Setup the discount code details
    $discount = array();
    foreach ($data as $key => $value) {
        if ($key != 'edd-discount-nonce' && $key != 'edd-action' && $key != 'discount-id' && $key != 'edd-redirect') {
            if (is_string($value) || is_int($value)) {
                $discount[$key] = strip_tags(addslashes($value));
            } elseif (is_array($value)) {
                $discount[$key] = array_map('absint', $value);
            }
        }
    }
    $old_discount = edd_get_discount_by('code', $data['code']);
    $discount['uses'] = edd_get_discount_uses($old_discount->ID);
    if (edd_store_discount($discount, $data['discount-id'])) {
        wp_redirect(add_query_arg('edd-message', 'discount_updated', $data['edd-redirect']));
        edd_die();
    } else {
        wp_redirect(add_query_arg('edd-message', 'discount_update_failed', $data['edd-redirect']));
        edd_die();
    }
}
/**
 * Decrease Discount Usage
 *
 * Decreases the use count of a discount code.
 *
 * @since 2.5.7
 * @param string $code Discount code to be decremented
 * @return int
 */
function edd_decrease_discount_usage($code)
{
    $id = edd_get_discount_id_by_code($code);
    if (false === $id) {
        return false;
    }
    $uses = edd_get_discount_uses($id);
    if ($uses) {
        $uses--;
    }
    if ($uses < 0) {
        $uses = 0;
    }
    update_post_meta($id, '_edd_discount_uses', $uses);
    $max_uses = edd_get_discount_max_uses($id);
    if ($max_uses > $uses) {
        edd_update_discount_status($id, 'active');
        update_post_meta($id, '_edd_discount_status', 'active');
    }
    do_action('edd_discount_decrease_use_count', $uses, $id, $code);
    return $uses;
}