X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/5fb53c16b8de6efee032dea734dd9047f33d3d54..8885fd14f5f040eb3aa69f1d705856f99a1fa572:/src/pz/models.py?ds=sidebyside diff --git a/src/pz/models.py b/src/pz/models.py index 1a77217b9..6bf77ad5a 100644 --- a/src/pz/models.py +++ b/src/pz/models.py @@ -1,82 +1,99 @@ +import re from django.db import models from django.utils.timezone import now -from django.utils.translation import ugettext_lazy as _ -from .bank import parse_export_feedback +from .bank import parse_export_feedback, parse_payment_feedback class Campaign(models.Model): - name = models.CharField(_('name'), max_length=255, unique=True) - description = models.TextField(_('description'), blank=True) + name = models.CharField('nazwa', max_length=255, unique=True) + description = models.TextField('opis', blank=True) class Meta: - verbose_name = _('campaign') - verbose_name_plural = _('campaigns') + verbose_name = 'kampania' + verbose_name_plural = 'kampanie' def __str__(self): return self.name class Fundraiser(models.Model): - name = models.CharField(_('name'), max_length=255, unique=True) + name = models.CharField('imię i nazwisko', max_length=255, unique=True) class Meta: - verbose_name = _('fundraiser') - verbose_name_plural = _('fundraisers') + verbose_name = 'fundraiser' + verbose_name_plural = 'fundraiserki i fundraiserzy' def __str__(self): return self.name 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')), + first_name = models.CharField('imię', max_length=255, blank=True) + last_name = models.CharField('nazwisko', max_length=255, blank=True) + sex = models.CharField('płeć', max_length=1, blank=True, choices=[ + ('M', 'M'), + ('F', 'K'), ]) - 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) - iban_valid = models.NullBooleanField(_('IBAN valid'), default=False) - is_consumer = models.BooleanField(_('is a consumer'), default=True) - payment_id = models.CharField(_('payment identifier'), max_length=255, blank=True, unique=True) - agree_fundraising = models.BooleanField(_('agree fundraising'), default=False) - agree_newsletter = models.BooleanField(_('agree newsletter'), default=False) - - acquisition_date = models.DateField(_('acquisition date'), help_text=_('Date from the form'), null=True, blank=True) - submission_date = models.DateField(_('submission date'), null=True, blank=True, help_text=_('Date the fundaiser submitted the form')) - bank_submission_date = models.DateField(_('bank submission date'), null=True, blank=True, help_text=_('Date when the form data is submitted to the bank')) - bank_acceptance_date = models.DateField(_('bank accepted date'), null=True, blank=True, help_text=_('Date when bank accepted the form')) - - fundraiser = models.ForeignKey(Fundraiser, models.PROTECT, blank=True, null=True, verbose_name=_('fundraiser')) - fundraiser_commission = models.IntegerField(_('fundraiser commission'), null=True, blank=True) - fundraiser_bill = models.CharField(_('fundaiser bill number'), max_length=255, blank=True) - - amount = models.IntegerField(_('amount'), null=True, blank=True) - - notes = models.TextField(_('notes'), blank=True) - - needs_redo = models.BooleanField(_('needs redo'), default=False) - is_cancelled = models.BooleanField(_('is cancelled'), default=False) - optout = models.BooleanField(_('optout'), default=False) - - campaign = models.ForeignKey(Campaign, models.PROTECT, null=True, blank=True, verbose_name=_('campaign')) - + date_of_birth = models.DateField('data urodzenia', null=True, blank=True) + street = models.CharField('ulica', max_length=255, blank=True) + building = models.CharField('nr domu', max_length=255, blank=True) + flat = models.CharField('nr mieszkania', max_length=255, blank=True) + town = models.CharField('miejscowość', max_length=255, blank=True) + postal_code = models.CharField('kod pocztowy', max_length=255, blank=True) + phone = models.CharField('telefon', max_length=255, blank=True) + email = models.CharField('e-mail', max_length=255, blank=True) + iban = models.CharField('nr rachunku', max_length=255, blank=True) + iban_valid = models.BooleanField('prawidłowy IBAN', default=False, null=True) + is_consumer = models.BooleanField('konsument', default=True) + payment_id = models.CharField('identyfikator płatności', max_length=255, blank=True, unique=True) + agree_fundraising = models.BooleanField('zgoda na kontakt fundraisingowy', default=False) + agree_newsletter = models.BooleanField('zgoda na newsletter', default=False) + + acquisition_date = models.DateField( + 'data pozyskania', help_text='Data z formularza', + null=True, blank=True) + submission_date = models.DateField( + 'data dostarczenia', null=True, blank=True, + help_text='Data złożenia formularza przez fundraisera') + bank_submission_date = models.DateField( + 'data złożenia do banku', null=True, blank=True, + help_text='Data przesłania danych z formularza do banku') + bank_acceptance_date = models.DateField( + 'data akceptacji przez bank', null=True, blank=True, + help_text='Data kiedy bank przekazał informację o akceptacji danych z formularza') + + fundraiser = models.ForeignKey(Fundraiser, models.PROTECT, blank=True, null=True, verbose_name='fundraiser') + fundraiser_commission = models.IntegerField('prowizja fundraisera', null=True, blank=True) + fundraiser_bonus = models.IntegerField('bonus fundraisera', null=True, blank=True) + fundraiser_bill = models.CharField('nr rachunku wystawionego przez fundraisera', max_length=255, blank=True) + + amount = models.IntegerField('kwota', null=True, blank=True) + + notes = models.TextField('uwagi', blank=True) + + needs_redo = models.BooleanField('do powtórki', default=False) + cancelled_at = models.DateTimeField('anulowane', null=True, blank=True) + optout = models.BooleanField('optout', default=False) + + campaign = models.ForeignKey(Campaign, models.PROTECT, null=True, blank=True, verbose_name='kampania') + + latest_status = models.CharField(max_length=255, blank=True) + class Meta: - verbose_name = _('direct debit') - verbose_name_plural = _('direct debits') + verbose_name = 'polecenie zapłaty' + verbose_name_plural = 'polecenia zapłaty' def __str__(self): - return self.payment_id + return "{} {}".format(self.payment_id, self.latest_status) + + def get_latest_status(self): + line = self.bankexportfeedbackline_set.order_by('-feedback__created_at').first() + if line is None: return "" + return line.comment def save(self, **kwargs): self.iban_valid = not self.iban_warning() if self.iban else None + self.latest_status = self.get_latest_status() super().save(**kwargs) @classmethod @@ -129,7 +146,32 @@ class BankExportFeedback(models.Model): def save(self, **kwargs): super().save(**kwargs) - for payment_id, status, comment in parse_export_feedback(self.csv): + try: + self.save_payment_items() + except AssertionError: + self.save_export_feedback_items() + + def save_payment_items(self): + for payment_id, booking_date, is_dd, realised, reject_code in parse_payment_feedback(self.csv.open()): + debit = DirectDebit.objects.get(payment_id = payment_id) + b, created = self.payment_set.get_or_create( + debit=debit, + defaults={ + 'booking_date': booking_date, + 'is_dd': is_dd, + 'realised': realised, + 'reject_code': reject_code, + } + ) + if not created: + b.booking_date = booking_date + b.is_dd = is_dd + b.realised = realised + b.reject_code = reject_code + b.save() + + def save_export_feedback_items(self): + for payment_id, status, comment in parse_export_feedback(self.csv.open()): debit = DirectDebit.objects.get(payment_id = payment_id) b, created = self.bankexportfeedbackline_set.get_or_create( debit=debit, @@ -144,7 +186,7 @@ class BankExportFeedback(models.Model): b.save() if status == 1 and not debit.bank_acceptance_date: debit.bank_acceptance_date = now().date() - debit.save() + debit.save() class BankExportFeedbackLine(models.Model): @@ -154,6 +196,15 @@ class BankExportFeedbackLine(models.Model): comment = models.CharField(max_length=255) +class Payment(models.Model): + feedback = models.ForeignKey(BankExportFeedback, models.CASCADE) + debit = models.ForeignKey(DirectDebit, models.CASCADE) + booking_date = models.DateField() + is_dd = models.BooleanField() + realised = models.BooleanField() + reject_code = models.CharField(max_length=128, blank=True) + + class BankOrder(models.Model): payment_date = models.DateField(null=True, blank=True)