Instradamento dinamico delle chiamate in entrata in base all’ID chiamante, al DID e all’ora del giorno.
Questo script consente di reindirizzare le chiamate in entrata in base a criteri specifici quali l’ora del giorno, l’ID chiamante o il DID. Si attiva quando si riceve una chiamata su un trunk e la reindirizza verso una destinazione configurata.
Come configurare lo script di instradamento delle chiamate in base all’ora
- Accedere alla console amministrativa > Integrazioni > Script chiamate.
- Aggiungere da Store e selezionare “Time Based Call Routing”.
- Assegnare un nome allo script per facilitarne l’identificazione.
- Eseguire questo script alla ricezione di una chiamata su un trunk.
- Selezionare il trunk in cui verranno intercettate le chiamate in entrata.
- Per impostazione predefinita, lo script viene fornito con orari predefiniti che possono essere modificati modificando/aggiungendo/rimuovendo i valori dalla pianificazione.
- { DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24))
- Lo script accetta anche chiamate da tutti i DID/ID chiamante, poiché le variabili DID/Callers contengono il * dove possono essere modificate per contenere DID e ID chiamante specifici.
- Cambiare 801 in const string DestinationDN = “801”; con la destinazione selezionata.
Perché usare questo script
- Instradamento sensibile al tempo: Reindirizza automaticamente le chiamate verso destinazioni specifiche in base agli orari di lavoro.
- Gestione specifica del chiamante: Creare regole di instradamento uniche per ID chiamante o DID importanti.
- Gestione efficiente delle chiamate: Riducete gli interventi manuali automatizzando l’instradamento delle chiamate in base all’orario di lavoro o a criteri specifici.
Esempio di script
AVVERTENZA! Questo script è solo a scopo di riferimento. Per la versione più recente, scaricatela dallo store.
Script: Intercettare le chiamate in entrata
/*
* Instradamento delle chiamate su base temporale - Utilizzare il codice con cautela!
* Le chiamate saranno intercettate e reindirizzate al DestinationDN specificato nei seguenti orari:
* Dal lunedì alla domenica: dalle 17:30 alle 7:00
* Il DN di destinazione corrente è impostato su “801”. Modificare la destinazione con qualsiasi interno del sistema o con l'interno desiderato.
*
* ISTRUZIONI
* - Configurare data e ora (riga 31)
* - Cambiare il DN di destinazione e modificare il valore della costante DestinationDN in qualsiasi destinazione si voglia instradare la chiamata (riga 26).
*/
#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
{
// The destination DN to which the call will be redirected
const string DestinationDN = "801";
// 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.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Tuesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Wednesday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Thursday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Friday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Saturday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Saturday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) },
{ DayOfWeek.Sunday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24)) },
{ DayOfWeek.Sunday, new Schedule.PeriodOfDay(TimeSpan.FromHours(0), TimeSpan.FromHours(7)) }
};
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);
// Intercept calls during the specified schedule
if (schedule.IsActiveTime(currentTime))
{
string[] DIDs = { "*" }; // Allow all DIDs
string[] Callers = { "*" }; // Allow all Callers
var destination_struct = new DestinationStruct(ps.GetDNByNumber(DestinationDN));
// Check if the call's DID and CallerID match the interception criteria
if ((DIDs.Contains(DIDNumber) || DIDs.Contains("*")) &&
(Callers.Contains(CallerID) || Callers.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);
}
}
}
}



