Fixes
[wolnelektury.git] / src / club / models.py
index 089bbbd..4f3a8f6 100644 (file)
@@ -19,6 +19,7 @@ from messaging.states import Level
 from reporting.utils import render_to_pdf
 from .payment_methods import methods
 from .payu import models as payu_models
+from .civicrm import report_activity
 from . import utils
 
 
@@ -149,6 +150,16 @@ class Schedule(models.Model):
             return utils.add_year(date)
         return utils.add_month(date)
 
+    def get_other_active_recurring(self):
+        schedules = type(self).objects.exclude(
+            monthly=False, yearly=False
+        ).filter(is_cancelled=False, expires_at__gt=now()).exclude(pk=self.pk)
+        mine_q = models.Q(email=self.email)
+        if self.membership is not None:
+            mine_q |= models.Q(membership__user=self.membership.user)
+        schedules = schedules.filter(mine_q)
+        return schedules.order_by('-expires_at').first()
+    
     def send_email(self):
         ctx = {'schedule': self}
         send_mail(
@@ -158,6 +169,17 @@ class Schedule(models.Model):
         self.email_sent = True
         self.save()
 
+    def send_email_failed_recurring(self):
+        ctx = {
+            'schedule': self,
+            'other': self.get_other_active_recurring(),
+        }
+        send_mail(
+            'Darowizna na Wolne Lektury — problem z płatnością',
+            template.loader.render_to_string('club/email/failed_recurring.txt', ctx),
+            settings.CONTACT_EMAIL, [self.email], fail_silently=False
+        )
+        
     def update_contact(self):
         Contact = apps.get_model('messaging', 'Contact')
         if not self.payed_at:
@@ -277,7 +299,7 @@ class PayUOrder(payu_models.Order):
             self.schedule.get_thanks_url())
 
     def get_description(self):
-        return ugettext('Towarzystwo Przyjaciół Wolnych Lektur')
+        return 'Wolne Lektury'
 
     def is_recurring(self):
         return self.schedule.get_payment_method().is_recurring
@@ -293,12 +315,47 @@ class PayUOrder(payu_models.Order):
     def status_updated(self):
         if self.status == 'COMPLETED':
             self.schedule.set_payed()
+
+        elif self.status == 'CANCELED' or self.status.startswith('ERR-'):
+            if self.is_recurring() and self.schedule.expires_at:
+                self.schedule.send_email_failed_recurring()
             
+        self.report_activity()
+
+    @property
+    def updated_at(self):
+        try:
+            return self.notification_set.all().order_by('-received_at')[0].received_at
+        except IndexError:
+            return None
+    
+    def report_activity(self):
+        if self.status not in ['COMPLETED', 'CANCELED', 'REJECTED']:
+            return
+
+        if self.status != 'COMPLETED':
+            name = settings.CIVICRM_ACTIVITIES['Failed contribution']
+        elif self.is_recurring():
+            name = settings.CIVICRM_ACTIVITIES['Recurring contribution']
+        else:
+            name = settings.CIVICRM_ACTIVITIES['Contribution']
+
+        report_activity.delay(
+            self.schedule.email,
+            self.schedule.key,
+            f'payu:{self.id}',
+            name,
+            self.updated_at,
+            {
+                'kwota': self.schedule.amount,
+            }
+        )            
 
     @classmethod
-    def send_receipt(cls, email, year):
+    def send_receipt(cls, email, year, resend=False):
         Contact = apps.get_model('messaging', 'Contact')
         Funding = apps.get_model('funding', 'Funding')
+        BillingAgreement = apps.get_model('paypal', 'BillingAgreement')
         payments = []
 
         try:
@@ -325,6 +382,9 @@ class PayUOrder(payu_models.Order):
                 'amount': order.get_amount(),
             })
 
+        for ba in BillingAgreement.objects.filter(schedule__email=email):
+            payments.extend(ba.get_donations(year))
+
         fundings = Funding.objects.filter(
             email=email,
             payed_at__year=year
@@ -346,6 +406,7 @@ class PayUOrder(payu_models.Order):
             "total": sum(x['amount'] for x in payments),
             "payments": payments,
             "optout": optout,
+            "resend": resend,
         }
         temp = tempfile.NamedTemporaryFile(prefix='receipt-', suffix='.pdf', delete=False)
         temp.close()