# 📝 Changelog - ۲۸ آذر ۱۴۰۴ (18 December 2025)

> **Session**: بهبودات FrontOffice، مدیریت موجودی، ClubFeatures

---

## 🛒 سیستم مدیریت موجودی محصولات

### CMS - SubmitShopBuyOrderCommandHandler
**فایل**: `CMSMicroservice.Application/UserOrderCQ/Commands/SubmitShopBuyOrder/SubmitShopBuyOrderCommandHandler.cs`

#### تغییرات:
1. **چک موجودی قبل از خرید**:
   - اگر محصول ناموجود شده (`RemainingCount <= 0`) → خطا
   - اگر تعداد درخواستی > موجودی → خطا با جزئیات

2. **کاهش موجودی بعد از پرداخت موفق**:
   ```csharp
   foreach (var cartItem in user.UserCarts)
   {
       cartItem.Product.RemainingCount -= cartItem.Count;
       cartItem.Product.SaleCount += cartItem.Count;
   }
   ```

3. **پیام‌های خطای فارسی**:
   - `"محصولات زیر ناموجود شده‌اند: [لیست]"`
   - `"موجودی محصولات زیر کافی نیست: «نام»: درخواست X عدد، موجودی Y عدد"`

### FrontOffice - ProductDetail
**فایل‌ها**:
- `Pages/Store/ProductDetail.razor`
- `Pages/Store/ProductDetail.razor.cs`

#### تغییرات:
1. **MaxQty داینامیک**: از عدد ثابت 20 به `_product.RemainingCount`
2. **پراپرتی IsInStock**: `_product.RemainingCount > 0`
3. **UI موجودی**:
   - Chip سبز: "موجود در انبار (X عدد)"
   - Chip قرمز: "ناموجود"
4. **غیرفعال کردن دکمه**: وقتی محصول ناموجود

---

## 🎖️ ویژگی‌های باشگاه مشتریان (ClubFeatures)

### معماری اصلاح‌شده
- **ClubFeature** (جدول قالب): `Title`, `Description`, `DetailedDescriptionHtml`, `Icon`, `Color`, `IsActive`, `RequiredPoints`, `SortOrder`
- **UserClubFeature** (junction table): `UserId`, `ClubMembershipId`, `ClubFeatureId`, `IsActive`, `GrantedAt`, `Notes`

### فایل‌های اصلاح‌شده:

#### CMS:
- `UserClubFeatureDto.cs`: حذف `DetailedDescriptionHtml`, `Icon`, `Color`
- `clubmembership.proto`: حذف فیلدهای 7,8,9 از `UserClubFeatureModel`
- `ClubFeatureProfile.cs`: حذف mapping های اضافی

#### BFF:
- `GetClubFeaturesQueryHandler.cs`: حذف mapping های حذف‌شده
- `GetClubFeaturesResponseDto.cs`: حذف فیلدها از `ClubFeatureItemDto`
- `configuration.proto`: حذف `detailed_description_html`, `icon`, `color` از `ClubFeatureModel`
- `ConfigurationProfile.cs`: حذف mapping های اضافی

#### FrontOffice:
- `ClubConfigurationService.cs`: حذف فیلدها از `ClubFeatureDto` و mapping
- `FeaturesPage.razor`: 
  - استفاده از آیکون ثابت `Star`
  - حذف متد `GetMudIcon`
  - تغییر جدول به `MudList` ساده
  - نمایش `Notes` در مدال جزئیات

### MembershipPage - مزایای عضویت
**فایل**: `Pages/Club/MembershipPage.razor`

مزایای جدید:
1. ✅ شارژ ۵۶ میلیون تومان کیف پول فروشگاه تخفیفی
2. ✅ عضویت در شبکه بازاریابی و دریافت پورسانت
3. ✅ امکان جذب زیرمجموعه و گسترش شبکه

---

## 📍 مدال آدرس‌ها

### رفع باگ‌ها:

#### 1. خطای Snackbar تکراری
**مشکل**: `CS0102: already contains a definition for 'Snackbar'`
**علت**: `ISnackbar` در `_Imports.razor` به صورت global inject شده بود
**حل**: حذف `[Inject] private ISnackbar Snackbar` از code-behind

**فایل‌های اصلاح‌شده**:
- `AddAddressDialog.razor.cs`
- `EditAddressDialog.razor.cs`

#### 2. خطای NullReferenceException
**مشکل**: `Object reference not set to an instance of an object`
**علت**: `dialog.Result` می‌تواند `null` باشد
**حل**: اضافه کردن null check

```csharp
// قبل
if (!result.Canceled)

// بعد
if (result is not null && !result.Canceled)
```

**فایل**: `Addresses.razor.cs`

---

## 💰 VAT Service

### تغییرات:
- **نرخ پیش‌فرض**: 9.99% (برای تشخیص داده سرور از local)
- **استفاده در CheckoutSummary**: `VAT.IsEnabled`, `VAT.VatPercentage`, `VAT.AddVAT()`
- **کلید جدید**: `VAT_PERCENTAGE_KEY` در LocalStorage

---

## 🛒 CartService Authentication

### تغییرات:
- **EnsureInitializedAsync()**: متد جدید برای lazy loading
- **IsAuthenticatedAsync()**: چک توکن در LocalStorage
- **عدم لود برای unauthenticated**: سبد خرید فقط برای کاربران لاگین‌شده لود می‌شود

### فایل‌های آپدیت‌شده برای فراخوانی EnsureInitialized:
- `MainLayout.razor.cs`
- `Cart.razor.cs`
- `Products.razor.cs`
- `ProductDetail.razor.cs`
- `CheckoutSummary.razor.cs`

---

## 📊 خلاصه فایل‌های تغییر یافته

### CMS (5 فایل):
1. `SubmitShopBuyOrderCommandHandler.cs` - چک و کاهش موجودی
2. `UserClubFeatureDto.cs` - حذف فیلدها
3. `clubmembership.proto` - حذف فیلدها
4. `ClubFeatureProfile.cs` - حذف mapping

### BFF (4 فایل):
1. `GetClubFeaturesQueryHandler.cs` - حذف mapping
2. `GetClubFeaturesResponseDto.cs` - حذف فیلدها
3. `configuration.proto` - حذف فیلدها
4. `ConfigurationProfile.cs` - حذف mapping

### FrontOffice (12 فایل):
1. `ProductDetail.razor` - نمایش موجودی
2. `ProductDetail.razor.cs` - MaxQty داینامیک
3. `ClubConfigurationService.cs` - حذف فیلدها
4. `FeaturesPage.razor` - بازطراحی UI
5. `MembershipPage.razor` - مزایای عضویت
6. `AddAddressDialog.razor.cs` - رفع خطای Snackbar
7. `EditAddressDialog.razor.cs` - رفع خطای Snackbar
8. `Addresses.razor.cs` - رفع NullRef
9. `CartService.cs` - Authentication check
10. `VATService.cs` - نرخ 9.99%
11. `CheckoutSummary.razor` - استفاده از VATService
12. `MainLayout.razor.cs` - EnsureInitializedAsync

---

## ✅ وضعیت نهایی
- **Build**: موفق
- **تست دستی**: آدرس‌ها ✅، موجودی محصول ✅، ClubFeatures ✅
