002e99f6bf
- Added PersianDateTimeService for converting Gregorian dates to Persian format in the BackOffice frontend. - Updated multiple frontend pages (Dashboard, UserPayouts, WorkerControl, UserNetworkInfo) to utilize the new Persian date service. - Enhanced GetUserNetworkPositionDto with 28+ new fields for comprehensive user network data. - Updated GetUserNetworkPositionQueryHandler to include new methods for calculating network statistics. - Modified Protobuf messages to accommodate the new fields, increasing from 14 to 42. - Refined week number calculation algorithm to ensure consistency across C# and SQL implementations. - Created new CSV and Excel files for binary plan calculations. - Ensured all changes are tested and validated for accuracy and performance.
170 lines
6.0 KiB
Markdown
170 lines
6.0 KiB
Markdown
# 📝 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 ✅
|