LIL-271. Fix balance calc & add balance to user serializer

remotes/origin/hasaccess
Ivlev Denis 8 years ago
parent 6e4e50c01a
commit 8ba76c5ae6
  1. 2
      api/v1/serializers/user.py
  2. 17
      apps/payment/models.py
  3. 9
      apps/user/models.py

@ -35,6 +35,7 @@ class UserSerializer(serializers.ModelSerializer):
'fb_data', 'fb_data',
'is_email_proved', 'is_email_proved',
'photo', 'photo',
'balance',
) )
read_only_fields = ( read_only_fields = (
@ -44,6 +45,7 @@ class UserSerializer(serializers.ModelSerializer):
'is_staff', 'is_staff',
'fb_id', 'fb_id',
'fb_data', 'fb_data',
'balance',
) )

@ -2,6 +2,7 @@ from django.db import models
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.postgres.fields import ArrayField, JSONField from django.contrib.postgres.fields import ArrayField, JSONField
from constance import config
from paymentwall import Pingback from paymentwall import Pingback
from polymorphic.models import PolymorphicModel from polymorphic.models import PolymorphicModel
@ -21,7 +22,8 @@ class AuthorBalance(models.Model):
(1, 'Accepted'), (1, 'Accepted'),
(2, 'Declined'), (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) type = models.PositiveSmallIntegerField('Тип', choices=TYPE_CHOICES, default=0)
amount = models.DecimalField('Итого', max_digits=8, decimal_places=2, default=0) amount = models.DecimalField('Итого', max_digits=8, decimal_places=2, default=0)
commission = 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 = 'Платеж'
verbose_name_plural = 'Платежи' verbose_name_plural = 'Платежи'
def calc_commission(self):
return self.amount * config.SERVICE_COMMISSION / 100
class CoursePayment(Payment): class CoursePayment(Payment):
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс') course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='Курс')
@ -72,9 +77,11 @@ class CoursePayment(Payment):
author=self.course.author, author=self.course.author,
amount=self.amount, amount=self.amount,
payment=self, payment=self,
commission=self.calc_commission(),
) )
else: else:
author_balance.amount = self.amount author_balance.amount = self.amount
author_balance.commission = self.calc_commission()
author_balance.save() author_balance.save()
@ -96,11 +103,3 @@ class SchoolPayment(Payment):
self.amount = month_price_sum self.amount = month_price_sum
super().save(*args, **kwargs) super().save(*args, **kwargs)
author_balance = getattr(self, 'authorbalance', None) 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()

@ -61,8 +61,15 @@ class User(AbstractUser):
user_data = dumps(user_data, ensure_ascii=False) user_data = dumps(user_data, ensure_ascii=False)
return user_data return user_data
@property
def balance(self): 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) @receiver(post_save, sender=User)

Loading…
Cancel
Save