Exemplo n.º 1
0
    /**
     * Save subscription custom fields from edit page
     * 
     * @access public
     * @param int $post_id
     * @param object $post
     * @return void
     */
    public function save_subscription_meta_box($post_id, $post)
    {
        // Check if required properties were passed in
        if (empty($post_id) || empty($post)) {
            return;
        }

        // Make sure user has permissions to edit this post
        if (!current_user_can('edit_post', $post_id)) {
            return;
        }

        // Make sure the correct post ID was passed from form
        if (empty($_POST['post_ID']) || $_POST['post_ID'] != $post_id) {
            return;
        }

        // Make sure it is not a draft save action
        if (defined('DOING_AUTOSAVE') || is_int(wp_is_post_autosave($post)) || is_int(wp_is_post_revision($post))) {
            return;
        }

        // Proceed only if post type is subscription
        if ($post->post_type != 'subscription') {
            return;
        }

        $subscription = $this->load_from_cache('subscriptions', $post_id);

        if (!$subscription) {
            return;
        }

        // Actions
        if (!empty($_POST['subscriptio_subscription_button']) && $_POST['subscriptio_subscription_button'] == 'actions' && !empty($_POST['subscriptio_subscription_actions'])) {
            switch ($_POST['subscriptio_subscription_actions']) {

                // Cancel
                case 'cancel':

                    if ($subscription->can_be_cancelled()) {

                        // Write transaction
                        $transaction = new Subscriptio_Transaction(null, 'manual_cancellation');
                        $transaction->add_subscription_id($subscription->id);
                        $transaction->add_product_id($subscription->product_id);
                        $transaction->add_variation_id($subscription->variation_id);

                        try {
                            // Cancel subscription
                            $subscription->cancel();

                            // Update transaction
                            $transaction->update_result('success');
                            $transaction->update_note(__('Subscription cancelled manually by administrator.', 'subscriptio'), true);
                        }
                        catch (Exception $e) {
                            $transaction->update_result('error');
                            $transaction->update_note($e->getMessage());
                        }

                    }

                    break;

                // Pause
                case 'pause':

                    // Make sure that subscription can be paused
                    if ($subscription->can_be_paused()) {

                        // Write transaction
                        $transaction = new Subscriptio_Transaction(null, 'subscription_pause');
                        $transaction->add_subscription_id($subscription->id);
                        $transaction->add_product_id($subscription->product_id);
                        $transaction->add_variation_id($subscription->variation_id);

                        try {
                            // Pause subscription
                            $subscription->pause();

                            // Update transaction
                            $transaction->update_result('success');
                            $transaction->update_note(__('Subscription paused by administrator.', 'subscriptio'), true);
                        }
                        catch (Exception $e) {
                            $transaction->update_result('error');
                            $transaction->update_note($e->getMessage());
                        }
                    }

                    break;

                // Resume
                case 'resume':

                    // Make sure that subscription can be resumed (was paused)
                    if ($subscription->can_be_resumed()) {

                        // Write transaction
                        $transaction = new Subscriptio_Transaction(null, 'subscription_resume');
                        $transaction->add_subscription_id($subscription->id);
                        $transaction->add_product_id($subscription->product_id);
                        $transaction->add_variation_id($subscription->variation_id);

                        try {
                            // Resume subscription
                            $subscription->resume();

                            // Update transaction
                            $transaction->update_result('success');
                            $transaction->update_note(__('Subscription resumed by administrator.', 'subscriptio'), true);
                        }
                        catch (Exception $e) {
                            $transaction->update_result('error');
                            $transaction->update_note($e->getMessage());
                        }
                    }

                    break;

                default:
                    break;
            }
        }

        // Address update
        else if (!empty($_POST['subscriptio_subscription_button']) && $_POST['subscriptio_subscription_button'] == 'address') {
            $subscription->update_shipping_address($_POST);
        }
    }
    /**
     * Cancel pending subscriptions when orders are cancelled
     * 
     * @access public
     * @param int $order_id
     * @return void
     */
    public function order_cancelled($order_id)
    {
        // Iterate over subscriptions and cancel if they are still pending
        foreach (self::get_subscriptions_from_order_id($order_id) as $subscription) {
            if ($subscription->status == 'pending') {

                // Write transaction
                $transaction = new Subscriptio_Transaction(null, 'order_cancellation');
                $transaction->add_subscription_id($subscription->id);
                $transaction->add_order_id($order_id);
                $transaction->add_product_id($subscription->product_id);
                $transaction->add_variation_id($subscription->variation_id);

                try {
                    // Cancel subscription
                    $subscription->cancel();

                    // Update transaction
                    $transaction->update_result('success');
                    $transaction->update_note(__('Pending subscription cancelled due to cancelled order.', 'subscriptio'), true);
                }
                catch (Exception $e) {
                    $transaction->update_result('error');
                    $transaction->update_note($e->getMessage());
                }
            }
        }
    }
    /**
     * Update shipping address
     * 
     * @access public
     * @param array $address
     * @param bool $is_frontend
     * @param bool $is_customer
     * @return bool
     */
    public function update_shipping_address($address, $is_frontend = false, $is_customer = false)
    {
        $fields = array(
            'shipping_first_name',
            'shipping_last_name',
            'shipping_company',
            'shipping_address_1',
            'shipping_address_2',
            'shipping_city',
            'shipping_state',
            'shipping_postcode',
            'shipping_country',
        );

        $shipping_address = array();

        foreach ($fields as $field) {
            if ($is_frontend) {
                $shipping_address['_' . $field] = isset($address[$field]) ? $address[$field] : '';
            }
            else {
                $shipping_address['_' . $field] = isset($address['_' . $field]) ? $address['_' . $field] : '';
            }
        }

        // Check if address has changed
        if (array_diff($this->shipping_address, $shipping_address) || array_diff($shipping_address, $this->shipping_address)) {

            // Write transaction
            $transaction = new Subscriptio_Transaction(null, 'address_changed');
            $transaction->add_subscription_id($this->id);
            $transaction->add_product_id($this->product_id);
            $transaction->add_variation_id($this->variation_id);

            try {

                // Save fields
                $this->update_subscription_details(array('shipping_address' => $shipping_address));

                // Update transaction
                $transaction->update_result('success');

                if ($is_customer) {
                    $transaction->update_note(__('Shipping address changed by customer.', 'subscriptio'), true);
                }
                else {
                    $transaction->update_note(__('Shipping address changed by administrator.', 'subscriptio'), true);
                }

                return true;
            } catch (Exception $e) {
                $transaction->update_result('error');
                $transaction->update_note($e->getMessage());
                return false;
            }
        }

        return true;
    }