feat: Update CURRENT-SPRINT.md with progress and task completion details

- Added last updated date and refined project status for Backend and Frontend.
- Updated completion percentages for FrontOffice UI and BFF.
- Documented completed tasks for BackOffice in the current sprint.
- Added new high-priority tasks related to commission calculation fixes.
- Resolved blockers and minor issues, providing a clearer progress summary.

docs: Create commission-calculation-fix.md for weekly commission calculation analysis

- Documented critical issues affecting commission calculations.
- Provided a detailed plan for fixing the commission calculation logic.
- Included code analysis, affected files, and step-by-step tasks for implementation.
- Outlined the expected timeline and important notes regarding changes.
This commit is contained in:
masoodafar-web
2025-12-04 19:54:08 +03:30
parent 119e870a26
commit 996a6e885b
8 changed files with 997 additions and 498 deletions
+97 -15
View File
@@ -1,12 +1,68 @@
# Balance Calculation with Carryover Logic - Complete Guide
**Date**: 2025-12-01
**Last Updated**: 2025-12-01 (Added Configuration Integration + MaxWeeklyBalances Cap)
**Status**: ✅ Implemented
**Last Updated**: 2025-12-04 (⚠️ تغییر مهم: سقف 300 برای هر دست، نه کل)
**Status**: ✅ Implemented (نیاز به اصلاح سقف دارد)
**Migration**: `UpdateNetworkWeeklyBalanceWithCarryover`
---
## ⚠️ اصلاحیه مهم بیزینس (2025-12-04)
### مشکل شناسایی شده:
در پیاده‌سازی فعلی، سقف تعادل هفتگی **300 کل** در نظر گرفته شده بود. اما طبق قانون صحیح بیزینس:
| توضیح | منطق فعلی (اشتباه) | منطق صحیح |
|-------|---------------------|-----------|
| سقف | 300 کل | 300 برای هر دست |
| حداکثر تعادل | 300 | MIN(300, 300) = 300 |
| حداکثر کل | 300 | 300 + 300 = 600 (مجموع دو دست) |
### تفاوت در محاسبه:
**منطق فعلی (اشتباه):**
```csharp
totalBalances = MIN(leftTotal, rightTotal)
cappedBalances = MIN(totalBalances, 300) // ← سقف روی کل
```
**منطق صحیح:**
```csharp
cappedLeftTotal = MIN(leftTotal, 300) // ← سقف روی هر دست
cappedRightTotal = MIN(rightTotal, 300)
totalBalances = MIN(cappedLeftTotal, cappedRightTotal)
```
### مثال عملی:
| سناریو | چپ | راست | منطق فعلی | منطق صحیح |
|--------|-----|-------|-----------|-----------|
| 1 | 200 | 250 | 200 | 200 |
| 2 | 350 | 400 | **300** ❌ | **300** ✅ |
| 3 | 500 | 600 | **300** ❌ | **300** ✅ |
**توجه:** در مثال‌های بالا نتیجه یکسان است چون حداکثر یک تعادل همیشه MIN(300,300)=300 است. تفاوت در **باقیمانده** است:
**مثال با چپ=500، راست=600:**
| روش | تعادل | باقیمانده چپ | باقیمانده راست |
|-----|--------|--------------|----------------|
| فعلی | 300 | 500 - 150 = 350 | 600 - 150 = 450 |
| صحیح | 300 | **200** (500-300) | **300** (600-300) |
### تغییرات Configuration:
```csharp
// ✅ تغییر نام و مقدار:
// قدیمی:
Key = "Commission.MaxWeeklyBalancesPerUser", Value = "300"
// جدید:
Key = "Commission.MaxWeeklyBalancesPerLeg", Value = "300"
```
---
## 📋 Configuration-Based Calculation
### **System Configurations Used:**
@@ -15,9 +71,11 @@
// تمام مقادیر از جدول SystemConfigurations خوانده می‌شوند
Club.ActivationFee = 25,000,000 ریال (هزینه فعالسازی)
Commission.WeeklyPoolContributionPercent = 20% (سهم استخر)
Commission.MaxWeeklyBalancesPerUser = 300 (سقف تعادل هفتگی)
Commission.MaxWeeklyBalancesPerLeg = 300 ( سقف تعادل هفتگی - هر دست)
```
**توجه:** کلید قدیمی `MaxWeeklyBalancesPerUser` باید به `MaxWeeklyBalancesPerLeg` تغییر کند.
### **Pool Contribution Calculation:**
```csharp
@@ -32,29 +90,53 @@ weeklyPoolContribution = totalNewMembers × activationFee × poolPercent
---
## 🚫 MaxWeeklyBalances Cap (محدودیت سقف)
## 🚫 MaxWeeklyBalances Cap (محدودیت سقف - هر دست)
### **Logic:**
### **Logic (صحیح):**
```csharp
totalBalances = MIN(leftTotal, rightTotal)
cappedBalances = MIN(totalBalances, maxWeeklyBalances) // 300
// ⚠️ سقف روی هر دست جداگانه اعمال می‌شود
cappedLeftTotal = MIN(leftTotal, maxBalancesPerLeg) // 300
cappedRightTotal = MIN(rightTotal, maxBalancesPerLeg) // 300
// اگر بیشتر از سقف بود، مازاد به remainder اضافه می‌شود
excessBalances = totalBalances - cappedBalances
// تعادل = کمترین مقدار بعد از اعمال سقف
totalBalances = MIN(cappedLeftTotal, cappedRightTotal)
// باقیمانده = مقدار قبل از سقف - سقف (نه از totalBalances)
leftRemainder = leftTotal - cappedLeftTotal
rightRemainder = rightTotal - cappedRightTotal
```
### **Example:**
### **Example (جدید):**
```
Week 5:
leftTotal = 350, rightTotal = 400
totalBalances = MIN(350, 400) = 350
cappedBalances = MIN(350, 300) = 300 ✅ محدود شد!
excessBalances = 350 - 300 = 50
maxBalancesPerLeg = 300
leftRemainder = 0 + 50 = 50 (میرود برای هفته بعد)
rightRemainder = 50
cappedLeftTotal = MIN(350, 300) = 300
cappedRightTotal = MIN(400, 300) = 300
totalBalances = MIN(300, 300) = 300 ✅
// باقیمانده = اضافه‌ای که از سقف رد شده
leftRemainder = 350 - 300 = 50
rightRemainder = 400 - 300 = 100
```
### **مقایسه منطق قدیم vs جدید:**
```
// ❌ منطق قدیم (اشتباه):
cappedBalances = MIN(totalBalances, 300) // سقف روی کل
balancesConsumedPerSide = cappedBalances / 2
leftRemainder = leftTotal - balancesConsumedPerSide
// ✅ منطق جدید (صحیح):
cappedLeftTotal = MIN(leftTotal, 300) // سقف روی هر دست
cappedRightTotal = MIN(rightTotal, 300)
totalBalances = MIN(cappedLeftTotal, cappedRightTotal)
leftRemainder = leftTotal - cappedLeftTotal // باقیمانده از سقف هر دست
```
---
+354
View File
@@ -0,0 +1,354 @@
# 🔧 اصلاح محاسبه کمیسیون هفتگی - تحلیل و برنامه اجرایی
**تاریخ**: ۱۴ آذر ۱۴۰۴ (2025-12-04)
**وضعیت**: 📋 در حال برنامه‌ریزی
**اولویت**: 🔴 بحرانی - تأثیر مستقیم بر بیزینس
---
## 📊 خلاصه مشکلات
### مشکل ۱: محدودیت لول (Max Network Level) پیاده‌سازی نشده
- **مشکل**: شمارش اعضا بدون محدودیت عمق انجام می‌شود
- **انتظار**: فقط تا ۱۵ لول پایین‌تر باید شمارش شود
- **راه‌حل**: اضافه کردن پارامتر `maxLevel` به متد بازگشتی و خواندن از Config
### مشکل ۲: تعادل شخص vs تعادل شبکه (بحرانی)
- **مشکل**: کمیسیون بر اساس تعادل شخصی محاسبه می‌شود (نه مجموع زیرمجموعه)
- **انتظار**: کمیسیون = (تعادل شخص + تعادل زیرمجموعه تا ۱۵ لول) × ارزش هر تعادل
- **راه‌حل**: محاسبه تعادل‌های زیرمجموعه در ProcessUserPayouts
---
## 🎯 قانون صحیح کمیسیون (بیزینس)
### فرمول محاسبه کمیسیون هفتگی:
```
1️⃣ محاسبه تعادل هر شخص:
- تعادل_شخص = MIN(چپ، راست)
- سقف هر دست = 300
- حداکثر تعادل شخصی = 300
2️⃣ محاسبه کل تعادل‌های شبکه:
- کل_تعادل_شبکه = SUM(تعادل_شخصی همه اعضا)
3️⃣ محاسبه صندوق:
- صندوق_هفتگی = SUM(سهم_استخر همه اعضا)
- سهم_استخر هر عضو = تعداد_زیرمجموعه_جدید × هزینه_فعال‌سازی × ۲۰%
4️⃣ ارزش هر تعادل:
- ارزش_هر_تعادل = صندوق_هفتگی ÷ کل_تعادل_شبکه
5️⃣ کمیسیون هر شخص:
- مجموع_تعادل = تعادل_شخص + SUM(تعادل_زیرمجموعه تا 15 لول)
- کمیسیون = مجموع_تعادل × ارزش_هر_تعادل
```
### مثال عملی:
```
شبکه:
User A
├─ Left: User B (تعادل: 5)
│ ├─ Left: User D (تعادل: 2)
│ └─ Right: User E (تعادل: 1)
└─ Right: User C (تعادل: 3)
└─ Left: User F (تعادل: 1)
فرض: تعادل شخصی User A = 10
محاسبه مجموع تعادل User A (تا 15 لول):
= 10 + 5 + 2 + 1 + 3 + 1 = 22 تعادل
اگر ارزش هر تعادل = 1,000,000 ریال:
کمیسیون User A = 22 × 1,000,000 = 22,000,000 ریال
```
---
## 🔍 تحلیل کد فعلی
### فایل‌های تأثیرپذیر:
| # | فایل | وضعیت فعلی | نیاز به تغییر |
|---|------|------------|---------------|
| 1 | `ApplicationDbContextInitialiser.cs` | ندارد `MaxNetworkLevel` | ✅ اضافه Config |
| 2 | `CalculateWeeklyBalancesCommandHandler.cs` | بدون محدودیت لول | ✅ اضافه maxLevel |
| 3 | `ProcessUserPayoutsCommandHandler.cs` | فقط تعادل شخص | ✅ جمع زیرمجموعه |
| 4 | `NetworkWeeklyBalance.cs` | Entity | ⚪ نیاز ندارد |
| 5 | `UserCommissionPayout.cs` | Entity | 🟡 شاید فیلد جدید |
### کد فعلی `ProcessUserPayoutsCommandHandler`:
```csharp
// ❌ مشکل: فقط تعادل شخصی
foreach (var balance in weeklyBalances)
{
var totalAmount = (long)(balance.TotalBalances * pool.ValuePerBalance);
// ...
}
```
### کد صحیح باید باشد:
```csharp
// ✅ صحیح: تعادل شخصی + زیرمجموعه تا 15 لول
foreach (var balance in weeklyBalances)
{
// محاسبه مجموع تعادل‌های زیرمجموعه
var subordinateBalances = await CalculateSubordinateBalances(
balance.UserId,
request.WeekNumber,
maxNetworkLevel, // از Config
cancellationToken
);
var totalBalancesWithSubordinates = balance.TotalBalances + subordinateBalances;
var totalAmount = (long)(totalBalancesWithSubordinates * pool.ValuePerBalance);
// ...
}
```
---
## 📋 تسک‌های اجرایی
### فاز ۱: Configuration (نیم روز)
#### تسک ۱.۱: اضافه کردن MaxNetworkLevel به Seed Data
```csharp
// ApplicationDbContextInitialiser.cs
new SystemConfiguration
{
Key = "Commission.MaxNetworkLevel",
Value = "15",
Description = "حداکثر عمق شبکه برای محاسبه کمیسیون (تعداد لول)",
Scope = ConfigurationScope.Commission,
IsActive = true
}
```
#### تسک ۱.۲: Migration (در صورت نیاز)
- اگر دیتابیس موجود دارید، یک SQL Script یا Migration
---
### فاز ۲: اصلاح CalculateWeeklyBalances (نیم روز)
#### تسک ۲.۱: خواندن MaxNetworkLevel از Config
```csharp
// در Handle method
var maxNetworkLevel = int.Parse(configs.GetValueOrDefault("Commission.MaxNetworkLevel", "15"));
```
#### تسک ۲.۲: اضافه کردن محدودیت لول به متد بازگشتی
```csharp
private async Task<int> CountNewMembersRecursive(
long userId,
NetworkLeg leg,
DateTime startDate,
DateTime endDate,
int currentLevel, // ← جدید
int maxLevel, // ← جدید
CancellationToken cancellationToken)
{
// ⬅️ محدودیت عمق
if (currentLevel >= maxLevel)
return 0;
var child = await _context.Users
.FirstOrDefaultAsync(x => x.NetworkParentId == userId && x.LegPosition == leg, cancellationToken);
if (child == null)
return 0;
// ... محاسبه count ...
// ⬅️ افزایش سطح
var childLeft = await CountNewMembersRecursive(child.Id, NetworkLeg.Left, startDate, endDate, currentLevel + 1, maxLevel, cancellationToken);
var childRight = await CountNewMembersRecursive(child.Id, NetworkLeg.Right, startDate, endDate, currentLevel + 1, maxLevel, cancellationToken);
return count + childLeft + childRight;
}
```
---
### فاز ۳: اصلاح ProcessUserPayouts (۱ روز)
#### تسک ۳.۱: اضافه کردن متد محاسبه تعادل زیرمجموعه
```csharp
/// <summary>
/// محاسبه مجموع تعادل‌های زیرمجموعه یک کاربر تا N لول
/// </summary>
private async Task<int> CalculateSubordinateBalancesAsync(
long userId,
string weekNumber,
int maxLevel,
CancellationToken cancellationToken)
{
var totalSubordinateBalances = 0;
// پیدا کردن همه زیرمجموعه‌ها تا maxLevel
var subordinates = await GetSubordinatesRecursive(userId, 1, maxLevel, cancellationToken);
// جمع تعادل‌های آنها
foreach (var subordinateId in subordinates)
{
var balance = await _context.NetworkWeeklyBalances
.Where(x => x.UserId == subordinateId && x.WeekNumber == weekNumber)
.Select(x => x.TotalBalances)
.FirstOrDefaultAsync(cancellationToken);
totalSubordinateBalances += balance;
}
return totalSubordinateBalances;
}
/// <summary>
/// پیدا کردن بازگشتی زیرمجموعه‌ها
/// </summary>
private async Task<List<long>> GetSubordinatesRecursive(
long userId,
int currentLevel,
int maxLevel,
CancellationToken cancellationToken)
{
if (currentLevel > maxLevel)
return new List<long>();
var result = new List<long>();
// پیدا کردن فرزندان مستقیم
var children = await _context.Users
.Where(x => x.NetworkParentId == userId)
.Select(x => x.Id)
.ToListAsync(cancellationToken);
result.AddRange(children);
// بازگشت برای هر فرزند
foreach (var childId in children)
{
var grandChildren = await GetSubordinatesRecursive(childId, currentLevel + 1, maxLevel, cancellationToken);
result.AddRange(grandChildren);
}
return result;
}
```
#### تسک ۳.۲: اصلاح Handle method
```csharp
public async Task<int> Handle(ProcessUserPayoutsCommand request, CancellationToken cancellationToken)
{
// ... کدهای موجود ...
// خواندن MaxNetworkLevel از Config
var maxNetworkLevel = await _context.SystemConfigurations
.Where(x => x.Key == "Commission.MaxNetworkLevel" && x.IsActive)
.Select(x => x.Value)
.FirstOrDefaultAsync(cancellationToken);
var maxLevel = int.Parse(maxNetworkLevel ?? "15");
foreach (var balance in weeklyBalances)
{
// ✅ محاسبه تعادل شخص + زیرمجموعه
var subordinateBalances = await CalculateSubordinateBalancesAsync(
balance.UserId,
request.WeekNumber,
maxLevel,
cancellationToken
);
var totalBalancesWithSubordinates = balance.TotalBalances + subordinateBalances;
var totalAmount = (long)(totalBalancesWithSubordinates * pool.ValuePerBalance);
var payout = new UserCommissionPayout
{
UserId = balance.UserId,
WeekNumber = request.WeekNumber,
WeeklyPoolId = pool.Id,
BalancesEarned = totalBalancesWithSubordinates, // ← شامل زیرمجموعه
ValuePerBalance = pool.ValuePerBalance,
TotalAmount = totalAmount,
// ...
};
// ...
}
}
```
#### تسک ۳.۳ (اختیاری): اضافه کردن فیلد به Entity
```csharp
// UserCommissionPayout.cs
/// <summary>
/// تعادل شخصی (بدون زیرمجموعه)
/// </summary>
public int PersonalBalances { get; set; }
/// <summary>
/// تعادل زیرمجموعه‌ها
/// </summary>
public int SubordinateBalances { get; set; }
/// <summary>
/// مجموع (PersonalBalances + SubordinateBalances)
/// </summary>
public int BalancesEarned { get; set; } // ← قبلاً هم بود
```
---
### فاز ۴: تست و Build (نیم روز)
#### تسک ۴.۱: Build و رفع خطاها
```bash
cd CMS/src && dotnet build
```
#### تسک ۴.۲: تست با سناریوهای مختلف
- کاربر بدون زیرمجموعه
- کاربر با ۵ لول زیرمجموعه
- کاربر با ۲۰ لول (باید ۱۵ تا بشمارد)
- کاربر با سقف ۳۰۰ در هر دست
---
## ⏱️ زمان‌بندی
| فاز | تسک | زمان | مجموع |
|-----|-----|------|-------|
| ۱ | Config + Seed | 0.5 روز | 0.5 روز |
| ۲ | اصلاح CalculateWeeklyBalances | 0.5 روز | 1 روز |
| ۳ | اصلاح ProcessUserPayouts | 1 روز | 2 روز |
| ۴ | تست و Build | 0.5 روز | 2.5 روز |
**مجموع**: ۲.۵ روز کاری
---
## ⚠️ نکات مهم
1. **تغییرات Breaking نیست**: ساختار Entity تغییر نمی‌کند (فقط مقادیر)
2. **Backward Compatible**: فیلد `BalancesEarned` قبلاً هم بود
3. **Idempotent**: با `ForceRecalculate` می‌توان دوباره حساب کرد
4. **Performance**: متد بازگشتی ممکن است کند باشد - بهینه‌سازی در فاز بعد
5. **Migration**: فقط اگر فیلد جدید به Entity اضافه شود
---
## 🚀 ترتیب اجرا
1. ✅ تأیید این داکیومنت توسط شما
2. [ ] فاز ۱: Config
3. [ ] فاز ۲: CalculateWeeklyBalances
4. [ ] فاز ۳: ProcessUserPayouts
5. [ ] فاز ۴: تست و Build
6. [ ] آپدیت CURRENT-SPRINT.md
---
**آیا این تحلیل و برنامه مورد تأیید شماست؟**
@@ -1,8 +1,9 @@
# BackOffice.BFF - Discount Shop Integration Plan
**تاریخ ایجاد**: 1403/09/13 (2024-12-04)
**وضعیت**: 📋 برنامه‌ریزی
**اولویت**: 🔴 بالا
**آخرین بروزرسانی**: 1403/09/14 (2024-12-05)
**وضعیت**: ✅ پیاده‌سازی شده (Plan اجرا شده است)
**اولویت در زمان طراحی**: 🔴 بالا
---
@@ -16,10 +17,12 @@
- 4 gRPC Services
- Migration: AddDiscountShopSystem
### ⏳ نیاز به پیاده‌سازی در BackOffice.BFF
- **19 Handler** برای 4 سرویس جدید
- **4 Client Interface** در IApplicationContractContext
- **Test و Validation**
### ⏳ وضعیت در BackOffice.BFF (به‌روزرسانی)
- **19 Handler** برای 4 سرویس جدید → ✅ پیاده‌سازی و متصل به CMS
- **4 Client Interface** در `IApplicationContractContext` → ✅ اضافه و در `ApplicationContractContext` پیاده‌سازی شده
- **Test و Validation** → ✅ در BackOffice UI (DiscountShop صفحات و سرویس‌ها) در حال استفاده عملی
> این سند به‌عنوان **طرح اولیه** نگه‌داری می‌شود؛ برای وضعیت نهایی به `totalDoc/05-TASKS/BACKLOG.md` (بخش Discount Shop - BackOffice Integration ✅) و `totalDoc/04-FRONTEND/BackOffice/ui-status.md` مراجعه شود.
---
@@ -1460,205 +1460,3 @@ For implementation questions or clarifications:
- User acceptance testing
**Status**: **🚀 Production Ready at 100% - All Features Complete!**
---
## 7️⃣ **Package Management** 📦
### **7.1 Package CRUD Operations**
**Priority**: 🔥 High
**Status**: ✅ **Complete**
#### Backend Availability:
- ✅ **CMS Service**: Full PackageCQ implementation (Create, Update, Delete, GetById, GetAllByFilter)
- ✅ **BFF Handlers**: 6 handlers (3 Commands + 3 Queries)
- ✅ **BFF Protobuf**: `package.proto` with all RPCs
- ✅ **File Upload**: Image upload support via FileInfos service
#### BFF Implementation:
**Commands (3)**:
1. ✅ **CreateNewPackageCommandHandler**
- Image upload to "Images/Package" directory
- gRPC call to CMS.Packages.CreateNewPackageAsync
- Mapster mapping
- File: `BackOffice.BFF.Application/PackageCQ/Commands/CreateNewPackage/`
2. ✅ **UpdatePackageCommandHandler**
- Update package with optional image change
- gRPC call to CMS.Packages.UpdatePackageAsync
- File: `BackOffice.BFF.Application/PackageCQ/Commands/UpdatePackage/`
3. ✅ **DeletePackageCommandHandler**
- Soft delete via gRPC
- File: `BackOffice.BFF.Application/PackageCQ/Commands/DeletePackage/`
**Queries (3)**:
1. ✅ **GetPackageQueryHandler**
- GetById via gRPC
- File: `BackOffice.BFF.Application/PackageCQ/Queries/GetPackage/`
2. ✅ **GetAllPackageByFilterQueryHandler**
- List with pagination and filters
- gRPC call to CMS.Packages.GetAllPackageByFilterAsync
- File: `BackOffice.BFF.Application/PackageCQ/Queries/GetAllPackageByFilter/`
3. ✅ **GetUserPackageStatusQueryHandler** ⭐
- Check user package purchase status
- Returns: PackagePurchaseMethod, HasPurchasedPackage, IsClubMemberActive
- Returns: WalletBalance, DiscountBalance, CanActivateClubMembership
- Returns: LastOrderNumber, LastPurchaseDate (optional)
- **Use Case**: Verify user eligibility before operations
- File: `BackOffice.BFF.Application/PackageCQ/Queries/GetUserPackageStatus/`
#### Frontend Implementation:
- ✅ **Page**: `Pages/Package/PackageMainPage.razor`
- ✅ **Features**:
- MudDataGrid with server-side pagination
- Filter by Title
- Image display in grid
- Create/Update/Delete operations
- Truncated description with tooltip
- HTML description sanitization
- ✅ **Components Used**:
- BasePageComponent for layout
- MudDataGrid for listing
- MudCard for display
- Image component for thumbnails
#### Implementation Status:
```
[✅] 1. Create PackageCQ handlers in BFF (6 handlers)
[✅] 2. Add Package proto definitions
[✅] 3. Implement file upload for images
[✅] 4. Create PackageMainPage.razor
[✅] 5. Add CRUD dialogs/components
[✅] 6. Integrate with gRPC service
[✅] 7. Add validators for all commands
```
#### Files Created: **21 files**
- Commands: 10 files (3 handlers × 3-4 files each)
- Queries: 11 files (3 handlers × 3-4 files each)
- UI: 2 files (razor + code-behind)
#### Quality Notes:
- ✅ All handlers have validators
- ✅ Proper error handling
- ✅ Image upload integrated
- ✅ gRPC integration complete
- ✅ UI with modern MudBlazor components
- ✅ Server-side pagination
- ✅ User status query for eligibility checks
---
## 📊 **Updated Statistics**
### **Total Implementation Count**:
- **BFF Handlers**: 41 (was 35)
- Commission: 15
- Club: 6
- Network: 9
- Configuration: 3
- Health: 2
- **Package: 6** ⭐ NEW
- **Frontend Pages**: 24 (was 23)
- Commission: 4
- Network: 4
- Club: 3
- Dashboard: 1
- Settings: 1
- System: 4
- **Package: 1** ⭐ NEW
- **BFF Services**: 6 (was 5)
- CommissionService
- ClubMembershipService
- NetworkMembershipService
- ConfigurationService
- HealthService
- **PackageService** ⭐ NEW
### **Protobuf Packages**: 6
- Commission
- ClubMembership
- NetworkMembership
- Configuration
- Health
- **Package** ⭐ NEW
---
## 🎯 **Package System Integration**
### CMS Layer (Backend):
```
✅ PurchaseGoldenPackageCommand (135 lines)
- User validation
- Package validation
- Address check
- Gateway initiation
✅ VerifyGoldenPackagePurchaseCommand (161 lines)
- Idempotent verify
- Wallet charging (Balance)
- Transaction creation
- User state update
```
### BFF Layer (Gateway):
```
✅ 3 Commands (Create, Update, Delete)
✅ 3 Queries (GetById, GetAll, GetUserStatus)
✅ File Upload Support
✅ gRPC Integration
```
### UI Layer (Frontend):
```
✅ PackageMainPage.razor
✅ CRUD Operations
✅ Image Display
✅ Filtering & Pagination
```
---
## 📝 **Recent Updates (2024-12-04)**
### Added:
1. **Package Management** - Complete CRUD system
- 6 BFF handlers (3 Commands + 3 Queries)
- 1 UI page with full functionality
- Image upload support
- User status checking
2. **CMS Package Purchase** - Complete payment flow
- Purchase initiation with gateway
- Verify with idempotency
- Wallet charging
- Documented in `03-BACKEND/CMS/implementation-status.md` Phase 14
### Statistics Update:
- BFF Handlers: 35 → **41** (+6)
- Frontend Pages: 23 → **24** (+1)
- BFF Services: 5 → **6** (+1)
- Protobuf Packages: 5 → **6** (+1)
---
## ✅ **Completion Status: 100%**
All planned features for BackOffice are **complete and production ready**:
- ✅ Commission Management (4 pages)
- ✅ Network Management (4 pages)
- ✅ Club Management (3 pages)
- ✅ System Management (4 pages)
- ✅ Dashboard & Settings (2 pages)
-**Package Management (1 page)** ⭐ NEW
- ✅ Health Monitoring (2 handlers)
**Total**: 24 Pages + 41 Handlers + 6 Services = **Production Ready** 🚀
+108 -1
View File
@@ -1,3 +1,110 @@
# FrontOffice.BFF
FrontOffice BFF
## Overview
FrontOffice.BFF (Backend-For-Frontend) is a gRPC-based API gateway that serves the FrontOffice web application. It communicates with the CMS microservice via gRPC and exposes APIs to the frontend.
## Architecture
```
Frontend (FrontOffice) → FrontOffice.BFF → CMS Microservice
```
## Project Structure
```
FrontOffice.BFF/
├── src/
│ ├── FrontOffice.BFF.Application/ # CQRS handlers, DTOs, interfaces
│ ├── FrontOffice.BFF.Domain/ # Domain entities
│ ├── FrontOffice.BFF.Infrastructure/ # gRPC clients, DI config
│ ├── FrontOffice.BFF.WebApi/ # gRPC services, mappings
│ └── Protobufs/ # Proto definitions for frontend
│ ├── FrontOffice.BFF.Category.Protobuf/
│ ├── FrontOffice.BFF.DiscountShop.Protobuf/ # NEW
│ ├── FrontOffice.BFF.Package.Protobuf/
│ ├── FrontOffice.BFF.Products.Protobuf/
│ ├── FrontOffice.BFF.ShopingCart.Protobuf/
│ ├── FrontOffice.BFF.Transaction.Protobuf/
│ ├── FrontOffice.BFF.User.Protobuf/
│ ├── FrontOffice.BFF.UserAddress.Protobuf/
│ ├── FrontOffice.BFF.UserOrder.Protobuf/
│ └── FrontOffice.BFF.UserWallet.Protobuf/
```
## Feature Modules
### DiscountShopCQ (New - Jan 2025)
فروشگاه تخفیفی برای اعضای باشگاه مشتریان
**Queries:**
- `GetDiscountProducts` - لیست محصولات تخفیفی
- `GetDiscountCategories` - دسته‌بندی‌های فروشگاه
- `GetMyDiscountCart` - سبد خرید تخفیفی کاربر
- `GetMyDiscountOrders` - سفارشات تخفیفی کاربر
**Commands:**
- `AddToDiscountCart` - افزودن به سبد خرید
- `RemoveFromDiscountCart` - حذف از سبد خرید
- `PlaceDiscountOrder` - ثبت سفارش
### CommissionCQ
سیستم کمیسیون شبکه‌ای
**Queries:**
- `GetMyCommissionPayouts` - لیست پرداخت‌های کمیسیون
- `GetMyWeeklyBalances` - بالانس‌های هفتگی
### NetworkMembershipCQ
عضویت شبکه‌ای و درخت باینری
**Queries:**
- `GetMyNetworkPosition` - موقعیت کاربر در شبکه
- `GetMyNetworkStatistics` - آمار شبکه
- `GetMyNetworkTree` - درخت شبکه
### ClubMembershipCQ
عضویت باشگاه مشتریان
**Queries:**
- `GetMyClubMembership` - وضعیت عضویت
**Commands:**
- `ActivateMyClubMembership` - فعال‌سازی عضویت
### UserWalletCQ
کیف پول کاربر
**Queries:**
- `GetUserWallet` - موجودی کیف پول
- `GetAllUserWalletChangeLog` - تاریخچه تراکنش‌ها
**Commands:**
- `WithdrawBalance` - درخواست برداشت
- `TransferUserWalletBallance` - انتقال موجودی (TODO: needs CMS proto)
- `DeleteUser` - حذف کاربر
## gRPC Clients (CMS Connection)
Defined in `IApplicationContractContext.cs`:
- `ProductContract` - محصولات
- `CategoryContract` - دسته‌بندی‌ها
- `ShopingCartContract` - سبد خرید
- `TransactionContract` - تراکنش‌ها
- `UserWalletContract` - کیف پول
- `UserContract` - کاربران
- `UserOrderContract` - سفارشات
- `NetworkMembershipContract` - عضویت شبکه
- `CommissionContract` - کمیسیون
- `ClubMembershipContract` - باشگاه مشتریان
- `DiscountProductContract` - محصولات تخفیفی (NEW)
- `DiscountCategoryContract` - دسته‌بندی تخفیفی (NEW)
- `DiscountShoppingCartContract` - سبد خرید تخفیفی (NEW)
- `DiscountOrderContract` - سفارش تخفیفی (NEW)
## Build & Run
```bash
cd FrontOffice.BFF/src
dotnet build
dotnet run --project FrontOffice.BFF.WebApi
```
## Last Updated
January 2025 - Added DiscountShop integration (4 gRPC clients, 7 handlers, Proto service)
+33 -26
View File
@@ -14,6 +14,7 @@
| Services Backend | 8 فایل (4 Interface + 4 Implementation) | ✅ کامل |
| Dialog Components | 6 کامپوننت | ✅ کامل |
| اتصالات CRUD | همه عملیات | ✅ کامل |
| گزارش‌ها و نمودارهای مالی | 2 صفحه | 🟡 تکمیل پایه (PDF باقیمانده) |
| **جمع کل** | **60 صفحه + 8 سرویس + 6 دیالوگ** | **95% آماده** 🎉 |
---
@@ -28,7 +29,7 @@
- ✅ Commission/Dashboard.razor - داشبورد کمیسیون
- ✅ Commission/Reports.razor - گزارش‌های هفتگی
- ✅ Commission/Payouts.razor - پرداخت کاربران
- ✅ Commission/Withdrawals.razor - درخواست‌های برداشت
- ✅ Commission/Withdrawals.razor - درخواست‌های برداشت (لیست، فیلتر وضعیت، دکمه‌های Approve/Reject/Process متصل به API، نمایش BankReferenceId / TrackingCode / PaymentFailureReason)
### 3. شبکه (3 صفحه)
- ✅ Network/Tree.razor - درخت شبکه
@@ -46,6 +47,7 @@
- ✅ Category/ - مدیریت دسته‌بندی‌ها
- ✅ UserOrder/ - مدیریت سفارشات
- ✅ Products/Components/ - کامپوننت‌های محصول
- ✅ Tag/ - مدیریت تگ‌ها (لیست + جستجو + ایجاد/ویرایش/حذف، اختصاص تگ به محصول از طریق ProductsMainPage، نمایش تگ‌های فعلی هر محصول و امکان حذف آن‌ها در AssignTagsDialog)
### 6. مدیریت کاربران و نقش‌ها (4 صفحه)
- ✅ User/ - مدیریت کاربران
@@ -258,46 +260,51 @@ NavMenu.razor - آپدیت شده با بخش‌های جدید:
#### 3. بهبود UI/UX صفحات موجود
```
⏸️ Products/ProductsMainPage.razor
- افزودن bulk operations (حذف/تغییر وضعیت دسته‌ای)
- افزودن export به Excel
- بهبود فیلترهای پیشرفته
- افزودن bulk operations (حذف/تغییر وضعیت دسته‌ای)
- افزودن export به Excel (خروجی CSV از لیست محصولات با توجه به فیلترهای فعلی)
- بهبود فیلترهای پیشرفته
- ✅ افزودن صفحه ویرایش گروهی محصولات (Pages/Products/BulkEdit.razor) با فرم Bulk Update قیمت، تخفیف، موجودی و وضعیت (اتصال به BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus)
⏸️ UserOrder/OrdersMainPage.razor
- افزودن timeline سفارش
- افزودن نمایش نمودار آماری سفارشات
- بهبود جستجوی پیشرفته
- افزودن timeline سفارش (نمایش مراحل ثبت سفارش، پرداخت، ارسال و تحویل/مرجوعی در UserOrderDetailsDialog بر اساس PaymentStatus و DeliveryStatus)
- افزودن نمایش نمودار آماری سفارشات (کارت جمع سفارش‌ها و نمودار تعداد سفارش بر اساس وضعیت ارسال)
- بهبود جستجوی پیشرفته (فیلتر شناسه سفارش/کاربر/تراکنش و فیلترهای ترکیبی)
- ✅ دکمه‌های مدیریت سفارش: لغو سفارش (CancelOrder) با Dialog دلیل/بازگشت وجه، تغییر وضعیت ارسال (UpdateOrderStatus) از طریق ChangeOrderStatusDialog، و Dialog اعمال تخفیف دستی (ApplyDiscountToOrder) متصل به gRPC BackOffice.BFF.UserOrder
```
#### 4. گزارش‌های جدید (2 صفحه)
```
⏸️ Commission/Reports/WithdrawalReports.razor
- گزارش برداشت‌های کاربران
- نمودار روند برداشت‌ها
- فیلتر: بازه تاریخ، کاربر، وضعیت
- Export به PDF/Excel
Commission/Reports/WithdrawalReports.razor
- گزارش برداشت‌های کاربران (جمع‌بندی دوره‌ای)
- نمودار روند برداشت‌ها (مبالغ و تعداد درخواست‌ها)
- فیلتر: بازه تاریخ، کاربر، وضعیت، نوع دوره
- Export به Excel (CSV) ✅، Export به PDF 🟡 (خروجی متنی ساختارمند؛ PDF واقعی در نسخه بعدی)
⏸️ DiscountShop/Reports/SalesReports.razor
- گزارش فروش فروشگاه تخفیفی
- نمودار پرفروش‌ترین محصولات
- آمار درآمد
DiscountShop/Reports/SalesReports.razor
- گزارش فروش فروشگاه تخفیفی (لیست سفارش‌ها با فیلتر تاریخ/وضعیت/جستجو)
- نمودار روند فروش (مبلغ نهایی و تخفیف)
- نمودار پرفروش‌ترین محصولات (بر اساس مبلغ فروش)
- آمار درآمد: مجموع فروش، مجموع تخفیف، میانگین مبلغ سفارش
```
### اولویت پایین (Nice to Have)
#### 5. قابلیت‌های اضافی
```
⏸️ Dashboard/DiscountShopWidget.razor
- ویجت آمار فروشگاه تخفیفی در داشبورد اصلی
- نمایش: فروش روزانه، سفارشات جدید، محصولات پرفروش
Dashboard/DiscountShopWidget.razor
- ویجت آمار فروشگاه تخفیفی در داشبورد اصلی (صفحه Dashboard/SystemOverview)
- نمایش: تعداد سفارش‌ها و مجموع فروش ۷ روز اخیر، آمار امروز، نمودار روند فروش روزانه (Line Chart)
⏸️ PublicMessages/Templates/
- قالب‌های آماده پیام
- ذخیره پیام‌های پرکاربرد
PublicMessages/Templates/
- مدیریت قالب‌های آماده پیام در دیالوگ جداگانه (MessageTemplatesDialog)
- ذخیره قالب‌ها در LocalStorage مرورگر (بدون تغییر Backend)
- افزودن، حذف و مشاهده پیش‌نمایش قالب‌ها، دسترسی از PublicMessagesMainPage
⏸️ DiscountShop/Components/ProductImageGallery.razor
- گالری تصاویر محصول
- Upload multiple images
- Drag & drop reorder
DiscountShop/Components/ProductImageGallery.razor
- کامپوننت گالری تصاویر محصول برای DiscountShop (کلاینت‌ساید)
- Upload چندتایی تصاویر (multi-upload) و پیش‌نمایش Base64
- Drag & drop reorder برای تغییر ترتیب نمایش
- EventCallback برای ارسال لیست تصاویر مرتب‌شده به والد (برای اتصال بعدی به Backend)
```
---
+240 -162
View File
@@ -76,7 +76,7 @@ strong {
}
</style>
> **تاریخ به‌روزرسانی**: 1403/09/14 (2024-12-04)
> **تاریخ به‌روزرسانی**: 1403/10/06 (2024-12-26)
> **وضعیت کلی**: 99% تکمیل شده
> **مسیر توسعه**: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice
@@ -87,21 +87,21 @@ strong {
### ✅ تکمیل شده
- **CMS Microservice**: 95% (12 از 12 Phase کامل، 9 TODO handlers باقیمانده)
- **BackOffice.BFF**: 85% (47 Handler تکمیل، 8 TODO handlers، 19 Discount Shop handlers باقیمانده)
- **BackOffice UI**: 85% (56 صفحه آماده Production - قابل تحویل به Admin)
- **FrontOffice.BFF**: 20% (فقط برخی Queries پایه)
- **FrontOffice UI**: 10% (چند صفحه اولیه)
- **BackOffice UI**: 95% (60 صفحه آماده Production - قابل تحویل به Admin)
- **FrontOffice.BFF**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
- **FrontOffice UI**: 60% ✅ (Mock Services → gRPC تبدیل شده)
### 🔴 اولویت‌های اصلی (باید انجام شوند)
1. ~~تکمیل Payment Gateway Integration (CMS Phase 10)~~ ✅ Backend Complete (85%)
1. ~~تکمیل Payment Gateway Integration (CMS Phase 10)~~ ✅ Backend Complete (90%)
- ✅ DayaPaymentService پیاده‌سازی کامل
- ✅ GetWithdrawalReports Query (CMS + BackOffice.BFF)
- ⏸️ CMS gRPC Service + BackOffice UI باقیمانده
- ✅ GetWithdrawalReports Query (CMS + BackOffice.BFF + gRPC Service)
- ⏸️ BackOffice UI (Withdrawal Management + Reports تقریباً کامل؛ تست‌های Daya و خروجی PDF باقیمانده)
2. ~~Club Discount Shop System (CMS Phase 9)~~ ✅ Complete
3. ~~Product Bulk Operations~~ ✅ Backend Complete (100%)
4. ~~Order Management~~Proto/gRPC/Mapster Complete (9 TODO handlers باقیمانده)
5. ~~Public Messages System~~Proto/gRPC Complete (5 TODO handlers باقیمانده)
4. ~~Order Management~~Backend + BackOffice.BFF Complete (UI improvements باقیمانده)
5. ~~Public Messages System~~CMS + BackOffice.BFF + BackOffice UI Complete
6. **Package Purchase System** ✅ Proto/gRPC Complete (4 TODO handlers باقیمانده)
7. **Discount Shop - BackOffice Integration** 🔴 **اولویت اول** (0% - 19 handlers لازم)
7. **Discount Shop - BackOffice Integration** ✅ تکمیل شده (19 handlers + BackOffice UI متصل)
### 📦 **قابل تحویل به Admin**:
-**BackOffice با 56 صفحه کاملاً کاربردی**
@@ -111,8 +111,8 @@ strong {
- Discount Shop, Tags, Product Bulk Ops, Withdrawal Reports
- ⚠️ **نیاز به تکمیل**:
- 9 TODO handlers در CMS
- 27 TODO handlers در BackOffice.BFF
- UI برای Discount Shop, Public Messages, Reports
- ~~27 TODO handlers در BackOffice.BFF~~ ✅ handlers BackOffice.BFF تکمیل شده‌اند
- UI برای گزارش‌های پیشرفته (Reports) و برخی بهبودهای FrontOffice
---
@@ -127,31 +127,38 @@ strong {
└── ✅ Withdrawal & Settlement
مرحله 2: تکمیل Payment Gateway + CRUD اضافی (در حال انجام)
├── ✅ Payment Gateway Backend (85%)
├── ✅ Payment Gateway Backend (100%)
│ ├── ✅ DayaPaymentService Implementation
│ ├── ✅ GetWithdrawalReports (CMS + BFF)
│ ├── [ ] CMS gRPC Service
│ └── [ ] BackOffice UI (Reports + Withdrawal Management)
├── [ ] Product Bulk Operations - نیم روز
├── [ ] Order Management - نیم روز
└── [ ] Public Messages System - نیم روز
│ ├── ✅ GetWithdrawalReports (CMS + BFF + gRPC)
│ ├── [] CMS gRPC Service (GetWithdrawalReports)
│ └── [🟡] BackOffice UI (Reports و Withdrawal Management انجام شده، PDF و تست‌های Daya باقیمانده)
├── [] Product Bulk Operations - نیم روز
├── [] Order Management - نیم روز (بهبود UI: Timeline، نمودارها، Cancel/Status/Discount در BackOffice UI)
└── [ ] Public Messages System - نیم روز (تنها بهبودهای UX/UI)
مرحله 3: BackOffice UI تکمیلی
├── [ ] Financial Reports Page - 1.5 روز
├── [ ] Withdrawal Management Page - 2 روز
└── [ ] Product Bulk Operations UI - نیم روز
├── [🟡] Financial Reports Page - 1.5 روز (WithdrawalReports + SalesReports پیاده‌سازی شده؛ خروجی PDF باقیمانده)
├── [🟡] Withdrawal Management Page - 2 روز (صفحه عملیاتی شده؛ جستجو بر اساس UserId/IbanNumber باقیمانده)
└── [🟡] Product Bulk Operations UI - نیم روز (Bulk actions در ProductsMainPage.razor انجام شده؛ صفحه BulkEdit مجزا باقیمانده)
مرحله 4: FrontOffice (اولویت اصلی بعدی)
├── FrontOffice.BFF APIs - 2 هفته
│ ├── Browse Discount Shop Products
│ ├── Shopping Cart Management
│ ├── Order Placement & Payment
── Order Tracking
└── FrontOffice UI Pages - 3 هفته
├── Product Catalog
── Shopping Cart
├── Checkout Flow
── Order History
مرحله 4: FrontOffice (اولویت اصلی بعدی) ✅ 70% Complete
├── FrontOffice.BFF APIs - ✅ 80% Complete
│ ├── Browse Discount Shop Products (Proto ready)
│ ├── ✅ Club Membership APIs
│ ├── ✅ Network APIs
── ✅ Commission APIs
│ ├── ✅ Wallet APIs (6 handlers)
├── [ ] Shopping Cart Management
── [ ] Order Placement
└── FrontOffice UI Pages - ✅ 60% Complete
── ✅ Product Catalog (متصل به gRPC)
├── ✅ Shopping Cart
├── ✅ Checkout Flow
├── ✅ Order History
├── ✅ Club & Commission Pages (متصل به gRPC)
├── ✅ Network Pages (متصل به gRPC)
├── ✅ Wallet Pages (متصل به gRPC)
└── [ ] Package Purchase (4 صفحه)
```
---
@@ -182,7 +189,7 @@ strong {
---
### 1.1 Payment Gateway Integration (Phase 10) ⭐ **فوری**
**وضعیت**: 85% تکمیل (گزارش‌های مالی افزوده شد)
**وضعیت**: 90% تکمیل (Backend + گزارش‌های مالی + صفحات اصلی UI)
**زمان تخمینی**: 4-5 روز کاری باقیمانده
#### ✅ تکمیل شده:
@@ -202,33 +209,33 @@ strong {
- دسته‌بندی روزانه/هفتگی/ماهانه با پشتیبانی تقویم شمسی
- خلاصه آماری (تعداد، مبلغ، نرخ موفقیت)
#### باقیمانده:
**الف. CMS gRPC Service (1 روز)**
#### 🟡 بخش‌های باقیمانده:
**الف. CMS gRPC Service (1 روز) - ✅ انجام شده**
```
- [ ] ایجاد CommissionService یا به‌روزرسانی موجود
- [ ] پیاده‌سازی GetWithdrawalReports RPC handler
- [ ] Mapping از Domain به Proto
- [ ] تست gRPC endpoint
- [] ایجاد CommissionService یا به‌روزرسانی موجود
- [] پیاده‌سازی GetWithdrawalReports RPC handler
- [] Mapping از Domain به Proto
- [] تست gRPC endpoint
```
**ب. BackOffice UI - Withdrawal Management (2 روز)**
```
- [ ] صفحه لیست درخواست‌های برداشت
- [ ] دکمه‌های تأیید/رد با Confirmation Dialog
- [ ] نمایش BankReferenceId و TrackingCode
- [ ] نمایش وضعیت PaymentFailed و دلیل خطا
- [ ] فیلترینگ بر اساس Status
- [ ] جستجو بر اساس UserId/IbanNumber
- صفحه لیست درخواست‌های برداشت
- دکمه‌های تأیید/رد با Confirmation Dialog (متصل به ApproveWithdrawal / RejectWithdrawal / ProcessWithdrawal)
- نمایش BankReferenceId و TrackingCode
- نمایش وضعیت PaymentFailed و دلیل خطا
- فیلترینگ بر اساس Status (CommissionPayoutStatus)
- جستجو بر اساس UserId/IbanNumber
```
**ج. BackOffice UI - Financial Reports (1.5 روز)**
```
- [ ] صفحه گزارش‌های مالی با فیلترها (تاریخ، نوع دوره، وضعیت، کاربر)
- [ ] نمایش گزارش‌های دوره‌ای (روزانه/هفتگی/ماهانه)
- [ ] Chart.js visualization (نمودار میله‌ای/خطی)
- [ ] نمایش خلاصه آماری (کارت‌های اطلاعاتی)
- [ ] خروجی Excel (EPPlus)
- [ ] خروجی PDF (QuestPDF)
- [] صفحه گزارش‌های مالی با فیلترها (تاریخ، نوع دوره، وضعیت، کاربر)
- [] نمایش گزارش‌های دوره‌ای (روزانه/هفتگی/ماهانه)
- [] نمودارها (MudBlazor Charts بهجای Chart.js)
- [] نمایش خلاصه آماری (کارت‌های اطلاعاتی در WithdrawalReports/SalesReports)
- [] خروجی Excel/CSV (Export به فایل از طریق UI)
- [🟡] خروجی PDF (در حال حاضر خروجی متنی ساختارمند از طریق jsSaveAsFile؛ ادغام QuestPDF در نسخه بعدی)
```
**د. تست یکپارچه (نیم روز)**
@@ -241,7 +248,7 @@ strong {
---
### 1.2 CRUD های اضافی ⭐ **بالا**
**وضعیت**: 67% (Tag Management و Product Bulk Operations کامل شده)
**وضعیت**: 80% (Tag Management و Product Bulk Operations کامل شده، Order Management در BFF تکمیل)
**زمان تخمینی**: 1 روز باقیمانده
#### الف. Tag Management ✅ **کامل شده** (4 دسامبر 2024)
@@ -268,13 +275,13 @@ BackOffice.BFF: ✅
- [✅] gRPC Clients: Tags, ProductTags registered
- [✅] Typo Fixes: ProductGallerys→ProductGalleries, PruductCategory→ProductCategory
BackOffice UI: ⏸️
- [ ] صفحه مدیریت Tags
- [ ] Dialog ایجاد/ویرایش Tag
- [ ] صفحه Assign Tags به محصولات
BackOffice UI:
- [] صفحه مدیریت Tags (لیست + جستجو بر اساس نام/عنوان، فیلتر وضعیت، pagination)
- [] Dialog ایجاد/ویرایش Tag (Name, Title, Description, IsActive, SortOrder)
- [] صفحه/دیالوگ Assign Tags به محصولات (از طریق ProductsMainPage → AssignTagsDialog، شامل نمایش تگ‌های فعلی هر محصول و امکان حذف آن‌ها)
```
**مستندات**: Backend کامل، UI باقیمانده
**مستندات**: Backend + BackOffice.BFF + UI کامل برای Tag Management
#### ب. Product Bulk Operations ✅ **کامل شده** (4 دسامبر 2024)
```
@@ -301,10 +308,10 @@ BackOffice.BFF: ✅
- [✅] DTOs با rename برای جلوگیری از conflict با proto
- [✅] gRPC client integration
BackOffice UI: ⏸️
- [ ] صفحه Bulk Edit Products
- [ ] DataGrid با انتخاب چندتایی
- [ ] فرم Bulk Update
BackOffice UI:
- [] DataGrid با انتخاب چندتایی و Bulk Actions (ToggleStatus/Delete) در ProductsMainPage.razor
- [✅] صفحه Bulk Edit Products (Pages/Products/BulkEdit.razor) با DataGrid و Multiple Selection
- [] فرم Bulk Update برای ویرایش هم‌زمان قیمت، تخفیف، موجودی (StockUpdateType: Set/Add/Subtract) و وضعیت (Toggle Status) چند محصول، متصل به BulkUpdateProductPrices / BulkUpdateProductStock / ToggleProductStatus
```
#### ج. Order Management ✅ **کامل شده** (4 دسامبر 2024)
@@ -317,14 +324,14 @@ CMS Application Layer: ✅
- [✅] CalculateOrderPVQuery + Handler + Validator (TODO با محاسبه PV برای MLM)
- [✅] Response DTOs با error handling
BackOffice.BFF: ⏸️
- [ ] 4 Handlers (TODO)
BackOffice.BFF:
- [] 5 Handlers (CancelOrder, UpdateOrderStatus, GetOrdersByDateRange, ApplyDiscountToOrder, CalculateOrderPV)
BackOffice UI: ⏸️
- [ ] دکمه Cancel Order با Confirmation
- [ ] Dropdown تغییر Status
- [ ] فیلتر Date Range
- [ ] Dialog اعمال تخفیف
BackOffice UI:
- [] دکمه Cancel Order با Dialog دلیل لغو و انتخاب بازگشت وجه (CancelOrderDialog → CancelOrder)
- [] Dialog تغییر Status ارسال (ChangeOrderStatusDialog → UpdateOrderStatus) در UserOrderMainPage.razor
- [] فیلترهای پیشرفته (شناسه سفارش/کاربر/تراکنش، فیلترهای ترکیبی)
- [] Dialog اعمال تخفیف (ApplyDiscountDialog → ApplyDiscountToOrder)
```
**سطوح دسترسی**:
@@ -372,26 +379,18 @@ CMS:
```
CMS:
- [✅] Proto: public_messages.proto موجود
- [ ] Entity: PublicMessage (Title, Content, Type, StartDate, EndDate, IsActive)
- [ ] Enum: MessageType (Info, Warning, Error, Success)
- [] Entity: PublicMessage (Title, Content, Type, StartDate, EndDate, IsActive)
- [] Enum: MessageType (Info, Warning, Error, Success)
#### ❌ باقی‌مانده:
```
BackOffice.BFF:
- [ ] 8 Handlers (TODO format):
- CreatePublicMessage
- UpdatePublicMessage
- DeletePublicMessage
- PublishMessage
- ArchiveMessage
- GetAllMessages
- GetActiveMessages
- GetPublicMessage
- [✅] 8 Handlers (Create/Update/Delete/Publish/Archive/GetAll/GetActive/GetById)
BackOffice UI:
- [ ] صفحه لیست اعلانات (DataGrid)
- [ ] Dialog ایجاد/ویرایش اعلان
- [ ] دکمه Publish/Archive
- [ ] پیش‌نمایش اعلان
- [✅] صفحه لیست اعلانات (DataGrid)
- [✅] Dialog ایجاد/ویرایش اعلان
- [✅] دکمه Publish/Archive
- [✅] پیش‌نمایش اعلان
```
**سطوح دسترسی**:
@@ -1133,16 +1132,20 @@ ApplicationContractContext:
* RefreshPermissions()
```
**د. Public Messages Management** (1 روز)
**د. Public Messages Management** (1 روز) ✅ (پیاده‌سازی شده با ساختار نهایی)
```
- [ ] Pages/Messages/MessagesList.razor
* DataGrid: Title, Type, StartDate, EndDate, IsActive
* دکمه‌های Create, Edit, Delete, Publish
- [ ] Components/MessageDialog.razor
* فرم: Title, Content (TinyMCE), Type, Dates
* پیش‌نمایش
- [ ] Components/MessagePreview.razor
* Alert با رنگ بر اساس Type
- [] Pages/PublicMessages/PublicMessagesMainPage.razor
* DataGrid: Title, Type, Status, StartDate, EndDate, IsActive
* دکمه‌های Create, Edit, Delete, Publish/Archive
* فیلترها بر اساس نوع پیام، وضعیت و بازه زمانی
- [✅] Components/MessageFormDialog.razor
* فرم: Title, Content (Rich Text)، Type، تاریخ‌های Start/End، وضعیت، گزینه انتشار
* پیش‌نمایش و Validation کامل
- [✅] Components/MessageViewDialog.razor
* نمایش پیام به‌صورت Alert/کارت با رنگ بر اساس Type
* نمایش تصویر، لینک، آمار بازدید و تاریخ‌ها
- [✅] Components/MessageTemplatesDialog.razor
* مدیریت قالب‌های آماده پیام (ایجاد/حذف/استفاده) با ذخیره‌سازی در LocalStorage
```
**ه. Manual Payment Management** (1 روز)
@@ -1157,21 +1160,27 @@ ApplicationContractContext:
* دکمه‌های Approve/Reject
```
**و. Tag Management** (1 روز)
**و. Tag Management** (1 روز) ✅ (با نام‌گذاری و ساختار جدید)
```
- [ ] Pages/Products/Tags.razor
* DataGrid: Name, ProductCount
- [] Pages/Tag/TagManagementPage.razor
* DataGrid: Name, Title, IsActive, ProductCount
* دکمه‌های Create, Edit, Delete
- [ ] Components/TagDialog.razor
- [ ] Components/AssignTagsDialog.razor
* فیلتر بر اساس نام/عنوان و وضعیت
- [] Components/TagEditDialog.razor
* فرم ایجاد/ویرایش Tag: Name, Title, Description, IsActive, SortOrder
- [✅] Components/AssignTagsDialog.razor
* اختصاص تگ به محصولات از طریق ProductsMainPage
* نمایش تگ‌های فعلی هر محصول و امکان حذف آن‌ها
```
**ز. Product Bulk Edit** (1 روز)
**ز. Product Bulk Edit** (1 روز)
```
- [ ] Pages/Products/BulkEdit.razor
* DataGrid با Multiple Selection
* فرم: Update Price, Update Stock, Toggle Status
* دکمه Apply
- [] Pages/Products/BulkEdit.razor
* DataGrid با Multiple Selection برای لیست محصولات (با فیلترهای مشابه ProductsMainPage)
* فرم: Update Price (اجباری برای BulkUpdateProductPrices) + فیلدهای اختیاری تخفیف و تخفیف باشگاه
* فرم: Update Stock با انتخاب StockUpdateType (Set/Add/Subtract) و مقدار Quantity
* فرم: Toggle Status (فعال/غیرفعال) برای محصولات انتخاب‌شده
* دکمه Apply با Dialog تأیید و خلاصه تغییرات، اتصال مستقیم به gRPC (BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus) در BackOffice.BFF
```
**ح. Role Management** (2 روز) - **SuperAdmin only**
@@ -1202,63 +1211,90 @@ ApplicationContractContext:
## 🔵 بخش 4: FrontOffice.BFF - کارهای باقی‌مانده
**وضعیت**: 20% (فقط برخی Queries پایه موجود)
**زمان تخمینی**: 2 هفته
**وضعیت**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
**زمان تخمینی**: 3 روز باقیمانده
### تسک‌های اصلی:
### ✅ تکمیل شده (2024-12-26):
**الف. Authentication APIs** (3 روز)
**Proto Projects (7 پروژه جدید):**
```
- [ ] RegisterCommand + Handler
- [ ] LoginQuery + Handler
- [ ] VerifyOtpCommand + Handler
- [ ] RefreshTokenCommand + Handler
- [ ] LogoutCommand + Handler
- [ ] GetMyProfileQuery + Handler
- [ ] UpdateMyProfileCommand + Handler
✅ FrontOffice.BFF.Commission.Protobuf
✅ FrontOffice.BFF.ClubMembership.Protobuf
✅ FrontOffice.BFF.NetworkMembership.Protobuf
✅ FrontOffice.BFF.DiscountShop.Protobuf
✅ FrontOffice.BFF.Package.Protobuf (جدید)
✅ FrontOffice.BFF.User.Protobuf (موجود)
✅ FrontOffice.BFF.UserWallet.Protobuf (موجود)
```
**ب. Order APIs** (3 روز)
**Handlers تکمیل شده:**
```
- [ ] GetMyOrdersQuery + Handler
- [ ] GetMyOrderQuery + Handler
GetMyClubMembershipQuery + Handler
✅ ActivateMyClubMembershipCommand + Handler
✅ GetMyCommissionPayoutsQuery + Handler
✅ GetMyWeeklyBalancesQuery + Handler
✅ GetMyNetworkTreeQuery + Handler
✅ GetMyNetworkStatisticsQuery + Handler
✅ GetMyNetworkPositionQuery + Handler (جدید با ResponseDto)
✅ Wallet Handlers (6 عدد - متصل به CMS)
```
### تسک‌های باقیمانده:
**الف. Authentication APIs** (1 روز) - موجود نیاز به بررسی
```
- [✅] RegisterCommand + Handler
- [✅] LoginQuery + Handler
- [ ] VerifyOtpCommand + Handler (بررسی)
- [✅] RefreshTokenCommand + Handler
- [ ] LogoutCommand + Handler (بررسی)
- [✅] GetMyProfileQuery + Handler
- [✅] UpdateMyProfileCommand + Handler
```
**ب. Order APIs** (1 روز)
```
- [✅] GetMyOrdersQuery + Handler
- [✅] GetMyOrderQuery + Handler
- [ ] CreateOrderCommand + Handler
- [ ] CancelMyOrderCommand + Handler
- [ ] GetOrderTrackingQuery + Handler
```
**ج. Profile APIs** (2 روز)
**ج. Profile APIs** (0.5 روز)
```
- [ ] GetMyAddressesQuery + Handler
- [ ] CreateMyAddressCommand + Handler
- [ ] UpdateMyAddressCommand + Handler
- [ ] DeleteMyAddressCommand + Handler
- [] GetMyAddressesQuery + Handler
- [] CreateMyAddressCommand + Handler
- [] UpdateMyAddressCommand + Handler
- [] DeleteMyAddressCommand + Handler
- [ ] SetDefaultAddressCommand + Handler
```
**د. Club & Commission (Customer)** (2 روز)
**د. Club & Commission (Customer)** ✅ تکمیل شده
```
- [ ] GetMyClubMembershipQuery + Handler
- [ ] ActivateMyClubMembershipCommand + Handler
- [ ] GetMyCommissionPayoutsQuery + Handler
- [ ] RequestMyWithdrawalCommand + Handler
- [] GetMyClubMembershipQuery + Handler
- [] ActivateMyClubMembershipCommand + Handler
- [] GetMyCommissionPayoutsQuery + Handler
- [] RequestMyWithdrawalCommand + Handler
```
**ه. Network (Customer)** (2 روز)
**ه. Network (Customer)** ✅ تکمیل شده
```
- [ ] GetMyNetworkTreeQuery + Handler
- [ ] GetMyNetworkPositionQuery + Handler
- [ ] GetMyNetworkStatisticsQuery + Handler
- [] GetMyNetworkTreeQuery + Handler
- [] GetMyNetworkPositionQuery + Handler
- [] GetMyNetworkStatisticsQuery + Handler
```
**و. Wallet (Customer)** (2 روز)
**و. Wallet (Customer)** ✅ تکمیل شده
```
- [ ] GetMyWalletQuery + Handler (با DiscountBalance)
- [ ] GetMyTransactionsQuery + Handler
- [ ] GetMyDiscountTransactionsQuery + Handler
- [] GetMyWalletQuery + Handler (با DiscountBalance)
- [] GetMyTransactionsQuery + Handler
- [] RequestWithdrawalCommand + Handler
- [✅] GetMyWithdrawalsQuery + Handler
- [✅] GetWithdrawalSettingsQuery + Handler
```
**ز. Cart (Customer)** (2 روز)
**ز. Cart (Customer)** (0.5 روز)
```
- [ ] GetMyCartQuery + Handler
- [ ] AddToMyCartCommand + Handler
@@ -1274,53 +1310,95 @@ ApplicationContractContext:
## 🟣 بخش 5: FrontOffice UI - کارهای باقی‌مانده
**وضعیت**: 10% (چند صفحه پایه)
**زمان تخمینی**: 3 هفته
**وضعیت**: 60% ✅ (Mock Services → gRPC تبدیل شده)
**زمان تخمینی**: 2 هفته
### تسک‌های اصلی:
### ✅ تکمیل شده (2024-12-26):
**الف. Authentication Pages** (3 روز)
**Services متصل به BFF gRPC:**
```
- [ ] Pages/Auth/Register.razor
- [ ] Pages/Auth/Login.razor
- [ ] Pages/Auth/VerifyOtp.razor
✅ ClubMembershipService → ClubMembershipContract.ClubMembershipContractClient
✅ NetworkMembershipService → NetworkMembershipContract.NetworkMembershipContractClient
✅ CommissionService → CommissionContract.CommissionContractClient
✅ WalletService → UserWalletContract.UserWalletContractClient (6 متد)
```
**Proto References اضافه شده:**
```
✅ FrontOffice.BFF.ClubMembership.Protobuf
✅ FrontOffice.BFF.Commission.Protobuf
✅ FrontOffice.BFF.NetworkMembership.Protobuf
✅ FrontOffice.BFF.DiscountShop.Protobuf
✅ FrontOffice.BFF.UserWallet.Protobuf (ProjectReference)
```
### تسک‌های باقیمانده:
**الف. Authentication Pages** (2 روز) - موجود نیاز به بررسی
```
- [✅] Pages/Auth/Register.razor
- [✅] Pages/Auth/Login.razor
- [ ] Pages/Auth/VerifyOtp.razor (بررسی)
- [ ] Pages/Auth/ForgotPassword.razor
```
**ب. Profile Pages** (4 روز)
**ب. Profile Pages** (2 روز)
```
- [ ] Pages/Profile/Index.razor
- [ ] Pages/Profile/EditProfile.razor
- [ ] Pages/Profile/Addresses.razor
- [] Pages/Profile/Index.razor
- [] Pages/Profile/EditProfile.razor
- [] Pages/Profile/Addresses.razor
- [ ] Pages/Profile/ChangePassword.razor
```
**ج. Order Pages** (5 روز)
**ج. Order Pages** (3 روز)
```
- [ ] Pages/Orders/MyOrders.razor
- [ ] Pages/Orders/OrderDetails.razor
- [] Pages/Orders/MyOrders.razor
- [] Pages/Orders/OrderDetails.razor
- [ ] Pages/Orders/Tracking.razor
```
**د. Cart & Checkout** (5 روز)
**د. Cart & Checkout** (3 روز)
```
- [ ] Pages/Cart/Index.razor (با نمایش VAT)
- [ ] Pages/Checkout/Shipping.razor
- [ ] Pages/Checkout/Payment.razor
- [ ] Pages/Checkout/Confirmation.razor
- [] Pages/Cart/Index.razor (با نمایش VAT)
- [] Pages/Checkout/Shipping.razor
- [] Pages/Checkout/Payment.razor
- [] Pages/Checkout/Confirmation.razor
- [⏳] DiscountCode validation (نیاز به ValidateDiscountCode RPC در CMS)
```
**ه. Club & Commission** (4 روز)
**ه. Club & Commission** ✅ تکمیل شده (متصل به gRPC)
```
- [ ] Pages/Club/Membership.razor
- [ ] Pages/Commission/MyCommissions.razor
- [ ] Pages/Commission/Withdrawal.razor
- [] Pages/Club/Membership.razor
- [] Pages/Commission/MyCommissions.razor
- [] Pages/Commission/Withdrawal.razor
```
**و. Network Pages** (2 روز)
**و. Network Pages** ✅ تکمیل شده (متصل به gRPC)
```
- [ ] Pages/Network/Tree.razor
- [ ] Pages/Network/Position.razor
- [] Pages/Network/Tree.razor
- [] Pages/Network/Position.razor
```
**ز. Wallet Pages** ✅ تکمیل شده (متصل به gRPC)
```
- [✅] Pages/Wallet/Index.razor
- [✅] Pages/Wallet/Transactions.razor
- [✅] Pages/Wallet/Withdrawal.razor
```
**ح. Package Purchase** (2 روز)
```
- [ ] Pages/Packages/Index.razor
- [ ] Pages/Packages/PurchasePackage.razor
- [ ] Pages/Packages/MyPackages.razor
- [ ] Pages/Packages/PackageDetails.razor
```
### ⏳ نیاز به توسعه CMS:
```
- PackageDetail Reviews → نیاز به Review/Comment entity در CMS
- Checkout Discount Validation → نیاز به ValidateDiscountCode RPC در CMS
- Contact Form → نیاز به ContactMessage entity در CMS
```
**مستندات**: `FrontOffice/README.md`
+159 -89
View File
@@ -1,6 +1,7 @@
# 🎯 اسپرینت جاری (Current Sprint)
**تاریخ شروع**: ۱۴ آذر ۱۴۰۴
**آخرین بروزرسانی**: ۱۴ آذر ۱۴۰۴
**مدت**: 2 هفته
**هدف**: تکمیل FrontOffice UI و یکپارچه‌سازی BFF
@@ -9,90 +10,96 @@
## 📋 وضعیت کلی پروژه
### Backend:
-**CMS Microservice**: 95% Complete (Phase 9 & 12 Complete)
-**BackOffice.BFF**: 100% Complete (35 Handlers)
- 🚧 **FrontOffice.BFF**: 60% Complete (12 Handlers - 3 new today)
-**CMS Microservice**: ~95% Complete
-**BackOffice.BFF**: 100% Complete (35+ Handlers)
- **FrontOffice.BFF**: 90% Complete (Proto Projects + Handlers + Mappings)
### Frontend:
-**BackOffice UI**: 100% Complete (23 Pages)
- 🚧 **FrontOffice UI**: 75% Complete (24 Pages - 7 new today)
-**BackOffice UI**: ~95% Complete (60+ صفحه)
- 🟢 **FrontOffice UI**: 85% Complete (24+ صفحه - سرویس‌ها به gRPC وصل شدند)
---
## 🔥 High Priority (باید امروز/فردا تمام شود)
## ✅ تکمیل شده (۱۴ آذر ۱۴۰۴)
### 1. FrontOffice UI - Integration با BFF Real APIs ⏰
**Status**: 🚧 In Progress (Mock → Real API)
**Owner**: Frontend Team
**Deadline**: ۱۵ آذر (فردا)
### Proto Projects برای Frontend:
#### Tasks:
- [ ] **ClubMembership صفحات** (3 صفحه)
- [ ] `ClubInfo.razor` - اتصال به `GetClubMembershipInfo`
- [ ] `ActivateClub.razor` - اتصال به `ActivateClubMembership`
- [ ] `ClubFeatures.razor` - اتصال به `GetAvailableClubFeatures`
| پروژه | Endpoints | وضعیت |
|-------|-----------|-------|
| `FrontOffice.BFF.DiscountShop.Protobuf` | 7 RPCs | ✅ Complete |
| `FrontOffice.BFF.Commission.Protobuf` | `GetMyCommissionPayouts`, `GetMyWeeklyBalances` | ✅ Complete |
| `FrontOffice.BFF.ClubMembership.Protobuf` | `GetMyClubMembership`, `ActivateMyClubMembership` | ✅ Complete |
| `FrontOffice.BFF.NetworkMembership.Protobuf` | `GetMyNetworkPosition`, `GetMyNetworkTree`, `GetMyNetworkStatistics` | ✅ Complete |
| `FrontOffice.BFF.UserWallet.Protobuf` | 6 RPCs (Wallet, Transactions, Withdrawals) | ✅ Complete |
- [ ] **NetworkMembership صفحات** (2 صفحه)
- [ ] `Tree.razor` - اتصال به `GetNetworkTree` + Tree Builder
- [ ] `NetworkStats.razor` - اتصال به `GetNetworkStatistics`
### FrontOffice UI Services - اتصال به gRPC:
- [ ] **Commission صفحات** (2 صفحه)
- [ ] `WeeklyReport.razor` - اتصال به `GetWeeklyCommissionReport`
- [ ] `PayoutHistory.razor` - اتصال به `GetUserPayouts`
| Service | Status | توضیحات |
|---------|--------|---------|
| `ClubMembershipService` | ✅ Connected | GetMyMembership, ActivateMembership |
| `NetworkMembershipService` | ✅ Connected | GetTree, GetStatistics + Tree Mapping |
| `CommissionService` | ✅ Connected | GetPayouts, GetWeeklyBalances |
| `WalletService` | ✅ Connected | GetBalances, GetTransactions, RequestWithdrawal, GetWithdrawals, GetSettings |
**Blockers**:
- ⚠️ Protobuf mismatch (ActivationDate vs ActivatedAt) - نیاز به هماهنگی با Backend
- ⚠️ Tree structure در CMS flat list است - نیاز به Tree Builder در BFF
---
### 2. FrontOffice.BFF - رفع Protobuf Mismatches ⏰
**Status**: 🚧 In Progress
**Owner**: Backend Team
**Deadline**: ۱۵ آذر
#### Tasks:
- [ ] **ClubMembershipHandler** - تطبیق field names
```csharp
// CMS: ActivationDate → BFF: ActivatedAt
// FIX: Rename in proto or add mapping
### Build Status:
```
✅ FrontOffice: Build Succeeded - 0 Errors
✅ FrontOffice.BFF: Build Succeeded - 0 Errors
```
- [ ] **NetworkMembershipHandler** - پیاده‌سازی Tree Builder
```csharp
// CMS: Flat list → BFF: Tree structure
// FIX: Build tree from flat list recursively
```
---
- [ ] **CommissionHandler** - تطبیق WeekNumber type
```csharp
// CMS: WeekNumber (int) → BFF: WeekNumber (string)
// FIX: Convert int to "YYYY-Www" format
```
## ✅ به‌روزرسانی‌های BackOffice در این اسپرینت
**File**: `03-BACKEND/FrontOffice.BFF/protobuf-mismatch.md` دارای جزئیات کامل
> مطابق BACKLOG و ui-status (BackOffice)، تمرکز بخشی از این اسپرینت روی تکمیل BackOffice قبل از ورود جدی به FrontOffice بوده است.
### BackOffice.BFF
- ✅ تکمیل GetWithdrawalReports (CMS + BackOffice.BFF + gRPC Service)
- ✅ تکمیل Tag Management handlers (Create/Update/Delete/GetAll/GetById/AssignTagToProduct)
- ✅ تکمیل Discount Shop handlers (DiscountProduct / DiscountCategory / DiscountOrder / DiscountShoppingCart)
- ✅ تکمیل Public Messages BFF wiring (Contracts + handlers)
### BackOffice UI
- ✅ Commission / Withdrawal Management
- Commission/WithdrawalRequests.razor: اتصال واقعی به API (GetWithdrawalRequests, Approve/Reject/Process) + نمایش فیلدهای بانکی (BankReferenceId, TrackingCode, PaymentFailureReason)
- Commission/WithdrawalReports.razor: فیلترها، نمودارهای آماری، خلاصه آماری، Export به Excel/CSV + خروجی متنی ساختارمند برای PDF
- ✅ Discount Shop Reports
- DiscountShop/Reports/SalesReports.razor: جدول سفارش‌ها، فیلتر تاریخ/وضعیت/جستجو، نمودار روند فروش، نمودار محصولات پرفروش، آمار درآمد
- ✅ Products & Orders
- Products/ProductsMainPage.razor: انتخاب چندتایی، Bulk Delete و Bulk ToggleStatus، فیلترهای پیشرفته
- UserOrder/UserOrderMainPage.razor: کارت آمار سفارش‌ها + نمودار تعداد سفارش بر اساس وضعیت ارسال + Timeline وضعیت سفارش در UserOrderDetailsDialog
- UserOrder/UserOrderMainPage.razor: تکمیل امکانات مدیریت سفارش‌ها (لغو سفارش از طریق CancelOrderDialog، تغییر وضعیت ارسال با ChangeOrderStatusDialog و اعمال تخفیف دستی با ApplyDiscountDialog متصل به متدهای CancelOrder، UpdateOrderStatus و ApplyDiscountToOrder در BackOffice.BFF)
- ✅ Tag Management
- Tag/TagManagementPage.razor: لیست + جستجو + فیلتر وضعیت + صفحه‌بندی
- Tag/Components/TagEditDialog.razor: ایجاد/ویرایش تگ (Name, Title, Description, IsActive, SortOrder)
- Tag/Components/AssignTagsDialog.razor: اختصاص تگ به محصول، نمایش تگ‌های فعلی هر محصول، امکان حذف تگ‌ها
- ✅ Dashboard & Widgets
- Dashboard/DiscountShopWidget.razor: ویجت آمار فروشگاه تخفیفی (تعداد سفارش‌ها و مجموع فروش ۷ روز اخیر + آمار امروز + نمودار روند فروش روزانه) و اضافه‌شدن به SystemOverview.razor
- ✅ Public Messages Templates
- PublicMessages/Components/MessageTemplatesDialog.razor: مدیریت قالب‌های آماده پیام (افزودن/حذف/استفاده)، ذخیره در LocalStorage، دسترسی از PublicMessagesMainPage
- ✅ Discount Shop Product Image Gallery (UI)
- DiscountShop/Components/ProductImageGallery.razor: گالری تصاویر محصول برای Discount Shop با multi-upload، پیش‌نمایش Base64 و Drag & Drop برای تغییر ترتیب (فعلاً سمت UI؛ اتصال Backend در فاز بعدی)
- ✅ Product List Export
- Products/ProductsMainPage.razor: دکمه «خروجی Excel» که با توجه به فیلترهای فعلی، لیست محصولات را از طریق gRPC دریافت کرده و خروجی CSV (Excel-friendly) تولید می‌کند (ستون‌ها: Id, Title, Price, Discount, RemainingCount, SaleCount, ViewCount)
- ✅ Product Bulk Edit UI
- Pages/Products/BulkEdit.razor: صفحه‌ی مجزای ویرایش گروهی محصولات با DataGrid (Multiple Selection) و فرم Bulk Update برای قیمت، تخفیف، تخفیف باشگاه، موجودی (StockUpdateType: Set/Add/Subtract) و وضعیت (Toggle Status) که به متدهای BulkUpdateProductPrices، BulkUpdateProductStock و ToggleProductStatus در BackOffice.BFF متصل است.
## 🔥 High Priority (در حال انجام)
### 1. موارد نیازمند پیاده‌سازی در CMS (Deferred)
**Status**: ⏳ Deferred - نیاز به entity جدید در CMS
| Feature | CMS Entity Needed | Status |
|---------|-------------------|--------|
| **PackageDetail Reviews** | `Review`, `Comment` entities | ❌ Not in CMS |
| **Checkout Discount Validation** | `ValidateDiscountCode` RPC | ❌ Not in CMS |
| **Contact Form** | `ContactMessage` entity | ❌ Not in CMS |
**Note**: این موارد فعلاً با Mock data کار می‌کنند تا CMS تکمیل شود.
---
## 🟡 Medium Priority (این هفته)
### 3. WalletService - پیاده‌سازی متدهای TODO
**Status**: ⏳ Not Started
**Owner**: Frontend Team
**Deadline**: ۱۷ آذر
#### Tasks (5 متد):
- [ ] `GetUserWalletBalanceAsync()` - دریافت موجودی کیف پول
- [ ] `ChargeWalletAsync()` - شارژ کیف پول
- [ ] `WithdrawFromWalletAsync()` - برداشت از کیف پول
- [ ] `GetWalletTransactionsAsync()` - تاریخچه تراکنش‌ها
- [ ] `TransferBetweenWalletsAsync()` - انتقال بین کیف پول‌ها
**File**: `04-FRONTEND/FrontOffice/todo-commented-code.md`
---
### 4. Package Purchase System - UI Implementation
### 2. Package Purchase System - UI Implementation
**Status**: ⏳ Not Started (Proto Complete ✅)
**Owner**: FrontOffice Team
**Deadline**: ۱۸ آذر
@@ -115,6 +122,76 @@
---
### 3. 🔴 اصلاح محاسبه کمیسیون هفتگی (بحرانی)
**Status**: 🔄 در حال انجام
**Owner**: CMS Team
**تاریخ شروع**: ۱۴ آذر ۱۴۰۴
**Estimate**: 2.5 روز
#### شرح مشکلات:
| # | مشکل | وضعیت |
|---|------|-------|
| 1 | محدودیت لول (15) پیاده‌سازی نشده | 🔄 در حال انجام |
| 2 | فقط تعادل شخصی حساب می‌شود (نه زیرمجموعه) | ⏳ Pending |
#### فرمول صحیح:
```
کمیسیون = (تعادل_شخص + SUM(تعادل_زیرمجموعه تا 15 لول)) × ارزش_هر_تعادل
```
#### تسک‌ها:
| فاز | شرح | وضعیت |
|-----|------|-------|
| 1 | اضافه کردن `Commission.MaxNetworkLevel` به Config | 🔄 |
| 2 | اصلاح `CalculateWeeklyBalancesCommandHandler` - محدودیت لول | ⏳ |
| 3 | اصلاح `ProcessUserPayoutsCommandHandler` - تعادل زیرمجموعه | ⏳ |
| 4 | تست و Build | ⏳ |
**Reference**: `01-BUSINESS/commission-calculation-fix.md`
---
### 4. ✅ اصلاح سقف تعادل هفتگی (MaxWeeklyBalances)
**Status**: ✅ تکمیل شد
**Owner**: CMS Team
**تاریخ تکمیل**: ۱۴ آذر ۱۴۰۴
#### شرح مشکل:
سقف تعادل هفتگی در پیاده‌سازی فعلی **300 کل** بود، اما باید **300 برای هر دست** باشد.
| توضیح | منطق قدیم | منطق جدید |
|-------|-----------|-----------|
| سقف | 300 کل | 300 هر دست |
| Max Total | 300 | 300+300=600 |
#### تغییرات انجام شده:
**CMS Changes:**
-**SystemConfiguration**: تغییر کلید از `MaxWeeklyBalancesPerUser` به `MaxWeeklyBalancesPerLeg`
-**CalculateWeeklyBalancesCommandHandler**: اصلاح منطق محاسبه سقف
- اعمال سقف روی هر دست جداگانه قبل از محاسبه MIN
- باقیمانده = مازاد سقف هر دست (نه نصف تعادل کل)
-**ApplicationDbContextInitialiser**: اصلاح Seed Data
**منطق جدید:**
```csharp
// ✅ سقف روی هر دست جداگانه
var cappedLeftTotal = Math.Min(leftTotal, maxBalancesPerLeg);
var cappedRightTotal = Math.Min(rightTotal, maxBalancesPerLeg);
var totalBalances = Math.Min(cappedLeftTotal, cappedRightTotal);
var leftRemainder = leftTotal - cappedLeftTotal; // مازاد سقف
var rightRemainder = rightTotal - cappedRightTotal;
```
**Build Status**: ✅ CMS Build Succeeded - 0 Errors
**مستندات:**
-`01-BUSINESS/balance-calculation-rules.md` - آپدیت شد
---
## 🟢 Low Priority (هفته بعد)
### 5. VAT System Implementation
@@ -143,38 +220,32 @@
## ⚠️ Blockers & Dependencies
### 🔴 Critical Blockers:
1. **Protobuf Mismatch** (FrontOffice.BFF ↔ CMS)
- Impact: 3 modules affected
- Resolution: Backend coordination needed
- ETA: امروز/فردا
2. **Tree Builder Missing** (NetworkMembership)
- Impact: Tree.razor can't display network
- Resolution: Implement recursive tree builder in BFF
- ETA: 1 روز
### 🟢 Resolved:
1. ~~**Protobuf Mismatch** (FrontOffice.BFF ↔ CMS)~~ ✅ Fixed
2. ~~**WalletService Mock Data**~~ ✅ Connected to gRPC
3. ~~**Tree Builder Missing** (NetworkMembership)~~ ✅ Implemented
### 🟡 Minor Issues:
1. **WalletService Mock Data** - نیاز به پاکسازی بعد از اتصال API
2. **MudBlazor Warnings** - 113 warning (غیر critical)
1. **MudBlazor Warnings** - ~100 warnings (غیر critical)
2. **Missing CMS Entities** - Review, ContactMessage, DiscountValidation
---
## 📊 Velocity Tracking
## 📊 Progress Summary
### کارهای تمام شده امروز (۱۴ آذر):
- ✅ FrontOffice UI: 7 صفحه جدید (Club, Network, Commission)
- ✅ FrontOffice.BFF: 3 CQ module جدید
-Build Successful: 0 errors
-Documentation: 2 فایل تحلیل جدید
- ✅ FrontOffice Proto Projects: 5 پروژه جدید
- ✅ FrontOffice UI Services: 4 سرویس به gRPC وصل شدند
-FrontOffice.BFF Handlers: 15+ handler
-Build Successful: 0 errors در هر دو پروژه
### تخمین باقیمانده:
- **FrontOffice UI Integration**: 2 روز (7 صفحه × 3-4 ساعت)
- **Protobuf Fixes**: 1 روز (3 handler)
- **WalletService Implementation**: 1 روز (5 متد)
- **CMS Entity Creation** (Review, Contact, Discount): 1-2 روز
- **Package Purchase UI**: 2 روز (4 صفحه + BFF)
- **VAT System**: 2 روز
- **RBAC System**: 1.5 هفته
**Total**: ~6 روز کاری (1.5 هفته)
**Total**: ~5-7 روز کاری
---
@@ -200,4 +271,3 @@
---
**منتظر بروزرسانی روزانه هستیم** 🚀