From 0aa0141cecd662ac1006f0b90b9a152344ec6d1c Mon Sep 17 00:00:00 2001 From: masoodafar-web Date: Wed, 18 Feb 2026 01:05:39 +0330 Subject: [PATCH] docs: add inventory improvements + product images square docs, update index --- INDEX.md | 12 +- cms/INVENTORY-IMPROVEMENTS.md | 144 ++++++++++++++++++++++ cms/SITE-PAGES-SIMPLIFICATION.md | 2 +- ui-modernization/PRODUCT-IMAGES-SQUARE.md | 93 ++++++++++++++ 4 files changed, 247 insertions(+), 4 deletions(-) create mode 100644 cms/INVENTORY-IMPROVEMENTS.md create mode 100644 ui-modernization/PRODUCT-IMAGES-SQUARE.md diff --git a/INDEX.md b/INDEX.md index 9b5a3db..7bef203 100644 --- a/INDEX.md +++ b/INDEX.md @@ -1,8 +1,8 @@ # 📚 FourSat Documentation Index -> آخرین بروزرسانی: February 17, 2026 +> آخرین بروزرسانی: February 18, 2026 > ۲۲۰ فایل → ۳۰ فایل (تجمیع ۳ فازی + cleanup نهایی) -> آخرین تغییرات: فیکس ZarinPal callback، تخفیف ۱۰۰٪ اجباری، VAT checkout، ExpirePendingOrders، فیکس DeliveryStatus mapping، دیپلوی Production، فیکس CI/CD cross-deploy، ساخت appsettings.Production.json هر ۳ پروژه، فیکس K8S_SERVER، فیکس nginx image path +> آخرین تغییرات: بهبود سیستم موجودی، تصاویر مربعی محصولات، ساده‌سازی صفحات سایت، مرج همه به production --- @@ -28,6 +28,8 @@ | **سرور Production کجاست؟** | [`deployment/INFRASTRUCTURE-GUIDE.md`](deployment/INFRASTRUCTURE-GUIDE.md) | | **تنظیمات VAT/مالیات؟** | [`cms/payment-gateway.md`](cms/payment-gateway.md) (بخش ۱۰) | | **سرویس انقضای سفارش؟** | [`cms/payment-gateway.md`](cms/payment-gateway.md) (بخش ۱۱) | +| **بهبود سیستم موجودی؟** | [`cms/INVENTORY-IMPROVEMENTS.md`](cms/INVENTORY-IMPROVEMENTS.md) | +| **تصاویر مربعی محصولات؟** | [`ui-modernization/PRODUCT-IMAGES-SQUARE.md`](ui-modernization/PRODUCT-IMAGES-SQUARE.md) | | **Audit report کامل BackOffice؟** | [`BackOffice/docs/BACKOFFICE-AUDIT.md`](../BackOffice/docs/BACKOFFICE-AUDIT.md) | --- @@ -59,6 +61,8 @@ | [chatika-integration.md](cms/chatika-integration.md) | یکپارچه‌سازی Chatika AI: Hangfire worker، retry logic | | [club-feature-management-services.md](cms/club-feature-management-services.md) | CQRS سرویس‌های مدیریت ClubFeature | | [INVENTORY-REFACTORING-STATUS.md](cms/INVENTORY-REFACTORING-STATUS.md) | ریفکتور Inventory: حذف Repository، ساختار CQ | +| [INVENTORY-IMPROVEMENTS.md](cms/INVENTORY-IMPROVEMENTS.md) | 🆕 بهبود موجودی: ایجاد خودکار رکورد، سرویس مهاجرت، اتوکامپلیت تخفیفی، UX هوشمند AddStockDialog | +| [SITE-PAGES-SIMPLIFICATION.md](cms/SITE-PAGES-SIMPLIFICATION.md) | ✅ ساده‌سازی صفحات سایت: مدل تایپ‌شده، فرم‌های Shopify-style، لندینگ/درباره/تماس/مجوزها | | [system-constants.md](cms/system-constants.md) | مرجع SystemConstants.cs (مبالغ، درصدها) | | [email-sms-configuration.md](cms/email-sms-configuration.md) | تنظیمات SMS/Email: Kavenegar templates، Gmail | | [PRODUCT-BUNDLE-FEATURE.md](cms/PRODUCT-BUNDLE-FEATURE.md) | 🟡 فیچر آینده: طراحی Product Bundle | @@ -83,6 +87,7 @@ | [UI-MODERNIZATION-PLAN.md](ui-modernization/UI-MODERNIZATION-PLAN.md) | 🆕 طرح جامع نوسازی UI فرانت‌آفیس: سیستم بلاگ، صفحات دینامیک، لندینگ، Mobile-First — ۷ فاز، ~۱۲۴ فایل جدید | | [BACKOFFICE-ARCHITECTURE.md](ui-modernization/BACKOFFICE-ARCHITECTURE.md) | 🆕 مرجع معماری BackOffice: ساختار پوشه‌ها، الگوهای BasePageComponent/Hub/CodeBehind/ExcelExport، مسیرها، permission‌ها، نقشه NavMenu | | [BACKOFFICE-STORE-UNIFICATION.md](ui-modernization/BACKOFFICE-STORE-UNIFICATION.md) | 🆕 یکسان‌سازی فروشگاه عادی و تخفیفی: NavMenu restructure، حذف آمار سفارشات، رفع PaymentDate، بازنویسی ۴ صفحه | +| [PRODUCT-IMAGES-SQUARE.md](ui-modernization/PRODUCT-IMAGES-SQUARE.md) | 🆕 تصاویر مربعی محصولات: aspect-ratio 1:1 در ۹ فایل، هر دو فروشگاه، همه سایزها | ## 📂 migration/ — مستندات مهاجرت BFF→CMS (۶ فایل) @@ -111,4 +116,5 @@ | session Store Unification (+2 docs) | **35** | — | | session File Mgmt + Content (+1 doc) | **36** | — | | session Registration Flow Fix (+1 doc) | **37** | — | -| **نهایی** | **37 + INDEX** | **۱۹۱ فایل حذف/ادغام** | +| session Inventory + Images + Docs (+2 docs) | **39** | — | +| **نهایی** | **39 + INDEX** | **۱۹۱ فایل حذف/ادغام** | diff --git a/cms/INVENTORY-IMPROVEMENTS.md b/cms/INVENTORY-IMPROVEMENTS.md new file mode 100644 index 0000000..95101c1 --- /dev/null +++ b/cms/INVENTORY-IMPROVEMENTS.md @@ -0,0 +1,144 @@ +# بهبود سیستم موجودی (Inventory System Improvements) + +> **تاریخ:** اسفند ۱۴۰۴ (February 2026) +> **وضعیت:** ✅ پیاده‌سازی شده — مرج به production +> **پروژه‌های تغییر یافته:** CMS, BackOffice + +--- + +## ۱. خلاصه تغییرات + +| تغییر | پروژه | وضعیت | +|-------|--------|--------| +| ایجاد خودکار رکورد موجودی هنگام ساخت محصول عادی | CMS | ✅ | +| سرویس مهاجرت یکبار‌اجرا برای محصولات بدون رکورد موجودی | CMS | ✅ | +| اتوکامپلیت محصولات تخفیفی | BackOffice | ✅ | +| UX هوشمند دیالوگ ورود کالا | BackOffice | ✅ | + +--- + +## ۲. CMS — ایجاد خودکار رکورد موجودی + +### ۲.۱ مشکل +وقتی محصول جدید عادی ساخته می‌شد، رکورد `InventoryItem` ایجاد نمی‌شد. این باعث می‌شد محصول در بخش موجودی نمایش داده نشود تا ادمین دستی آن را اضافه کند. + +> **نکته:** `CreateDiscountProductCommandHandler` از قبل `IInventoryService.InitializeInventoryAsync` را فراخوانی می‌کرد — فقط handler محصول عادی این قابلیت را نداشت. + +### ۲.۲ تغییر در `CreateNewProductsCommandHandler` + +**فایل:** `CMS/src/CMSMicroservice.Application/ProductsCQ/Commands/CreateNewProducts/CreateNewProductsCommandHandler.cs` + +```csharp +// تزریق IInventoryService +private readonly IInventoryService _inventoryService; + +// بعد از SaveChangesAsync: +try +{ + await _inventoryService.InitializeInventoryAsync(entity.Id, ProductType.RegularProduct, 0); +} +catch (Exception ex) +{ + _logger.LogWarning(ex, "Failed to auto-initialize inventory for product {ProductId}", entity.Id); +} +``` + +- موجودی با `qty=0` ایجاد می‌شود +- خطای موجودی باعث شکست ایجاد محصول نمی‌شود (try/catch) + +--- + +## ۳. CMS — InventoryInitializerService (مهاجرت یکبار‌اجرا) + +### ۳.۱ هدف +محصولات قدیمی (legacy) که قبل از اضافه شدن منطق خودکار ساخته شده بودند، رکورد `InventoryItem` ندارند. این سرویس هنگام استارت اپلیکیشن اجرا شده و برای آن‌ها رکورد ایجاد می‌کند. + +### ۳.۲ پیاده‌سازی + +**فایل:** `CMS/src/CMSMicroservice.Infrastructure/BackgroundServices/InventoryInitializerService.cs` + +``` +BackgroundService (one-time execution on startup) +├── پیدا کردن Products بدون InventoryItem +├── پیدا کردن DiscountProducts بدون InventoryItem +├── ایجاد InventoryItem برای هر کدام (qty = RemainingCount) +└── ذخیره و توقف +``` + +**ثبت در DI:** +```csharp +// ConfigureServices.cs +services.AddHostedService(); +``` + +### ۳.۳ ویژگی‌ها +- **یکبار اجرا:** بعد از اتمام، سرویس متوقف می‌شود +- **موجودی اولیه:** از `RemainingCount` محصول (نه صفر) برای رکوردهای legacy +- **لاگ‌گیری:** تعداد محصولات بدون رکورد و نتیجه عملیات لاگ می‌شود +- **مقاوم در برابر خطا:** خطا باعث شکست اپلیکیشن نمی‌شود + +--- + +## ۴. BackOffice — DiscountProductsAutoComplete + +### ۴.۱ هدف +کامپوننت autocomplete برای جستجوی محصولات تخفیفی (مشابه `ProductsAutoComplete` موجود). + +### ۴.۲ فایل‌ها + +| فایل | توضیح | +|------|-------| +| `Pages/AutoComplete/DiscountProductsAutoComplete.razor` | UI کامپوننت | +| `Pages/AutoComplete/DiscountProductsAutoComplete.razor.cs` | Code-behind | + +### ۴.۳ ویژگی‌ها +- استفاده از `DiscountProductContract.DiscountProductContractClient` (gRPC) +- دِبانس ۷۰۰ms +- حداکثر ۹ نتیجه +- پارامتر خروجی `SelectedProductId` (EventCallback) +- `SearchQuery` از نوع `string` (نه `StringValue`) + +--- + +## ۵. BackOffice — UX هوشمند AddStockDialog + +### ۵.۱ مشکل قبلی +دیالوگ «ورود کالا» یک فیلد عددی خام برای وارد کردن شناسه محصول داشت. ادمین باید شناسه را حفظ بوده یا از جایی کپی می‌کرد. + +### ۵.۲ تغییر + +**فایل:** `BackOffice/src/BackOffice/Pages/Inventory/Components/AddStockDialog.razor` + +``` +وقتی ProductIdParam == null (دکمه «ورود کالا» از نوار ابزار): +├── انتخاب نوع محصول (فروشگاه عادی / فروشگاه اعتباری) +├── if فروشگاه عادی → نمایش ProductsAutoComplete +├── if فروشگاه اعتباری → نمایش DiscountProductsAutoComplete +└── ولیدیشن: محصول باید انتخاب شده باشد + +وقتی ProductIdParam != null (از صفحه محصول): +└── فقط فیلد تعداد نمایش داده می‌شود +``` + +### ۵.۳ UX هوشمند +- انتخاب «فروشگاه عادی» → فقط محصولات عادی در autocomplete +- انتخاب «فروشگاه اعتباری» → فقط محصولات تخفیفی در autocomplete +- جلوگیری از اشتباه ادمین + +--- + +## ۶. خلاصه فایل‌های تغییر یافته + +### CMS +| فایل | نوع تغییر | +|------|-----------| +| `ProductsCQ/Commands/CreateNewProducts/CreateNewProductsCommandHandler.cs` | ✏️ ویرایش | +| `BackgroundServices/InventoryInitializerService.cs` | 🆕 جدید | +| `Infrastructure/ConfigureServices.cs` | ✏️ ویرایش (ثبت سرویس) | + +### BackOffice +| فایل | نوع تغییر | +|------|-----------| +| `Pages/AutoComplete/DiscountProductsAutoComplete.razor` | 🆕 جدید | +| `Pages/AutoComplete/DiscountProductsAutoComplete.razor.cs` | 🆕 جدید | +| `Pages/Inventory/Components/AddStockDialog.razor` | ✏️ ویرایش | diff --git a/cms/SITE-PAGES-SIMPLIFICATION.md b/cms/SITE-PAGES-SIMPLIFICATION.md index 45f58fd..ba08c15 100644 --- a/cms/SITE-PAGES-SIMPLIFICATION.md +++ b/cms/SITE-PAGES-SIMPLIFICATION.md @@ -1,7 +1,7 @@ # ساده‌سازی سیستم مدیریت صفحات سایت > **تاریخ:** ۱۳۹۶/۱۱/۲۸ (2026-02-17) -> **وضعیت:** طرح اولیه — منتظر تأیید +> **وضعیت:** ✅ پیاده‌سازی کامل شده — مرج به production > **اولویت:** بالا --- diff --git a/ui-modernization/PRODUCT-IMAGES-SQUARE.md b/ui-modernization/PRODUCT-IMAGES-SQUARE.md new file mode 100644 index 0000000..22368f7 --- /dev/null +++ b/ui-modernization/PRODUCT-IMAGES-SQUARE.md @@ -0,0 +1,93 @@ +# تصاویر مربعی محصولات (Product Images 1:1 Square Ratio) + +> **تاریخ:** اسفند ۱۴۰۴ (February 2026) +> **وضعیت:** ✅ پیاده‌سازی شده — مرج به production +> **پروژه:** FrontOffice + +--- + +## ۱. خلاصه + +تمامی تصاویر محصولات در سمت مشتری (FrontOffice) در هر دو فروشگاه (عادی و اعتباری) به نسبت **1:1 مربعی** تغییر یافت. + +--- + +## ۲. تغییرات اعمال شده + +### ۲.۱ لیست محصولات (Products Grid) + +| صفحه | تغییر | +|------|-------| +| `Store/Products.razor` | `height:300px` → حذف ارتفاع ثابت کارت | +| | `height:60%` → `aspect-ratio:1/1; width:100%` | +| `DiscountStore/Products.razor` | همان تغییرات | + +**قبل:** +```html + +
+``` + +**بعد:** +```html + +
+``` + +### ۲.۲ جزئیات محصول (Product Detail — Main Image) + +| صفحه | تغییر | +|------|-------| +| `Store/ProductDetail.razor` | `max-height:400px` → `aspect-ratio:1/1` | +| `DiscountStore/ProductDetail.razor` | `ObjectFit.Contain` → `ObjectFit.Cover` + `aspect-ratio:1/1` | + +### ۲.۳ سبد خرید (Cart) + +| صفحه | ویو | تغییر | +|------|-----|-------| +| `Store/Cart.razor` | Desktop (64×64) | `product-thumb` → `rounded-lg` + `ObjectFit.Cover` | +| `Store/Cart.razor` | Mobile (50×50) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | +| `DiscountStore/Cart.razor` | Desktop (64×64) | `product-thumb` → `rounded-lg` + `ObjectFit.Cover` | +| `DiscountStore/Cart.razor` | Mobile (50×50) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | + +### ۲.۴ صفحه پرداخت (Checkout Summary) + +| صفحه | تغییر | +|------|-------| +| `Store/CheckoutSummary.razor` (48×48) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | +| `DiscountStore/Checkout.razor` (40×40) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | + +### ۲.۵ جزئیات سفارش (Order Detail) + +| صفحه | ویو | تغییر | +|------|-----|-------| +| `Store/OrderDetail.razor` | Desktop (60×60) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | +| `Store/OrderDetail.razor` | Mobile (60×60) | `rounded-circle` → `rounded-lg` + `ObjectFit.Cover` | + +--- + +## ۳. خلاصه تکنیکال + +| الگوی قبلی | الگوی جدید | محل | +|------------|------------|------| +| `height: 60%` + `height: 300px` card | `aspect-ratio: 1/1; width: 100%` + no fixed card height | لیست محصولات | +| `max-height: 400px` | `aspect-ratio: 1/1` | جزئیات محصول | +| `ObjectFit.Contain` | `ObjectFit.Cover` | تصاویر اعتباری | +| `Class="rounded-circle"` | `Class="rounded-lg" ObjectFit="ObjectFit.Cover"` | تمام thumbnailها | +| `Class="product-thumb"` | `Class="rounded-lg" ObjectFit="ObjectFit.Cover"` | سبد خرید Desktop | + +--- + +## ۴. فایل‌های تغییر یافته (۹ فایل) + +| فایل | تغییر | +|------|-------| +| `Pages/Store/Products.razor` | ✏️ | +| `Pages/Store/ProductDetail.razor` | ✏️ | +| `Pages/Store/Cart.razor` | ✏️ | +| `Pages/Store/CheckoutSummary.razor` | ✏️ | +| `Pages/Store/OrderDetail.razor` | ✏️ | +| `Pages/DiscountStore/Products.razor` | ✏️ | +| `Pages/DiscountStore/ProductDetail.razor` | ✏️ | +| `Pages/DiscountStore/Cart.razor` | ✏️ | +| `Pages/DiscountStore/Checkout.razor` | ✏️ |