# مرحله ۱۱ — برداشت وجه و تطبیق حساب: خلاصه

## معماری
`withdrawal_requests` هم مثل `wallet_trades` (مرحله ۱۰) روی همون دیتابیس مالی (MySQL) ساخته شد، نه SQLite — چون باید بتونه توی همون تراکنش Atomic که موجودی رو چک می‌کنه شرکت کنه. همون فلسفه‌ی «رزرو، نه برداشت فوری» ادامه پیدا کرد: ثبت درخواست برداشت **هیچ اثری روی Ledger نداره**، فقط status رو می‌ذاره روی `pending`؛ مبلغ در محاسبه‌ی «قفل‌شده» لحاظ می‌شه (که حالا هم معاملات باز مرحله ۱۰ رو حساب می‌کنه هم برداشت‌های در جریان رو). Ledger فقط لحظه‌ی **پرداخت نهایی** واقعاً تغییر می‌کنه.

## ۱۱.۱ درخواست برداشت
کاربر → کیف پول → «📤 برداشت از کیف پول» → مبلغ → مقصد (کارت/کیف‌پول) → تأیید. مبلغ فوراً (توی همون تراکنش Atomic با قفل ردیف حساب) از «موجودی در دسترس» کم می‌شه — دقیقاً طبق چک‌لیست ردیف ۱.

## ۱۱.۲ تایید ادمین + Dual Approval
- **زیر ۵٬۰۰۰٬۰۰۰ تومان** (قابل تغییر در `WithdrawEngine::DUAL_APPROVAL_THRESHOLD`): یه تایید کافیه، بلافاصله پرداخت نهایی می‌شه.
- **بالای این سقف**: تایید اول فقط status رو به `approved1` می‌بره و اطلاعش به بقیه‌ی ادمین‌ها می‌ره. باید یه ادمین **دیگه** (نه همونی که اول تایید کرد) هم تایید کنه تا واقعاً پرداخت بشه. اگه همون ادمین اول دوباره بزنه، پیام روشن می‌گیره که باید یه ادمین دیگه تایید کنه — دقیقاً طبق چک‌لیست ردیف ۴.
- رد در هر مرحله، بدون نیاز به دومین تایید، ممکنه.

## ۱۱.۲ (رد) — چون هیچ‌وقت Ledger عوض نشده بود
رد کردن یعنی صرفاً status می‌ره روی `rejected` و همون لحظه از فرمول «قفل‌شده» بیرون میفته — یعنی خودبه‌خود «آزاد» می‌شه، بدون نیاز به یه تراکنش Ledger جبرانی. کاربر پیام روشن می‌گیره که مبلغ برگشت.

## ۱۱.۳ Reconciliation شبانه (اسکریپت جدا، `reconcile-ledger.php`)
یه اسکریپت CLI جدید که هر شب با cron اجرا می‌شه:
1. مجموع کل Ledger (روی همه‌ی کاربرها) رو حساب می‌کنه.
2. با موجودی واقعی حساب بانکی/صرافی کسب‌وکار (که چون به هیچ API بانکی متصل نیستیم، **شما باید هر روز دستی توی `bank-balance.txt` بنویسید**) مقایسه می‌کنه.
3. اگه اختلاف بیشتر از ۱٬۰۰۰ تومان (فقط برای گرد کردن) بود، **مستقیم یه پیام تلگرام واقعی به هر دو ادمین می‌فرسته** — نه فقط لاگ بی‌صدا، دقیقاً طبق تاکید چک‌لیست.

راه‌اندازی روی VPS:
```
cp bank-balance.txt.example bank-balance.txt
# هر روز قبل از اجرای cron، عدد واقعی موجودی رو توی همین فایل بذارید
crontab -e
0 4 * * * php /path/to/reconcile-ledger.php >> /path/to/reconcile.log 2>&1
```

## ۱۱.۴ تاریخچه‌ی کامل و صورت‌حساب
- صفحه‌ی کیف‌پول حالا درخواست‌های برداشت **در جریان** (حتی قبل از نهایی‌شدن) رو هم نشون می‌ده، با وضعیت دقیق («در انتظار بررسی» یا «نیمه‌تاییدشده، منتظر ادمین دوم»).
- دکمه‌ی «📄 دریافت صورت‌حساب کامل»: یه فایل متنی شامل **همه‌ی** رویدادهای مالی (واریز، کارمزد معامله، سود/زیان معامله، برداشت) با شناسه، زمان، مبلغ و موجودی بعدش، مستقیم از Ledger — به‌عنوان فایل قابل‌دانلود تلگرام ارسال می‌شه.

## وضعیت چک‌لیست
- [x] درخواست برداشت فوری از موجودی در دسترس کم می‌شه.
- [x] Dual Approval برای مبالغ بالا، با جلوگیری از تایید دوباره‌ی همون ادمین.
- [x] رد کردن = آزادسازی خودکار، بدون تراکنش جبرانی.
- [x] Reconciliation واقعاً هشدار تلگرام می‌فرسته، نه فقط لاگ.
- [x] صورت‌حساب کامل شامل هر ۴ نوع تراکنش مالی.

## ⚠️ نیاز به تصمیم/تست شما
1. **آستانه‌ی Dual Approval** (۵ میلیون تومان) یه عدد پیش‌فرضه — بگید اگه می‌خواید عوضش کنم.
2. **مقصد برداشت** فعلاً فقط متن آزاد (شماره کارت/آدرس) ذخیره می‌شه، بدون اعتبارسنجی واقعی شماره کارت — پرداخت واقعی (شبا/کارت‌به‌کارت) همچنان دستیه، دقیقاً مثل واریز.
3. **`reconcile-ledger.php`** رو حتماً روی سرور واقعی، با یه عدد تستی توی `bank-balance.txt`، امتحان کنید تا مطمئن بشید پیام تلگرام واقعاً می‌رسه.
4. یه برداشت تست کامل (هم زیر سقف، هم بالای سقف با دو ادمین واقعی) قبل از باز کردن این فیچر برای کاربر واقعی.

## فایل‌های تحویلی
- `traderpro.php` — به‌روزرسانی‌شده.
- `reconcile-ledger.php` — اسکریپت Reconciliation شبانه.
- `bank-balance.txt.example` — نمونه‌ی فایل موجودی واقعی.
