From 996a6e885b2eb08c8828d7f1b9da3bbb620a6853 Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Thu, 4 Dec 2025 19:54:08 +0330 Subject: [PATCH] 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. --- 01-BUSINESS/balance-calculation-rules.md | 112 ++++- 01-BUSINESS/commission-calculation-fix.md | 354 +++++++++++++++ .../discount-shop-integration.md | 15 +- 03-BACKEND/BackOffice.BFF/handlers-status.md | 202 --------- 03-BACKEND/FrontOffice.BFF/README.md | 109 ++++- 04-FRONTEND/BackOffice/ui-status.md | 59 +-- 05-TASKS/BACKLOG.md | 402 +++++++++++------- 05-TASKS/CURRENT-SPRINT.md | 242 +++++++---- 8 files changed, 997 insertions(+), 498 deletions(-) create mode 100644 01-BUSINESS/commission-calculation-fix.md diff --git a/01-BUSINESS/balance-calculation-rules.md b/01-BUSINESS/balance-calculation-rules.md index b7db702..1901385 100644 --- a/01-BUSINESS/balance-calculation-rules.md +++ b/01-BUSINESS/balance-calculation-rules.md @@ -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 // باقیمانده از سقف هر دست ``` --- diff --git a/01-BUSINESS/commission-calculation-fix.md b/01-BUSINESS/commission-calculation-fix.md new file mode 100644 index 0000000..78e38c2 --- /dev/null +++ b/01-BUSINESS/commission-calculation-fix.md @@ -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 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 +/// +/// محاسبه مجموع تعادل‌های زیرمجموعه یک کاربر تا N لول +/// +private async Task 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; +} + +/// +/// پیدا کردن بازگشتی زیرمجموعه‌ها +/// +private async Task> GetSubordinatesRecursive( + long userId, + int currentLevel, + int maxLevel, + CancellationToken cancellationToken) +{ + if (currentLevel > maxLevel) + return new List(); + + var result = new List(); + + // پیدا کردن فرزندان مستقیم + 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 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 +/// +/// تعادل شخصی (بدون زیرمجموعه) +/// +public int PersonalBalances { get; set; } + +/// +/// تعادل زیرمجموعه‌ها +/// +public int SubordinateBalances { get; set; } + +/// +/// مجموع (PersonalBalances + SubordinateBalances) +/// +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 + +--- + +**آیا این تحلیل و برنامه مورد تأیید شماست؟** diff --git a/03-BACKEND/BackOffice.BFF/discount-shop-integration.md b/03-BACKEND/BackOffice.BFF/discount-shop-integration.md index 310a282..2f1826c 100644 --- a/03-BACKEND/BackOffice.BFF/discount-shop-integration.md +++ b/03-BACKEND/BackOffice.BFF/discount-shop-integration.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` مراجعه شود. --- diff --git a/03-BACKEND/BackOffice.BFF/handlers-status.md b/03-BACKEND/BackOffice.BFF/handlers-status.md index f906619..6b8eee9 100644 --- a/03-BACKEND/BackOffice.BFF/handlers-status.md +++ b/03-BACKEND/BackOffice.BFF/handlers-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** 🚀 - diff --git a/03-BACKEND/FrontOffice.BFF/README.md b/03-BACKEND/FrontOffice.BFF/README.md index c82a514..e52091f 100644 --- a/03-BACKEND/FrontOffice.BFF/README.md +++ b/03-BACKEND/FrontOffice.BFF/README.md @@ -1,3 +1,110 @@ # FrontOffice.BFF -FrontOffice BFF \ No newline at end of file +## 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) \ No newline at end of file diff --git a/04-FRONTEND/BackOffice/ui-status.md b/04-FRONTEND/BackOffice/ui-status.md index 8569932..6b5cba3 100644 --- a/04-FRONTEND/BackOffice/ui-status.md +++ b/04-FRONTEND/BackOffice/ui-status.md @@ -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) ``` --- diff --git a/05-TASKS/BACKLOG.md b/05-TASKS/BACKLOG.md index 802c46f..5b85e83 100644 --- a/05-TASKS/BACKLOG.md +++ b/05-TASKS/BACKLOG.md @@ -76,7 +76,7 @@ strong { } -> **تاریخ به‌روزرسانی**: 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` diff --git a/05-TASKS/CURRENT-SPRINT.md b/05-TASKS/CURRENT-SPRINT.md index 8ec902b..0c3ff76 100644 --- a/05-TASKS/CURRENT-SPRINT.md +++ b/05-TASKS/CURRENT-SPRINT.md @@ -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 +### Build Status: +``` +✅ FrontOffice: Build Succeeded - 0 Errors +✅ FrontOffice.BFF: Build Succeeded - 0 Errors +``` --- -### 2. FrontOffice.BFF - رفع Protobuf Mismatches ⏰ -**Status**: 🚧 In Progress -**Owner**: Backend Team -**Deadline**: ۱۵ آذر +## ✅ به‌روزرسانی‌های BackOffice در این اسپرینت -#### Tasks: -- [ ] **ClubMembershipHandler** - تطبیق field names - ```csharp - // CMS: ActivationDate → BFF: ActivatedAt - // FIX: Rename in proto or add mapping - ``` +> مطابق BACKLOG و ui-status (BackOffice)، تمرکز بخشی از این اسپرینت روی تکمیل BackOffice قبل از ورود جدی به FrontOffice بوده است. -- [ ] **NetworkMembershipHandler** - پیاده‌سازی Tree Builder - ```csharp - // CMS: Flat list → BFF: Tree structure - // FIX: Build tree from flat list recursively - ``` +### 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) -- [ ] **CommissionHandler** - تطبیق WeekNumber type - ```csharp - // CMS: WeekNumber (int) → BFF: WeekNumber (string) - // FIX: Convert int to "YYYY-Www" format - ``` +### 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 متصل است. -**File**: `03-BACKEND/FrontOffice.BFF/protobuf-mismatch.md` دارای جزئیات کامل +## 🔥 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 @@ --- **منتظر بروزرسانی روزانه هستیم** 🚀 -