Feiertage: Namen und Prüftage im Zeitraum
Neue Exporte feiertagName und feiertageImZeitraum (feiertagejs getHolidays je Jahr,
Namen per translate('de')). Heiligabend, Silvester, Mariä Himmelfahrt in BY und
Fronleichnam in SN/TH (Datum aus RP) sind 'pruefen'; istFeiertag bleibt unverändert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
db9f7df747
commit
2636ce60be
2 files changed
+253
-1
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import { isHoliday } from 'feiertagejs'
|
||||
import { getHolidays, isHoliday } from 'feiertagejs'
|
||||
|
||||
/**
|
||||
* Gesetzliche Feiertage je Bundesland (feiertagejs 1.5.1, Tage als Berliner Kalendertage).
|
||||
@@ -24,3 +24,72 @@ export function istFeiertag(tag, land) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Feiertage mit Namen und „bitte pruefen“ (Oeffnungszeiten live).
|
||||
*
|
||||
* art 'feiertag': gesetzlicher Feiertag des Landes (feiertagejs; in BB auch Oster- und Pfingstsonntag).
|
||||
* art 'pruefen': Tag, den der Kunde selbst bedenken muss, weil er nicht ueberall oder nicht gesetzlich gilt:
|
||||
* Heiligabend, Silvester, Mariae Himmelfahrt in BY (nur oertlich) und Fronleichnam in SN und TH (dort nur
|
||||
* in einzelnen Gemeinden; das Datum kommt aus der RP-Liste). Ist ein solcher Tag im Land zugleich
|
||||
* gesetzlicher Feiertag (Mariae Himmelfahrt im SL, Fronleichnam in RP), bleibt er 'feiertag'.
|
||||
*/
|
||||
|
||||
const PRUEFEN_LAENDER = Object.freeze({
|
||||
MARIAHIMMELFAHRT: Object.freeze(['BY']),
|
||||
})
|
||||
const FRONLEICHNAM_ORTSABHAENGIG = Object.freeze(['SN', 'TH'])
|
||||
|
||||
/** Alle Eintraege eines Kalenderjahres fuer ein (gueltiges) Land, nach Tag sortiert, ein Eintrag je Tag. */
|
||||
function jahresEintraege(jahr, land) {
|
||||
let liste
|
||||
try {
|
||||
liste = getHolidays(jahr, land).map((h) => ({
|
||||
tag: h.dateString,
|
||||
name: h.translate('de'),
|
||||
art: PRUEFEN_LAENDER[h.name]?.includes(land) ? 'pruefen' : 'feiertag',
|
||||
}))
|
||||
if (FRONLEICHNAM_ORTSABHAENGIG.includes(land)) {
|
||||
const rp = getHolidays(jahr, 'RP').find((h) => h.name === 'FRONLEICHNAM')
|
||||
if (rp && !liste.some((e) => e.tag === rp.dateString)) {
|
||||
liste.push({ tag: rp.dateString, name: rp.translate('de'), art: 'pruefen' })
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
return []
|
||||
}
|
||||
const jj = String(jahr).padStart(4, '0')
|
||||
for (const [tag, name] of [[`${jj}-12-24`, 'Heiligabend'], [`${jj}-12-31`, 'Silvester']]) {
|
||||
if (!liste.some((e) => e.tag === tag)) liste.push({ tag, name, art: 'pruefen' })
|
||||
}
|
||||
return liste.sort((a, b) => (a.tag < b.tag ? -1 : a.tag > b.tag ? 1 : 0))
|
||||
}
|
||||
|
||||
/**
|
||||
* Name des gesetzlichen Feiertags (z. B. 'Tag der Deutschen Einheit') oder null.
|
||||
* Nur art 'feiertag': Pruefe-Tage (Heiligabend, Mariae Himmelfahrt in BY, ...) liefert nur feiertageImZeitraum.
|
||||
* (istFeiertag fuehrt Mariae Himmelfahrt in BY weiterhin als Feiertag, das bleibt unveraendert.)
|
||||
* Wirft nie: ungueltiger Tag oder unbekanntes Land ergeben null.
|
||||
*/
|
||||
export function feiertagName(tag, land) {
|
||||
if (typeof tag !== 'string' || !TAG_RE.test(tag) || !BUNDESLAENDER.includes(land)) return null
|
||||
const e = jahresEintraege(Number(tag.slice(0, 4)), land).find((x) => x.tag === tag)
|
||||
return e && e.art === 'feiertag' ? e.name : null
|
||||
}
|
||||
|
||||
/**
|
||||
* Feiertage und Pruefe-Tage von bis (beide 'YYYY-MM-DD', inklusive), sortiert, ueber Jahresgrenzen.
|
||||
* Ergebnis: [{ tag, name, art: 'feiertag' | 'pruefen' }]. Ungueltige Eingaben, unbekanntes Land oder
|
||||
* bis vor von ergeben []. Je Kalenderjahr ein getHolidays-Aufruf (nicht istFeiertag je Tag).
|
||||
*/
|
||||
export function feiertageImZeitraum(von, bis, land) {
|
||||
if (typeof von !== 'string' || typeof bis !== 'string') return []
|
||||
if (!TAG_RE.test(von) || !TAG_RE.test(bis) || von > bis || !BUNDESLAENDER.includes(land)) return []
|
||||
const ergebnis = []
|
||||
for (let jahr = Number(von.slice(0, 4)); jahr <= Number(bis.slice(0, 4)); jahr += 1) {
|
||||
for (const e of jahresEintraege(jahr, land)) {
|
||||
if (e.tag >= von && e.tag <= bis) ergebnis.push(e)
|
||||
}
|
||||
}
|
||||
return ergebnis
|
||||
}
|
||||
Reference in new issue
Block a user