diff --git a/TaxBaik.Application/Seasonal/BusinessDayCalculator.cs b/TaxBaik.Application/Seasonal/BusinessDayCalculator.cs new file mode 100644 index 0000000..b5b47d3 --- /dev/null +++ b/TaxBaik.Application/Seasonal/BusinessDayCalculator.cs @@ -0,0 +1,74 @@ +namespace TaxBaik.Application.Seasonal; + +public static class BusinessDayCalculator +{ + private static readonly HashSet HolidayDates = new() + { + // 2026 + new DateOnly(2026, 1, 1), + new DateOnly(2026, 2, 16), + new DateOnly(2026, 2, 17), + new DateOnly(2026, 2, 18), + new DateOnly(2026, 3, 1), + new DateOnly(2026, 3, 2), + new DateOnly(2026, 5, 5), + new DateOnly(2026, 5, 25), + new DateOnly(2026, 6, 6), + new DateOnly(2026, 8, 15), + new DateOnly(2026, 8, 16), + new DateOnly(2026, 8, 17), + new DateOnly(2026, 9, 24), + new DateOnly(2026, 9, 25), + new DateOnly(2026, 9, 26), + new DateOnly(2026, 10, 3), + new DateOnly(2026, 10, 4), + new DateOnly(2026, 10, 5), + new DateOnly(2026, 10, 9), + new DateOnly(2026, 12, 25), + + // 2027 + new DateOnly(2027, 1, 1), + new DateOnly(2027, 2, 6), + new DateOnly(2027, 2, 7), + new DateOnly(2027, 2, 8), + new DateOnly(2027, 2, 9), + new DateOnly(2027, 3, 1), + new DateOnly(2027, 3, 2), + new DateOnly(2027, 5, 5), + new DateOnly(2027, 5, 13), + new DateOnly(2027, 6, 6), + new DateOnly(2027, 8, 15), + new DateOnly(2027, 8, 16), + new DateOnly(2027, 9, 14), + new DateOnly(2027, 9, 15), + new DateOnly(2027, 9, 16), + new DateOnly(2027, 10, 3), + new DateOnly(2027, 10, 4), + new DateOnly(2027, 10, 9), + new DateOnly(2027, 10, 10), + new DateOnly(2027, 10, 11), + new DateOnly(2027, 12, 25), + new DateOnly(2027, 12, 26) + }; + + public static DateOnly GetEffectiveBusinessDate(DateOnly date) + { + var effectiveDate = date; + while (!IsBusinessDay(effectiveDate)) + { + effectiveDate = effectiveDate.AddDays(1); + } + + return effectiveDate; + } + + public static int GetBusinessDayDiff(DateOnly date, DateOnly referenceDate) + { + var effectiveDate = GetEffectiveBusinessDate(date); + return effectiveDate.DayNumber - referenceDate.DayNumber; + } + + private static bool IsBusinessDay(DateOnly date) + => date.DayOfWeek is not DayOfWeek.Saturday and not DayOfWeek.Sunday + && !HolidayDates.Contains(date); +} diff --git a/TaxBaik.Application/Services/SeasonalMarketingService.cs b/TaxBaik.Application/Services/SeasonalMarketingService.cs index 82ea3c4..78a9922 100644 --- a/TaxBaik.Application/Services/SeasonalMarketingService.cs +++ b/TaxBaik.Application/Services/SeasonalMarketingService.cs @@ -15,7 +15,8 @@ public class SeasonalMarketingService if (today >= start && today <= end) { - var days = (end - today).Days; + var effectiveEnd = BusinessDayCalculator.GetEffectiveBusinessDate(DateOnly.FromDateTime(end)).ToDateTime(TimeOnly.MinValue); + var days = BusinessDayCalculator.GetBusinessDayDiff(DateOnly.FromDateTime(end), DateOnly.FromDateTime(today)); return new CurrentSeasonDto { Key = season.Key, @@ -27,7 +28,7 @@ public class SeasonalMarketingService RelatedCategorySlug = season.RelatedCategorySlug, CtaText = season.CtaText, DaysUntilDeadline = days, - Deadline = end + Deadline = effectiveEnd }; } } diff --git a/TaxBaik.Web/Program.cs b/TaxBaik.Web/Program.cs index e5cdad0..faa704f 100644 --- a/TaxBaik.Web/Program.cs +++ b/TaxBaik.Web/Program.cs @@ -368,7 +368,6 @@ catch (Exception ex) app.UsePathBase("/taxbaik"); app.UseResponseCompression(); -app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); app.UseRouting(); app.UseRateLimiter();