diff --git a/api/v1/serializers/user.py b/api/v1/serializers/user.py index bd5ac93b..8ce068e2 100644 --- a/api/v1/serializers/user.py +++ b/api/v1/serializers/user.py @@ -35,6 +35,7 @@ class UserSerializer(serializers.ModelSerializer): 'fb_data', 'is_email_proved', 'photo', + 'balance', ) read_only_fields = ( @@ -44,6 +45,7 @@ class UserSerializer(serializers.ModelSerializer): 'is_staff', 'fb_id', 'fb_data', + 'balance', ) diff --git a/apps/payment/models.py b/apps/payment/models.py index 004a10c8..6040e4a4 100644 --- a/apps/payment/models.py +++ b/apps/payment/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.auth import get_user_model from django.contrib.postgres.fields import ArrayField, JSONField +from constance import config from paymentwall import Pingback from polymorphic.models import PolymorphicModel @@ -21,7 +22,8 @@ class AuthorBalance(models.Model): (1, 'Accepted'), (2, 'Declined'), ) - author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор', null=True, blank=True, related_name='balances') + author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Автор', + null=True, blank=True, related_name='balances') type = models.PositiveSmallIntegerField('Тип', choices=TYPE_CHOICES, default=0) amount = models.DecimalField('Итого', max_digits=8, decimal_places=2, default=0) commission = models.DecimalField('Комиссия', max_digits=8, decimal_places=2, default=0) @@ -55,6 +57,9 @@ class Payment(PolymorphicModel): verbose_name = 'Платеж' verbose_name_plural = 'Платежи' + def calc_commission(self): + return self.amount * config.SERVICE_COMMISSION / 100 + class CoursePayment(Payment): course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс') @@ -72,9 +77,11 @@ class CoursePayment(Payment): author=self.course.author, amount=self.amount, payment=self, + commission=self.calc_commission(), ) else: author_balance.amount = self.amount + author_balance.commission = self.calc_commission() author_balance.save() @@ -96,11 +103,3 @@ class SchoolPayment(Payment): self.amount = month_price_sum super().save(*args, **kwargs) author_balance = getattr(self, 'authorbalance', None) - if not author_balance: - AuthorBalance.objects.create( - amount=month_price_sum, - payment=self, - ) - else: - author_balance.amount = self.amount - author_balance.save() diff --git a/apps/user/models.py b/apps/user/models.py index 6f18d9e8..ef95c463 100644 --- a/apps/user/models.py +++ b/apps/user/models.py @@ -61,8 +61,15 @@ class User(AbstractUser): user_data = dumps(user_data, ensure_ascii=False) return user_data + @property def balance(self): - return self.balances.aggregate(models.Sum('amount')).get('amount__sum', 0) + aggregate = self.balances.aggregate( + models.Sum('amount'), + models.Sum('commission'), + ) + amount = aggregate.get('amount__sum', 0) + commission = aggregate.get('commission__sum', 0) + return amount - commission @receiver(post_save, sender=User)