Question packs removed at the root; all subscriptions 4 assistant questions a day; Bazaar is subscription-only

- subscription.0017/0018, payment.0013: pack plans deleted, QuestionCredit/HeartsPass models and Plan.kind /
  question_credits / hearts_days / Order.question_credits / hearts_days dropped. The only paid pack order was the
  company owner's test account (user 26).
- Assistant: no credit spending; quota is the daily cap only (free 2, every plan 4, gift subscription 4).
- Bazaar: verify_purchase is subscription-only (no inapp guess), start/purchase responses lose productType,
  verify refuses an order without a subscription. A paid order with no subscription now logs ERROR.
- Removed POST /api/payment/orders (internal; no caller). Its permission tests stay.
- Pack-based tests rewritten on subscriptions (refund, security, Bazaar token); pack-only test files deleted.
- docs: profit table for 4/day on both payment routes plus free users; handbook, operations, CLAUDE.md current.
949 tests green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-12 20:33:38 +03:30
parent 9c3adc3e60
commit 947f946909
39 changed files with 398 additions and 1174 deletions

View File

@@ -456,14 +456,17 @@ anyone who can read this repo can forge a token for any user.**
- **محصول‌های پیشخان** (پرسشِ API با توکنِ ساختگی، ۱۰۰۰۰–۱۰۶۹۹): فقط `10342` (یک‌ماهه، تأییدِ سینیور)، `10343` (۹۰ روزه)،
`10344` (۱۸۰ روزه)، زیرِ `com.tadrisino.math.app`؛ هر سه روی پلن‌ها (`subscription.0014`، `0015`). بسته‌ها دیگر فروخته نمی‌شوند. اتصالِ سرور به بازار از راهِ OAuthِ حسابِ شرکت است (کلیدِ پیشخان نداریم).
- **روش‌های پرداخت** در `payment/providers.py` (Strategy + factory)؛ تأییدِ خودِ پرداخت (کال‌بک/verify) عمداً بیرونش.
- **فقط اشتراک** (`subscription.0016`، سینیور): یک/سه/شش‌ماهه ۵۹۸/۸۹۸/۱٬۳۹۸ هزار تومان (= پیشخانِ بازار به گفته‌ی
سینیور)، سقفِ دستیار ۵/۳/۳ در روز؛ حساب در `docs/ai-cost-and-guardrails.md` «اشتراک‌ها». بسته‌ها `on_sale=False`
(کاربرِ ۲۶ یک بسته‌ی پرداخت‌شده و ۲۰ سوال اعتبار دارد). هر کارتِ خرید مزیت‌ها و سقفِ دستیار را خودش می‌گوید.
- **فقط اشتراک؛ بسته‌ی سوال از ریشه حذف شد** (`subscription.0016`–`0018`، `payment.0013`؛ مالک و سینیور): مدل‌های
`QuestionCredit`/`HeartsPass`، `Plan.kind`، خرجِ اعتبار در دستیار، مسیرِ تک‌خریدِ بازار (`inapp`/consume) و
`POST /api/payment/orders` (داخلی، بی‌مصرف‌کننده) رفتند. تنها سفارشِ پرداخت‌شده‌ی بسته مالِ حسابِ آزمایشیِ صاحبِ شرکت
(کاربرِ ۲۶) بود. یک/سه/شش‌ماهه ۵۹۸/۸۹۸/۱٬۳۹۸ هزار تومان (= پیشخانِ بازار به گفته‌ی سینیور)، سقفِ دستیار ۴ در روز برای
همه (و اشتراکِ هدیه‌ی بی‌پلن)؛ رایگان ۲. جدولِ سود در `docs/ai-cost-and-guardrails.md` «اشتراک‌ها».
- **مسیر** و تمدیدِ خودکار: `docs/operations.md` «فروش در کافه‌بازار». `BAZAAR_DYNAMIC_PRICE_KEY` در `.env` سرور است (بکاپ:
`.deploy-backups/env-before-bazaar-dynamic-20261012-175336`)؛ توکن فقط وقتی کدِ تخفیف قیمت را کم کرده می‌رود.
- **فرانت:** دو کاشیِ «کارتِ بانکی» (پیش‌فرض) و «کافه‌بازار» همیشه کنارِ هم؛ بازار جایی که ممکن نیست غیرفعال با دلیل.
داخلِ اپ قیمتِ پیشخان از Poolakey (`bazaarPrices`) روی کاشیِ بازار. پلِ `bazaarBuy`؛ کلیدِ RSA و `versionCode` ۲ در
`android/`. `compileDebugKotlin` سبز؛ **APK ساخته نشده**.
هر کارتِ اشتراک مزیت‌ها و سقفِ دستیار را می‌گوید؛ تبِ فروشگاه «اشتراک». داخلِ اپ قیمتِ پیشخان از Poolakey
(`bazaarPrices(skusJson)`) روی کاشیِ بازار. پلِ `bazaarBuy(sku, orderId, dynamicPriceToken)` فقط `subscribeProduct`؛ کلیدِ
RSA و `versionCode` ۲ در `android/`. `compileDebugKotlin` سبز؛ **APK ساخته نشده**.
- **سنجیده:** ۹۷۹ تست؛ روی سایتِ زنده با دموی ۱۴ و پلِ اندرویدِ ساختگی در مرورگر: کاشی‌ها، و سرور SKUِ `10343`/«subscription»
را به اپ داد (سفارشِ ۱۴ بعد لغو شد). **نسنجیده:** هیچ خرید، JWT یا تمدیدِ واقعی در بازار؛ برابریِ قیمتِ پیشخان با ادمین.