181 lines
5.3 KiB
JavaScript
181 lines
5.3 KiB
JavaScript
// 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
|
|
};
|