from django.db import models from account.models import User, UserAddressModel, PushSubscription from product.models import ProductModel, ProductVariant, ProductImageModel from django.utils import timezone from .execptions import DiscountNotAvailableError from django_jalali.db import models as jmodels class DiscountCode(models.Model): name = models.CharField(max_length=50, verbose_name='کد تخفیف') percent = models.DecimalField(max_digits=4, decimal_places=2, verbose_name='درصد') quantity = models.PositiveIntegerField(verbose_name='تعداد') expiration_date = models.DateTimeField(verbose_name='تاریخ انقضا') def __str__(self): return self.name class Meta: verbose_name = 'کد تخفیف' verbose_name_plural = 'کد های تخفیف' def is_valid(self): return self.expiration_date > timezone.now() and self.quantity > 0 class OrderModel(models.Model): objects = jmodels.jManager() STATUS_CHOICES = [ ('CART', 'در سبد خرید'), ('ADMIN_PENDING', 'در انتظار تایید'), ('PENDING', 'درحال پردازش'), ('POSTED', 'ارسال شده'), ('RECEIVED', 'تحویل شده'), ('CANCELED', 'لغو شده'), ('BACK', 'مرجوع شده'), ] user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='orders', verbose_name='کاربر') address = models.ForeignKey(UserAddressModel, on_delete=models.SET_NULL, related_name='orders', null=True, verbose_name='ادرس') created_at = jmodels.jDateField(blank=True, null=True, verbose_name="تاریخ ثبت سفارش") is_paid = models.BooleanField(default=False, verbose_name="وضعیت پرداخت") discount_code = models.ForeignKey(DiscountCode, on_delete=models.PROTECT, null=True, blank=True, verbose_name="کدتخفیف") status = models.CharField(max_length=20, choices=STATUS_CHOICES, verbose_name="وضعیت سفارش") def __str__(self): return f'سفارش: {self.id}' class Meta: verbose_name = 'سفارش' verbose_name_plural = 'سفارشات' # def total_without_tax(self): # return sum(item.total() for item in self.items.all()) def save(self, *args, **kwargs): try: push_object = PushSubscription.objects.get(user=self.user) except: print('object not found') try: push_object.send_notif(f'سفارش شما به {self.get_status_display()} تغییر کرد', f'سفارش شما به {self.get_status_display()} تغییر کرد', ProductImageModel.objects.all().first().image.url) except: print('didnt send') super().save(*args, **kwargs) def total_with_discount(self): total_with_item_discount = sum(item.total_with_discount() for item in self.items.all()) if self.discount_code: if not self.discount_code.is_valid(): raise DiscountNotAvailableError('این کد تخفیف دیگر معتبر نیست') discount_percent = self.discount_code.percent return total_with_item_discount * ((100 - discount_percent) / 100) return total_with_item_discount def tax(self): return self.total_without_tax() * 0.2 def total(self): return self.total_with_discount() + self.tax() def remove_order_item(self, item_pk, quantity): pass def add_order_item(self, item_pk, quantity): status = '' return status def clear_cart(self): pass class OrderItemModel(models.Model): order = models.ForeignKey(OrderModel, on_delete=models.CASCADE, related_name='items', verbose_name='سفارش') quantity = models.SmallIntegerField(verbose_name="تعداد") product = models.ForeignKey(ProductVariant, on_delete=models.PROTECT, verbose_name="محصول") class Meta: verbose_name = 'ایتم سبد خرید' verbose_name_plural = 'ایتم های سبد خرید' def total(self): return self.quantity * self.product.get_toman_price() def total_with_discount(self): return self.quantity * self.product.get_toman_price_after_discount() def __str__(self): return f'({self.product}) - ({self.order.user})'