+ return '%d dni przed wygaśnięciem' % self.days_before
+ else:
+ return '%d dni po wygaśnięciu' % -self.days_before
+
+
+class Ambassador(models.Model):
+ name = models.CharField('imię i nazwisko', max_length=255)
+ photo = models.ImageField('zdjęcie', blank=True)
+ text = models.CharField('tekst', max_length=1024)
+
+ class Meta:
+ verbose_name = 'ambasador'
+ verbose_name_plural = 'ambasadorowie'
+ ordering = ['name']
+
+ def __str__(self):
+ return self.name
+
+
+########
+# #
+# PayU #
+# #
+########
+
+class PayUOrder(payu_models.Order):
+ schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
+
+ def get_amount(self):
+ return self.schedule.amount
+
+ def get_buyer(self):
+ return {
+ "email": self.schedule.email,
+ "language": get_language(),
+ }
+
+ def get_description(self):
+ return 'Wolne Lektury'
+
+ def is_recurring(self):
+ return self.schedule.get_payment_method().is_recurring
+
+ def get_card_token(self):
+ return self.schedule.payucardtoken_set.order_by('-created_at').first()
+
+ def get_notify_url(self):
+ return "https://{}{}".format(
+ Site.objects.get_current().domain,
+ reverse('club_payu_notify', args=[self.pk]))
+
+ def get_thanks_url(self):
+ return self.schedule.get_thanks_url()
+
+ 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 generate_receipt(cls, email, year):
+ # TODO: abstract out
+ Contact = apps.get_model('messaging', 'Contact')
+ Funding = apps.get_model('funding', 'Funding')
+ BillingAgreement = apps.get_model('paypal', 'BillingAgreement')
+ DirectDebit = apps.get_model('pz', 'DirectDebit')
+ Payment = apps.get_model('pz', 'Payment')
+
+ payments = []
+
+ optout = None
+ try:
+ contact = Contact.objects.get(email=email)
+ except Contact.DoesNotExist:
+ funding = Funding.objects.filter(
+ email=email,
+ completed_at__year=year,
+ notifications=True).order_by('completed_at').first()
+ if funding is None:
+ print('no notifications')
+ if not DirectDebit.objects.filter(email=email, optout=False).exists():
+ return
+ else:
+ optout = funding.wl_optout_url()