123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- # coding=utf-8
- from django.db import models
- from django.db.models import Q
- from django.conf import settings
- from django.utils import timezone
- from apps.customer.models import Customer
- from apps.order.models import Order
- from apps.customer.models import SuperiorDistributor
- from utils.exceptions import CustomError
- '''
- 现金返利及现金变动记录
- '''
- class CashLog(models.Model):
- CASH_REBATE = 1
- TYPE_CHOICES = (
- (CASH_REBATE, u'现金返利'),
- )
- customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
- type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
- happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
- amount = models.BigIntegerField(verbose_name=u"变动额")
- balance = models.BigIntegerField(verbose_name=u"余额")
- class Meta:
- db_table = "cash_log"
- verbose_name = u'现金日志'
- ordering = ['-happen_time',]
- index_together = (
- 'happen_time',
- )
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(customer, type, amount):
- customer.balance += amount
- if customer.balance < 0:
- raise CustomError(u'用户余额不足!')
- customer.save()
- instance = CashLog.objects.create(
- customer=customer,
- type=type,
- happen_time=timezone.now(),
- amount=amount,
- balance=customer.balance
- )
- return instance
- class CashRebate(models.Model):
- order = models.ForeignKey(Order, verbose_name=u'订单', related_name='cash_rebate_order', editable=False, on_delete=models.PROTECT)
- ratio = models.FloatField(verbose_name=u'返利比例', default=0)
- amount = models.BigIntegerField(verbose_name=u'返利金额', default=0)
- customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
- create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
- class Meta:
- db_table = "cash_rebate"
- verbose_name = u'现金返利'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- class CashRebateLog(models.Model):
- rebate = models.OneToOneField(CashRebate, verbose_name=u'现金返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
- log = models.OneToOneField(CashLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
- class Meta:
- db_table = "cash_rebate_log"
- verbose_name = u'现金返利日志'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(rebate):
- customer = Customer.objects.select_for_update().filter(id=rebate.customer.id).first()
- log = CashLog.addnew(customer, CashLog.CASH_REBATE, rebate.amount)
- instance = CashRebateLog.objects.create(rebate=rebate, log=log)
- return instance
- '''
- 积分返利及积分变动记录
- '''
- class PointLog(models.Model):
- POINT_REBATE = 1
- POINT_ORDER = 2
- POINT_GIVE = 3
- POINT_CANCEL = 4
- TYPE_CHOICES = (
- (POINT_REBATE, u'积分返利'),
- (POINT_ORDER, u'积分兑换商品'),
- (POINT_GIVE, u'购买商品赠送积分'), # 购买商品赠送的积分
- (POINT_CANCEL, u'取消订单返还积分'), # 取消订单的时候将已扣除的积分返还
- )
- customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
- type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
- happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
- amount = models.IntegerField(verbose_name=u"变动额")
- balance = models.IntegerField(verbose_name=u"余额")
- class Meta:
- db_table = "point_log"
- verbose_name = u'积分日志'
- ordering = ['-happen_time',]
- index_together = (
- 'happen_time',
- )
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(customer, type, point):
- customer.points += point
- if customer.points < 0:
- raise CustomError(u'用户积分不足!')
- customer.save()
- instance = PointLog.objects.create(
- customer=customer,
- type=type,
- happen_time=timezone.now(),
- amount=point,
- balance=customer.points
- )
- return instance
- class PointRebate(models.Model):
- order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_rebate_order', editable=False, on_delete=models.PROTECT)
- ratio = models.FloatField(verbose_name=u'返利比例', default=0)
- amount = models.IntegerField(verbose_name=u'返利积分', default=0)
- customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
- create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
- class Meta:
- db_table = "point_rebate"
- verbose_name = u'积分返利'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- class PointGive(models.Model):
- order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_give_order', editable=False, on_delete=models.PROTECT)
- ratio = models.FloatField(verbose_name=u'赠送比例', default=0)
- amount = models.IntegerField(verbose_name=u'赠送积分', default=0)
- customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
- create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
- class Meta:
- db_table = "point_give"
- verbose_name = u'积分返利'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- class PointLogOrder(models.Model):
- order = models.ForeignKey(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
- log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='order_log', editable=False, on_delete=models.PROTECT)
- class Meta:
- db_table = "point_log_order"
- verbose_name = u'积分兑换日志'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(order, cancel_order=False):
- customer = Customer.objects.select_for_update().filter(id=order.customer.id).first()
- total_point = -order.total_point
- type = PointLog.POINT_ORDER
- if cancel_order:
- # 如果是作废订单就将订单积分加上去
- total_point = order.total_point
- type = PointLog.POINT_CANCEL
- log = PointLog.addnew(customer, type, total_point)
- instance = PointLogOrder.objects.create(order=order, log=log)
- return instance
- class PointRebateLog(models.Model):
- rebate = models.OneToOneField(PointRebate, verbose_name=u'积分返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
- log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
- class Meta:
- db_table = "point_log_rebate"
- verbose_name = u'积分返利日志'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(rebate):
- customer = Customer.objects.select_for_update().filter(id=rebate.customer.id).first()
- log = PointLog.addnew(customer, PointLog.POINT_REBATE, rebate.amount)
- instance = PointRebateLog.objects.create(rebate=rebate, log=log)
- return instance
- class PointGiveLog(models.Model):
- give = models.OneToOneField(PointGive, verbose_name=u'赠送积分', related_name='give', editable=False, on_delete=models.PROTECT)
- log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='give_log', editable=False, on_delete=models.PROTECT)
- class Meta:
- db_table = "point_log_give"
- verbose_name = u'赠送积分日志'
- ordering = []
- index_together = ()
- default_permissions = ()
- permissions = []
- @staticmethod
- def addnew(give):
- customer = Customer.objects.select_for_update().filter(id=give.customer.id).first()
- log = PointLog.addnew(customer, PointLog.POINT_GIVE, give.amount)
- instance = PointGiveLog.objects.create(give=give, log=log)
- return instance
|