docs: mark T4.2, T4.3, T4.13, F2, F3 as completed — phase 8f

- PACKAGE-TRANSFORMATION-TASKS.md: add phase 8f section, mark T4.2/T4.3/T4.13 complete
- FEATURE-BACKLOG.md: mark F2 (ChangeNetworkParent) + F3 (CalculateOrderPV) complete
- NuGet v0.0.188 | CMS:dcd1135 FO:3bffc13 BO:e020354
This commit is contained in:
masoodafar-web
2026-02-26 22:10:45 +03:30
parent 38aababc1a
commit df1affa46e
2 changed files with 64 additions and 52 deletions
+6 -6
View File
@@ -1,6 +1,6 @@
# 📋 فیچر بکلاگ — RPCهای آماده (بدون UI)
> تاریخ: ۱۴۰۴/۱۲/۰۶
> تاریخ: ۱۴۰۴/۱۲/۱۰
> منبع: آدیت gRPC (کامیت `3575e48`) → ۱۲ RPC کامل بدون فرانت
> اولویت‌بندی: بر اساس ارزش کسب‌وکار + نیازمندی پکیج‌بیس
@@ -19,8 +19,8 @@
| # | RPC | تارگت | صفحه | اقدام | تخمین |
|---|-----|-------|------|-------|-------|
| F1 | `AssignFeatureToMembership` | BackOffice | ClubFeaturesPage.razor | دکمه «اختصاص فیچر به عضو» + ماتریس PackageFeature | ۴ ساعت |
| F2 | `ChangeNetworkParent` | BackOffice | UserNetworkInfo.razor | دکمه «جابجایی در شبکه» + مودال انتخاب parent جدید | ۶ ساعت |
| F3 | `CalculateOrderPV` | FrontOffice | Checkout.razor + MyPackages.razor | نمایش PV سفارش در چک‌اوت + PV انباشته در صفحه پکیج‌ها | ۴ ساعت |
| F2 | `ChangeNetworkParent` | BackOffice | UserNetworkInfo.razor | دکمه «تغییر والد» + مودال ChangeParentDialog | BO:`e020354` |
| F3 | `CalculateOrderPV` | FrontOffice | Store/OrderDetail.razor | نمایش PV سفارش + PV هر محصول | FO:`3bffc13` |
### 🟡 اولویت متوسط — بهبود UX فروشگاه
@@ -49,8 +49,8 @@
```
F1 (AssignFeatureToMembership) → با T4.6 (ماتریس PackageFeature) ادغام
F2 (ChangeNetworkParent) → با تست‌های شبکه فاز ۵ ادغام
F3 (CalculateOrderPV) → با T4.3 (MyPackages re-purchase) ادغام
F2 (ChangeNetworkParent) ✅ تکمیل → BO:`e020354`
F3 (CalculateOrderPV) ✅ تکمیل → FO:`3bffc13`
```
### فاز B — بعد از پکیج‌بیس (Sprint بعدی)
@@ -78,4 +78,4 @@ F8 → F12: گزارش‌دهی و عملیات انبوه
---
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۰۶*
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۱۰ — F2+F3 تکمیل | باقی‌مانده فاز A: F1*
+58 -46
View File
@@ -1,13 +1,13 @@
# 🔄 نقشه‌راه تحول پکیج‌بیس — تسک‌های گام‌به‌گام
> **وضعیت:** در حال اجرا — **فاز ۰-۹ (per-package reports) تکمیل ✅** | NuGet v0.0.187 | تست باقی‌مانده
> **تاریخ:** ۱۴۰۴/۱۲/۰۹
> **وضعیت:** در حال اجرا — **فاز ۰-۸f (UI تکمیل) ✅** | NuGet v0.0.188 | تست باقی‌مانده
> **تاریخ:** ۱۴۰۴/۱۲/۱۰
> **پیش‌نیاز:** [BIZ-PACKAGE-BASED-SYSTEM.md](../business/BIZ-PACKAGE-BASED-SYSTEM.md) **v3** (تکمیل پورسانت per-package)
> **هدف:** شکستن **۴۸+ تغییر** به تسک‌های اتمیک با ترتیب اجرا و وابستگی‌ها
> **کامیت‌ها:**
> CMS: `8b9c317`→`fe3edd1`→`ae92ab8`→`a9cd2fd`→`8e5c7c5`→`ccb938e`→`0002a5a`→`607f791`→`7176fe4`→`d19c569`→`469d97b`→`161f796`→`8446e0e`→`ce8e248`→`7554d70`→`aaaf7fc`
> FrontOffice: `b82cac4`→`71f391a`→`0bbc11e`→`d71d463`→`40882c8`→`a956cb9`
> BackOffice: `f1b0085`→`89f5241`→`c96377a`→`8be98ae`
> CMS: `8b9c317`→`fe3edd1`→`ae92ab8`→`a9cd2fd`→`8e5c7c5`→`ccb938e`→`0002a5a`→`607f791`→`7176fe4`→`d19c569`→`469d97b`→`161f796`→`8446e0e`→`ce8e248`→`7554d70`→`aaaf7fc`→`dcd1135`
> FrontOffice: `b82cac4`→`71f391a`→`0bbc11e`→`d71d463`→`40882c8`→`a956cb9`→`3bffc13`
> BackOffice: `f1b0085`→`89f5241`→`c96377a`→`8be98ae`→`e020354`
> ⚠️ **تغییرات v3:** پورسانت per-package، carryover مجزا، SP parameters داینامیک، گزارش‌دهی FO/BO per-package
@@ -22,7 +22,7 @@
├─→ مرحله ۲: منطق کسب‌وکار (۴ روز) ✅ `8e5c7c5`
│ └─→ مرحله ۳: بازسازی لایه Package ✅ `ccb938e`
│ └─→ مرحله ۴: CRUD + Legacy Fixes ✅ `0002a5a`
│ └─→ مرحله UI (۵ روز)
│ └─→ مرحله UI (۵ روز)
└─→ مرحله ۳: پورسانت (۴ روز) ✅ `607f791`+`7176fe4`
└─→ مرحله ۶: Deprecation cleanup ✅ `d19c569`
└─→ مرحله ۷: Migration + Cleanup ✅
@@ -35,9 +35,10 @@
├─→ 8c: FO Package pages ✅ FO:`d71d463`
└─→ 8d: Proto cleanup ✅ CMS:`7554d70` FO:`40882c8` BO:`c96377a`
└─→ 8e: Per-package reports ✅ CMS:`aaaf7fc` FO:`a956cb9` BO:`8be98ae`
└─→ مرحله ۵: تست + استقرار (۳ روز) ⬜
└─→ 8f: UI completion ✅ CMS:`dcd1135` FO:`3bffc13` BO:`e020354`
└─→ مرحله ۵: تست + استقرار (۳ روز) ⬜
مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۵ = ~۱۷ روز | انجام‌شده: ۰→8e (~۱۶ روز)
مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۵ = ~۱۷ روز | انجام‌شده: ۰→8f (~۱۷ روز)
```
---
@@ -611,6 +612,28 @@ await connection.ExecuteAsync("CMS.sp_CalculateWeeklyBalances",
**NuGet:** `0.0.186``0.0.187` (همه ریپوها)
### فاز 8f — UI Completion (T4.2 + T4.3 + T4.13 + F2 + F3) ✅
> کامیت: CMS `dcd1135` | FO `3bffc13` | BO `e020354`
**CMS (T4.13 — PackageFeature CRUD):**
- Proto: اضافه `repeated int64 feature_ids` به ۴ message (Create/Update Request, Get/GetAll Response)
- `CreateNewPackageCommand/Handler`: sync FeatureIds → ساخت `PackageFeature` records
- `UpdatePackageCommand/Handler`: sync FeatureIds → حذف قبلی‌ها + ساخت جدید
- `GetPackage/GetAllPackageByFilter`: اضافه `.Include(x => x.PackageFeatures)` + map FeatureIds
**BackOffice (F2 + T4.13):**
- **F2:** کامپوننت جدید `ChangeParentDialog.razor/.cs` — مودال جابجایی در شبکه با NewParentId, NewLeg, Reason
- **F2:** دکمه «تغییر والد» در `UserNetworkInfo.razor`
- **T4.13:** checkbox matrix فیچرها در `CreateDialog` و `UpdateDialog` — بارگذاری از `ConfigurationContractClient`
**FrontOffice (T4.2 + T4.3 + F3):**
- **T4.2:** پرداخت شرطی در `Checkout.razor` بر اساس `SupportsDirectPurchase`/`SupportsDayaPurchase`
- **T4.3:** منطق خرید مجدد در `MyPackages.razor` — بارگذاری `MagicWalletStatus` + CTA شرطی + progress bar
- **F3:** نمایش PV سفارش در `Store/OrderDetail.razor``CalculateOrderPVAsync` + جدول PV هر محصول
**NuGet:** `0.0.187``0.0.188` (همه ریپوها)
---
## مرحله ۴ — UI (FrontOffice + BackOffice)
@@ -633,34 +656,21 @@ await connection.ExecuteAsync("CMS.sp_CalculateWeeklyBalances",
}
```
### T4.2 — مودال پرداخت شرطی
### T4.2 — مودال پرداخت شرطی ✅ FO:`3bffc13`
```razor
@if (_selectedPackage.SupportsDirectPurchase)
{
<MudButton OnClick="PayOnline">پرداخت آنلاین</MudButton>
}
@if (_selectedPackage.SupportsDayaPurchase)
{
<MudButton OnClick="PayDaya">اقساط دایا</MudButton>
}
```
**پیاده‌سازی:**
- `Checkout.razor.cs`: اضافه `PackageService` injection، بارگذاری پکیج‌ها با `GetAllPackagesAsync()`
- `Checkout.razor`: دکمه‌های پرداخت شرطی بر اساس `SupportsDirectPurchase` و `SupportsDayaPurchase`
- اضافه `DayaLoanPayment()` method + alert برای عدم وجود روش پرداخت
- `Pack` record: اضافه `SupportsDirectPurchase` و `SupportsDayaPurchase`
### T4.3 — MyPackages + Re-Purchase
### T4.3 — MyPackages + Re-Purchase ✅ FO:`3bffc13`
```razor
@if (_canRepurchase)
{
<MudAlert Severity="Severity.Success">
🎉 چرخه جادویی تکمیل شد! می‌توانید پکیج جدید بخرید.
</MudAlert>
<MudButton Href="/packages">خرید پکیج جدید</MudButton>
}
else
{
<MagicWalletProgress Wallet="@_wallet" Cycle="@_currentCycle" />
}
```
**پیاده‌سازی:**
- `MyPackages.razor.cs`: بارگذاری `MagicWalletStatus` از `WalletService.GetMagicWalletStatusAsync()`
- فرمول خرید مجدد: `WalletMode == 0 && PurchaseCycleCount >= 1 && MagicRemainingDeposit == 0`
- `MyPackages.razor`: CTA شرطی «🎉 چرخه جادویی تکمیل شد!» + دکمه «خرید پکیج جدید»
- بخش پیشرفت کیف پول جادویی: مبلغ واریزی، باقی‌مانده، اعتبار دریافتی + progress bar
### T4.8 — FrontOffice: CommissionDashboard per-package (🆕 v3) ✅ FO:`a956cb9`
@@ -683,18 +693,20 @@ else
- `UserPayouts.razor/.cs`: فیلتر PackageSelect + ستون پکیج با MudChip
- `BalancesReport.razor`: فیلتر PackageSelect + ستون پکیج با MudChip + mapping `PackageTitle`
### T4.13 — BackOffice: Package CRUD + Quick Access فیچرها (🆕 v3)
### T4.13 — BackOffice: Package CRUD + Quick Access فیچرها (🆕 v3) ✅ CMS:`dcd1135` BO:`e020354`
> ادمین موقع ساخت/ویرایش پکیج، فیچرها را با checkbox در همان فرم تعیین کند
**CMS پیاده‌سازی:**
- Proto: اضافه `repeated int64 feature_ids` به ۴ message (Create/Update Request, Get/GetAll Response)
- `CreateNewPackageCommand/Handler`: اضافه `FeatureIds` + ساخت `PackageFeature` records
- `UpdatePackageCommand/Handler`: اضافه `FeatureIds` + sync (حذف قبلی‌ها + ساخت جدید)
- `GetPackageQueryHandler`: اضافه `.Include(x => x.PackageFeatures)` + map `FeatureIds`
- `GetAllPackageByFilterQueryHandler`: اضافه `.Include(x => x.PackageFeatures)` قبل از `PaginatedListAsync`
- NuGet: `0.0.187``0.0.188`
```razor
@* در PackageCreateDialog / PackageEditDialog: *@
<MudText Typo="Typo.h6">فیچرهای پکیج</MudText>
@foreach (var feature in _allFeatures)
{
<MudCheckBox @bind-Checked="feature.IsIncluded" Label="@feature.Title" />
}
```
**BO پیاده‌سازی:**
- `CreateDialog.razor/.cs`: بارگذاری `ClubFeatures` از `ConfigurationContractClient` + checkbox matrix
- `UpdateDialog.razor/.cs`: همان pattern + pre-populate از `Model.FeatureIds`
- Mapster: `Adapt<UpdatePackageRequest>()` خودکار `FeatureIds` را map می‌کند
---
@@ -733,8 +745,8 @@ else
**Migration + سایر:**
- [ ] Data Migration — PackageId در رکوردهای قبلی (شامل NetworkWeeklyBalance)
- [ ] JWT claims جدید (CanRepurchase, PackageId)
- [ ] UI: کاشی‌های داینامیک FrontOffice
- [ ] UI: ماتریس فیچر + Quick Access BackOffice
- [x] UI: کاشی‌های داینامیک FrontOffice
- [x] UI: ماتریس فیچر + Quick Access BackOffice
- [ ] Rollback: بدون data loss
---
@@ -766,4 +778,4 @@ else
---
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۰۹ — فاز ۰e تکمیل (۲۴ کامیت: ۱۶ CMS + ۶ FO + ۴ BO) | NuGet v0.0.187 | Proto: +package_id in commission messages | FO+BO per-package commission reports کامل | باقی‌مانده: تست + deploy*
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۱۰ — فاز ۰f تکمیل (۲۷ کامیت: ۱۷ CMS + ۷ FO + ۵ BO) | NuGet v0.0.188 | T4.2+T4.3+T4.13+F2+F3 کامل | باقی‌مانده: تست + deploy*