Holiday Ansage für DIDs

KeWiener

Titanium Partner
Advanced Certified
Mitglied seit
25. September 2020
Beiträge
21
Hi zusammen,

ich habe ein Thema, welches bei der v.18 ganz simple gelöst war. Nämlich das abspielen einer Ansage für hinterlegt Feiertage.
Irgendwie bekomme ich das mit der v.20 nicht hin. Für Warteschleifen ist es kein Problem weil ich dort den Haken setzen kann, aber wie mache ich es für die direkten Durchweahlen der User?
Sprich die DID *7209221 ist User 21 zugeordnet. Dieser befindet sich in keiner Warteschleife. Der User ist der Testgruppe zugeordnet als Haupmitgliedschaft und dort sind GZ hinterlegt. Dort ist auch der Feiertag (ganze Woche) mit der Ansage hinterlegt.
Der User nutzt unter Zeitplan die Standard Geschäftszeiten. Wie bekomme ich das jetzt hin wenn jemand auf der Durchwahl anruft dass die Ansage abgespielt wird?

Wäre unendlich dankbar wenn das jemand weiss^^ Ich übersehe scheinbar irgend etwas.

Mir wurde schon empfohlen es über Anrufverarbeitungsskripte zu lösen, aber das kann ich ja nicht all unseren Kunden zumuten.
1727437761800.png
1727437782257.png
1727437820235.png
1727437835947.png
 
Zuletzt bearbeitet:
Das Skript ist nicht das Problem, das ist simpel und funktioniert wie beschrieben wie gewünscht.

Das Problem wird sein, dass @KeWiener mehrere Abteilungen mit unterschiedlichen Feiertagseinstellungen und vmtl. nicht je einem SIP Trunk pro Abteilung haben wird. Er wird das Skript so nicht anwenden können bzw. es wird nicht funktionieren wie gewünscht. Die Feiertagregelungen greifen dann nur für die Abteilung, welcher der SIP Trunk zugeordnet ist.
 
Das Skript ist nicht das Problem, das ist simpel und funktioniert wie beschrieben wie gewünscht.

Das Problem wird sein, dass @KeWiener mehrere Abteilungen mit unterschiedlichen Feiertagseinstellungen und vmtl. nicht je einem SIP Trunk pro Abteilung haben wird. Er wird das Skript so nicht anwenden können bzw. es wird nicht funktionieren wie gewünscht. Die Feiertagregelungen greifen dann nur für die Abteilung, welcher der SIP Trunk zugeordnet ist.
exakt, endlich jemand der mein Leid versteht:D Aber eine saubere Lösung wirst du wohl auch nicht haben oder?
In der v.18 war das so schön easy gelöst:/
 
Das ist eben das Problem, das es fùr einen "Systemweiten Trunk" nicht geht.
Habe auch einige Kunden, die einen Systemweiten Trunk haben und aber mehrere Abteilungen, somit geht das leider nicht, hoffe hier legt 3CX noch nach, sonst ist diese Funktion schlicht fùr diese Kunden nicht mehr da, leider.
 
exakt, endlich jemand der mein Leid versteht:D Aber eine saubere Lösung wirst du wohl auch nicht haben oder?
In der v.18 war das so schön easy gelöst:/

Hier das gewünschte allgemeingültige Holiday / Feiertag Skript:
C#:
#nullable disable
using CallFlow;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using TCX.Configuration;
using TCX.PBXAPI;

namespace dummy
{
    public class PlayHolidayPromptBeforeRouting : ScriptBase<PlayHolidayPromptBeforeRouting>
    {
        // process incoming call
        public override async Task<bool> StartAsync()
        {
            PhoneSystem ps = (PhoneSystem)MyCall.PS;
            if(MyCall.Caller.DN is ExternalLine externalLine) {
                try {
                    // get all routing rules for the called trunk, they are sorted
                    var rrules=(MyCall.Caller.DN as ExternalLine).RoutingRules;
                    DN DestDN=null; // gets destination DN for the call, based on routing rules
                    foreach(var rrule in rrules) {
                        // build the DID string which has to match the called number, maybe remove invalid characters (everything except +0-9)?
                        Regex searchDID = new Regex("^" + rrule.Data.Replace("*",".*"));
                        if(searchDID.Match(MyCall.Caller.CalledNumber).Success) {
                            // found a rule, get their destination
                            DestDN=(rrule as DIDDestination).OfficeHoursDestination.Internal;
                            MyCall.Info( "Holiday - routingrule #" + rrule.PriorityHint.ToString() + " matches, called num was: " +
                                MyCall.Caller.CalledNumber + ", DID is: " + rrule.Data + ", SearchDID is: " + searchDID +
                                ", destination DN is: " + DestDN.Number);
                            break;
                        }
                    }
                    var trunkTimeBasedroute = DestDN.GetTimeBasedRoutingInfo();
                    if(trunkTimeBasedroute.reason == CallControlAPI.DivertReason.Holiday && trunkTimeBasedroute.holiday!=null) {
                        MyCall.Info($"the holiday is {trunkTimeBasedroute.holiday}");
                        var theFile = trunkTimeBasedroute.holiday.HolidayPrompt;
                        if(string.IsNullOrWhiteSpace(theFile)) {
                            theFile = Path.Combine(ps.GetParameterValue("IVRPROMPTPATH"), "holidays", trunkTimeBasedroute.holiday.Name+".wav");
                            MyCall.Info($"Check holidays prompt storage for {theFile}");
                            if(!File.Exists(theFile)) {
                                MyCall.Info($"No holiday prompt found. Skip holiday routing"); 
                                theFile = null;   
                            }
                        }
                        else {
                            MyCall.Info($"HolidayPrompt is {theFile}");
                        }

                        if(!string.IsNullOrWhiteSpace(theFile)) {
                            // if destination DN has a valid group, then redirect call to this group
                            if( DestDN.Groups.Length > 0 && DestDN.Groups[0].Number.Length > 0) {
                                DestDN = ps.GetDNByNumber(DestDN.Groups[0].Number);
                            }
                            var holidayDestination =new DestinationStruct(DestDN);

                            MyCall.Info($"Playing prompt {theFile} and route call to {holidayDestination}");
                            await MyCall.AssureMedia()
                                .ContinueWith(x => MyCall.PlayPrompt(null, [theFile], PlayPromptOptions.Blocked))
                                .Unwrap()
                                .ContinueWith(x=>MyCall.RouteToAsync(holidayDestination))
                                .Unwrap();
                            return true;
                        }
                    }
                }
                catch (Exception ex) {
                        MyCall.Info($"Error during call processing: {ex.Message}");
                }
            }
            return false;
        }
    }
}

Der SIP Trunk muss nicht mehr an eine Abteilung gebunden werden sondern kann systemweit gültig sein. Wenn das Skript alle eingehenden Anrufe des SIP Trunk annimmt ist es somit auch nicht mehr an eine Abteilung gebunden.

Das Skript funktioniert prinzipiell wie hier grob beschrieben. Wenn für die Abteilung des Ziel des Anrufes gerade ein Feiertag gilt, dann wird das zugehörige Audio abgespielt und der Anruf geht an die Abteilung und nicht an das ursprüngliche Ziel. So kann man den weiteren Ablauf in den Einstellungen der Abteilung steuern wie gewünscht oder einfach nur beenden.

vielen Dank an die von mir eingespannten Tester ;)

Stichwort: C# Schnipsel Anrufskript Anrufverarbeitungsskript call script holiday feiertag
 
Hallo fxbaster

Ist das jetzt ein Script von dir, oder jenes welches man vom Store laden kann?
 
Ist das jetzt ein Script von dir
von mir, nur hier, nicht im Store, nicht von 3CX

Mal schaun, ob das nicht gar irgendwann mal im Store landet :D :D

Nachtrag: Änderungswünsche werden noch angenommen ...
 
Ich meinte nur, weil Du allgemein gùltige schriebst, deshalb meine Frage
Darf ich mir das dann holen?
 
  • Like
Reaktionen: Reiner030 und timmbo
Ja funktioniert pràchtig.
Danke.
 
  • Like
Reaktionen: fxbastler
Hier das gewünschte allgemeingültige Holiday / Feiertag Skript:
C#:
#nullable disable
using CallFlow;
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Text.RegularExpressions;
using TCX.Configuration;
using TCX.PBXAPI;

namespace dummy
{
    public class PlayHolidayPromptBeforeRouting : ScriptBase<PlayHolidayPromptBeforeRouting>
    {
        // process incoming call
        public override async Task<bool> StartAsync()
        {
            PhoneSystem ps = (PhoneSystem)MyCall.PS;
            if(MyCall.Caller.DN is ExternalLine externalLine) {
                try {
                    // get all routing rules for the called trunk, they are sorted
                    var rrules=(MyCall.Caller.DN as ExternalLine).RoutingRules;
                    DN DestDN=null; // gets destination DN for the call, based on routing rules
                    foreach(var rrule in rrules) {
                        // build the DID string which has to match the called number, maybe remove invalid characters (everything except +0-9)?
                        Regex searchDID = new Regex("^" + rrule.Data.Replace("*",".*"));
                        if(searchDID.Match(MyCall.Caller.CalledNumber).Success) {
                            // found a rule, get their destination
                            DestDN=(rrule as DIDDestination).OfficeHoursDestination.Internal;
                            MyCall.Info( "Holiday - routingrule #" + rrule.PriorityHint.ToString() + " matches, called num was: " +
                                MyCall.Caller.CalledNumber + ", DID is: " + rrule.Data + ", SearchDID is: " + searchDID +
                                ", destination DN is: " + DestDN.Number);
                            break;
                        }
                    }
                    var trunkTimeBasedroute = DestDN.GetTimeBasedRoutingInfo();
                    if(trunkTimeBasedroute.reason == CallControlAPI.DivertReason.Holiday && trunkTimeBasedroute.holiday!=null) {
                        MyCall.Info($"the holiday is {trunkTimeBasedroute.holiday}");
                        var theFile = trunkTimeBasedroute.holiday.HolidayPrompt;
                        if(string.IsNullOrWhiteSpace(theFile)) {
                            theFile = Path.Combine(ps.GetParameterValue("IVRPROMPTPATH"), "holidays", trunkTimeBasedroute.holiday.Name+".wav");
                            MyCall.Info($"Check holidays prompt storage for {theFile}");
                            if(!File.Exists(theFile)) {
                                MyCall.Info($"No holiday prompt found. Skip holiday routing");
                                theFile = null;  
                            }
                        }
                        else {
                            MyCall.Info($"HolidayPrompt is {theFile}");
                        }

                        if(!string.IsNullOrWhiteSpace(theFile)) {
                            // if destination DN has a valid group, then redirect call to this group
                            if( DestDN.Groups.Length > 0 && DestDN.Groups[0].Number.Length > 0) {
                                DestDN = ps.GetDNByNumber(DestDN.Groups[0].Number);
                            }
                            var holidayDestination =new DestinationStruct(DestDN);

                            MyCall.Info($"Playing prompt {theFile} and route call to {holidayDestination}");
                            await MyCall.AssureMedia()
                                .ContinueWith(x => MyCall.PlayPrompt(null, [theFile], PlayPromptOptions.Blocked))
                                .Unwrap()
                                .ContinueWith(x=>MyCall.RouteToAsync(holidayDestination))
                                .Unwrap();
                            return true;
                        }
                    }
                }
                catch (Exception ex) {
                        MyCall.Info($"Error during call processing: {ex.Message}");
                }
            }
            return false;
        }
    }
}

Der SIP Trunk muss nicht mehr an eine Abteilung gebunden werden sondern kann systemweit gültig sein. Wenn das Skript alle eingehenden Anrufe des SIP Trunk annimmt ist es somit auch nicht mehr an eine Abteilung gebunden.

Das Skript funktioniert prinzipiell wie hier grob beschrieben. Wenn für die Abteilung des Ziel des Anrufes gerade ein Feiertag gilt, dann wird das zugehörige Audio abgespielt und der Anruf geht an die Abteilung und nicht an das ursprüngliche Ziel. So kann man den weiteren Ablauf in den Einstellungen der Abteilung steuern wie gewünscht oder einfach nur beenden.

vielen Dank an die von mir eingespannten Tester ;)

Stichwort: C# Schnipsel Anrufskript Anrufverarbeitungsskript call script holiday feiertag
Mega! Funktioniert einwandfrei. Vielen Dank
 
  • Like
Reaktionen: fxbastler
Genial, funktioniert im ersten Test wie gewünscht.
 
  • Like
Reaktionen: fxbastler
Der SIP Trunk muss nicht mehr an eine Abteilung gebunden werden sondern kann systemweit gültig sein. Wenn das Skript alle eingehenden Anrufe des SIP Trunk annimmt ist es somit auch nicht mehr an eine Abteilung gebunden.

Das Skript funktioniert prinzipiell wie hier grob beschrieben. Wenn für die Abteilung des Ziel des Anrufes {[...]
vielen Dank an die von mir eingespannten Tester ;)

Stichwort: C# Schnipsel Anrufskript Anrufverarbeitungsskript call script holiday feiertag

Hallo,

das Skript liest sich gut und scheint ja irgendwie bei mehreren der Forenmitgliedern sogar einwandfrei zu funktionieren, auch wenn ich mich nach tagelangen Tests wirklich wundere, wie das funktionieren soll.
Beim Einbinden des Zitates vielen mir noch die von mir fett markierten Passagen "Wenn das Skript alle angehenden Anrufe annimmt" und "Ziel des Anrufers" auf, die sich von der DID Logik her widersprechen.

Es fehlt wohl leider eine kurzes HowTo, wie die Einstellungen zu tätigen sind für eine erfolgreiche Nutzung.
Denn soweit erkennbar, reicht es nicht aus,
wie angegeben im Admin Bereich unter Integrationen => Anrufskripte => Name
mittels den Parametern "Beim Empfangen eines Anrufs auf einem Trunk", Trunk <Trunk>, Abteilung "Systemweit"
das Skript hochzuladen und zuzuordnen.
Hier wird das Skript "nur" dem Trunk <Trunk> als Standardroute <Skript> zugewiesen, die aber gar nicht greifen kann/darf: https://www.3cx.de/docs/adminhandbuch/sip-trunks/#h.3ywj8e8w5130
3. Geben Sie eine Standardroute zu einem Ziel ein, an das Anrufe für DID-Nummern weitergeleitet werden,
die keiner (System)nebenstelle zugewiesen sind.
Sobald Sie die Hauptnummer beispielsweise Ihrem Haupt-IVR zuweisen, wird die Standardroute für die
Haupt-Trunk-Nummer ignoriert. Gleiches gilt für eine DID-Nummer, die einer Nebenstelle zugewiesen ist.​
Bei der Standardroute handelt es sich somit und das Ziel für alle nicht zugewiesenen DID-Nummern

Ich hatte daran gedacht, dass es nach erfolgreichen Tests noch ideal wäre, wenn man
aufnehmen könnte, um ebenfalls 50+ Nebenstellen nicht per Monkeywork über stundenlange monotone und an sich "überbezahlte" Tätigkeiten als Senior System Engineer initial und später bei Änderungen durchführen zu müssen.
Praktisch wäre es gewesen, wenn man diese unter "Feiertage/Urlaub" einfach ohne Datum angeben könnte und diese dann automatisch im Hintergrund berechnen und berücksichtigt werden würden, aber
  1. muss man ein Datum (mit Zeiten) oder Zeitraum über mehrere Tage angeben und
  2. dürfen diese sich nicht überschneiden. (=> also ein Feiertag in der Urlaubszeit verhindert ein "override".
    Man muss also davon ausgehen, dass die 3cx Entwickler nicht viel von Weihnachten zu halten scheinen ... :rolleyes:
In unserer aktuellen v20u3 Anlage wird das Skript - wie aus der referenzierten dokumentierten Funktionsweise erwartbar - jedoch gekonnt ignoriert; ich erhalte nur Logeinträge wie in https://www.3cx.de/forum/threads/we...bwesend-funktioniert-nicht.119097/post-426125 angegeben, selbst wenn ich am Beginn der try {...} Blocks ein:
MyCall.Info( "Holiday Routing CFA started for called num: " + MyCall.Caller.CalledNumber );
hinzufüge.

Aufgrund meiner Logeinträge fand ich auch einen ähnlichen Fall / gleiche Logeinträge wie bei uns.
Die dort in einer Antwort angegebenen Referenzen und "Feststellung" in https://www.3cx.de/forum/threads/geschäftszeiten-im-sip-trunk-greift-nicht.111002/post-400752, dass "die umfangreichen vom Hersteller bereitgestellten Unterlagen durcharbeiten und an den regelmäßig stattfindenden Schulungen teilnehmen" zum Erfolg führen würden, kann ich überhaupt nicht nachvollziehen.

Deutlich eher die Position von @ViperAix, wie auch bei vielen anderen Forennutzern für diese und viele andere Funktionsprobleme feststellen, ist die 3cx - insbesondere v20 selbst mit Update 3 - das reinste Alpha bis Beta Produkt. Unsere über 12 Jahre alte Asterisk Anlage funktioniert bei weitem besser/einfacher, muss aber mal wieder aktualisiert werden.

Zuerst musste ich über 2 Monate warten, bis ich überhaupt mal einen freien Platz in den Webinaren reservieren konnte nur um dann festzustellen, dass die "umfangreichen Unterlagen" aka "Basis- und Fortgeschrittenen- Tutorials" eigentlich nur ein wenig über die sowieso per Hilfe Icons verlinkte und öffentliche und total unvollständige Dokumentation der 3cx sind und in den Webinaren Fragen auch gekonnt ignoriert werden, wenn es um - oft "inzwischen" - allgemein fehlenden Basis-Funktionalitäten geht. Auch wenn das für Nicht- oder angehende Admins sicher schon interessant gewsen sein dürfte (wenn ich so an diverse gestellte Fragen zurückdenke ;))

Entscheidung für die 3cx war leider die "Außen hui" einheitliche "inklusiv" Client GUI über die Plattformen hinweg sowie ein "muss alles in die Cloud" (bei uns immerhin gehosted von einem 3cx Titanium Partner) und dazu ein "innen pfui", wenn es um die 3cx Konfigurationsmöglichkeiten geht.
Es ist dann sehr "erfreulich", wenn man erst über die Webinare (letzten Dienstag) dann feststellen muss, dass das 3cx Partner-Level nicht vom zertifizierten technischem Wissen, sondern rein vom Umsatz abhängt, was dann wohl zumindest einen Teil der erstmal 1,5 Monate Wartezeit für eine sofort eingerichtete 3cx lizensierte Anlage ohne 60 Tage Testzeitraum mit erklären kann, um dann ein "leeres" System vorzufinden, das man selber einrichten muss, weil fast nichts an dieser Anlage automatisiert eingerichtet werden kann oder funktioniert.
Mal sehen ob sie im 4. Monat endlich nutzbar wird; denn vor einer Woche hat sie viele DIDs "über Nacht" verloren und verliert ebenfalls schon mehrfach "über Nacht" ihre eingetragenen Mobilfunkrufnummernziele in den Nebenstellen. Ansonsten hole ich mir ein Angebot vom alten Anbieter, auch wenn wir auf diese super fancy GUI / Apps verzichten "müssen".

Aus dem anderen Thread viel mir auch noch der Hinweis auf eine Antwort ~ "musste Du nur wählen" auf, die ich für meinen Fall auch probiert hatte in der Hoffnung etwas zu verbessern, aber unsere Anlage kennt den Wählcode einfach nicht. :rolleyes:
=> Wo soll man z.B. in dem Thread genannte *60 finden und was soll der Wählcode denn bewirken?
Unsere Anlage hat nur die Wählcodes wie in der Hilfeseite https://www.3cx.de/docs/funktionswahl-codes/ angezeigt konfiguriert und dort gibt es nur eine *62 und *63; eine 60 lässt sich nur im Footer finden:
"Zusammenarbeiten mit Ihrem Team und Kunden ganz einfach. Die kostenlose 60-Tage-Testversion nutzen und die richtige Lösung für Ihr Unternehmen entdecken." ;)
 
Zum Skript:
... auch wenn ich mich nach tagelangen Tests wirklich wundere, wie das funktionieren soll.
Soll hin oder her: Funktioniert es denn bei dir oder nicht?

Beim Einbinden des Zitates vielen mir noch die von mir fett markierten Passagen "Wenn das Skript alle angehenden Anrufe annimmt" und "Ziel des Anrufers" auf, die sich von der DID Logik her widersprechen.

Es fehlt wohl leider eine kurzes HowTo, wie die Einstellungen zu tätigen sind für eine erfolgreiche Nutzung.
Denn soweit erkennbar, reicht es nicht aus,
wie angegeben im Admin Bereich unter Integrationen => Anrufskripte => Name
mittels den Parametern "Beim Empfangen eines Anrufs auf einem Trunk", Trunk <Trunk>, Abteilung "Systemweit"
das Skript hochzuladen und zuzuordnen.
Doch, das reicht. Wie du selber schreibst und vielleicht auch erkannt hast: das Skript startet bei einem eingehenden Anruf auf einem SIP Trunk. Das ist in jedem Fall vor jeglicher weiteren Logik einer 3CX. Das widerspricht also nichts.

Der Unterschied von diesem Skript gegenüber dem Original von 3CX ist, dass es die vorh. DID des Trunk selber abfragt und verfolgt. Lies einfach, steht alles da. Das ist nur Code, kein weiteres Howto nötig.

Zum Rest:
Wie ist die Frage?
 
Zum Skript:

Soll hin oder her: Funktioniert es denn bei dir oder nicht?
na, anhand der Frage ein klares NEIN, sonst hätte ich hier nicht geschrieben...

Doch, das reicht. Wie du selber schreibst und vielleicht auch erkannt hast: das Skript startet bei einem eingehenden Anruf auf einem SIP Trunk. Das ist in jedem Fall vor jeglicher weiteren Logik einer 3CX. Das widerspricht also nichts.
Das macht es ja eben gerade NICHT ...denn die "3cx Logik" sagt was vollkommen anderes.

Zum Rest:
Wie ist die Frage?
Die stand in:
Es fehlt wohl leider eine kurzes HowTo, wie die Einstellungen zu tätigen sind für eine erfolgreiche Nutzung.​

und habe ich begründet mit der sachlichen Feststellung aus dem nächsten Absatzteil, den 3cx selber geschrieben hat, WIE das Skript aufgerufen wird und hatte ich extra Fett hervorgehoben - jetzt nochmal zusätzlich Unterstrichen:

Hier wird das Skript "nur" dem Trunk <Trunk> als Standardroute <Skript> zugewiesen, die aber gar nicht greifen kann/darf: https://www.3cx.de/docs/adminhandbuch/sip-trunks/#h.3ywj8e8w5130
3. Geben Sie eine Standardroute zu einem Ziel ein, an das Anrufe für DID-Nummern weitergeleitet werden, die keiner (System)nebenstelle zugewiesen sind.
Sobald Sie die Hauptnummer beispielsweise Ihrem Haupt-IVR zuweisen, wird die Standardroute für die Haupt-Trunk-Nummer ignoriert. Gleiches gilt für eine DID-Nummer, die einer Nebenstelle zugewiesen ist.
Bei der Standardroute handelt es sich somit und das Ziel für alle nicht zugewiesenen DID-Nummern
=> Die Standardroute und damit das Skript wird NUR aufgerufen,
wenn das DID Ziel NICHT definiert ist.


Bei 3cx gibt es keine Möglichkeit einer Regex-Umschreibung der eingehenden Rufnummern zu einer Nebenstelle, so dass zwingend alle Nebenstellen definiert werden müssen durch eine 1:1 Zuweisung.
Damit KANN das Skript als Standardroute des Trunks aus der 3cx Logik heraus gar nicht aufgerufen werden.

Daher die Frage, wie hier "getrickst" werden muss, um das gewünschte Verhalten hinzubekommen.
Danke.

Danach war insbesondere noch der Hinweis relevant, dass man das Skript vielleicht noch optimieren könnte mit berechneten Feiertagen und vielleicht auch gleich inkludiert die Geschäfts- und Pausenzeitendefinitionen je Abteilung, damit man sich die Monkeywork ersparen kann, Dutzende bis Hunderte von Nebenstellen MANUELL einzurichten - 3cx kann das ja (zumindest mit öffentlichen Bordmitteln) nicht automatisiert.

EDIT: Ach und ich hatte dort noch die Referenz zu den Logeinträgen mit drin, die bei unserer Anlage genauso aussehen.
 
na, anhand der Frage ein klares NEIN, sonst hätte ich hier nicht geschrieben...
Dann schreib das auch bitte und frage um Hilfe. Das hast du nicht. Wer will denn hier raten. Das musst du jetzt auch nicht wieder kommentieren, lass es bitte einfach.

Das macht es ja eben gerade NICHT ...denn die "3cx Logik" sagt was vollkommen anderes.
Erklärung, nochmal: Wenn das Skript wie beschrieben eingrichtet wurde (systemweit, Start bei eingehenden Anruf auf dem SIP Trunk), dann ist das so gut wie vor jeglicher Call Flow Logik der 3CX, unabhängig von DID und Standardroute. Das alles kommt, wenn überhaupt weil das Skript das noch zulässt, erst hinterher, s.o., habe ich schon geschrieben.

Die stand in:
Es fehlt wohl leider eine kurzes HowTo, wie die Einstellungen zu tätigen sind für eine erfolgreiche Nutzung.
Das ist keine Frage. Das musst du jetzt auch nicht wieder kommentieren, lass es bitte einfach.

Auf den Rest deines letzten Post gehe ich jetzt nicht weiter ein. Ich ignoriere es erstmal. Das tut meinen Augen schon beim lesen weh, was da wie womit gemeint ist mit deiner Formatierung, Hervorhebung, dem Rumschreien mit Großbuchstaben etc.. Sorry, so nicht. Das ist für mich nicht verständlich. Das was du hier machst und auslöst ist nicht produktiv.

Wenn du hier Hilfe suchst, dann stelle bitte verständliche Fragen.

Einen Teil davon habe ich dir schon beantwortet.

Bei 3cx gibt es keine Möglichkeit einer Regex-Umschreibung der eingehenden Rufnummern zu einer Nebenstelle, so dass zwingend alle Nebenstellen definiert werden müssen durch eine 1:1 Zuweisung.
Nein, das ist nicht richtig. Man kann und sollte DID mit * definieren (und diese dann Nebenstellen zuweisen). Dieser Punkt wird sehr oft angesprochen und auch im Forum alle wenige Tage nachgefragt und beantwortet, erst gestern wieder.
Danach war insbesondere noch der Hinweis relevant, dass man das Skript vielleicht noch optimieren könnte mit berechneten Feiertagen und vielleicht auch gleich inkludiert die Geschäfts- und Pausenzeitendefinitionen je Abteilung
Kannst du gern machen. Das habe ich so geschrieben.

damit man sich die Monkeywork ersparen kann, Dutzende bis Hunderte von Nebenstellen MANUELL einzurichten - 3cx kann das ja (zumindest mit öffentlichen Bordmitteln) nicht automatisiert.
Das stimmt nicht.
Ich verstehe zum Einen den Kontext nicht: Was hat die Feiertag- bzw. GZ und PZ Regelung mit dem Anlegen von hunderten von NSt. zu tun?
Zum Anderen kann man NSt. in großen Mengen importieren als auch wie dokumentiert per REST API anlegen. Den Automatismus dabei darfst du dir selber ausdenken. Beispiele für den REST API Zugriff gibt es genug.
 
Du kannst das auch gern selber probieren, das mit der DID, dem Call Flow und ob das Skript vorher läuft oder nicht usw..

Benutze folgendes Anrufskript für den Fall, dass ein Anruf auf einen SIP Trunk eingeht und du siehst was passiert:
C#:
#nullable disable

using CallFlow;
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;

namespace dummy
{
    public class DummyTest : ScriptBase<DummyTest>
    {

        public override async Task<bool> StartAsync()
        {
            try
            {
                MyCall.Error($"callus flowus interruptus");
                return true;  //  <- dieser Rueckgabewert ist entscheidend
            }
            catch (Exception ex)
            {
                MyCall.Error($"Task execution failed: {ex}");
                MyCall.Return(false);
            }
        return false;
        }
    }
}

Sobald ein Anruf eingeht, erscheint in jedem Fall ein Eintrag in der Datei 3CXCallFlow.log und es wird aufgelegt - egal was sonst noch eingerichtet ist. Wenn in der mit Kommentar markierten Zeile ein return false; steht, dann wird der Anruf wie gehabt von der 3CX verarbeitet, inkl. Call Flow mit DID und Standardroute und allem was sonst noch in der 3CX eingerichtet ist.
 
Hallo zusammen,
ich habe das modifizierte Script (systemweit) hinzugefügt. Sicherheitshalber habe ich dem Script, der Audiodatei und dem Feiertag den gleichen Namen vergeben. Nun wird auch die richtige Feiertagsansage dem Feiertag zugewiesen, aber direkt dahinter wird es komischerweise die allgemeine Ansage "Außerhalb der Geschäftszeiten" wiedergegeben. Was mache ich denn falsch? Vielen Dank!
 

Statistik des Forums

Themen
44.440
Beiträge
232.810
Mitglieder
78.339
Neuestes Mitglied
neil.marsura