// 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 };