Files
2026-08-24 15:54:08 +03:30

87 lines
4.2 KiB
Python

from django.conf import settings
from django.db import models
from django.utils.translation import gettext_lazy as _
from apps.banker.models import MessageTemplate
# برای آنلاین‌شاپ‌های کوچک: صاحب کسب‌وکار مراحل کارش را تعریف می‌کند (مثلا
# «آماده‌سازی» -> «بسته‌بندی» -> «ارسال» -> «تحویل»)، هر مرحله به یک قالب
# پیام (apps.banker.MessageTemplate) وصل است، و برای هر سفارش با زدن «مرحله‌ی
# بعد» یک پیامک خودکار از روی همان قالب برای مشتری آن سفارش می‌رود.
class OrderStage(models.Model):
id = models.CharField(max_length=36, primary_key=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="order_stages")
label = models.CharField(max_length=150, verbose_name=_("عنوان مرحله"))
template = models.ForeignKey(
MessageTemplate,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="order_stages",
verbose_name=_("قالب پیامک این مرحله"),
)
sort_order = models.PositiveIntegerField(default=0, verbose_name=_("ترتیب"))
requires_extra_input = models.BooleanField(
default=False, verbose_name=_("این مرحله به یک ورودی اضافه نیاز دارد")
)
extra_input_label = models.CharField(
max_length=100,
blank=True,
verbose_name=_("عنوان ورودی اضافه"),
help_text=_("مثلا: کد تسویه، کد محصول — وقتی سفارش به این مرحله می‌رسد از کاربر پرسیده می‌شود."),
)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = _("مرحله‌ی پیگیری سفارش")
verbose_name_plural = _("مراحل پیگیری سفارش")
ordering = ["sort_order"]
def __str__(self):
return self.label
class Order(models.Model):
id = models.CharField(max_length=36, primary_key=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="orders")
customer_name = models.CharField(max_length=150, verbose_name=_("نام مشتری"))
customer_phone = models.CharField(max_length=20, verbose_name=_("شماره مشتری"))
tracking_code = models.CharField(max_length=100, blank=True, verbose_name=_("کد پیگیری پستی"))
current_stage = models.ForeignKey(
OrderStage, on_delete=models.SET_NULL, null=True, blank=True, related_name="orders"
)
is_completed = models.BooleanField(default=False, verbose_name=_("تکمیل‌شده"))
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = _("سفارش")
verbose_name_plural = _("سفارش‌ها")
ordering = ["-updated_at"]
def __str__(self):
return f"{self.customer_name} ({self.customer_phone})"
class OrderStageLog(models.Model):
"""تاریخچه‌ی مراحل طی‌شده‌ی یک سفارش. عنوان مرحله و متن پیام همان لحظه
اسنپ‌شات می‌شود تا اگر بعدا مرحله ویرایش/حذف شد، تاریخچه دست‌نخورده بماند."""
id = models.CharField(max_length=36, primary_key=True)
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="stage_logs")
stage = models.ForeignKey(OrderStage, on_delete=models.SET_NULL, null=True, related_name="+")
stage_label = models.CharField(max_length=150, verbose_name=_("عنوان مرحله"))
message_body = models.TextField(blank=True, verbose_name=_("متن پیامک ارسالی"))
extra_input_value = models.CharField(max_length=255, blank=True, verbose_name=_("ورودی اضافه‌ی این مرحله"))
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = _("تاریخچه‌ی مرحله‌ی سفارش")
verbose_name_plural = _("تاریخچه‌ی مراحل سفارش")
ordering = ["created_at"]
def __str__(self):
return f"{self.order} — {self.stage_label}"