Files
hossein-por-shop/backend/order/models.py
T
Parsa Nazer d440a3e8a6 test payment
2025-03-15 01:51:44 +03:30

125 lines
4.9 KiB
Python

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
from azbankgateways.models.banks import Bank
class DiscountCode(models.Model):
code = 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.code
class Meta:
verbose_name = 'کد تخفیف'
verbose_name_plural = 'کد های تخفیف'
def is_valid(self):
return self.expiration_date > timezone.now() and self.quantity > 0
def not_valid_reason(self):
if self.expiration_date > timezone.now() and self.quantity > 0:
return 'این کد معتبر میباشد'
elif not self.expiration_date > timezone.now():
return 'تایم کد تخفیف تمام شده'
elif not self.quantity > 0:
return 'این کد تخفیف تمام شده است'
else:
print('log later bug')
class OrderModel(models.Model):
objects = jmodels.jManager()
STATUS_CHOICES = [
('CART', 'در سبد خرید'),
('ADMIN_PENDING', 'در انتظار تایید'),
('PENDING', 'درحال پردازش'),
('POSTED', 'ارسال شده'),
('RECEIVED', 'تحویل شده'),
('CANCELED', 'لغو شده'),
('REFUNDED', 'مرجوع شده'),
]
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="وضعیت سفارش")
discount = models.BigIntegerField(null=True, blank=True, verbose_name='کل تخقیف')
tax = models.BigIntegerField(null=True, blank=True, verbose_name='مالیات')
final_price = models.BigIntegerField(null=True, blank=True, verbose_name='قیمت نهایی')
cart_total = models.BigIntegerField(null=True, blank=True, verbose_name='کل سبد خرید')
bank_records = models.ManyToManyField(Bank, max_length=100, verbose_name='رکورد بانکی', null=True, blank=True)
def __str__(self):
return f'سفارش: {self.id}'
class Meta:
verbose_name = 'سفارش'
verbose_name_plural = 'سفارشات'
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 discount(self):
# total_with_item_discount = sum(item.total_with_discount() for item in self.items.all())
# discount_percent = self.discount_code.percent
# return total_with_item_discount * ((100 - discount_percent) / 100)
pass
def tax(self):
return self.total_without_tax() * 0.2
def total(self):
pass
# return self.total_with_discount() + self.tax()
def final_price(self):
pass
def submit_cart(self):
pass
class OrderItemModel(models.Model):
order = models.ForeignKey(OrderModel, on_delete=models.CASCADE, related_name='items', verbose_name='سفارش')
quantity = models.PositiveSmallIntegerField(verbose_name="تعداد")
price = models.PositiveIntegerField(verbose_name='قیمت', blank=True, null=True)
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.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})'