# 📝 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 ✅