/**
  * Disables the gateway under any of these conditions:
  * 1) If the cart does not contain a pre-order
  * 2) If the pre-order amount is charged upfront
  * 3) On the pay page
  *
  * @since 1.0
  * @return bool
  */
 public function is_available()
 {
     $is_available = true;
     // Backwards compatibility checking for payment page
     if (function_exists('is_checkout_pay_page')) {
         $pay_page = is_checkout_pay_page();
     } else {
         $pay_page = is_page(woocommerce_get_page_id('pay'));
     }
     // on checkout page
     if (!$pay_page || defined('WOOCOMMERCE_CHECKOUT') && WOOCOMMERCE_CHECKOUT) {
         // not available if the cart does not contain a pre-order
         if (WC_Pre_Orders_Cart::cart_contains_pre_order()) {
             // not available when the pre-order amount is charged upfront
             if (WC_Pre_Orders_Product::product_is_charged_upfront(WC_Pre_Orders_Cart::get_pre_order_product())) {
                 $is_available = false;
             }
         } else {
             $is_available = false;
         }
     } else {
         // not available on the pay page (for now)
         $is_available = false;
     }
     return $is_available;
 }
 /**
  * Force tokenization for pre-orders
  *
  * @since 4.1.0
  * @see SV_WC_Payment_Gateway::tokenization_forced()
  * @param boolean $force_tokenization whether tokenization should be forced
  * @return boolean true if tokenization should be forced, false otherwise
  */
 public function maybe_force_tokenization($force_tokenization)
 {
     // pay page with pre-order?
     $pay_page_pre_order = false;
     if ($this->get_gateway()->is_pay_page_gateway()) {
         $order_id = $this->get_gateway()->get_checkout_pay_page_order_id();
         if ($order_id) {
             $pay_page_pre_order = WC_Pre_Orders_Order::order_contains_pre_order($order_id) && WC_Pre_Orders_Product::product_is_charged_upon_release(WC_Pre_Orders_Order::get_pre_order_product($order_id));
         }
     }
     if (WC_Pre_Orders_Cart::cart_contains_pre_order() && WC_Pre_Orders_Product::product_is_charged_upon_release(WC_Pre_Orders_Cart::get_pre_order_product()) || $pay_page_pre_order) {
         // always tokenize the card for pre-orders that are charged upon release
         $force_tokenization = true;
     }
     return $force_tokenization;
 }
 /**
  * Disables the gateway under any of these conditions:
  * 1) If the cart does not contain a pre-order
  * 2) If the pre-order amount is charged upfront
  * 3) On the pay page
  *
  * @since 1.0
  * @return bool
  */
 public function is_available()
 {
     $is_available = parent::is_available();
     // on checkout page
     if (!is_page(woocommerce_get_page_id('pay')) || defined('WOOCOMMERCE_CHECKOUT') && WOOCOMMERCE_CHECKOUT) {
         // not available if the cart does not contain a pre-order
         if (WC_Pre_Orders_Cart::cart_contains_pre_order()) {
             // not available when the pre-order amount is charged upfront
             if (WC_Pre_Orders_Product::product_is_charged_upfront(WC_Pre_Orders_Cart::get_pre_order_product())) {
                 $is_available = false;
             }
         } else {
             $is_available = false;
         }
     } else {
         // not available on the pay page (for now)
         $is_available = false;
     }
     return $is_available;
 }
 /**
  * Add order meta needed for pre-order functionality
  *
  * @since 1.0
  * @param int $order_id
  */
 public function add_order_meta($order_id)
 {
     // don't add meta to orders that don't contain a pre-order
     // note the cart is checked here instead of the order since WC_Pre_Orders_Order::order_contains_pre_order() checks the meta that is about to be set here :)
     if (!WC_Pre_Orders_Cart::cart_contains_pre_order()) {
         return;
     }
     // get pre-ordered product
     $product = WC_Pre_Orders_Cart::get_pre_order_product($order_id);
     // indicate the order contains a pre-order
     update_post_meta($order_id, '_wc_pre_orders_is_pre_order', 1);
     // save when the pre-order amount was charged (either upfront or upon release)
     update_post_meta($order_id, '_wc_pre_orders_when_charged', $product->wc_pre_orders_when_to_charge);
 }