public function swap($plan)
    {
        if ($this->onGracePeriod() && $this->braintree_plan === $plan) {
            return $this->resume();
        }

        if (! $this->active()) {
            return $this->owner->newSubscription($this->name, $plan)
                                ->skipTrial()->create();
        }

        $plan = BraintreeService::findPlan($plan);

        if ($this->wouldChangeBillingFrequency($plan) && $this->prorate) {
            return $this->swapAcrossFrequencies($plan);
        }

        $subscription = $this->asBraintreeSubscription();

        $response = BraintreeSubscription::update($subscription->id, [
            'planId' => $plan->id,
            'price' => number_format($plan->price * (1 + ($this->owner->taxPercentage() / 100)), 2, '.', ''),
            'neverExpires' => true,
            'numberOfBillingCycles' => null,
            'options' => [
                'prorateCharges' => $this->prorate,
            ],
        ]);

        if ($response->success) {
            $this->fill([
                'braintree_plan' => $plan->id,
                'ends_at' => null,
            ])->save();
        } else {
            throw new Exception('Braintree failed to swap plans: '.$response->message);
        }

        return $this;
    }
public function swap($plan)
    {
        if ($this->onGracePeriod() && $this->braintree_plan === $plan) {
            return $this->resume();
        }

        if (! $this->active()) {
            return $this->owner->newSubscription($this->name, $plan)
                                ->skipTrial()->create();
        }

        $plan = BraintreeService::findPlan($plan);

        if ($this->wouldChangeBillingFrequency($plan) && $this->prorate) {
            return $this->swapAcrossFrequencies($plan);
        }

        $subscription = $this->asBraintreeSubscription();

        $response = BraintreeSubscription::update($subscription->id, [
            'planId' => $plan->id,
            'price' => number_format($plan->price * (1 + ($this->owner->taxPercentage() / 100)), 2, '.', ''),
            'neverExpires' => true,
            'numberOfBillingCycles' => null,
            'options' => [
                'prorateCharges' => $this->prorate,
            ],
        ]);

        if ($response->success) {
            $this->fill([
                'braintree_plan' => $plan->id,
                'ends_at' => null,
            ])->save();
        } else {
            throw new Exception('Braintree failed to swap plans: '.$response->message);
        }

        return $this;
    }
public function swap ( $ plan ) { if ( $ this -> onGracePeriod ( ) && $ this -> braintree_plan === $ plan ) { return $ this -> resume ( ) ; } if ( ! $ this -> active ( ) ) { return $ this -> owner -> newSubscription ( $ this -> name , $ plan ) -> skipTrial ( ) -> create ( ) ; } $ plan = BraintreeService :: findPlan ( $ plan ) ; if ( $ this -> wouldChangeBillingFrequency ( $ plan ) && $ this -> prorate ) { return $ this -> swapAcrossFrequencies ( $ plan ) ; } $ subscription = $ this -> asBraintreeSubscription ( ) ; $ response = BraintreeSubscription :: update ( $ subscription -> id , [ 'planId' => $ plan -> id , 'price' => number_format ( $ plan -> price * ( 1 + ( $ this -> owner -> taxPercentage ( ) / 100 ) ) , 2 , '.' , '' ) , 'neverExpires' => true , 'numberOfBillingCycles' => null , 'options' => [ 'prorateCharges' => $ this -> prorate , ] , ] ) ; if ( $ response -> success ) { $ this -> fill ( [ 'braintree_plan' => $ plan -> id , 'ends_at' => null , ] ) -> save ( ) ; } else { throw new Exception ( 'Braintree failed to swap plans: ' . $ response -> message ) ; } return $ this ; }
Swap the subscription to a new Braintree plan.

@param  string  $plan
@return $this|\Laravel\Cashier\Subscription
@throws \Exception
Swap the subscription to a new Braintree plan .