Rufweiterleitung

ich meine die über den CFD aktiviert wurde, bei den Anlagen die kenne Bintec Elmeg Alcatel konnte ich aktivierte Rufumleitungen in der Anlage deaktivieren.
 
Wenn du mit dem CFD einen Status und damit eine Rufumleitung setzt, kannst du sie natürlich auch wieder ändern über die 3cx.
 
  • Like
Reaktionen: Josef L
Ich habe jetzt die Rufweiterleitung am Snom D865 getestet. ...
Aufheben, sofort. Wenn möglich die Funktion ganz sperren.
Zu dem was @bitn2 geschrieben hat gehört noch einiges mehr. Die Liste ist sehr lang. So bitte nie machen, du tust speziell und damit auch dem Kunden keinen Gefallen. Wenn du dann wegen Problemen im Forum nachfragst und beschreibst was da eingestellt wurde, dann holt jemand sein Telefon, holt aus und einmal links + rechts, du weisst ...
 
ok ok bitte wieder gut sein, ich bin ja nur lokal am Testen
 
Ich habe jetzt die Rufweiterleitung am Snom D865 getestet. Ich brauche dazu kein Aufwand zu betreiben. Ich kann die Rufumleitung im Apparat nutzen. Die Rufumleitung bleibt auch bestehen, wenn ich den Apparat neu starte. Wie auch die DND-Funktion. Vorteil ich habe eine Meldung im Display.
Wenn, dann würde ich eine BLF Taste machen und den Status umstellen. Zumindest bei den Yealink kannst du ja evtl. noch die beiden BLF umbennen (Verfügbar = Umleitung AUS und z.B. Nicht Stören = Umleitung Zentrale). Dann auf dem Telefon selbst eine Taste machen "Rufweiterleitung" und leer lassen und benennen mit: Umleitung Zentrale (rein für die optische Erkennung, dass eine Umleitung aktiv ist).
Du drückst dann halt 2 Tasten.

Aber ja wahrscheinlich auch nicht wirklich eine gute Lösung bei Änderungen in der 3CX bzw. Telefon, Firmware Update, Prov., etc. alles wieder weg ist...:D
Aber evtl. für den "Eigengebrauch" einigermassen nutzbar :D

PXL_20250407_144845531.MP.jpg
 
Ja, das ist richtig.

Schau da mal in die Zip Datei rein. Das ist das komplette v18 CFD Projekt, nicht nur der Output für den Upload. Ich bin ja kein Schwe.., ich geb's ja zum selberbasteln komplett weiter.
 
  • Like
Reaktionen: mholtrup
Hallo zusammen.
wir haben was Rufumleitung an geht eine neue Herausforderung.
Kurz erklärt:
Ein Nebenstelle für eine Rufbereitschaft soll als Dummy Nebenstelle dienen.
Jeder der auf dieser Rufnummer anruft wird auf eine externe Rufnummer (Mobilfunk) weitergeleitet.

Um es den Rufbereitschafts Mitarbeitern einfach zu machen, sollen Sie bei Übernahme der Rufbereitschaft mit Ihrer externen Rufnummer (Mobilfunk) die Rufbereitschaft anrufen.
Durch Ausnahmen werden die berechtigten externen Rufnummern an den CallFlow weitergeleitet.
Der CallFlow soll nun erkennen, von welcher Nebenstelle er weitergeleitet wurde und an der Nebenstelle die externe Rufnummer als Weiterleitungsziel in DND einstellen.

Kann mir dabei jemand helfen?
Vielen Dank schonmal im Voraus.

Viele Grüße
Michael
 
Grundsätzlich ist die Lösung die Nutzung einer WS mit An- und Abmeldung von Agenten und der Nutzung der 3CX App.

Erkläre bitte deine 3CX Entität Rufbereitschaft genauer. Das ist eine DID die auf eine Dummy NSt. geleitet wird? So wie du es beschreibst: ja. Dann soll es da möglich sein, dass eine oder mehr. Mobilfunknummern anrufen und diese NSt. quasi übernehmen, sprich auf DND setzen und die anrufende Nummer als Weiterleitungsziel der NSt. setzen, richtig?

Wenn dem so ist und so wie ich das was du willst verstanden habe und es euch speziell hier auch um die Eigenschaft der Anzeige der urspr. angerufenen Nummer bei der Bereitschaftsmobilnummer geht, dann ist das vmtl. ein logisches Problem bis hin zur Unmöglichkeit. Ich warte mal auf deine Erklärung.

Eine Steigerungsform wäre gar, wenn das mehrere solche DID und NSt. betrifft.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: mholtrup
Ja, genau so sollte es sein.
Die DID wird auf eine Dummy NSt. weitergeleitet. Durch Ausnahmen wollten wir dann entsprechend einige Mobilfunkrufnummern umleiten auf die CFA, die dann das Weiterleitungsziel der Dummy NSt. auf die Mobilfunkrufnummer umleitet.
So bräuchten wir nur eine CFA, die dann für verschiedene Rufnummern genutzt werden könnte.
Durch die Ausnahmen könnten wir steuern, welche Rufnummer berechtigt ist, die Umleitung auf sich zu stellen.


Wir sind gestern noch ein klein wenig weiter gekommen.
  • Die externe Mobilfunkrufnummer bekommen wir ja in der session.ani geliefert.
  • Die Dummy Nebenstelle die den Anruf an die CFA weiterleitet sollten wir durch "session.transferingExtension" oder "session.forwardingExtension" bekommen.
    Das scheint allerdings nicht zu funktionieren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
strCallerNumber = String = session.ani
strExtNr = String = session.transferingExtension

var ext = PhoneSystem.Root.GetDNByNumber(strExtNr) as Extension;
if (ext == null) return;

var profile = ext.FwdProfiles.FirstOrDefault(x => x.Name == "Out of office");
if (profile != null)
{
var dest = new DestinationStruct
{
To = DestinationType.External,
External = strCallerNumber
};

if (profile.TypeOfRouting == RoutingType.Available)
{
var route = profile.AvailableRoute;
route.NoAnswer.AllCalls = dest;
route.NoAnswer.Internal = dest;
route.Busy.AllCalls = dest;
route.Busy.Internal = dest;
route.NotRegistered.AllCalls = dest;
route.NotRegistered.Internal = dest;
}
else if (profile.TypeOfRouting == RoutingType.Away)
{
var route = profile.AwayRoute;
route.Internal.AllHours = dest;
route.Internal.OutOfOfficeHours = dest;
route.External.AllHours = dest;
route.External.OutOfOfficeHours = dest;
}

ext.Save();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Wenn wir den Wert der strExtNr auf die Dummy NSt. setzten funktioniert das bereits.

Sollte es dafür keine logische Lösung geben, so würden wir die NSt Nummer und die Mailbox Pin über die CFA abfragen wollen.
Als Abfrage in der CFA:
Geben Sie die Nebenstellennumer ein: xxxxx
Geben Sie die Mailbox PIN ein: xxxx
Und dann entsprechend die Nebenstelle umzuschalten.
 
Die Dummy Nebenstelle die den Anruf an die CFA weiterleitet sollten wir durch "session.transferingExtension" oder "session.forwardingExtension" bekommen.
Das scheint allerdings nicht zu funktionieren.
Ja, das ist so ein bekanntes Problem bei direkten Weiterleitungen.
Die Ursache könnte nach der Umstellung auf die v20 die neue SIP Engine und / oder der neue Router Prozessablauf sein. Da bin ich mir nicht sicher, das müsste man probieren. Wir haben noch eine v18 für solche Tests am Start aber wer macht sich schon den Aufwand das nachzuverfolgen.

Die DID wird auf eine Dummy NSt. weitergeleitet. Durch Ausnahmen wollten wir dann entsprechend einige Mobilfunkrufnummern umleiten auf die CFA ...
Wenn das so ein einfaches Konstrukt ist, sprich Anruf auf DID, diese DID gehört zu einer Dummy NSt. und diese Dummy NSt. leitet per Ausnahme an die CFA, dann kann man ausgehend vom SIP Trunk die angerufene DID verfolgen und so die NSt. Nummer ermitteln welche an die CFA weiterleitet.

Hier das C# Code Schnipsel für den CFD:
C#:
string retval = "";
if(myCall.Caller.DN is ExternalLine externalLine && myCall.IsInbound) // work only for external calls
{
    string callerID = myCall.Caller.CallerID;
    string DID = myCall.Caller.CalledNumber;
    DestinationStruct dnretval = new();
    string[] range;
    foreach (var a in externalLine.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)
        {
            dnretval.CopyFrom(a.ForwardDestinations.OfficeHoursDestination);
            retval = dnretval.Internal.Number;
            break;
        }
    }
}
return retval;

Vielleicht gibt es eine einfachere Methode dafür. Ich kenne im Moment keine.

Eine zusätzliche Hilfe ist immer sich während der Entwicklung nebenher einige Variablen im Log mit höchster Priorität anzeigen zu lassen. Das ist auch schnell auskommentiert (z.B. vorletzte Zeile myCall.Error(... ) wenn es an den produktiven Code geht.

Auch hier das Beispiel in Form eines C# Code Schnipsels für den CFD:
C#:
int slen = 29;
string sformat1 = "{0,-" + slen.ToString() + "} = {1}\n";

string callID = myCall?.Caller["chid"] ?? "Unknown";
string ownname = myCall.DN.GetPropertyValue("CF_APP_NAME");
string audiofolder = Path.Combine(RecordingManager.Instance.AudioFolder, ownname);
string transferext = myCall.ReferredByDN?.Number ?? string.Empty;
string forwardext = myCall.OnBehalfOf?.Number ?? string.Empty;

string strout = "\n************************************************\n";
strout += "\n---- misc. variables ----\n";
strout += String.Format( sformat1, "own number",                   myCall.DN.Number);
strout += String.Format( sformat1, "own name",                     ownname);

strout += "\n---- CFD variables ----\n";
strout += String.Format( sformat1, "session.ani",                  myCall.Caller.CallerID);
strout += String.Format( sformat1, "session.callid",               callID);
strout += String.Format( sformat1, "session.dnis",                 myCall.DN.Number);
strout += String.Format( sformat1, "session.did",                  myCall.Caller.CalledNumber);
strout += String.Format( sformat1, "session.audioFolder",          audiofolder);
strout += String.Format( sformat1, "session.transferingExtension", transferext);
strout += String.Format( sformat1, "session.forwardingExtension",  forwardext);

strout += "\n---- Call AttachedData ----\n";
foreach (var entry in myCall.AttachedData) {
    strout +=  String.Format( sformat1, entry.Key, entry.Value);
}
  
strout += "\n---- Caller AttachedData ----\n";
foreach (var entry in myCall.Caller.AttachedData){
    strout +=  String.Format( sformat1, entry.Key, entry.Value);
}
strout += "\n************************************************\n";
myCall.Error( strout );
return;

Wenn man sich die Variablen eines solchen direkt weitergeleiteten Anrufes anschaut, dann findet man da eben nicht die Nummer der weiterleitenden NSt.. Daher das Konstrukt oben.

Wenn man den C# Code oben an Statt in einem CFD C# Code Schnipsel direkt in einem C# Anrufskript verwenden möchte, dann muss man noch einige Kleinigkeiten ändern. Es fängt damit an, dass überall das myCall in MyCall geändert werden muss.
 
Zuletzt bearbeitet:
und wieder der Hinweis:
Wenn man strukturierten Text posten möchte, dann bitte den Code Block im Forum Editor verwenden, gern auch mit der richtigen Sprachauszeichnung wie z.B. C#:
[CODE=csharp]Text hier[/CODE]

3CX_Forum_CodeBlock.png
 
  • Like
Reaktionen: mbehrens
Nachtrag zu obigen Post
https://www.3cx.de/forum/threads/rufweiterleitung.101354/post-452569

Ich hatte doch schon mal die Frage auf dem Tisch und sogar beantwortet wenn es darum geht die letzte NSt. von internen Anrufen mit direkter Weiterleitung zu ermitteln. Vielen Dank an @patrickb dass er mich daran erinnert und mir wieder geschickt hat :D

Wenn du das auch brauchst, dann lade ich das noch hier ab.
 
Ich frage mich nur ob es nicht einfacher ist den Nutzer die App auf den Handy zu installieren und die nicht im Notdienst befinden sich ausloggen.
 
  • Like
Reaktionen: fxbastler
Ich habe mich mit dem CFD noch nicht auseinander gesetzt, vielleicht muss ich das jetzt machen bezüglich der Rufumleitung. Frage ist, wenn ich die Taste mit CFD programmiere, setze ich dort auch die Lampe aktiv? Kann man mit einem Druck aktivieren und deaktivieren?
 
Frage ist, wenn ich die Taste mit CFD programmiere, setze ich dort auch die Lampe aktiv? Kann man mit einem Druck aktivieren und deaktivieren?
Nein. Diese Funktion gibt es nicht.
 
  • Like
Reaktionen: MarcosV_3CX
Welche? Das die Lampe mit leuchtet oder mit einem Druck aktivieren deaktivieren?
 
Frage ist, wenn ich die Taste mit CFD programmiere, setze ich dort auch die Lampe aktiv?
Wenn du mit Taste und Lampe eine BLF Taste an einem IP Telefon meinst, dann nein.

Man kann eine BLF Taste in der 3CX mit einer Funktion belegen und die Funktion ausführen. Die Funktion des Leuchtens kommt allein durch den Namen: BLF = Busy Lamp/Line Field. Nur wenn auf der BLF Taste der Status einer anderer NSt. abgebildet wird ändert sich die Leuchtfunktion der Lampe.
Geh also grds. davon aus, dass man mit einer CFD App oder einem Anrufskript die Leuchtfunktion einer BLF Taste (die nicht mit einer NSt. belegt ist) nicht frei ändern kann.
 
schade.... Es wäre cool wenn die Entwickler eine Systemleistungsmerkmal auch für das Telefon bereitstellen könnten.
 

Statistik des Forums

Themen
44.658
Beiträge
233.414
Mitglieder
78.444
Neuestes Mitglied
PCCAdmin