Направляйте входящие вызовы по нужному направлению.

Скрипт “Маршрутизация вызовов на основе DID” перехватывает входящие вызовы и проверяет набранный номер по списку в файле. Это означает, что правила для входящих DID легко настраивать – просто обновляйте файл. Когда номер совпадает с номером из списка, вызов перенаправляется в указанное место назначения. Если настройки транка слишком строгие, а совпадения при этом нет, вызов просто блокируется.

Как работает сценарий маршрутизации входящих вызовов по DID:

  1. Скрипт открывает файл с именем routes.json, в котором перечислены ваши внешние телефонные номера и внутренние получатели вызовов.
  2. Сравнивается номер входящего вызова с номерами в файле.
  3. Если совпадение найдено, вызов направляется соответствующему получателю.

Использование сценария:

  • В консоли администрирования перейдите в раздел Console > Integrations > Call Scripts.
  • Добавьте из магазина и выберите “Inbound DID Routing”.
  • Назовите сценарий для удобства.
  • Настройте сценарий на запуск при поступлении вызова на транк (или при наборе этого DID).
  • Выберите транк или DID для мониторинга.
  • Загрузите свой файл, в котором перечислены телефонные номера и пункты назначения.
  • Если вы переименуете файл, обновите конфигурацию сценария.
  • Например, если вы переименуете файл JSON, обновите переменную jsonFileName соответствующим образом.

Примечание:

Если сценарий настроен на запуск при вызове на DID, DID и пункт назначения также должны быть указаны в файле json, иначе вызов будет прерван.

Файл .json должен быть отформатирован следующим образом:

JSON

{
"<did_number>": "<DestinationType>.<DN.Number>."
}

Например: DID 112233, маршрутизируемый на добавочный номер пользователя 100, вам нужно сохранить файл следующим образом;

JSON

{
"112233":"Extension.100."
}

Реализация  и функциональность скрипта:

Реализация:

  • Использует объект ExternalLine и свойство IsInbound для проверки, является ли вызов входящим в телефонную систему.
  • Использует метод GetPropertyValue, чтобы получить имя сценария вызова и создать путь, по которому хранится файл.
  • Использует метод ReadAllText из класса C# File, чтобы прочитать содержимое файла.
  • Десериализует объект Json и извлекает DID и пункт назначения.
  • Использует структуру назначения, чтобы проверить, является ли назначение действительным, и, если оно действительно, построить назначение.
  • Маршрутизирует вызов в пункт назначения с помощью RouteToAsync.

Функциональность:

  • Считывает пары ключ/значение из файла routes.json.
  • Маршрутизирует вызов в пункт назначения на основе пары ключ/значение.

ВНИМАНИЕ! Чтобы увидеть этот скрипт в магазине 3CX, требуется версия v20 U5. Скрипт предназначен только для справки. Для получения последней версии загрузите его из магазина 3CX.

#nullable disable
using CallFlow;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace dummy
{
public class InterceptInboundCall : ScriptBase
{
// Specify here your json filename with routing
// Structure of JSON is "Did_number":"[destination]"
// the destination is defined as string presentation of DestinationStruct
//Extension.. - routing to the extension (can be used with system extensions as well), forwarding rules are applied
//VoiceMail.<ringgroup,queue,extension number>. - voicemail of the specific entity.
// EG: "1222333":"Extension.100."

const string jsonFileName = "routes.json";

public override async Task StartAsync()
{
if (MyCall.Caller.DN is ExternalLine externalLine && MyCall.IsInbound)
{
var DIDNumber = MyCall.Caller.CalledNumber;

var cfdAppName = MyCall.CallHandler.MyDN.GetPropertyValue("CF_APP_NAME");
string cfdPath;

if (!string.IsNullOrEmpty(cfdAppName))
cfdPath = cfdAppName.Split('.')[0];
else
cfdPath = MyCall.CallHandler.MyDN.Number.Split('.')[0];

var filePath = System.IO.Path.Combine(MyCall.PS.GetParameterValue("IVRPROMPTPATH"), "Callflows", cfdPath, jsonFileName);
string jsonString = File.ReadAllText(filePath);
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);

if (data.TryGetValue(DIDNumber, out var route))
{
var has_valid_destination = DestinationStruct.TryParse(route, out var destination_struct);
//if destination is malformed, the call is not intercepted
if (has_valid_destination)
{
var result = await MyCall.RouteToAsync(destination_struct);
//we are here when forwarding is successful, so we set returned value to true and put log message to CallFlow service log
MyCall.Info($"{DIDNumber} has been redirected to {route} ({result}");
return true;
}
}
}
return false;
}
}
}

Другие скрипты CFD

На нашем сайте есть коллекция скриптов CFD. Ознакомьтесь с ними и узнайте, как можно автоматизировать 3CX в соответствии с вашими потребностями.