diff --git a/CLAUDE.md b/CLAUDE.md index 20b6d7d..76e1794 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -451,6 +451,18 @@ preferred setup, because there is then no key to leak. **Never let the server ru `django-insecure-…` fallback from `config/settings.py`: that string is committed here, so anyone who can read this repo can forge a token for any user.** +## کافه‌بازار: اشتراک، تخفیفِ پویا، تمدیدِ خودکار — روی سرور از ۲۰۲۶-۱۰-۱۲ ۱۷:۵۴ (بک‌اند `8077ab4`، فرانت `fffdeac`) + +- **محصول‌های پیشخان** (پرسشِ API با توکنِ ساختگی، ۱۰۰۰۰–۱۰۶۹۹): فقط `10342`، `10343` (اشتراکِ ۹۰ روزه)، `10344` (۱۸۰ روزه)، + زیرِ `com.tadrisino.math.app`. سه‌ماهه و شش‌ماهه SKU گرفتند (`subscription.0014`)؛ `10342` نامعلوم است و به هیچ پلنی وصل + نیست. هیچ بسته‌ای در بازار نیست. اتصالِ سرور به بازار از راهِ OAuthِ حسابِ شرکت است (کلیدِ پیشخان نداریم). +- **مسیر** و تمدیدِ خودکار: `docs/operations.md` «فروش در کافه‌بازار». `BAZAAR_DYNAMIC_PRICE_KEY` در `.env` سرور است (بکاپ: + `.deploy-backups/env-before-bazaar-dynamic-20261012-175336`)؛ توکن فقط وقتی کدِ تخفیف قیمت را کم کرده می‌رود. +- **فرانت:** دو کاشیِ «کارتِ بانکی» و «کافه‌بازار» همیشه کنارِ هم؛ بازار جایی که ممکن نیست غیرفعال با دلیل. پلِ تازه + `bazaarBuy`؛ کلیدِ RSA و `versionCode` ۲ در `android/`. `compileDebugKotlin` سبز؛ **APK ساخته نشده**. +- **سنجیده:** ۹۷۹ تست؛ روی سایتِ زنده با دموی ۱۴ و پلِ اندرویدِ ساختگی در مرورگر: کاشی‌ها، و سرور SKUِ `10343`/«subscription» + را به اپ داد (سفارشِ ۱۴ بعد لغو شد). **نسنجیده:** هیچ خرید، JWT یا تمدیدِ واقعی در بازار؛ برابریِ قیمتِ پیشخان با ادمین. + ## جزیره‌های تمرینِ تازه و شکل در سوال — ۲۰۲۶-۱۰-۱۲ (عصر) - **۱۶۰ جزیره‌ی «تمرین: …»** آخرِ فصل‌های پایه‌های ۳ تا ۱۲، با **۱۳٬۶۸۹ سوالِ تازه** (کلِ `questions.json` ۱۸٬۵۲۲). هر جزیره ۳ تا ۶ درس دارد و هر درس diff --git a/subscription/migrations/0014_bazaar_skus_2026_10.py b/subscription/migrations/0014_bazaar_skus_2026_10.py index 8b66af8..58f9747 100644 --- a/subscription/migrations/0014_bazaar_skus_2026_10.py +++ b/subscription/migrations/0014_bazaar_skus_2026_10.py @@ -8,6 +8,7 @@ com.tadrisino.math.app شناخت (پرسشِ API با توکنِ ساختگی: پلن‌ها با مدت پیدا می‌شوند، نه با id (idها بین دیتابیس‌ها فرق دارند). اگر دقیقاً یک پلنِ فروشیِ هم‌مدت نباشد، migration می‌شکند تا دستی دیده شود؛ SKUی که ادمین از پیش گذاشته دست نمی‌خورد. """ +from django.core.cache import cache from django.db import migrations SKUS = {90: '10343', 180: '10344'} @@ -27,6 +28,9 @@ def forward(apps, schema_editor): continue plan.bazaar_sku = sku plan.save(update_fields=['bazaar_sku']) + # مدلِ تاریخیِ migration سیگنالِ post_save (subscription/receivers.py) را نمی‌زند؛ بی‌این فهرستِ پلن‌ها تا یک + # ساعت SKUی خالی نشان می‌داد (روی سرور دیده شد). کلید همان PLANS_CACHE_KEY است، کپی تا migration به view وابسته نشود. + cache.delete('subscription:plans:v3') def backward(apps, schema_editor):