diff --git a/business/BIZ-PACKAGE-BASED-SYSTEM.md b/business/BIZ-PACKAGE-BASED-SYSTEM.md index 47830da..0fcd741 100644 --- a/business/BIZ-PACKAGE-BASED-SYSTEM.md +++ b/business/BIZ-PACKAGE-BASED-SYSTEM.md @@ -1,10 +1,10 @@ # 📦 سیستم مبتنی بر پکیج (Package-Based System) -> **وضعیت:** پیاده‌سازی کد تکمیل — **فاز ۰-۹ ✅** | تست + استقرار باقی‌مانده +> **وضعیت:** پیاده‌سازی کد تکمیل — **فاز ۰-۱۰ ✅** | تست نهایی باقی‌مانده > **تاریخ بروزرسانی:** ۸ اسفند ۱۴۰۴ -> **نسخه:** v6 (آستانه موجودی + SP Worker + History Tables + UI Guidance) -> **تاثیرگذاری:** زیاد — **۹۵+** تغییر در ۶ لایه (۵۱ اصلی + ۴۴ سایدافکت) -> **کامیت‌ها:** `8b9c317` (Phase 0) → `ae92ab8` (Phase 1) → `a9cd2fd` (Phase 1.5) → `8e5c7c5` (Phase 2) → `ccb938e` (Phase 3) → `0002a5a` (Phase 4) → `a1024a3` (Q24+Q26) → `fdbb91d` (Q27) → `10d2ca2` (Rename+Interceptor+Migration) +> **نسخه:** v7 (DataMigration + EF Staging + PackagePurchaseDialog + UI Fixes) +> **تاثیرگذاری:** زیاد — **۱۰۰+** تغییر در ۶ لایه (۵۱ اصلی + ۴۴ سایدافکت + ۵ استقرار) +> **کامیت‌ها:** `8b9c317` (Phase 0) → `ae92ab8` (Phase 1) → `a9cd2fd` (Phase 1.5) → `8e5c7c5` (Phase 2) → `ccb938e` (Phase 3) → `0002a5a` (Phase 4) → `a1024a3` (Q24+Q26) → `fdbb91d` (Q27) → `10d2ca2` (Rename+Interceptor+Migration) → `a3681a8` (PackagePurchaseDialog) → `3c1a8ff` (UI Fixes) --- @@ -1431,8 +1431,8 @@ SELECT 'Balances', COUNT(*) FROM "CMS"."NetworkWeeklyBalances" WHERE "PackageId" | تسک | شرح | v3? | |-----|----- |-----| -| **T4.1** | FrontOffice: کاشی‌های پکیج (داینامیک) | | -| **T4.2** | FrontOffice: مدال پرداخت (دایا+مستقیم / فقط مستقیم) | | +| **T4.1** | FrontOffice: کاشی‌های پکیج (داینامیک) — ✅ `PackagePurchaseDialog.razor` | | +| **T4.2** | FrontOffice: مدال پرداخت (دایا+مستقیم / فقط مستقیم) — ✅ Step 2 in dialog | | | **T4.3** | FrontOffice: MyPackages — re-purchase | | | **T4.4** | FrontOffice: ActivationSection + Contract — داینامیک | | | **T4.5** | BackOffice: CRUD پکیج — فیلدهای جدید (۱۱ فیلد) | 🔄 | diff --git a/business/BUSINESS-02-PAYMENT-FINANCE.md b/business/BUSINESS-02-PAYMENT-FINANCE.md index 12ee42f..6176c58 100644 --- a/business/BUSINESS-02-PAYMENT-FINANCE.md +++ b/business/BUSINESS-02-PAYMENT-FINANCE.md @@ -1,7 +1,7 @@ # 💰 سیستم مالی، پرداخت و درگاه‌ها > **منابع ادغام‌شده:** `payment-gateway.md`, `payment-architecture-pyms.md`, `daya-loan-integration.md`, `manual-payment-system.md`, `discount-shop-business.md` -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: فیکس WalletChangeLog + validation کیف‌پول اعتباری + نام‌گذاری جدید کیف‌پول‌ها) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: فیکس Toman/Rial + PackagePurchaseDialog + اعمال migrations بر staging) --- @@ -63,6 +63,12 @@ flowchart TD | `Sandbox` | `true` (staging) / `false` (production) | | `Currency` | IRR (ریال → تبدیل به تومان در UI) | +> **✅ توضیح تبدیل Rial → Toman:** +> - **DB:** `Package.Price` به **ریال** ذخیره می‌شود (`/// قیمت پکیج (ریال)`) +> - **CMS → ZarinPal:** مستقیم ریال ارسال می‌شود (`Amount = package.Price` → `amountInRials = (long)request.Amount`) +> - **FrontOffice UI:** `PackageDto.FormattedPrice` = `Price / 10` + «تومان» (فیکس شد در `3c1a8ff`) +> - **باگ قبلی:** FO مقدار خام ریال را با برچسب «تومان» نمایش می‌داد (مثلاً ۵۶۰،۰۰۰،۰۰۰ تومان بجای ۵۶،۰۰۰،۰۰۰ تومان) + > **تنظیمات محیطی:** > - `appsettings.json` + `appsettings.Staging.json`: `UseSandbox: true` (تست) > - `appsettings.Production.json`: `UseSandbox: false` (واقعی) @@ -244,6 +250,8 @@ service PaymentService { | Pool هفتگی | ✅ کامل | SP + Hangfire | | WalletChangeLog | ✅ فیکس شده | لاگ تغییرات کیف‌پول در ۳ هندلر اضافه شد | | Validation کیف‌پول اعتباری | ✅ فیکس شده | ارور اگر موجودی کافی نباشد | +| Toman/Rial تبدیل نمایش | ✅ فیکس شده | `Price / 10` در FO — درگاه ریال می‌گیرد، UI تومان نمایش می‌دهد | +| PackagePurchaseDialog | ✅ کامل | دیالوگ داینامیک کاشی‌ای با انتخاب روش پرداخت | | پرداخت دستی | ⬜ طراحی | نیاز به تصمیم مدیریت | | Refund | ⬜ طراحی | فقط در PYMS تعریف‌شده | | کیف‌پول جادویی (Magic) | ✅ کامل | فاز 1-6 پیاده‌سازی شده — Production فعال | diff --git a/overview/OVERVIEW-02-INDEX.md b/overview/OVERVIEW-02-INDEX.md index d98852d..77c1286 100644 --- a/overview/OVERVIEW-02-INDEX.md +++ b/overview/OVERVIEW-02-INDEX.md @@ -4,7 +4,7 @@ > **تاریخ تجمیع:** اسفند ۱۴۰۴ > **تعداد فایل‌های مبدأ:** ۵۳ فایل (~۳۲,۰۰۰ خط) > **تعداد فایل‌های نهایی:** ۲۲ فایل (۱۵ اصلی + ۷ roadmap/business) -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (تحول پکیج‌بیس فاز ۰-۹ + Q24-Q30 + History Interceptor + Rename) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (فاز ۱۰: DataMigration + EF Staging + PackagePurchaseDialog + UI Fixes | NuGet v0.0.189) --- @@ -81,7 +81,7 @@ totalDoc/ |---|------|--------|--------| | R1 | [MAGIC-WALLET-SPEC](../roadmap/MAGIC-WALLET-SPEC.md) | کیف‌پول جادویی — مشخصات | State Machine، ضریب ×2.5، سقف 100M، قوانین، API، مدل داده | | R2 | [MAGIC-WALLET-PLAN](../roadmap/MAGIC-WALLET-PLAN.md) | کیف‌پول جادویی — پلن | ۶ فاز، **فاز 1-6 تکمیل ✅** | -| R3 | [PACKAGE-TRANSFORMATION-TASKS](../roadmap/PACKAGE-TRANSFORMATION-TASKS.md) | تحول پکیج‌بیس — تسک‌ها | ۹ فاز، **فاز 0-9 تکمیل ✅**، تست + deploy در انتظار | +| R3 | [PACKAGE-TRANSFORMATION-TASKS](../roadmap/PACKAGE-TRANSFORMATION-TASKS.md) | تحول پکیج‌بیس — تسک‌ها | ۱۰ فاز، **فاز 0-10 تکمیل ✅**، تست + deploy در انتظار | | R4 | [PACKAGE-TRANSFORMATION-UX](../roadmap/PACKAGE-TRANSFORMATION-UX.md) | تاثیر بر UX | تحلیل تاثیر بر FrontOffice + BackOffice | | R5 | [FEATURE-BACKLOG](../roadmap/FEATURE-BACKLOG.md) | بکلاگ فیچرها | ۱۲ RPC آماده بدون UI، اولویت‌بندی‌شده | | R6 | [BIZ-PACKAGE-BASED-SYSTEM](../business/BIZ-PACKAGE-BASED-SYSTEM.md) | طراحی سیستم پکیج‌بیس | v6، ۳۰ تصمیم (Q1-Q30) + ۵۱ تغییر + ۴۴ سایدافکت | diff --git a/overview/OVERVIEW-03-CHANGELOG.md b/overview/OVERVIEW-03-CHANGELOG.md index 952a4c9..94765f7 100644 --- a/overview/OVERVIEW-03-CHANGELOG.md +++ b/overview/OVERVIEW-03-CHANGELOG.md @@ -1,7 +1,7 @@ # 📜 تاریخچه کارهای انجام‌شده > **همه فعالیت‌های پروژه به صورت بولت با توضیح یک‌خطی و درصد تکمیل** -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: فاز ۹ — Q24-Q30 + Rename + History Interceptor + Migration | NuGet v0.0.188) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: فاز ۱۰ — DataMigration + EF Staging + PackagePurchaseDialog + UI Fixes | NuGet v0.0.189) --- @@ -10,12 +10,12 @@ | حوزه | تعداد آیتم | تکمیل‌شده | درصد کل | |------|-----------|----------|---------| | **BackOffice** | 67 | 67 | **100%** | -| **FrontOffice** | 47 | 47 | **100%** | +| **FrontOffice** | 54 | 54 | **100%** | | **CMS Core** | 82 | 82 | **100%** | -| **Package-Based System** | 45 | 45 | **100%** | +| **Package-Based System** | 52 | 52 | **100%** | | **Deployment** | 22 | 21 | **95%** | -| **Migration** | 16 | 16 | **100%** | -| **مجموع** | **279** | **278** | **99%** | +| **Migration** | 21 | 21 | **100%** | +| **مجموع** | **298** | **297** | **99%** | --- @@ -114,6 +114,21 @@ - ✅ NuGet bump 0.0.182 → 0.0.186 + local feed source - ✅ فیکس GwUrl پروداکشن — تصحیح از cms.kbs1.ir به cms.kbs2.ir +### Phase 10a: PackagePurchaseDialog — دیالوگ داینامیک خرید پکیج (اسفند ۱۴۰۴) +- ✅ `PackagePurchaseDialog.razor` — دیالوگ ۲ مرحله‌ای: مرحله ۱ = کاشی‌های پکیج (responsive grid)، مرحله ۲ = انتخاب روش پرداخت +- ✅ حذف دیالوگ inline خرید «پکیج پایه» از `Index.razor` — جایگزین با دیالوگ داینامیک +- ✅ بارگذاری پکیج‌ها از `PackageService.GetAllPackagesAsync()` — نمایش عنوان + قیمت + ویژگی‌ها +- ✅ پشتیبانی از ۲ روش پرداخت: مستقیم (درگاه بانکی) + اعتبار دایا (فقط پکیج پایه + دور اول) +- ✅ CSS کلاس‌های جدید: `.pkg-tile`, `.pkg-tile-badge`, `.pkg-payment-option` +- ✅ کامیت: `a3681a8` (FO) + +### Phase 10b: ۴ فیکس UI پکیج (اسفند ۱۴۰۴) +- ✅ فیکس Toman/Rial — قیمت از سرور به ریال می‌رسد، `FormattedPrice` حالا `Price / 10` می‌کند برای نمایش صحیح تومان +- ✅ تغییر لیبل «ضریب تخفیف» → «ضریب اعتبار» در دیالوگ خرید + صفحه لیست پکیج‌ها +- ✅ دکمه بازگشت در مرحله انتخاب روش پرداخت — `MudIconButton ArrowForward` + `BackToList()` (قبلاً وجود داشت، تأیید شد) +- ✅ رندر HTML در توضیحات پکیج — `@((MarkupString)pkg.Description)` بجای متن ساده +- ✅ کامیت: `3c1a8ff` (FO) + ### محتوا و ناوبری - ✅ بلاگ — لیست + جزئیات + pagination - ✅ صفحات سایت — About, Contact, FAQ, Terms, Privacy, Licenses @@ -219,6 +234,21 @@ - ✅ Proto Package Unification — یک package مشترک - ✅ Binary Tree Reconstruction — از سیستم قدیم +### DataMigration Tool (اسفند ۱۴۰۴) +- ✅ ابزار مستقل مهاجرت داده — .NET 9 Console + Dapper + Polly + Serilog +- ✅ Smart Retry Policy — فقط خطاهای transient SQL (deadlock, timeout, transport) — نه خطاهای منطقی +- ✅ FK Disable/Enable — `NOCHECK`/`CHECK` حول مهاجرت برای حل FK violation +- ✅ TruncateTargetTables — حل مشکل duplicate key (IX_ClubMembership_UserId) +- ✅ Fallback Table Name — اگر جدول مقصد rename شده (`UserWalletChangeLogs` → `UserWalletHistories`) +- ✅ PostMigration SQL — همه مراحل با `IF COL_LENGTH` / `OBJECT_ID` guard شده +- ✅ کامیت‌ها: `0e8c6fd` → `8385c90` → `31cc464` + +### EF Migration — Staging (اسفند ۱۴۰۴) +- ✅ اعمال migrations روی DB استیجینگ KBS (`185.252.31.42,2019/KBS`) — موفق +- ✅ اعمال migrations روی DB اپلیکیشن (`194.5.195.53,31433/Foursat`) — موفق +- ✅ آخرین migration: `20260227024734_Q27_HistoryTables_And_RenameWalletHistory` (۵۵ migration مجموع) +- ✅ حل خطای لاگین `Invalid column name 'FirstActivationDate'` — دو DB مختلف بودند + --- ## ۶. مستندات (100% کامل) @@ -347,6 +377,39 @@ - ✅ EF Migration `Q27_HistoryTables_And_RenameWalletHistory` — **RenameTable** (حفظ داده) + rename PK/FK/Index via sp_rename - ✅ NuGet: `0.0.187` → `0.0.188` +### Phase 10 — استقرار + DataMigration + UI خرید پکیج ✅ + +#### 10a: DataMigration Tool ✅ (Local — بدون remote) +- ✅ ابزار مستقل مهاجرت داده — .NET 9 Console app + Dapper (bulk copy) + Polly (retry) + Serilog (logging) +- ✅ مهاجرت ۱۸ جدول از DB پروداکشن (`185.252.31.42,2019/Foursat`) به استیجینگ (`KBS`) +- ✅ Smart Retry — فقط خطاهای transient (deadlock/timeout/transport)، نه خطاهای منطقی +- ✅ FK Disable/Enable — `ALTER TABLE NOCHECK/CHECK CONSTRAINT` حول هر مهاجرت +- ✅ TruncateTargetTables — حل duplicate key (`IX_ClubMembership_UserId`) هنگام اجرای مجدد +- ✅ Fallback Table Name — جدول مقصد rename شده؟ (`UserWalletChangeLogs` → `UserWalletHistories`) +- ✅ PostMigration SQL — همه مراحل با `IF COL_LENGTH`/`OBJECT_ID` guard شده (سازگار با هر دو schema) +- ✅ کامیت‌ها: `0e8c6fd` → `8385c90` (MERGE fix) → `31cc464` (FK+truncate+PostMigration) + +#### 10b: EF Migration Staging ✅ +- ✅ اعمال ۵۵ migration روی DB استیجینگ KBS (`185.252.31.42,2019;Database=KBS`) +- ✅ اعمال ۵۵ migration روی DB اپلیکیشن (`194.5.195.53,31433;Database=Foursat`) +- ✅ آخرین migration: `20260227024734_Q27_HistoryTables_And_RenameWalletHistory` +- ✅ حل خطای لاگین: `Invalid column name 'FirstActivationDate'` — CMS به DB دیگری وصل بود + +#### 10c: PackagePurchaseDialog — دیالوگ داینامیک خرید (FO:`a3681a8`) +- ✅ `PackagePurchaseDialog.razor` — دیالوگ ۲ مرحله‌ای جایگزین دیالوگ hardcoded «پکیج پایه» +- ✅ مرحله ۱: نمایش کاشی‌های پکیج (responsive grid 2-3 ستونه) با عنوان + قیمت + ویژگی‌ها + badge «پایه» +- ✅ مرحله ۲: انتخاب روش پرداخت (مستقیم + اعتبار دایا) با خلاصه پکیج انتخابی +- ✅ بارگذاری از `PackageService.GetAllPackagesAsync()` + `PackagePurchaseResult` record +- ✅ محدودیت دایا: فقط `SupportsDayaPurchase && PurchaseCycleCount == 0` +- ✅ CSS: `.pkg-tile`, `.pkg-tile-badge`, `.pkg-payment-option` در `site.css` +- ✅ NuGet: `0.0.188` → `0.0.189` + +#### 10d: ۴ فیکس UI پکیج (FO:`3c1a8ff`) +- ✅ **Toman/Rial**: قیمت از سرور به ریال ← `FormattedPrice` حالا `Price / 10` برای نمایش صحیح تومان +- ✅ **لیبل**: «ضریب تخفیف» → «ضریب اعتبار» (دیالوگ + صفحه لیست پکیج‌ها) +- ✅ **دکمه بازگشت**: وجود داشت (`ArrowForward` + `BackToList`) — تأیید عملکرد +- ✅ **HTML Description**: `@((MarkupString)pkg.Description)` بجای متن ساده + --- ## ۸. Timeline (جدول زمانی) @@ -367,3 +430,4 @@ | اسفند ۱۴۰۴ (هفته ۴) | 📦 تحول پکیج‌بیس فاز ۰-۶ (Domain → Migration → Business → Package → CRUD → Commission per-pkg → Deprecation) | 97% | | اسفند ۱۴۰۴ (هفته ۵) | 📦 فاز 8e: گزارش‌های پورسانت per-package (Proto + CMS + BO + FO) | 98% | | اسفند ۱۴۰۴ (هفته ۶) | 📦 فاز ۹: Q24-Q30 (آستانه + SP Worker + History Tables + UI Guidance + Rename + Interceptor + Migration) | 99% | +| اسفند ۱۴۰۴ (هفته ۷) | 📦 فاز ۱۰: DataMigration Tool + EF Staging + PackagePurchaseDialog + UI Fixes (Toman/Rial + لیبل + HTML) | 99.5% | diff --git a/overview/OVERVIEW-05-ROADMAP.md b/overview/OVERVIEW-05-ROADMAP.md index b1aaa49..f2debea 100644 --- a/overview/OVERVIEW-05-ROADMAP.md +++ b/overview/OVERVIEW-05-ROADMAP.md @@ -1,7 +1,7 @@ # 🗺️ نقشه راه، ریسک‌ها و کارهای باقیمانده > **Roadmap + Risk Register + Dependencies + Priorities** -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: تحول پکیج‌بیس فاز ۰-۶ + per-package commission + deprecation cleanup) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: فاز ۱۰ — DataMigration + EF Staging + PackagePurchaseDialog + UI Fixes) --- @@ -15,8 +15,8 @@ Club System ████████████████████ E-Commerce ████████████████████████████████████████████████ 98% Payment ████████████████████████████████████████████████ 97% Magic Wallet ████████████████████████████████████████████████ 100% -Package-Based ██████████████████████████████████████████████░░ 93% -UI/UX █████████████████████████████████████████████░░░ 93% +Package-Based ███████████████████████████████████████████████░░ 97% +UI/UX ██████████████████████████████████████████████░░░ 95% Deployment ██████████████████████████████████████████████░░ 95% Documentation ████████████████████████████████████████████████ 100% ``` @@ -209,11 +209,12 @@ DONE (اسفند ۱۴۰۴): → مرج پروداکشن هر ۳ ریپو (CMS + FO + BO) ✅ → اجرای Migration روی پروداکشن ✅ → 📦 تحول پکیج‌بیس فاز 0-6 ✅ (Domain → Migration → Business → Package → CRUD → Commission per-pkg → Deprecation) + → 📦 فاز ۹: Q24-Q30 + History + Rename + Interceptor ✅ + → 📦 فاز ۱۰: DataMigration Tool + EF Staging + PackagePurchaseDialog + UI Fixes ✅ NOW (این ماه): - → 📦 فاز 7: UI (کاشی‌های داینامیک + فیلتر پکیج + MyPackages) - → EF Migration نهایی → تست کامل پروداکشن + → فیکس باگ‌های کشف‌شده در تست NEXT (فروردین): → Mobile Responsive (H2) diff --git a/roadmap/PACKAGE-TRANSFORMATION-TASKS.md b/roadmap/PACKAGE-TRANSFORMATION-TASKS.md index 32e7212..7c28227 100644 --- a/roadmap/PACKAGE-TRANSFORMATION-TASKS.md +++ b/roadmap/PACKAGE-TRANSFORMATION-TASKS.md @@ -1,6 +1,6 @@ # 🔄 نقشه‌راه تحول پکیج‌بیس — تسک‌های گام‌به‌گام -> **وضعیت:** در حال اجرا — **فاز ۰-۹ (تکمیل کد) ✅** | NuGet v0.0.188 | تست باقی‌مانده +> **وضعیت:** در حال اجرا — **فاز ۰-۱۰ (تکمیل کد + استقرار staging) ✅** | NuGet v0.0.189 | تست باقی‌مانده > **تاریخ:** ۱۴۰۴/۱۲/۰۸ > **پیش‌نیاز:** [BIZ-PACKAGE-BASED-SYSTEM.md](../business/BIZ-PACKAGE-BASED-SYSTEM.md) **v6** (تکمیل Q24-Q30 + History + Rename) > **هدف:** شکستن **۴۸+ تغییر** به تسک‌های اتمیک با ترتیب اجرا و وابستگی‌ها @@ -41,9 +41,14 @@ ├─→ 9b: Q27 History entities ✅ CMS:`fdbb91d` ├─→ 9c: Q28 UI Guidance ✅ FO:`474d364` BO:`6939780` └─→ 9d: Rename+Interceptor+Mig ✅ CMS:`10d2ca2` - └─→ مرحله ۵: تست + استقرار (۳ روز) ⬜ + └─→ مرحله ۱۰: استقرار + DataMigration + UI + ├─→ 10a: DataMigration Tool ✅ Local: `0e8c6fd`→`31cc464` + ├─→ 10b: EF Staging Migrations ✅ + ├─→ 10c: PackagePurchaseDialog ✅ FO:`a3681a8` + └─→ 10d: UI Fixes (Rial/Toman+لیبل+HTML) ✅ FO:`3c1a8ff` + └─→ مرحله ۵: تست + نهایی ⬜ -مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۹→۵ = ~۲۰ روز | انجام‌شده: ۰→9d (~۱۸ روز) +مسیر بحرانی: ۰→۱→۱.۵→۲→۳→۴→UI→۹→۱۰→۵ = ~۲۲ روز | انجام‌شده: ۰→10d (~۲۰ روز) ``` --- diff --git a/technical/TECH-02-BACKOFFICE-FRONTOFFICE.md b/technical/TECH-02-BACKOFFICE-FRONTOFFICE.md index dcb7484..8f0db9a 100644 --- a/technical/TECH-02-BACKOFFICE-FRONTOFFICE.md +++ b/technical/TECH-02-BACKOFFICE-FRONTOFFICE.md @@ -1,7 +1,7 @@ # 🖥️ BackOffice و FrontOffice — معماری UI > **منابع ادغام‌شده:** `BACKOFFICE-ARCHITECTURE.md`, `BACKOFFICE-STORE-UNIFICATION.md`, `UI-MODERNIZATION-PLAN.md`, `UI-UNIFICATION-PLAN.md`, `PHASE-1-COMPLETE.md`, `PHASE-3-COMPLETE.md`, `PRODUCT-IMAGES-SQUARE.md` -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: UserAutoComplete + فعال‌سازی درگاه) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: PackagePurchaseDialog + UI Fixes + Toman/Rial) --- @@ -134,6 +134,7 @@ FrontOffice/src/FrontOffice/ └── Shared/ ├── AppImage.razor ├── ProductCard.razor ← مشترک بین Store و DiscountStore + ├── PackagePurchaseDialog.razor ← دیالوگ ۲-مرحله‌ای خرید پکیج (NEW) └── LoadMoreButton.razor ``` @@ -263,6 +264,8 @@ if (user.Identity?.IsAuthenticated == true) { | UserAutoComplete کامپوننت | ✅ | 100% | | نمایش نام کاربر در Wallet | ✅ | 100% | | فعال‌سازی دکمه‌های درگاه | ✅ | 100% | +| PackagePurchaseDialog | ✅ | 100% | +| Toman/Rial فیکس نمایش قیمت | ✅ | 100% | | Mobile Responsive (Phase 7) | ⬜ | 0% | | Dark Mode | ⬜ | 0% | | PWA | ⬜ | 0% | diff --git a/technical/TECH-04-MIGRATION.md b/technical/TECH-04-MIGRATION.md index 538efd7..c3c84e3 100644 --- a/technical/TECH-04-MIGRATION.md +++ b/technical/TECH-04-MIGRATION.md @@ -1,7 +1,7 @@ # 🔄 مهاجرت داده، BFF و Gateway > **منابع ادغام‌شده:** `BACKOFFICE-BFF-MIGRATION.md`, `customer-facing-capabilities-codex.md`, `DATA-TABLE-MAPPINGS.md`, `DATAMIGRATION-README.md`, `FRONTOFFICE-TO-CMS-MIGRATION.md`, `GATEWAY-REMOVAL-MIGRATION-PLAN.md`, `MIGRATION-PROGRESS.md` -> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: Migration پروداکشن) +> **آخرین بروزرسانی:** اسفند ۱۴۰۴ (بروزرسانی: DataMigration Tool + EF Staging Migrations) --- @@ -136,15 +136,15 @@ Proto-generated classes مستقیم در UI استفاده می‌شوند ``` DataMigration/ -├── FourSat.DataMigration/ ← Console app -│ ├── Program.cs -│ ├── Migrators/ -│ │ ├── UserMigrator.cs -│ │ ├── ProductMigrator.cs -│ │ ├── OrderMigrator.cs -│ │ └── ClubMigrator.cs +├── FourSat.DataMigration/ ← Console app (.NET 9 + Dapper + Polly + Serilog) +│ ├── Program.cs ← Entry point +│ ├── appsettings.json ← Source/Target connection strings + TruncateTargetTables +│ ├── Services/ +│ │ └── MigrationService.cs ← Smart retry, FK disable/enable, fallback table names +│ ├── Scripts/ +│ │ └── PostMigration_DataTransformation.sql ← Guardشده با IF COL_LENGTH/OBJECT_ID │ └── Mappings/ -│ └── TableMappings.cs +│ └── TableMappings.cs ← Source → Target table/column mappings └── FourSat.GeographySeeder/ ← Seed geography data ├── Program.cs └── Data/ @@ -152,6 +152,21 @@ DataMigration/ └── cities.json ``` +### ۵.۱.۱ ویژگی‌های DataMigration Tool (اسفند ۱۴۰۴) + +| ویژگی | توضیح | +|--------|--------| +| **Smart Retry** | فقط خطاهای transient SQL (deadlock, timeout, transport) — نه خطاهای منطقی | +| **FK Disable/Enable** | `ALTER TABLE NOCHECK/CHECK CONSTRAINT ALL` حول هر مهاجرت | +| **TruncateTargetTables** | حل duplicate key (`IX_ClubMembership_UserId`) هنگام re-run | +| **Fallback Table Name** | اگر جدول rename شده (`UserWalletChangeLogs` → `UserWalletHistories`) | +| **PostMigration Guards** | همه مراحل با `IF COL_LENGTH`/`OBJECT_ID` برای سازگاری با هر دو schema | +| **Polly Retry** | exponential backoff (2s, 8s, 32s) + لاگ structured | +| **Serilog** | لاگ فایل + کنسول با جزئیات هر جدول | + +> **کامیت‌ها:** `0e8c6fd` → `8385c90` (MERGE fix) → `31cc464` (FK+truncate+PostMigration) +> **وضعیت:** Local only — بدون remote (در workspace `DataMigration/` قرار دارد) + ### ۵.۲ Data Table Mappings | جدول مبدأ (قدیم) | جدول مقصد (CMS) | نکات | @@ -178,14 +193,17 @@ DataMigration/ | `populate-weekly-commission-pools.sql` | داده تاریخی Pool | | `update_products_price_10_percent.sql` | افزایش قیمت ۱۰% | -### ۵.۴ Migrationهای EF Core اجراشده روی Production (اسفند ۱۴۰۴) +### ۵.۴ Migrationهای EF Core اجراشده روی Production/Staging (اسفند ۱۴۰۴) | Migration | توضیح | DB | -|-----------|--------|----| +|-----------|--------|----|| | `ExpandDiscountProductFullInformation` | گسترش فیلدهای محصول تخفیفی | KBS (Production `45.149.79.127`) | | `AddMagicWalletFields` (u21) | فیلدهای کیف‌پول جادویی + ClubMembershipCycle | KBS (Production) | +| ۵۵ migration کامل | از Initial تا `Q27_HistoryTables_And_RenameWalletHistory` | KBS Staging (`185.252.31.42,2019/KBS`) | +| ۵۵ migration کامل | از Initial تا `Q27_HistoryTables_And_RenameWalletHistory` | App DB (`194.5.195.53,31433/Foursat`) | -> ⚠️ نکته: Migration `u21` در زمان merge تکراری بود (timestampهای `20260222155925` و `20260222160755`). فایل تکراری حذف شد. +> ✅ **نکته:** CMS به ۲ DB مختلف وصل می‌شود — هر دو باید migrate شوند. +> ✅ Migration `u21` در زمان merge تکراری بود — فایل تکراری حذف شد. --- @@ -236,3 +254,5 @@ FourSat.GeographySeeder: | Geography Seeder | ✅ | 100% | | Proto package unification | ✅ | 100% | | EF Migration پروداکشن | ✅ | 100% | +| DataMigration Tool (Prod→Staging) | ✅ | 100% | +| EF Migration استیجینگ (KBS + Foursat) | ✅ | 100% |