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

  1. Accedere alla console amministrativa > Integrazioni > Script chiamate.
  2. Aggiungere da Store e selezionare “Time Based Call Routing”.
  3. Assegnare un nome allo script per facilitarne l’identificazione.
  4. Eseguire questo script alla ricezione di una chiamata su un trunk.
  5. Selezionare il trunk in cui verranno intercettate le chiamate in entrata.
  6. Per impostazione predefinita, lo script viene fornito con orari predefiniti che possono essere modificati modificando/aggiungendo/rimuovendo i valori dalla pianificazione.
    1. { DayOfWeek.Monday, new Schedule.PeriodOfDay(TimeSpan.FromHours(17.5), TimeSpan.FromHours(24))
  7. 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.
  8. 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);
}
}
}
}