Anrufskript: Anruf abfangen und umleiten

MarcusK_3CX

Teammitglied
Mitglied seit
24. März 2023
Beiträge
534

Leiten Sie eingehende Anrufe dynamisch weiter, basierend auf Anrufer-ID, DID und Tageszeit.​

Mit diesem Skript können Sie eingehende Anrufe basierend auf bestimmten Kriterien wie Tageszeit, Anrufer-ID oder DID umleiten. Es wird aktiviert, wenn ein Anruf auf einer Amtsleitung eingeht, und leitet den Anruf an ein konfiguriertes Ziel um.

S​

...
Original-Blogbeitrag weiterlesen
 
  • Like
Reaktionen: MarcosV_3CX
Hallo.

Wo kònnen die CIDs denn hinterlegt werden?
Ich haben einen Kunden der hat etwa 100 Nummern die auf eine Prio-Warteschleife geroutet werden.
Das wurde in der V18 per IVR realisiert, was ja inzwischen dort nicht mehr geht.
Update:
Im Script 100 Nummern zu hinterlegen, ist ja unsinnig, hier kann auch ein Pfad zu einer .txt Datei hinterlegt werden?

Grùsse
 
Dieses Skript, das timebasecallscript.cs, beißt sich mit dem holiday.cs. Man kann nur eines von beiden haben und nutzen.

Warum geht das o.g. mit einer v20 nicht mehr? Sprich: 100 CID anlegen und auf einen IVR als Ansage und dann auf die Prio WS leiten.
 
Hallo fxbaster.


Wir haben das damals auf der Maschine mit einem shell script per CLI realisiert.
 
Ja, das Fehlen der Skripte hat uns auch beschäftigt. Aber so ein Skript ist halt auch nie im Backup drin.

Warum nicht mit den CID der 3CX arbeiten? Ist euch das zu umständlich? Muss es denn eine Textdatei sein (z.B. weil die anderswo dynamisch generiert wird)?
 
Guten Morgen fxbastler.

Ja, das war damals auch der Gedanke, NUR wenn der Kunde dann die Kopfnummer wàhlt landet er auch immer dort, und nicht bei der Vermittlung.
Diese Funktion sollte nur bei bestimmten Durchwahlen so sein, ansonsten normales Routing.
Das war der Grund warum, wir das dann ùber das Shellscript gemacht haben.
 
Ja, das war damals auch der Gedanke, NUR wenn der Kunde dann die Kopfnummer wàhlt landet er auch immer dort, und nicht bei der Vermittlung.
Diese Funktion sollte nur bei bestimmten Durchwahlen so sein, ansonsten normales Routing.
Dafür sind CID da.

Aber: wir hijacken hier den Thread. Dein Problem oder mögliche Lösung hat nun wirklich ganz wenig bis gar nichts mit dem o.g. Anrufskript zu tun.
Dann mach bitte einen neuen Thread auf wenn dir daran gelegen ist.
 
Ja, wollte das garnicht so gross machen.
Es war nur, weil eben bei auch die Rede von CIDs steuern die Rede war.
Wobei die CIDs ja fùr alle Durchwahlen gelten und nicht nur fùr bestimmte.
 
Zuletzt bearbeitet:
Dieses Skript, das timebasecallscript.cs, beißt sich mit dem holiday.cs. Man kann nur eines von beiden haben und nutzen.

Warum geht das o.g. mit einer v20 nicht mehr? Sprich: 100 CID anlegen und auf einen IVR als Ansage und dann auf die Prio WS leiten.
Hallo fxbastler

Ich habe vorgestern genau das gleiche Problem und müsste kreativ sein. Ich habe - mit etwa externe KI hilfe auch - ein neue Skript gemacht wo beides macht:

1. Schau ob Feiertage ist (wenn ja natürlich einspielen) und
2. schaut die GEschäftszeit

WIr haben das gebraucht, weil die Direktnummere sollten an Combox umgeleitet werden ohne automatische Statusänderung.

Ist das was du eigentlich brauchst?
 
Hallo fxbastler

...

Ist das was du eigentlich brauchst?
Danke für die Nachfrage. Nein, wir brauchen das nicht. Das von mir war nur ein Hinweis.

Unabhängig davon habe wir schon längst andere Konstrukte und noch mehr. Wir bauen uns das Nötige, uns fehlt grundsätzlich nichts (außer Zeit und schönes Wetter).

Wenn du also etwas brauchst, dann mach bitte einen neuen Thread auf :)
 
  • Like
Reaktionen: Remo Meyer
Danke für die Nachfrage. Nein, wir brauchen das nicht. Das von mir war nur ein Hinweis.

Unabhängig davon habe wir schon längst andere Konstrukte und noch mehr. Wir bauen uns das Nötige, uns fehlt grundsätzlich nichts (außer Zeit und schönes Wetter).

Wenn du also etwas brauchst, dann mach bitte einen neuen Thread auf :)
Ouch, dann war einen Interpretationsfehler von mir, sorry.

Zeit wurde mir auch absurd viel helfen und schönes Wetter wünsche ich mich auch mindestens am Wochenende auf die Piste.

Grüss aus der Schweiz
 
Ist es möglich das man bei dem Time Base Call Routing Script aus dem Store auch an eine externe Nummer weiterleitet?
 
Ist es möglich das man bei dem Time Base Call Routing Script aus dem Store auch an eine externe Nummer weiterleitet?
Theoretisch sollte das gehen. Musste man mal testen. Sofern nicht, mit einem einfach CFD dazwischen gehts.

Du routest einfach an den Script und der via Transfer Element an die externe Nummer.

Kombinieren könntest du es sonst auch in einen Script: Einfach die entsprechenden Elemente aus Script A in Script B einbauen.
 
  • Like
Reaktionen: MarcosV_3CX
Ich habs nicht geschafft ohne ein zusätzliches Script. Gehts bei dir?
 
Wie kann ich eine oder mehrere DW von dem timebasecallscript.cs aus dem Store ausnehmen? Damit ich dann per direkter DW trotzdem Durchkomme...

THX
 
Ich hab es jetzt selber hinbekommen, falls es einer brauchen sollte:

/*
* Time Base Call Routing - Use code with caution!
* Calls will be intercepted and redirected to the specified DestinationDN during the following times:
* Monday to Sunday: 5:30 PM to 7:00 AM
* The current destination DN is set to "801" modify destination to any system extension or extension you want.
*
* INSTRUCTIONS
* - Configure Date & Time (Line 31)
* - Change the destination DN, and modify the value of the constant DestinationDN to any destination you want to route call (Line 26).
*/

/*
* Script Anpassung by OpIT GmbH
* Ausnahme Liste hinzugefügt
* static readonly string[] ExcludedDIDs = { "DID Nummer", "DID Nummer" };
* Dort die Externe und Interne Rufnummer angeben
*/

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

namespace interceptcall
{
public class InterceptInboundCall : ScriptBase<InterceptInboundCall>
{
// The destination DN to which the call will be redirected
const string DestinationDN = "496";

// List of DIDs that should not be intercepted (add your DIDs here)
static readonly string[] ExcludedDIDs = { "+4312345492", "492" };

// Define a schedule for when calls should be intercepted
static readonly Schedule schedule = new Schedule(RuleHoursType.SpecificHours)
{
{ DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },
{ DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },
{ DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },

{ DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },
{ DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },
{ DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },

{ DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },
{ DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },
{ DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },

{ DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },
{ DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },
{ DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },

{ DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12.0), TimeSpan.FromHours(24)) },
{ DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(8.0)) },

{ DayOfWeek.Saturday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(24)) },

{ DayOfWeek.Sunday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(24)) },
};

public override async void Start()
{
// Handle calls as a detached task, catching all exceptions.
try
{
await Task.Run(async () =>
{
try
{
MyCall.Debug($"Script start delay: {DateTime.UtcNow - MyCall.LastChangeStatus}");
MyCall.Debug($"Incoming connection {MyCall} from {MyCall.Caller}");
bool intercepted = false;
var ps = MyCall.PS as PhoneSystem;

if (MyCall.Caller.DN is ExternalLine externalLine)
{
var DIDNumber = MyCall.Caller["inbound_did"];
var CallerID = MyCall.Caller.CallerID;
var currentTime = externalLine.Now(out var utc, out var timezone, out var groupmode);

// Check if the DID should be excluded
bool isExcludedDID = ExcludedDIDs.Contains(DIDNumber);

if (schedule.IsActiveTime(currentTime) && !isExcludedDID)
{
string[] AllowedCallers = { "*" }; // Allow all Callers
var destination_struct = new DestinationStruct(ps.GetDNByNumber(DestinationDN));

// Check if the call's DID and CallerID match the interception criteria
if (AllowedCallers.Contains(CallerID) || AllowedCallers.Contains("*"))
{
try
{
var result = await MyCall.RouteToAsync(destination_struct);
MyCall.Info($"{CallerID} -> {DIDNumber} has been redirected to {DestinationDN} ({result})");
intercepted = true;
}
catch (Exception ex)
{
MyCall.Info($"{CallerID} -> {DIDNumber}: interception failed. '{DestinationDN}' is not reachable: {ex}");
}
}
else
{
MyCall.Info($"{CallerID} -> {DIDNumber}@{currentTime}: Default CallerID/DID based routing will be applied");
}
}
}

MyCall.Return(intercepted);
}
catch (Exception ex)
{
MyCall.Error($"Script execution failed: {ex}");
MyCall.Return(false);
}
});
}
catch (Exception ex)
{
MyCall.Error($"Task execution failed: {ex}");
MyCall.Return(false);
}
}
}
}
 
Ich kann leider meinen Post nicht Editieren, deshalb hier noch mal....

C#:
/*

 * Time Base Call Routing - Use code with caution!

 * Calls will be intercepted and redirected to the specified DestinationDN during the following times:

 * Monday to Sunday: 5:30 PM to 7:00 AM

 * The current destination DN is set to "801" modify destination to any system extension or extension you want.

 *

 * INSTRUCTIONS

 * - Configure Date & Time (Line 31)

 * - Change the destination DN, and modify the value of the constant DestinationDN to any destination you want to route call (Line 26).

 */



/*

 * Script Anpassung by OpIT GmbH

 * Ausnahme Liste hinzugefügt

 * static readonly string[] ExcludedDIDs = { "DID Nummer", "DID Nummer" };

 * Dort die Externe und Interne Rufnummer angeben

 */



#nullable disable

using CallFlow;

using System;

using System.Threading;

using System.Threading.Tasks;

using TCX.Configuration;

using TCX.PBXAPI;

using System.Collections.Generic;

using System.Linq;

using CallFlow.CFD;



namespace interceptcall

{

    public class InterceptInboundCall : ScriptBase<InterceptInboundCall>

    {

        // The destination DN to which the call will be redirected

        const string DestinationDN = "496";

      

        // List of DIDs that should not be intercepted (add your DIDs here)

        static readonly string[] ExcludedDIDs = { "+4312345492", "492" };

      

        // Define a schedule for when calls should be intercepted

        static readonly Schedule schedule = new Schedule(RuleHoursType.SpecificHours)

        {

            { DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },

            { DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },

            { DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },



            { DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },

            { DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },

            { DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },

          

            { DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },

            { DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },

            { DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },           



            { DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.0), TimeSpan.FromHours(24)) },

            { DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7.30)) },

            { DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12), TimeSpan.FromHours(13)) },



            { DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(12.0), TimeSpan.FromHours(24)) },

            { DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(8.0)) },

          

            { DayOfWeek.Saturday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(24)) },

          

            { DayOfWeek.Sunday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(24)) },

        };



        public override async void Start()

        {

            // Handle calls as a detached task, catching all exceptions.

            try

            {

                await Task.Run(async () =>

                {

                    try

                    {

                        MyCall.Debug($"Script start delay: {DateTime.UtcNow - MyCall.LastChangeStatus}");

                        MyCall.Debug($"Incoming connection {MyCall} from {MyCall.Caller}");

                        bool intercepted = false;

                        var ps = MyCall.PS as PhoneSystem;



                        if (MyCall.Caller.DN is ExternalLine externalLine)

                        {

                            var DIDNumber = MyCall.Caller["inbound_did"];

                            var CallerID = MyCall.Caller.CallerID;

                            var currentTime = externalLine.Now(out var utc, out var timezone, out var groupmode);



                            // Check if the DID should be excluded

                            bool isExcludedDID = ExcludedDIDs.Contains(DIDNumber);

                          

                            if (schedule.IsActiveTime(currentTime) && !isExcludedDID)

                            {

                                string[] AllowedCallers = { "*" }; // Allow all Callers

                                var destination_struct = new DestinationStruct(ps.GetDNByNumber(DestinationDN));



                                // Check if the call's DID and CallerID match the interception criteria

                                if (AllowedCallers.Contains(CallerID) || AllowedCallers.Contains("*"))

                                {

                                    try

                                    {

                                        var result = await MyCall.RouteToAsync(destination_struct);

                                        MyCall.Info($"{CallerID} -> {DIDNumber} has been redirected to {DestinationDN} ({result})");

                                        intercepted = true;

                                    }

                                    catch (Exception ex)

                                    {

                                        MyCall.Info($"{CallerID} -> {DIDNumber}: interception failed. '{DestinationDN}' is not reachable: {ex}");

                                    }

                                }

                                else

                                {

                                    MyCall.Info($"{CallerID} -> {DIDNumber}@{currentTime}: Default CallerID/DID based routing will be applied");

                                }

                            }

                        }



                        MyCall.Return(intercepted);

                    }

                    catch (Exception ex)

                    {

                        MyCall.Error($"Script execution failed: {ex}");

                        MyCall.Return(false);

                    }

                });

            }

            catch (Exception ex)

            {

                MyCall.Error($"Task execution failed: {ex}");

                MyCall.Return(false);

            }

        }

    }

}
 

Statistik des Forums

Themen
44.549
Beiträge
233.137
Mitglieder
78.396
Neuestes Mitglied
charley.lefevre