/**
  * 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);
 }