docs: add inventory improvements + product images square docs, update index

This commit is contained in:
masoodafar-web
2026-02-18 01:05:39 +03:30
parent ce74377012
commit 0aa0141cec
4 changed files with 247 additions and 4 deletions
+9 -3
View File
@@ -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** | **۱۹۱ فایل حذف/ادغام** |
+144
View File
@@ -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<InventoryInitializerService>();
```
### ۳.۳ ویژگی‌ها
- **یکبار اجرا:** بعد از اتمام، سرویس متوقف می‌شود
- **موجودی اولیه:** از `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` | ✏️ ویرایش |
+1 -1
View File
@@ -1,7 +1,7 @@
# ساده‌سازی سیستم مدیریت صفحات سایت
> **تاریخ:** ۱۳۹۶/۱۱/۲۸ (2026-02-17)
> **وضعیت:** طرح اولیه — منتظر تأیید
> **وضعیت:** ✅ پیاده‌سازی کامل شده — مرج به production
> **اولویت:** بالا
---
+93
View File
@@ -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
<MudCard Style="cursor:pointer;height: 300px">
<div style="height: 60%; background-image: url(...)">
```
**بعد:**
```html
<MudCard Style="cursor:pointer;">
<div style="aspect-ratio:1/1; width:100%; background-image: url(...)">
```
### ۲.۲ جزئیات محصول (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` | ✏️ |