diff --git a/roadmap/FEATURE-BACKLOG.md b/roadmap/FEATURE-BACKLOG.md
index 7282745..a317a2d 100644
--- a/roadmap/FEATURE-BACKLOG.md
+++ b/roadmap/FEATURE-BACKLOG.md
@@ -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*
diff --git a/roadmap/PACKAGE-TRANSFORMATION-TASKS.md b/roadmap/PACKAGE-TRANSFORMATION-TASKS.md
index 8a3d09f..ce8b94b 100644
--- a/roadmap/PACKAGE-TRANSFORMATION-TASKS.md
+++ b/roadmap/PACKAGE-TRANSFORMATION-TASKS.md
@@ -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)
-{
- پرداخت آنلاین
-}
-@if (_selectedPackage.SupportsDayaPurchase)
-{
- اقساط دایا
-}
-```
+**پیادهسازی:**
+- `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)
-{
-
- 🎉 چرخه جادویی تکمیل شد! میتوانید پکیج جدید بخرید.
-
- خرید پکیج جدید
-}
-else
-{
-
-}
-```
+**پیادهسازی:**
+- `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: *@
-فیچرهای پکیج
-@foreach (var feature in _allFeatures)
-{
-
-}
-```
+**BO پیادهسازی:**
+- `CreateDialog.razor/.cs`: بارگذاری `ClubFeatures` از `ConfigurationContractClient` + checkbox matrix
+- `UpdateDialog.razor/.cs`: همان pattern + pre-populate از `Model.FeatureIds`
+- Mapster: `Adapt()` خودکار `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*