Geschäftszeiten basierend auf Kalenderwoche

lowly

Free User
Mitglied seit
23. September 2023
Beiträge
7
Hallo,

wir benutzen bei unserer Telefonanlage zwei unterschiedliche Rufnummern zu unterschiedlichen Schichten (=Zwei Unternehmen im selben Haus, eine Telefonanlage). Ich suche nach einer Möglichkeit, das mit 3CX zu automatisieren. Bisher wurde das bei unserer alten Octopus Anlage über eine Nachtschaltung etc. gelöst. Bei 3CX kann man das manuell so lösen, dass zwei IP Telefone für die zwei Rufnummern vorhanden sind und dann immer manuell ihren Status von Anwesend auf Abwesend ändern etc...soweit ich das zumindest lösen konnte.

Automatisierbar scheint das nur über den Call Flow Designer zu sein, aber ich stehe dort auf dem Schlauch:

Im CFD müsste es möglich sein, dass ein Skript prüft ob eine Kalenderwoche gerade oder ungerade ist. Dann müsste eine Bedingung erstellt werden, die bei gerade: Geschäftszeiten a annimmt und bei b geschlossen anzeigt.

Hat das hier schon mal jemand so gemacht? Oder denke ich da zu kompliziert?

Danke euch!
 
Hallo @lowly
Oder denke ich da zu kompliziert?
Kann sein.

Deine Beschreibung des gewünschten Szenario ist nicht konkret genug. Die Fragen sind:
  1. Nach welchem Zeitplan soll eingehend umgeschalten werden? Zu festen Zeiten täglich, jede Woche oder irgendwie sonst?
  2. Soll es eine Möglichkeit geben, auch manuell umschalten zu können?
  3. Geht es nur um eingehende Anrufe die anders auflaufen sollen (Annahme oder IVR/AB) oder auch um ausgehende Anrufe mit einer Änderung der ausgehenden Nummer aller Telefonate?
Es muss nicht gleich immer eine CFA sein. Eine 3CX bietet mehrere verschiedene Möglichkeiten von Zeitautomatiken mit Bordmitteln an.
Bei 3CX kann man das manuell so lösen, dass zwei IP Telefone für die zwei Rufnummern vorhanden sind und dann immer manuell ihren Status von Anwesend auf Abwesend ändern etc...soweit ich das zumindest lösen konnte.
Auch das geht mit 3CX Bordmitteln zu automatisieren.
 
  • Like
Reaktionen: lowly
Hallo fxbastler und vielen Dank für deine Antwort!

Zu 1: Nach welchem Zeitplan soll eingehend umgeschalten werden? Zu festen Zeiten täglich, jede Woche oder irgendwie sonst?

Die Zeiten sind fest und sehen wie folgt aus:
- Gerade Kalenderwoche Rufnummer A (07:00-14:00), Ungerade Kalenderwoche Rufnummer A (14-20 Uhr).
- Gerade Kalenderwoche Rufnummer B (14-20 Uhr), Ungerade Kalenderwoche Rufnummer B (07:00-14 Uhr).

Außerhalb dieser jeweiligen Zeiten soll für Rufnummer A und B Ansagen laufen (also ein IVR z.B., der sagt: In dieser Woche sind wir von 07-14 Uhr erreichbar etc...). Dazu Ansage am Wochenende: Am Montag sind wir für Sie ab 07:00 erreichbar etc...

Zu 2: Soll es eine Möglichkeit geben, auch manuell umschalten zu können?
Ja, z.B. wenn an einem Brückentag geschlossen wird, möchten wir manuell eine der Rufnummern oder beide (es muss getrennt voneinander gehen, also nicht ganze 3CX in "außerhalb der Geschäftszeiten" schalten

Zu 3: Geht es nur um eingehende Anrufe die anders auflaufen sollen (Annahme oder IVR/AB) oder auch um ausgehende Anrufe mit einer Änderung der ausgehenden Nummer aller Telefonate?
Es geht nur um eingehende Anrufe :)

Ich hoffe das hilft weiter. Es würde theoretisch reichen wenn man per Kurzwahlbefehl eine Eingangsrufnummer auf "Gerade KW Ansage", "Ungerade KW Ansage", "Wochenende Ansage etc" schalten könnte.

Vielen Dank nochmal!
 
Die Anforderungen schreien förmlich nach einer CFA. Mit Bordmitteln macht das nicht wirklich Spaß soetwas zu konfigurieren.
 
Wegen der wochenweisen Umschaltung: das lässt sich automatisch, mit 3CX Bordmitteln und ohne fremde Hilfe soweit ich weiss gar nicht einrichten. Eventuell über die Funktion der Feiertage für jedes Jahr, aber elegant sieht ganz anders aus.

Für die CFA wird ein C# Schnipsel (z.B. namens GetISOWeek) gebraucht, was die akt. Woche des Jahres zurückgibt:
C#:
return System.Globalization.ISOWeek.GetWeekOfYear(DateTime.Now);
und eine Prüfung ob gerade oder ungerade Woche ist per Condition
EQUAL(TO_STRING(MULTIPLY(DIVIDE(GetISOWeek.ReturnValue,2),2)),GetISOWeek.ReturnValue) usw. usf..

Aber Achtung: eine CFA nimmt einen eingehenden Anruf immer an. Wenn die CFA an einen IVR oder eine Warteschleife weiterleitet ist das kein Problem. Soll der Anruf aber direkt an ein Endgerät oder eine Signalisierungsgruppe erfolgen, dann sollte man das bedenken und den Anrufenden entspr. durch die CFA unterhalten oder MOH anpassen.
 
  • Like
Reaktionen: lowly
Hallo fxbastler, vielen Dank!

Ich habe mich an den CFD gesetzt und zusätzlich noch weiter gegoogelt etc. Ich bin soweit gekommen, dass ich meinen Call Flow designed habe, aber er funktioniert nicht XD. Ein eingehender Anruf wird in unmittelbar beendet. Wahrscheinlich habe ich nur eine Kleinigkeit übersehen:

1. Ich habe den C# Schnipsel erstellt:

Screenshot 2023-09-28 225357.png



2. Dann habe ich eine Condition erstellt mit deinem Vorschlag "EQUAL(TO_STRING(MULTIPLY(DIVIDE(GetISOWeek.ReturnValue,2),2)),GetISOWeek.ReturnValue)", das wird auch vom CFD in meinen Augen korrekt übersetzt: Dividiere den Wert aus Get Iso Week durch 2 und wenn das gerade ist: True.

Screenshot 2023-09-28 225415.png


3. So sieht der gesamte Call Flow aus:

Links ist wenn Iso Week gerade ist. Date Time Condition ist dann jeweils 07:30 - 13:00 auf der linken Seite mit Weiterleitung an Warteschlage und im anderen Fall (rechter Weg auf der linken seite) Weiterleitung an IVR. Dann rechts der umgekehrte Fall.

Screenshot 2023-09-28 225333.png


Soweit erscheint das für mich logisch, aber wenn ich dann dem SIP Trunk diesen Call Flow zuweise (er wird fehlerfrei in 3CX kompiliert), kommt es zu dem Resultat, dass der Anruf unmittelbar beendet wird.

Stehe nun leider ein bisschen auf dem Schlauch...der Rest war ziemlich gut mit den Manuals und dem tollen Forum hier zu konfigurieren aber C# und der Call Flow Designer sind eine andere Hausnummer :)

Hast du eine Idee was ich da übersehe? Danke und viele Grüße!
 
Ich habe den C# Schnipsel erstellt:
Bitte als GetISOWeek benennen.

Dann habe ich eine Condition erstellt mit deinem Vorschlag ... : Dividiere den Wert aus Get Iso Week durch 2 und wenn das gerade ist: True
Nicht ganz. Die CFA rechnet an dieser Stelle mit Ganzzahlen. Um festzustellen, ob es eine gerade Woche ist, wird die Wochenzahl durch zwei dividiert (dabei automatisch gerundet falls nötig, das ist der 'Trick', geht eben nicht anders), mit zwei multipliziert und wieder mit der Wochenzahl verglichen. Stimmen beide überein, ist es eine gerade Woche, andernfalls eine ungerade.

Hast du eine Idee was ich da übersehe?
Laut deinem Bild: grundsätzlich nichts. Ohne Code kann man es eben nicht kontrollieren. Wenn nicht transferiert wird, dann ist laut deiner Beschreibung und den Bildern vmtl. die DateTimeCondition nicht richtig. Es sollte laut deinem Ablauf wohl immer transferiert werden.

Mein Tip: benutze den CFD Baustein Logger mit dem Level Error, lasse die gesamte Zeit eine ssh Verbindung zu der 3CX laufen und überwache in dieser mittels
tail -f /var/lib/3cxpbx/Instance1/Data/Logs/3CXCallFlow.log das CallFlow Protokoll.

Noch ein Hinweis. Ich würde vmtl. eine globale Variable in der CFA verwenden, siehe hier:
Ich muss gestehen, ich benutze und setze i.d.R. die Variablen nicht im Callflow sondern im ganzen Projekt (eine Etage darüber).
Die hält die Nummer zu der transferiert werden soll. Dann am Ende der CFA nur einen einzelnen Transfer Block zum Inhalt der Variable setzen. Das wird dann auch immer ausgeführt. Das kann man auch schön im Log verfolgen. Das ist flexibler für eine mögliche Erweiterung, z.B. eine manuelle Übersteuerung.

Thema manuelle Übersteuerung: baue ganz zu Anfang eine Abfrage der Länge der NSt. der Anlage ein (3CX Global Property ENL), überprüfe wer anruft, wenn interner Anruf (Länge der anrufenden Nr. in session.ani = Länge der NSt. der 3CX) dann sage an was aktuell gesetzt ist (automatik, firma1, firma2, nachtzeit), frage ab was gesetzt werden soll, definiere eine globale Variable in der 3CX (neu, nur für diese CFA) und setze deren Inhalt. Damit ist die Übersteuerung gespeichert oder steht eben auf Automatik. Diese Variable in den normalen eingehenden Anrufen vorher abfragen und wenn da etwas drin steht, dann die Übersteuerung nutzen und ausführen:
1695979501719.png
 
Zuletzt bearbeitet:
  • Like
Reaktionen: lowly
fxbastler, vielen herzlichen Dank für deine Hilfe. Der mein Fehler war, dass ich eine Zeitlücke bei den Date Time Conditions hatte, in der gar keine Zeitspanne konfiguriert war. Es funktioniert nun alles. Nochmals danke für deine Hilfe.

Ich habe noch eine extra Bedingung für irregulär geschlossene Tage eingefügt, die direkt am Anfang des Call Flows das Datum abgreift.

Das ganze sieht nun so aus:

Screenshot 2023-09-30 173049.png

Ich habe außerdem den Call Flow als Datei hier angehängt damit das allen zur Verfügung steht. Ich gebe zu Bedenken dass ich das als Laie Anhand der Hilfe von fxbastler und diesem Forum erstellt habe - ob es bei euch funktioniert oder keine Fehler hat, weiß ich natürlich nicht :).


Danke nochmal für deine Hilfe!
 

Anhänge

  • Like
Reaktionen: bitn2 und fxbastler
Nachtrag:

Hallo nochmal, habe festgestellt, dass der Switch von ungerade auf gerade Kalenderwoche nicht um 00:00 Uhr stattfindet - ich hatte einen seltsamen Fall heute nacht, dass die Ansage der ungeraden Kalenderwoche angesagt wurde, obwohl wir bereits eine gerade KW hatten. Die Zeitzone der 3CX ist auf Europe/Berlin eingestellt, aber die C# Funktion scheint eine andere Zeit zu benutzen?
 
Die Zeitzone der 3CX ist auf Europe/Berlin eingestellt, aber die C# Funktion scheint eine andere Zeit zu benutzen?
Nein, grundsätzlich nicht.

Wenn ich das mache bzw. nachstelle, dann kommt an der Wochengrenze vom 01.10.2023 auf den 02.10.2023 folgendes per Logger:
Code:
2023/10/01 23:59:51.857|8699|0007|Err|CallPair._460_14.Main.14.[C:7.2]-From script: DistributeIncomingCallAutomatic - CallID 0000018AED4141CF_7 - CallFlow.CFD.LoggerComponent 'lg1' - **** LOG1: ENL |3| LEN |3| DATE |01.10.2023 23:59:51| WEEK |39|
------------|Inf(00)|  Date: 02.10.2023 00:00:00
2023/10/02 00:00:08.456|8699|0009|Err|CallPair._460_14.Main.16.[C:9.2]-From script: DistributeIncomingCallAutomatic - CallID 0000018AED41835E_9 - CallFlow.CFD.LoggerComponent 'lg1' - **** LOG1: ENL |3| LEN |3| DATE |02.10.2023 00:00:08| WEEK |40|
 

Statistik des Forums

Themen
44.414
Beiträge
232.716
Mitglieder
78.330
Neuestes Mitglied
uvitas