Files
docs/archive/CHANGELOG-CLUB-FEATURES.md
T
masoodafar-web 5965b98728 update
2026-01-03 18:27:49 +03:30

256 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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