class PromoCode(TimestampedModel): objects = PromoCodeQuerySet.as_manager() name = models.CharField(_('Promo Code'), max_length=32, unique=True, db_index=True) discount_percent = models.IntegerField(_('Discount percent')) active = models.BooleanField(_('Active'), default=True) comment = models.TextField(_('Comment'), blank=True, null=True) courses = models.ManyToManyField( 'products.Course', help_text=_('Can not be used for courses not checked here'), blank=True) class Meta: verbose_name = _('Promo Code') verbose_name_plural = _('Promo Codes') def compatible_with(self, course: Course) -> bool: return self.courses.count() == 0 or course in self.courses.all() def apply(self, course: Course) -> Decimal: if not self.compatible_with(course): return course.price return Decimal(course.price * (100 - self.discount_percent) / 100)
class PromoCode(TimestampedModel): objects = PromoCodeQuerySet.as_manager() name = models.CharField(_('Promo Code'), max_length=32, unique=True, db_index=True) discount_percent = models.IntegerField(_('Discount percent')) active = models.BooleanField(_('Active'), default=True) comment = models.TextField(_('Comment'), blank=True, null=True) class Meta: verbose_name = _('Promo Code') verbose_name_plural = _('Promo Codes') def apply(self, price: Decimal) -> Decimal: return Decimal(price * (100 - self.discount_percent) / 100)
class CreditNotification(TimestampedModel): """Notification for credit order by TinkoffCredit""" STATUSES_CHOICES = ( ('approved', _('Approved')), ('rejected', _('Rejected')), ('canceled', _('Canceled')), ('signed', _('Signed')), ) order_id = models.IntegerField() status = models.CharField(max_length=32, choices=STATUSES_CHOICES) bank_created = models.DateTimeField() first_payment = models.DecimalField(max_digits=10, decimal_places=2) order_amount = models.DecimalField(max_digits=10, decimal_places=2) credit_amount = models.DecimalField(max_digits=10, decimal_places=2) product = models.CharField(max_length=128) term = models.IntegerField() monthly_payment = models.DecimalField(max_digits=10, decimal_places=2) phone = models.CharField(max_length=64, null=True, blank=True) first_name = models.CharField(max_length=128, null=True, blank=True) last_name = models.CharField(max_length=128, null=True, blank=True) middle_name = models.CharField(max_length=32, blank=True, null=True) loan_number = models.CharField(max_length=128, blank=True, null=True) email = models.CharField(max_length=128, null=True, blank=True)
class PaymentNotification(TimestampedModel): STATUS_CHOICES = ( ('AUTHORIZED', _('Authorized')), ('CONFIRMED', _('Confirmed')), ('REVERSED', _('Reversed')), ('REFUNDED', _('Refunded')), ('PARTIAL_REFUNDED', _('Partial refunded')), ('REJECTED', _('Rejected')), ) terminal_key = models.CharField(max_length=512) order_id = models.IntegerField() success = models.BooleanField() status = models.CharField(max_length=128, choices=STATUS_CHOICES) payment_id = models.BigIntegerField() error_code = models.CharField(max_length=512, null=True) amount = models.DecimalField(decimal_places=2, max_digits=9) rebill_id = models.BigIntegerField(null=True) card_id = models.CharField(null=True, max_length=64) pan = models.CharField(max_length=128, null=True) data = models.TextField(null=True) token = models.CharField(max_length=512) exp_date = models.CharField(max_length=32, null=True)
def with_order_count(self): return self.annotate(order_count=Count(Case( When(order__paid__isnull=False, then=1), output_field=models.IntegerField(), )))