This commit is contained in:
masoodafar-web
2026-01-03 18:27:49 +03:30
parent 0369292d7f
commit 5965b98728
156 changed files with 16082 additions and 0 deletions
+255
View File
@@ -0,0 +1,255 @@
# 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**:
```csharp
// 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**:
```sql
-- برای هر کاربر:
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**:
1.`User.ClubMembershipId` → این ستون وجود نداره!
- رابطه: `ClubMemberships.UserId → Users.Id` (یک‌طرفه)
2.`Action = 'Activated'` → باید `INT` باشه
- `Action = 0` (Activated enum value)
3.`N'فارسی'` در `SELECT` → encoding خراب می‌شه
- `CAST(N'فارسی' AS NVARCHAR(500))`
### Transaction Strategy
**Before (Wrong)**:
```sql
SET XACT_ABORT ON;
BEGIN TRANSACTION;
-- 100 INSERT...
COMMIT TRANSACTION;
```
❌ با cursor سازگار نیست → log file overflow
**After (Correct)**:
```sql
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRANSACTION;
-- INSERT ClubMembership
-- INSERT History
-- INSERT UserClubFeatures (x4)
COMMIT TRANSACTION;
END
```
✅ هر کاربر مستقل → partial success ممکنه
---
## 📊 Data Impact
**Affected Tables**:
1. `ClubMemberships` - رکوردهای جدید برای کاربران مهاجرت شده
2. `ClubMembershipHistories` - یک رکورد `Action=0` برای هر کاربر
3. `UserClubFeatures` - 4 رکورد (ویژگی‌های 1,2,3,4) برای هر کاربر
**Example**:
اگر 100 کاربر مهاجرت کنند:
- 100 row در `ClubMemberships`
- 100 row در `ClubMembershipHistories`
- 400 row در `UserClubFeatures` (100 × 4)
---
## 🧪 Testing
### Validation Queries
**1. تعداد ویژگی‌های ثبت شده**:
```sql
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**:
```sql
SELECT COUNT(*)
FROM ClubMembershipHistories
WHERE Action = 0
AND CreatedBy = 'MigrationScript'
AND Created >= '2025-12-09';
```
**3. لیست اعضای جدید**:
```sql
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**:
```sql
@InitialContribution = 25,000,000 -- سهم استخر
@ChargeAmount = 56,000,000 -- حداقل شارژ
@ClubFeatureIds = (1, 2, 3, 4) -- ویژگی‌های پایه
```
**Adjustable**: می‌توان این مقادیر را در اسکریپت تغییر داد
---
## 🚀 Deployment Steps
1.**Review Script**: بررسی `MigrateUsersToClubMembership.sql`
2.**Backup Database**: پشتیبان‌گیری قبل از اجرا
3.**Test on Staging**: اجرای آزمایشی روی staging
4.**Run Migration**: اجرای production
5.**Validate Results**: اجرای validation queries
6.**Monitor Logs**: بررسی لاگ‌های SQL Server
---
## 🐛 Known Issues
**None** - تمام مشکلات شناسایی شده در مراحل توسعه رفع شدند.
---
## 📖 Documentation Updates
**Files Modified/Created**:
1. `implementation-status.md` - افزودن بخش Recent Updates (2025-12-09)
2. `club-membership-migration.md` - مستند جامع migration scripts (NEW)
3. `00-INDEX.md` - اضافه کردن لینک به migration docs
4. `CHANGELOG-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 scripts
- `1.0.0` (2024-12-04): Initial club membership implementation