css fix
[wolnelektury.git] / src / club / models.py
index db5fde8..8905f08 100644 (file)
@@ -16,7 +16,7 @@ from django.utils.translation import ugettext_lazy as _, ungettext, ugettext, ge
 from catalogue.utils import get_random_hash
 from messaging.states import Level
 from reporting.utils import render_to_pdf
-from .payment_methods import recurring_payment_method, single_payment_method
+from .payment_methods import methods
 from .payu import models as payu_models
 from . import utils
 
@@ -47,11 +47,16 @@ class Schedule(models.Model):
     """ Represents someone taking up a plan. """
     key = models.CharField(_('key'), max_length=255, unique=True)
     email = models.EmailField(_('email'))
-    membership = models.ForeignKey('Membership', verbose_name=_('membership'), null=True, blank=True, on_delete=models.PROTECT)
+    membership = models.ForeignKey('Membership', verbose_name=_('membership'), null=True, blank=True, on_delete=models.SET_NULL)
     amount = models.DecimalField(_('amount'), max_digits=10, decimal_places=2)
+    method = models.CharField(_('method'), max_length=32, choices=[
+        (m.slug, m.name) for m in methods
+        ])
     monthly = models.BooleanField(_('monthly'), default=True)
     yearly = models.BooleanField(_('yearly'), default=False)
-    
+
+    source = models.CharField(_('source'), max_length=255, blank=True)
+
     is_cancelled = models.BooleanField(_('cancelled'), default=False)
     payed_at = models.DateTimeField(_('payed at'), null=True, blank=True)
     started_at = models.DateTimeField(_('started at'), auto_now_add=True)
@@ -84,7 +89,7 @@ class Schedule(models.Model):
         return reverse('club_thanks', args=[self.key])
 
     def get_payment_method(self):
-        return recurring_payment_method if self.monthly or self.yearly else single_payment_method
+        return [m for m in methods if m.slug == self.method][0]
 
     def is_expired(self):
         return self.expires_at is not None and self.expires_at <= now()
@@ -95,6 +100,21 @@ class Schedule(models.Model):
     def is_recurring(self):
         return self.monthly or self.yearly
 
+    def set_payed(self):
+        since = self.expires_at
+        n = now()
+        if since is None or since < n:
+            since = n
+        new_exp = self.get_next_installment(since)
+        if self.payed_at is None:
+            self.payed_at = n
+        if self.expires_at is None or self.expires_at < new_exp:
+            self.expires_at = new_exp
+            self.save()
+
+        if not self.email_sent:
+            self.send_email()
+    
     def get_next_installment(self, date):
         if self.yearly:
             return utils.add_year(date)
@@ -245,32 +265,39 @@ class PayUOrder(payu_models.Order):
 
     def status_updated(self):
         if self.status == 'COMPLETED':
-            since = self.schedule.expires_at
-            n = now()
-            if since is None or since < n:
-                since = n
-            new_exp = self.schedule.get_next_installment(since)
-            if self.schedule.payed_at is None:
-                self.schedule.payed_at = n
-            if self.schedule.expires_at is None or self.schedule.expires_at < new_exp:
-                self.schedule.expires_at = new_exp
-                self.schedule.save()
-
-            if not self.schedule.email_sent:
-                self.schedule.send_email()
+            self.schedule.set_payed()
+            
 
     @classmethod
     def send_receipt(cls, email, year):
+        Contact = apps.get_model('messaging', 'Contact')
         Funding = apps.get_model('funding', 'Funding')
         payments = []
 
+        try:
+            contact = Contact.objects.get(email=email)
+        except Contact.DoesNotExist:
+            funding = Funding.objects.filter(
+                email=email,
+                payed_at__year=year,
+                notifications=True).order_by('payed_at').first()
+            if funding is None:
+                print('no notifications')
+                return
+            optout = funding.wl_optout_url()
+        else:
+            if contact.level == Level.OPT_OUT:
+                print('opt-out')
+                return
+            optout = contact.wl_optout_url()
+
         qs = cls.objects.filter(status='COMPLETED', schedule__email=email, completed_at__year=year).order_by('completed_at')
         for order in qs:
             payments.append({
                 'timestamp': order.completed_at,
                 'amount': order.get_amount(),
             })
-            
+
         fundings = Funding.objects.filter(
             email=email,
             payed_at__year=year
@@ -291,6 +318,7 @@ class PayUOrder(payu_models.Order):
             "next_year": year + 1,
             "total": sum(x['amount'] for x in payments),
             "payments": payments,
+            "optout": optout,
         }
         temp = tempfile.NamedTemporaryFile(prefix='receipt-', suffix='.pdf', delete=False)
         temp.close()
@@ -317,3 +345,28 @@ class PayUNotification(payu_models.Notification):
     order = models.ForeignKey(PayUOrder, models.CASCADE, related_name='notification_set')
 
 
+class DirectDebit(models.Model):
+    first_name = models.CharField(_('first name'), max_length=255, blank=True)
+    last_name = models.CharField(_('last name'), max_length=255, blank=True)
+    sex = models.CharField(_('sex'), max_length=1, blank=True, choices=[
+        ('M', 'M'),
+        ('F', 'F'),
+    ])
+    date_of_birth = models.DateField(_('date of birth'), null=True, blank=True)
+    street = models.CharField(_('street'), max_length=255, blank=True)
+    building = models.CharField(_('building'), max_length=255, blank=True)
+    flat = models.CharField(_('flat'), max_length=255, blank=True)
+    town = models.CharField(_('town'), max_length=255, blank=True)
+    postal_code = models.CharField(_('postal code'),  max_length=255, blank=True)
+    phone = models.CharField(_('phone'), max_length=255, blank=True)
+    email = models.CharField(_('e-mail'), max_length=255, blank=True)
+    iban = models.CharField(_('IBAN'), max_length=255, blank=True)
+    payment_id = models.CharField(_('payment identifier'), max_length=255, blank=True)
+    agree_newsletter = models.BooleanField(_('agree newsletter'))
+    date = models.DateField(_('date'))
+    amount = models.IntegerField(_('amount'))
+
+    class Meta:
+        verbose_name = _('direct debit')
+        verbose_name_plural = _('direct debits')
+