Browse Source

Canceled user can upgrade again: the payment method is changed immediately though

Son NK 5 years ago
parent
commit
3492935f95
4 changed files with 56 additions and 12 deletions
  1. 19 7
      app/dashboard/templates/dashboard/billing.html
  2. 30 2
      app/models.py
  3. 2 2
      server.py
  4. 5 1
      templates/header.html

+ 19 - 7
app/dashboard/templates/dashboard/billing.html

@@ -11,19 +11,31 @@
   <div class="bg-white p-6" style="max-width: 60em; margin: auto">
     <h1 class="h3 mb-5"> Billing </h1>
 
-    <p>
-      You are on the <b>{{ sub.plan_name() }}</b> plan. Thank you very much for supporting
-      SimpleLogin. 🙌
-    </p>
-
     {% if sub.cancelled %}
       <p>
-        Sad to see you go 😢. Your subscription ends on
-        {{ sub.next_bill_date.year }}-{{ sub.next_bill_date.month}}-{{ sub.next_bill_date.day }}
+        You are on the <b>{{ sub.plan_name() }}</b> plan. <br>
+        You have canceled your subscription and it will end on {{current_user.next_bill_date()}}
         ({{ sub.next_bill_date | dt }}).
       </p>
 
+      <hr>
+      <p>
+        If you change your mind you can subscribe again to SimpleLogin but please note that this will be a completely
+        new subscription and
+        your payment method will be charged <b>immediately</b>.
+        <br>
+
+        We are going to send you an email by the end of the subscription so maybe you can upgrade at that time.
+        <br>
+        <a href="{{ url_for('dashboard.pricing') }}" class="btn btn-primary mt-2">Re-subscribe</a>
+      </p>
+
     {% else %}
+      <p>
+        You are on the <b>{{ sub.plan_name() }}</b> plan. Thank you very much for supporting
+        SimpleLogin. 🙌
+      </p>
+
       <div class="mt-3">
         Click here to update billing information on Paddle, our payment partner: <br>
         <a class="btn btn-success" href="{{ sub.update_url }}"> Update billing information </a>

+ 30 - 2
app/models.py

@@ -195,7 +195,34 @@ class User(db.Model, ModelMixin, UserMixin):
         return False
 
     def should_upgrade(self):
-        return not self.lifetime_or_active_subscription()
+        if self.lifetime_or_active_subscription():
+            # user who has canceled can also re-subscribe
+            sub: Subscription = self.get_subscription()
+            if sub and sub.cancelled:
+                return True
+
+            return False
+
+        return True
+
+    def next_bill_date(self) -> str:
+        sub: Subscription = self.get_subscription()
+        if sub:
+            return sub.next_bill_date.strftime("%Y-%m-%d")
+
+        LOG.error(
+            f"next_bill_date() should be called only on user with active subscription. User {self}"
+        )
+        return ""
+
+    def is_cancel(self) -> bool:
+        """User has canceled their subscription but the subscription is still active,
+        i.e. next_bill_date > now"""
+        sub: Subscription = self.get_subscription()
+        if sub and sub.cancelled:
+            return True
+
+        return False
 
     def is_premium(self) -> bool:
         """
@@ -273,7 +300,8 @@ class User(db.Model, ModelMixin, UserMixin):
             # sub is active until the next billing_date + 1
             if sub.next_bill_date >= arrow.now().shift(days=-1).date():
                 return sub
-            else:  # past subscription, user is considered not having a subscription
+            # past subscription, user is considered not having a subscription = free plan
+            else:
                 return None
         else:
             return sub

+ 2 - 2
server.py

@@ -349,7 +349,7 @@ def setup_paddle_callback(app: Flask):
             sub = Subscription.get_by(user_id=user.id)
 
             if not sub:
-                LOG.d("create a new sub")
+                LOG.d(f"create a new Subscription for user {user}")
                 Subscription.create(
                     user_id=user.id,
                     cancel_url=request.form.get("cancel_url"),
@@ -362,7 +362,7 @@ def setup_paddle_callback(app: Flask):
                     plan=plan,
                 )
             else:
-                LOG.d("update existing sub %s", sub)
+                LOG.d(f"Update an existing Subscription for user {user}")
                 sub.cancel_url = request.form.get("cancel_url")
                 sub.update_url = request.form.get("update_url")
                 sub.subscription_id = request.form.get("subscription_id")

+ 5 - 1
templates/header.html

@@ -28,7 +28,11 @@
               {% if current_user.in_trial() %}
                 <small class="text-success d-block mt-1">Trial ends {{ current_user.trial_end|dt }}</small>
               {% elif current_user.lifetime_or_active_subscription() %}
-                <small class="text-success d-block mt-1">Premium</small>
+                <small class="text-success d-block mt-1">Premium
+                  {% if current_user.is_cancel() %}
+                    until {{ current_user.next_bill_date() }}
+                  {% endif %}
+                </small>
               {% endif %}
 
 						</span>