""" فقط اشتراک (تصمیمِ سینیور، ۲۰۲۶-۱۰-۱۲): بسته‌های سوال از فروش برمی‌دارند، قیمت‌ها همان قیمتِ پیشخانِ بازار. - قیمت: یک‌ماهه ۵۹۸، سه‌ماهه ۸۹۸، شش‌ماهه ۱٬۳۹۸ هزار تومان (به گفته‌ی سینیور همان قیمتِ پیشخان؛ ما پیشخان را ندیده‌ایم). - سقفِ دستیار در روز: یک‌ماهه ۵، سه‌ماهه و شش‌ماهه ۳. حساب (docs/ai-cost-and-guardrails.md «اشتراک‌ها»): هر سوال ~۷۰۰ تومان (دستِ بالا)، و از هر خریدِ بازار پس از ارزشِ افزوده و سهمِ ۱۵٪ِ بازار ~۷۷٪ می‌رسد. اگر کسی هر روز کلِ سقف را بپرسد، هزینه‌ی دستیار ۲۳٪، ۲۷٪ و ۳۵٪ِ آن می‌شود. ادمین می‌تواند عوضش کند. - مزیت‌های کارت: دو خطِ ثابت؛ خطِ دستیار را فرانت از `aiDailyQuota` می‌سازد تا با سقفِ واقعی جدا نیفتد. - بسته‌ها on_sale=False، نه حذف: یک خریدِ واقعی (کاربرِ ۲۶) و اعتبارِ مانده‌اش به آن‌ها بسته است و بازپرداخت از سفارش می‌خواند. پلن‌ها با مدت پیدا می‌شوند (idها بین دیتابیس‌ها فرق دارند)؛ اگر دقیقاً یکی نباشد، migration می‌شکند. """ from django.core.cache import cache from django.db import migrations PLANS = {30: (598000, 5), 90: (898000, 3), 180: (1398000, 3)} FEATURES = ['همه‌ی فصل‌ها و جزیره‌ها باز', 'قلبِ نامحدود'] def forward(apps, schema_editor): Plan = apps.get_model('subscription', 'Plan') for days, (price, quota) in PLANS.items(): plans = list(Plan.objects.filter(kind='subscription', on_sale=True, duration_days=days)) if len(plans) != 1: raise RuntimeError(f'باید دقیقاً یک اشتراکِ فروشیِ {days} روزه باشد، {len(plans)} تا پیدا شد.') plan = plans[0] plan.price = price plan.ai_daily_quota = quota plan.features = FEATURES plan.save(update_fields=['price', 'ai_daily_quota', 'features']) Plan.objects.filter(kind='pack').update(on_sale=False) cache.delete('subscription:plans:v3') # migration سیگنالِ post_save را نمی‌زند (0014) class Migration(migrations.Migration): dependencies = [('subscription', '0015_bazaar_sku_monthly')] # بازگشت ندارد: قیمت و سقفِ قبلی تصمیمِ کهنه‌اند، نه حالتی که بخواهیم به آن برگردیم. operations = [migrations.RunPython(forward, migrations.RunPython.noop)]