Call Flow Script: Set Office hours via Dial codes

4786TS

Silver Partner
Mitglied seit
5. Juni 2024
Beiträge
17
Hallo,
ich habe folgendes Thema bei einem Kunden:
Wenn Abteilung B außer Dienst geht wird mit einem Wählcode das untenstehendes Skript aus dem Store mittels Sterncode ausgeführt.
resetdepartmentout.cs Set Departments to force Out of office route
Dieses Skript ausführen:
Wenn ein Nutzer einen Wählcode wählt
Einen neuen Wählcode erstellen:
*961
Abteilung:
B

Im Skript (unten) steht dann allerdings in Zeile 18 folgender Kommentar (unten fett hervorgehoben):
//for all departments

Jetzt ist es so dass das komplette Telefonsystem auf außerhalb der Telefonzeiten geht und nicht nur wie gewüsncht die Abteilung B.
Deren Anrufe sollten, wenn diese außer Dienst ist, an Abteilung A gehen.
Abteilung A geht dann zur definierten Uhrzeit automatisch auf Außerhalb der Geschäftszeiten.

Kann mir bitte jemand beantworten wie ich wirklich nur diese eine Abteilung steuern kann?

Danke vielmals!

Liebe Grüße

#nullable disable
using CallFlow;
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using System.Linq;
using CallFlow.CFD;
using System.Collections.Generic;
namespace dummy
{
public class ForceClosed : ScriptBase<ForceClosed>
{
public override async Task<bool> StartAsync()
{
var ps = MyCall.PS as PhoneSystem;
if(MyCall.Caller.DN is Extension && MyCall.ReferredByDN is null)
{
//for all departments
ps.GetAll<Group>().Extract(x=>x.AllowCallService)
.Select(x=>
{
try
{
//force out of office hours until midnight
var groupCurrentTime = x.Now(out var utc, out var timezone, out var groupmode);
x.OverrideExpiresAt = (groupCurrentTime+TimeSpan.FromDays(1)).Date;
x.CurrentGroupHours = GroupHoursMode.ForceClosed;
MyCall.Info($"{x.Name} set to '{x.CurrentGroupHours}' until {x.OverrideExpiresAt}, timezone={timezone}, groupmode={groupmode}");
return x;
}
catch
{
//just ignore it
return null;
}
}).OfType<Group>().OMSave();
try
{
var result = await MyCall.AssureMedia()
.ContinueWith(_ => MyCall.PlayPrompt(null, [ "OHOVERRIDE_OUT"], PlayPromptOptions.Blocked), TaskContinuationOptions.OnlyOnRanToCompletion)
.Unwrap();
}
catch
{
//nothing to report. changes are applied
}
return true;
}
return false;
}
}
}
 
Im Skript (unten) steht dann allerdings in Zeile 18 folgender Kommentar (unten fett hervorgehoben):
//for all departments
Richtig, dann ist das ...

Jetzt ist es so dass das komplette Telefonsystem auf außerhalb der Telefonzeiten geht und nicht nur wie gewüsncht die Abteilung B.
die Folge.


Zu deiner Frage:
Kann mir bitte jemand beantworten wie ich wirklich nur diese eine Abteilung steuern kann?
Eine einfache universelle Lösung ist, wenn man die Hauptabteilung der Nebenstelle die anruft ermittelt und nur diese Abteilung umschaltet, so wie z.B. hier:

resetdepartmentout_own_department.cs
C#:
#nullable disable
using CallFlow;
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using System.Linq;
using CallFlow.CFD;
using System.Collections.Generic;
namespace dummy
{
    public class ForceClosedOwnMainDepartment : ScriptBase<ForceClosedOwnMainDepartment>
    {
        public override async Task<bool> StartAsync()
        {
            if (MyCall.Caller.DN is Extension caller && MyCall.ReferredByDN is null)
            {
                // get own main department
                var group = caller.GroupMembership
                    .Where(x => x.IsPrimary)
                    .FirstOrDefault()?
                    .Group;

                if (group == null || !group.AllowCallService)
                    return false;

                try
                {
                    // force out of office hours until midnight
                    var groupCurrentTime = group.Now(out var utc, out var timezone, out var groupmode);
                    group.OverrideExpiresAt = (groupCurrentTime + TimeSpan.FromDays(1)).Date;
                    group.CurrentGroupHours = GroupHoursMode.ForceClosed;
                    MyCall.Info($"{group.Name} set to '{group.CurrentGroupHours}' until {group.OverrideExpiresAt}, timezone={timezone}, groupmode={groupmode}");
                    group.Save();
                }
                catch
                {
                    return false;
                }

                try
                {
                    var result = await MyCall.AssureMedia()
                        .ContinueWith(_ => MyCall.PlayPrompt(null, ["OHOVERRIDE_OUT"], PlayPromptOptions.Blocked), TaskContinuationOptions.OnlyOnRanToCompletion)
                        .Unwrap();
                }
                catch
                {
                    // nothing to report. changes are applied
                }
                return true;
            }
            return false;
        }
    }
}

Hinweis: Wenn da einer anruft dessen Hauptabteilung die Abteilung A ist, dann schaltet er damit diese um. Wenn das anders gedacht ist (z.B. immer die Abteilung B umschalten, egal wer da anruft), dann melde dich nochmal.

Hinweis #2: Das hatte ich schon hier irgendwo im Forum geschrieben aber habe es nicht mehr gefunden. Ich durfte das komplett noch einmal schreiben. Das Skript ist ausnahmsweise nur geschrieben und gelesen aber nicht getestet, mach das bitte.

Suchstichwort: Schnipsel C# Gruppe Main Department MainDepartment
 
Hallo, danke dir vielmals!
Das funktioniert wie beschrieben.

Ich bin leider erst heute dazu gekommen dass ich das Skript teste und muss sagen die 3cx Community begeistert mich immer wieder! :)

Ideal wäre nun noch wenn wie im ersten Hinweis beschrieben IMMER Abteilung B geschaltet wird.
Sodass egal welche Abteilung den Sterncode wählt immer Abteilung B umgeschalten wird.

Leider ist für mich nach wie vor nicht nachvollziehbar wozu dann die Abteilungsauswahl bei den Call Flows überhaupt möglich ist wenn es eh keine Rolle spielt.

Danke!
 
Leider ist für mich nach wie vor nicht nachvollziehbar wozu dann die Abteilungsauswahl bei den Call Flows überhaupt möglich ist wenn es eh keine Rolle spielt.
Das kann dann eine Rolle spielen, wenn man dieses möchte:
Ideal wäre nun noch wenn wie im ersten Hinweis beschrieben IMMER Abteilung B geschaltet wird.
Sodass egal welche Abteilung den Sterncode wählt immer Abteilung B umgeschalten wird.

Hier das neue Anrufskript resetdepartmentout_callscript_department.cs

C#:
using CallFlow;
using System;
using System.Threading.Tasks;
using TCX.Configuration;
using System.Linq;
using CallFlow.CFD;
using System.Collections.Generic;
namespace dummy
{
    public class ForceClosedCSDepartment : ScriptBase<ForceClosedCSDepartment>
    {
        public override async Task<bool> StartAsync()
        {
            if (MyCall.Caller.DN is Extension caller && MyCall.ReferredByDN is null)
            {
                // get call script main department
                var group = MyCall.DN.GroupMembership
                    .Where(x => x.IsPrimary)
                    .FirstOrDefault()?
                    .Group;

                if (group == null || !group.AllowCallService)
                {
                    MyCall.Error("error: call script not assigned to department - exit\n");
                    return false;
                }

                try
                {
                    // force out of office hours until midnight
                    var groupCurrentTime = group.Now(out var utc, out var timezone, out var groupmode);
                    group.OverrideExpiresAt = (groupCurrentTime + TimeSpan.FromDays(1)).Date;
                    group.CurrentGroupHours = GroupHoursMode.ForceClosed;
                    MyCall.Info($"{group.Name} set to '{group.CurrentGroupHours}' until {group.OverrideExpiresAt}, timezone={timezone}, groupmode={groupmode}");
                    group.Save();
                }
                catch
                {
                    return false;
                }

                try
                {
                    var result = await MyCall.AssureMedia()
                        .ContinueWith(_ => MyCall.PlayPrompt(null, ["OHOVERRIDE_OUT"], PlayPromptOptions.Blocked), TaskContinuationOptions.OnlyOnRanToCompletion)
                        .Unwrap();
                }
                catch
                {
                    // nothing to report. changes are applied
                }
                return true;
            }
            return false;
        }
    }
}

Dieses Anrufskript muss einer Abteilung zugewiesen werden damit das funktioniert. Das Skript schaltet diese (seine) Abteilung bis zum Ende des Tages auf OoO.
 
Vielen lieben Dank für die Unterstützung!
Das ist nun perfekt!
 

Statistik des Forums

Themen
44.414
Beiträge
232.721
Mitglieder
78.331
Neuestes Mitglied
b2daniel