[CFD] User in Warteschleife IN or OUT überprüfen

Ben04

3CX MVP
Silver Partner
Mitglied seit
4. August 2023
Beiträge
727
Guten Morgen,

Ich habe mal wieder ein neues Projekt und benötige mal wieder Hilfe.



Mein Ziel ist es, am Ende per „Condition“ den Staus einer Nebenstelle von einer Warteschleife ablesen zu können und zu ändern.

In Textform:

Ist User angemeldet, n Q?

Ja = Selfmade Ansage – Menü – Abmelden? (Taste 1), Nichts ändern? (Taste 2).

Nein = Selfmade Ansage – Menü – Anmelden? (Taste 1), Nichts ändern? (Taste 2).



Es geht mir um die Punkte, zu sehen, ob User angemeldet/abgemeldet sind, und dementsprechend wieder das Gegenteil zu schalten.

Das Umschalten geschieht ja per „Set Queue Extension Status“.

Ich bräuchte also vorerst nur Hilfe bei dem Auslesen einer bestimmten Nebenstelle.

(Das Skript prüft ja am Ende dann für jeden User einzeln.)
 
Grundsätzlich gibt es dafür den CFD Block Get Queue Extensions mit dem Query Type LoggedIn. Der Rückgabewert ist allerdings eine Liste von Strings mit der Länge GET LIST ITEM COUNT, über die man mittels einer CFD Schleife iterieren muss, um für jedes Element der Liste das man mit GET LIST ITEM bekommt zu schauen, ob die gewünschte Nummer enthalten ist.

Der klassische CFD Weg ist:
  1. globale Projektvariable LOOP_CNT mit Startwert 0 definieren
  2. globale Projektvariable LOOP_FOUND mit Startwert false festlegen
  3. den CFD Block Get Queue Extension für die WS benutzen
  4. CFD Block Loop benutzen, Laufbedingung ist: so lange schleifen wie LOOP_CNT < GET LIST ITEM COUNT(GetQueueExtensions.ExtensionNumberList)
  5. in der Schleife den Wert von GET LIST ITEM(LOOP_CNT) auf die gewünschte Nummer prüfen (CFD Block Create a Condition);
    wenn der Wert gefunden wird, dann die Variable LOOP_FOUND auf true setzen; ggf. noch weitere Abfragen für diese gefunde Nummer durchführen (Available, Custom 1, Busy usw.); die Variable LOOP_CNT auf auf den Wert von GET LIST ITEM COUNT(GetQueueExtensions.ExtensionNumberList) (damit die Schleife beendet wird)
  6. am Ende der Schleife (noch in der Schleife) den Wert von LOOP_CNT um eins erhöhen
  7. hinter der Schleife mit dem CFD Block Create a Condition den Wert von LOOP_FOUND auf true oder false prüfen


Man kann das - die gezielte Abfrage einer WS auf LoggedIn eines speziellen Agenten - auch mit einer einzelnen Zeile C# lösen:
C#:
return ((PhoneSystem.Root.GetDNByNumber("800") as Queue).QueueAgents.Where(x => x.DN.Number.Equals("200") && (x.DN as Extension).QueueStatus == QueueStatusType.LoggedIn)).Count() > 0?"true":"false";
wobei 800 die Nummer der WS und 200 die Nummer des Nutzers ist. Dieses C# Schnipsel gibt den String true (wenn in WS und angemeldet) oder false (wenn nicht in WS oder in der WS nicht angemeldet) zurück.

Achtung: in all diesen Konstellationen wird nicht abgefragt, ob der Nutzer auch wirklich erreichbar ist (Status Verfügbar oder Custom und nicht im Gespräch bzw. mit Annahme mehrerer Anrufe).

Stichwort: C# Schnipsel CFA CFD App
 
Zuletzt bearbeitet:
  • Love
Reaktionen: Ben04
Man kann das - die gezielte Abfrage einer WS auf LoggedIn eines speziellen Agenten - auch mit einer einzelnen Zeile C# lösen:
C#:
return ((PhoneSystem.Root.GetDNByNumber("800") as Queue).QueueAgents.Where(x => x.DN.Number.Equals("200") && (x.DN as Extension).QueueStatus == QueueStatusType.LoggedIn)).Count() > 0?"true":"false";
wobei 800 die Nummer der WS und 200 die Nummer des Nutzers ist. Dieses C# Schnipsel gibt den String true (wenn in WS und angemeldet) oder false (wenn nicht in WS oder in der WS nicht angemeldet) zurück.

Achtung: in all diesen Konstellationen wird nicht abgefragt, ob der Nutzer auch wirklich erreichbar ist (Status Verfügbar oder Custom und nicht im Gespräch bzw. mit Annahme mehrerer Anrufe).

Stichwort: C# Schnipsel CFA CFD App
Das wäre genau das, was ich möchte. Den Status kann ich auch so abfragen und ist nebensächlich. Es geht rein um die abfrage, ob Agent XY IN or OUT ist.
Was muss ich für den Schnipsel vorher machen ?
Wahrscheinlich einfach den Wert der "Q" abfragen und dann für jede Nst: den Code anpassen und in seinem Feld abfragen.
Ich zeig mal. wie ich mir das grob vorstelle mit einem vorhanden Skript, was das auf Status ebene abfragt / ändert.

11.11.2024 16_31_14.png
 
Was muss ich für den Schnipsel vorher machen ?
Starte einen CFD Block Execute C# Code, gib dem einen für dich passenden Namen (2x, einmal für den Block und einmal für die Routine, bitte nicht zu lang und keine exotischen Zeichen oder Bezeichner verwenden, am besten nur a-zA-Z0-9_), kopiere die eine Zeile da rein und verwende den Rückgabewert in irgend einem CFD Block in einer Bedingung, z.B. in Create a Condition mit
CONTAINS(GetExtLoggedIn.ReturnValue,"true") (sofern der C# Schnipsel Block GetExtLoggedIn benannt wurde).

Aus dem Bild werde ich nicht schlau.

Wahrscheinlich einfach den Wert der "Q" abfragen und dann für jede Nst: den Code anpassen und in seinem Feld abfragen.
Oder eben dann die CFD Block Arbeitsweise mit dem Loop verwenden und nicht pausenlos neue und immer individuelle C# Schnipsel verwenden.

Alternativ ein C# Schnipsel verwenden, die Nummern (der WS und der Nutzer) als Variable im CFD definieren und die Nummern durch das C# Schnipsel auslesen und verwenden lassen.
 
  • Love
Reaktionen: Ben04
Ich fang mal an zu basteln und schaue, wie es gelingt.
Vielen Dank schonmal für die Hilfe.
 
Wollte nochmal ein Feedback geben.
Nach meinen eigenen Fehler, läuft es sehr gut.
Kleine nachfrage am Rande, den Wert "False" kann er nicht auslesen, ohne die Codezeile zu ändern, richtig ?
Es läuft mit allen Nebenstellen und funktioniert auch mit jeder DW :)

Riesen großes Dankeschön für die Codeschnipsel.
 
  • Like
Reaktionen: Ben04
CONTAINS(GetExtLoggedIn.ReturnValue,"false") ist in dem Fall hier das gleiche Ergebnis wie
NOT(CONTAINS(GetExtLoggedIn.ReturnValue,"true")) ;)
 
Ah okay.
Für das gegenteil müsste wahrscheinlich Folgendes geändert werden oder ?
von
Code:
== QueueStatusType.LoggedIn))
auf
Code:
== QueueStatusType.LoggedOut))

Also laufen tut es ja ohne, ist nur für Verständnis jetzt :)
 
Ah okay.
Für das gegenteil müsste wahrscheinlich Folgendes geändert werden oder ?
von
Code:
== QueueStatusType.LoggedIn))
auf
Code:
== QueueStatusType.LoggedOut))

Also laufen tut es ja ohne, ist nur für Verständnis jetzt :)
Die Idee ist gut, aber das funktioniert dann anders. Was du nicht weißt bzw. realisiert hast: das Schnipsel nutzt nebenbei andere Dinge aus (deswegen der dünne Vergleich auf .Count() > 0 und nicht Unmengen von possible nullable Abfragen mittendrin) um andere Bedingungen mit abzufangen:
  1. Was ist, wenn es die Nummer der WS nicht gibt? Nachtrag weil falsch: es stürzt ab :(
  2. Was ist, wenn die angegebene WS Nummer keine WS ist? Nachtrag weil falsch: es stürzt ab :(
  3. Was ist, wenn die angegebene Nutzer Nr. kein Nutzer ist?
  4. Was ist, wenn die angegebene Nutzer Nr. kein Agent der WS ist?
Das alles wird mit nebenbei abgefangen (damit die gesamte CFD App nicht einfach mit einer Exception mittendrin abstürzt) und eben auch das LoggedIn für o.g. Konstellation. Die eine Zeile gibt nur dann true zurück, wenn alles zusammen gültig ist und zutrifft. Wenn irgend etwas nicht da ist, falsch angegeben wurde oder eben der Nutzer nicht LoggedIn ist, dann gibt es immer false zurück.

Bist du dir sicher, dass du speziell auf LoggedOut (ja, auch das ist eine mögliche Enumeration von QueueStatusType) abfragen willst? Denk nochmal in Ruhe darüber nach.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Ben04 und mbehrens
eine Steigerung:

C#:
return (PhoneSystem.Root.GetDNByNumber("800") is DN foundDN)? (foundDN is Queue que?((que.QueueAgents.Where(x => x.DN.Number.Equals("200") && (x.DN as Extension).QueueStatus == QueueStatusType.LoggedIn)).Count() > 0?"true":"notLoggedInAgent"):"badQueue"):"badDN";
Alternativ diese Zeile als C# Schnipsel verwenden und auf true testen wenn LoggedIn. Die Zeile ist krisenfest ggb. nicht existierenden DN für WS und Nutzer, krisenfest wenn die WS DN keine WS ist und sonstiges auch. Das sind alle 4 oben angesprochenen Fälle die damit abgedeckt werden.

Die Zeile wird länger und länger und hat noch Potential ...

Mögliche Rückgabewerte des Schnipsel:
  1. true: in der WS ist der Nutzer als Agent angemeldet <- das ist es
  2. notLoggedInAgent: in der WS ist der Nutzer kein Agent oder nicht angemeldet oder es gibt den Nutzer nicht
  3. badQueue: die angegebene WS Nummer ist keine WS
  4. badDN: es gibt die WS Nummer im System nicht
Das deckt praktisch alle möglichen Fehlerquellen die mir gerade einfallen ab.
 
  • Love
Reaktionen: Ben04
Bist du dir sicher, dass du speziell auf LoggedOut (ja, auch das ist eine mögliche Enumeration von QueueStatusType) abfragen willst? Denk nochmal in Ruhe darüber nach.

Es war nur eine gedankliche Spielerei :D
Um das ganze auch unter anderen besser zu verstehen.
Es klappt ja, indem die andere Seite der Condition, leer bleibt.
Da bekommt der User ja die Möglichkeit, sich anzumelden durch das erstellte Menü.

Wäre höchstens ein wenig relevant, wenn man mehr damit machen würde, was aber nicht vorgesehen ist.
Mit deiner V2 des Schnipsels, wäre es also nun möglich.

Du bist echt mega, dass du das einfach so "herzauberst". Ich bin froh, dass ich Scripte größtenteils verstehe :D

Es ist echt schon ein echter "Gamechanger", Dein Code vs mehre Loops und auslesungen usw. Wahnsinn.

vielen großen Dank nochmal.
 

Statistik des Forums

Themen
44.412
Beiträge
232.707
Mitglieder
78.328
Neuestes Mitglied
as7h