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:
@@ -1,12 +1,68 @@
|
|||||||
# Balance Calculation with Carryover Logic - Complete Guide
|
# Balance Calculation with Carryover Logic - Complete Guide
|
||||||
|
|
||||||
**Date**: 2025-12-01
|
**Date**: 2025-12-01
|
||||||
**Last Updated**: 2025-12-01 (Added Configuration Integration + MaxWeeklyBalances Cap)
|
**Last Updated**: 2025-12-04 (⚠️ تغییر مهم: سقف 300 برای هر دست، نه کل)
|
||||||
**Status**: ✅ Implemented
|
**Status**: ✅ Implemented (نیاز به اصلاح سقف دارد)
|
||||||
**Migration**: `UpdateNetworkWeeklyBalanceWithCarryover`
|
**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
|
## 📋 Configuration-Based Calculation
|
||||||
|
|
||||||
### **System Configurations Used:**
|
### **System Configurations Used:**
|
||||||
@@ -15,9 +71,11 @@
|
|||||||
// تمام مقادیر از جدول SystemConfigurations خوانده میشوند
|
// تمام مقادیر از جدول SystemConfigurations خوانده میشوند
|
||||||
Club.ActivationFee = 25,000,000 ریال (هزینه فعالسازی)
|
Club.ActivationFee = 25,000,000 ریال (هزینه فعالسازی)
|
||||||
Commission.WeeklyPoolContributionPercent = 20% (سهم استخر)
|
Commission.WeeklyPoolContributionPercent = 20% (سهم استخر)
|
||||||
Commission.MaxWeeklyBalancesPerUser = 300 (سقف تعادل هفتگی)
|
Commission.MaxWeeklyBalancesPerLeg = 300 (⚠️ سقف تعادل هفتگی - هر دست)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**توجه:** کلید قدیمی `MaxWeeklyBalancesPerUser` باید به `MaxWeeklyBalancesPerLeg` تغییر کند.
|
||||||
|
|
||||||
### **Pool Contribution Calculation:**
|
### **Pool Contribution Calculation:**
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
@@ -32,29 +90,53 @@ weeklyPoolContribution = totalNewMembers × activationFee × poolPercent
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚫 MaxWeeklyBalances Cap (محدودیت سقف)
|
## 🚫 MaxWeeklyBalances Cap (محدودیت سقف - هر دست)
|
||||||
|
|
||||||
### **Logic:**
|
### **Logic (صحیح):**
|
||||||
|
|
||||||
```csharp
|
```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:
|
Week 5:
|
||||||
leftTotal = 350, rightTotal = 400
|
leftTotal = 350, rightTotal = 400
|
||||||
totalBalances = MIN(350, 400) = 350
|
maxBalancesPerLeg = 300
|
||||||
cappedBalances = MIN(350, 300) = 300 ✅ محدود شد!
|
|
||||||
excessBalances = 350 - 300 = 50
|
|
||||||
|
|
||||||
leftRemainder = 0 + 50 = 50 (میرود برای هفته بعد)
|
cappedLeftTotal = MIN(350, 300) = 300
|
||||||
rightRemainder = 50
|
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 // باقیمانده از سقف هر دست
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -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
|
# BackOffice.BFF - Discount Shop Integration Plan
|
||||||
|
|
||||||
**تاریخ ایجاد**: 1403/09/13 (2024-12-04)
|
**تاریخ ایجاد**: 1403/09/13 (2024-12-04)
|
||||||
**وضعیت**: 📋 برنامهریزی
|
**آخرین بروزرسانی**: 1403/09/14 (2024-12-05)
|
||||||
**اولویت**: 🔴 بالا
|
**وضعیت**: ✅ پیادهسازی شده (Plan اجرا شده است)
|
||||||
|
**اولویت در زمان طراحی**: 🔴 بالا
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -16,10 +17,12 @@
|
|||||||
- 4 gRPC Services
|
- 4 gRPC Services
|
||||||
- Migration: AddDiscountShopSystem
|
- Migration: AddDiscountShopSystem
|
||||||
|
|
||||||
### ⏳ نیاز به پیادهسازی در BackOffice.BFF
|
### ⏳ وضعیت در BackOffice.BFF (بهروزرسانی)
|
||||||
- **19 Handler** برای 4 سرویس جدید
|
- **19 Handler** برای 4 سرویس جدید → ✅ پیادهسازی و متصل به CMS
|
||||||
- **4 Client Interface** در IApplicationContractContext
|
- **4 Client Interface** در `IApplicationContractContext` → ✅ اضافه و در `ApplicationContractContext` پیادهسازی شده
|
||||||
- **Test و Validation**
|
- **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
|
- User acceptance testing
|
||||||
|
|
||||||
**Status**: **🚀 Production Ready at 100% - All Features Complete!**
|
**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** 🚀
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,110 @@
|
|||||||
# FrontOffice.BFF
|
# 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)
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
| Services Backend | 8 فایل (4 Interface + 4 Implementation) | ✅ کامل |
|
| Services Backend | 8 فایل (4 Interface + 4 Implementation) | ✅ کامل |
|
||||||
| Dialog Components | 6 کامپوننت | ✅ کامل |
|
| Dialog Components | 6 کامپوننت | ✅ کامل |
|
||||||
| اتصالات CRUD | همه عملیات | ✅ کامل |
|
| اتصالات CRUD | همه عملیات | ✅ کامل |
|
||||||
|
| گزارشها و نمودارهای مالی | 2 صفحه | 🟡 تکمیل پایه (PDF باقیمانده) |
|
||||||
| **جمع کل** | **60 صفحه + 8 سرویس + 6 دیالوگ** | **95% آماده** 🎉 |
|
| **جمع کل** | **60 صفحه + 8 سرویس + 6 دیالوگ** | **95% آماده** 🎉 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -28,7 +29,7 @@
|
|||||||
- ✅ Commission/Dashboard.razor - داشبورد کمیسیون
|
- ✅ Commission/Dashboard.razor - داشبورد کمیسیون
|
||||||
- ✅ Commission/Reports.razor - گزارشهای هفتگی
|
- ✅ Commission/Reports.razor - گزارشهای هفتگی
|
||||||
- ✅ Commission/Payouts.razor - پرداخت کاربران
|
- ✅ Commission/Payouts.razor - پرداخت کاربران
|
||||||
- ✅ Commission/Withdrawals.razor - درخواستهای برداشت
|
- ✅ Commission/Withdrawals.razor - درخواستهای برداشت (لیست، فیلتر وضعیت، دکمههای Approve/Reject/Process متصل به API، نمایش BankReferenceId / TrackingCode / PaymentFailureReason)
|
||||||
|
|
||||||
### 3. شبکه (3 صفحه)
|
### 3. شبکه (3 صفحه)
|
||||||
- ✅ Network/Tree.razor - درخت شبکه
|
- ✅ Network/Tree.razor - درخت شبکه
|
||||||
@@ -46,6 +47,7 @@
|
|||||||
- ✅ Category/ - مدیریت دستهبندیها
|
- ✅ Category/ - مدیریت دستهبندیها
|
||||||
- ✅ UserOrder/ - مدیریت سفارشات
|
- ✅ UserOrder/ - مدیریت سفارشات
|
||||||
- ✅ Products/Components/ - کامپوننتهای محصول
|
- ✅ Products/Components/ - کامپوننتهای محصول
|
||||||
|
- ✅ Tag/ - مدیریت تگها (لیست + جستجو + ایجاد/ویرایش/حذف، اختصاص تگ به محصول از طریق ProductsMainPage، نمایش تگهای فعلی هر محصول و امکان حذف آنها در AssignTagsDialog)
|
||||||
|
|
||||||
### 6. مدیریت کاربران و نقشها (4 صفحه)
|
### 6. مدیریت کاربران و نقشها (4 صفحه)
|
||||||
- ✅ User/ - مدیریت کاربران
|
- ✅ User/ - مدیریت کاربران
|
||||||
@@ -258,46 +260,51 @@ NavMenu.razor - آپدیت شده با بخشهای جدید:
|
|||||||
#### 3. بهبود UI/UX صفحات موجود
|
#### 3. بهبود UI/UX صفحات موجود
|
||||||
```
|
```
|
||||||
⏸️ Products/ProductsMainPage.razor
|
⏸️ Products/ProductsMainPage.razor
|
||||||
- افزودن bulk operations (حذف/تغییر وضعیت دستهای)
|
- ✅ افزودن bulk operations (حذف/تغییر وضعیت دستهای)
|
||||||
- افزودن export به Excel
|
- ✅ افزودن export به Excel (خروجی CSV از لیست محصولات با توجه به فیلترهای فعلی)
|
||||||
- بهبود فیلترهای پیشرفته
|
- ✅ بهبود فیلترهای پیشرفته
|
||||||
|
- ✅ افزودن صفحه ویرایش گروهی محصولات (Pages/Products/BulkEdit.razor) با فرم Bulk Update قیمت، تخفیف، موجودی و وضعیت (اتصال به BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus)
|
||||||
|
|
||||||
⏸️ UserOrder/OrdersMainPage.razor
|
⏸️ UserOrder/OrdersMainPage.razor
|
||||||
- افزودن timeline سفارش
|
- ✅ افزودن timeline سفارش (نمایش مراحل ثبت سفارش، پرداخت، ارسال و تحویل/مرجوعی در UserOrderDetailsDialog بر اساس PaymentStatus و DeliveryStatus)
|
||||||
- افزودن نمایش نمودار آماری سفارشات
|
- ✅ افزودن نمایش نمودار آماری سفارشات (کارت جمع سفارشها و نمودار تعداد سفارش بر اساس وضعیت ارسال)
|
||||||
- بهبود جستجوی پیشرفته
|
- ✅ بهبود جستجوی پیشرفته (فیلتر شناسه سفارش/کاربر/تراکنش و فیلترهای ترکیبی)
|
||||||
|
- ✅ دکمههای مدیریت سفارش: لغو سفارش (CancelOrder) با Dialog دلیل/بازگشت وجه، تغییر وضعیت ارسال (UpdateOrderStatus) از طریق ChangeOrderStatusDialog، و Dialog اعمال تخفیف دستی (ApplyDiscountToOrder) متصل به gRPC BackOffice.BFF.UserOrder
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 4. گزارشهای جدید (2 صفحه)
|
#### 4. گزارشهای جدید (2 صفحه)
|
||||||
```
|
```
|
||||||
⏸️ Commission/Reports/WithdrawalReports.razor
|
✅ Commission/Reports/WithdrawalReports.razor
|
||||||
- گزارش برداشتهای کاربران
|
- گزارش برداشتهای کاربران (جمعبندی دورهای)
|
||||||
- نمودار روند برداشتها
|
- نمودار روند برداشتها (مبالغ و تعداد درخواستها)
|
||||||
- فیلتر: بازه تاریخ، کاربر، وضعیت
|
- فیلتر: بازه تاریخ، کاربر، وضعیت، نوع دوره
|
||||||
- Export به PDF/Excel
|
- Export به Excel (CSV) ✅، Export به PDF 🟡 (خروجی متنی ساختارمند؛ PDF واقعی در نسخه بعدی)
|
||||||
|
|
||||||
⏸️ DiscountShop/Reports/SalesReports.razor
|
✅ DiscountShop/Reports/SalesReports.razor
|
||||||
- گزارش فروش فروشگاه تخفیفی
|
- گزارش فروش فروشگاه تخفیفی (لیست سفارشها با فیلتر تاریخ/وضعیت/جستجو)
|
||||||
- نمودار پرفروشترین محصولات
|
- نمودار روند فروش (مبلغ نهایی و تخفیف)
|
||||||
- آمار درآمد
|
- نمودار پرفروشترین محصولات (بر اساس مبلغ فروش)
|
||||||
|
- آمار درآمد: مجموع فروش، مجموع تخفیف، میانگین مبلغ سفارش
|
||||||
```
|
```
|
||||||
|
|
||||||
### اولویت پایین (Nice to Have)
|
### اولویت پایین (Nice to Have)
|
||||||
|
|
||||||
#### 5. قابلیتهای اضافی
|
#### 5. قابلیتهای اضافی
|
||||||
```
|
```
|
||||||
⏸️ Dashboard/DiscountShopWidget.razor
|
✅ Dashboard/DiscountShopWidget.razor
|
||||||
- ویجت آمار فروشگاه تخفیفی در داشبورد اصلی
|
- ویجت آمار فروشگاه تخفیفی در داشبورد اصلی (صفحه Dashboard/SystemOverview)
|
||||||
- نمایش: فروش روزانه، سفارشات جدید، محصولات پرفروش
|
- نمایش: تعداد سفارشها و مجموع فروش ۷ روز اخیر، آمار امروز، نمودار روند فروش روزانه (Line Chart)
|
||||||
|
|
||||||
⏸️ PublicMessages/Templates/
|
✅ PublicMessages/Templates/
|
||||||
- قالبهای آماده پیام
|
- مدیریت قالبهای آماده پیام در دیالوگ جداگانه (MessageTemplatesDialog)
|
||||||
- ذخیره پیامهای پرکاربرد
|
- ذخیره قالبها در LocalStorage مرورگر (بدون تغییر Backend)
|
||||||
|
- افزودن، حذف و مشاهده پیشنمایش قالبها، دسترسی از PublicMessagesMainPage
|
||||||
|
|
||||||
⏸️ DiscountShop/Components/ProductImageGallery.razor
|
✅ DiscountShop/Components/ProductImageGallery.razor
|
||||||
- گالری تصاویر محصول
|
- کامپوننت گالری تصاویر محصول برای DiscountShop (کلاینتساید)
|
||||||
- Upload multiple images
|
- Upload چندتایی تصاویر (multi-upload) و پیشنمایش Base64
|
||||||
- Drag & drop reorder
|
- Drag & drop reorder برای تغییر ترتیب نمایش
|
||||||
|
- EventCallback برای ارسال لیست تصاویر مرتبشده به والد (برای اتصال بعدی به Backend)
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
+240
-162
@@ -76,7 +76,7 @@ strong {
|
|||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
> **تاریخ بهروزرسانی**: 1403/09/14 (2024-12-04)
|
> **تاریخ بهروزرسانی**: 1403/10/06 (2024-12-26)
|
||||||
> **وضعیت کلی**: 99% تکمیل شده
|
> **وضعیت کلی**: 99% تکمیل شده
|
||||||
> **مسیر توسعه**: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice
|
> **مسیر توسعه**: CMS → BackOffice.BFF → BackOffice (UI) → FrontOffice.BFF → FrontOffice
|
||||||
|
|
||||||
@@ -87,21 +87,21 @@ strong {
|
|||||||
### ✅ تکمیل شده
|
### ✅ تکمیل شده
|
||||||
- **CMS Microservice**: 95% (12 از 12 Phase کامل، 9 TODO handlers باقیمانده)
|
- **CMS Microservice**: 95% (12 از 12 Phase کامل، 9 TODO handlers باقیمانده)
|
||||||
- **BackOffice.BFF**: 85% (47 Handler تکمیل، 8 TODO handlers، 19 Discount Shop handlers باقیمانده)
|
- **BackOffice.BFF**: 85% (47 Handler تکمیل، 8 TODO handlers، 19 Discount Shop handlers باقیمانده)
|
||||||
- **BackOffice UI**: 85% (56 صفحه آماده Production - قابل تحویل به Admin)
|
- **BackOffice UI**: 95% (60 صفحه آماده Production - قابل تحویل به Admin)
|
||||||
- **FrontOffice.BFF**: 20% (فقط برخی Queries پایه)
|
- **FrontOffice.BFF**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
|
||||||
- **FrontOffice UI**: 10% (چند صفحه اولیه)
|
- **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 پیادهسازی کامل
|
- ✅ DayaPaymentService پیادهسازی کامل
|
||||||
- ✅ GetWithdrawalReports Query (CMS + BackOffice.BFF)
|
- ✅ GetWithdrawalReports Query (CMS + BackOffice.BFF + gRPC Service)
|
||||||
- ⏸️ CMS gRPC Service + BackOffice UI باقیمانده
|
- ⏸️ BackOffice UI (Withdrawal Management + Reports تقریباً کامل؛ تستهای Daya و خروجی PDF باقیمانده)
|
||||||
2. ~~Club Discount Shop System (CMS Phase 9)~~ ✅ Complete
|
2. ~~Club Discount Shop System (CMS Phase 9)~~ ✅ Complete
|
||||||
3. ~~Product Bulk Operations~~ ✅ Backend Complete (100%)
|
3. ~~Product Bulk Operations~~ ✅ Backend Complete (100%)
|
||||||
4. ~~Order Management~~ ✅ Proto/gRPC/Mapster Complete (9 TODO handlers باقیمانده)
|
4. ~~Order Management~~ ✅ Backend + BackOffice.BFF Complete (UI improvements باقیمانده)
|
||||||
5. ~~Public Messages System~~ ✅ Proto/gRPC Complete (5 TODO handlers باقیمانده)
|
5. ~~Public Messages System~~ ✅ CMS + BackOffice.BFF + BackOffice UI Complete
|
||||||
6. **Package Purchase System** ✅ Proto/gRPC Complete (4 TODO handlers باقیمانده)
|
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**:
|
### 📦 **قابل تحویل به Admin**:
|
||||||
- ✅ **BackOffice با 56 صفحه کاملاً کاربردی**
|
- ✅ **BackOffice با 56 صفحه کاملاً کاربردی**
|
||||||
@@ -111,8 +111,8 @@ strong {
|
|||||||
- Discount Shop, Tags, Product Bulk Ops, Withdrawal Reports
|
- Discount Shop, Tags, Product Bulk Ops, Withdrawal Reports
|
||||||
- ⚠️ **نیاز به تکمیل**:
|
- ⚠️ **نیاز به تکمیل**:
|
||||||
- 9 TODO handlers در CMS
|
- 9 TODO handlers در CMS
|
||||||
- 27 TODO handlers در BackOffice.BFF
|
- ~~27 TODO handlers در BackOffice.BFF~~ ✅ handlers BackOffice.BFF تکمیل شدهاند
|
||||||
- UI برای Discount Shop, Public Messages, Reports
|
- UI برای گزارشهای پیشرفته (Reports) و برخی بهبودهای FrontOffice
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -127,31 +127,38 @@ strong {
|
|||||||
└── ✅ Withdrawal & Settlement
|
└── ✅ Withdrawal & Settlement
|
||||||
|
|
||||||
مرحله 2: تکمیل Payment Gateway + CRUD اضافی (در حال انجام)
|
مرحله 2: تکمیل Payment Gateway + CRUD اضافی (در حال انجام)
|
||||||
├── ✅ Payment Gateway Backend (85%)
|
├── ✅ Payment Gateway Backend (100%)
|
||||||
│ ├── ✅ DayaPaymentService Implementation
|
│ ├── ✅ DayaPaymentService Implementation
|
||||||
│ ├── ✅ GetWithdrawalReports (CMS + BFF)
|
│ ├── ✅ GetWithdrawalReports (CMS + BFF + gRPC)
|
||||||
│ ├── [ ] CMS gRPC Service
|
│ ├── [✅] CMS gRPC Service (GetWithdrawalReports)
|
||||||
│ └── [ ] BackOffice UI (Reports + Withdrawal Management)
|
│ └── [🟡] BackOffice UI (Reports و Withdrawal Management انجام شده، PDF و تستهای Daya باقیمانده)
|
||||||
├── [ ] Product Bulk Operations - نیم روز
|
├── [✅] Product Bulk Operations - نیم روز
|
||||||
├── [ ] Order Management - نیم روز
|
├── [✅] Order Management - نیم روز (بهبود UI: Timeline، نمودارها، Cancel/Status/Discount در BackOffice UI)
|
||||||
└── [ ] Public Messages System - نیم روز
|
└── [ ] Public Messages System - نیم روز (تنها بهبودهای UX/UI)
|
||||||
|
|
||||||
مرحله 3: BackOffice UI تکمیلی
|
مرحله 3: BackOffice UI تکمیلی
|
||||||
├── [ ] Financial Reports Page - 1.5 روز
|
├── [🟡] Financial Reports Page - 1.5 روز (WithdrawalReports + SalesReports پیادهسازی شده؛ خروجی PDF باقیمانده)
|
||||||
├── [ ] Withdrawal Management Page - 2 روز
|
├── [🟡] Withdrawal Management Page - 2 روز (صفحه عملیاتی شده؛ جستجو بر اساس UserId/IbanNumber باقیمانده)
|
||||||
└── [ ] Product Bulk Operations UI - نیم روز
|
└── [🟡] Product Bulk Operations UI - نیم روز (Bulk actions در ProductsMainPage.razor انجام شده؛ صفحه BulkEdit مجزا باقیمانده)
|
||||||
|
|
||||||
مرحله 4: FrontOffice (اولویت اصلی بعدی)
|
مرحله 4: FrontOffice (اولویت اصلی بعدی) ✅ 70% Complete
|
||||||
├── FrontOffice.BFF APIs - 2 هفته
|
├── FrontOffice.BFF APIs - ✅ 80% Complete
|
||||||
│ ├── Browse Discount Shop Products
|
│ ├── ✅ Browse Discount Shop Products (Proto ready)
|
||||||
│ ├── Shopping Cart Management
|
│ ├── ✅ Club Membership APIs
|
||||||
│ ├── Order Placement & Payment
|
│ ├── ✅ Network APIs
|
||||||
│ └── Order Tracking
|
│ ├── ✅ Commission APIs
|
||||||
└── FrontOffice UI Pages - 3 هفته
|
│ ├── ✅ Wallet APIs (6 handlers)
|
||||||
├── Product Catalog
|
│ ├── [ ] Shopping Cart Management
|
||||||
├── Shopping Cart
|
│ └── [ ] Order Placement
|
||||||
├── Checkout Flow
|
└── FrontOffice UI Pages - ✅ 60% Complete
|
||||||
└── Order History
|
├── ✅ 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) ⭐ **فوری**
|
### 1.1 Payment Gateway Integration (Phase 10) ⭐ **فوری**
|
||||||
**وضعیت**: 85% تکمیل (گزارشهای مالی افزوده شد)
|
**وضعیت**: 90% تکمیل (Backend + گزارشهای مالی + صفحات اصلی UI)
|
||||||
**زمان تخمینی**: 4-5 روز کاری باقیمانده
|
**زمان تخمینی**: 4-5 روز کاری باقیمانده
|
||||||
|
|
||||||
#### ✅ تکمیل شده:
|
#### ✅ تکمیل شده:
|
||||||
@@ -202,33 +209,33 @@ strong {
|
|||||||
- دستهبندی روزانه/هفتگی/ماهانه با پشتیبانی تقویم شمسی
|
- دستهبندی روزانه/هفتگی/ماهانه با پشتیبانی تقویم شمسی
|
||||||
- خلاصه آماری (تعداد، مبلغ، نرخ موفقیت)
|
- خلاصه آماری (تعداد، مبلغ، نرخ موفقیت)
|
||||||
|
|
||||||
#### ❌ باقیمانده:
|
#### 🟡 بخشهای باقیمانده:
|
||||||
**الف. CMS gRPC Service (1 روز)**
|
**الف. CMS gRPC Service (1 روز) - ✅ انجام شده**
|
||||||
```
|
```
|
||||||
- [ ] ایجاد CommissionService یا بهروزرسانی موجود
|
- [✅] ایجاد CommissionService یا بهروزرسانی موجود
|
||||||
- [ ] پیادهسازی GetWithdrawalReports RPC handler
|
- [✅] پیادهسازی GetWithdrawalReports RPC handler
|
||||||
- [ ] Mapping از Domain به Proto
|
- [✅] Mapping از Domain به Proto
|
||||||
- [ ] تست gRPC endpoint
|
- [✅] تست gRPC endpoint
|
||||||
```
|
```
|
||||||
|
|
||||||
**ب. BackOffice UI - Withdrawal Management (2 روز)**
|
**ب. BackOffice UI - Withdrawal Management (2 روز)**
|
||||||
```
|
```
|
||||||
- [ ] صفحه لیست درخواستهای برداشت
|
- ✅ صفحه لیست درخواستهای برداشت
|
||||||
- [ ] دکمههای تأیید/رد با Confirmation Dialog
|
- ✅ دکمههای تأیید/رد با Confirmation Dialog (متصل به ApproveWithdrawal / RejectWithdrawal / ProcessWithdrawal)
|
||||||
- [ ] نمایش BankReferenceId و TrackingCode
|
- ✅ نمایش BankReferenceId و TrackingCode
|
||||||
- [ ] نمایش وضعیت PaymentFailed و دلیل خطا
|
- ✅ نمایش وضعیت PaymentFailed و دلیل خطا
|
||||||
- [ ] فیلترینگ بر اساس Status
|
- ✅ فیلترینگ بر اساس Status (CommissionPayoutStatus)
|
||||||
- [ ] جستجو بر اساس UserId/IbanNumber
|
- ✅ جستجو بر اساس UserId/IbanNumber
|
||||||
```
|
```
|
||||||
|
|
||||||
**ج. BackOffice UI - Financial Reports (1.5 روز)**
|
**ج. BackOffice UI - Financial Reports (1.5 روز)**
|
||||||
```
|
```
|
||||||
- [ ] صفحه گزارشهای مالی با فیلترها (تاریخ، نوع دوره، وضعیت، کاربر)
|
- [✅] صفحه گزارشهای مالی با فیلترها (تاریخ، نوع دوره، وضعیت، کاربر)
|
||||||
- [ ] نمایش گزارشهای دورهای (روزانه/هفتگی/ماهانه)
|
- [✅] نمایش گزارشهای دورهای (روزانه/هفتگی/ماهانه)
|
||||||
- [ ] Chart.js visualization (نمودار میلهای/خطی)
|
- [✅] نمودارها (MudBlazor Charts بهجای Chart.js)
|
||||||
- [ ] نمایش خلاصه آماری (کارتهای اطلاعاتی)
|
- [✅] نمایش خلاصه آماری (کارتهای اطلاعاتی در WithdrawalReports/SalesReports)
|
||||||
- [ ] خروجی Excel (EPPlus)
|
- [✅] خروجی Excel/CSV (Export به فایل از طریق UI)
|
||||||
- [ ] خروجی PDF (QuestPDF)
|
- [🟡] خروجی PDF (در حال حاضر خروجی متنی ساختارمند از طریق jsSaveAsFile؛ ادغام QuestPDF در نسخه بعدی)
|
||||||
```
|
```
|
||||||
|
|
||||||
**د. تست یکپارچه (نیم روز)**
|
**د. تست یکپارچه (نیم روز)**
|
||||||
@@ -241,7 +248,7 @@ strong {
|
|||||||
---
|
---
|
||||||
|
|
||||||
### 1.2 CRUD های اضافی ⭐ **بالا**
|
### 1.2 CRUD های اضافی ⭐ **بالا**
|
||||||
**وضعیت**: 67% (Tag Management و Product Bulk Operations کامل شده)
|
**وضعیت**: 80% (Tag Management و Product Bulk Operations کامل شده، Order Management در BFF تکمیل)
|
||||||
**زمان تخمینی**: 1 روز باقیمانده
|
**زمان تخمینی**: 1 روز باقیمانده
|
||||||
|
|
||||||
#### الف. Tag Management ✅ **کامل شده** (4 دسامبر 2024)
|
#### الف. Tag Management ✅ **کامل شده** (4 دسامبر 2024)
|
||||||
@@ -268,13 +275,13 @@ BackOffice.BFF: ✅
|
|||||||
- [✅] gRPC Clients: Tags, ProductTags registered
|
- [✅] gRPC Clients: Tags, ProductTags registered
|
||||||
- [✅] Typo Fixes: ProductGallerys→ProductGalleries, PruductCategory→ProductCategory
|
- [✅] Typo Fixes: ProductGallerys→ProductGalleries, PruductCategory→ProductCategory
|
||||||
|
|
||||||
BackOffice UI: ⏸️
|
BackOffice UI: ✅
|
||||||
- [ ] صفحه مدیریت Tags
|
- [✅] صفحه مدیریت Tags (لیست + جستجو بر اساس نام/عنوان، فیلتر وضعیت، pagination)
|
||||||
- [ ] Dialog ایجاد/ویرایش Tag
|
- [✅] Dialog ایجاد/ویرایش Tag (Name, Title, Description, IsActive, SortOrder)
|
||||||
- [ ] صفحه Assign Tags به محصولات
|
- [✅] صفحه/دیالوگ Assign Tags به محصولات (از طریق ProductsMainPage → AssignTagsDialog، شامل نمایش تگهای فعلی هر محصول و امکان حذف آنها)
|
||||||
```
|
```
|
||||||
|
|
||||||
**مستندات**: Backend کامل، UI باقیمانده
|
**مستندات**: Backend + BackOffice.BFF + UI کامل برای Tag Management
|
||||||
|
|
||||||
#### ب. Product Bulk Operations ✅ **کامل شده** (4 دسامبر 2024)
|
#### ب. Product Bulk Operations ✅ **کامل شده** (4 دسامبر 2024)
|
||||||
```
|
```
|
||||||
@@ -301,10 +308,10 @@ BackOffice.BFF: ✅
|
|||||||
- [✅] DTOs با rename برای جلوگیری از conflict با proto
|
- [✅] DTOs با rename برای جلوگیری از conflict با proto
|
||||||
- [✅] gRPC client integration
|
- [✅] gRPC client integration
|
||||||
|
|
||||||
BackOffice UI: ⏸️
|
BackOffice UI: ✅
|
||||||
- [ ] صفحه Bulk Edit Products
|
- [✅] DataGrid با انتخاب چندتایی و Bulk Actions (ToggleStatus/Delete) در ProductsMainPage.razor
|
||||||
- [ ] DataGrid با انتخاب چندتایی
|
- [✅] صفحه Bulk Edit Products (Pages/Products/BulkEdit.razor) با DataGrid و Multiple Selection
|
||||||
- [ ] فرم Bulk Update
|
- [✅] فرم Bulk Update برای ویرایش همزمان قیمت، تخفیف، موجودی (StockUpdateType: Set/Add/Subtract) و وضعیت (Toggle Status) چند محصول، متصل به BulkUpdateProductPrices / BulkUpdateProductStock / ToggleProductStatus
|
||||||
```
|
```
|
||||||
|
|
||||||
#### ج. Order Management ✅ **کامل شده** (4 دسامبر 2024)
|
#### ج. Order Management ✅ **کامل شده** (4 دسامبر 2024)
|
||||||
@@ -317,14 +324,14 @@ CMS Application Layer: ✅
|
|||||||
- [✅] CalculateOrderPVQuery + Handler + Validator (TODO با محاسبه PV برای MLM)
|
- [✅] CalculateOrderPVQuery + Handler + Validator (TODO با محاسبه PV برای MLM)
|
||||||
- [✅] Response DTOs با error handling
|
- [✅] Response DTOs با error handling
|
||||||
|
|
||||||
BackOffice.BFF: ⏸️
|
BackOffice.BFF: ✅
|
||||||
- [ ] 4 Handlers (TODO)
|
- [✅] 5 Handlers (CancelOrder, UpdateOrderStatus, GetOrdersByDateRange, ApplyDiscountToOrder, CalculateOrderPV)
|
||||||
|
|
||||||
BackOffice UI: ⏸️
|
BackOffice UI: ✅
|
||||||
- [ ] دکمه Cancel Order با Confirmation
|
- [✅] دکمه Cancel Order با Dialog دلیل لغو و انتخاب بازگشت وجه (CancelOrderDialog → CancelOrder)
|
||||||
- [ ] Dropdown تغییر Status
|
- [✅] Dialog تغییر Status ارسال (ChangeOrderStatusDialog → UpdateOrderStatus) در UserOrderMainPage.razor
|
||||||
- [ ] فیلتر Date Range
|
- [✅] فیلترهای پیشرفته (شناسه سفارش/کاربر/تراکنش، فیلترهای ترکیبی)
|
||||||
- [ ] Dialog اعمال تخفیف
|
- [✅] Dialog اعمال تخفیف (ApplyDiscountDialog → ApplyDiscountToOrder)
|
||||||
```
|
```
|
||||||
|
|
||||||
**سطوح دسترسی**:
|
**سطوح دسترسی**:
|
||||||
@@ -372,26 +379,18 @@ CMS:
|
|||||||
```
|
```
|
||||||
CMS:
|
CMS:
|
||||||
- [✅] Proto: public_messages.proto موجود
|
- [✅] Proto: public_messages.proto موجود
|
||||||
- [ ] Entity: PublicMessage (Title, Content, Type, StartDate, EndDate, IsActive)
|
- [✅] Entity: PublicMessage (Title, Content, Type, StartDate, EndDate, IsActive)
|
||||||
- [ ] Enum: MessageType (Info, Warning, Error, Success)
|
- [✅] Enum: MessageType (Info, Warning, Error, Success)
|
||||||
#### ❌ باقیمانده:
|
#### ❌ باقیمانده:
|
||||||
```
|
```
|
||||||
BackOffice.BFF:
|
BackOffice.BFF:
|
||||||
- [ ] 8 Handlers (TODO format):
|
- [✅] 8 Handlers (Create/Update/Delete/Publish/Archive/GetAll/GetActive/GetById)
|
||||||
- CreatePublicMessage
|
|
||||||
- UpdatePublicMessage
|
|
||||||
- DeletePublicMessage
|
|
||||||
- PublishMessage
|
|
||||||
- ArchiveMessage
|
|
||||||
- GetAllMessages
|
|
||||||
- GetActiveMessages
|
|
||||||
- GetPublicMessage
|
|
||||||
|
|
||||||
BackOffice UI:
|
BackOffice UI:
|
||||||
- [ ] صفحه لیست اعلانات (DataGrid)
|
- [✅] صفحه لیست اعلانات (DataGrid)
|
||||||
- [ ] Dialog ایجاد/ویرایش اعلان
|
- [✅] Dialog ایجاد/ویرایش اعلان
|
||||||
- [ ] دکمه Publish/Archive
|
- [✅] دکمه Publish/Archive
|
||||||
- [ ] پیشنمایش اعلان
|
- [✅] پیشنمایش اعلان
|
||||||
```
|
```
|
||||||
|
|
||||||
**سطوح دسترسی**:
|
**سطوح دسترسی**:
|
||||||
@@ -1133,16 +1132,20 @@ ApplicationContractContext:
|
|||||||
* RefreshPermissions()
|
* RefreshPermissions()
|
||||||
```
|
```
|
||||||
|
|
||||||
**د. Public Messages Management** (1 روز)
|
**د. Public Messages Management** (1 روز) ✅ (پیادهسازی شده با ساختار نهایی)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Messages/MessagesList.razor
|
- [✅] Pages/PublicMessages/PublicMessagesMainPage.razor
|
||||||
* DataGrid: Title, Type, StartDate, EndDate, IsActive
|
* DataGrid: Title, Type, Status, StartDate, EndDate, IsActive
|
||||||
* دکمههای Create, Edit, Delete, Publish
|
* دکمههای Create, Edit, Delete, Publish/Archive
|
||||||
- [ ] Components/MessageDialog.razor
|
* فیلترها بر اساس نوع پیام، وضعیت و بازه زمانی
|
||||||
* فرم: Title, Content (TinyMCE), Type, Dates
|
- [✅] Components/MessageFormDialog.razor
|
||||||
* پیشنمایش
|
* فرم: Title, Content (Rich Text)، Type، تاریخهای Start/End، وضعیت، گزینه انتشار
|
||||||
- [ ] Components/MessagePreview.razor
|
* پیشنمایش و Validation کامل
|
||||||
* Alert با رنگ بر اساس Type
|
- [✅] Components/MessageViewDialog.razor
|
||||||
|
* نمایش پیام بهصورت Alert/کارت با رنگ بر اساس Type
|
||||||
|
* نمایش تصویر، لینک، آمار بازدید و تاریخها
|
||||||
|
- [✅] Components/MessageTemplatesDialog.razor
|
||||||
|
* مدیریت قالبهای آماده پیام (ایجاد/حذف/استفاده) با ذخیرهسازی در LocalStorage
|
||||||
```
|
```
|
||||||
|
|
||||||
**ه. Manual Payment Management** (1 روز)
|
**ه. Manual Payment Management** (1 روز)
|
||||||
@@ -1157,21 +1160,27 @@ ApplicationContractContext:
|
|||||||
* دکمههای Approve/Reject
|
* دکمههای Approve/Reject
|
||||||
```
|
```
|
||||||
|
|
||||||
**و. Tag Management** (1 روز)
|
**و. Tag Management** (1 روز) ✅ (با نامگذاری و ساختار جدید)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Products/Tags.razor
|
- [✅] Pages/Tag/TagManagementPage.razor
|
||||||
* DataGrid: Name, ProductCount
|
* DataGrid: Name, Title, IsActive, ProductCount
|
||||||
* دکمههای Create, Edit, Delete
|
* دکمههای 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
|
- [✅] Pages/Products/BulkEdit.razor
|
||||||
* DataGrid با Multiple Selection
|
* DataGrid با Multiple Selection برای لیست محصولات (با فیلترهای مشابه ProductsMainPage)
|
||||||
* فرم: Update Price, Update Stock, Toggle Status
|
* فرم: Update Price (اجباری برای BulkUpdateProductPrices) + فیلدهای اختیاری تخفیف و تخفیف باشگاه
|
||||||
* دکمه Apply
|
* فرم: Update Stock با انتخاب StockUpdateType (Set/Add/Subtract) و مقدار Quantity
|
||||||
|
* فرم: Toggle Status (فعال/غیرفعال) برای محصولات انتخابشده
|
||||||
|
* دکمه Apply با Dialog تأیید و خلاصه تغییرات، اتصال مستقیم به gRPC (BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus) در BackOffice.BFF
|
||||||
```
|
```
|
||||||
|
|
||||||
**ح. Role Management** (2 روز) - **SuperAdmin only**
|
**ح. Role Management** (2 روز) - **SuperAdmin only**
|
||||||
@@ -1202,63 +1211,90 @@ ApplicationContractContext:
|
|||||||
|
|
||||||
## 🔵 بخش 4: FrontOffice.BFF - کارهای باقیمانده
|
## 🔵 بخش 4: FrontOffice.BFF - کارهای باقیمانده
|
||||||
|
|
||||||
**وضعیت**: 20% (فقط برخی Queries پایه موجود)
|
**وضعیت**: 80% ✅ (Proto Projects + Handlers متصل به CMS)
|
||||||
**زمان تخمینی**: 2 هفته
|
**زمان تخمینی**: 3 روز باقیمانده
|
||||||
|
|
||||||
### تسکهای اصلی:
|
### ✅ تکمیل شده (2024-12-26):
|
||||||
|
|
||||||
**الف. Authentication APIs** (3 روز)
|
**Proto Projects (7 پروژه جدید):**
|
||||||
```
|
```
|
||||||
- [ ] RegisterCommand + Handler
|
✅ FrontOffice.BFF.Commission.Protobuf
|
||||||
- [ ] LoginQuery + Handler
|
✅ FrontOffice.BFF.ClubMembership.Protobuf
|
||||||
- [ ] VerifyOtpCommand + Handler
|
✅ FrontOffice.BFF.NetworkMembership.Protobuf
|
||||||
- [ ] RefreshTokenCommand + Handler
|
✅ FrontOffice.BFF.DiscountShop.Protobuf
|
||||||
- [ ] LogoutCommand + Handler
|
✅ FrontOffice.BFF.Package.Protobuf (جدید)
|
||||||
- [ ] GetMyProfileQuery + Handler
|
✅ FrontOffice.BFF.User.Protobuf (موجود)
|
||||||
- [ ] UpdateMyProfileCommand + Handler
|
✅ FrontOffice.BFF.UserWallet.Protobuf (موجود)
|
||||||
```
|
```
|
||||||
|
|
||||||
**ب. Order APIs** (3 روز)
|
**Handlers تکمیل شده:**
|
||||||
```
|
```
|
||||||
- [ ] GetMyOrdersQuery + Handler
|
✅ GetMyClubMembershipQuery + Handler
|
||||||
- [ ] GetMyOrderQuery + 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
|
- [ ] CreateOrderCommand + Handler
|
||||||
- [ ] CancelMyOrderCommand + Handler
|
- [ ] CancelMyOrderCommand + Handler
|
||||||
- [ ] GetOrderTrackingQuery + Handler
|
- [ ] GetOrderTrackingQuery + Handler
|
||||||
```
|
```
|
||||||
|
|
||||||
**ج. Profile APIs** (2 روز)
|
**ج. Profile APIs** (0.5 روز)
|
||||||
```
|
```
|
||||||
- [ ] GetMyAddressesQuery + Handler
|
- [✅] GetMyAddressesQuery + Handler
|
||||||
- [ ] CreateMyAddressCommand + Handler
|
- [✅] CreateMyAddressCommand + Handler
|
||||||
- [ ] UpdateMyAddressCommand + Handler
|
- [✅] UpdateMyAddressCommand + Handler
|
||||||
- [ ] DeleteMyAddressCommand + Handler
|
- [✅] DeleteMyAddressCommand + Handler
|
||||||
- [ ] SetDefaultAddressCommand + Handler
|
- [ ] SetDefaultAddressCommand + Handler
|
||||||
```
|
```
|
||||||
|
|
||||||
**د. Club & Commission (Customer)** (2 روز)
|
**د. Club & Commission (Customer)** ✅ تکمیل شده
|
||||||
```
|
```
|
||||||
- [ ] GetMyClubMembershipQuery + Handler
|
- [✅] GetMyClubMembershipQuery + Handler
|
||||||
- [ ] ActivateMyClubMembershipCommand + Handler
|
- [✅] ActivateMyClubMembershipCommand + Handler
|
||||||
- [ ] GetMyCommissionPayoutsQuery + Handler
|
- [✅] GetMyCommissionPayoutsQuery + Handler
|
||||||
- [ ] RequestMyWithdrawalCommand + Handler
|
- [✅] RequestMyWithdrawalCommand + Handler
|
||||||
```
|
```
|
||||||
|
|
||||||
**ه. Network (Customer)** (2 روز)
|
**ه. Network (Customer)** ✅ تکمیل شده
|
||||||
```
|
```
|
||||||
- [ ] GetMyNetworkTreeQuery + Handler
|
- [✅] GetMyNetworkTreeQuery + Handler
|
||||||
- [ ] GetMyNetworkPositionQuery + Handler
|
- [✅] GetMyNetworkPositionQuery + Handler
|
||||||
- [ ] GetMyNetworkStatisticsQuery + Handler
|
- [✅] GetMyNetworkStatisticsQuery + Handler
|
||||||
```
|
```
|
||||||
|
|
||||||
**و. Wallet (Customer)** (2 روز)
|
**و. Wallet (Customer)** ✅ تکمیل شده
|
||||||
```
|
```
|
||||||
- [ ] GetMyWalletQuery + Handler (با DiscountBalance)
|
- [✅] GetMyWalletQuery + Handler (با DiscountBalance)
|
||||||
- [ ] GetMyTransactionsQuery + Handler
|
- [✅] GetMyTransactionsQuery + Handler
|
||||||
- [ ] GetMyDiscountTransactionsQuery + Handler
|
- [✅] RequestWithdrawalCommand + Handler
|
||||||
|
- [✅] GetMyWithdrawalsQuery + Handler
|
||||||
|
- [✅] GetWithdrawalSettingsQuery + Handler
|
||||||
```
|
```
|
||||||
|
|
||||||
**ز. Cart (Customer)** (2 روز)
|
**ز. Cart (Customer)** (0.5 روز)
|
||||||
```
|
```
|
||||||
- [ ] GetMyCartQuery + Handler
|
- [ ] GetMyCartQuery + Handler
|
||||||
- [ ] AddToMyCartCommand + Handler
|
- [ ] AddToMyCartCommand + Handler
|
||||||
@@ -1274,53 +1310,95 @@ ApplicationContractContext:
|
|||||||
|
|
||||||
## 🟣 بخش 5: FrontOffice UI - کارهای باقیمانده
|
## 🟣 بخش 5: FrontOffice UI - کارهای باقیمانده
|
||||||
|
|
||||||
**وضعیت**: 10% (چند صفحه پایه)
|
**وضعیت**: 60% ✅ (Mock Services → gRPC تبدیل شده)
|
||||||
**زمان تخمینی**: 3 هفته
|
**زمان تخمینی**: 2 هفته
|
||||||
|
|
||||||
### تسکهای اصلی:
|
### ✅ تکمیل شده (2024-12-26):
|
||||||
|
|
||||||
**الف. Authentication Pages** (3 روز)
|
**Services متصل به BFF gRPC:**
|
||||||
```
|
```
|
||||||
- [ ] Pages/Auth/Register.razor
|
✅ ClubMembershipService → ClubMembershipContract.ClubMembershipContractClient
|
||||||
- [ ] Pages/Auth/Login.razor
|
✅ NetworkMembershipService → NetworkMembershipContract.NetworkMembershipContractClient
|
||||||
- [ ] Pages/Auth/VerifyOtp.razor
|
✅ 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
|
- [ ] Pages/Auth/ForgotPassword.razor
|
||||||
```
|
```
|
||||||
|
|
||||||
**ب. Profile Pages** (4 روز)
|
**ب. Profile Pages** (2 روز)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Profile/Index.razor
|
- [✅] Pages/Profile/Index.razor
|
||||||
- [ ] Pages/Profile/EditProfile.razor
|
- [✅] Pages/Profile/EditProfile.razor
|
||||||
- [ ] Pages/Profile/Addresses.razor
|
- [✅] Pages/Profile/Addresses.razor
|
||||||
- [ ] Pages/Profile/ChangePassword.razor
|
- [ ] Pages/Profile/ChangePassword.razor
|
||||||
```
|
```
|
||||||
|
|
||||||
**ج. Order Pages** (5 روز)
|
**ج. Order Pages** (3 روز)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Orders/MyOrders.razor
|
- [✅] Pages/Orders/MyOrders.razor
|
||||||
- [ ] Pages/Orders/OrderDetails.razor
|
- [✅] Pages/Orders/OrderDetails.razor
|
||||||
- [ ] Pages/Orders/Tracking.razor
|
- [ ] Pages/Orders/Tracking.razor
|
||||||
```
|
```
|
||||||
|
|
||||||
**د. Cart & Checkout** (5 روز)
|
**د. Cart & Checkout** (3 روز)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Cart/Index.razor (با نمایش VAT)
|
- [✅] Pages/Cart/Index.razor (با نمایش VAT)
|
||||||
- [ ] Pages/Checkout/Shipping.razor
|
- [✅] Pages/Checkout/Shipping.razor
|
||||||
- [ ] Pages/Checkout/Payment.razor
|
- [✅] Pages/Checkout/Payment.razor
|
||||||
- [ ] Pages/Checkout/Confirmation.razor
|
- [✅] Pages/Checkout/Confirmation.razor
|
||||||
|
- [⏳] DiscountCode validation (نیاز به ValidateDiscountCode RPC در CMS)
|
||||||
```
|
```
|
||||||
|
|
||||||
**ه. Club & Commission** (4 روز)
|
**ه. Club & Commission** ✅ تکمیل شده (متصل به gRPC)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Club/Membership.razor
|
- [✅] Pages/Club/Membership.razor
|
||||||
- [ ] Pages/Commission/MyCommissions.razor
|
- [✅] Pages/Commission/MyCommissions.razor
|
||||||
- [ ] Pages/Commission/Withdrawal.razor
|
- [✅] Pages/Commission/Withdrawal.razor
|
||||||
```
|
```
|
||||||
|
|
||||||
**و. Network Pages** (2 روز)
|
**و. Network Pages** ✅ تکمیل شده (متصل به gRPC)
|
||||||
```
|
```
|
||||||
- [ ] Pages/Network/Tree.razor
|
- [✅] Pages/Network/Tree.razor
|
||||||
- [ ] Pages/Network/Position.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`
|
**مستندات**: `FrontOffice/README.md`
|
||||||
|
|||||||
+159
-89
@@ -1,6 +1,7 @@
|
|||||||
# 🎯 اسپرینت جاری (Current Sprint)
|
# 🎯 اسپرینت جاری (Current Sprint)
|
||||||
|
|
||||||
**تاریخ شروع**: ۱۴ آذر ۱۴۰۴
|
**تاریخ شروع**: ۱۴ آذر ۱۴۰۴
|
||||||
|
**آخرین بروزرسانی**: ۱۴ آذر ۱۴۰۴
|
||||||
**مدت**: 2 هفته
|
**مدت**: 2 هفته
|
||||||
**هدف**: تکمیل FrontOffice UI و یکپارچهسازی BFF
|
**هدف**: تکمیل FrontOffice UI و یکپارچهسازی BFF
|
||||||
|
|
||||||
@@ -9,90 +10,96 @@
|
|||||||
## 📋 وضعیت کلی پروژه
|
## 📋 وضعیت کلی پروژه
|
||||||
|
|
||||||
### Backend:
|
### Backend:
|
||||||
- ✅ **CMS Microservice**: 95% Complete (Phase 9 & 12 Complete)
|
- ✅ **CMS Microservice**: ~95% Complete
|
||||||
- ✅ **BackOffice.BFF**: 100% Complete (35 Handlers)
|
- ✅ **BackOffice.BFF**: 100% Complete (35+ Handlers)
|
||||||
- 🚧 **FrontOffice.BFF**: 60% Complete (12 Handlers - 3 new today)
|
- ✅ **FrontOffice.BFF**: 90% Complete (Proto Projects + Handlers + Mappings)
|
||||||
|
|
||||||
### Frontend:
|
### Frontend:
|
||||||
- ✅ **BackOffice UI**: 100% Complete (23 Pages)
|
- ✅ **BackOffice UI**: ~95% Complete (60+ صفحه)
|
||||||
- 🚧 **FrontOffice UI**: 75% Complete (24 Pages - 7 new today)
|
- 🟢 **FrontOffice UI**: 85% Complete (24+ صفحه - سرویسها به gRPC وصل شدند)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🔥 High Priority (باید امروز/فردا تمام شود)
|
## ✅ تکمیل شده (۱۴ آذر ۱۴۰۴)
|
||||||
|
|
||||||
### 1. FrontOffice UI - Integration با BFF Real APIs ⏰
|
### Proto Projects برای Frontend:
|
||||||
**Status**: 🚧 In Progress (Mock → Real API)
|
|
||||||
**Owner**: Frontend Team
|
|
||||||
**Deadline**: ۱۵ آذر (فردا)
|
|
||||||
|
|
||||||
#### Tasks:
|
| پروژه | Endpoints | وضعیت |
|
||||||
- [ ] **ClubMembership صفحات** (3 صفحه)
|
|-------|-----------|-------|
|
||||||
- [ ] `ClubInfo.razor` - اتصال به `GetClubMembershipInfo`
|
| `FrontOffice.BFF.DiscountShop.Protobuf` | 7 RPCs | ✅ Complete |
|
||||||
- [ ] `ActivateClub.razor` - اتصال به `ActivateClubMembership`
|
| `FrontOffice.BFF.Commission.Protobuf` | `GetMyCommissionPayouts`, `GetMyWeeklyBalances` | ✅ Complete |
|
||||||
- [ ] `ClubFeatures.razor` - اتصال به `GetAvailableClubFeatures`
|
| `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 صفحه)
|
### FrontOffice UI Services - اتصال به gRPC:
|
||||||
- [ ] `Tree.razor` - اتصال به `GetNetworkTree` + Tree Builder
|
|
||||||
- [ ] `NetworkStats.razor` - اتصال به `GetNetworkStatistics`
|
|
||||||
|
|
||||||
- [ ] **Commission صفحات** (2 صفحه)
|
| Service | Status | توضیحات |
|
||||||
- [ ] `WeeklyReport.razor` - اتصال به `GetWeeklyCommissionReport`
|
|---------|--------|---------|
|
||||||
- [ ] `PayoutHistory.razor` - اتصال به `GetUserPayouts`
|
| `ClubMembershipService` | ✅ Connected | GetMyMembership, ActivateMembership |
|
||||||
|
| `NetworkMembershipService` | ✅ Connected | GetTree, GetStatistics + Tree Mapping |
|
||||||
|
| `CommissionService` | ✅ Connected | GetPayouts, GetWeeklyBalances |
|
||||||
|
| `WalletService` | ✅ Connected | GetBalances, GetTransactions, RequestWithdrawal, GetWithdrawals, GetSettings |
|
||||||
|
|
||||||
**Blockers**:
|
### Build Status:
|
||||||
- ⚠️ Protobuf mismatch (ActivationDate vs ActivatedAt) - نیاز به هماهنگی با Backend
|
```
|
||||||
- ⚠️ Tree structure در CMS flat list است - نیاز به Tree Builder در BFF
|
✅ FrontOffice: Build Succeeded - 0 Errors
|
||||||
|
✅ FrontOffice.BFF: Build Succeeded - 0 Errors
|
||||||
---
|
|
||||||
|
|
||||||
### 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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
- [ ] **NetworkMembershipHandler** - پیادهسازی Tree Builder
|
---
|
||||||
```csharp
|
|
||||||
// CMS: Flat list → BFF: Tree structure
|
|
||||||
// FIX: Build tree from flat list recursively
|
|
||||||
```
|
|
||||||
|
|
||||||
- [ ] **CommissionHandler** - تطبیق WeekNumber type
|
## ✅ بهروزرسانیهای BackOffice در این اسپرینت
|
||||||
```csharp
|
|
||||||
// CMS: WeekNumber (int) → BFF: WeekNumber (string)
|
|
||||||
// FIX: Convert int to "YYYY-Www" format
|
|
||||||
```
|
|
||||||
|
|
||||||
**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 (این هفته)
|
### 2. Package Purchase System - UI Implementation
|
||||||
|
|
||||||
### 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
|
|
||||||
**Status**: ⏳ Not Started (Proto Complete ✅)
|
**Status**: ⏳ Not Started (Proto Complete ✅)
|
||||||
**Owner**: FrontOffice Team
|
**Owner**: FrontOffice Team
|
||||||
**Deadline**: ۱۸ آذر
|
**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 (هفته بعد)
|
## 🟢 Low Priority (هفته بعد)
|
||||||
|
|
||||||
### 5. VAT System Implementation
|
### 5. VAT System Implementation
|
||||||
@@ -143,38 +220,32 @@
|
|||||||
|
|
||||||
## ⚠️ Blockers & Dependencies
|
## ⚠️ Blockers & Dependencies
|
||||||
|
|
||||||
### 🔴 Critical Blockers:
|
### 🟢 Resolved:
|
||||||
1. **Protobuf Mismatch** (FrontOffice.BFF ↔ CMS)
|
1. ~~**Protobuf Mismatch** (FrontOffice.BFF ↔ CMS)~~ ✅ Fixed
|
||||||
- Impact: 3 modules affected
|
2. ~~**WalletService Mock Data**~~ ✅ Connected to gRPC
|
||||||
- Resolution: Backend coordination needed
|
3. ~~**Tree Builder Missing** (NetworkMembership)~~ ✅ Implemented
|
||||||
- ETA: امروز/فردا
|
|
||||||
|
|
||||||
2. **Tree Builder Missing** (NetworkMembership)
|
|
||||||
- Impact: Tree.razor can't display network
|
|
||||||
- Resolution: Implement recursive tree builder in BFF
|
|
||||||
- ETA: 1 روز
|
|
||||||
|
|
||||||
### 🟡 Minor Issues:
|
### 🟡 Minor Issues:
|
||||||
1. **WalletService Mock Data** - نیاز به پاکسازی بعد از اتصال API
|
1. **MudBlazor Warnings** - ~100 warnings (غیر critical)
|
||||||
2. **MudBlazor Warnings** - 113 warning (غیر critical)
|
2. **Missing CMS Entities** - Review, ContactMessage, DiscountValidation
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📊 Velocity Tracking
|
## 📊 Progress Summary
|
||||||
|
|
||||||
### کارهای تمام شده امروز (۱۴ آذر):
|
### کارهای تمام شده امروز (۱۴ آذر):
|
||||||
- ✅ FrontOffice UI: 7 صفحه جدید (Club, Network, Commission)
|
- ✅ FrontOffice Proto Projects: 5 پروژه جدید
|
||||||
- ✅ FrontOffice.BFF: 3 CQ module جدید
|
- ✅ FrontOffice UI Services: 4 سرویس به gRPC وصل شدند
|
||||||
- ✅ Build Successful: 0 errors
|
- ✅ FrontOffice.BFF Handlers: 15+ handler
|
||||||
- ✅ Documentation: 2 فایل تحلیل جدید
|
- ✅ Build Successful: 0 errors در هر دو پروژه
|
||||||
|
|
||||||
### تخمین باقیمانده:
|
### تخمین باقیمانده:
|
||||||
- **FrontOffice UI Integration**: 2 روز (7 صفحه × 3-4 ساعت)
|
- **CMS Entity Creation** (Review, Contact, Discount): 1-2 روز
|
||||||
- **Protobuf Fixes**: 1 روز (3 handler)
|
|
||||||
- **WalletService Implementation**: 1 روز (5 متد)
|
|
||||||
- **Package Purchase UI**: 2 روز (4 صفحه + BFF)
|
- **Package Purchase UI**: 2 روز (4 صفحه + BFF)
|
||||||
|
- **VAT System**: 2 روز
|
||||||
|
- **RBAC System**: 1.5 هفته
|
||||||
|
|
||||||
**Total**: ~6 روز کاری (1.5 هفته)
|
**Total**: ~5-7 روز کاری
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -200,4 +271,3 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
**منتظر بروزرسانی روزانه هستیم** 🚀
|
**منتظر بروزرسانی روزانه هستیم** 🚀
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user