1557 lines
48 KiB
Markdown
1557 lines
48 KiB
Markdown
# کارهای باقیمانده - پروژه 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 (فروشگاه) را بعداً اضافه کرد.
|