feat: refactor week number handling to use WeekDefinitionId across multiple entities and queries

This commit is contained in:
masoodafar-web
2025-12-19 10:41:22 +03:30
parent 3cb95dc349
commit 8b784101be
83 changed files with 17592 additions and 566 deletions
@@ -3,10 +3,14 @@ namespace CMSMicroservice.Application.NetworkMembershipCQ.Queries.GetNetworkTree
public class GetNetworkTreeQueryHandler : IRequestHandler<GetNetworkTreeQuery, NetworkTreeDto?>
{
private readonly IApplicationDbContext _context;
private readonly IWeekDefinitionRepository _weekDefinitionRepository;
public GetNetworkTreeQueryHandler(IApplicationDbContext context)
public GetNetworkTreeQueryHandler(
IApplicationDbContext context,
IWeekDefinitionRepository weekDefinitionRepository)
{
_context = context;
_weekDefinitionRepository = weekDefinitionRepository;
}
public async Task<NetworkTreeDto?> Handle(GetNetworkTreeQuery request, CancellationToken cancellationToken)
@@ -39,11 +43,13 @@ public class GetNetworkTreeQueryHandler : IRequestHandler<GetNetworkTreeQuery, N
// محاسبه شماره هفته فعال‌سازی
string? activationWeekNumber = null;
string? activationWeekDisplayName = null;
bool isActivatedInTargetWeek = false;
if (user.ClubMembership?.ActivatedAt != null)
{
activationWeekNumber = CalculateWeekNumber(user.ClubMembership.ActivatedAt.Value);
activationWeekDisplayName = _weekDefinitionRepository.GetDisplayNameByGregorianWeekNumber(activationWeekNumber);
// بررسی آیا در هفته هدف فعال شده است
if (!string.IsNullOrEmpty(request.ActivationWeekNumber))
@@ -63,6 +69,7 @@ public class GetNetworkTreeQueryHandler : IRequestHandler<GetNetworkTreeQuery, N
ClubActivatedAt = user.ClubMembership?.ActivatedAt,
IsClubActive = user.ClubMembership?.IsActive ?? false,
ActivationWeekNumber = activationWeekNumber,
ActivationWeekDisplayName = activationWeekDisplayName,
IsActivatedInTargetWeek = isActivatedInTargetWeek,
UserCreated = user.Created
};
@@ -116,64 +123,19 @@ public class GetNetworkTreeQueryHandler : IRequestHandler<GetNetworkTreeQuery, N
/// <summary>
/// محاسبه شماره هفته از تاریخ
/// </summary>
private static string CalculateWeekNumber(DateTime date)
private string CalculateWeekNumber(DateTime date)
{
var year = date.Year;
var jan1 = new DateTime(year, 1, 1);
var daysToFirstSaturday = (7 - (int)jan1.DayOfWeek + 7) % 7;
if (jan1.DayOfWeek == DayOfWeek.Saturday)
daysToFirstSaturday = 0;
// First try to get from repository cache
var weekDef = _weekDefinitionRepository.GetWeekByDate(date);
if (weekDef != null)
{
return $"{weekDef.GregorianYear}-W{weekDef.GregorianWeekNumber:D2}";
}
var firstSaturday = jan1.AddDays(daysToFirstSaturday);
var weekNum = date < firstSaturday ? 1 : ((date - firstSaturday).Days / 7) + 1;
return $"{year}-W{weekNum:D2}";
// Fallback: use repository's calculation method
return _weekDefinitionRepository.CalculateGregorianWeekNumber(date);
}
/// <summary>
/// تبدیل شماره هفته (مثلاً 2025-W05) به تاریخ شروع و پایان هفته
/// </summary>
private static (DateTime? StartDate, DateTime? EndDate) ParseWeekNumber(string weekNumber)
{
try
{
// فرمت: YYYY-W##
var parts = weekNumber.Split('-');
if (parts.Length != 2 || !parts[1].StartsWith("W"))
return (null, null);
if (!int.TryParse(parts[0], out var year))
return (null, null);
if (!int.TryParse(parts[1].Substring(1), out var weekNum))
return (null, null);
// محاسبه اولین شنبه سال
var jan1 = new DateTime(year, 1, 1);
var daysToFirstSaturday = (7 - (int)jan1.DayOfWeek + 7) % 7;
if (jan1.DayOfWeek == DayOfWeek.Saturday)
daysToFirstSaturday = 0;
var firstSaturday = jan1.AddDays(daysToFirstSaturday);
// محاسبه تاریخ شروع هفته مورد نظر
DateTime startDate;
if (weekNum == 1)
{
startDate = firstSaturday;
}
else
{
startDate = firstSaturday.AddDays((weekNum - 1) * 7);
}
var endDate = startDate.AddDays(7);
return (startDate, endDate);
}
catch
{
return (null, null);
}
}
}
@@ -27,6 +27,11 @@ public class NetworkTreeDto
/// </summary>
public string? ActivationWeekNumber { get; set; }
/// <summary>
/// نام نمایشی هفته فعال‌سازی (مثل: هفته یکم)
/// </summary>
public string? ActivationWeekDisplayName { get; set; }
/// <summary>
/// آیا کاربر در هفته هدف فعال شده است؟
/// </summary>