from django import template
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _, ungettext, ugettext, get_language
+from django_countries.fields import CountryField
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
return [int(x) for x in self.monthly_amounts.split(',')]
+class Consent(models.Model):
+ order = models.IntegerField()
+ active = models.BooleanField(default=True)
+ text = models.CharField(max_length=2048)
+ required = models.BooleanField()
+
+ class Meta:
+ ordering = ['order']
+
+ def __str__(self):
+ return self.text
+
+
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)
expires_at = models.DateTimeField(_('expires_at'), null=True, blank=True)
email_sent = models.BooleanField(default=False)
+ first_name = models.CharField(max_length=255, blank=True)
+ last_name = models.CharField(max_length=255, blank=True)
+ phone = models.CharField(max_length=255, blank=True)
+ postal = models.CharField(max_length=255, blank=True)
+ postal_code = models.CharField(max_length=255, blank=True)
+ postal_town = models.CharField(max_length=255, blank=True)
+ postal_country = CountryField(default='PL', blank=True)
+
+ consent = models.ManyToManyField(Consent)
+
class Meta:
verbose_name = _('schedule')
verbose_name_plural = _('schedules')
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()
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)
Contact.update(self.email, level, since, self.expires_at)
+
+
+
class Membership(models.Model):
""" Represents a user being recognized as a member of the club. """
user = models.OneToOneField(settings.AUTH_USER_MODEL, verbose_name=_('user'), on_delete=models.CASCADE)
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):
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')
+