feat: add Persian calendar support for week numbers and dates
All checks were successful
Build and Deploy to Kubernetes / build-and-deploy (push) Successful in 6m35s

This commit is contained in:
masoodafar-web
2025-12-12 09:18:31 +03:30
parent 1f6c5a1f45
commit b1c3fcfd66

View File

@@ -87,7 +87,16 @@ public class GetAvailableWeeksQueryHandler : IRequestHandler<GetAvailableWeeksQu
var log = executionLogs.GetValueOrDefault(weekNumber);
var isCalculated = pool != null && pool.IsCalculated;
var displayText = $"{weekNumber} ({startDate:yyyy/MM/dd} - {endDate:yyyy/MM/dd})";
// تبدیل weekNumber به شمسی
var persianWeekNumber = ConvertWeekNumberToPersian(weekNumber, startDate);
// تبدیل تاریخ به شمسی برای نمایش
var persianCalendar = new PersianCalendar();
var startDatePersian = $"{persianCalendar.GetYear(startDate):D4}/{persianCalendar.GetMonth(startDate):D2}/{persianCalendar.GetDayOfMonth(startDate):D2}";
var endDatePersian = $"{persianCalendar.GetYear(endDate):D4}/{persianCalendar.GetMonth(endDate):D2}/{persianCalendar.GetDayOfMonth(endDate):D2}";
var displayText = $"{persianWeekNumber} ({startDatePersian} - {endDatePersian})";
if (isCalculated)
{
@@ -96,7 +105,7 @@ public class GetAvailableWeeksQueryHandler : IRequestHandler<GetAvailableWeeksQu
return new WeekInfoDto
{
WeekNumber = weekNumber,
WeekNumber = persianWeekNumber, // شمسی
StartDate = startDate,
EndDate = endDate,
IsCalculated = isCalculated,
@@ -152,4 +161,33 @@ public class GetAvailableWeeksQueryHandler : IRequestHandler<GetAvailableWeeksQu
return (startDate, endDate);
}
private static string ConvertWeekNumberToPersian(string gregorianWeekNumber, DateTime weekStartDate)
{
// ورودی: "2025-W48"
var persianCalendar = new PersianCalendar();
var persianYear = persianCalendar.GetYear(weekStartDate);
// محاسبه شماره هفته شمسی
var jan1Persian = persianCalendar.ToDateTime(persianYear, 1, 1, 0, 0, 0, 0);
// پیدا کردن اولین شنبه سال شمسی
var jan1DayOfWeek = (int)jan1Persian.DayOfWeek;
var daysToFirstSaturday = jan1DayOfWeek == 6 ? 0 : (6 - jan1DayOfWeek + 7) % 7;
var firstSaturday = jan1Persian.AddDays(daysToFirstSaturday);
// محاسبه شماره هفته
int weekNum;
if (weekStartDate < firstSaturday)
{
weekNum = 1;
}
else
{
var daysSinceFirstSaturday = (weekStartDate - firstSaturday).Days;
weekNum = (daysSinceFirstSaturday / 7) + 1;
}
return $"{persianYear}-W{weekNum:D2}";
}
}