# وضعیت Refactoring سیستم انبارداری (Inventory)

**تاریخ:** ۳ ژانویه ۲۰۲۶  
**وضعیت:** ✅ تکمیل شده - Build موفق

---

## 📊 وضعیت Build

| پروژه | وضعیت |
|-------|--------|
| CMSMicroservice.Domain | ✅ OK |
| CMSMicroservice.Application | ✅ OK |
| CMSMicroservice.Infrastructure | ✅ OK |
| CMSMicroservice.WebApi | ✅ OK |

---

## ✅ کارهای انجام شده

### 1. حذف Repository Pattern
فایل‌های حذف شده:
- `Application/Common/Interfaces/Repositories/IInventoryItemRepository.cs`
- `Application/Common/Interfaces/Repositories/IStockMovementRepository.cs`
- `Application/Common/Interfaces/Repositories/IWarehouseRepository.cs`
- `Infrastructure/Persistence/Repositories/InventoryItemRepository.cs`
- `Infrastructure/Persistence/Repositories/StockMovementRepository.cs`
- `Infrastructure/Persistence/Repositories/WarehouseRepository.cs`

### 2. حذف Features قدیمی
فولدر حذف شده:
- `Application/Features/` (کل فولدر)

### 3. ایجاد ساختار CQ جدید

#### WarehouseCQ/
```
WarehouseCQ/
├── Commands/
│   ├── CreateWarehouse/
│   ├── UpdateWarehouse/
│   ├── DeleteWarehouse/
│   └── SetDefaultWarehouse/
└── Queries/
    ├── GetWarehouse/
    ├── GetAllWarehouses/
    └── SearchWarehouses/
```

#### InventoryItemCQ/
```
InventoryItemCQ/
├── Commands/
│   ├── CreateInventoryItem/
│   ├── UpdateInventoryItem/
│   ├── DeleteInventoryItem/
│   ├── UpdateInventoryQuantity/
│   ├── ReserveInventory/
│   ├── ReleaseReservedInventory/
│   ├── ReduceInventory/
│   └── IncreaseInventory/
└── Queries/
    ├── GetInventoryItem/
    ├── GetInventoryByProduct/
    ├── GetAllInventoryItems/
    └── GetLowStockItems/
```

#### StockMovementCQ/
```
StockMovementCQ/
├── Commands/
│   └── CreateStockMovement/
└── Queries/
    ├── GetStockMovements/
    └── GetStockMovementsByInventoryItem/
```

### 4. Fix شدن InventoryProfile.cs
- اصلاح enum names: `ProtoProductType.Unspecified` بجای `ProductTypeUnspecified`
- حذف `new Int64Value` - Proto مستقیم `long?` میگیره
- اصلاح expression tree برای `?.` operator

### 5. ساده‌سازی InventoryService.cs
- متدهای اصلی (Warehouse, Query ها) کامل پیاده‌سازی شدن
- متدهای پیچیده که نیاز به lookup دارن فعلاً TODO هستن

---

## ⚠️ متدهای TODO در InventoryService

این متدها نیاز به پیاده‌سازی دارن (وقتی لازم شد):

| متد | دلیل TODO |
|-----|-----------|
| `AddStock` | نیاز به lookup با ProductId/ProductType |
| `AdjustStock` | نیاز به lookup با ProductId/ProductType |
| `ReserveStock` | نیاز به lookup با ProductId/ProductType |
| `ReleaseReservation` | نیاز به lookup با ProductId/ProductType |
| `ConfirmSale` | نیاز به lookup با ProductId/ProductType |
| `ProcessReturn` | نیاز به lookup با ProductId/ProductType |
| `RecordLoss` | نیاز به lookup با ProductId/ProductType |
| `BulkAddStock` | نیاز به loop و lookup |
| `BulkAdjustStock` | نیاز به loop و lookup |
| `GetInventorySummary` | نیاز به Query جدید |
| `GetStockValueReport` | نیاز به Query جدید |

---

## 🎯 درس‌های آموخته شده

1. **همیشه اول Proto رو بررسی کن** - Proto مرجع اصلی API هست
2. **ساختار موجود رو تحلیل کن** - قبل از ساختن فایل جدید، نمونه‌های موجود رو ببین
3. **Mapping از Proto به Command** - نه برعکس!
4. **IApplicationDbContext** - الگوی استاندارد این پروژه برای دسترسی به DB
5. **بدون Repository** - این پروژه از Repository pattern استفاده نمیکنه
6. **Proto enum names** - نام‌ها در C# متفاوت هستن (مثلاً `Unspecified` بجای `PRODUCT_TYPE_UNSPECIFIED`)
7. **Int64Value در Proto** - در C# به `long?` تبدیل میشه، نیازی به `new Int64Value` نیست

---

## 🔄 همگام‌سازی BFF با CMS (۳ ژانویه ۲۰۲۶)

### تغییرات Proto
BackOffice.BFF.Inventory.Protobuf با CMS همگام شد:

| آیتم | قبل | بعد |
|------|-----|-----|
| ProductType enum | `REGULAR`, `DISCOUNT` | `REGULAR_PRODUCT`, `DISCOUNT_PRODUCT` |
| StockMovementType | Sequential (0-9) | Grouped (10, 20, 30, 40, 50) |
| Pagination | `page_index` | `page` |
| Search | `search_term` | `search` |
| Product name | `product_name` | `product_title` |

### فایل‌های آپدیت شده در BFF

**Commands:**
- `AddStock` - حذف Success, Message از Response
- `AdjustStock` - Note→Reason, +ReferenceNumber
- `RecordLoss` - Note→Reason, +ReferenceNumber
- `UpdateInventorySettings` - InventoryItemId→Id

**Queries:**
- `GetAllInventoryItems` - PageIndex→Page, SearchTerm→Search, +ProductPrice
- `GetStockMovements` - PageIndex→Page, +ProductTitle, +Created
- `GetLowStockItems` - حذف Count، استفاده از Page/PageSize
- `GetAllWarehouses` - ActiveOnly→IsActive, +Created, +LastModified

**Mappings:**
- `InventoryProfile.cs` - بازنویسی کامل برای فیلدهای جدید

### وضعیت Build BFF
```
Build succeeded.
    0 Warning(s)
    0 Error(s)
```

---

## 📊 پوشش API - مقایسه CMS و BFF

| عملیات | CMS | BFF | یادداشت |
|--------|-----|-----|---------|
| GetAllInventoryItems | ✅ | ✅ | همگام |
| GetInventoryItem | ✅ | ✅ | همگام |
| GetLowStockItems | ✅ | ✅ | همگام |
| GetStockMovements | ✅ | ✅ | همگام |
| GetAllWarehouses | ✅ | ✅ | همگام |
| AddStock | ✅ | ✅ | همگام |
| AdjustStock | ✅ | ✅ | همگام |
| RecordLoss | ✅ | ✅ | همگام |
| CreateWarehouse | ✅ | ✅ | همگام |
| UpdateWarehouse | ✅ | ❌ | نیاز به پیاده‌سازی |
| UpdateInventorySettings | ✅ | ✅ | همگام |
| GetInventorySummary | TODO | ❌ | اولویت بالا |
| GetStockValueReport | TODO | ❌ | اولویت بالا |
| ProcessReturn | TODO | ❌ | اولویت متوسط |

---

## 📝 نتیجه‌گیری

✅ **Refactoring با موفقیت تکمیل شد!**

- Application layer با ساختار `*CQ/Commands/[Action]/` سازگار شد
- Repository pattern کاملاً حذف شد
- WebApi layer با Proto سازگار شد
- Build همه پروژه‌ها موفق هست
- **BFF کاملاً با CMS همگام شد (۳ ژانویه ۲۰۲۶)**
