/** * upgrading an existing subscription * * @param \Ipunkt\Subscriptions\Subscription\Subscription $subscription * @param \Ipunkt\Subscriptions\Plans\Plan $plan * @param \Ipunkt\Subscriptions\Plans\PaymentOption $paymentOption * @param \Ipunkt\Subscriptions\Subscription\Contracts\SubscriptionSubscriber $subscriber * * @return \Ipunkt\Subscriptions\Subscription\Subscription */ public function upgrade(Subscription $subscription, Plan $plan, PaymentOption $paymentOption, SubscriptionSubscriber $subscriber) { $lastSubscription = $this->allBySubscriber($subscriber)->last(); if (null !== $lastSubscription && $lastSubscription->subscription_ends_at->isPast()) { $lastSubscription = null; } $startDate = null === $lastSubscription ? $subscription->subscription_ends_at : $lastSubscription->subscription_ends_at; if ($startDate->isPast()) { $startDate = Carbon::now(); } $subscription->model_id = $subscriber->getSubscriberId(); $subscription->model_class = $subscriber->getSubscriberModel(); $subscription->plan = $plan->id(); $subscriptionData = $subscription->toArray(); if (isset($subscriptionData['created_at'])) { unset($subscriptionData['created_at']); } if (isset($subscriptionData['updated_at'])) { unset($subscriptionData['updated_at']); } $newSubscription = Subscription::firstOrNew($subscriptionData); return $this->saveSubscription($newSubscription, $plan, $paymentOption, $startDate, self::MODE_UPDATE); }