diff --git a/rowers/braintreestuff.py b/rowers/braintreestuff.py index 1c47d79b..86ad6b90 100644 --- a/rowers/braintreestuff.py +++ b/rowers/braintreestuff.py @@ -27,6 +27,8 @@ from rowers.tasks import ( #handle_send_email_transaction_notification, ) +from rowers import credits + import pandas as pd from rowsandall_app.settings import ( @@ -268,6 +270,7 @@ def update_subscription(rower,data,method='up'): if result.is_success: yesterday = (timezone.now()-datetime.timedelta(days=1)).date() rower.paidplan = plan + eurocredits = credits.upgrade(int(amount),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..30d7a279 --- /dev/null +++ b/rowers/credits.py @@ -0,0 +1,26 @@ +from rowers.models import Rower + +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 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/views/paymentviews.py b/rowers/views/paymentviews.py index e32824e6..92c7e5e3 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -6,6 +6,8 @@ from __future__ import unicode_literals from rowers.views.statements import * from django.core.mail import EmailMessage +from rowers import credits + @csrf_exempt def braintree_webhook_view(request): with open('braintreewebhooks.log','a') as f: @@ -212,6 +214,11 @@ def purchase_checkouts_view(request): return HttpResponseRedirect(reverse('rower_select_instantplan')) amount, success = braintreestuff.make_payment(r,data) + diff = plan.price - amount + + eurocredits = credits.withdraw(diff,r) + + if success: messages.info(request,"Your payment was completed and the sessions are copied to your calendar") @@ -243,7 +250,7 @@ def purchase_checkouts_view(request): p.rowers.add(r) create_sessions_from_json(plansteps,r,startdate,r.user) - + job = myqueue(queuehigh,handle_send_email_instantplan_notification, r.user.username, r.user.email, @@ -251,7 +258,6 @@ def purchase_checkouts_view(request): plan.name, startdate, enddate) - print(job,'noot') url = reverse('plannedsessions_view') timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index a61e27c8..ddec80c7 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -2621,10 +2621,24 @@ def rower_view_instantplan(request,id='',userid=0): 'id':id, }) return HttpResponseRedirect(url) + + # check if plan is free or credits are sufficient + if plan.price > 0: + if plan.price > r.eurocredits: + messages.error(request,'You did not have enough credit to purchase this plan') + url = reverse('rower_view_instantplan',kwargs={ + 'id':id, + }) + return HttpResponseRedirect(url) + + form = InstantPlanSelectForm(request.POST,targets=targets) if form.is_valid(): + if plan.price > 0: + eurocredits = credits.withdraw(plan.price,r) + plansteps = response.json() name = form.cleaned_data['name'] try: