116 lines
4.4 KiB
Python
116 lines
4.4 KiB
Python
"""دادهٔ اولیه: متن پیشفرض قالبهای پیامک + علامتگذاری شمارهٔ اصلی از فیلدهای قدیمی.
|
|
|
|
این مایگریشن 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),
|
|
]
|