docs: add inventory improvements + product images square docs, update index
This commit is contained in:
@@ -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** | **۱۹۱ فایل حذف/ادغام** |
|
||||
|
||||
@@ -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,7 +1,7 @@
|
||||
# سادهسازی سیستم مدیریت صفحات سایت
|
||||
|
||||
> **تاریخ:** ۱۳۹۶/۱۱/۲۸ (2026-02-17)
|
||||
> **وضعیت:** طرح اولیه — منتظر تأیید
|
||||
> **وضعیت:** ✅ پیادهسازی کامل شده — مرج به production
|
||||
> **اولویت:** بالا
|
||||
|
||||
---
|
||||
|
||||
@@ -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` | ✏️ |
|
||||
Reference in New Issue
Block a user