diff --git a/src/Nager.Date/HolidayProviders/ArgentinaHolidayProvider.cs b/src/Nager.Date/HolidayProviders/ArgentinaHolidayProvider.cs index 1afe7fac..efa0a998 100644 --- a/src/Nager.Date/HolidayProviders/ArgentinaHolidayProvider.cs +++ b/src/Nager.Date/HolidayProviders/ArgentinaHolidayProvider.cs @@ -28,8 +28,13 @@ protected override IEnumerable GetHolidaySpecifications(in { var easterSunday = this._catholicProvider.EasterSunday(year); - var thirdMondayInAugust = DateHelper.FindDay(year, Month.August, DayOfWeek.Monday, Occurrence.Third); - var secondMondayInOctober = DateHelper.FindDay(year, Month.October, DayOfWeek.Monday, Occurrence.Second); + var mondayObservedRuleSet = new ObservedRuleSet + { + Tuesday = date => date.AddDays(-1), + Wednesday = date => date.AddDays(-2), + Thursday = date => date.AddDays(4), + Friday = date => date.AddDays(3) + }; var holidaySpecifications = new List { @@ -45,14 +50,16 @@ protected override IEnumerable GetHolidaySpecifications(in Date = easterSunday.AddDays(-48), EnglishName = "Carnival", LocalName = "Carnaval", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { Date = easterSunday.AddDays(-47), EnglishName = "Carnival", LocalName = "Carnaval", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { @@ -87,7 +94,8 @@ protected override IEnumerable GetHolidaySpecifications(in Date = new DateTime(year, 6, 17), EnglishName = "Anniversary of the Passing of General Martín Miguel de Güemes", LocalName = "Paso a la Inmortalidad del General Martín Miguel de Güemes", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { @@ -105,24 +113,27 @@ protected override IEnumerable GetHolidaySpecifications(in }, new HolidaySpecification { - Date = thirdMondayInAugust, + Date = new DateTime(year, 8, 17), EnglishName = "General José de San Martín Memorial Day", LocalName = "Paso a la Inmortalidad del General José de San Martín", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { - Date = secondMondayInOctober, + Date = new DateTime(year, 10, 12), EnglishName = "Day of Respect for Cultural Diversity", LocalName = "Día del Respeto a la Diversidad Cultural", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { Date = new DateTime(year, 11, 20), EnglishName = "National Sovereignty Day", LocalName = "Día de la Soberanía Nacional", - HolidayTypes = HolidayTypes.Public + HolidayTypes = HolidayTypes.Public, + ObservedRuleSet = mondayObservedRuleSet }, new HolidaySpecification { @@ -138,7 +149,7 @@ protected override IEnumerable GetHolidaySpecifications(in LocalName = "Navidad", HolidayTypes = HolidayTypes.Public }, - this._catholicProvider.GoodFriday("Viernes Santo", year) + this._catholicProvider.GoodFriday("Viernes Santo", year, mondayObservedRuleSet) }; return holidaySpecifications; @@ -149,7 +160,10 @@ public override IEnumerable GetSources() { return [ - "https://en.wikipedia.org/wiki/Public_holidays_in_Argentina" + "https://en.wikipedia.org/wiki/Public_holidays_in_Argentina", + "https://www.argentina.gob.ar/normativa/nacional/ley-27399-281835/texto", + "https://www.argentina.gob.ar/normativa/nacional/decreto-52-2017-271094/texto", + "https://www.argentina.gob.ar/normativa/nacional/decreto-1584-2010-174389/actualizacion" ]; } } diff --git a/src/Nager.Date/HolidayProviders/SwitzerlandHolidayProvider.cs b/src/Nager.Date/HolidayProviders/SwitzerlandHolidayProvider.cs index 439b6c46..973bc24f 100644 --- a/src/Nager.Date/HolidayProviders/SwitzerlandHolidayProvider.cs +++ b/src/Nager.Date/HolidayProviders/SwitzerlandHolidayProvider.cs @@ -74,14 +74,6 @@ protected override IEnumerable GetHolidaySpecifications(in HolidayTypes = HolidayTypes.Public }, new HolidaySpecification - { - Date = new DateTime(year, 1, 2), - EnglishName = "St. Berchtold's Day", - LocalName = "Berchtoldstag", - HolidayTypes = HolidayTypes.Public, - SubdivisionCodes = ["CH-ZH", "CH-BE", "CH-LU", "CH-OW", "CH-GL", "CH-ZG", "CH-FR", "CH-SO", "CH-SH", "CH-TG", "CH-VD", "CH-NE", "CH-GE", "CH-JU"] - }, - new HolidaySpecification { Date = new DateTime(year, 1, 6), EnglishName = "Epiphany", @@ -98,14 +90,6 @@ protected override IEnumerable GetHolidaySpecifications(in SubdivisionCodes = ["CH-NE"] }, new HolidaySpecification - { - Date = new DateTime(year, 3, 19), - EnglishName = "Saint Joseph's Day", - LocalName = "Josefstag", - HolidayTypes = HolidayTypes.Public, - SubdivisionCodes = ["CH-LU", "CH-UR", "CH-SZ", "CH-NW", "CH-ZG", "CH-GR", "CH-TI", "CH-VS"] - }, - new HolidaySpecification { Date = new DateTime(year, 5, 1), EnglishName = "Labour Day", @@ -180,8 +164,8 @@ protected override IEnumerable GetHolidaySpecifications(in Date = thirdSundayOfSeptember, EnglishName = "Federal Day of Thanksgiving", LocalName = "Eidgenössischer Dank-, Buss- und Bettag", - HolidayTypes = HolidayTypes.Public, - SubdivisionCodes = ["CH-ZH", "CH-BE", "CH-LU", "CH-UR", "CH-SZ", "CH-OW", "CH-NW", "CH-GL", "CH-ZG", "CH-FR", "CH-SO", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-AG", "CH-TG", "CH-TI", "CH-VD", "CH-VS", "CH-NE", "CH-JU"] + HolidayTypes = HolidayTypes.Observance, + SubdivisionCodes = ["CH-ZH", "CH-BE", "CH-LU", "CH-SZ", "CH-OW", "CH-NW", "CH-GL", "CH-SO", "CH-BS", "CH-BL", "CH-SH", "CH-SG", "CH-GR"] }, new HolidaySpecification { @@ -192,16 +176,119 @@ protected override IEnumerable GetHolidaySpecifications(in SubdivisionCodes = ["CH-VD"] }, this._catholicProvider.GoodFriday("Karfreitag", year).SetSubdivisionCodes("CH-ZH", "CH-BE", "CH-LU", "CH-UR", "CH-SZ", "CH-OW", "CH-NW", "CH-GL", "CH-ZG", "CH-FR", "CH-SO", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-AG", "CH-TG", "CH-VD", "CH-NE", "CH-GE", "CH-JU"), - this._catholicProvider.EasterMonday("Ostermontag", year).SetSubdivisionCodes("CH-ZH", "CH-BE", "CH-LU", "CH-UR", "CH-SZ", "CH-OW", "CH-NW", "CH-GL", "CH-ZG", "CH-FR", "CH-SO", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-AG", "CH-TG", "CH-TI", "CH-VD", "CH-NE", "CH-GE", "CH-JU"), this._catholicProvider.AscensionDay("Auffahrt", year), - this._catholicProvider.WhitMonday("Pfingstmontag", year).SetSubdivisionCodes("CH-ZH", "CH-BE", "CH-LU", "CH-UR", "CH-SZ", "CH-OW", "CH-NW", "CH-GL", "CH-ZG", "CH-FR", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-TG", "CH-TI", "CH-VD", "CH-NE", "CH-GE", "CH-JU"), }; + holidaySpecifications.AddRangeIfNotNull(this.WhitMonday(year)); + holidaySpecifications.AddRangeIfNotNull(this.EasterMonday(year)); + holidaySpecifications.AddRangeIfNotNull(this.Epiphany(year)); + holidaySpecifications.AddIfNotNull(this.BerchtoldsDay(year)); + holidaySpecifications.AddRangeIfNotNull(this.SaintJosephsDay(year)); holidaySpecifications.AddRangeIfNotNull(this.CorpusChristi(year)); return holidaySpecifications; } + private HolidaySpecification[] Epiphany(int year) + { + var englishName = "Epiphany"; + var localName = "Heilige Drei Könige"; + + return + [ + new HolidaySpecification + { + Date = new DateTime(year, 1, 6), + EnglishName = englishName, + LocalName = localName, + HolidayTypes = HolidayTypes.Public, + SubdivisionCodes = ["CH-TI"] + }, + new HolidaySpecification + { + Date = new DateTime(year, 1, 6), + EnglishName = englishName, + LocalName = localName, + HolidayTypes = HolidayTypes.Observance, + SubdivisionCodes = ["CH-UR", "CH-SZ"] + } + ]; + } + + private HolidaySpecification BerchtoldsDay(int year) + { + var subdivisionCodes = new List(["CH-BE", "CH-FR", "CH-SH", "CH-AG", "CH-TG", "CH-VD"]); + + if (new DateTime(year, 12, 25).DayOfWeek == DayOfWeek.Sunday || + new DateTime(year, 1, 1).DayOfWeek == DayOfWeek.Sunday) + { + subdivisionCodes.Add("CH-NE"); + } + + return new HolidaySpecification + { + Date = new DateTime(year, 1, 2), + EnglishName = "St. Berchtold's Day", + LocalName = "Berchtoldstag", + HolidayTypes = HolidayTypes.Public, + SubdivisionCodes = [.. subdivisionCodes] + }; + } + + private HolidaySpecification[] SaintJosephsDay(int year) + { + var englishName = "Saint Joseph's Day"; + var localName = "Josefstag"; + + return + [ + new HolidaySpecification + { + Date = new DateTime(year, 3, 19), + EnglishName = englishName, + LocalName = localName, + HolidayTypes = HolidayTypes.Public, + SubdivisionCodes = ["CH-SZ", "CH-VS"] + }, + new HolidaySpecification + { + Date = new DateTime(year, 3, 19), + EnglishName = englishName, + LocalName = localName, + HolidayTypes = HolidayTypes.Observance, + SubdivisionCodes = ["CH-LU", "CH-UR", "CH-NW", "CH-TI"] + } + ]; + } + + private HolidaySpecification[] EasterMonday(int year) + { + var localName = "Ostermontag"; + + var specificationPublic = this._catholicProvider.EasterMonday(localName, year).SetSubdivisionCodes("CH-ZH", "CH-BE", "CH-GL", "CH-FR", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-AG", "CH-TG", "CH-TI", "CH-VD", "CH-GE", "CH-JU"); + var specificationObservance = this._catholicProvider.EasterMonday(localName, year).SetSubdivisionCodes("CH-UR", "CH-SZ", "CH-OW").SetHolidayTypes(HolidayTypes.Observance); + + return + [ + specificationPublic, + specificationObservance + ]; + } + + private HolidaySpecification[] WhitMonday(int year) + { + var localName = "Pfingstmontag"; + + var specificationPublic = this._catholicProvider.WhitMonday(localName, year).SetSubdivisionCodes("CH-ZH", "CH-BE", "CH-GL", "CH-FR", "CH-BS", "CH-BL", "CH-SH", "CH-AR", "CH-AI", "CH-SG", "CH-GR", "CH-AG", "CH-TG", "CH-VD", "CH-GE", "CH-JU"); + var specificationObservance = this._catholicProvider.WhitMonday(localName, year).SetSubdivisionCodes("CH-UR", "CH-SZ", "CH-OW", "CH-TI").SetHolidayTypes(HolidayTypes.Observance); + + return + [ + specificationPublic, + specificationObservance + ]; + } + private HolidaySpecification[] CorpusChristi(int year) { var localName = "Fronleichnam";