Легко изменяйте статус своего добавочного номера, набирая специальный код.
Этот набор скриптов позволяет делать программное изменение статуса добавочного номера — “Доступен”, “Отошел”, “Вне офиса”, “Настраиваемый 1” или “Настраиваемый 2” — путем набора определенного кода. Так пользователь может быстро обновлять информацию о своей доступности, не заходя в интерфейс 3CX.
Система также включает предустановленные коды для изменения статусов профиля, которые можно использовать вместо пользовательских кодов. Данный скрипт демонстрирует гибкость технологии Call Processing Scripts и может быть модифицирован для добавления дополнительных функций.
Настройка скрипта изменения статуса добавочного номера
- Перейдите в Admin Console > Integrations > Call Scripts.
- Нажмите Add from Store и выберите Set Extension Available Status.
- Укажите название скрипта, например, “Available”.
- Запустите скрипт, когда пользователь набирает код.
- Добавьте выбранный код, например, 57.
- Выберите System Wide.
Настройка скриптов для других статусов
Выполните вышеуказанные действия.
- В шаге 3 используйте уникальное имя для каждого скрипта, например, “Set Away”.
- В шаге 5 назначьте уникальный код для каждого скрипта, например, 58 для “Out of Office”, 59 для “Custom 1”.
Как используется изменение статуса
- Быстрое обновление статуса: изменяйте свою доступность без доступа к веб-клиенту или мобильному приложению.
- Настраиваемые параметры: адаптируйте коды и статусы к вашим потребностям.
- Гибкость и масштабируемость: расширяйте функциональность с помощью дополнительных скриптов по мере необходимости.
Код скрипта
ВНИМАНИЕ! Код скрипта приведен только для справки. Актуальную версию можно скачать из Магазина 3CX.
Script: Available
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
using System.Linq;
using System.Collections.Generic;
namespace dummy
{
public class SetAvailableStatus : ScriptBase
{
public override async Task StartAsync()
{
var profileName = "Available";
var prompt = "ST_AVAILABLE_SET";
//-----call is direct from the extension and profile extension has required profile
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN
&& ext.FwdProfiles.FirstOrDefault(x=>x.Name.Equals(profileName)) is FwdProfile fwdProfile)
{
//set current status
ext.CurrentProfile = fwdProfile;
//reset profile override
ext.ResetCurrentProfileOverride();
ext.Save();
//----play system prompt about current status
try
{
MyCall.Info($"Extension {ext.Number} is set to {profileName}");
await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(ext.GetPropertyValue("PROMPTSETID"), [prompt], PlayPromptOptions.Blocked))
.Unwrap();
}
catch
{
//ignore prompt playback failures. action is performed
}
//we made modifications
return true;
}
//we did not make any modifications
return false;
}
}
}
Script: Away
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
using System.Linq;
using System.Collections.Generic;
namespace dummy
{
public class SetAwayStatus : ScriptBase
{
public override async Task StartAsync()
{
var profileName = "Away";
var prompt = "ST_AWAY_SET";
//-----call is direct from the extension and profile extension has required profile
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN
&& ext.FwdProfiles.FirstOrDefault(x=>x.Name.Equals(profileName)) is FwdProfile fwdProfile)
{
//set current status
ext.CurrentProfile = fwdProfile;
//reset profile override
ext.ResetCurrentProfileOverride();
ext.Save();
//----play system prompt about current status
try
{
MyCall.Info($"Extension {ext.Number} is set to {profileName}");
await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(ext.GetPropertyValue("PROMPTSETID"), [prompt], PlayPromptOptions.Blocked))
.Unwrap();
}
catch
{
//ignore prompt playback failures. action is performed
}
//we made modifications
return true;
}
//we did not make any modifications
return false;
}
}
}
Script: Out of office
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
using System.Linq;
using System.Collections.Generic;
namespace dummy
{
public class SetDNDStatus : ScriptBase
{
public override async Task StartAsync()
{
var profileName = "Out of office";
var prompt = "ST_OUTOFFICE_SET";
//-----call is direct from the extension and profile extension has required profile
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN
&& ext.FwdProfiles.FirstOrDefault(x=>x.Name.Equals(profileName)) is FwdProfile fwdProfile)
{
//set current status
ext.CurrentProfile = fwdProfile;
//reset profile override
ext.ResetCurrentProfileOverride();
ext.Save();
//----play system prompt about current status
try
{
MyCall.Info($"Extension {ext.Number} is set to {profileName}");
await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(ext.GetPropertyValue("PROMPTSETID"), [prompt], PlayPromptOptions.Blocked))
.Unwrap();
}
catch
{
//ignore prompt playback failures. action is performed
}
//we made modifications
return true;
}
//we did not make any modifications
return false;
}
}
}
Script: Custom 1
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
using System.Linq;
using System.Collections.Generic;
namespace dummy
{
public class SetCustom1Status : ScriptBase
{
public override async Task StartAsync()
{
var profileName = "Custom 1";
var prompt = "ST_CUSTOM1_SET";
//-----call is direct from the extension and profile extension has required profile
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN
&& ext.FwdProfiles.FirstOrDefault(x=>x.Name.Equals(profileName)) is FwdProfile fwdProfile)
{
//set current status
ext.CurrentProfile = fwdProfile;
//reset profile override
ext.ResetCurrentProfileOverride();
ext.Save();
//----play system prompt about current status
try
{
MyCall.Info($"Extension {ext.Number} is set to {profileName}");
await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(ext.GetPropertyValue("PROMPTSETID"), [prompt], PlayPromptOptions.Blocked))
.Unwrap();
}
catch
{
//ignore prompt playback failures. action is performed
}
//we made modifications
return true;
}
//we did not make any modifications
return false;
}
}
}
Script: Custom 2
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using CallFlow;
using System.Linq;
using System.Collections.Generic;
namespace dummy
{
public class SetCustom2Status : ScriptBase
{
public override async Task StartAsync()
{
var profileName = "Custom 2";
var prompt = "ST_CUSTOM2_SET";
//-----call is direct from the extension and profile extension has required profile
if (MyCall.Caller.DN is Extension ext
&& MyCall.ReferredByDN is not DN
&& ext.FwdProfiles.FirstOrDefault(x=>x.Name.Equals(profileName)) is FwdProfile fwdProfile)
{
//set current status
ext.CurrentProfile = fwdProfile;
//reset profile override
ext.ResetCurrentProfileOverride();
ext.Save();
//----play system prompt about current status
try
{
MyCall.Info($"Extension {ext.Number} is set to {profileName}");
await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(ext.GetPropertyValue("PROMPTSETID"), [prompt], PlayPromptOptions.Blocked))
.Unwrap();
}
catch
{
//ignore prompt playback failures. action is performed
}
//we made modifications
return true;
}
//we did not make any modifications
return false;
}
}
}



