/**
  * Returns subscription schemes for cart-level options.
  * Cart-level options will be displayed only if no cart-item is found with its own product-level subscription scheme.
  * This means that subscription options defined at product-level and "legacy" subscription-type products will "block" the display of cart-level options.
  *
  * In this case, cart-level options will be displayed at cart-item level.
  *
  * Must be called after all cart session data has been loaded.
  *
  * @return array|boolean
  */
 public static function get_cart_subscription_schemes()
 {
     $wcs_prefix = WC_Subscriptions_Admin::$option_prefix;
     $cart_level_subs_active = get_option($wcs_prefix . '_enable_cart_subscriptions', 'no');
     $cart_level_schemes = array();
     $cart_level_schemes_keys = array();
     if ($cart_level_subs_active === 'yes') {
         $cart_level_schemes = get_option($wcs_prefix . '_subscribe_to_cart_schemes', array());
     }
     if (empty($cart_level_schemes)) {
         return false;
     }
     foreach ($cart_level_schemes as $cart_level_scheme) {
         $cart_level_schemes_keys[] = $cart_level_scheme['id'];
     }
     foreach (WC()->cart->cart_contents as $cart_item) {
         if (!WCS_ATT_Cart::is_supported_product_type($cart_item)) {
             return false;
         }
         if ($cart_item_level_schemes = self::get_subscription_schemes($cart_item, 'cart-item')) {
             return false;
         }
         if (WC_Subscriptions_Product::is_subscription($cart_item['product_id'])) {
             return false;
         }
     }
     return $cart_level_schemes;
 }
     * @param  array  $cart_item
     * @return boolean
     */
    public static function is_convertible_to_sub($cart_item)
    {
        $product_id = $cart_item['product_id'];
        $is_convertible = true;
        if (WC_Subscriptions_Product::is_subscription($product_id)) {
            $is_convertible = false;
        }
        return $is_convertible;
    }
    /**
     * True if the product corresponding to a cart item is one of the types supported by the plugin.
     *
     * @param  array  $cart_item
     * @return boolean
     */
    public static function is_supported_product_type($cart_item)
    {
        $product = $cart_item['data'];
        $product_type = $cart_item['data']->product_type;
        $supported_types = WCS_ATT()->get_supported_product_types();
        if (in_array($product_type, $supported_types)) {
            return true;
        }
        return false;
    }
}
WCS_ATT_Cart::init();
 /**
  * Displays cart item options for purchasing a product once or creating a subscription from it.
  *
  * @param  string $price
  * @param  array  $cart_item
  * @param  string $cart_item_key
  * @return string
  */
 public static function convert_to_sub_cart_item_options($price, $cart_item, $cart_item_key)
 {
     $subscription_schemes = WCS_ATT_Schemes::get_cart_item_subscription_schemes($cart_item);
     $show_convert_to_sub_options = apply_filters('wcsatt_show_cart_item_options', !empty($subscription_schemes), $cart_item, $cart_item_key);
     $is_mini_cart = did_action('woocommerce_before_mini_cart') && !did_action('woocommerce_after_mini_cart');
     // currently show options only in cart
     if (!is_cart() || $is_mini_cart) {
         return $price;
     }
     if (!$show_convert_to_sub_options) {
         return $price;
     }
     // Allow one-time purchase option?
     $allow_one_time_option = true;
     $product_level_schemes = WCS_ATT_Schemes::get_subscription_schemes($cart_item, 'cart-item');
     $has_product_level_schemes = empty($product_level_schemes) ? false : true;
     if ($has_product_level_schemes) {
         $force_subscription = get_post_meta($cart_item['product_id'], '_wcsatt_force_subscription', true);
         if ($force_subscription === 'yes') {
             $allow_one_time_option = false;
         }
     }
     $price_overrides_exist = WCS_ATT_Schemes::subscription_price_overrides_exist($subscription_schemes);
     $reset_product = wc_get_product($cart_item['product_id']);
     $options = array();
     $active_subscription_scheme_id = WCS_ATT_Schemes::get_active_subscription_scheme_id($cart_item);
     if ($allow_one_time_option) {
         if ($price_overrides_exist) {
             if ($active_subscription_scheme_id === '0') {
                 $description = $price;
             } else {
                 $description = WC()->cart->get_product_price($reset_product);
             }
         } else {
             $description = __('only now', WCS_ATT::TEXT_DOMAIN);
         }
         $options[] = array('id' => '0', 'description' => $description, 'selected' => $active_subscription_scheme_id === '0');
     }
     foreach ($subscription_schemes as $subscription_scheme) {
         $subscription_scheme_id = $subscription_scheme['id'];
         if ($price_overrides_exist) {
             if ($active_subscription_scheme_id === $subscription_scheme_id) {
                 $description = $price;
             } else {
                 $converted_product = clone $reset_product;
                 $dummy_cart_item = $cart_item;
                 $dummy_cart_item['data'] = $converted_product;
                 // Apply the subscription scheme id to the dummy cart item.
                 $dummy_cart_item['wccsub_data']['active_subscription_scheme_id'] = $subscription_scheme_id;
                 // Convert the dummy cart item using the applied id.
                 $dummy_cart_item = WCS_ATT_Cart::convert_to_sub($dummy_cart_item);
                 // Get the price of the dummy cart item.
                 $description = WC()->cart->get_product_price($dummy_cart_item['data']);
             }
         } else {
             if ($active_subscription_scheme_id === $subscription_scheme_id) {
                 $description = WC_Subscriptions_Product::get_price_string($cart_item['data'], array('subscription_price' => false));
             } else {
                 $converted_product = clone $reset_product;
                 $dummy_cart_item = $cart_item;
                 $dummy_cart_item['data'] = $converted_product;
                 // Apply the subscription scheme id to the dummy cart item.
                 $dummy_cart_item['wccsub_data']['active_subscription_scheme_id'] = $subscription_scheme_id;
                 // Convert the dummy cart item using the applied id.
                 $dummy_cart_item = WCS_ATT_Cart::convert_to_sub($dummy_cart_item);
                 // Use the dummy cart item to obtain the description.
                 $description = WC_Subscriptions_Product::get_price_string($dummy_cart_item['data'], array('subscription_price' => false));
             }
         }
         $options[] = array('id' => $subscription_scheme_id, 'description' => $description, 'selected' => $active_subscription_scheme_id === $subscription_scheme_id);
     }
     // If there's just one option to display, it means that one-time purchases are not allowed and there's only one sub scheme on offer -- so don't show any options
     if (count($options) === 1) {
         return $price;
     }
     // Grab price without Subs formatting
     remove_filter('woocommerce_cart_product_price', 'WC_Subscriptions_Cart' . '::cart_product_price', 10, 2);
     remove_filter('woocommerce_cart_item_price', __CLASS__ . '::convert_to_sub_cart_item_options', 1000, 3);
     $price = apply_filters('woocommerce_cart_item_price', WC()->cart->get_product_price($cart_item['data']), $cart_item, $cart_item_key);
     add_filter('woocommerce_cart_item_price', __CLASS__ . '::convert_to_sub_cart_item_options', 1000, 3);
     add_filter('woocommerce_cart_product_price', 'WC_Subscriptions_Cart' . '::cart_product_price', 10, 2);
     ob_start();
     $classes = $price_overrides_exist ? array('overrides_exist') : array();
     wc_get_template('cart-item-options.php', array('options' => $options, 'cart_item_key' => $cart_item_key, 'classes' => implode(' ', $classes)), false, WCS_ATT()->plugin_path() . '/templates/');
     $convert_to_sub_options = ob_get_clean();
     if ($price_overrides_exist) {
         $price = $convert_to_sub_options;
     } else {
         $price = $price . $convert_to_sub_options;
     }
     return $price;
 }
 /**
  * Returns subscription schemes for cart-level options.
  * Cart-level options will be displayed only if no cart-item is found with its own product-level subscription scheme.
  * This means that subscription options defined at product-level and "legacy" subscription-type products will "block" the display of cart-level options.
  *
  * In this case, cart-level options will be displayed at cart-item level.
  *
  * Must be called after all cart session data has been loaded.
  *
  * @return array|boolean
  */
 public static function get_cart_subscription_schemes()
 {
     $cart_level_schemes = array();
     $cart_level_schemes_keys = array();
     $cart_level_schemes = get_option('wcsatt_subscribe_to_cart_schemes', array());
     if (empty($cart_level_schemes)) {
         return false;
     }
     foreach ($cart_level_schemes as $cart_level_scheme) {
         $cart_level_schemes_keys[] = $cart_level_scheme['id'];
     }
     foreach (WC()->cart->cart_contents as $cart_item) {
         if (!WCS_ATT_Cart::is_supported_product_type($cart_item)) {
             return false;
         }
         if ($cart_item_level_schemes = self::get_subscription_schemes($cart_item, 'cart-item')) {
             return false;
         }
         if (WC_Subscriptions_Product::is_subscription($cart_item['product_id'])) {
             return false;
         }
     }
     return $cart_level_schemes;
 }