/**
     * Check if current frontend user owns subscription and return it
     * 
     * @access public
     * @param int $subscription_id
     * @return object|bool
     */
    public static function get_subscription($subscription_id)
    {
        $user_id = get_current_user_id();
        $subscription = Subscriptio_Subscription::get_by_id($subscription_id);

        if (!$user_id || !$subscription || $subscription->user_id != $user_id) {
            echo '<div class="woocommerce-error">' . __('Invalid subscription.', 'subscriptio') . ' <a href="' . get_permalink(wc_get_page_id('myaccount')).'" class="wc-forward">'. __('My Account', 'subscriptio') .'</a>' . '</div>';
            return false;
        }

        return $subscription;
    }
    /**
     * Save membership IDs
     * 
     * @access public
     * @param array $ids
     * @return void
     */
    public function save_membership_ids($order_item_id, $ids)
    {
        // Load subscription by Order Item ID
        $query = new WP_Query(array(
            'post_type'         => 'subscription',
            'post_status'       => array('publish', 'pending', 'draft', 'auto-draft', 'future', 'private', 'inherit', 'trash'),
            'posts_per_page'    => -1,
            'fields'            => 'ids',
            'meta_query'        => array(
                array(
                    'key'       => 'order_item_id',
                    'value'     => $order_item_id,
                    'compare'   => '=',
                ),
            ),
        ));

        // Iterate over found subscriptions
        foreach ($query->posts as $subscription_id) {
            $subscription = Subscriptio_Subscription::get_by_id($subscription_id);

            // Subscription looks ok?
            if (is_object($subscription) && isset($subscription->status) && empty($subscription->membership_ids)) {
                if (is_array($ids) && !empty($ids)) {
                    foreach ($ids as $id) {
                        $subscription->update_subscription_details(array('membership_ids' => $id));
                    }
                }
            }
        }
    }
Beispiel #3
0
                    <?php echo $user_phone; ?>
                </p>
            <?php endif; ?>

            <?php if (is_array($subscription->shipping_address) && !empty($subscription->shipping_address)): ?>
                <p class="subscriptio_admin_address_paragaph">
                    <strong><?php _e('Shipping Address:', 'subscriptio'); ?>
                        <?php if (!$subscription->is_inactive()): ?>
                            &nbsp;&nbsp;<a id="subscriptio_admin_edit_address" href="#"><?php _e('[edit]', 'subscriptio'); ?></a>
                        <?php endif; ?>
                    </strong>
                    <span class="subscriptio_admin_address"><?php echo wp_kses(Subscriptio::get_formatted_shipping_address($subscription->shipping_address), array('br' => array())); ?></span>
                </p>
                <?php if (!$subscription->is_inactive()): ?>
                    <div class="subscriptio_admin_address_fields">
                        <?php foreach (Subscriptio_Subscription::get_admin_shipping_fields() as $key => $field): ?>
                            <?php if ($field['type'] == 'select'): ?>
                                <?php woocommerce_wp_select(array('id' => $key, 'value' => $subscription->shipping_address[$key], 'label' => $field['title'], 'options' => $field['values'])); ?>
                            <?php else: ?>
                                <?php woocommerce_wp_text_input(array('id' => $key, 'value' => $subscription->shipping_address[$key], 'label' => $field['title'])); ?>
                            <?php endif; ?>
                        <?php endforeach; ?>
                        <div class="subscriptio_admin_address_save">
                            <button type="submit" class="button subscriptio_save_address" name="subscriptio_subscription_button" value="address" title="<?php _e('Save Address', 'subscriptio'); ?>"><?php _e('Save Address', 'subscriptio'); ?></button>
                            <button class="button" id="subscriptio_cancel_address_edit" title="<?php _e('Cancel', 'subscriptio'); ?>"><?php _e('Cancel', 'subscriptio'); ?></button>
                        </div>
                    </div>
                <?php endif; ?>
            <?php endif; ?>

        </div>
Beispiel #4
0
                <th class="subscriptio_list_status"><?php _e('Status', 'subscriptio'); ?></th>
                <th class="subscriptio_list_product"><?php _e('Product', 'subscriptio'); ?></th>
                <th class="subscriptio_list_recurring"><?php _e('Recurring', 'subscriptio'); ?></th>
                <th class="subscriptio_list_actions">&nbsp;</th>
            </tr>
        </thead>

        <tbody>

        <?php foreach ($subscriptions as $subscription): ?>

            <tr class="subscriptio_subscription_list_subscription">
                <td class="subscriptio_list_id"><?php echo '<a href="' . $subscription->get_frontend_link('view-subscription') . '">' . $subscription->get_subscription_number() . '</a>'; ?></td>
                <td class="subscriptio_list_status"><?php echo $subscription->get_formatted_status(true); ?></td>
                <td class="subscriptio_list_product">
                    <?php foreach (Subscriptio_Subscription::get_subscription_items($subscription->id) as $item): ?>
                        <?php if (!$item['deleted']): ?>
                            <?php Subscriptio::print_frontend_link_to_post($item['product_id'], $item['name'], '', ($item['quantity'] > 1 ? 'x ' . $item['quantity'] : '')); ?>
                        <?php else: ?>
                            <?php echo $item['name']; ?>
                        <?php endif; ?>
                    <?php endforeach; ?>
                </td>
                <td class="subscriptio_list_recurring"><?php echo $subscription->get_formatted_recurring_amount(); ?></td>
                <td class="subscriptio_list_actions">
                    <?php foreach ($subscription->get_frontend_actions() as $action_key => $action): ?>
                        <a href="<?php echo $action['url']; ?>" class="button subscriptio_button_<?php echo sanitize_html_class($action_key); ?>"><?php echo $action['title']; ?></a>
                    <?php endforeach; ?>
                </td>
            </tr>
    /**
     * Scheduled reminder event handler
     * 
     * @access public
     * @param int $subscription_id
     * @return void
     */
    public static function scheduled_reminder($subscription_id)
    {
        // Start transaction
        $transaction = new Subscriptio_Transaction(null, 'payment_reminder');

        // Get subscription
        $subscription = Subscriptio_Subscription::get_valid_subscription($subscription_id, $transaction);

        if ($subscription) {

            // Send reminder
            try {
                Subscriptio_Mailer::send('payment_reminder', $subscription);
                $transaction->update_result('success');
                $transaction->update_note(__('Payment reminder sent.', 'subscriptio'), true);
            } catch (Exception $e) {
                $transaction->update_result('error');
                $transaction->update_note($e->getMessage(), true);
            }
        }
    }
    /**
     * Get related Subscriptions from Order ID
     * 
     * @access public
     * @param int $order_id
     * @return array
     */
    public static function get_subscriptions_from_order_id($order_id)
    {
        $subscriptions = array();

        // Search for related subscription post ids
        $subscription_post_ids = get_posts(array(
            'posts_per_page'    => -1,
            'post_type'         => 'subscription',
            'meta_query'        => array(
                array(
                    'key'       => 'all_order_ids',
                    'value'     => $order_id,
                    'compare'   => '=',
                ),
            ),
            'fields'            => 'ids',
        ));

        // Iterate over ids and create objects
        foreach ($subscription_post_ids as $id) {
            if ($subscription = Subscriptio_Subscription::get_by_id($id)) {
                $subscriptions[$id] = $subscription;
            }
        }

        return $subscriptions;
    }
Beispiel #7
0
    /**
     * Maybe change WooCommerce My Orders query
     * 
     * @access public
     * @param array $params
     * @return array
     */
    public function woocommerce_my_orders_query($params)
    {
        if (defined('SUBSCRIPTIO_PRINTING_RELATED_ORDERS')) {
            $subscription = Subscriptio_Subscription::get_by_id(SUBSCRIPTIO_PRINTING_RELATED_ORDERS);

            if ($subscription) {
                $params['post__in'] = $subscription->all_order_ids;
            }
        }

        return $params;
    }
    /**
     * Check if variation or grouped product prices are all equal and return cheapest price
     * 
     * @access public
     * @param object $product
     * @return array
     */
    public static function get_cheapest_child_price($product)
    {
        $ids = array();

        // Grouped product?
        if ($product->product_type == 'grouped') {
            $children = get_children(array(
                'post_parent' => $product->id,
                'post_type' => 'product',
            ));

            foreach ($children as $child) {
                $ids[] = $child->ID;
            }
        }

        // Variable product
        else {
            $variations = $product->get_available_variations();

            foreach ($variations as $variation) {
                $ids[] = $variation['variation_id'];
            }
        }

        if (empty($ids)) {
            return array(0, true);
        }

        $selected_id = null;
        $cheapest = null;
        $equal = true;

        foreach ($ids as $id) {

            // We skip non-subscription variations as there is no easy way to compare recurring payments with one-off payments
            if (!self::is_subscription($id)) {
                $equal = false;
                continue;
            }

            $child_product = new WC_Product($id);
            $child_meta = Subscriptio::unwrap_post_meta(get_post_meta($id));

            $child_days = Subscriptio_Subscription::get_period_length_in('day', $child_meta['_subscriptio_price_time_unit'], $child_meta['_subscriptio_price_time_value']);
            $price_per_day = $child_days == 0 ? 0 : $child_product->get_price() / $child_days;

            if ($cheapest === null) {
                $selected_id = $id;
                $cheapest = $price_per_day;
            }
            else if ($price_per_day < $cheapest) {
                $selected_id = $id;
                $cheapest = $price_per_day;
                $equal = false;
            }
        }

        return array($selected_id, $equal);
    }