Call Flow Script: Set Office hours via Dial codes

4786TS

Silver Partner
Advanced Certified
Mitglied seit
5. Juni 2024
Beiträge
19
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!
 
Hallo nochmal, ähnliches Problem mit neuem Kunden.
Ich möchte dass ein Anruf auf eine Nebenstelle außerhalb der Öffnungszeiten den Regeln des Departments folgt.
Das funktioniert auch sauber, vorausgesetzt die Umschaltung funktioniert anhandd der definierten Geschäftszeiten.
Wenn ich aber, so wie jetzt, mittels Skript auf OoO schalte hat das keine Auswirkung auf die Nebenstelle.
In der Nebenstelle habe ich eine Ausnahme definiert dass bei OoO der Call an eine externe Nummer (in diesem Fall die Kopfnummer damit die Department Regeln greifen) geht.

Vielleicht kann mir jemand helfen und die geistige Blockade lösen.
Danke!
 
Wenn ich aber, so wie jetzt, mittels Skript auf OoO schalte hat das keine Auswirkung auf die Nebenstelle.
Wenn du das Codeschnipsel von oben verwendest und in der NSt. die Funktion Status während der Geschäftszeiten automatisch auf 'Verfügbar' setzen nutzt, dann ja: diese NSt. wird in diesem Moment dadurch nicht umgeschalten.

Eine automatische NSt. Umschaltung mit dieser Funktion in einer 3CX funktioniert nur dann, wenn die 3CX das auf Grund der eingestellten GZ das mit ihrer Automatik selber tut.
Das war schon immer so.™
 
Alles klar, danke dir!
 
  • Like
Reaktionen: fxbastler
Alles klar, danke dir!
Ich hatte jetzt eher die Frage erwartet:
Kann das Skript beim Aufruf nicht nur den Zustand der Abteilung zu NGZ / OoO ändern sondern auch deren prim. Nebenstellen die darauf hin umschalten sollten (s.o.)?

Die Antwort wäre gewesen: ja, kann es, wenn man es entspr. erweitert. Das ist 'nur' eine (recht lange) Zeile. ;)
 

Statistik des Forums

Themen
44.909
Beiträge
234.113
Mitglieder
78.581
Neuestes Mitglied
DevilOfHell