/**
  * Process a payment
  */
 public function process_payment($order_id)
 {
     $order = wc_get_order($order_id);
     if (!is_user_logged_in()) {
         wc_add_notice(__('Payment error:', 'custom-points-product') . ' ' . __('You must be logged in to use this payment method', 'custom-points-product'), 'error');
         return;
     }
     $user_id = $order->get_user_id();
     $available_points = WC_Points_Rewards_Manager::get_users_points($user_id);
     $total_points = Custom_Points_Order::get_order_points_cost_total($order);
     if ($available_points < $total_points) {
         wc_add_notice(__('Payment error:', 'custom-points-product') . ' ' . __('Insufficient points in your account.', 'custom-points-product'), 'error');
         return;
     }
     // deduct points from account
     WC_Points_Rewards_Manager::decrease_points($user_id, $total_points, 'custom-points-gateway');
     $order->set_total(0);
     // Payment complete
     $order->payment_complete();
     // Remove cart
     WC()->cart->empty_cart();
     // Return thankyou redirect
     return array('result' => 'success', 'redirect' => $this->get_return_url($order));
 }
 /**
  * Handle an order that is cancelled or refunded by:
  *
  * 1) Removing any points earned for the order
  *
  * 2) Crediting points redeemed for a discount back to the customer's account if the order that they redeemed the points
  * for a discount on is cancelled or refunded
  *
  * @since 1.0
  * @param int $order_id the WC_Order ID
  */
 public function handle_cancelled_refunded_order($order_id)
 {
     global $wc_points_rewards;
     $order = new WC_Order($order_id);
     // bail for guest user
     if (!$order->user_id) {
         return;
     }
     // handle removing any points earned for the order
     $points_earned = get_post_meta($order->id, '_wc_points_earned', true);
     if ($points_earned > 0) {
         // remove points
         WC_Points_Rewards_Manager::decrease_points($order->user_id, $points_earned, 'order-cancelled', null, $order->id);
         // remove points from order
         delete_post_meta($order->id, '_wc_points_earned');
         // add order note
         $order->add_order_note(sprintf(__('%d %s removed.', 'wc_points_rewards'), $points_earned, $wc_points_rewards->get_points_label($points_earned)));
     }
     // handle crediting points redeemed for a discount
     $points_redeemed = get_post_meta($order->id, '_wc_points_redeemed', true);
     if ($points_redeemed > 0) {
         // credit points
         WC_Points_Rewards_Manager::increase_points($order->user_id, $points_redeemed, 'order-cancelled', null, $order->id);
         // remove points from order
         delete_post_meta($order->id, '_wc_points_redeemed');
         // add order note
         $order->add_order_note(sprintf(__('%d %s credited back to customer.', 'wc_points_rewards'), $points_redeemed, $wc_points_rewards->get_points_label($points_redeemed)));
     }
 }