diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 1c47d79b..3825ff21 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -27,6 +27,9 @@ from rowers.tasks import ( #handle_send_email_transaction_notification, ) +from rowers import credits +from rowers.utils import dologging + import pandas as pd from rowsandall_app.settings import ( @@ -68,6 +71,19 @@ def process_webhook(notification): except TypeError: f.write(timestamp+'\n') if notification.kind == 'subscription_charged_successfully': + subscription = notification.subscription + rs = Rower.objects.filter(subscription_id=subscription.id) + if rs.count() == 0: + dologging('braintreewebhooks.log','Could not find rowers with subscription ID {id}'.format( + id=subscription.id + )) + else: + r = rs[0] + transactions = subscription.transactions + if transactions: + amount = int(transactions[0].amount) + eurocredits = credits.upgrade(amount,r) + eurocredits = credits.upgrade(amount,r) return send_invoice(notification.subscription) if notification.kind == 'subscription_canceled': subscription = notification.subscription @@ -268,6 +284,8 @@ def update_subscription(rower,data,method='up'): if result.is_success: yesterday = (timezone.now()-datetime.timedelta(days=1)).date() rower.paidplan = plan + amount_int = int(float(amount)) + eurocredits = credits.upgrade(amount_int,rower) rower.planexpires = result.subscription.billing_period_end_date rower.teamplanexpires = result.subscription.billing_period_end_date rower.clubsize = plan.clubsize diff --git a/rowers/credits.py b/rowers/credits.py new file mode 100644 index 00000000..e57710c9 --- /dev/null +++ b/rowers/credits.py @@ -0,0 +1,41 @@ + +class InsufficientCreditError(Exception): + """Raised when trying to subtract more than available""" + pass + +def upgrade(amount, rower): + if rower.eurocredits > amount: + return rower.eurocredits + else: + rower.eurocredits = amount + rower.save() + return rower.eurocredits + return rower.eurocredits + +def withdraw(amount, rower): + if rower.eurocredits < amount: + rower.eurocredits = 0 + rower.save() + raise InsufficientCreditError + else: + rower.eurocredits = rower.eurocredits - amount + rower.save() + return rower.eurocredits + + return rower.eurocredits + +def discount(amount,rower): + if amount < rower.eurocredits: + return amount + else: + return rower.eurocredits + + return 0 + +def discounted(amount,rower): + if amount > rower.eurocredits: + return amount-rower.eurocredits + else: + return 0 + + return 0 diff --git a/rowers/models.py b/rowers/models.py index b371ae92..feddf2cd 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -878,6 +878,8 @@ class Rower(models.Model): null=True,blank=True, default='braintree') + eurocredits = models.IntegerField(default=0) + paidplan = models.ForeignKey(PaidPlan,null=True,default=None,on_delete=models.SET_NULL) planexpires = models.DateField(default=current_day) diff --git a/rowers/templates/buy_trainingplan.html b/rowers/templates/buy_trainingplan.html index 6be1d6bf..45594a78 100644 --- a/rowers/templates/buy_trainingplan.html +++ b/rowers/templates/buy_trainingplan.html @@ -21,6 +21,10 @@
Plan: {{ plan.name }}
Price: {{ plan.price }}€
+ {% if rower.eurocredits > 0 %} +Your Discount: {{ plan.price|discount:rower }}
+You will pay: {{ plan.price|discounted:rower }}
+ {% endif %}diff --git a/rowers/templates/confirm_trainingplan.html b/rowers/templates/confirm_trainingplan.html index af325e53..de691f11 100644 --- a/rowers/templates/confirm_trainingplan.html +++ b/rowers/templates/confirm_trainingplan.html @@ -37,7 +37,7 @@
Price: {{ plan.price }}€
{% endif %} + {% if rower.eurocredits and plan.price > 0 %} +Your discount: {{ plan.price|discount:rower }}€
+You pay: {{ plan.price|discounted:rower }}€
+ {% endif %}