"""دادهٔ اولیه: متن پیش‌فرض قالب‌های پیامک + علامت‌گذاری شمارهٔ اصلی از فیلدهای قدیمی. این مایگریشن idempotent است (get_or_create / update_if) و اجرای دوبارهٔ آن بی‌خطر است. """ from django.db import migrations DEFAULT_TEMPLATES = [ { "sms_type": "welcome", "title": "خوش‌آمدگویی", "offset_days": 0, "repeat_interval_days": None, "text": "{name} عزیز، از خرید شما سپاسگزاریم. به‌امید دیدار دوباره.", }, { "sms_type": "cheque_due", "title": "یادآوری سررسید چک", "offset_days": 2, "repeat_interval_days": None, "text": "{name} عزیز، {days} روز تا سررسید چک شما به مبلغ {amount_sep} ریال باقی مانده است. لطفاً نسبت به تأمین موجودی اقدام فرمایید.", }, { "sms_type": "nesiye_due", "title": "یادآوری سررسید نسیه", "offset_days": 2, "repeat_interval_days": None, "text": "{name} عزیز، {days} روز تا سررسید بدهی شما به مبلغ {amount_sep} ریال باقی مانده است.", }, { "sms_type": "cheque_registration", "title": "یادآوری تأمین موجودی چک", "offset_days": 2, "repeat_interval_days": 3, "text": "{name} عزیز، سررسید چک شما ({check_row}) نزدیک است. لطفاً موجودی بانکی حساب خود را تأمین فرمایید.", }, { "sms_type": "debt_due", "title": "یادآوری بدهی", "offset_days": 0, "repeat_interval_days": None, "text": "{name} عزیز، مبلغ {amount_sep} ریال بدهی شما باقی مانده است. لطفاً نسبت به تسویه اقدام فرمایید.", }, { "sms_type": "visit", "title": "یادآوری بازدید خدمات", "offset_days": 0, "repeat_interval_days": None, "text": "{name} عزیز، زمان بازدید دوره‌ای دستگاه شما فرا رسیده است. برای تعیین وقت با ما تماس بگیرید.", }, { "sms_type": "survey", "title": "نظرسنجی", "offset_days": 2, "repeat_interval_days": None, "text": "{name} عزیز، نظر شما دربارهٔ خدمات ما برایمان ارزشمند است. لطفاً در نظرسنجی شرکت فرمایید.", }, { "sms_type": "custom", "title": "پیام سفارشی", "offset_days": 0, "repeat_interval_days": None, "text": "", }, ] def seed_templates(apps, schema_editor): SMSTemplate = apps.get_model("admin_panel", "SMSTemplate") for item in DEFAULT_TEMPLATES: SMSTemplate.objects.get_or_create( sms_type=item["sms_type"], defaults={ "title": item["title"], "text": item["text"], "is_enabled": True, "offset_days": item["offset_days"], "repeat_interval_days": item["repeat_interval_days"], }, ) def unseed_templates(apps, schema_editor): SMSTemplate = apps.get_model("admin_panel", "SMSTemplate") SMSTemplate.objects.filter( sms_type__in=[t["sms_type"] for t in DEFAULT_TEMPLATES] ).delete() def backfill_primary_phones(apps, schema_editor): """اگر هیچ شمارهٔ اصلی‌ای ثبت نشده، شمارهٔ مطابق phone1 هر مشتری را اصلی می‌کند.""" Customer = apps.get_model("admin_panel", "Customer") PhoneNumber = apps.get_model("admin_panel", "PhoneNumber") for customer in Customer.objects.all(): if PhoneNumber.objects.filter(customer=customer, is_primary=True).exists(): continue phone1 = (customer.phone1 or "").strip() if not phone1: continue PhoneNumber.objects.filter(customer=customer, phone_number=phone1).update(is_primary=True) def noop(apps, schema_editor): pass class Migration(migrations.Migration): dependencies = [ ("admin_panel", "0057_sms"), ] operations = [ migrations.RunPython(seed_templates, unseed_templates), migrations.RunPython(backfill_primary_phones, noop), ]