feat: add IsActive field to UserClubFeatures for admin management

This commit is contained in:
masoodafar-web
2025-12-12 01:40:26 +03:30
parent aa66ca10c8
commit ff1c1d5d61
68 changed files with 11456 additions and 198 deletions
@@ -3,11 +3,13 @@ using CMSMicroservice.Application.Common.Interfaces;
using CMSMicroservice.Application.Common.Models;
using CMSMicroservice.Domain.Entities;
using CMSMicroservice.Domain.Entities.Club;
using CMSMicroservice.Domain.Entities.Commission;
using CMSMicroservice.Domain.Entities.History;
using CMSMicroservice.Domain.Enums;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System.Globalization;
namespace CMSMicroservice.Application.ClubMembershipCQ.Commands.ActivateClubMembership;
@@ -135,9 +137,15 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
.FirstOrDefaultAsync(
c => c.Key == "Club.MembershipGiftValue" && c.IsActive,
cancellationToken
);
var activationFeeConfig = await _context.SystemConfigurations
.FirstOrDefaultAsync(
c => c.Key == "Club.ActivationFee" && c.IsActive,
cancellationToken
);
long giftValue = 25_200_000; // مقدار پیش‌فرض
long giftValue = 28_000_000; // مقدار پیش‌فرض
if (giftValueConfig != null && long.TryParse(giftValueConfig.Value, out var configValue))
{
giftValue = configValue;
@@ -152,11 +160,27 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
"Club.MembershipGiftValue not found in configuration, using default: {GiftValue}",
giftValue
);
}
long activationFeeValue = 25_200_000; // مقدار پیش‌فرض
if (activationFeeConfig != null && long.TryParse(activationFeeConfig.Value, out var activationFeeConfigValue))
{
activationFeeValue = activationFeeConfigValue;
_logger.LogInformation(
"Using Club.ActivationFee from configuration: {activationFeeValue}",
activationFeeValue
);
}
else
{
_logger.LogWarning(
"Club.ActivationFee not found in configuration, using default: {activationFeeValue}",
activationFeeValue
);
}
ClubMembership entity;
bool isNewMembership = existingMembership == null;
var activationDate = DateTime.UtcNow;
var activationDate = DateTime.Now;
if (isNewMembership)
{
@@ -166,7 +190,7 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
UserId = user.Id,
IsActive = true,
ActivatedAt = activationDate,
InitialContribution = 56_000_000,
InitialContribution =activationFeeValue,
GiftValue = giftValue, // مقدار از تنظیمات
TotalEarned = 0,
PurchaseMethod = user.PackagePurchaseMethod
@@ -225,6 +249,83 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
_context.ClubMembershipHistories.Add(history);
await _context.SaveChangesAsync(cancellationToken);
// ⭐ 8. اضافه کردن مبلغ به Pool هفته جاری
var currentWeekNumber = GetCurrentWeekNumber();
var weeklyPool = await _context.WeeklyCommissionPools
.FirstOrDefaultAsync(p => p.WeekNumber == currentWeekNumber, cancellationToken);
if (weeklyPool == null)
{
// ایجاد Pool جدید برای این هفته
weeklyPool = new WeeklyCommissionPool
{
WeekNumber = currentWeekNumber,
TotalPoolAmount = activationFeeValue, // مبلغ هدیه به Pool اضافه میشه
TotalBalances = 0, // در CalculateWeeklyBalances محاسبه میشه
ValuePerBalance = 0, // در CalculateWeeklyCommissionPool محاسبه میشه
IsCalculated = false,
CalculatedAt = null
};
await _context.WeeklyCommissionPools.AddAsync(weeklyPool, cancellationToken);
_logger.LogInformation(
"Created new WeeklyCommissionPool for {WeekNumber} with initial amount: {Amount}",
currentWeekNumber,
giftValue
);
}
else
{
// اضافه کردن به Pool موجود
weeklyPool.TotalPoolAmount += activationFeeValue;
_context.WeeklyCommissionPools.Update(weeklyPool);
_logger.LogInformation(
"Added {Amount} to existing WeeklyCommissionPool for {WeekNumber}. New total: {NewTotal}",
activationFeeValue,
currentWeekNumber,
weeklyPool.TotalPoolAmount
);
}
await _context.SaveChangesAsync(cancellationToken);
// 9. اضافه کردن ویژگی‌های باشگاه برای کاربر (فقط برای عضویت جدید)
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,
IsActive = true,
Notes = "اعطا شده به‌طور خودکار هنگام فعالسازی"
}).ToList(); _context.UserClubFeatures.AddRange(userClubFeatures);
await _context.SaveChangesAsync(cancellationToken);
_logger.LogInformation(
"Granted {Count} club features to UserId {UserId}",
clubFeatures.Count,
user.Id
);
}
else
{
_logger.LogWarning(
"No club features found to grant to UserId {UserId}",
user.Id
);
}
}
_logger.LogInformation(
"Club membership activated successfully. UserId: {UserId}, MembershipId: {MembershipId}",
user.Id,
@@ -243,4 +344,15 @@ public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClub
throw;
}
}
/// <summary>
/// دریافت شماره هفته جاری (مثال: "2025-W50")
/// </summary>
private string GetCurrentWeekNumber()
{
var now = DateTime.Now;
var calendar = CultureInfo.CurrentCulture.Calendar;
var weekOfYear = calendar.GetWeekOfYear(now, CalendarWeekRule.FirstDay, DayOfWeek.Saturday);
return $"{now.Year}-W{weekOfYear:D2}";
}
}
@@ -54,7 +54,7 @@ public class AssignClubFeatureCommandHandler : IRequestHandler<AssignClubFeature
UserId = request.UserId,
ClubMembershipId = membership.Id,
ClubFeatureId = request.FeatureId,
GrantedAt = request.GrantedAt ?? DateTime.UtcNow,
GrantedAt = request.GrantedAt ?? DateTime.Now,
Notes = request.Notes
};
@@ -11,7 +11,7 @@ public class GetClubStatisticsQueryHandler : IRequestHandler<GetClubStatisticsQu
public async Task<GetClubStatisticsResponseDto> Handle(GetClubStatisticsQuery request, CancellationToken cancellationToken)
{
var now = DateTime.UtcNow;
var now = DateTime.Now;
// Basic statistics
var totalMembers = await _context.ClubMemberships.CountAsync(cancellationToken);