You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.6 KiB
103 lines
3.6 KiB
from django.db import models
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib.postgres.fields import HStoreField
|
|
from django.db.models import Avg
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from autoslug import AutoSlugField
|
|
|
|
# Create your models here.
|
|
from core.models import AbstractStatusModel, AbstractDateTimeModel
|
|
from products.models import Product
|
|
|
|
OFFER_STATUS_ACTIVE = 25
|
|
OFFER_STATUS_INACTIVE = 50
|
|
|
|
OFFER_STATUS_CHOICES = (
|
|
(OFFER_STATUS_ACTIVE, _('Активный')),
|
|
(OFFER_STATUS_INACTIVE, _('Неактивный'))
|
|
)
|
|
|
|
OFFER_DEFAULT_CHOICE = OFFER_STATUS_INACTIVE
|
|
|
|
|
|
class SupplyType(AbstractDateTimeModel):
|
|
name = models.CharField(max_length=255)
|
|
term = models.ValueRange()
|
|
|
|
|
|
class Offer(AbstractStatusModel):
|
|
product = models.OneToOneField(Product, on_delete=models.CASCADE, primary_key=True)
|
|
price = models.DecimalField(max_digits=8, decimal_places=2, null=True, default=0.00)
|
|
currency = models.CharField(max_length=64, blank=True, null=True, default=None)
|
|
with_nds = models.BooleanField(default=False)
|
|
# attributes = HStoreField(blank=True, null=True, default={})
|
|
suply_type = models.ForeignKey(SupplyType, on_delete=models.SET_NULL, blank=True, null=True)
|
|
note = models.TextField(blank=True, null=True)
|
|
status = models.SmallIntegerField(_('статус'), default=OFFER_DEFAULT_CHOICE, choices=OFFER_STATUS_CHOICES)
|
|
|
|
amount = models.IntegerField(blank=True, null=True)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
verbose_name = _('Позиция')
|
|
verbose_name_plural = _('Позиции')
|
|
|
|
|
|
# ------------------------------------------ Buying status --------------------------------------------------- #
|
|
BUYING_STATUS_IN_CART = 25
|
|
BUYING_STATUS_PENDING = 50
|
|
BUYING_STATUS_BOUGHT = 75
|
|
BUYING_STATUS_CHOICES = (
|
|
(BUYING_STATUS_IN_CART, _('В корзине')),
|
|
(BUYING_STATUS_PENDING, _('Обрабатываеться')),
|
|
(BUYING_STATUS_BOUGHT, _('Куплен'))
|
|
)
|
|
|
|
BUYING_DEFAULT_CHOICE = BUYING_STATUS_IN_CART
|
|
|
|
|
|
class Buying(AbstractStatusModel):
|
|
user = models.ForeignKey(get_user_model(), verbose_name=_('пользователь'), on_delete=models.CASCADE)
|
|
offer = models.ForeignKey(Offer, verbose_name=_('позиция'), on_delete=models.CASCADE)
|
|
status = models.SmallIntegerField(_('статус'), default=BUYING_DEFAULT_CHOICE, choices=BUYING_STATUS_CHOICES)
|
|
amount = models.SmallIntegerField(_('колличество'), default=0)
|
|
|
|
class Meta:
|
|
verbose_name = _('Покупка')
|
|
verbose_name_plural = _('Покупки')
|
|
|
|
|
|
STATUS_GAINED = 0
|
|
STATUS_SPENT = 100
|
|
CASHBACK_STATUS_CHOICES = (
|
|
(STATUS_GAINED, _('заработанный')),
|
|
(STATUS_SPENT, _('потраченный')),
|
|
)
|
|
|
|
STATUS_DEFAULT = STATUS_GAINED
|
|
|
|
|
|
class CashBackManager(models.Manager):
|
|
def get_gained_cashback_sum(self, user):
|
|
return self.get_queryset().filter(user=user, status=STATUS_GAINED).aggregate(Avg('amount'))
|
|
|
|
def get_spent_cashback_sum(self, user):
|
|
return self.get_queryset().filter(user=user, status=STATUS_SPENT).aggregate(Avg('amount'))
|
|
|
|
|
|
class BuyingCashback(AbstractDateTimeModel):
|
|
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
|
|
buying = models.OneToOneField(Buying, on_delete=models.CASCADE)
|
|
amount = models.DecimalField(_('Сумма'), 'cashback', 7, 2, default=0)
|
|
status = models.SmallIntegerField(_('статус'), default=STATUS_DEFAULT, choices=CASHBACK_STATUS_CHOICES)
|
|
|
|
objects = CashBackManager()
|
|
|
|
class Meta:
|
|
verbose_name_plural = _('cashback')
|
|
verbose_name = _('cashback')
|
|
|
|
|
|
|