Files
shopship/apps/billing/migrations/0003_seed_feature_plans.py
T
2026-09-04 13:05:54 +03:30

72 lines
3.5 KiB
Python

from django.db import migrations
# داده‌ی پایه‌ی فروشگاه — ابزارها، پلن‌های قیمتی، و بسته‌های جم.
#
# این seed قبلا در یک مهاجرتِ جداگانه بود که همراهِ بقیه‌ی فایل‌های مهاجرت
# از دست رفت. نبودش دقیقا همان باگی است که کافه‌بازار گزارش کرد: وقتی هیچ
# FeaturePlan ای در دیتابیس نباشد، اندپوینت features/ لیستِ خالی می‌دهد،
# اپ برای هر ابزار isFeatureActive=false می‌گیرد و پیغام «این ابزار فعال
# نیست» را نشان می‌دهد — حتی در دوره‌ی آزمایشی و حتی بعد از خرید جم.
#
# دو ابزار عمدا رایگان‌اند (is_free=True): «مشتریان» و «دفتر درآمد و هزینه».
# طبق قوانین انتشار کافه‌بازار باید بخشی از امکانات پیش از هر خریدی
# در دسترس باشد؛ این دو، هسته‌ی دفترداریِ اپ‌اند و بدون آن‌ها بقیه‌ی
# ابزارها هم معنی نمی‌دهند، پس بهترین گزینه برای رایگان‌بودن‌اند.
# هر وقت خواستی می‌توانی از پنل ادمین (ریزاپ‌های قابل‌فعال‌سازی → ستون
# «رایگان») این ترکیب را عوض کنی، بدون نیاز به مهاجرت تازه.
FEATURES = [
# (key, name, is_free, [(months, gem_price), ...])
("customers", "مشتریان", True, []),
("ledger", "دفتر درآمد و هزینه", True, []),
("invoice", "فاکتور", False, [(1, 1000), (3, 2700), (6, 5000)]),
("sms_bank", "پیام گروهی", False, [(1, 1200), (3, 3200), (6, 6000)]),
("inventory", "انبارداری", False, [(1, 800), (3, 2200), (6, 4000)]),
("orders", "پیگیری سفارش", False, [(1, 900), (3, 2400), (6, 4500)]),
]
GEM_PACKS = [
# (sku, name, gems, sort)
("gem_pack_500", "۵۰۰ جم", 500, 1),
("gem_pack_1200", "۱۲۰۰ جم", 1200, 2),
("gem_pack_3000", "۳۰۰۰ جم", 3000, 3),
]
def seed(apps, schema_editor):
FeaturePlan = apps.get_model("billing", "FeaturePlan")
FeaturePlanTier = apps.get_model("billing", "FeaturePlanTier")
GemPack = apps.get_model("billing", "GemPack")
for key, name, is_free, tiers in FEATURES:
feature, _ = FeaturePlan.objects.update_or_create(
key=key,
defaults={"name": name, "is_free": is_free, "is_purchasable": not is_free},
)
for months, price in tiers:
FeaturePlanTier.objects.update_or_create(
feature=feature, duration_months=months, defaults={"gem_price": price}
)
for sku, name, gems, sort_order in GEM_PACKS:
GemPack.objects.update_or_create(
bazaar_sku=sku,
defaults={"display_name": name, "gem_amount": gems, "sort_order": sort_order, "is_active": True},
)
def unseed(apps, schema_editor):
FeaturePlan = apps.get_model("billing", "FeaturePlan")
GemPack = apps.get_model("billing", "GemPack")
FeaturePlan.objects.filter(key__in=[f[0] for f in FEATURES]).delete()
GemPack.objects.filter(bazaar_sku__in=[g[0] for g in GEM_PACKS]).delete()
class Migration(migrations.Migration):
dependencies = [
("billing", "0002_featureplan_is_free"),
]
operations = [migrations.RunPython(seed, unseed)]