This commit is contained in:
2026-07-26 18:11:57 +02:00
parent d408e01ab5
commit 21a3b34471
139 changed files with 32872 additions and 0 deletions
+180
View File
@@ -0,0 +1,180 @@
// src/data/holidays-bw.ts
var BW_SCHOOL_HOLIDAYS = [
// Schuljahr 2025/26
{ from: "2025-12-22", to: "2026-01-05", name: "Weihnachtsferien" },
{ from: "2026-03-30", to: "2026-04-11", name: "Osterferien" },
{ from: "2026-05-26", to: "2026-06-05", name: "Pfingstferien" },
{ from: "2026-07-30", to: "2026-09-12", name: "Sommerferien" },
{ from: "2026-10-26", to: "2026-10-30", name: "Herbstferien" },
{ from: "2026-10-31", to: "2026-10-31", name: "Reformationsfest" },
// Schuljahr 2026/27
{ from: "2026-12-23", to: "2027-01-09", name: "Weihnachtsferien" },
{ from: "2027-03-25", to: "2027-03-25", name: "Gr\xFCndonnerstag" },
{ from: "2027-03-30", to: "2027-04-03", name: "Osterferien" },
{ from: "2027-05-18", to: "2027-05-29", name: "Pfingstferien" },
{ from: "2027-07-29", to: "2027-09-11", name: "Sommerferien" },
{ from: "2027-11-02", to: "2027-11-06", name: "Herbstferien" },
// Schuljahr 2027/28
{ from: "2027-12-23", to: "2028-01-08", name: "Weihnachtsferien" }
];
var BW_PUBLIC_HOLIDAYS = {
"2026-01-01": "Neujahr",
"2026-01-06": "Heilige Drei K\xF6nige",
"2026-04-03": "Karfreitag",
"2026-04-06": "Ostermontag",
"2026-05-01": "Tag der Arbeit",
"2026-05-14": "Christi Himmelfahrt",
"2026-05-25": "Pfingstmontag",
"2026-06-04": "Fronleichnam",
"2026-10-03": "Tag der Deutschen Einheit",
"2026-11-01": "Allerheiligen",
"2026-12-25": "1. Weihnachtsfeiertag",
"2026-12-26": "2. Weihnachtsfeiertag",
"2027-01-01": "Neujahr",
"2027-01-06": "Heilige Drei K\xF6nige",
"2027-03-26": "Karfreitag",
"2027-03-29": "Ostermontag",
"2027-05-01": "Tag der Arbeit",
"2027-05-06": "Christi Himmelfahrt",
"2027-05-17": "Pfingstmontag",
"2027-05-27": "Fronleichnam",
"2027-10-03": "Tag der Deutschen Einheit",
"2027-11-01": "Allerheiligen",
"2027-12-25": "1. Weihnachtsfeiertag",
"2027-12-26": "2. Weihnachtsfeiertag"
};
var LAST_COMPLETED_DATE = "2026-04-03";
var START_WEEK_NUMBER = 79;
// src/lib/calendar.ts
var WEEKDAYS = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
function parseISO(iso) {
const [y, m, d] = iso.split("-").map(Number);
return new Date(y, m - 1, d);
}
function toISO(date) {
const y = date.getFullYear();
const m = String(date.getMonth() + 1).padStart(2, "0");
const d = String(date.getDate()).padStart(2, "0");
return `${y}-${m}-${d}`;
}
function formatDE(iso) {
const [y, m, d] = iso.split("-");
return `${d}.${m}.${y}`;
}
function addDays(iso, days) {
const d = parseISO(iso);
d.setDate(d.getDate() + days);
return toISO(d);
}
function isWeekend(iso) {
const wd = parseISO(iso).getDay();
return wd === 0 || wd === 6;
}
function isInSchoolHoliday(iso) {
for (const h of BW_SCHOOL_HOLIDAYS) {
if (iso >= h.from && iso <= h.to) return h.name;
}
return void 0;
}
function getPublicHoliday(iso) {
return BW_PUBLIC_HOLIDAYS[iso];
}
function getDayType(iso) {
if (getPublicHoliday(iso)) return "feiertag";
if (isInSchoolHoliday(iso)) return "betrieb";
const wd = parseISO(iso).getDay();
if (wd === 2 || wd === 4) return "schule";
return "betrieb";
}
function getMonday(iso) {
const d = parseISO(iso);
const wd = d.getDay();
const diff = wd === 0 ? -6 : 1 - wd;
d.setDate(d.getDate() + diff);
return toISO(d);
}
function getFriday(iso) {
return addDays(getMonday(iso), 4);
}
function getWeekNumber(iso) {
const monday = getMonday(iso);
const baseMonday = getMonday(LAST_COMPLETED_DATE);
const baseWeek = START_WEEK_NUMBER - 1;
const days = (parseISO(monday).getTime() - parseISO(baseMonday).getTime()) / (24 * 60 * 60 * 1e3);
return baseWeek + Math.round(days / 7);
}
function getYearLabel(iso) {
if (iso < "2025-09-01") return "Erstes Ausbildungsjahr";
if (iso < "2026-09-01") return "Zweites Ausbildungsjahr";
return "Drittes Ausbildungsjahr";
}
function getDayInfo(iso) {
const d = parseISO(iso);
const weekday = d.getDay();
const holidayName = getPublicHoliday(iso);
const schoolHolidayName = isInSchoolHoliday(iso);
return {
date: iso,
weekday,
weekdayLabel: WEEKDAYS[weekday],
type: getDayType(iso),
holidayName,
schoolHolidayName,
weekNumber: getWeekNumber(iso),
weekMonday: getMonday(iso),
weekFriday: getFriday(iso),
yearLabel: getYearLabel(iso)
};
}
function nextWorkday(iso) {
let cur = addDays(iso, 1);
while (isWeekend(cur)) cur = addDays(cur, 1);
return cur;
}
function prevWorkday(iso) {
let cur = addDays(iso, -1);
while (isWeekend(cur)) cur = addDays(cur, -1);
return cur;
}
function firstOpenDay() {
return nextWorkday(LAST_COMPLETED_DATE);
}
function weekWorkdays(monday) {
return [0, 1, 2, 3, 4].map((i) => addDays(monday, i));
}
function weekNeedsSchool(monday) {
return weekWorkdays(monday).some((d) => getDayType(d) === "schule");
}
function feiertagActivityLine(iso) {
const info = getDayInfo(iso);
if (info.type !== "feiertag") return void 0;
return `${info.weekdayLabel} Feiertag`;
}
function typeLabel(type) {
if (type === "betrieb") return "Betrieb";
if (type === "schule") return "Berufsschule";
return "Feiertag";
}
export {
addDays,
feiertagActivityLine,
firstOpenDay,
formatDE,
getDayInfo,
getDayType,
getFriday,
getMonday,
getPublicHoliday,
getWeekNumber,
getYearLabel,
isInSchoolHoliday,
isWeekend,
nextWorkday,
parseISO,
prevWorkday,
toISO,
typeLabel,
weekNeedsSchool,
weekWorkdays
};