@raven-js/cortex
Version:
Zero-dependency machine learning, AI, and data processing library for modern JavaScript
390 lines (366 loc) • 8.07 kB
JavaScript
/**
* @author Anonyfox <max@anonyfox.com>
* @license MIT
* @see {@link https://github.com/Anonyfox/ravenjs}
* @see {@link https://ravenjs.dev}
* @see {@link https://anonyfox.com}
*/
/**
* @file German holiday definitions with federal and state-specific variations.
*
* Encodes Germany's complex federal holiday system across 16 Länder with
* Catholic/Protestant denominational differences and reunification patterns.
*/
import { HolidayDefinition } from "../holiday-definition.js";
/**
* Calculate Buß- und Bettag (Day of Prayer and Repentance) as Wednesday before November 23.
* @param {number} year - Year to calculate for
* @returns {Date} Date of Buß- und Bettag
*/
function calculateBussUndBettag(year) {
// November 23 of the given year
const nov23 = new Date(Date.UTC(year, 10, 23, 0, 0, 0, 0)); // Month 10 = November
const dayOfWeek = nov23.getUTCDay(); // 0 = Sunday, 1 = Monday, ..., 6 = Saturday
// Calculate days to subtract to get to the previous Wednesday
// Wednesday = 3, and we want the Wednesday BEFORE November 23 (strictly before)
let daysBack;
if (dayOfWeek > 3) {
// Nov 23 is Thursday, Friday, or Saturday
daysBack = dayOfWeek - 3; // Go back to Wednesday of same week
} else {
// Nov 23 is Sunday, Monday, Tuesday, or Wednesday
// Go back to Wednesday of previous week
daysBack = dayOfWeek + 4;
}
// Create the Wednesday before November 23
const bussUndBettag = new Date(Date.UTC(year, 10, 23 - daysBack, 0, 0, 0, 0));
return bussUndBettag;
}
/**
* German federal holidays observed in all 16 states.
* These form the baseline holiday calendar for all of Germany.
*/
export const NATIONAL_HOLIDAYS = [
new HolidayDefinition({
name: "Neujahr",
type: "fixed",
month: 1,
day: 1,
workFree: true,
}),
new HolidayDefinition({
name: "Karfreitag",
type: "easter_relative",
offset: -2,
workFree: true,
}),
new HolidayDefinition({
name: "Ostermontag",
type: "easter_relative",
offset: 1,
workFree: true,
}),
new HolidayDefinition({
name: "Tag der Arbeit",
type: "fixed",
month: 5,
day: 1,
workFree: true,
}),
new HolidayDefinition({
name: "Christi Himmelfahrt",
type: "easter_relative",
offset: 39,
workFree: true,
}),
new HolidayDefinition({
name: "Pfingstmontag",
type: "easter_relative",
offset: 50,
workFree: true,
}),
new HolidayDefinition({
name: "Tag der Deutschen Einheit",
type: "fixed",
month: 10,
day: 3,
workFree: true,
}),
new HolidayDefinition({
name: "Erster Weihnachtstag",
type: "fixed",
month: 12,
day: 25,
workFree: true,
}),
new HolidayDefinition({
name: "Zweiter Weihnachtstag",
type: "fixed",
month: 12,
day: 26,
workFree: true,
}),
];
/**
* Regional holidays specific to individual German states.
* Encoding the beautiful complexity of German federalism.
*
* STATE CODES:
* BW = Baden-Württemberg, BY = Bayern (Bavaria), BE = Berlin,
* BB = Brandenburg, HB = Bremen, HH = Hamburg, HE = Hessen,
* MV = Mecklenburg-Vorpommern, NI = Niedersachsen, NW = Nordrhein-Westfalen,
* RP = Rheinland-Pfalz, SL = Saarland, SN = Sachsen (Saxony),
* ST = Sachsen-Anhalt, SH = Schleswig-Holstein, TH = Thüringen
*/
export const REGIONAL_HOLIDAYS = {
// Baden-Württemberg - Catholic southern state
BW: [
new HolidayDefinition({
name: "Heilige Drei Könige",
type: "fixed",
month: 1,
day: 6,
workFree: true,
}),
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Allerheiligen",
type: "fixed",
month: 11,
day: 1,
workFree: true,
}),
],
// Bayern (Bavaria) - Catholic southern state with additional Marian feast
BY: [
new HolidayDefinition({
name: "Heilige Drei Könige",
type: "fixed",
month: 1,
day: 6,
workFree: true,
}),
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Mariä Himmelfahrt",
type: "fixed",
month: 8,
day: 15,
workFree: true,
}),
new HolidayDefinition({
name: "Allerheiligen",
type: "fixed",
month: 11,
day: 1,
workFree: true,
}),
],
// Berlin - Added International Women's Day in 2019
BE: [
new HolidayDefinition({
name: "Internationaler Frauentag",
type: "fixed",
month: 3,
day: 8,
workFree: true,
}),
],
// Brandenburg - Protestant eastern state, added Reformation Day
BB: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Bremen - Protestant northern city-state
HB: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Hamburg - Protestant northern city-state
HH: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Hessen - Mixed denominational state with Catholic elements
HE: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
],
// Mecklenburg-Vorpommern - Protestant eastern state
MV: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Niedersachsen - Protestant northern state
NI: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Nordrhein-Westfalen - Mixed with strong Catholic influence
NW: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Allerheiligen",
type: "fixed",
month: 11,
day: 1,
workFree: true,
}),
],
// Rheinland-Pfalz - Catholic western state
RP: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Allerheiligen",
type: "fixed",
month: 11,
day: 1,
workFree: true,
}),
],
// Saarland - Catholic western state with French influences
SL: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Mariä Himmelfahrt",
type: "fixed",
month: 8,
day: 15,
workFree: true,
}),
new HolidayDefinition({
name: "Allerheiligen",
type: "fixed",
month: 11,
day: 1,
workFree: true,
}),
],
// Sachsen (Saxony) - Only state that kept Buß- und Bettag
SN: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
new HolidayDefinition({
name: "Buß- und Bettag",
type: "calculated",
workFree: true,
calculator: calculateBussUndBettag,
}),
],
// Sachsen-Anhalt - Eastern state with mixed denomination
ST: [
new HolidayDefinition({
name: "Heilige Drei Könige",
type: "fixed",
month: 1,
day: 6,
workFree: true,
}),
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Schleswig-Holstein - Protestant northern state
SH: [
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
// Thüringen - Eastern state with mixed denomination
TH: [
new HolidayDefinition({
name: "Fronleichnam",
type: "easter_relative",
offset: 60,
workFree: true,
}),
new HolidayDefinition({
name: "Reformationstag",
type: "fixed",
month: 10,
day: 31,
workFree: true,
}),
],
};
/**
* Complete German holiday system.
* Institutional memory: federal structure with regional variations.
*/
export const DE = {
national: NATIONAL_HOLIDAYS,
regional: REGIONAL_HOLIDAYS,
};