# مرحله ۱۵ — Mini App و تست نهایی جامع: خلاصه

آخرین مرحله. علاوه بر ساخت Mini App، یه دور بازبینی واقعی روی کل محصول انجام شد — که یه باگ Fatal پیدا کرد.

## 🔴 مهم‌ترین یافته‌ی این مرحله: یک باگ کشنده

حین بررسی کامل بودن ترجمه‌ها، یه چیزی پیدا شد که **باعث می‌شد ربات اصلاً بالا نیاد**:

```php
'btn_more_features' => '🧰 Qo'shimcha imkoniyatlar',
                              ↑ اینجا رشته نصفه بسته می‌شه
```

آپاستروف داخل کلمه‌ی ازبکی «Qo'shimcha»، رشته‌ی تک‌کوتیشن PHP رو زودتر می‌بسته و بقیه‌ی خط به‌عنوان کد تفسیر می‌شده → **PHP Parse Error**، یعنی ربات روی سرور حتی استارت نمی‌خورد.

این باگ رو **من خودم در مرحله ۴ وارد کرده بودم** و ۱۱ مرحله زنده مونده بود. رفع شد (تبدیل به دابل‌کوتیشن). چون بررسی‌های قبلی من روی «تعداد کلیدها» تمرکز داشتن نه «صحت نحوی»، این از دستم در رفته بود.

**برای اینکه دوباره تکرار نشه**، اسکریپت `preflight.php` رو ساختم که `php -l` رو روی همه‌ی فایل‌ها اجرا می‌کنه. **قبل از هر آپلود اجراش کنید.**

## یافته‌ی دوم: ۱۲ کلید ترجمه در ۱۹ زبان جا افتاده بود

کلیدهای دستیار هوشمند (`ai_welcome`, `ai_error` و…) فقط فارسی و انگلیسی داشتن — یعنی یه ادمین آلمانی‌زبان، متن فارسی می‌دید. این از قبلِ پروژه بود، نه از مراحل من. هر ۱۲ کلید برای هر ۱۹ زبان ترجمه و اضافه شد.

**نتیجه‌ی نهایی: هر ۲۱ زبان دقیقاً ۴۵۵ کلید دارن، بدون حتی یک مورد کم.**

## ۱۵.۱ — Mini App
یک فایل HTML خودکفا (`miniapp/index.html`) با ۵ صفحه‌ی اصلی که ۱۰ صفحه‌ی خواسته‌شده در ۱۴.۱۱ رو پوشش می‌دن:

- **داشبورد** — موجودی + نمودار زنده (TradingView Lightweight Charts) + پوزیشن‌های باز
- **معامله** — قیمت لحظه‌ای + دکمه‌های خرید/فروش + پوزیشن‌ها
- **کیف‌پول** — موجودی/در دسترس/قفل‌شده + تاریخچه‌ی تراکنش
- **تاریخچه** — معاملات بسته‌شده با سود/زیان
- **پروفایل + تنظیمات**

هر صفحه حالت خالی و حالت خطای طراحی‌شده‌ی خودش رو داره (مرحله ۸، نسخه‌ی گرافیکی).

**یک تصمیم امنیتی که باید بدونید:** Mini App هیچ عملیات مالی‌ای انجام نمی‌ده. دکمه‌های واریز/برداشت/معامله، اپ رو می‌بندن و کاربر رو به خود ربات برمی‌گردونن، جایی که همون تأییدهای مراحل ۹ تا ۱۲ اعمال می‌شه. `api.php` هم کاملاً فقط‌خواندنیه. دلیل: کاهش سطح حمله — یه باگ در جاوااسکریپت سمت کلاینت نباید بتونه به پول دست بزنه.

داده‌ای که اپ موقع بسته‌شدن می‌فرسته (`web_app_data`) به‌عنوان **ورودی غیرقابل‌اعتماد** با آن رفتار می‌شه: فقط تعیین می‌کنه کدوم صفحه باز بشه، هرگز به‌عنوان دستور مالی.

## ۱۴.۰۹ — انیمیشن‌ها (که از مرحله ۱۴ موکول شده بود)
- Skeleton به‌جای اسپینر خام
- چشمک قیمت — **فقط پس‌زمینه چشمک می‌زنه، خودِ رقم ثابت می‌مونه** (چک‌لیست: هیچ انیمیشنی نباید خوندن عدد مالی رو مختل کنه)
- تیک موفقیت ساده، ترنزیشن ۱۸۰ms، نبض روی وضعیت قطع اتصال
- همه زیر ۳۰۰ms؛ همه با `prefers-reduced-motion` خاموش می‌شن

## ۱۵.۳ — تست مالی جامع
`test-financial-full.php` که این‌ها رو خودکار تست می‌کنه:

- **چرخه‌ی کامل**: واریز → ۳ معامله‌ی هم‌زمان → بستن با سود/زیان → تطبیق موجودی با محاسبه‌ی مستقل
- **تست بار**: ۲۰ پردازه‌ی **واقعاً هم‌زمان** (نه شبیه‌سازی‌شده) که روی یک حساب معامله باز می‌کنن. چک می‌کنه هیچ به‌روزرسانی گم نشه و Over-commit رخ نده
- **حالت‌های لبه**: موجودی صفر، خرج از حساب صفر، برداشت دقیقاً برابر کل موجودی، یک واحد بیشتر، و ۵ بار تکرار همون Idempotency key
- **تطبیق نهایی**: ستون `balance_after` هر ردیف باید با جمع تجمعی بخونه

اسکریپت با `chat_id` مصنوعی (۹۰۰۰۰۰۰۰۱+) کار می‌کنه و آخرش همه‌ی ردپاش رو پاک می‌کنه.

## بررسی‌هایی که همین‌جا انجام شدن و پاس شدن
- ✅ صحت نحوی هر ۱۱ فایل PHP
- ✅ هر ۲۱ زبان، ۴۵۵ کلید کامل
- ✅ هر ۳۸۰ کلید `Lang::t` تعریف دارن
- ✅ هیچ TODO/FIXME باقی نمونده (چک‌لیست صریح مرحله ۱۵)
- ✅ هیچ توکن/کلیدی داخل کد نیست
- ✅ رنگ‌ها بین `brand.php` و CSS هم‌خوان، هر ۸ کنتراست WCAG پاس

## ⚠️ چیزهایی که فقط شما می‌تونید انجام بدید
تست‌های زیر نیاز به سرور واقعی، تلگرام واقعی و گوشی واقعی دارن:
1. اجرای هر ۴ اسکریپت تست روی VPS
2. **باز کردن `qa-output/` و نگاه کردن با چشم**
3. Mini App روی یک iOS و یک Android واقعی
4. یک چرخه‌ی مالی واقعی با مبلغ کم
5. تست بازیابی بکاپ

چک‌لیست کامل امضا در `README.md` بسته‌ی نهایی هست.
