# توضیحات جدید بیزینس - 2025-12-08

**تاریخ دریافت**: 2025-12-08  
**وضعیت**: نیاز به تطبیق با کد و داکیومنت موجود  
**منبع**: توضیحات شفاهی از صاحب پروژه

---

## 1️⃣ فعال‌سازی کاربر و نمایش لینک معرفی

### قوانین فعال‌سازی:
کاربر زمانی می‌تواند **لینک معرفی** خود را ببیند که:
- ✅ وام خود را از **دایا** گرفته باشه
- ✅ یا **پرداخت مستقیم 56 میلیون تومان** انجام داده باشه

### عضویت باشگاه مشتریان (الزامی):
در هر دو حالت بالا:
1. کاربر **اجباراً** باید عضو باشگاه مشتریان بشه
2. دیالوگ باشگاه مشتریان و امضای قرارداد **الزامی** است
3. **تا زمانی که این کار انجام نشه** → لینک معرفی نمایش داده نمی‌شود

### فرآیند:
```
کاربر ثبت نام می‌کنه
     ↓
پرداخت 56M (دایا یا مستقیم)
     ↓
دیالوگ باشگاه مشتریان (الزامی) ← امضای قرارداد
     ↓
لینک معرفی نمایش داده می‌شود
```

---

## 2️⃣ محاسبه تعادل (Balance) شبکه

### قانون اصلی:
**هر نود شبکه = یک تعادل**

```
تعداد تعادل = MIN(دست راست، دست چپ)
```

### حالت عادی (زیر 300 تعادل):
- اگر دست راست = 200 نفر و دست چپ = 150 نفر
  - ✅ تعادل = MIN(200, 150) = **150 امتیاز**
  - ✅ باقیمانده راست = 200 - 150 = **50** → برای هفته بعد

### حالت بالای 300 تعادل (سقف):
اگر مجموع کاربران جفت دست یک نفر **بیشتر از 600 نفر** باشد:

#### مثال:
```
دست راست = 600 نفر
دست چپ = 400 نفر
```

**مرحله 1: محاسبه تعادل اولیه**
- تعادل = MIN(600, 400) = 400

**مرحله 2: محاسبه باقیمانده اولیه**
- باقیمانده راست = 600 - 400 = 200 → **می‌رود برای هفته بعد**

**مرحله 3: اعمال سقف 300**
- چون تعادل (400) > 300 → فقط **300 امتیاز** حساب می‌شود
- از دست راست: 100 نفر فلش می‌شود
- از دست چپ: 100 نفر فلش می‌شود
- **مجموع 200 نفر فلش می‌شود** (دیگه هیچ جا حساب نمی‌شن)

**نتیجه نهایی:**
- امتیاز این هفته: **300**
- باقیمانده راست برای هفته بعد: **200** (این مجزا از فلش است)
- فلش شده (از بین رفته): **200** (100 چپ + 100 راست)

### نکته مهم:
> باقیمانده‌ای که از هفته قبل می‌آید **فلش نمی‌شود**، فقط اضافه‌ای که بزرگتر از 300 تعادل است فلش می‌شود.

---

## 3️⃣ محاسبه تعادل بازگشتی (Recursive Balance)

### قانون مهم:
**هر نفر تعداد تعادل‌هاش فقط برای خودش حساب می‌شه**

### مثال درخت:
```
        کاربر 1
        /      \
   کاربر 2    کاربر 3
   /      \
کاربر 4  کاربر 5
```

### محاسبات:
1. **کاربر 2**:
   - جذب کرده: کاربر 4 و کاربر 5
   - تعادل کاربر 2 = MIN(1, 1) = **1 تعادل**

2. **کاربر 1**:
   - دست راست: کاربر 2 = 1 نفر
   - دست چپ: کاربر 3 = 1 نفر
   - تعادل کاربر 1 = MIN(1, 1) = **1 تعادل**

### ⚠️ نکته کلیدی:
**کاربر 1 پورسانت کاربر 4 و 5 را نمی‌گیرد!**

چرا؟ چون:
- کاربر 3 کسی را جذب نکرده
- برای اینکه کاربر 1 از تعادل کاربر 4 و 5 بهره‌مند شود
- کاربر 3 حتماً باید **دو نفر** جذب کند

### مثال تصحیح شده:
```
        کاربر 1
        /      \
   کاربر 2    کاربر 3
   /      \    /      \
کاربر 4  5  کاربر 6  7
```

حالا:
- کاربر 3: تعادل = MIN(1, 1) = 1
- کاربر 2: تعادل = MIN(1, 1) = 1
- **کاربر 1**: تعادل = MIN(2, 2) = **2 تعادل** ✅

---

## 4️⃣ ارزش امتیاز و توزیع کمیسیون

### فرمول:
```
ارزش هر امتیاز = (مجموع مبلغ صندوق) ÷ (تعداد کل تعادل‌ها)
```

### مبلغ صندوق:
هر کاربری که 56 میلیون تومان واریز می‌کند:
- **25 میلیون تومان** وارد صندوق می‌شود

### مثال محاسبه:
```
صندوق هفته = 175 میلیون تومان (7 نفر × 25M)
مجموع تعادل‌های سیستم = 50 امتیاز

ارزش هر امتیاز = 175,000,000 ÷ 50 = 3,500,000 ریال
```

اگر یک کاربر **5 تعادل** داشته باشد:
```
کمیسیون = 5 × 3,500,000 = 17,500,000 ریال
```

---

## 5️⃣ حذف خودکار کاربران غیرفعال (Worker جدید مورد نیاز)

### قانون:
کاربری که تا **2 هفته** بعد از ثبت نام:
- ❌ وام دایا را نگرفته
- ❌ 56 میلیون تومان مستقیم واریز نکرده

→ **به صورت اتوماتیک حذف می‌شود**

### Worker مورد نیاز:
```csharp
// نام پیشنهادی: DeleteInactiveUsersWorker
// زمان اجرا: روزانه یک بار (مثلاً 3 صبح)

شبه‌کد:
1. کاربرانی که CreatedAt < (Now - 14 روز)
2. IsActive == false (یعنی نه دایا گرفته، نه پرداخت مستقیم)
3. ClubMembershipId == null
4. حذف کاربر
5. آزاد کردن جایگاه در شبکه برای معرف
```

### هدف:
- معرفی که این کاربر را جذب کرده بود، یکی از دست‌هایش آزاد می‌شود
- می‌تواند **کاربر جدید** جذب کند
- امکان **تعادل متعادل** دست چپ و راست فراهم می‌شود

---

## 6️⃣ محدودیت تعداد زیرمجموعه

### قانون سخت:
**هر کاربر فقط 2 نفر می‌تواند جذب کند** (دست چپ + دست راست)

### سناریو خطا:
```
کاربر A: دو نفر زیرمجموعه فعال دارد
کاربر B: با کد معرف کاربر A ثبت نام می‌کند

→ ❌ پیغام خطا:
"این کاربر تعداد زیرمجموعه‌هاش پر شده و شما نمی‌تونید جزو زیرمجموعه این آدم بشید"
```

### نکته:
**فعال** یعنی:
- وام دایا گرفته یا پرداخت مستقیم کرده
- عضو باشگاه مشتریان شده

---

## 7️⃣ فرآیند کامل ثبت نام تا فعال‌سازی

```
1. ثبت نام با کد معرف
   ↓
2. بررسی ظرفیت معرف (حداکثر 2 نفر)
   ↓ (اگر پر بود → خطا)
   ↓
3. درخواست وام دایا یا پرداخت مستقیم (56M)
   ↓
4. تأیید پرداخت 56M
   ↓
5. شارژ کیف پول‌ها:
   - کیف پول اصلی: +56M
   - کیف پول تخفیفی: +56M
   ↓
6. **دیالوگ الزامی باشگاه مشتریان**
   - امضای قرارداد
   - تخصیص 25M به صندوق
   ↓
7. کاربر فعال می‌شود
   ↓
8. لینک معرفی نمایش داده می‌شود
   ↓
9. ورود به فرآیند محاسبه کمیسیون هفتگی
```

---

## 8️⃣ خرید از فروشگاه‌ها

### دو نوع فروشگاه:

1. **فروشگاه اصلی**:
   - از کیف پول اصلی کسر می‌شود

2. **فروشگاه تخفیفی** (باشگاه مشتریان):
   - از کیف پول تخفیفی کسر می‌شود
   - به مقداری که تخفیف دارد

---

## 9️⃣ جمع‌بندی تعادل و فلش

### سناریو کامل:

```
هفته 1:
- چپ = 500، راست = 600
- تعادل = MIN(500, 600) = 500

چون 500 > 300:
- امتیاز این هفته = 300
- فلش چپ = 500 - 300 = 200
- فلش راست = 600 - 300 = 300
- جمع فلش = 500 (از بین رفت)
```

### قوانین فلش:
1. ❌ باقیمانده‌ای که از هفته قبل می‌آید فلش **نمی‌شود**
2. ✅ فقط اضافه‌ای که بزرگتر از 300 است فلش می‌شود
3. ✅ هر دو طرف (چپ و راست) فلش می‌شوند
4. ❌ **نمی‌تواند** فقط یک طرف فلش شود

### مثال فلش:
```
هفته قبل باقیمانده راست = 200
هفته جدید راست = 400
مجموع راست = 600

سقف = 300
فلش راست = 600 - 300 = 300 ✅ (نه 200)
```

---

## 🔟 نکات مهم اضافی

### چرخش هفتگی:
- محاسبات هر هفته صورت می‌گیرد
- تعادل‌های استفاده شده **ریست** می‌شوند
- فقط **باقیمانده** به هفته بعد منتقل می‌شود
- فلش‌ها **هیچ جا حساب نمی‌شوند**

### محدودیت‌های عمق شبکه:
- **تا همه کاربرها** در زیر شبکه حساب می‌شوند
- **بدون محدودیت عمق** (تا سطح آخر درخت)

### اولویت محاسبه:
1. محاسبه تعادل اولیه
2. محاسبه باقیمانده
3. اعمال سقف 300
4. محاسبه فلش
5. ذخیره باقیمانده برای هفته بعد

---

## 📊 جدول مقایسه حالات مختلف

| چپ | راست | تعادل اولیه | سقف 300 | امتیاز | باقی چپ | باقی راست | فلش کل |
|-----|-------|-------------|---------|--------|---------|-----------|---------|
| 200 | 250 | 200 | 200 | 200 | 0 | 50 | 0 |
| 400 | 350 | 350 | 300 | 300 | 100 | 50 | 100 |
| 500 | 600 | 500 | 300 | 300 | 200 | 300 | 400 |
| 150 | 280 | 150 | 150 | 150 | 0 | 130 | 0 |
| 350 | 350 | 350 | 300 | 300 | 50 | 50 | 100 |

**توضیح ستون‌ها:**
- **تعادل اولیه**: MIN(چپ، راست)
- **سقف 300**: MIN(تعادل اولیه، 300)
- **امتیاز**: همان سقف 300 (امتیاز نهایی)
- **باقی چپ**: چپ - سقف چپ (300)
- **باقی راست**: راست - سقف راست (300)
- **فلش کل**: (چپ - 300) + (راست - 300) اگر > 0

---

## ✅ وضعیت پیاده‌سازی فعلی

این سند نیاز به **تطبیق کامل** با:
1. ✅ کد موجود در `CalculateWeeklyBalancesCommandHandler`
2. ✅ داکیومنت‌های موجود در `totalDoc/01-BUSINESS/`
3. ✅ Entity ها در Domain Layer
4. ✅ Worker های پس‌زمینه

→ در مرحله بعد مقایسه و شناسایی تفاوت‌ها انجام می‌شود.
