- 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.
6.9 KiB
CHANGELOG - Club Membership Auto-Features
Date: 2025-12-09
Version: 1.1.0
Component: CMS Microservice - Club Membership Module
🎯 Summary
افزودن قابلیت اختصاص خودکار ویژگیهای باشگاه مشتریان (UserClubFeatures) به اعضای جدید هنگام فعالسازی.
✨ New Features
1. Auto-Grant Club Features on Activation
Location: CMSMicroservice.Application/ClubMembershipCQ/Commands/ActivateClubMembership/ActivateClubMembershipCommandHandler.cs
Changes:
// Step 8: اضافه کردن ویژگیهای باشگاه (فقط برای اعضای جدید)
if (isNewMembership)
{
var clubFeatures = await _context.ClubFeatures
.Where(f => !f.IsDeleted && new long[] { 1, 2, 3, 4 }.Contains(f.Id))
.ToListAsync(cancellationToken);
if (clubFeatures.Any())
{
var userClubFeatures = clubFeatures.Select(feature => new UserClubFeature
{
UserId = user.Id,
ClubMembershipId = entity.Id,
ClubFeatureId = feature.Id,
GrantedAt = activationDate,
Notes = "اعطا شده بهطور خودکار هنگام فعالسازی"
}).ToList();
_context.UserClubFeatures.AddRange(userClubFeatures);
await _context.SaveChangesAsync(cancellationToken);
_logger.LogInformation(
"Granted {Count} club features to UserId {UserId}",
clubFeatures.Count,
user.Id
);
}
}
Behavior:
- ✅ فقط برای
isNewMembership = trueاجرا میشود (نه برای reactivation) - ✅ 4 ویژگی پایه (
ClubFeatureId IN (1,2,3,4)) بهطور خودکار ثبت میشوند - ✅
GrantedAt= تاریخ فعالسازی - ✅ Logging کامل
📄 Migration Scripts
1. MigrateUsersToClubMembership.sql (Full Version)
Location: /dbbkup/MigrateUsersToClubMembership.sql
Size: 370 lines
Features:
- Query
UserWalletChangeLogsبرای محاسبه مجموع شارژها - Fallback به
Transactionsاگر logs خالی بود - Transaction-safe (هر کاربر = یک transaction مستقل)
- اختصاص خودکار 4 ویژگی باشگاه
SQL Logic:
-- برای هر کاربر:
BEGIN TRANSACTION;
1. INSERT INTO ClubMemberships
(UserId, ActivatedAt=FirstChargeDate, InitialContribution=25M)
2. INSERT INTO ClubMembershipHistories
(Action=0, Reason='فعالسازی خودکار - مهاجرت')
3. INSERT INTO UserClubFeatures (4 rows)
SELECT @UserId, @MembershipId, cf.Id, @DateTime,
CAST(N'اعطا شده خودکار' AS NVARCHAR(500))
FROM ClubFeatures cf
WHERE cf.Id IN (1,2,3,4)
COMMIT TRANSACTION;
2. MigrateUsersToClubMembership_Simple.sql
Location: /dbbkup/MigrateUsersToClubMembership_Simple.sql
Size: 130 lines
Difference: بررسی موجودی فعلی (UserWallets.Balance) بهجای تاریخچه شارژ
🔧 Technical Details
Schema Fixes
Issues Fixed:
- ❌
User.ClubMembershipId→ این ستون وجود نداره!- رابطه:
ClubMemberships.UserId → Users.Id(یکطرفه)
- رابطه:
- ❌
Action = 'Activated'→ بایدINTباشهAction = 0(Activated enum value)
- ❌
N'فارسی'درSELECT→ encoding خراب میشهCAST(N'فارسی' AS NVARCHAR(500))
Transaction Strategy
Before (Wrong):
SET XACT_ABORT ON;
BEGIN TRANSACTION;
-- 100 INSERT...
COMMIT TRANSACTION;
❌ با cursor سازگار نیست → log file overflow
After (Correct):
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRANSACTION;
-- INSERT ClubMembership
-- INSERT History
-- INSERT UserClubFeatures (x4)
COMMIT TRANSACTION;
END
✅ هر کاربر مستقل → partial success ممکنه
📊 Data Impact
Affected Tables:
ClubMemberships- رکوردهای جدید برای کاربران مهاجرت شدهClubMembershipHistories- یک رکوردAction=0برای هر کاربرUserClubFeatures- 4 رکورد (ویژگیهای 1,2,3,4) برای هر کاربر
Example: اگر 100 کاربر مهاجرت کنند:
- 100 row در
ClubMemberships - 100 row در
ClubMembershipHistories - 400 row در
UserClubFeatures(100 × 4)
🧪 Testing
Validation Queries
1. تعداد ویژگیهای ثبت شده:
SELECT
cm.UserId,
COUNT(ucf.Id) AS FeaturesCount
FROM ClubMemberships cm
LEFT JOIN UserClubFeatures ucf ON ucf.ClubMembershipId = cm.Id
WHERE cm.Created >= '2025-12-09'
GROUP BY cm.UserId
HAVING COUNT(ucf.Id) != 4; -- باید خالی باشه!
2. چک کردن History:
SELECT COUNT(*)
FROM ClubMembershipHistories
WHERE Action = 0
AND CreatedBy = 'MigrationScript'
AND Created >= '2025-12-09';
3. لیست اعضای جدید:
SELECT
u.Id,
u.FirstName + ' ' + u.LastName AS FullName,
cm.ActivatedAt,
cm.InitialContribution,
COUNT(ucf.Id) AS FeaturesGranted
FROM Users u
INNER JOIN ClubMemberships cm ON cm.UserId = u.Id
LEFT JOIN UserClubFeatures ucf ON ucf.ClubMembershipId = cm.Id
WHERE cm.Created >= '2025-12-09'
GROUP BY u.Id, u.FirstName, u.LastName, cm.ActivatedAt, cm.InitialContribution;
📝 Configuration
Constants:
@InitialContribution = 25,000,000 -- سهم استخر
@ChargeAmount = 56,000,000 -- حداقل شارژ
@ClubFeatureIds = (1, 2, 3, 4) -- ویژگیهای پایه
Adjustable: میتوان این مقادیر را در اسکریپت تغییر داد
🚀 Deployment Steps
- ✅ Review Script: بررسی
MigrateUsersToClubMembership.sql - ✅ Backup Database: پشتیبانگیری قبل از اجرا
- ✅ Test on Staging: اجرای آزمایشی روی staging
- ✅ Run Migration: اجرای production
- ✅ Validate Results: اجرای validation queries
- ✅ Monitor Logs: بررسی لاگهای SQL Server
🐛 Known Issues
None - تمام مشکلات شناسایی شده در مراحل توسعه رفع شدند.
📖 Documentation Updates
Files Modified/Created:
implementation-status.md- افزودن بخش Recent Updates (2025-12-09)club-membership-migration.md- مستند جامع migration scripts (NEW)00-INDEX.md- اضافه کردن لینک به migration docsCHANGELOG-CLUB-FEATURES.md- این فایل (NEW)
👥 Contributors
- Developer: GitHub Copilot
- Review: N/A
- Date: 2025-12-09
🔗 Related Issues
- Feature Request: "اختصاص خودکار ویژگیهای باشگاه"
- Task: "مهاجرت کاربران موجود به سیستم باشگاه"
Version History:
1.1.0(2025-12-09): Auto-grant club features + Migration scripts1.0.0(2024-12-04): Initial club membership implementation