/** * Undos a purchase, including the decrease of sale and earning stats. Used for * when refunding or deleting a purchase * * @since 1.0.8.1 * @param int $download_id Download (Post) ID * @param int $payment_id Payment ID * @return void */ function edd_undo_purchase($download_id, $payment_id) { $cart_details = edd_get_payment_meta_cart_details($payment_id); $user_info = edd_get_payment_meta_user_info($payment_id); if (is_array($cart_details)) { foreach ($cart_details as $item) { // get the item's price $amount = isset($item['price']) ? $item['price'] : false; // Decrease earnings/sales and fire action once per quantity number for ($i = 0; $i < $item['quantity']; $i++) { // variable priced downloads if (false === $amount && edd_has_variable_prices($download_id)) { $price_id = isset($item['item_number']['options']['price_id']) ? $item['item_number']['options']['price_id'] : null; $amount = !isset($item['price']) && 0 !== $item['price'] ? edd_get_price_option_amount($download_id, $price_id) : $item['price']; } if (!$amount) { // This function is only used on payments with near 1.0 cart data structure $amount = edd_get_download_final_price($download_id, $user_info, $amount); } } // decrease earnings edd_decrease_earnings($download_id, $amount); // decrease purchase count edd_decrease_purchase_count($download_id, $item['quantity']); } } }
/** * Process the payment details edit * * @access private * @since 1.9 * @return void */ function edd_update_payment_details($data) { if (!current_user_can('edit_shop_payments', $data['edd_payment_id'])) { wp_die(__('You do not have permission to edit this payment record', 'easy-digital-downloads'), __('Error', 'easy-digital-downloads'), array('response' => 403)); } check_admin_referer('edd_update_payment_details_nonce'); // Retrieve the payment ID $payment_id = absint($data['edd_payment_id']); // Retrieve existing payment meta $meta = edd_get_payment_meta($payment_id); $user_info = edd_get_payment_meta_user_info($payment_id); $status = $data['edd-payment-status']; $unlimited = isset($data['edd-unlimited-downloads']) ? '1' : ''; $date = sanitize_text_field($data['edd-payment-date']); $hour = sanitize_text_field($data['edd-payment-time-hour']); // Restrict to our high and low if ($hour > 23) { $hour = 23; } elseif ($hour < 0) { $hour = 00; } $minute = sanitize_text_field($data['edd-payment-time-min']); // Restrict to our high and low if ($minute > 59) { $minute = 59; } elseif ($minute < 0) { $minute = 00; } $address = array_map('trim', $data['edd-payment-address'][0]); $curr_total = edd_sanitize_amount(edd_get_payment_amount($payment_id)); $new_total = edd_sanitize_amount($_POST['edd-payment-total']); $tax = isset($_POST['edd-payment-tax']) ? edd_sanitize_amount($_POST['edd-payment-tax']) : 0; $date = date('Y-m-d', strtotime($date)) . ' ' . $hour . ':' . $minute . ':00'; $curr_customer_id = sanitize_text_field($data['edd-current-customer']); $new_customer_id = sanitize_text_field($data['customer-id']); // Setup purchased Downloads and price options $updated_downloads = isset($_POST['edd-payment-details-downloads']) ? $_POST['edd-payment-details-downloads'] : false; if ($updated_downloads && !empty($_POST['edd-payment-downloads-changed'])) { $downloads = array(); $cart_details = array(); $i = 0; foreach ($updated_downloads as $download) { if (empty($download['amount'])) { $download['amount'] = '0.00'; } $item = array(); $item['id'] = absint($download['id']); $item['quantity'] = absint($download['quantity']) > 0 ? absint($download['quantity']) : 1; $price_id = (int) $download['price_id']; $has_log = absint($download['has_log']); if ($price_id !== false && edd_has_variable_prices($item['id'])) { $item['options'] = array('price_id' => $price_id); } $downloads[] = $item; $cart_item = array(); $cart_item['item_number'] = $item; $item_price = round($download['amount'] / $item['quantity'], edd_currency_decimal_filter()); $cart_details[$i] = array('name' => get_the_title($download['id']), 'id' => $download['id'], 'item_number' => $item, 'price' => $download['amount'], 'item_price' => $item_price, 'subtotal' => $download['amount'], 'quantity' => $download['quantity'], 'discount' => 0, 'tax' => 0); // If this item doesn't have a log yet, add one for each quantity count if (empty($has_log)) { $log_date = date('Y-m-d G:i:s', current_time('timestamp', true)); $price_id = $price_id !== false ? $price_id : 0; $y = 0; while ($y < $download['quantity']) { edd_record_sale_in_log($download['id'], $payment_id, $price_id, $log_date); $y++; } edd_increase_purchase_count($download['id'], $download['quantity']); edd_increase_earnings($download['id'], $download['amount']); } $i++; } $meta['downloads'] = $downloads; $meta['cart_details'] = $cart_details; $deleted_downloads = json_decode(stripcslashes($data['edd-payment-removed']), true); foreach ($deleted_downloads as $deleted_download) { $deleted_download = $deleted_download[0]; if (empty($deleted_download['id'])) { continue; } $price_id = empty($deleted_download['price_id']) ? 0 : (int) $deleted_download['price_id']; $log_args = array('post_type' => 'edd_log', 'post_parent' => $deleted_download['id'], 'numberposts' => $deleted_download['quantity'], 'meta_query' => array(array('key' => '_edd_log_payment_id', 'value' => $payment_id, 'compare' => '='), array('key' => '_edd_log_price_id', 'value' => $price_id, 'compare' => '='))); $found_logs = get_posts($log_args); foreach ($found_logs as $log) { wp_delete_post($log->ID, true); } edd_decrease_purchase_count($deleted_download['id'], $deleted_download['quantity']); edd_decrease_earnings($deleted_download['id'], $deleted_download['amount']); do_action('edd_remove_download_from_payment', $payment_id, $deleted_download['id']); } } do_action('edd_update_edited_purchase', $payment_id); // Update main payment record $updated = wp_update_post(array('ID' => $payment_id, 'post_date' => $date)); if (0 === $updated) { wp_die(__('Error Updating Payment', 'easy-digital-downloads'), __('Error', 'easy-digital-downloads'), array('response' => 400)); } $customer_changed = false; if (isset($data['edd-new-customer']) && $data['edd-new-customer'] == '1') { $email = isset($data['edd-new-customer-email']) ? sanitize_text_field($data['edd-new-customer-email']) : ''; $names = isset($data['edd-new-customer-name']) ? sanitize_text_field($data['edd-new-customer-name']) : ''; if (empty($email) || empty($names)) { wp_die(__('New Customers require a name and email address', 'easy-digital-downloads')); } $customer = new EDD_Customer($email); if (empty($customer->id)) { $customer_data = array('name' => $names, 'email' => $email); $user_id = email_exists($email); if (false !== $user_id) { $customer_data['user_id'] = $user_id; } if (!$customer->create($customer_data)) { // Failed to crete the new customer, assume the previous customer $customer_changed = false; $customer = new EDD_Customer($curr_customer_id); edd_set_error('edd-payment-new-customer-fail', __('Error creating new customer', 'easy-digital-downloads')); } } $new_customer_id = $customer->id; $previous_customer = new EDD_Customer($curr_customer_id); $customer_changed = true; } elseif ($curr_customer_id !== $new_customer_id) { $customer = new EDD_Customer($new_customer_id); $email = $customer->email; $names = $customer->name; $previous_customer = new EDD_Customer($curr_customer_id); $customer_changed = true; } else { $customer = new EDD_Customer($curr_customer_id); $email = $customer->email; $names = $customer->name; } // Setup first and last name from input values $names = explode(' ', $names); $first_name = !empty($names[0]) ? $names[0] : ''; $last_name = ''; if (!empty($names[1])) { unset($names[0]); $last_name = implode(' ', $names); } if ($customer_changed) { // Remove the stats and payment from the previous customer and attach it to the new customer $previous_customer->remove_payment($payment_id, false); $customer->attach_payment($payment_id, false); // If purchase was completed and not ever refunded, adjust stats of customers if ('revoked' == $status || 'publish' == $status) { $previous_customer->decrease_purchase_count(); $previous_customer->decrease_value($new_total); $customer->increase_purchase_count(); $customer->increase_value($new_total); } update_post_meta($payment_id, '_edd_payment_customer_id', $customer->id); } // Set new meta values $user_info['id'] = $customer->user_id; $user_info['email'] = $customer->email; $user_info['first_name'] = $first_name; $user_info['last_name'] = $last_name; $user_info['address'] = $address; $meta['user_info'] = $user_info; $meta['tax'] = $tax; // Check for payment notes if (!empty($data['edd-payment-note'])) { $note = wp_kses($data['edd-payment-note'], array()); edd_insert_payment_note($payment_id, $note); } // Set new status edd_update_payment_status($payment_id, $status); edd_update_payment_meta($payment_id, '_edd_payment_user_id', $customer->user_id); edd_update_payment_meta($payment_id, '_edd_payment_user_email', $customer->email); edd_update_payment_meta($payment_id, '_edd_payment_meta', $meta); edd_update_payment_meta($payment_id, '_edd_payment_total', $new_total); // Adjust total store earnings if the payment total has been changed if ($new_total !== $curr_total && ('publish' == $status || 'revoked' == $status)) { if ($new_total > $curr_total) { // Increase if our new total is higher $difference = $new_total - $curr_total; edd_increase_total_earnings($difference); } elseif ($curr_total > $new_total) { // Decrease if our new total is lower $difference = $curr_total - $new_total; edd_decrease_total_earnings($difference); } } edd_update_payment_meta($payment_id, '_edd_payment_downloads', $new_total); edd_update_payment_meta($payment_id, '_edd_payment_unlimited_downloads', $unlimited); do_action('edd_updated_edited_purchase', $payment_id); wp_safe_redirect(admin_url('edit.php?post_type=download&page=edd-payment-history&view=view-order-details&edd-message=payment-updated&id=' . $payment_id)); exit; }
/** * Undos a purchase, including the decrease of sale and earning stats. Used for * when refunding or deleting a purchase * * @since 1.0.8.1 * @param int $download_id Download (Post) ID * @param int $payment_id Payment ID * @return void */ function edd_undo_purchase($download_id = false, $payment_id) { /** * In 2.5.7, a bug was found that $download_id was an incorrect usage. Passing it in * now does nothing, but we're holding it in place for legacy support of the argument order. */ if (!empty($download_id)) { $download_id = false; _edd_deprected_argument('download_id', 'edd_undo_purchase', '2.5.7'); } $payment = new EDD_Payment($payment_id); $cart_details = $payment->cart_details; $user_info = $payment->user_info; if (is_array($cart_details)) { foreach ($cart_details as $item) { // get the item's price $amount = isset($item['price']) ? $item['price'] : false; // Decrease earnings/sales and fire action once per quantity number for ($i = 0; $i < $item['quantity']; $i++) { // variable priced downloads if (false === $amount && edd_has_variable_prices($item['id'])) { $price_id = isset($item['item_number']['options']['price_id']) ? $item['item_number']['options']['price_id'] : null; $amount = !isset($item['price']) && 0 !== $item['price'] ? edd_get_price_option_amount($item['id'], $price_id) : $item['price']; } if (!$amount) { // This function is only used on payments with near 1.0 cart data structure $amount = edd_get_download_final_price($item['id'], $user_info, $amount); } } $maybe_decrease_earnings = apply_filters('edd_decrease_earnings_on_undo', true, $payment, $item['id']); if (true === $maybe_decrease_earnings) { // decrease earnings edd_decrease_earnings($item['id'], $amount); } $maybe_decrease_sales = apply_filters('edd_decrease_sales_on_undo', true, $payment, $item['id']); if (true === $maybe_decrease_sales) { // decrease purchase count edd_decrease_purchase_count($item['id'], $item['quantity']); } } } }
/** * Undos a purchase, including the decrease of sale and earning stats * * Used for when refunding or deleting a purchase * * @access public * @since 1.0.8.1 * @param int $download_id - the ID number of the download * @param int $payment_id - the ID number of the purchase * @return */ function edd_undo_purchase($download_id, $payment_id) { $payment = get_post($payment_id); if (edd_get_payment_status($payment) == 'refunded') { return; } // payment has already been reversed edd_decrease_purchase_count($download_id); $purchase_meta = edd_get_payment_meta($payment_id); $user_purchase_info = maybe_unserialize($purchase_meta['user_info']); $cart_details = maybe_unserialize($purchase_meta['cart_details']); $amount = null; if (is_array($cart_details)) { $cart_item_id = array_search($download_id, $cart_details); $amount = isset($cart_details[$cart_item_id]['price']) ? $cart_details[$cart_item_id]['price'] : null; } $amount = edd_get_download_final_price($download_id, $user_purchase_info, $amount); edd_decrease_earnings($download_id, $amount); }