Jährlich freie und Feiertage mit manuellen Kalendereinträgen anpassen
Ich wollte vermeiden, im hauseigenen Dialplan jährlich in einem Kalender per Aktionsbedinung händisch alle Feiertage eintragen zu müssen. Feste Feiertage, z.B. Tag der deutschen Einheit, lassen sich in einem Zeitschema abbilden, osternabhängige Feier-/Tage (neben Ostern, Pfingsten, Christi Himmelfahrt, Fronleichnam fällt darunter z.B. auch Karneval) variieren jedes Jahr.
Vielleicht ist folgender Vorschlag für einige von Euch von Interesse. Ich habe ihn für diverse Jahre getestet. Da ich nicht völlig sattelfest in Asterisk Dialplan bzw. der Einbindung von Skripten bin, sind Eure Tests, mögliche Korrekturen und Stellungnahmen sehr willkommen.
Lösung per Skript
Folgendes Skript ermittelt anhand des aktuellen Datums die in NRW relevanten Feiertage mit Osternbezug. Ergänzt habe ich für NRW zusätzlich geltende, fixe Feiertage einschließlich Heilig Abend und Silvester. Anpassungen sollten einfach möglich sein (Hinweise im Quelltext).
; ┌─────────────────────────────────────────────────────┐
; │ Variable/osternabhängige Feiertage │
; │ v1.1 12.02.2026 (W) Martin Althaus │
; │ --------------------------------------------------- │
; │ Osterformel von Gauß/Lichtenberg │
; │ Easter algorithm by Gauß/Lichtenberg │
; │ https://de.wikipedia.org/wiki/Gaußsche_Osterformel │
; │ --------------------------------------------------- │
; │ kf → Karfreitag │ ps → Pfingstsonntag │
; │ os → Ostersonntag │ pm → Pfingstmontag │
; │ om → Ostermontag │ fl → Fronleichnam │
; │ ch → Christi Himmelfahrt │ │
; │ --------------------------------------------------- │
; │ a → Mondparameter │
; │ d → Keim erster Frühlingsvollmond │
; │ k → Säkularzahl │
; │ m → Säkulare Mondschaltung │
; │ mz → Unix-Zeitstempel für 1. März im aktuellen Jahr │
; │ oe → Osterentfernung │
; │ og → Ostergrenze │
; │ ot → Ostersonntag als Märztag │
; │ oz → Unix-Zeitstempel Ostern │
; │ r → Kalendarische Korrekturgröße │
; │ s → Säkulare Sonnenschaltung │
; │ sz → erster Märzsonntag │
; │ --------------------------------------------------- │
; │ Oster-/Pfingstsonntag sind immer WE/keine genrellen │
; │ Arbeitstage, vollständigkeitshalber aber belassen │
; └─────────────────────────────────────────────────────┘
exten => s,1,Set(heute=${STRFTIME(${EPOCH},,%Y-%m-%d)})
same => n,Set(x=${STRFTIME(${EPOCH},,%Y)})
same => n,Set(monat=${STRFTIME(${EPOCH},,%m)})
same => n,Set(tag=${STRFTIME(${EPOCH},,%d)})
same => n,Set(a=${MATH(${x}%19,int)}
same => n,Set(k=${MATH(${x}/100,i)})
same => n,Set(m=$[15 + ${MATH($[3 * ${k} + 3]/4,i)} - ${MATH($[8 * ${k} + 13]/25,i)}])
same => n,Set(d=${MATH($[19 * ${a} + ${m}]%30,i)})
same => n,Set(s=$[2 - ${MATH($[3 * ${k} + 3]/4,i)}])
same => n,Set(r=$[${d} + ${MATH(${a}/11,i)}]
same => n,Set(r=${MATH(${r}/29,i)})
same => n,Set(og=$[21 + ${d} - ${r}])
same => n,Set(sz=$[${x} + ${MATH(${x}/4,i)} + ${s}])
same => n,Set(sz=$[7 - ${MATH(${sz}%7,i)}])
same => n,Set(oe=$[7 - ${MATH($[${og} - ${sz}]%7,i)}])
same => n,Set(ot=$[${og} + ${oe}])
same => n,Set(mz=${STRPTIME(${x}-03-01,,%Y-%m-%d)}
same => n,Set(oz=$[${mz} + 86400 * $[${ot} - 1]])
same => n,Set(kf=$[${oz} - 86400 * 2])
same => n,Set(om=$[${oz} + 86400 * 1])
same => n,Set(ch=$[${oz} + 86400 * 39])
same => n,Set(ps=$[${oz} + 86400 * 49])
same => n,Set(pm=$[${oz} + 86400 * 50])
same => n,Set(fl=$[${oz} + 86400 * 60])
same => n,Set(kf=${STRFTIME("${kf}",,%Y-%m-%d)})
same => n,Set(os=${STRFTIME("${oz}",,%Y-%m-%d)})
same => n,Set(om=${STRFTIME("${om}",,%Y-%m-%d)})
same => n,Set(ch=${STRFTIME("${ch}",,%Y-%m-%d)})
same => n,Set(ps=${STRFTIME("${ps}",,%Y-%m-%d)})
same => n,Set(pm=${STRFTIME("${pm}",,%Y-%m-%d)})
same => n,Set(fl=${STRFTIME("${fl}",,%Y-%m-%d)})
; ┌──────────────────────────────────┐
; │ Feste freie oder Feiertage (NRW) │
; │ -------------------------------- │
; │ 01.01. Neujahr │
; │ 01.05. Tag der Arbeit │
; │ 03.10. Tag der deutschen Einheit │
; │ 01.11. Allerheiligen │
; │ 24.12. Heiligabend │
; │ 25.12. 1. Weihnachtstag │
; │ 26.12. 2. Weihnachtstag │
; │ 31.12. Silvester │
; └──────────────────────────────────┘
; ▼▼▼ ggf. freie Tage anpassen, Format ${x}-mm-dd (${x} enthält akutelles Jahr)
same => n,Set(fix=${x}-01-01,${x}-05-01,${x}-10-03,${x}-11-01,${x}-12-24,${x}-12-25,${x}-12-26,${x}-12-31 ;
same => n,Set(alle=${fix},$kf,$om,$ch,$pm,$fl)
; ┌──────────────────────────────────┐
; │ Heute frei oder Feiertag? │
; └──────────────────────────────────┘
same => n,Set(i=1)
same => n,While($["${CUT(alle,\,,${i})}" != ""])
same => n,Set(pruefe=${CUT(alle,\,,${i})})
same => n,GotoIf($["${pruefe}" = "${heute}"]?treffer)
same => n,Set(i=$[${i} + 1])
same => n,EndWhile()
same => n,Goto(ende)
; ▼▼▼ ggf. MDC_LABEL-1 an eigene Label anpassen, wird FT, wenn freier/Feiertag
same => n(treffer),Set(MDC_LABEL-1=FT)
; ▼▼▼ ggf. MDC_LABEL-1 an eigene Label anpassen, wird 0, wenn nicht frei
same => n(ende),Set(MDC_LABEL-1=0)
same => n,Return()