Accept all bank feedbacks
[wolnelektury.git] / src / club / payment_methods.py
index 9b73c89..e74ae83 100644 (file)
@@ -3,12 +3,16 @@
 #
 from django.conf import settings
 from django.urls import reverse
+from django.utils.timezone import now
 from paypal.rest import agreement_approval_url
 
 
 class PaymentMethod(object):
     is_onetime = False
     is_recurring = False
+    expiration_reliable = False
+    cancellable = False
+    updateable = False
 
     def initiate(self, request, schedule):
         return reverse('club_dummy_payment', args=[schedule.key])
@@ -16,6 +20,7 @@ class PaymentMethod(object):
 
 class PayU(PaymentMethod):
     is_onetime = True
+    expiration_reliable = True
     slug = 'payu'
     name = 'PayU'
     template_name = 'club/payment/payu.html'
@@ -39,6 +44,9 @@ class PayURe(PaymentMethod):
     name = 'PayU recurring'
     template_name = 'club/payment/payu-re.html'
     is_recurring = True
+    expiration_reliable = True
+    cancellable = True
+    updateable = True
 
     def __init__(self, pos_id):
         self.pos_id = pos_id
@@ -53,13 +61,41 @@ class PayURe(PaymentMethod):
             ip = request.META['REMOTE_ADDR']
         else:
             ip = '127.0.0.1'
+
+        if request is None:
+            if not self.needs_retry(schedule):
+                return
+            
         order = PayUOrder.objects.create(
             pos_id=self.pos_id,
             customer_ip=ip,
             schedule=schedule,
         )
         return order.put()
+
+    def needs_retry(self, schedule):
+        retry_last = schedule.payuorder_set.exclude(
+            created_at=None).order_by('-created_at').first()
+        if retry_last is None:
+            return True
+
+        n = now().date()
+        days_since_last = (n - retry_last.created_at.date()).days
+
+        retry_start = max(
+            schedule.expires_at.date(),
+            settings.CLUB_RETRIES_START
+        )
+        retry_days = (n - retry_start).days
         
+        if retry_days > settings.CLUB_RETRY_DAYS_MAX:
+            print('expired')
+            return False
+        if retry_days > settings.CLUB_RETRY_DAYS_DAILY:
+            print('retry less often now')
+            return days_since_last > settings.CLUB_RETRY_LESS
+        return days_since_last > 0
+
 
 class PayPal(PaymentMethod):
     slug = 'paypal'
@@ -72,6 +108,21 @@ class PayPal(PaymentMethod):
         app = request.GET.get('app')
         return agreement_approval_url(schedule.amount, schedule.key, app=app)
 
+    def pay(self, request, schedule):
+        from datetime import date, timedelta, datetime
+        from pytz import utc
+        tomorrow = datetime(*(date.today() + timedelta(2)).timetuple()[:3], tzinfo=utc)
+        any_active = False
+        for ba in schedule.billingagreement_set.all():
+            active = ba.check_agreement()
+            ba.active = active
+            ba.save()
+            if active:
+                any_active = True
+        if any_active:
+            schedule.expires_at = tomorrow
+            schedule.save()
+
 
 methods = []