/**
  * Bundled cart items inherit the subscription schemes of their parent if:
  *  - parent is statically priced, or
  *  - parent has subscription schemes defined at product-level.
  *
  * @param  array  $schemes
  * @param  array  $cart_item
  * @param  string $scope
  * @return array
  */
 public static function get_bundled_item_schemes($schemes, $cart_item, $scope)
 {
     foreach (self::$container_key_names as $container_key_name) {
         if (!empty($cart_item[$container_key_name])) {
             $container_key = $cart_item[$container_key_name];
             if (isset(WC()->cart->cart_contents[$container_key])) {
                 $container_cart_item = WC()->cart->cart_contents[$container_key];
                 if (self::overrides_child_schemes($container_cart_item)) {
                     $schemes = WCS_ATT_Schemes::get_subscription_schemes($container_cart_item, $scope);
                 }
             }
         }
     }
     return $schemes;
 }
 /**
  * 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;
 }
 /**
  * Bundled cart items inherit the subscription schemes of their parent if:
  *  - parent is statically priced, or
  *  - parent has subscription schemes defined at product-level.
  *
  * @param  array  $schemes
  * @param  array  $cart_item
  * @param  string $scope
  * @return array
  */
 public static function get_bundled_item_schemes($schemes, $cart_item, $scope)
 {
     $container_key = self::has_bundle_type_container($cart_item);
     if (false !== $container_key) {
         if (isset(WC()->cart->cart_contents[$container_key])) {
             $container_cart_item = WC()->cart->cart_contents[$container_key];
             if (self::overrides_child_schemes($container_cart_item)) {
                 $schemes = WCS_ATT_Schemes::get_subscription_schemes($container_cart_item, $scope);
                 foreach ($schemes as $scheme) {
                     if (WCS_ATT_Scheme_Prices::has_subscription_price_override($scheme) && $scheme['subscription_pricing_method'] === 'override') {
                         $scheme['subscription_pricing_method'] = 'inherit';
                         $scheme['subscription_discount'] = '';
                     }
                 }
             }
         }
     }
     return $schemes;
 }
 /**
  * Displays cart item options for purchasing a product once or creating a subscription from it.
  *
  * @param  string $subtotal
  * @param  array  $cart_item
  * @param  string $cart_item_key
  * @return string
  */
 public static function convert_to_sub_options($subtotal, $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 $subtotal;
     }
     if (!$show_convert_to_sub_options) {
         return $subtotal;
     }
     // 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;
         }
     }
     $options = array();
     $active_subscription_scheme_id = WCS_ATT_Schemes::get_active_subscription_scheme_id($cart_item);
     if ($allow_one_time_option) {
         $options[] = array('id' => '0', 'description' => __('only this time', WCS_ATT::TEXT_DOMAIN), 'selected' => $active_subscription_scheme_id === '0');
     }
     foreach ($subscription_schemes as $subscription_scheme) {
         $subscription_scheme_id = $subscription_scheme['id'];
         if ($cart_item['data']->is_converted_to_sub === 'yes' && $subscription_scheme_id === $active_subscription_scheme_id) {
             // if the cart item is converted to a sub, create the subscription price suffix using the already-populated subscription properties
             $sub_suffix = WC_Subscriptions_Product::get_price_string($cart_item['data'], array('subscription_price' => false));
         } else {
             // if the cart item has not been converted to a sub, populate the product with the subscription properties, generate the suffix and reset
             $_cloned = clone $cart_item['data'];
             $_cloned->is_converted_to_sub = 'yes';
             $_cloned->subscription_period = $subscription_scheme['subscription_period'];
             $_cloned->subscription_period_interval = $subscription_scheme['subscription_period_interval'];
             $_cloned->subscription_length = $subscription_scheme['subscription_length'];
             $sub_suffix = WC_Subscriptions_Product::get_price_string($_cloned, array('subscription_price' => false));
         }
         $options[] = array('id' => $subscription_scheme_id, 'description' => $sub_suffix, '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 $subtotal;
     }
     // Grab subtotal without Subs formatting
     remove_filter('woocommerce_cart_product_subtotal', 'WC_Subscriptions_Cart' . '::get_formatted_product_subtotal', 11, 4);
     remove_filter('woocommerce_cart_item_subtotal', __CLASS__ . '::convert_to_sub_options', 1000, 3);
     $subtotal = apply_filters('woocommerce_cart_item_subtotal', WC()->cart->get_product_subtotal($cart_item['data'], $cart_item['quantity']), $cart_item, $cart_item_key);
     add_filter('woocommerce_cart_item_subtotal', __CLASS__ . '::convert_to_sub_options', 1000, 3);
     add_filter('woocommerce_cart_product_subtotal', 'WC_Subscriptions_Cart' . '::get_formatted_product_subtotal', 11, 4);
     ob_start();
     wc_get_template('cart-item-options.php', array('options' => $options, 'cart_item_key' => $cart_item_key), false, WCS_ATT()->plugin_path() . '/templates/');
     $convert_to_sub_options = ob_get_clean();
     $subtotal = $subtotal . $convert_to_sub_options;
     return $subtotal;
 }