Implement Persian Date Conversion and Enhance User Network Information Service

- 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.
This commit is contained in:
masoodafar-web
2025-12-20 06:15:59 +03:30
parent 13a3489765
commit 002e99f6bf
32 changed files with 10263 additions and 106 deletions
+169
View File
@@ -0,0 +1,169 @@
# 📝 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 ✅