Files
docs/99-ARCHIVE/REMAINING-TASKS-OLD-2024-12-02.md
T
masoodafar-web 119e870a26 feat: Complete overhaul of FourSat documentation structure and content
- Added FINAL-STATUS.md detailing project completion and key metrics
- Created QUICK-REFERENCE.md for quick access to essential documents
- Updated README.md with project overview and quick start guide
- Established STRUCTURE.md outlining the final documentation structure
- Organized and archived old files, ensuring a clean and efficient directory
- Enhanced documentation quality with comprehensive metrics and checklists
2025-12-04 17:32:31 +03:30

1557 lines
48 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# کارهای باقی‌مانده - پروژه FourSat
**⚠️ توجه: این فایل منسوخ شده است**
**📄 فایل جدید (تجمیع کامل):**
👉 **[REMAINING-TASKS-CONSOLIDATED.md](REMAINING-TASKS-CONSOLIDATED.md)** 👈
فایل جدید شامل:
- ✅ تجمیع کامل تسک‌های CMS
- ✅ تجمیع کامل تسک‌های BackOffice.BFF
- ✅ تجمیع کامل تسک‌های BackOffice UI
- ✅ تجمیع کامل تسک‌های FrontOffice.BFF
- ✅ تجمیع کامل تسک‌های FrontOffice UI
- ✅ اولویت‌بندی دقیق
- ✅ تخمین زمان واقعی
- ✅ جزئیات کامل هر تسک
**تاریخ به‌روزرسانی**: 1403/09/11 (2024-12-02)
---
## 📊 خلاصه سریع (برای مراجعه سریع)
### 🔴 اولویت فوری:
1. **Payment Gateway Integration** (70% → 100%) - 1 هفته
2. **CRUD های اضافی** (Tag, Product Bulk, Order) - 3 روز
3. **Manual Payment System** - 2 روز
### 🟡 اولویت متوسط:
4. **VAT System** - 2 روز
5. **Public Messages** - 1 روز
### 🟢 اولویت پایین:
6. **RBAC (Role-Based Access)** - 1.5 هفته
7. **Club Shop** - 2 هفته (موکول شده)
### 📋 BackOffice UI (منتظر CMS):
- صفحه مدیریت تراکنش‌ها - 2 روز
- نمایش VAT - 1 روز
- Menu Filtering (RBAC) - 1 روز
- Public Messages UI - 1 روز
- Manual Payment UI - 1 روز
- Withdrawal Reports - 2 روز
### 📱 FrontOffice (آخرین اولویت):
- FrontOffice.BFF APIs - 2 هفته
- FrontOffice UI Pages - 3 هفته
**زمان کل**: 9 هفته (45 روز کاری)
---
**برای جزئیات کامل، لطفاً به [REMAINING-TASKS-CONSOLIDATED.md](REMAINING-TASKS-CONSOLIDATED.md) مراجعه کنید.**
---
## 🎯 اولویت‌بندی توسعه
### مسیر پیشنهادی:
```
1️⃣ CMS (Microservice/Backend)
→ تکمیل کامل تمام APIها و Business Logic
→ ✅ داکیومنت کامل هر تغییر
2️⃣ BackOffice.BFF (Gateway مدیریت)
→ تطبیق با تغییرات CMS
→ اضافه کردن Handlerهای جدید
→ ✅ داکیومنت یکپارچه‌سازی
3️⃣ BackOffice (Admin UI)
→ تطبیق با BFF
→ پیاده‌سازی صفحات جدید
→ ✅ داکیومنت UI Components
4️⃣ FrontOffice.BFF (Gateway مشتری)
→ پیاده‌سازی APIهای مشتری
5️⃣ FrontOffice (Customer UI)
→ رابط کاربری نهایی
```
### ⚠️ قانون طلایی: داکیومنت همزمان
-**بعد از هر تسک**: داکیومنت آپدیت شود
-**قبل از commit**: مقایسه داکیومنت با کد
-**هر feature**: داکیومنت Business Logic
-**هر API**: داکیومنت Request/Response
-**هر تغییر**: داکیومنت در `implementation-progress.md`
---
## 📊 خلاصه وضعیت
### ✅ تکمیل شده (7 فاز)
- Domain Layer
- Club Membership
- Binary Network Tree
- **Commission & Worker (MVP)**
- Protobuf gRPC Services
- History & Configuration
- Database Migration & Seed Data
### 🟡 نیمه‌کامل (1 فاز)
- Withdrawal & Settlement (40%)
### ❌ شروع نشده (4 فاز/ویژگی)
- Club Shop & Product Integration
- Testing (موکول شده)
- **🆕 سیستم مالیات بر ارزش افزوده (VAT)**
- **🆕 مدیریت نقش‌ها و دسترسی‌ها (RBAC)**
---
## 🆕 ویژگی‌های جدید اضافه شده
### 🧾 سیستم مالیات بر ارزش افزوده (VAT System)
**اولویت**: 🟡 متوسط | **زمان**: 2 روز
**توضیح**:
یک فیلد ساده `VatPercentage` که در سفارشات ذخیره و در سمت مشتری (FrontOffice) نمایش داده می‌شود.
**شامل**:
- فیلد `VatPercentage` در Entity سفارش
- مقدار پیش‌فرض در Configuration (مثلاً 10%)
- نمایش در UI مشتری: "شامل 10% مالیات بر ارزش افزوده"
---
### 🔐 مدیریت نقش‌ها و دسترسی‌ها (RBAC)
**اولویت**: 🟡 متوسط | **زمان**: 1.5 هفته
**توضیح**:
سیستم کنترل دسترسی مبتنی بر نقش (Role-Based Access Control) با 3 نقش اصلی:
1. **SuperAdmin** (سوپر ادمین):
- دسترسی کامل به تمام بخش‌ها
- مدیریت کاربران و نقش‌ها
- تنظیمات سیستم
2. **Admin** (ادمین):
- دسترسی به اکثر بخش‌ها
- مدیریت محتوا و سفارشات
- بدون دسترسی به تنظیمات حساس
3. **Inspector** (بازرس):
- **فقط مشاهده** (Read-Only)
- **بدون هیچ عملیات ویرایش/حذف/ایجاد**
- دسترسی محدود به:
* ✅ Dashboard
* ✅ گزارش‌ها
* ✅ مشاهده سفارشات
* ✅ مشاهده درخت شبکه
* ❌ تنظیمات
* ❌ مدیریت کاربران
* ❌ عملیات مالی
**پیاده‌سازی**:
- استخراج نقش از JWT Token در Frontend
- محدودسازی منوها بر اساس نقش
- غیرفعال کردن دکمه‌ها و فیلدها برای Inspector
- Authorization در Backend APIs
- صفحه مدیریت نقش‌ها (فقط SuperAdmin)
---
## 🏗️ تسک‌های هر سرویس (به ترتیب اولویت)
### 1️⃣ CMS (Microservice) - اولویت اول
**مرجع کامل**: `totalDoc/CMS-API-COVERAGE.md` (مقایسه دقیق CMS vs BFF)
#### 🔴 فاز 1: Transaction System - 3 روز
**وضعیت**: 0% - **ضروری برای Launch**
**توضیح**: سیستم تراکنش‌های مالی برای **دریافت نتیجه پرداخت از Gateway** و ادامه عملیات در CMS
**⚠️ نکته مهم - جریان پرداخت**:
```
1. User کلیک "خرید پکیج" در CMS
2. CMS: CreateTransaction (Status: Pending, RefId)
3. Redirect به Gateway/PYMS با RefId
4. Gateway: اتصال به بانک → پرداخت
5. Gateway: Callback به CMS با RefId + نتیجه
6. CMS: VerifyTransaction → تایید + فعال‌سازی
```
**خلاصه**: درگاه اینترنتی در Gateway/PYMS است. CMS فقط **نتیجه را دریافت** و **عملیات بعدی (فعال‌سازی، اضافه PV، Wallet) را انجام** می‌دهد.
**تسک‌ها در CMS**:
- [ ] Proto: `transactions.proto` موجود است ✅
- [ ] Entity: Transaction (با فیلدهای ReferenceId, Amount, Status, Gateway)
- [ ] Commands:
- [ ] CreateTransactionCommand
- [ ] VerifyTransactionCommand (callback از درگاه)
- [ ] RefundTransactionCommand
- [ ] Queries:
- [ ] GetTransactionQuery
- [ ] GetAllTransactionsByFilterQuery
- [ ] GetTransactionByReferenceQuery
- [ ] GetUserTransactionsQuery
- [ ]**داکیومنت**: `CMS/payment-gateway-integration.md`
**تأثیر روی سایر سرویس‌ها**:
- BackOffice.BFF: 7 Handler جدید
- TransactionHandler (CRUD)
- VerifyPaymentHandler
- RefundHandler
- GetUserTransactionsHandler
- BackOffice: صفحات جدید
- لیست تراکنش‌ها (با فیلتر)
- جزئیات تراکنش
- عملیات Refund
**سطوح دسترسی**:
- SuperAdmin: همه عملیات + Refund ✅
- Admin: مشاهده تراکنش‌ها (بدون Refund) ✅
- Inspector: فقط مشاهده ✅
---
#### 🟡 فاز 2: Shopping Cart System - 2 روز
**وضعیت**: 0%
**توضیح**: سیستم سبد خرید برای مدیریت سبدهای کاربران
**تسک‌ها در CMS**:
- [ ] Proto: `usercarts.proto` موجود است ✅
- [ ] Commands:
- [ ] AddToCartCommand
- [ ] UpdateCartItemCommand
- [ ] RemoveFromCartCommand
- [ ] ClearCartCommand
- [ ] MergeCartCommand (مهمان → لاگین)
- [ ] Queries:
- [ ] GetUserCartQuery
- [ ] GetAllCartsQuery (برای مدیریت)
- [ ]**داکیومنت**: `CMS/shopping-cart-system.md`
**تأثیر روی سایر سرویس‌ها**:
- BackOffice.BFF: 6 Handler جدید
- BackOffice: صفحه مدیریت سبدهای خرید (مشاهده سبدهای فعال)
**سطوح دسترسی**:
- SuperAdmin: مشاهده + پاک کردن سبدهای متروکه ✅
- Admin: مشاهده سبدها ✅
- Inspector: فقط مشاهده ✅
---
#### 🟡 فاز 3: Products & Orders تکمیل - 2 روز
**وضعیت**: 70% (ناقص)
**توضیح**: تکمیل APIهای محصولات و سفارشات
**تسک‌ها در CMS**:
**Products (Tags)**:
- [ ] Proto: `tag.proto`, `producttag.proto` موجود است ✅
- [ ] Commands:
- [ ] CreateTagCommand
- [ ] UpdateTagCommand
- [ ] DeleteTagCommand
- [ ] AssignTagToProductCommand
- [ ] Queries:
- [ ] GetAllTagsQuery
- [ ] GetProductsByTagQuery
**Products (Bulk)**:
- [ ] BulkUpdateProductsCommand (به‌روزرسانی دسته‌ای قیمت/موجودی)
- [ ] GetLowStockProductsQuery (هشدار کم موجودی)
- [ ] ToggleProductStatusCommand (فعال/غیرفعال)
**Orders**:
- [ ] CancelOrderCommand
- [ ] UpdateOrderStatusCommand
- [ ] GetOrdersByDateRangeQuery
- [ ] ApplyDiscountToOrderCommand
- [ ] CalculateOrderPVQuery
**تأثیر روی سایر سرویس‌ها**:
- BackOffice.BFF: 12 Handler جدید
- BackOffice: صفحات
- مدیریت Tags
- به‌روزرسانی دسته‌ای محصولات
- لغو سفارش
- اعمال تخفیف
**سطوح دسترسی**:
- SuperAdmin: همه عملیات ✅
- Admin: همه عملیات محصولات/سفارشات ✅
- Inspector: فقط مشاهده ✅
---
#### 🟡 فاز 4: Public Messages System - 1 روز
**وضعیت**: 0%
**توضیح**: سیستم اعلانات عمومی برای اطلاع‌رسانی به کاربران
**تسک‌ها در CMS**:
- [ ] Proto: `public_messages.proto` موجود است ✅
- [ ] Commands:
- [ ] CreatePublicMessageCommand
- [ ] UpdatePublicMessageCommand
- [ ] DeletePublicMessageCommand
- [ ] PublishMessageCommand
- [ ] ArchiveMessageCommand
- [ ] Queries:
- [ ] GetAllPublicMessagesQuery
- [ ] GetPublicMessageQuery
- [ ] GetActiveMessagesQuery
- [ ]**داکیومنت**: `CMS/public-messages-system.md`
**تأثیر روی سایر سرویس‌ها**:
- BackOffice.BFF: 6 Handler جدید
- BackOffice: صفحات
- لیست اعلانات
- ایجاد/ویرایش اعلان
- انتشار اعلان
**سطوح دسترسی**:
- SuperAdmin: همه عملیات ✅
- Admin: Create, Update, Publish ✅
- Inspector: فقط مشاهده ✅
---
#### 🟡 فاز 5: سیستم مالیات (VAT) - 2 روز
**وضعیت**: 0%
(بدون تغییر - قبلاً مستند شده)
---
#### 🟡 فاز 6: سیستم RBAC (1.5 هفته)
**وضعیت**: 0%
(بدون تغییر - قبلاً مستند شده)
---
#### 🟢 فاز 7: فروشگاه باشگاه (2 هفته)
**وضعیت**: 0%
(بدون تغییر - قبلاً مستند شده)
---
#### 🟢 فاز 8: Contracts (اختیاری) - 2 روز
**وضعیت**: 0%
**توضیح**: مدیریت قراردادهای عضویت/خرید خاص
**تسک‌ها در CMS**:
- [ ] Proto: `contract.proto`, `usercontract.proto` موجود است ✅
- [ ] Commands: Create, Update, Delete, Assign, Revoke
- [ ] Queries: GetAll, Get, GetUserContracts
- [ ]**داکیومنت**: `CMS/contracts-system.md`
**اولویت**: فقط در صورت نیاز بیزینسی
---
### 2️⃣ BackOffice.BFF (Gateway) - اولویت دوم
**منتظر تکمیل CMS**:
- [ ] PaymentHandler (بعد از CMS فاز 1)
- [ ] OrderVatHandler (بعد از CMS فاز 2)
- [ ] AuthorizationHandler (بعد از CMS فاز 3)
- [ ]**داکیومنت**: هر Handler در `cms-integration.md`
---
### 3️⃣ BackOffice (Admin UI) - اولویت سوم
**منتظر تکمیل BFF**:
- [ ] صفحه مدیریت تراکنش‌ها
- [ ] نمایش VAT در لیست سفارشات
- [ ] Menu filtering بر اساس Role
- [ ]**داکیومنت**: هر صفحه در `development-plan.md`
---
### 4️⃣ FrontOffice.BFF (Gateway مشتری) - اولویت چهارم
**تسک‌های اصلی**:
- [ ] Authentication APIs
- [ ] Order APIs
- [ ] Profile APIs
- [ ]**داکیومنت**: `FrontOffice.BFF/README.md`
---
### 5️⃣ FrontOffice (Customer UI) - اولویت پنجم
**تسک‌های اصلی**:
- [ ] صفحه ثبت‌نام/ورود
- [ ] پروفایل کاربری
- [ ] سبد خرید (با نمایش VAT)
- [ ]**داکیومنت**: `FrontOffice/README.md`
---
## 🔴 اولویت بالا (High Priority) - CMS
### 1. تکمیل درگاه پرداخت (Phase 10) - 1 هفته
**وضعیت**: 70% تکمیل ✅
#### ✅ انجام شده:
- Commands: RequestWithdrawal, ProcessWithdrawal, ApproveWithdrawal, RejectWithdrawal
- Database: UserCommissionPayout, CommissionPayoutHistory
- ProcessedBy tracking (مدیر تأییدکننده)
-**IPaymentGatewayService Interface** - یکپارچه‌سازی با درگاه‌های پرداخت
-**MockPaymentGatewayService** - Mock برای تست محیط Development
-**DayaPaymentService** (Skeleton) - آماده برای API واقعی دایا
-**ProcessWithdrawalCommandHandler** - یکپارچه با Payment Gateway
- روش Diamond: شارژ کیف پول تخفیف ✅
- روش BankTransfer: فراخوانی ProcessPayoutAsync ✅
- Error Handling: وضعیت PaymentFailed ✅
- Logging: ثبت موفقیت/خطا ✅
-**Entity Updates**:
- BankReferenceId, BankTrackingCode, PaymentFailureReason در UserCommissionPayout
- PaymentFailed در CommissionPayoutStatus Enum
#### ❌ باقی‌مانده (30%):
1. **یکپارچه‌سازی با درگاه پرداخت واقعی** (2-3 روز)
- پیاده‌سازی DayaPaymentService با API واقعی
- تست تراکنش‌های واقعی
- مدیریت callback و webhook
2. **رابط کاربری مدیریت (BackOffice)** (2 روز)
- صفحه لیست درخواست‌های برداشت
- دکمه‌های تأیید/رد
- نمایش جزئیات تراکنش (BankReferenceId, TrackingCode)
- نمایش وضعیت PaymentFailed و دلیل
- فیلترینگ و جستجو
3. **گزارش‌های مالی** (2 روز)
- گزارش روزانه/هفتگی/ماهانه
- خروجی Excel/PDF
- نمودارهای مالی
- آمار تجمیعی
**تخمین زمان باقی‌مانده**: 6-7 روز کاری
---
### 2. تنظیمات Production (30 دقیقه)
**وضعیت**: نیاز به تنظیم دستی
#### کارهای مورد نیاز:
**الف. تنظیم Email (Gmail)**
1. ورود به Google Account Security
2. فعال‌سازی 2-Step Verification
3. ایجاد App Password
4. کپی پسورد 16 رقمی
5. آپدیت `appsettings.Production.json`:
```json
"Email": {
"SmtpUsername": "foursat@gmail.com",
"SmtpPassword": "xxxx xxxx xxxx xxxx"
}
```
**ب. تنظیم SMS (کاوه‌نگار)**
1. ثبت‌نام در [Kavenegar.com](https://kavenegar.com)
2. کپی API Key از پنل
3. دریافت شماره Sender
4. آپدیت `appsettings.Production.json`:
```json
"Sms": {
"KavenegarApiKey": "YOUR_API_KEY",
"Sender": "10008663"
}
```
**ج. تنظیم Connection String**
```json
"ConnectionStrings": {
"DefaultConnection": "Server=PRODUCTION_SERVER;Database=Foursat_CMS;..."
}
```
**تخمین زمان**: 30 دقیقه
---
## 🟡 اولویت متوسط (Medium Priority)
### 3. فروشگاه باشگاه (Phase 9) - 2 هفته
**وضعیت**: 0% (شروع نشده)
#### ویژگی‌های مورد نیاز:
1. **کاتالوگ محصولات** (2 روز)
- لیست پکیج‌های عضویت
- قیمت‌گذاری (1 ماهه، 3 ماهه، 6 ماهه، سالانه)
- تخفیف‌های خرید چندماهه
- نمایش ویژگی‌ها
2. **سبد خرید** (2 روز)
- افزودن به سبد
- ویرایش تعداد
- محاسبه تخفیف
- پیش‌نمایش قیمت نهایی
3. **فرآیند خرید** (3 روز)
- اتصال به درگاه پرداخت
- تأیید پرداخت
- فعال‌سازی خودکار عضویت
- ارسال رسید به ایمیل/SMS
4. **یادآوری تمدید** (2 روز)
- کرون‌جاب بررسی انقضا
- ارسال SMS/Email 30 روز قبل
- ارسال یادآوری 7 روز قبل
- ارسال پیام انقضا
5. **پنل مدیریت** (3 روز)
- مدیریت محصولات
- تنظیم قیمت‌ها و تخفیف‌ها
- گزارش فروش
- آمار تمدیدها
**تخمین زمان کل**: 2 هفته کاری
---
## 🟢 اولویت پایین (Low Priority)
### 4. تست‌نویسی (Phase 7) - موکول شده
**وضعیت**: 0% (Postponed)
#### انواع تست مورد نیاز:
1. **Unit Tests** (1 هفته)
- تست logic محاسبات کمیسیون
- تست Binary Tree placement
- تست Commands/Queries
- تست Validators
- Coverage حداقل 70%
2. **Integration Tests** (3 روز)
- تست gRPC endpoints
- تست Database transactions
- تست Background Worker
- تست Notification Service
3. **Load Testing** (2 روز)
- تست همزمانی Background Worker
- تست تعداد کاربران زیاد در Binary Tree
- تست حجم بالای درخواست‌های API
- بررسی Memory Leaks
**تخمین زمان کل**: 2 هفته کاری
**توصیه**: بعد از launch اولیه انجام شود
---
## ⚙️ بهبودهای اختیاری (Optional Enhancements)
### 5. Redis Distributed Locks
**زمان نیاز**: زمانی که سیستم روی چند سرور deploy شود
**مزایا**:
- جلوگیری از اجرای همزمان Background Worker روی چند سرور
- قفل توزیع‌شده برای تراکنش‌های بحرانی
**پیاده‌سازی**:
```bash
dotnet add package StackExchange.Redis
dotnet add package DistributedLock.Redis
```
---
### 6. Sentry Error Tracking
**زمان نیاز**: 1 ساعت
**مراحل**:
1. ثبت‌نام در [Sentry.io](https://sentry.io)
2. دریافت DSN
3. آپدیت `appsettings.json`:
```json
"Monitoring": {
"SentryEnabled": true,
"SentryDsn": "https://xxx@sentry.io/yyy"
}
```
---
### 7. Slack Notifications
**زمان نیاز**: 30 دقیقه
**مراحل**:
1. ایجاد Slack App
2. ایجاد Incoming Webhook
3. آپدیت `appsettings.json`:
```json
"Monitoring": {
"SlackEnabled": true,
"SlackWebhookUrl": "https://hooks.slack.com/services/..."
}
```
**کاربرد**: دریافت alert در صورت خطا در Background Worker
---
### 8. Firebase Cloud Messaging (Push Notifications)
**زمان نیاز**: 2 روز
**مراحل**:
1. ثبت پروژه در Firebase Console
2. دریافت Server Key
3. نصب `FirebaseAdmin` package
4. پیاده‌سازی PushNotificationService
5. افزودن FCM Token به User entity
6. ارسال notification همزمان با Email/SMS
---
### 9. سیستم مالیات بر ارزش افزوده (VAT System) - ساده
**زمان نیاز**: 2 روز
**وضعیت**: 0% (شروع نشده)
**توضیح**: فقط یک فیلد `VatPercentage` که روی سفارش نمایش داده می‌شه. **بدون گزارش‌گیری پیچیده**.
---
#### الف. Backend (CMS) - 1 روز
**مدت**: 1 روز
1. **Migration: اضافه کردن فیلد VatPercentage**
```csharp
// در UserOrder (سفارش/فاکتور)
public decimal VatPercentage { get; set; } // مثلاً 10 (یعنی 10%)
// در FactorDetail (جزئیات فاکتور) - اختیاری
public decimal VatPercentage { get; set; } // اگه نیاز بود
```
2. **Seed Data یا Configuration**
```csharp
// یک مقدار پیش‌فرض در SystemConfiguration
Key: "shop_vat_percentage"
Value: "10" // 10%
```
3. **CreateOrderCommand - محاسبه ساده**
```csharp
// در زمان ثبت سفارش:
var vatPercentage = await _configService.GetVatPercentage();
order.VatPercentage = vatPercentage;
// محاسبه TotalPrice با مالیات (اختیاری):
// order.TotalPrice = order.SubTotal * (1 + vatPercentage/100);
```
4. **Protobuf: اضافه کردن فیلد**
```protobuf
message OrderResponse {
int64 id = 1;
double total_price = 2;
double vat_percentage = 3; // 👈 فیلد جدید
// ... سایر فیلدها
}
```
---
#### ب. BFF (اختیاری - اگه نیاز باشه) - 2 ساعت
**مدت**: 2 ساعت
اگه BFF درخواست جزئیات سفارش می‌ده، فقط فیلد `VatPercentage` رو هم بگیره و بده به Frontend:
```csharp
// در OrderDto
public decimal VatPercentage { get; set; }
```
**خیلی ساده**: فقط mapping فیلد از gRPC به DTO
---
#### ج. Frontend (FrontOffice) - 4 ساعت
**مدت**: 4 ساعت (نصف روز)
**نمایش در صفحات:**
1. **صفحه سبد خرید (Cart)**
```razor
<MudText Typo="Typo.body2" Color="Color.Secondary">
شامل @order.VatPercentage% مالیات بر ارزش افزوده
</MudText>
```
2. **صفحه جزئیات سفارش / فاکتور**
```razor
<MudText>
قیمت کل: @order.TotalPrice تومان
</MudText>
<MudText Typo="Typo.caption" Color="Color.Secondary">
(شامل @order.VatPercentage% مالیات بر ارزش افزوده)
</MudText>
```
3. **رسید خرید (Receipt)**
```razor
<div class="vat-info">
<MudIcon Icon="@Icons.Material.Filled.Info" Size="Size.Small" />
<span>مالیات بر ارزش افزوده: @order.VatPercentage%</span>
</div>
```
**همین!** خیلی ساده، فقط نمایش یه عدد درصد.
---
**تخمین زمان کل**: 2 روز کاری (1 روز Backend + 4 ساعت Frontend)
---
### 10. سیستم مدیریت نقش‌ها و دسترسی‌ها (Role-Based Access Control)
**زمان نیاز**: 1.5 هفته (CMS: 2 روز + BFF: 1 روز + Frontend: 3 روز + Testing: 1 روز)
**وضعیت**: 0% (شروع نشده)
#### الف. تعریف نقش‌ها (Roles)
**مدت**: 1 روز
**نقش‌های اصلی**:
1. **SuperAdmin** (سوپر ادمین)
- دسترسی کامل به تمام بخش‌ها
- مدیریت کاربران و نقش‌ها
- تنظیمات سیستم
2. **Admin** (ادمین)
- دسترسی به اکثر بخش‌ها
- مدیریت محتوا و سفارشات
- بدون دسترسی به تنظیمات حساس
3. **Inspector** (بازرس)
- **فقط مشاهده** (Read-Only)
- دسترسی به گزارش‌ها و Dashboard
- **بدون هیچ عملیات ویرایش/حذف**
- محدودیت دسترسی به صفحات:
* ❌ Settings (تنظیمات)
* ❌ User Management (مدیریت کاربران)
* ❌ Financial Operations (عملیات مالی)
* ✅ Reports (گزارش‌ها)
* ✅ Dashboard (داشبورد)
* ✅ Orders (فقط مشاهده)
* ✅ Network Tree (فقط مشاهده)
#### ب. پیاده‌سازی در Backend (CMS)
**مدت**: 2 روز
1. **Entity: Role** (در صورت عدم وجود)
```csharp
public class Role
{
public long Id { get; set; }
public string Name { get; set; } // SuperAdmin, Admin, Inspector
public string DisplayName { get; set; } // "سوپر ادمین", "ادمین", "بازرس"
public string Description { get; set; }
public List<Permission> Permissions { get; set; }
}
public class Permission
{
public long Id { get; set; }
public string Resource { get; set; } // Users, Orders, Reports, Settings
public string Action { get; set; } // View, Create, Edit, Delete
public long RoleId { get; set; }
public Role Role { get; set; }
}
```
2. **JWT Token Claims**
```csharp
// در GenerateJwtTokenService
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.Mobile),
new Claim(ClaimTypes.Role, role.Name), // "SuperAdmin", "Admin", "Inspector"
new Claim("Permissions", JsonSerializer.Serialize(permissions))
};
```
3. **Authorization Attributes**
```csharp
// Backend API Authorization
[Authorize(Roles = "SuperAdmin,Admin")]
public async Task<UpdateUserResponse> UpdateUser(UpdateUserRequest request)
[Authorize(Roles = "SuperAdmin")]
public async Task<Empty> DeleteUser(DeleteUserRequest request)
[Authorize(Roles = "SuperAdmin,Admin,Inspector")]
public async Task<GetUserResponse> GetUser(GetUserRequest request)
```
#### ج. لایه BFF (BackOffice.BFF)
**مدت**: 1 روز
1. **AuthorizationHandler**
```csharp
public class AuthorizationHandler : IAuthorizationHandler
{
private readonly CmsAuthClient _cmsAuthClient;
public async Task<bool> CheckPermission(string userId, string resource, string action)
{
// gRPC call to CMS
var request = new CheckPermissionRequest
{
UserId = userId,
Resource = resource,
Action = action
};
var response = await _cmsAuthClient.CheckPermissionAsync(request);
return response.HasPermission;
}
public async Task<UserRoleDto> GetUserRole(string userId)
{
var request = new GetUserRoleRequest { UserId = userId };
var response = await _cmsAuthClient.GetUserRoleAsync(request);
return new UserRoleDto
{
RoleName = response.RoleName,
Permissions = response.Permissions.Select(p => new PermissionDto
{
Resource = p.Resource,
Action = p.Action
}).ToList()
};
}
}
```
2. **RoleManagementHandler**
```csharp
public class RoleManagementHandler : IRoleManagementHandler
{
private readonly CmsUserClient _cmsUserClient;
public async Task<List<RoleDto>> GetRoles()
{
var response = await _cmsUserClient.GetRolesAsync(new Empty());
return response.Roles.Select(r => new RoleDto
{
Id = r.Id,
Name = r.Name,
DisplayName = r.DisplayName,
Permissions = r.Permissions.Select(p => new PermissionDto
{
Resource = p.Resource,
Action = p.Action
}).ToList()
}).ToList();
}
public async Task<bool> AssignRole(long userId, string roleName)
{
var request = new AssignRoleRequest
{
UserId = userId,
RoleName = roleName
};
var response = await _cmsUserClient.AssignRoleAsync(request);
return response.Success;
}
}
```
3. **API Endpoints**
```csharp
// Controllers/AuthorizationController.cs
[ApiController]
[Route("api/authorization")]
public class AuthorizationController : ControllerBase
{
private readonly IAuthorizationHandler _authHandler;
[HttpGet("check-permission")]
public async Task<IActionResult> CheckPermission(
[FromQuery] string resource,
[FromQuery] string action)
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var hasPermission = await _authHandler.CheckPermission(userId, resource, action);
return Ok(new { hasPermission });
}
[HttpGet("user-role")]
public async Task<IActionResult> GetUserRole()
{
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var role = await _authHandler.GetUserRole(userId);
return Ok(role);
}
}
// Controllers/RoleManagementController.cs
[ApiController]
[Route("api/roles")]
[Authorize(Roles = "SuperAdmin")]
public class RoleManagementController : ControllerBase
{
private readonly IRoleManagementHandler _roleHandler;
[HttpGet]
public async Task<IActionResult> GetRoles()
{
var roles = await _roleHandler.GetRoles();
return Ok(roles);
}
[HttpPost("assign")]
public async Task<IActionResult> AssignRole([FromBody] AssignRoleDto dto)
{
var success = await _roleHandler.AssignRole(dto.UserId, dto.RoleName);
return Ok(new { success });
}
}
```
4. **Authorization Middleware**
```csharp
public class PermissionMiddleware
{
private readonly RequestDelegate _next;
public async Task InvokeAsync(HttpContext context, IAuthorizationHandler authHandler)
{
// Extract resource and action from endpoint metadata
var endpoint = context.GetEndpoint();
var requiredPermission = endpoint?.Metadata
.GetMetadata<RequirePermissionAttribute>();
if (requiredPermission != null)
{
var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
var hasPermission = await authHandler.CheckPermission(
userId,
requiredPermission.Resource,
requiredPermission.Action
);
if (!hasPermission)
{
context.Response.StatusCode = 403;
return;
}
}
await _next(context);
}
}
```
#### د. پیاده‌سازی در Frontend (BackOffice)
**مدت**: 3 روز
1. **AuthService Enhancement**
```csharp
public class AuthService
{
private ClaimsPrincipal _user;
public string GetUserRole()
{
return _user?.FindFirst(ClaimTypes.Role)?.Value;
}
public bool HasPermission(string resource, string action)
{
var permissions = GetUserPermissions();
return permissions.Any(p =>
p.Resource == resource &&
p.Action == action);
}
public bool IsInRole(params string[] roles)
{
var userRole = GetUserRole();
return roles.Contains(userRole);
}
}
```
2. **Component-Level Authorization**
```razor
@* صفحه Users.razor *@
@if (AuthService.IsInRole("SuperAdmin", "Admin"))
{
<MudButton Color="Color.Primary" OnClick="CreateUser">
ایجاد کاربر جدید
</MudButton>
}
@* برای Inspector فقط جدول نمایش داده شود *@
<MudDataGrid Items="@users" ReadOnly="@(!AuthService.HasPermission("Users", "Edit"))">
@* ... *@
</MudDataGrid>
```
3. **Navigation Menu Filtering**
```csharp
// در MainLayout.razor.cs
private List<NavMenuItem> GetFilteredMenuItems()
{
var role = AuthService.GetUserRole();
var allMenuItems = new List<NavMenuItem>
{
new NavMenuItem { Title = "داشبورد", Icon = Icons.Dashboard, Url = "/" },
new NavMenuItem { Title = "سفارشات", Icon = Icons.ShoppingCart, Url = "/orders" },
new NavMenuItem { Title = "کاربران", Icon = Icons.People, Url = "/users",
RequiredRoles = new[] { "SuperAdmin", "Admin" } },
new NavMenuItem { Title = "تنظیمات", Icon = Icons.Settings, Url = "/settings",
RequiredRoles = new[] { "SuperAdmin" } },
};
return allMenuItems
.Where(item => item.RequiredRoles == null ||
item.RequiredRoles.Contains(role))
.ToList();
}
```
4. **UI Element Disabling for Inspector**
```razor
@* در هر صفحه *@
@code {
private bool IsReadOnly => AuthService.GetUserRole() == "Inspector";
}
<MudTextField @bind-Value="model.Name"
Label="نام"
Disabled="@IsReadOnly" />
<MudButton Color="Color.Success"
OnClick="SaveChanges"
Disabled="@IsReadOnly">
ذخیره
</MudButton>
<MudIconButton Icon="@Icons.Material.Filled.Delete"
OnClick="DeleteItem"
Disabled="@IsReadOnly" />
```
#### د. صفحه مدیریت نقش‌ها (Role Management)
**مدت**: 1 روز
**فقط برای SuperAdmin**
1. **لیست نقش‌ها**
- جدول نقش‌ها (Name, DisplayName, Description)
- دکمه‌های ویرایش/حذف
2. **ویرایش نقش**
- CheckBox Tree برای انتخاب دسترسی‌ها:
```
☐ کاربران
☑ مشاهده
☑ ایجاد
☐ ویرایش
☐ حذف
☐ سفارشات
☑ مشاهده
☐ ویرایش
☐ لغو
```
3. **اختصاص نقش به کاربر**
- در صفحه User Edit
- Dropdown انتخاب نقش
- فقط SuperAdmin می‌تواند تغییر دهد
#### ه. تست سناریوها
**مدت**: 1 روز
1. **تست Inspector**
- ✅ می‌تواند وارد سیستم شود
- ✅ Dashboard را می‌بیند
- ✅ گزارش‌ها را می‌بیند
- ✅ لیست سفارشات را می‌بیند
- ❌ نمی‌تواند سفارش ایجاد/ویرایش/حذف کند
- ❌ صفحه Settings را نمی‌بیند
- ❌ نمی‌تواند کاربر ایجاد/حذف کند
2. **تست Admin**
- ✅ می‌تواند اکثر عملیات را انجام دهد
- ❌ نمی‌تواند Settings سیستم را تغییر دهد
- ❌ نمی‌تواند نقش‌ها را مدیریت کند
3. **تست SuperAdmin**
- ✅ دسترسی کامل به همه چیز
**تخمین زمان کل**: 1.5 هفته کاری (CMS: 2 روز + BFF: 1 روز + UI: 3 روز + Testing: 1 روز)
---
## 📊 جدول اولویت‌بندی (به‌روز شده)
| کار | اولویت | زمان | وضعیت | وابستگی |
|-----|--------|------|-------|---------|
| درگاه پرداخت | 🔴 بالا | 1 هفته | 40% | - |
| تنظیمات Production | 🔴 بالا | 30 دقیقه | 0% | - |
| **سیستم مالیات (VAT)** | 🟡 متوسط | 2 روز (CMS: 1 روز + UI: 4 ساعت) | 0% | - |
| **مدیریت نقش‌ها (RBAC)** | 🟡 متوسط | 1.5 هفته (CMS: 2 روز + BFF: 1 روز + UI: 3 روز + Test: 1 روز) | 0% | - |
| فروشگاه باشگاه | 🟡 متوسط | 2 هفته | 0% | درگاه پرداخت |
| تست‌نویسی | 🟢 پایین | 2 هفته | 0% | - |
| Redis Locks | ⚪ اختیاری | 1 روز | 0% | Multi-server |
| Sentry | ⚪ اختیاری | 1 ساعت | 0% | - |
| Slack | ⚪ اختیاری | 30 دقیقه | 0% | - |
| FCM Push | ⚪ اختیاری | 2 روز | 0% | - |
---
## 🎯 برنامه پیشنهادی (Roadmap)
### هفته 1: تکمیل درگاه پرداخت
- روز 1-3: API Integration (فقط Daya برای Payout)
- روز 4-5: BackOffice UI (Approval interface)
### هفته 2: تنظیمات Production & Launch
- روز 1: تنظیم Email/SMS
- روز 2: تست کامل سیستم
- روز 3-5: Soft Launch + Monitoring
### هفته 3-4: فروشگاه باشگاه (اگر نیاز باشد)
- هفته 3: Product Catalog + Cart
- هفته 4: Purchase Flow + Renewal Reminders
### هفته 5-6: سیستم مالیات و دسترسی‌ها
- **هفته 5 (روز 1-2)**: VAT System (مالیات بر ارزش افزوده) ⚡ خیلی ساده
- روز 1: CMS (فیلد VatPercentage + Seed Data)
- روز 2 (صبح): Frontend (نمایش در Cart + Invoice)
- **هفته 5-6 (بقیه)**: RBAC (Role-Based Access Control)
- روز 2.5-3: CMS Layer (Roles + Permissions + JWT)
- روز 4: BFF Layer (Authorization Handlers + Middleware)
- روز 5-7: Frontend (Menu Filtering + UI Authorization + Role Management)
- روز 8: Testing (3 role scenarios)
### هفته 7+: بهبودها و تست
- تست‌نویسی
- بهینه‌سازی Performance
- اضافه کردن بهبودهای اختیاری
---
## ✅ Checklist قبل از Launch
### Backend
- [x] Domain Layer
- [x] Binary Tree
- [x] Commission Calculation
- [x] Background Worker (Hangfire)
- [x] Email/SMS Notifications
- [x] Health Checks
- [x] Database Migrations
- [ ] Payment Gateway Integration
- [ ] Production Configuration (Email/SMS)
### Frontend
- [ ] User Registration with Email
- [ ] User Profile (Edit Email)
- [ ] Club Shop (if needed)
- [ ] Withdrawal Request UI
- [ ] BackOffice Approval Interface
- [ ] **VAT Display in Cart & Invoice**
- [ ] **Role-Based UI Authorization (Inspector, Admin, SuperAdmin)**
### Business Logic
- [ ] **VAT Calculation System**
- [ ] **Role-Based Access Control (RBAC)**
- [ ] Payment Gateway Integration
- [ ] Club Shop Integration
### DevOps
- [ ] Production Server Setup
- [ ] SSL Certificate
- [ ] Backup Strategy
- [ ] Monitoring (Sentry/Slack - optional)
- [ ] CI/CD Pipeline (optional)
### Documentation
- [x] Implementation Progress
- [x] Email/SMS Configuration Guide
- [x] README with Quick Start
- [ ] ⭐ **داکیومنت هر Feature جدید**
- [ ] ⭐ **مقایسه داکیومنت با کد (هر هفته)**
- [ ] API Documentation (Swagger/gRPC)
- [ ] User Manual (فارسی)
- [ ] Admin Manual
---
## 📝 چک‌لیست داکیومنت (بعد از هر تسک)
### ✅ الزامی قبل از Commit:
#### 1. داکیومنت Business Logic
- [ ] آیا Business Logic در `CMS/network-club-commission-system-v1.1.md` به‌روز شده؟
- [ ] آیا فرمول‌ها و محاسبات صحیح هستند؟
- [ ] آیا مثال‌های عملی اضافه شده؟
#### 2. داکیومنت پیشرفت
- [ ] آیا `CMS/implementation-progress.md` آپدیت شده؟
- [ ] آیا درصد پیشرفت به‌روز شده؟
- [ ] آیا فاز جدید اضافه شده؟
#### 3. داکیومنت API
- [ ] آیا Protobuf messages داکیومنت شده‌اند؟
- [ ] آیا Request/Response نمونه اضافه شده؟
- [ ] آیا Error Codes مستند شده‌اند؟
#### 4. مقایسه کد با داکیومنت
- [ ] آیا کد با Business Logic تطبیق دارد؟
- [ ] آیا Entity های کد با Entity های داکیومنت یکسان است؟
- [ ] آیا نام‌گذاری‌ها مشابه هستند؟
#### 5. داکیومنت تأثیرات
- [ ] آیا تأثیر روی BackOffice.BFF مستند شده؟
- [ ] آیا تأثیر روی BackOffice UI مستند شده؟
- [ ] آیا Migration Guide نوشته شده؟
---
## 📊 گزارش مقایسه داکیومنت vs کد
### چک‌لیست بررسی هفتگی:
```bash
# 1. بررسی Entity ها
cd CMS/src
grep -r "public class.*Entity" --include="*.cs" | wc -l
# مقایسه با تعداد Entity های مستند شده
# 2. بررسی Commands/Queries
find . -name "*Command.cs" -o -name "*Query.cs" | wc -l
# مقایسه با لیست Commands در داکیومنت
# 3. بررسی API Endpoints
grep -r "\[HttpGet\]\|\[HttpPost\]" --include="*.cs" | wc -l
# مقایسه با API های مستند شده
```
### نمونه گزارش:
```markdown
## گزارش هفتگی - 2025-12-01
### ✅ تطبیق کامل:
- Entity های UserOrder, UserOrderDetail
- Commission Calculation Logic
- Binary Tree Placement
### ⚠️ نیاز به به‌روزرسانی داکیومنت:
- [ ] فیلد VatPercentage به Entity اضافه شده ولی داکیومنت نشده
- [ ] CreateOrderCommand تغییر کرده ولی در داکیومنت قدیمی است
### ❌ اختلاف Business Logic:
- هیچ موردی
```
- [x] README with Quick Start
- [ ] API Documentation (Swagger/gRPC)
- [ ] User Manual (فارسی)
- [ ] Admin Manual
---
## 📞 نکات مهم
### 1. قبل از Production Deploy
```bash
# بررسی Build
dotnet build --configuration Release
# اجرای Migrations
dotnet ef database update
# تست Health Check
curl http://YOUR_SERVER/health
# تست Hangfire Dashboard
# باز کردن: http://YOUR_SERVER/hangfire
# تست Manual Trigger
curl -X POST http://YOUR_SERVER/api/admin/trigger-weekly-calculation
```
### 2. Monitoring در Production
```bash
# Log Files
tail -f /var/log/cms/application.log
# Database Connections
SELECT * FROM sys.dm_exec_sessions WHERE database_id = DB_ID('Foursat_CMS')
# Hangfire Jobs
# Dashboard: /hangfire/recurring
# Worker Execution Log
SELECT TOP 10 * FROM WorkerExecutionLog ORDER BY StartTime DESC
```
### 3. Backup Strategy
- Database: روزانه Full Backup + Hourly Transaction Log
- Configuration Files: Git repository
- User Data: Weekly full export
---
## ⚠️ بیزینس‌های کلیدی - چک‌لیست الزامی
> **هشدار**: این بیزینس‌ها **نباید هیچ‌وقت** گم بشند! قبل از هر Release باید تطبیق کامل با کد داشته باشند.
### 🎯 بیزینس 1: Binary Tree (درخت دودویی)
**قوانین اصلی** (از دکتر):
- ✅ هر User دقیقاً 2 زیرمجموعه مستقیم دارد (Left, Right)
- ✅ Spillover: وقتی پر شد، زیرمجموعه بعدی به اولین جای خالی در سطح بعد می‌رود
- ✅ محاسبه عمق (Depth): از ریشه تا آن Node
- ✅ Parent تغییر نمی‌کند (فقط در ثبت‌نام تنظیم می‌شود)
**چک‌لیست تطبیق**:
```bash
# 1. بررسی کد
cd CMS/src/CMSMicroservice.Domain/Entities
grep -A 20 "class User" User.cs | grep -E "Parent|Left|Right"
# 2. بررسی منطق Placement
cd ../Application/UserCQ
grep -A 50 "PlaceInBinaryTree" CreateUserCommand.cs
# 3. تست
# آیا با 7 کاربر، Tree به شکل زیر است؟
# 1
# / \
# 2 3
# /| |\
# 4 5 6 7
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/binary-tree-registration-guide.md` ✅
- `totalDoc/CMS/network-club-commission-system-v1.1.md` (بخش Binary Tree)
---
### 💰 بیزینس 2: محاسبه کمیسیون (از دکتر)
**قوانین اصلی**:
- ✅ محاسبه هر **یکشنبه ساعت 00:05 UTC**
- ✅ فرمول: `Commission = TotalPV × Percentage`
- ✅ شرط دریافت: `MinimumPV` باید رعایت شود
- ✅ CarryOver: مانده به هفته بعد منتقل می‌شود
- ✅ MaxCommission: سقف کمیسیون در هفته
**چک‌لیست تطبیق**:
```bash
# 1. بررسی Worker
cd CMS/src/CMSMicroservice.Application/BackgroundWorkers
grep -A 30 "CalculateCommission" CommissionCalculationWorker.cs
# 2. بررسی فرمول
grep "TotalPV.*Percentage" -r .
# 3. بررسی Cron Job
grep "Cron.*Sunday" -r . | grep "00:05"
# 4. تست
# با PV=1000 و Percentage=10%، آیا Commission=100 است؟
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/network-club-commission-system-v1.1.md` (بخش Commission) ✅
- `totalDoc/CMS/balance-calculation-carryover-logic.md` ✅
---
### 🏆 بیزینس 3: سطوح باشگاه (Club Levels)
**قوانین اصلی** (از دکتر):
- ✅ 4 سطح: Bronze, Silver, Gold, Platinum
- ✅ شرط ارتقا: تعداد PV یا تعداد زیرمجموعه فعال
- ✅ سطح پایین نمی‌آید (یک طرفه)
- ✅ مدت‌زمان عضویت (Duration): ماهانه یا سالانه
**چک‌لیست تطبیق**:
```bash
# 1. بررسی Entity
cd CMS/src/CMSMicroservice.Domain/Entities
grep -A 10 "ClubLevel" ClubMembership.cs
# 2. بررسی منطق ارتقا
cd ../Application/ClubMembershipCQ
grep -A 50 "UpgradeLevel" *.cs
# 3. تست
# آیا Bronze → Silver با شرایط مشخص اتفاق می‌افتد؟
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/network-club-commission-system-v1.1.md` (بخش Club)
---
### 💳 بیزینس 4: برداشت (Withdrawal) - از شما
**قوانین اصلی**:
- ✅ حداقل موجودی برای برداشت: مثلاً 100,000 تومان
- ✅ کارمزد برداشت: مثلاً 2%
- ✅ وضعیت‌ها: Pending → Approved/Rejected
- ✅ فقط مدیر می‌تواند Approve/Reject کند
- ✅ پس از Approve: واریز به حساب
**چک‌لیست تطبیق**:
```bash
# 1. بررسی Commands
cd CMS/src/CMSMicroservice.Application/WithdrawalCQ
ls -1 *Command.cs
# 2. بررسی حداقل موجودی
grep "MinimumWithdrawal" -r .
# 3. بررسی کارمزد
grep "WithdrawalFee" -r .
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/implementation-progress.md` (Phase 10)
---
### 📧 بیزینس 5: ارسال اطلاع‌رسانی
**قوانین اصلی**:
- ✅ Email: برای تأیید ثبت‌نام، کمیسیون، فعال‌سازی باشگاه
- ✅ SMS: برای تأیید موبایل، اطلاعیه‌های مهم
- ✅ زمان ارسال: بلافاصله بعد از event
- ✅ Template: HTML برای Email، متن ساده برای SMS
**چک‌لیست تطبیق**:
```bash
# 1. بررسی NotificationService
cd CMS/src/CMSMicroservice.Application/Common/Services
ls -1 *Notification*
# 2. بررسی Template ها
find . -name "*.html" -o -name "*Template*"
# 3. تست
# آیا بعد از Commission calculation، Email ارسال می‌شود؟
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/email-sms-configuration-guide.md` ✅
---
### 🛒 بیزینس 6: سفارش و فاکتور (Order & Factor)
**قوانین اصلی**:
- ✅ هر سفارش یک فاکتور (UserOrder) دارد
- ✅ هر فاکتور شامل چند FactorDetail است
- ✅ محاسبه PV از سفارش
- ✅ وضعیت سفارش: Pending → Paid → Processing → Completed
- ✅ مالیات (VAT): یک درصد ثابت روی کل سفارش
**چک‌لیست تطبیق**:
```bash
# 1. بررسی Entity
cd CMS/src/CMSMicroservice.Domain/Entities
grep -A 20 "class UserOrder" UserOrder.cs
grep -A 20 "class FactorDetail" FactorDetail.cs
# 2. بررسی محاسبه PV
cd ../Application/OrderCQ
grep "CalculatePV" -A 30 CreateOrderCommand.cs
# 3. بررسی VAT
grep "VatPercentage" -r .
```
**فایل داکیومنت مرتبط**:
- `totalDoc/CMS/network-club-commission-system-v1.1.md` (بخش Orders)
- `totalDoc/REMAINING-TASKS.md` (VAT System)
---
## 📋 چک‌لیست بررسی ماهانه بیزینس
**هر ماه یکبار این چک‌لیست را اجرا کن**:
### ماه: _________ | تاریخ بررسی: _________
- [ ] **Binary Tree**: Placement و Spillover صحیح کار می‌کند؟
- [ ] **Commission**: فرمول محاسبه درست است؟ Cron Job اجرا می‌شود؟
- [ ] **CarryOver**: مانده به هفته بعد منتقل می‌شود؟
- [ ] **Club Levels**: ارتقا به سطح بالاتر صحیح است؟
- [ ] **Withdrawal**: فرآیند برداشت کامل کار می‌کند؟
- [ ] **Email/SMS**: تمام Notification ها ارسال می‌شوند؟
- [ ] **Order/Factor**: PV محاسبه می‌شود؟ VAT اضافه می‌شود؟
### نتیجه بررسی:
```
✅ همه بیزینس‌ها OK
⚠️ نیاز به بررسی بیشتر: _________________
❌ مشکل یافت شد: _________________
```
---
## 📊 تخمین زمان کل (به‌روز شده)
| دسته | زمان | شامل |
|------|------|------|
| اولویت بالا | 1 هفته + 30 دقیقه | درگاه پرداخت، تنظیمات Production |
| اولویت متوسط | 3.5 هفته | فروشگاه (2 هفته) + VAT (2 روز) + RBAC (1.5 هفته) |
| اولویت پایین | 2 هفته | تست‌نویسی (موکول شده) |
| بهبودهای اختیاری | 1 هفته | Redis, Sentry, Slack, FCM |
| **جمع کل (بدون تست)** | **4.5-5.5 هفته** |
---
## 🎉 وضعیت فعلی
**MVP: 100% آماده**
**Production Ready: 95%**
**آماده Launch: بله** (با تکمیل درگاه پرداخت + تنظیمات)
سیستم فعلی می‌تواند:
- کاربران را در Binary Tree قرار دهد
- کمیسیون هفتگی محاسبه کند
- Email/SMS ارسال کند
- درخواست‌های برداشت را مدیریت کند
فقط نیاز است:
- درگاه پرداخت متصل شود (برای واریز خودکار)
- تنظیمات Email/SMS در Production انجام شود
**توصیه**: می‌توان با MVP فعلی launch کرد و Phase 9 (فروشگاه) را بعداً اضافه کرد.