Canceled user can upgrade again: the payment method is changed immediately though
This commit is contained in:
parent
83d32244a5
commit
3492935f95
|
@ -11,19 +11,31 @@
|
||||||
<div class="bg-white p-6" style="max-width: 60em; margin: auto">
|
<div class="bg-white p-6" style="max-width: 60em; margin: auto">
|
||||||
<h1 class="h3 mb-5"> Billing </h1>
|
<h1 class="h3 mb-5"> Billing </h1>
|
||||||
|
|
||||||
|
{% if sub.cancelled %}
|
||||||
|
<p>
|
||||||
|
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>
|
<p>
|
||||||
You are on the <b>{{ sub.plan_name() }}</b> plan. Thank you very much for supporting
|
You are on the <b>{{ sub.plan_name() }}</b> plan. Thank you very much for supporting
|
||||||
SimpleLogin. 🙌
|
SimpleLogin. 🙌
|
||||||
</p>
|
</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 }}
|
|
||||||
({{ sub.next_bill_date | dt }}).
|
|
||||||
</p>
|
|
||||||
|
|
||||||
{% else %}
|
|
||||||
<div class="mt-3">
|
<div class="mt-3">
|
||||||
Click here to update billing information on Paddle, our payment partner: <br>
|
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>
|
<a class="btn btn-success" href="{{ sub.update_url }}"> Update billing information </a>
|
||||||
|
|
|
@ -195,7 +195,34 @@ class User(db.Model, ModelMixin, UserMixin):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def should_upgrade(self):
|
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:
|
def is_premium(self) -> bool:
|
||||||
"""
|
"""
|
||||||
|
@ -273,7 +300,8 @@ class User(db.Model, ModelMixin, UserMixin):
|
||||||
# sub is active until the next billing_date + 1
|
# sub is active until the next billing_date + 1
|
||||||
if sub.next_bill_date >= arrow.now().shift(days=-1).date():
|
if sub.next_bill_date >= arrow.now().shift(days=-1).date():
|
||||||
return sub
|
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
|
return None
|
||||||
else:
|
else:
|
||||||
return sub
|
return sub
|
||||||
|
|
|
@ -349,7 +349,7 @@ def setup_paddle_callback(app: Flask):
|
||||||
sub = Subscription.get_by(user_id=user.id)
|
sub = Subscription.get_by(user_id=user.id)
|
||||||
|
|
||||||
if not sub:
|
if not sub:
|
||||||
LOG.d("create a new sub")
|
LOG.d(f"create a new Subscription for user {user}")
|
||||||
Subscription.create(
|
Subscription.create(
|
||||||
user_id=user.id,
|
user_id=user.id,
|
||||||
cancel_url=request.form.get("cancel_url"),
|
cancel_url=request.form.get("cancel_url"),
|
||||||
|
@ -362,7 +362,7 @@ def setup_paddle_callback(app: Flask):
|
||||||
plan=plan,
|
plan=plan,
|
||||||
)
|
)
|
||||||
else:
|
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.cancel_url = request.form.get("cancel_url")
|
||||||
sub.update_url = request.form.get("update_url")
|
sub.update_url = request.form.get("update_url")
|
||||||
sub.subscription_id = request.form.get("subscription_id")
|
sub.subscription_id = request.form.get("subscription_id")
|
||||||
|
|
|
@ -28,7 +28,11 @@
|
||||||
{% if current_user.in_trial() %}
|
{% if current_user.in_trial() %}
|
||||||
<small class="text-success d-block mt-1">Trial ends {{ current_user.trial_end|dt }}</small>
|
<small class="text-success d-block mt-1">Trial ends {{ current_user.trial_end|dt }}</small>
|
||||||
{% elif current_user.lifetime_or_active_subscription() %}
|
{% 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 %}
|
{% endif %}
|
||||||
|
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Reference in a new issue