# 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
