Exemplo n.º 1
0
/**
 * Complete a purchase aka donation
 *
 * Performs all necessary actions to complete a purchase.
 * Triggered by the give_update_payment_status() function.
 *
 * @since  1.0
 *
 * @param  int    $payment_id The ID number of the payment.
 * @param  string $new_status The status of the payment, probably "publish".
 * @param  string $old_status The status of the payment prior to being marked as "complete", probably "pending".
 *
 * @return void
 */
function give_complete_purchase($payment_id, $new_status, $old_status)
{
    // Make sure that payments are only completed once
    if ($old_status == 'publish' || $old_status == 'complete') {
        return;
    }
    // Make sure the payment completion is only processed when new status is complete
    if ($new_status != 'publish' && $new_status != 'complete') {
        return;
    }
    $payment = new Give_Payment($payment_id);
    $creation_date = get_post_field('post_date', $payment_id, 'raw');
    $payment_meta = $payment->payment_meta;
    $completed_date = $payment->completed_date;
    $user_info = $payment->user_info;
    $customer_id = $payment->customer_id;
    $amount = $payment->total;
    $price_id = $payment->price_id;
    $form_id = $payment->form_id;
    do_action('give_pre_complete_purchase', $payment_id);
    // Ensure these actions only run once, ever
    if (empty($completed_date)) {
        give_record_sale_in_log($form_id, $payment_id, $price_id, $creation_date);
        do_action('give_complete_form_donation', $form_id, $payment_id, $payment_meta);
    }
    // Increase the earnings for this form ID
    give_increase_earnings($form_id, $amount);
    give_increase_purchase_count($form_id);
    // Clear the total earnings cache
    delete_transient('give_earnings_total');
    // Clear the This Month earnings (this_monththis_month is NOT a typo)
    delete_transient(md5('give_earnings_this_monththis_month'));
    delete_transient(md5('give_earnings_todaytoday'));
    // Increase the donor's purchase stats
    $customer = new Give_Customer($customer_id);
    $customer->increase_purchase_count();
    $customer->increase_value($amount);
    give_increase_total_earnings($amount);
    // Ensure this action only runs once ever
    if (empty($completed_date)) {
        // Save the completed date
        $payment->completed_date = current_time('mysql');
        $payment->save();
        /**
         * Fires after a donation successfully complete.
         *
         * @since 1.6
         *
         * @param int $payment_id The ID of the payment.
         */
        do_action('give_complete_purchase', $payment_id);
    }
}
Exemplo n.º 2
0
/**
 * Complete a purchase
 *
 * Performs all necessary actions to complete a purchase.
 * Triggered by the give_update_payment_status() function.
 *
 * @since 1.0
 *
 * @param int    $payment_id the ID number of the payment
 * @param string $new_status the status of the payment, probably "publish"
 * @param string $old_status the status of the payment prior to being marked as "complete", probably "pending"
 *
 * @return void
 */
function give_complete_purchase($payment_id, $new_status, $old_status)
{
    if ($old_status == 'publish' || $old_status == 'complete') {
        return;
    }
    // Make sure that payments are only completed once
    // Make sure the payment completion is only processed when new status is complete
    if ($new_status != 'publish' && $new_status != 'complete') {
        return;
    }
    $payment_meta = give_get_payment_meta($payment_id);
    $creation_date = get_post_field('post_date', $payment_id, 'raw');
    $completed_date = give_get_payment_completed_date($payment_id);
    $user_info = give_get_payment_meta_user_info($payment_id);
    $donor_id = give_get_payment_customer_id($payment_id);
    $amount = give_get_payment_amount($payment_id);
    do_action('give_pre_complete_purchase', $payment_id);
    $price_id = isset($_POST['give-price-id']) ? (int) $_POST['give-price-id'] : false;
    // Ensure these actions only run once, ever
    if (empty($completed_date)) {
        if (!give_is_test_mode() || apply_filters('give_log_test_payment_stats', false)) {
            give_record_sale_in_log($payment_meta['form_id'], $payment_id, $price_id, $creation_date);
            give_increase_purchase_count($payment_meta['form_id']);
            give_increase_earnings($payment_meta['form_id'], $amount);
        }
        do_action('give_complete_form_donation', $payment_meta['form_id'], $payment_id, $payment_meta);
    }
    // Clear the total earnings cache
    delete_transient('give_earnings_total');
    // Clear the This Month earnings (this_monththis_month is NOT a typo)
    delete_transient(md5('give_earnings_this_monththis_month'));
    delete_transient(md5('give_earnings_todaytoday'));
    // Increase the donor's purchase stats
    Give()->customers->increment_stats($donor_id, $amount);
    give_increase_total_earnings($amount);
    // Ensure this action only runs once ever
    if (empty($completed_date)) {
        // Save the completed date
        give_update_payment_meta($payment_id, '_give_completed_date', current_time('mysql'));
        do_action('give_complete_purchase', $payment_id);
    }
}
Exemplo n.º 3
0
 /**
  * Save
  *
  * Once items have been set, an update is needed to save them to the database.
  *
  * @access public
  *
  * @return bool  True of the save occurred, false if it failed or wasn't needed
  */
 public function save()
 {
     $saved = false;
     //Must have an ID
     if (empty($this->ID)) {
         $payment_id = $this->insert_payment();
         if (false === $payment_id) {
             $saved = false;
         } else {
             $this->ID = $payment_id;
         }
     }
     //Set ID if not matching
     if ($this->ID !== $this->_ID) {
         $this->ID = $this->_ID;
     }
     // If we have something pending, let's save it
     if (!empty($this->pending)) {
         $total_increase = 0;
         $total_decrease = 0;
         foreach ($this->pending as $key => $value) {
             switch ($key) {
                 case 'donations':
                     // Update totals for pending donations
                     foreach ($this->pending[$key] as $item) {
                         $quantity = isset($item['quantity']) ? $item['quantity'] : 1;
                         $price_id = isset($item['price_id']) ? $item['price_id'] : 0;
                         switch ($item['action']) {
                             case 'add':
                                 $price = $item['price'];
                                 if ('publish' === $this->status || 'complete' === $this->status) {
                                     // Add sales logs
                                     $log_date = date_i18n('Y-m-d G:i:s', current_time('timestamp'));
                                     $y = 0;
                                     while ($y < $quantity) {
                                         give_record_sale_in_log($item['id'], $this->ID, $price_id, $log_date);
                                         $y++;
                                     }
                                     $form = new Give_Donate_Form($item['id']);
                                     $form->increase_sales($quantity);
                                     $form->increase_earnings($price);
                                     $total_increase += $price;
                                 }
                                 break;
                             case 'remove':
                                 $log_args = array('post_type' => 'give_log', 'post_parent' => $item['id'], 'numberposts' => $quantity, 'meta_query' => array(array('key' => '_give_log_payment_id', 'value' => $this->ID, 'compare' => '='), array('key' => '_give_log_price_id', 'value' => $price_id, 'compare' => '=')));
                                 $found_logs = get_posts($log_args);
                                 foreach ($found_logs as $log) {
                                     wp_delete_post($log->ID, true);
                                 }
                                 if ('publish' === $this->status || 'complete' === $this->status) {
                                     $form = new Give_Donate_Form($item['id']);
                                     $form->decrease_sales($quantity);
                                     $form->decrease_earnings($item['amount']);
                                     $total_decrease += $item['amount'];
                                 }
                                 break;
                         }
                     }
                     break;
                 case 'fees':
                     if ('publish' !== $this->status && 'complete' !== $this->status) {
                         break;
                     }
                     if (empty($this->pending[$key])) {
                         break;
                     }
                     foreach ($this->pending[$key] as $fee) {
                         switch ($fee['action']) {
                             case 'add':
                                 $total_increase += $fee['amount'];
                                 break;
                             case 'remove':
                                 $total_decrease += $fee['amount'];
                                 break;
                         }
                     }
                     break;
                 case 'status':
                     $this->update_status($this->status);
                     break;
                 case 'gateway':
                     $this->update_meta('_give_payment_gateway', $this->gateway);
                     break;
                 case 'mode':
                     $this->update_meta('_give_payment_mode', $this->mode);
                     break;
                 case 'transaction_id':
                     $this->update_meta('_give_payment_transaction_id', $this->transaction_id);
                     break;
                 case 'ip':
                     $this->update_meta('_give_payment_user_ip', $this->ip);
                     break;
                 case 'customer_id':
                     $this->update_meta('_give_payment_customer_id', $this->customer_id);
                     break;
                 case 'user_id':
                     $this->update_meta('_give_payment_user_id', $this->user_id);
                     break;
                 case 'form_title':
                     $this->update_meta('_give_payment_form_title', $this->form_title);
                     break;
                 case 'form_id':
                     $this->update_meta('_give_payment_form_id', $this->form_id);
                     break;
                 case 'price_id':
                     $this->update_meta('_give_payment_price_id', $this->price_id);
                     break;
                 case 'first_name':
                     $this->user_info['first_name'] = $this->first_name;
                     break;
                 case 'last_name':
                     $this->user_info['last_name'] = $this->last_name;
                     break;
                 case 'address':
                     $this->user_info['address'] = $this->address;
                     break;
                 case 'email':
                     $this->update_meta('_give_payment_user_email', $this->email);
                     break;
                 case 'key':
                     $this->update_meta('_give_payment_purchase_key', $this->key);
                     break;
                 case 'number':
                     $this->update_meta('_give_payment_number', $this->number);
                     break;
                 case 'date':
                     $args = array('ID' => $this->ID, 'post_date' => $this->date, 'edit_date' => true);
                     wp_update_post($args);
                     break;
                 case 'completed_date':
                     $this->update_meta('_give_completed_date', $this->completed_date);
                     break;
                 case 'parent_payment':
                     $args = array('ID' => $this->ID, 'post_parent' => $this->parent_payment);
                     wp_update_post($args);
                     break;
                 default:
                     do_action('give_payment_save', $this, $key);
                     break;
             }
         }
         if ('pending' !== $this->status) {
             $customer = new Give_Customer($this->customer_id);
             $total_change = $total_increase - $total_decrease;
             if ($total_change < 0) {
                 $total_change = -$total_change;
                 // Decrease the customer's purchase stats
                 $customer->decrease_value($total_change);
                 give_decrease_total_earnings($total_change);
             } else {
                 if ($total_change > 0) {
                     // Increase the customer's purchase stats
                     $customer->increase_value($total_change);
                     give_increase_total_earnings($total_change);
                 }
             }
         }
         $this->update_meta('_give_payment_total', $this->total);
         $new_meta = array('form_title' => $this->form_title, 'form_id' => $this->form_id, 'price_id' => $this->price_id, 'fees' => $this->fees, 'currency' => $this->currency, 'user_info' => $this->user_info);
         $meta = $this->get_meta();
         $merged_meta = array_merge($meta, $new_meta);
         // Only save the payment meta if it's changed
         if (md5(serialize($meta)) !== md5(serialize($merged_meta))) {
             $updated = $this->update_meta('_give_payment_meta', $merged_meta);
             if (false !== $updated) {
                 $saved = true;
             }
         }
         $this->pending = array();
         $saved = true;
     }
     if (true === $saved) {
         $this->setup_payment($this->ID);
     }
     return $saved;
 }