docs: Phase 9 — Q24-Q30 + History Interceptor + Rename + Migration

- CHANGELOG: add Phase 9 (9a-9d) with all new commits (CMS:a1024a3→fdbb91d→10d2ca2, FO:474d364, BO:6939780)
- CHANGELOG: update summary table (279 items, 99%)
- TASKS: add Phase 9 section with detailed descriptions + update commit list (30 total)
- BIZ: update header to 'code complete — Phase 0-9 ' + add Phase 9 commits
- TECH-01: add SP Worker (Q26), History Tracking System (Q27), IHasHistory, Interceptor docs
- TECH-01: add UserWalletHistoryService (renamed from ChangeLog)
- INDEX: update R3/R6 descriptions, update timestamp
This commit is contained in:
masoodafar-web
2026-02-27 06:35:09 +03:30
parent 085583c274
commit e9f1fb9911
5 changed files with 166 additions and 21 deletions
+87 -9
View File
@@ -1,13 +1,13 @@
# 🔄 نقشه‌راه تحول پکیج‌بیس — تسک‌های گام‌به‌گام
> **وضعیت:** در حال اجرا — **فاز ۰-۸f (UI تکمیل) ✅** | NuGet v0.0.188 | تست باقی‌مانده
> **تاریخ:** ۱۴۰۴/۱۲/۱۰
> **پیش‌نیاز:** [BIZ-PACKAGE-BASED-SYSTEM.md](../business/BIZ-PACKAGE-BASED-SYSTEM.md) **v3** (تکمیل پورسانت per-package)
> **وضعیت:** در حال اجرا — **فاز ۰-۹ (تکمیل کد) ✅** | NuGet v0.0.188 | تست باقی‌مانده
> **تاریخ:** ۱۴۰۴/۱۲/۰۸
> **پیش‌نیاز:** [BIZ-PACKAGE-BASED-SYSTEM.md](../business/BIZ-PACKAGE-BASED-SYSTEM.md) **v6** (تکمیل Q24-Q30 + History + Rename)
> **هدف:** شکستن **۴۸+ تغییر** به تسک‌های اتمیک با ترتیب اجرا و وابستگی‌ها
> **کامیت‌ها:**
> 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`
> CMS: `8b9c317`→`fe3edd1`→`ae92ab8`→`a9cd2fd`→`8e5c7c5`→`ccb938e`→`0002a5a`→`607f791`→`7176fe4`→`d19c569`→`469d97b`→`161f796`→`8446e0e`→`ce8e248`→`7554d70`→`aaaf7fc`→`dcd1135`→`a1024a3`→`fdbb91d`→`10d2ca2`
> FrontOffice: `b82cac4`→`71f391a`→`0bbc11e`→`d71d463`→`40882c8`→`a956cb9`→`3bffc13`→`474d364`
> BackOffice: `f1b0085`→`89f5241`→`c96377a`→`8be98ae`→`e020354`→`6939780`
> ⚠️ **تغییرات v3:** پورسانت per-package، carryover مجزا، SP parameters داینامیک، گزارش‌دهی FO/BO per-package
@@ -36,9 +36,14 @@
└─→ 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`
└─→ مرحله ۵: تست + استقرار (۳ روز) ⬜
└─→ مرحله ۹: Q24-Q30 + History + Rename
├─→ 9a: Q24+Q26 (threshold+SP) ✅ CMS:`a1024a3`
├─→ 9b: Q27 History entities ✅ CMS:`fdbb91d`
├─→ 9c: Q28 UI Guidance ✅ FO:`474d364` BO:`6939780`
└─→ 9d: Rename+Interceptor+Mig ✅ CMS:`10d2ca2`
└─→ مرحله ۵: تست + استقرار (۳ روز) ⬜
مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۵ = ~۱۷ روز | انجام‌شده: ۰→8f (~۱۷ روز)
مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۹→۵ = ~۲۰ روز | انجام‌شده: ۰→9d (~۱۸ روز)
```
---
@@ -710,6 +715,79 @@ await connection.ExecuteAsync("CMS.sp_CalculateWeeklyBalances",
---
## مرحله ۹ — Q24-Q30 Business Decisions + History Infrastructure ✅
> ✅ تکمیل‌شده | وابستگی: مرحله ۸ | کامیت‌ها: CMS:`a1024a3`→`fdbb91d`→`10d2ca2` FO:`474d364` BO:`6939780`
### 9a: Q24 آستانه موجودی + Q26 SP Worker ✅ (CMS:`a1024a3`)
**Q24 — آستانه موجودی:**
- شرط ورود به Magic و خرید مجدد از `Balance == 0` به `Balance <= 1_000_000` ریال تغییر کرد
- چون قیمت محصولات متفاوته، Balance دقیقاً صفر نمی‌شه
- فایل‌ها: `UserOrderService.cs` (شرط EXIT Magic + Re-purchase guard)
**Q26 — SP Worker:**
- `StoredProcedureDeploymentService` (IHostedService) — در startup فایل‌های `.sql` از embedded resource خوانده می‌شوند
- مقایسه checksum با جدول `__SPChecksums` — فقط SP‌های تغییریافته re-deploy می‌شوند
- فایل‌ها: `StoredProcedureDeploymentService.cs`, embedded `.sql` resources
### 9b: Q27 History Tables Entities ✅ (CMS:`fdbb91d`)
**Entity‌های جدید:**
- `PackageHistory`: فیلدهای Old*/New* برای Price, ActivationFee, MagicMultiplier, MagicMaxDeposit, MaxBalancesPerLeg, IsActive + Action + PerformedBy + Reason
- `ClubMembershipCycleHistory`: فیلدهای Old*/New* برای IsCurrentCycle, MagicStartedAt, MagicCompletedAt + Action + UserId + CycleNumber
**Enums جدید:**
- `PackageAction`: Created, Updated, Activated, Deactivated, PriceChanged, FeaturesChanged
- `ClubMembershipCycleAction`: Created, MagicStarted, MagicCompleted, Closed, AdminModified
**زیرساخت:**
- EF Configurations (indexes, maxLength, precision)
- DbSets در `IApplicationDbContext` و `ApplicationDbContext`
- Navigation Properties: `Package.Histories`, `ClubMembershipCycle.Histories`
### 9c: Q28 UI Guidance ✅ (FO:`474d364` BO:`6939780`)
**FrontOffice — ۷ صفحه با MudAlert آموزشی:**
- G1: Packages.razor — توضیح سیستم پکیج‌بیس
- G2: Checkout — هشدار شارژ کیف‌پول اعتباری
- G3: MyPackages — توضیح وضعیت پکیج‌ها
- G4: MagicWallet — هشدار شرایط خروج + سقف شارژ
- G5: CommissionDashboard — توضیح per-package
- G6: ClubMembership — آموزش چرخه عضویت
- G7: ActivationSection — هشدار هزینه فعال‌سازی
**BackOffice — ۶ صفحه با MudAlert:**
- G8: PackageCRUD — هشدار ثبت تغییرات در History
- G9: ClubFeatures — توضیح ارتباط فیچر-پکیج
- G10: ManualPayments — هشدار مبلغ بر اساس پکیج
- G11: Commission Dashboard — توضیح Pool per-package
- G12: UserPayouts — توضیح فیلتر پکیج
- G13: ClubMembers — اطلاعات چرخه عضویت
### 9d: Rename + History Interceptor + EF Migration ✅ (CMS:`10d2ca2`)
**Rename (86 فایل):**
- `UserWalletChangeLog``UserWalletHistory` در 54+ فایل (entities, configs, DTOs, commands, queries, protos, services)
- 34 فایل rename شده + 11 دایرکتوری rename شده
- Proto: `userwalletchangelog.proto``userwallethistory.proto`
**History Interceptor:**
- `IHasHistory<T>` generic interface در `Domain/Common` — متد `CreateHistorySnapshot(action, performedBy)`
- `HistoryTrackingSaveChangesInterceptor` در `Infrastructure/Persistence/Interceptors` — reflection-based
- شناسایی entity‌های `IHasHistory<>` از ChangeTracker
- فراخوانی `CreateHistorySnapshot` برای Modified/Added
- Auto-fill فیلدهای `Old*` از `OriginalValues` با naming convention
- `Package` implements `IHasHistory<PackageHistory>` — اولین entity
**EF Migration (`Q27_HistoryTables_And_RenameWalletHistory`):**
- ⚠️ EF Core اتوماتیک `DropTable` + `CreateTable` تولید کرد → **دستی اصلاح شد** به `RenameTable` (حفظ داده‌ها)
- `RenameTable` + `RenameIndex` × 2 + `sp_rename` برای PK و FK‌ها
- `CreateTable` برای `ClubMembershipCycleHistories` و `PackageHistories` (جداول جدید)
- Down method: reverse rename + drop new tables
---
## مرحله ۵ — تست و استقرار
> ⏱️ **۳ روز** (v3: +۱) | وابستگی: مرحله ۴
@@ -778,4 +856,4 @@ await connection.ExecuteAsync("CMS.sp_CalculateWeeklyBalances",
---
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۱۰ — فاز ۰-۸f تکمیل (۲۷ کامیت: ۱۷ CMS + ۷ FO + ۵ BO) | NuGet v0.0.188 | T4.2+T4.3+T4.13+F2+F3 کامل | باقی‌مانده: تست + deploy*
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۰۸ — فاز ۰-۹d تکمیل (۳۰ کامیت: ۲۰ CMS + ۸ FO + ۶ BO) | NuGet v0.0.188 | باقی‌مانده: تست + deploy*