Rotatory anlegen: Morning-Meeting-Moderation auslosen und nach Nextcloud schreiben

Express-App mit JSON-Speicher unter VCH_DATA_DIR, Monatskalender mit Fotos,
Personen mit Rollen und Teilzeit-Freitagen, Abwesenheiten, Feiertage je
Bundesland, faire Zufallsauslosung mit Fixieren und Neu-Auslosen.

Nextcloud: CalDAV-Discovery, Zielkalender wählbar, Termine je Werktag
schreiben und aktualisieren, Abwesenheiten aus Kalender importieren,
Personen samt Fotos aus dem Systemadressbuch übernehmen.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
ferdi2goandClaude Fable 5.1 committed 2026-09-16 06:39:37 +00:00
commit 95756778d8
26 files changed
+4697

No files matched your search

+31
View File
@@ -0,0 +1,31 @@
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { easterSunday, germanHolidays } from '../server/holidays.js';
test('Ostersonntag bekannter Jahre', () => {
assert.equal(easterSunday(2024), '2024-03-31');
assert.equal(easterSunday(2025), '2025-04-20');
assert.equal(easterSunday(2026), '2026-04-05');
assert.equal(easterSunday(2027), '2027-03-28');
});
test('bundesweite Feiertage 2026', () => {
const dates = Object.fromEntries(germanHolidays(2026).map((h) => [h.name, h.date]));
assert.equal(dates['Karfreitag'], '2026-04-03');
assert.equal(dates['Ostermontag'], '2026-04-06');
assert.equal(dates['Christi Himmelfahrt'], '2026-05-14');
assert.equal(dates['Pfingstmontag'], '2026-05-25');
assert.equal(dates['Tag der Deutschen Einheit'], '2026-10-03');
assert.equal(Object.keys(dates).length, 9);
assert.ok(!('Fronleichnam' in dates));
});
test('Landesfeiertage nur im passenden Bundesland', () => {
const nw = germanHolidays(2026, 'NW').map((h) => h.name);
assert.ok(nw.includes('Fronleichnam'));
assert.ok(nw.includes('Allerheiligen'));
assert.ok(!nw.includes('Reformationstag'));
const sn = Object.fromEntries(germanHolidays(2026, 'SN').map((h) => [h.name, h.date]));
assert.equal(sn['Buß- und Bettag'], '2026-11-18');
assert.ok('Reformationstag' in sn);
});