/**
  * Check if membership is also a subscription
  * 
  * @access public
  * @param bool $is_subscription
  * @param int $product_id
  * @param bool 
  */
 public function membership_is_subscription($is_subscription, $product_id)
 {
     return Subscriptio_Subscription_Product::is_subscription($product_id);
 }
    /**
     * Handle new WooCommerce orders
     * 
     * @access public
     * @param int $order_id
     * @param array $posted
     * @return void
     */
    public function new_order_placed($order_id, $posted)
    {
        $order = new WC_Order($order_id);
        $order_items = $order->get_items();
        $order_meta = Subscriptio::unwrap_post_meta(get_post_meta($order->id));

        // Iterate over all items and look for subscription products purchased
        foreach ($order_items as $order_item_key => $order_item) {

            // Get appropriate product and variation IDs
            $variation_id = (isset($order_item['variation_id']) && !empty($order_item['variation_id'])) ? $order_item['variation_id'] : null;
            $product_id = $variation_id ? $order_item['variation_id'] : $order_item['product_id'];
            $product = new WC_Product($product_id);
            $product_post_meta = Subscriptio::unwrap_post_meta(get_post_meta($product_id));

            // Proceed only if this product is a subscription
            if (!isset($product_post_meta['_subscriptio']) || $product_post_meta['_subscriptio'] != 'yes') {
                continue;
            }

            // Start logging transaction
            $transaction = new Subscriptio_Transaction(null, 'new_order', null, $order_id, $order_item['product_id'], $variation_id);

            // Check if this subscription product looks ok
            if (!Subscriptio_Subscription_Product::is_ok($product_post_meta)) {
                $transaction->update_result('error');
                $transaction->update_note(__('Invalid subscription product configuration.', 'subscriptio'));
                continue;
            }

            // Check if we have renewal order properties
            if (!isset($this->renewal_orders['by_line_item_id'][$order_item_key])) {
                $transaction->update_result('error');
                $transaction->update_note(__('Failed saving subscription properties for renewal orders.', 'subscriptio'));
                continue;
            }

            // Everything seems to be ok, lets create a new subscription
            try {
                $subscription = new Subscriptio_Subscription();
                $subscription_id = $subscription->create_from_order_item($order, $order_meta, $order_item_key, $order_item, $product, $product_post_meta, $this->renewal_orders['by_line_item_id'][$order_item_key]);

                $transaction->update_result('success');
                $transaction->add_subscription_id($subscription_id);
                $transaction->update_note(__('Subscription successfully created.', 'subscriptio'));
            }
            catch (Exception $e) {
                $transaction->update_result('error');
                $transaction->update_note($e->getMessage());
            }
        }

        // Reset temporary storage
        $this->renewal_orders = array(
            'by_cart_item_key'  => array(),
            'by_line_item_id'   => array(),
        );
    }
Beispiel #3
0
    /**
     * Check if cart contains subscription product
     * 
     * @access public
     * @return bool
     */
    public static function cart_contains_subscription()
    {
        global $woocommerce;

        if (!empty($woocommerce->cart->cart_contents)) {
            foreach ($woocommerce->cart->cart_contents as $item) {
                if (Subscriptio_Subscription_Product::is_subscription($item['variation_id'] ? $item['variation_id'] : $item['product_id'])) {
                    return true;
                }
            }
        }

        return false;
    }
    /**
     * Change frontent cart item price with Subscription price (cosmetic change)
     * 
     * @access public
     * @param float $price_now
     * @param array $cart_item
     * @param string $cart_item_key
     * @return string
     */
    public function change_cart_item_price_html($price, $cart_item, $cart_item_key)
    {
        $id = !empty($cart_item['variation_id']) ? $cart_item['variation_id'] : $cart_item['product_id'];

        // Check if given item is subscription
        if (Subscriptio_Subscription_Product::is_subscription($id)) {

            // Is subtotal?
            $is_subtotal = current_filter() == 'woocommerce_cart_item_subtotal' ? true : false;

            // Format checkout price html and return
            return Subscriptio_Subscription_Product::get_formatted_subscription_price($id, $is_subtotal, $cart_item['quantity'], $cart_item['data']->price);
        }

        return $price;
    }
 /**
  * Get formatted recurring amount
  * 
  * @access public
  * @return string
  */
 public function get_formatted_recurring_amount()
 {
     return Subscriptio_Subscription_Product::format_recurring_amount($this->renewal_order_total, $this->price_time_unit, $this->price_time_value, $this->renewal_order_currency);
 }
    /**
     * Return formatted subscription price to be displayed on product pages and cart
     * 
     * @access public
     * @param int $id
     * @param bool $is_checkout
     * @param int $quantity
     * @param float $price_now
     * @param bool $is_variable
     * @param bool $variations_equal
     * @return string
     */
    public static function get_formatted_subscription_price($id, $is_checkout = false, $quantity = 1, $price_now = null, $is_variable = false, $variations_equal = false)
    {
        $meta = Subscriptio::unwrap_post_meta(get_post_meta($id));

        $recurring_price = Subscriptio_Subscription_Product::get_recurring_price($id);

        // Check if product is configured properly, if not - revert to standard price display
        if (!isset($meta['_subscriptio_price_time_unit']) || !isset($meta['_subscriptio_price_time_value'])) {
            return Subscriptio::get_formatted_price($recurring_price, get_woocommerce_currency());
        }

        // Cart/checkout page?
        if ($is_checkout) {

            $recurring_price_html = self::format_recurring_amount(($recurring_price * $quantity), $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']);

            // Payable now differs from recurring amount?
            if ($price_now != $recurring_price) {
                $html_now = Subscriptio::get_formatted_price(($price_now * $quantity), get_woocommerce_currency());
                return sprintf(__('%1$s now then %2$s', 'subscriptio'), $html_now, $recurring_price_html);
            }
            else {
                return self::format_recurring_amount(($price_now * $quantity), $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']);
            }
        }

        // Other pages
        else {

            $recurring_price_html = self::format_recurring_amount($recurring_price, $meta['_subscriptio_price_time_unit'], $meta['_subscriptio_price_time_value']);

            // Any signup fee?
            if (!empty($meta['_subscriptio_signup_fee'])) {
                $signup_fee = Subscriptio::get_formatted_price($meta['_subscriptio_signup_fee'], get_woocommerce_currency());
            }

            // Any free trial?
            if (!empty($meta['_subscriptio_free_trial_time_value'])) {
                $time_units = Subscriptio::get_time_units();

                if (isset($time_units[$meta['_subscriptio_free_trial_time_unit']]) && is_numeric($meta['_subscriptio_free_trial_time_value'])) {
                    $free_trial = $meta['_subscriptio_free_trial_time_value'] . ' ' . call_user_func($time_units[$meta['_subscriptio_free_trial_time_unit']]['translation_callback'], $meta['_subscriptio_free_trial_time_unit'], $meta['_subscriptio_free_trial_time_value']);
                }
                else {
                    $free_trial = '';
                }
            }

            // Free trial & Signup fee
            if (!empty($meta['_subscriptio_signup_fee']) && !empty($meta['_subscriptio_free_trial_time_value'])) {
                if ($is_variable && !$variations_equal) {
                    return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html);
                }
                else {
                    return sprintf(__('%1$s with a free trial of %2$s and a sign-up fee of %3$s', 'subscriptio'), $recurring_price_html, $free_trial, $signup_fee);
                }
            }

            // Free trial
            else if (!empty($meta['_subscriptio_free_trial_time_value'])) {
                if ($is_variable && !$variations_equal) {
                    return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html);
                }
                else {
                    return sprintf(__('%1$s with a free trial of %2$s', 'subscriptio'), $recurring_price_html, $free_trial);
                }
            }

            // Signup fee
            else if (!empty($meta['_subscriptio_signup_fee'])) {
                if ($is_variable && !$variations_equal) {
                    return sprintf(__('From %1$s', 'subscriptio'), $recurring_price_html);
                }
                else {
                    return sprintf(__('%1$s with a sign-up fee of %2$s', 'subscriptio'), $recurring_price_html, $signup_fee);
                }
            }

            // Plain recurring price
            else {
                if ($is_variable && !$variations_equal) {
                    return sprintf(__('From %s', 'subscriptio'), $recurring_price_html);
                }
                else {
                    return $recurring_price_html;
                }
            }
        }
    }