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 log = executionLogs.GetValueOrDefault(weekNumber);
var isCalculated = pool != null && pool.IsCalculated; 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) if (isCalculated)
{ {
@@ -96,7 +105,7 @@ public class GetAvailableWeeksQueryHandler : IRequestHandler<GetAvailableWeeksQu
return new WeekInfoDto return new WeekInfoDto
{ {
WeekNumber = weekNumber, WeekNumber = persianWeekNumber, // شمسی
StartDate = startDate, StartDate = startDate,
EndDate = endDate, EndDate = endDate,
IsCalculated = isCalculated, IsCalculated = isCalculated,
@@ -152,4 +161,33 @@ public class GetAvailableWeeksQueryHandler : IRequestHandler<GetAvailableWeeksQu
return (startDate, endDate); 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}";
}
} }