11 KiB
توضیحات جدید بیزینس - 2025-12-08
تاریخ دریافت: 2025-12-08
وضعیت: نیاز به تطبیق با کد و داکیومنت موجود
منبع: توضیحات شفاهی از صاحب پروژه
1️⃣ فعالسازی کاربر و نمایش لینک معرفی
قوانین فعالسازی:
کاربر زمانی میتواند لینک معرفی خود را ببیند که:
- ✅ وام خود را از دایا گرفته باشه
- ✅ یا پرداخت مستقیم 56 میلیون تومان انجام داده باشه
عضویت باشگاه مشتریان (الزامی):
در هر دو حالت بالا:
- کاربر اجباراً باید عضو باشگاه مشتریان بشه
- دیالوگ باشگاه مشتریان و امضای قرارداد الزامی است
- تا زمانی که این کار انجام نشه → لینک معرفی نمایش داده نمیشود
فرآیند:
کاربر ثبت نام میکنه
↓
پرداخت 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
محاسبات:
-
کاربر 2:
- جذب کرده: کاربر 4 و کاربر 5
- تعادل کاربر 2 = MIN(1, 1) = 1 تعادل
-
کاربر 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 مورد نیاز:
// نام پیشنهادی: 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️⃣ خرید از فروشگاهها
دو نوع فروشگاه:
-
فروشگاه اصلی:
- از کیف پول اصلی کسر میشود
-
فروشگاه تخفیفی (باشگاه مشتریان):
- از کیف پول تخفیفی کسر میشود
- به مقداری که تخفیف دارد
9️⃣ جمعبندی تعادل و فلش
سناریو کامل:
هفته 1:
- چپ = 500، راست = 600
- تعادل = MIN(500, 600) = 500
چون 500 > 300:
- امتیاز این هفته = 300
- فلش چپ = 500 - 300 = 200
- فلش راست = 600 - 300 = 300
- جمع فلش = 500 (از بین رفت)
قوانین فلش:
- ❌ باقیماندهای که از هفته قبل میآید فلش نمیشود
- ✅ فقط اضافهای که بزرگتر از 300 است فلش میشود
- ✅ هر دو طرف (چپ و راست) فلش میشوند
- ❌ نمیتواند فقط یک طرف فلش شود
مثال فلش:
هفته قبل باقیمانده راست = 200
هفته جدید راست = 400
مجموع راست = 600
سقف = 300
فلش راست = 600 - 300 = 300 ✅ (نه 200)
🔟 نکات مهم اضافی
چرخش هفتگی:
- محاسبات هر هفته صورت میگیرد
- تعادلهای استفاده شده ریست میشوند
- فقط باقیمانده به هفته بعد منتقل میشود
- فلشها هیچ جا حساب نمیشوند
محدودیتهای عمق شبکه:
- تا همه کاربرها در زیر شبکه حساب میشوند
- بدون محدودیت عمق (تا سطح آخر درخت)
اولویت محاسبه:
- محاسبه تعادل اولیه
- محاسبه باقیمانده
- اعمال سقف 300
- محاسبه فلش
- ذخیره باقیمانده برای هفته بعد
📊 جدول مقایسه حالات مختلف
| چپ | راست | تعادل اولیه | سقف 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
✅ وضعیت پیادهسازی فعلی
این سند نیاز به تطبیق کامل با:
- ✅ کد موجود در
CalculateWeeklyBalancesCommandHandler - ✅ داکیومنتهای موجود در
totalDoc/01-BUSINESS/ - ✅ Entity ها در Domain Layer
- ✅ Worker های پسزمینه
→ در مرحله بعد مقایسه و شناسایی تفاوتها انجام میشود.