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}"