Bearbeitung von Anrufen: Interne immer durchstellen und externe immer weiterleiten?

Gasha

Titanium Partner
Basic Certified
Mitglied seit
20. September 2021
Beiträge
45
Hallo zusammen,

ich stehe hier gerade ein bisschen aufm Schlauch und weiß nicht ob man sowas überhaupt realisieren kann und wenn ja wie?

Wir haben einen Kunden der sich explizit wünscht, dass bei der Nutzung von z.B. Status "Benutzerdefiniert Verfügbar" interne Anrufe immer und zu jederzeit durchgestellt werden, externe Anrufe jedoch stattdessen immer auf ein Gruppe, Warteschleife einen anderen User z.B. Zentralle weitergeleitet wird.

Ich weiß, dass es standardmäßig nicht funktioniert, da man eben wie wir alle wissen, nicht die Möglichkeit dazu hat zu sagen, dass externe Anrufe nicht angenommen sondern direkt weitergeleitet werden, da es nur die Funktion zur Anrufweiterleitung nach Zeit oder bei Besetzt gibt.

Gibt es denn irgendeine Möglichkeit, dies vielleicht per CFD / Anrufskript zu realisieren? War mein Gedanke als vollkommener CFD / Skript Laie. Und wenn nicht, wie könnte man sowas alternativ lösen?

Tausend Dank vorab für die Tips, Ideen und Vorschläge!
 
externe Anrufe jedoch stattdessen immer auf ein Gruppe, Warteschleife einen anderen User z.B. Zentralle weitergeleitet wird.
Wenn die ext. Anrufe ausschließlich über RG oder WS beim Nutzer rufen, dann kann man das im Status benutzerdefiniert verhindern.
Wenn die ext. Anrufe auch über CID oder DID beim Nutzer rufen, dann geht das nur mit einem Anrufskript was auf dem SIP Trunk triggert sinnvoll zu lösen. Das Skript sollte so etwas wie die früheren eingehenden Regeln ermöglichen und auch die Feiertagsansagen berücksichtigen..
 
Wenn ich das richtig verstehe soll selbst in der Benutzereinstellung Verfügbar niemand von außen direkt erreichbar sein?

Das bedeutet im Grunde, das jeder keine direkte Durchwahl von außen hat. Man kann doch die einzelnen Rufnummer der entsprechenden Gruppe/Warteschleife bzw. Rezeptionisten zuordnen.
 
Wenn ich das richtig verstehe soll selbst in der Benutzereinstellung Verfügbar niemand von außen direkt erreichbar sein?

Das bedeutet im Grunde, das jeder keine direkte Durchwahl von außen hat. Man kann doch die einzelnen Rufnummer der entsprechenden Gruppe/Warteschleife bzw. Rezeptionisten zuordnen.
Nein, bei Verfügbar soll der Benutzer auf jeden Fall, weiterhin über die Ihm zugewiesene DID von extern erreichbar sein.

Es geht nicht um die Gruppen, weder noch um die Warteschleifen selbst. Prinzipiell, geht es einfach darum, dass wenn der Benutzer sagt "OK, heute Arbeite ich interne Themen ab, da möchte ich nicht von extern erreichbar sein." er sich dann zum Beispiel, auf den Status "Verfügbar 2" stellt, bei welchem er dann die Möglichkeit hat, sich NUR für interne Anrufe erreichbar zu bleiben.

Währenddessen, falls seine DID von einem beliebigen externen Anrufer angewählt wird und der Benutzer seinen Status auf "Verfügbar 2" bzw. in diesem Sinne "Nur Intern erreichbar" gesetzt hat. Dann wird in diesem Fall, der Anrufer der DID, also extern, nicht zur angewählten Nebenstelle, sondern stattdessen zu einer anderen Nebenstelle, Mailbox, Gruppe, Warteschleife oder oder, durchgestellt.

Vielleicht kennt ja von euch Jemand noch die alten Siemens Anlagen (Unify > Mitel), dort hatte man eben die Rufziellisten, wo man für die Erreichbarkeit der Durchwahlen jeweils zwischen Intern / Extern / Außerhalb der GZ unterscheiden konnte.
Wie z.B. Externe Anrufe auf Nebenstelle 460 SOFORT auf Gruppe Zentrale 800 und nicht erst nach 25 Sekunden weiterleiten & Interne Anrufe auf Nebenstelle 460 erst bei Besetzt oder nach 25 Sekunden an Gruppe Zentrale 800 weiterleiten, solche Sachen.

Ich hoffe, dass die Erläuterung etwas mehr Licht ins Spiel bring, auch für dich @fxbastler , was du meinst ist mir klar und mit dem Gedanken hatte ich auch schon gespielt, nur damit lässt sich das was ich oben beschrieben hatte nicht realisieren... :(
 
Vielleicht denke ich zu einfach, aber dafür ist doch die Luncheinstellung prädestiniert.

1758872239156.png
 
Du hast die Weiterleitung nach einer Sekunde aktiviert. Im Umkehrschluss ist der User für interne Nutzer gar nicht mehr erreichbar, da dies sofort greift. Das ist das Problem des Beitragsverfassers.
 
doch die Weiterleitung ist ja nur für externe Anrufer die internen kommen doch weiterhin auf die 18 in diesem Fall
 
Nein, weil du einen Loop drin hast und damit eine art DND auslöst. Du kannst nicht auf dich selber weiterleiten :)
 
ok eben getestet, wäre ja schön gewesen. Schade das es dafür keine seperate Abhandlung gibt für die Erreichbarkeit intern. Rufumleitung Sofort wäre noch ein Leistungsmerkmal das fehlt....
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Ben04
Schade das man keine zweite Nebenstellennummer einrichten kann die auf diesen Apparat zeigt so als Geheimnummer, das ging ganz gut mit der Alcatel
 
Du kannst es auch so basteln, dass eine zweite NST dafür da ist.

Bei einem Kunden haben wir etwas Ähnliches, das nach dem gleichen Prinzip funktioniert.

Eine NST für das Festnetz, bei der alle Rufnummern und Rufgruppen klingeln, und eine weitere NST für das Handy, bei der nur eine bestimmte Rufgruppe klingeln darf.
 
auf die Schnelle habe ich es nicht gesehen wie das geht.....
 
Einfach eine zweite NST erstellen und intern von 18 auf 19 umleiten. Die 19 hat demnach keine DID und keine RG/WS und ist somit nur intern direkt erreichbar.

Mit einem Tisch-Telefon würde das sicherlich mit mehreren Konten funktionieren. Wie gut das ist, müsste man testen.

Das ist aber eine Bastellösung, wie mit dem ProCall-CTI.
 
Um es abzukürzen: das was @Gasha möchte konnte man noch nie wirklich in einer 3CX einrichten, nur über Umwege (z.B. DID Dummy Usern zuweisen und diese umschalten usw.).
Ab einer 3CX v20u3 lässt sich das mit einem Anrufskript das bei eingehenden Anrufen auf einem SIP Trunk triggert bauen. Das Skript fragt das Ziel ab und wenn das Ziel z.B. eine NSt im Status Benutzerdefiniert 1 ist, dann kann man solche direkten Anrufe per DID umleiten lassen. Die Anrufe per WS oder RG in diesem Status kann man in den Weiterleitungseinstellungen des Status unterbinden.

Für alles andere, mit 'geheimen' Rufnummern oder eben Chef-Sekretärin Funktion kann man Ausnahmen, Dummy Nst. und SIP ID nutzen - evtl. in Verbindung mit Mobilnummer und paralleler Signalisierung / Weiterleitung - oder eben eine ganz bunte Mischung aus all dem zusammen. Aber für Gasha ist das weniger interessant, er müsste für jeden Nutzer einzeln Dummy NSt. für die DID anlegen o.ä..
 
  • Like
Reaktionen: Ben04
@Gasha

Hier ein komplettes Anrufskript als Beispiel. Das Skript muss bei eingehenden Anrufen auf dem SIP Trunk triggern.


C#:
#nullable disable
using CallFlow;
using System;
using System.Threading;
using System.Linq;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;
using System.Collections.Generic;

namespace dummy
{
    //this handler checks destination and route
    public class incoming_did_reroute : ScriptBase<incoming_did_reroute>
    {
        // dictionary for extension routing: first is number of original destination, second is the new destination
        // if incoming call is original routed (via CID, DID, DefaultRoute) to the first number
        //  and this is an extension and the current forward profile of this extension is custom 1,
        //  then the call will be redirected to the second number in this dictionary
        private readonly Dictionary<string, string> incoming_did_ext_map = new Dictionary<string, string>{
            { "200", "800" },
            { "201", "800" }
        };
    
        // nearly the reference implementation of trunk routing by 3CX
        DestinationStruct FindRealDefaultDestination(ExternalLine trunk, string callerID, string DID)
        {
            DestinationStruct retval = new();
            string[] range;
            foreach (var a in trunk.RoutingRules)
            {
                bool match =  (a.Conditions.Condition.Type == RuleConditionType.BasedOnCallerID &&
                    a.Data.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
                    .Any
                    (x =>
                        x == "*"
                        || x == callerID
                        || x.StartsWith('*') && callerID.EndsWith(x[1..])
                        || x.EndsWith('*') && callerID.StartsWith(x[..^1])
                        || x.StartsWith('*') && x.EndsWith('*') && callerID.Contains(x[1..^1])
                        || ((range = x.Split("-", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)).Length == 2 ?
                        (range[0].Length == callerID.Length && range[1].Length == callerID.Length) && (range[0].CompareTo(callerID) <= 0 && range[1].CompareTo(callerID) >= 0) : false)
                    )
                )
                ||
                (a.Conditions.Condition.Type == RuleConditionType.BasedOnDID &&
                (
                    a.Data == DID
                    || (a.Data.StartsWith('*') && DID.EndsWith(a.Data[1..]))
                ))
                ||
                (a.Conditions.Condition.Type == RuleConditionType.ForwardAll);

                if (match)
                {
                    retval.CopyFrom(a.ForwardDestinations.OfficeHoursDestination);
                    break;
                }
            }
            return retval;
        }
    
        public override async Task<bool> StartAsync()
        {
            if (MyCall.Caller.DN is ExternalLine externalLine && MyCall.IsInbound) //only from trunk
            {
                // get the real inbound target
                var defaultDestination = FindRealDefaultDestination(externalLine, MyCall.Caller.CallerID, MyCall.Caller.CalledNumber).Internal;
                if (defaultDestination != null)
                {
                    // check if inbound target is extension and current forward profile is Custom 1 and extension is in redirect map
                    if (defaultDestination.GetType().ToString().Equals("TCX.Configuration.Interop.Wextension") &&
                        (defaultDestination as Extension).CurrentProfile.Name.Equals("Custom 1") &&
                        incoming_did_ext_map.ContainsKey(defaultDestination.Number))
                    {
                        await MyCall.RouteTo(incoming_did_ext_map[defaultDestination.Number], MyCall.Caller.CallerID, 3600);
                        return true;
                    }
                }
            }
            return false;
        }
    }
}

Stichwort: C# Schnipsel Anrufweiterleitung
 
Zuletzt bearbeitet:
  • Like
Reaktionen: bitn2 und Ben04

Statistik des Forums

Themen
44.411
Beiträge
232.704
Mitglieder
78.328
Neuestes Mitglied
as7h