using Aberwyn.Data; namespace Aberwyn.Data { public class PayoutService { } public static class SwedishHolidays { public static bool IsRedDay(DateTime date) { var year = date.Year; var fixedHolidays = new[] { new DateTime(year, 1, 1), // Nyårsdagen new DateTime(year, 1, 6), // Trettondedag jul new DateTime(year, 5, 1), // Första maj new DateTime(year, 6, 6), // Nationaldagen new DateTime(year, 12, 25), // Juldagen new DateTime(year, 12, 26), // Annandag jul }; if (fixedHolidays.Contains(date.Date)) return true; // Rörliga helgdagar var easter = GetEasterSunday(year); var movable = new[] { easter.AddDays(-2), // Långfredagen easter, // Påskdagen easter.AddDays(1), // Annandag påsk easter.AddDays(39), // Kristi himmelsfärd easter.AddDays(49), // Pingstdagen GetMidsummerDay(year), }; return movable.Contains(date.Date); } private static DateTime GetMidsummerDay(int year) { // Lördag mellan 20–26 juni for (int day = 20; day <= 26; day++) { var d = new DateTime(year, 6, day); if (d.DayOfWeek == DayOfWeek.Saturday) return d; } throw new Exception("Midsummer not found"); } private static DateTime GetEasterSunday(int year) { // Meeus/Jones/Butcher int a = year % 19; int b = year / 100; int c = year % 100; int d = b / 4; int e = b % 4; int f = (b + 8) / 25; int g = (b - f + 1) / 3; int h = (19 * a + b - d - g + 15) % 30; int i = c / 4; int k = c % 4; int l = (32 + 2 * e + 2 * i - h - k) % 7; int m = (a + 11 * h + 22 * l) / 451; int month = (h + l - 7 * m + 114) / 31; int day = ((h + l - 7 * m + 114) % 31) + 1; return new DateTime(year, month, day); } } } public static class SalaryDateService { public static DateTime GetSalaryPayDate(int year, int month) { var payDate = new DateTime(year, month, 25); while (payDate.DayOfWeek == DayOfWeek.Saturday || payDate.DayOfWeek == DayOfWeek.Sunday || SwedishHolidays.IsRedDay(payDate)) { payDate = payDate.AddDays(-1); } return payDate; } }