Jump to content

Public Holidays (in Germany, incl. Federal States)


Tom Wellige
 Share


Recommended Posts

Heute ist mir aufgefallen, dass das Skript festlegt, dass das Bundesland Sachsen einen neuen Feiertag, nämlich Fronleichnam dazubekommt ;) 

 

Jedenfalls ist das im Abschnitt Fronleichnam so definiert:

    case Fronleichnam            
      if (nFederalState and (vb_FS_BW or vb_FS_BY or vb_FS_HE or vb_FS_NW or vb_FS_RP or vb_FS_SL or vb_FS_SN or vb_FS_TH)) then bReturn = True        

 

Ich habe das mal korrigiert (auch wenn ich natürlich weiß das dieses Forum nicht mehr aktuell ist, wollte ich die Info so nicht stehen lassen.

 

Außerdem hat Berlin seit diesem Jahr mit dem 8.3. einen neuen Feiertag (Weltfrauentag) - Den habe ich ebenfalls ergänzt, bin mir aber nicht sicher ob ich den korrekt ergänzt habe, wäre schön wenn du da nochmal drüber schauen könntest.

feiertage-vb.txt

 

 

Viele Grüße aus Berlin!

Fabian

Link to comment
Share on other sites


  • 2 months later...
On 6/20/2019 at 2:18 PM, Fabian L said:

Außerdem hat Berlin seit diesem Jahr mit dem 8.3. einen neuen Feiertag (Weltfrauentag) - Den habe ich ebenfalls ergänzt, bin mir aber nicht sicher ob ich den korrekt ergänzt habe, wäre schön wenn du da nochmal drüber schauen könntest.

 

Hi Fabian,

 

danke für die Erweiterungen/Fixes. Das mit dem Weltfrauentag ist richtig implementiert. Ich habe die Änderungen in den ersten Post in diesem Topic übernommen.

 

Viele Grüße, Tom.

 

Link to comment
Share on other sites


  • 2 months later...

Habe gerade die Funktion für den Reformationstag angepasst. In Bremen, Hamburg, Niedersachen und Schleswig-Holstein wird er nun auch als solcher erkannt.

 

Ausserdem habe ich den reinen Skriptcode aus dem Post entfernt und ihn statt dessen in einer Textdatei eingefügt, für die nun ein Downloadlink vorhanden ist.

 

Wie immer findet man alles notwendige im ersten Post in diesem Topic.

 

Link to comment
Share on other sites


  • 1 month later...

Hallo zusammen,

 

vielen Dank für das Skript - bin leider erst heute darüber gestolpert, nachdem ein Kunde das in genau dieser Form angefragt hat.

Ich habe parallel bei Swyx vorgeschlagen, diese Funktion offiziell mit aufzunehmen (soweit der Urheber damit einverstanden ist), dann würde sie global zur Verfügung stehen und könnte ggf. durch Swyx-Updates mit aktualisiert werden.

Link to comment
Share on other sites


  • 4 weeks later...

Hallo allerseits,

 

das Skript funktioniert wie erwartet wunderbar!

Mir ist noch ein Fall eingefallen, der bisher noch nicht berücksichtigt ist: Augsburg hat im Unterschied zum restlichen Bayern noch zusätzlich den 8.8. als gesetzlichen Feiertag (Friedensfest) - vielleicht kann das ja auch noch mit eingebaut werden...

Link to comment
Share on other sites


Ich habe gerade folgende Erweiteurngen am Skript vorgenommen:

  • Befreiungstag (08.05.) für Berlin hinzugefügt
  • Friedensfest (08.08.) und neues "Bundesland" für Augsburg (vb_FS_AU) hinzugefügt
  • Weltkindertag (20.09.) für Thüringen hinzugefügt

 

Das "Bundesland" Augsburg enthält nur das Friedensfest, d.h. man muss in Augsburg auf Bayern und Augsburg prüfen:

  • vb_FS_BY or vb_FS_AU
  • vb_FS_BYMH or vb_FS_AU

 

Wie immer findet man alles notwendige im ersten Post in diesem Topic.

 

Link to comment
Share on other sites


  • 1 year later...

Hallo Tom,

 

ich hätte da nochmal ein Feature Request - mal schauen, was du dazu sagst:

Manchmal wäre es super, wenn man als Rückgabewert nicht nur "true/false" hätte, sondern um welchen Feiertag es sich handelt. Dann könnte man z.B. spezifischere Ansagen für Ostern vs. Weihnachten verwenden.

Um bestehende Skripte nicht ändern zu müssen, die auf True/False warten, könnte ja evtl. eine Variable außerhalb der Funktion verwendet werden (die dann natürlich vorher deklariert werden müsste)

Link to comment
Share on other sites


Das ist im Prinzip keine schlechte Idee. Allerdings würde ich die vorhandene Funktion nicht ändern wollen. Dabei müssten dann zuviele Leute ihre Skripte anpassen.

 

Ich würde das über einer weitere Funktion lösen: GetPublicHolidayDE

 

Dim nPublicHoliday
nPublicHoliday = 0

If IsPublicHolidayDE(vb_FS_NW, "") Then
	nPublicHoliday = GetPublicHolidayDE(vb_FS_NW, "")
End If

If nPublicHoliday <> 0 Then
	' announce the public holiday here
End If

 

So eine Funktion GetPublicHolidayDE sollte schnell zu implementieren sein. Mal gucken, vielleicht ist das was fürs kommende Wochenende.

 

Link to comment
Share on other sites


  • Most Valued User

Hallo,

 

ich hatte das mal für einen Kunden gebraucht. Der wollte für Weihnachten und Ostern andere Ansagen haben.

Ich habe einfach den Rückgabewert angepasst und die Ausgänge entsprechend des Werts belegt.

Hier mein Script, ich müsste es bei Gelegenheit mal auf die aktuellste Version anpassen

' Federal States of Germany
const vb_FS_BW = 1       ' Baden-Württemberg
const vb_FS_BY = 2       ' Bayern
const vb_FS_BE = 4       ' Berlin
const vb_FS_BB = 8       ' Brandenburg
const vb_FS_HB = 16      ' Bremen
const vb_FS_HH = 32      ' Hamburg
const vb_FS_HE = 64      ' Hessen
const vb_FS_MV = 128     ' Mecklenburg-Vorpommern
const vb_FS_NI = 256     ' Niedersachsen
const vb_FS_NW = 512     ' Nordrhein-Westfalen
const vb_FS_RP = 1024    ' Rheinland-Pfalz
const vb_FS_SL = 2048    ' Saarland
const vb_FS_SN = 4096    ' Sachsen
const vb_FS_ST = 8192    ' Sachen-Anhalt
const vb_FS_SH = 16384   ' Schleswig-Holstein
const vb_FS_TH = 32768   ' Thüringen
const vb_FS_KD = 65536   ' Köln/Düsseldorf (Rosenmontag)




''-------------------------------------------------------------------
'' Name:     IsPublicHoliday 
''           ===============
'' 
'' Returns 1,2 or 3 if the given date is a public holiday in the given German federal state.
'' Multiple federal states can be combined with "OR"
''
'' Parameter:
''   nFederalState     single or combination of federal states
''   vCheckDate        vbscript date to check (e.g. as returned by now) or "" (for current date)
''
'' Returns:
''   Int        0 = ist kein Feiertag
''				1 = ist Feiertag
''				2 = ist Ostern
''				3 = ist Weihnahten
''				UseExit = IsPublicHoliday(vb_FS_HE, "") 
''				Im VB-Block die Ausgänge entsprechend belegen
''--------------------------------------------------------------------
Function IsPublicHoliday ( nFederalState, vCheckDate )


    On Error Resume Next


    PBXScript.OutputTrace "-------> IsPublicHoliday"
    PBXScript.OutputTrace "nFederalState = " & nFederalState
    PBXScript.OutputTrace "vCheckDate = " & vCheckDate


    Dim bReturn
    bReturn = 0


    Dim a, b, c, d, e, f
    Dim nTempYear, vTempDate
    Dim Neujahr, Erscheinungsfest, Karfreitag, Ostersonntag, Ostermontag
    Dim Maifeiertag, Rosenmontag, ChrHimmelfahrt, Pfingstmontag, Fronleichnam
    Dim MarieaHimmelfahrt, Tagdereinheit, Reformationstag, Allerheiligen
    Dim BussUndBettag, Weihnachten1, Weihnachten2 


    if Not IsDate(vCheckDate) then
        vCheckDate = Now
    end if
    vTempDate = DateSerial(Year(vCheckDate), Month(vCheckDate), Day(vCheckDate))
    nTempYear = Year(vTempDate)


    PBXScript.OutputTrace "Using nTempYear = " & nTempYear
    PBXScript.OutputTrace "Using vTempDate = " & vTempDate
          
    ' Gauss Formular
    a = nTempYear Mod 19
    b = nTempYear \ 100
    c = (8 * b + 13) \ 25 - 2
    d = b - (nTempYear \ 400) - 2
    e = (19 * (nTempYear Mod 19) + ((15 - c + d) Mod 30)) Mod 30
    If e = 28 Then
        If a > 10 Then
            e = 27
        End If
    ElseIf e = 29 Then
        e = 28
    End If
    f = (d + 6 * e + 2 * (nTempYear Mod 4) + 4 * (nTempYear Mod 7) + 6) Mod 7


    ' Calculate public holidays
    Neujahr           = DateSerial(nTempYear, 1, 1)
    Erscheinungsfest  = DateSerial(nTempYear, 1, 6)
    Ostersonntag      = DateSerial(nTempYear, 3, e + f + 22)
    Rosenmontag       = DateSerial(nTempYear, 3, e + f + 22 - 48)
    Karfreitag        = DateSerial(nTempYear, 3, e + f + 22 - 2)
    Ostermontag       = DateSerial(nTempYear, 3, e + f + 22 + 1)
    Maifeiertag       = DateSerial(nTempYear, 5, 1)
    ChrHimmelfahrt    = DateSerial(nTempYear, 3, e + f + 22 + 39)
    Pfingstmontag     = DateSerial(nTempYear, 3, e + f + 22 + 50)
    Fronleichnam      = DateSerial(nTempYear, 3, e + f + 22 + 60)
    MarieaHimmelfahrt = DateSerial(nTempYear, 8, 15) 
    Tagdereinheit     = DateSerial(nTempYear, 10, 3) 
    Reformationstag   = DateSerial(nTempYear, 10, 31) 
    Allerheiligen     = DateSerial(nTempYear, 11, 1) 
    BussUndBettag     = DateSerial(nTempYear, 12, 25) - Weekday(DateSerial(nTempYear, 12, 25), vbMonday) - 4 * 7 - vbWednesday 
    Weihnachten1      = DateSerial(nTempYear, 12, 25)
    Weihnachten2      = DateSerial(nTempYear, 12, 26)


    ' Is public holiday?
    select case vTempDate
        case Neujahr
            bReturn = 1
        case Erscheinungsfest
            if (nFederalState and (vb_FS_BW or vb_FS_BY or vb_FS_ST)) then bReturn = 1
        case Ostersonntag
            bReturn = 2
        Case Rosenmontag
            If(nFederalState and (vb_FS_KD)) then bReturn = 1
        case Karfreitag
            bReturn = 2
        case Ostermontag
            bReturn = 2
        case Maifeiertag
            bReturn = 1
        case ChrHimmelfahrt
            bReturn = 1
        case Pfingstmontag
            bReturn = 1
        case Fronleichnam
            if (nFederalState and (vb_FS_BW or vb_FS_BY or vb_FS_HE or vb_FS_NW or vb_FS_RP or vb_FS_SL or vb_FS_SN or vb_FS_TH)) then bReturn = 1
        case MarieaHimmelfahrt
            if (nFederalState and (vb_FS_BY or vb_FS_SL)) then bReturn = 1
        case Tagdereinheit
            bReturn = 1
        case Reformationstag
            if (nFederalState and (vb_FS_BB or vb_FS_MV or vb_FS_SN or vb_FS_ST or vb_FS_TH)) then bReturn = 1
        case Allerheiligen
            if (nFederalState and (vb_FS_BW or vb_FS_BY or vb_FS_NW or vb_FS_RP or vb_FS_SL)) then bReturn = 1
        case BussUndBettag
            if (nFederalState and (vb_FS_SN)) then bReturn = 1
        case Weihnachten1
            bReturn = 3
        case Weihnachten2
            bReturn = 3
    end select


    IsPublicHoliday = bReturn


    PBXScript.OutputTrace "bReturn = " & bReturn
    PBXScript.OutputTrace "<------- IsPublicHoliday"


End Function

 

Link to comment
Share on other sites


  • 2 weeks later...
  • 6 months later...

Ich hab mich heute auch mal daran getraut aber bin zumindest doch dran gescheitert.

 

Was ich eigentlich bei dem Kunden durchsetzt haben muss ist nur die Feiertage für NRW und dass dann immer einfach die selbe AB Ansage kommt, sowie danach auf den AB landet.

 

Also eigentlich möchte ich das nur wie folgt umgesetzt haben

 

Ist heute Feiertag in NRW -> Ja oder Nein

Wenn JA -> Spiele Ansage ab -> BEEP -> Nachricht aufnehmen -> versenden

Wenn NEIN -> überspringe diese Regel und fahre mit den Callrouting fort.

 

Sprich es sieht aktuell so aus.

image.png.e600306a2ceb64149bf178daaeb19167.png

 

Nur ich vermute mal das ich meine Überprüfen Variable falsch gemacht habe oder die Ausgabe vom VBCode.

Ist leider für jemanden der noch nicht mit dem GSE aktiv gearbeitet hatte sehr doof am Anfang geschrieben.

Oder hat jemand vielleicht ein GSE Script wo man sich das eben mit anschauen könnte wie sowas aufgebaut werden könnte.

Link to comment
Share on other sites


Hallo Dennis,

 

prinzipiell sieht das schon fast nicht schlecht aus. Allerdings wird das bei dir nur aufgezeichnet, aber nix verschickt. Entweder brauchst du nach der Aufzeichnung noch ein "Mail versenden" oder du ersetzt das alles (AB, beep, Aufzeichnung, Versenden) durch einen "Voicemail"-Block.

Was steht denn in dem VB-Block und in dem Überprüfen-Block?

 

Ich packe die VB-Funktion immer in den Start-Block; die Überprüfung ist dann einfach nur noch "IsPublicHolidayDE(vb_FS_BW,now)" mit den Ausgängen WAHR und FALSCH

Link to comment
Share on other sites


Hallo Mathias,

 

ja die ersten Versuche sind da noch etwas schwierig wenn man nur den Regelassistenten kennt. Vorallem ist dann eben auch den richtigen Punkt am Anfang finden auch die Kunst. Vorallem findet man per "rechts" Klick nicht alles was oben wieder ist.

 

Also im Prinzip ist bei Parameter, das Script was Tom Anfang zum download verlinkt hat drinne. 

image.png.a39b8995bd1bcdd05354206d1931f282.png

Folgend bei Verbindungen

image.png.57876759a54f6b9577b4c1cac1136c78.png

 

Bei dem überprüfen Block sieht es wie folgt aus

image.png.e4217b3eaaaf111e5fa1b8bd21d52a87.png

image.png.7828bb429b8a597c2b7ae5637cea085e.png

 

Sonst falls es hilft kann ich die GSE Datei mal anhängen aber ich denke mal eigentlich ist die Regel recht Human und sollte einfach setzen zu sein.

Lustiger wird es wenn der Kunde Wünsche hat wie z.B. Weihnachten die Ansage zu Ostern dieses usw.

Aber ich denke mal wenn man verstanden hat wie ich dieses "auswerte" sollte auch die Funktion einfacher klappen.

Nur ich kann bisher sagen ich bin jemand der die Scripte so gut wie möglich gemieden hat oder schon teils auf fertige GSE Scripte zurück gegriffen hatte.

 

Link to comment
Share on other sites


Hallo Dennis,

 

wie weit läuft dein Skript denn bzw. wo ist das Problem?

Ich könnte mir evtl. vorstellen, wo was nicht passen könnte (bin aber nicht sicher, ggf. muss mich Tom dann da korrigieren 🙂😞

 

Du hast die Funktion in dem VB-Block - ist da am Ende der Vorgabewert (UseExit = 0) auch noch vorhanden oder steht da NUR die Funktion drin?

Wenn das UseExit fehlt, weiß das Skript nicht, welchen Ausgang es verwenden soll (Vorgabe entspricht "0"). Dann hast du zwar noch die Funktion definiert, aber danach ist Ende.

Deshalb: wirf den VB-Block weg und packe die Funktion in den Start-Block (Reiter Parameter), dann steht die dem gesamten Skript zur Verfügung. Ich denke, dann passt das.

 

(und ich meine wirklich WEGWERFEN. Wenn der VB-Block parallel vorhanden ist, wird der Code trotzdem gelesen, was zu einer doppelten Funktionsdefinition und damit zum Fehler führt)

 

Hilfreich ist dann beim Testen auch das Ereignis-Protokoll (Anwendungsprotokolle - Swyxware), da stehen VB-Fehler drin.

 

Kannst das GSE-Skript ja mal mit anhängen...

 

 

PS: das mit den unterschiedlichen Ausgängen für unterschiedliche Feiertage hab ich oben schonmal angeregt - vielleicht findet Tom da ja mal Zeit dafür 🙂

Link to comment
Share on other sites


Hallo Mathias,

 

mein Problem am Ende war, dass der Kunde erstmal gar keine Anrufe mehr bekommen hatte. Im CDR konnte ich auch nur "CallRoutingFailed" nach lesen. Aber gut wenn ich ja dem VB-Block nur das Script gebe aber er nicht weiß was er raus bzw. wo er es rausgeben soll klingt es dann wieder logisch warum der Fehler kam.

 

Ich habs mal wirklich wie du geschrieben hast in den Start geworden.

Hab jetzt das GSE auch mal angehangen.

 

In der Ereignissanzeige ist dort nur folgendes

image.png.d76aaa5bff08a97c5579ad5d97a4a35a.png

Feiertag NRW.rse

Link to comment
Share on other sites


Hi,

 

hmmmm - bei mir funktioniert das Skript, wenn ich es importiere...

Hat der Benutzer noch weitere Regeln außer den drei Standards und dieser?

 

Hintergrund: beim Ändern von irgendwelchen CR-Regeln wird aus diesen eine einzige callrouting.vbs generiert, durch die dann alle Rufe laufen. Wenn du jetzt also nen VBS-Fehler bekommst, das Skript aber bei meinem Test-User funktioniert, kann es eigentlich nur sein, dass in einer anderen Regel ein Fehler ist.

 

Importier' es doch mal testweise bei einem neuen Benutzer...

 

Sonst bleibt nur noch, das Server-Trace zu untersuchen (%programdata%\swyx\traces\Ippbxsrv-20211103-xxxx.log)

Link to comment
Share on other sites


Hi,

 

also das ist ist ja jetzt die Datei gewesen, die ich so angepasst hatte wie du geschrieben hast.

Ich denke auch mal, dass es nun funktioniert.

Ja in der Tat hat der Kunde noch mehrere Regeln. Diese wären in folgender Reihenfolge:

Backlistcheck

Mitarbeiter die immer durchkommen sollen trotz AB

Feiertage (aktuell noch deaktiviert)

AB Mo-DO

AB FR

AB Wochenende

DND an Dienstleister MO-DO

DND an Dienstleister FR

Zentrale an Zentraluser

Auflegen nach 40 Sekunden

 

Bei den Regeln handelt es sich eigentlich um recht simple Regeln.

Die Regel "an Dienstleister" ist wenn sich keiner mehr im Büro findet wird das Yealink Telefon auf DND gesetzt und innerhalb der Geschäftszeiten auf den Dienstleister umgeleitet.

 

Meinen offiziellen Test beim Kunden kann ich leider erst am Freitag machen, gestern war ja damit die ganze Telefonie von extern damit lahm gelegt.

Sobald dieses klappt melde ich mich nochmal aber so hätte jemand aber auch so schon etwas fertiges zum direkt importieren :)

Link to comment
Share on other sites


Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use and have taken note of our Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.