Hauptmenü

Checklisten im Hintergrund initialisieren und mit Jobs bearbeiten

Begonnen von Alexander Gensler, 05.04.2024 07:54:45

⏪ vorheriges - nächstes ⏩

Alexander Gensler

Hallo zusammen,

ich habe derzeit zwei Probleme bei der Konfiguration einer Checkliste. Vorab kurz zum Wunschziel:
  • Ein Eltern-Ticket im SSP, ein Kind-Ticket im Agenten-Portal, an dem Kind-Ticket soll eine Checkliste zur Verfügung stehen
  • Die einzelnen Punkte sollen nach dem Durchführen diverser Jobs abgehakt werden

Fragen:
  • Wie initialisiere ich eine Checkliste richtig im Hintergrund?
    Idealerweise würde ich im Job, der das Kind-Ticket erzeugt, die Checkliste initialisieren. Dafür habe ich jedoch keine Möglichkeit gefunden. Ich habe stattdessen ausprobiert, die Checkliste in der Ticketvorlage für das SSP im Hintergrund zu setzen und beim Erzeugen des Kind-Tickets mittels <KIX_TICKET_DynamicField_xxx_Key> zu übertragen. Das funktioniert auch super, solange die Checkliste im SSP sichtbar ist. Das ist allerdings nicht gewünscht, da dann die Checkliste nach Erzeugen des Tickets im SSP für den Antragsteller sichtbar ist. Setze ich die Checkliste auf unsichtbar für das SSP, so funktioniert die Initialisierung scheinbar nicht mehr, da sie dann mit Fortschritt 0/0 anstatt 0/18 angezeigt wird.
    TL;DR: Wie erzeuge und initialisiere ich korrekt eine Checkliste im Hintergrund, idealerweise auch nur beim Kind-Ticket?
  • Wie kann ich einzelne Punkte der Checklist mit Jobs abhaken?
    Ich habe in den Aktionen der Jobs keine mir ersichtliche Möglichkeit gefunden, einzelne Werte der Checkliste zu manipulieren, sprich z.B. auf OK oder NOK zu setzen.

Viele Grüße
Alexander

Frank Niethardt

Moin Alexander,

eine Checkliste zu initialisieren ist ziemlich einfach. Du brauchst ein dynamisches Feld vom Typ Checkliste und dann kannst du diesem einfach das passende JSON zuweisen. Siehe auch  Datenstruktur von Checklisten - KIX 18 Administration (DE) - KIX Dokumentation (kixdesk.com)

In derselben Doku findest du auch den Hinweis, dass du dieses JSON mittels jq Filter manipulieren kannst. Das habe ich selbst noch nicht gemacht, aber wird für mein nächstes Thema auch interessant.

jq an sich ist ein ziemlich cooles Tool, aber dazu muss man ein wenig mit jqplay spielen. Und man muss sich bewusst sein, dass jqplay die neueste jq Version benutzt, KIX aber bisher immer noch die 1.5.1 hat. Sprich, nicht alles, was in der Doku steht und in jqplay funktioniert, funktioniert auch in KIX...

Viele Grüße
Frank

Torsten Thau

Hallo Frank und Alexander,

erstmal Danke an Frank für den Hinweis in die Tiefen der Dokumentation - das wäre genau das richtige.

Im Anhang ist ein Screenshot eines Jobs, der auf das Setzen eines DFs "ClosedSubtask" reagiert. Das DF beinhaltet die id des Checklisten-Eintrags der auf "OK" gesetzt werden soll. Daraufhin wird der Wert der Checkliste "MobileProcessingChecklist020" manipuliert und dann neu gesetzt.

Job_AutoSetChecklistForSubtask_Closed.png

Hier das jq dazu

${CheckListUpdate|jq([.[] :: select(.id=="${SubTaskID}").value="OK"]) }

Zum ersten Thema im Anhang noch eine exemplarische Job-Konfiguration die mittels XSLT aus dem Feld "AffectedAsset" eine Checkliste generiert - z.B. für die zu bearbeitenden Assets. Der Job setzt allerdings eines der AddOn KIXConnect-Webservice oder KIXConnect-DataSource voraus (wegen der Macro Actions XSLT und GetObject um an die AssetDetails zu kommen). Das XSLT könne man sicher mit jq-Methoden vermeiden, das ist mir aber weniger vertraut und ich habe kein Beispiel zur Hand. Das Prinzip ist aber wie von Frank beschrieben.

CU, Torsten





Alexander Gensler

#3
Hallo Frank,
hallo Torsten,

vielen Dank für eure Antworten. Das Initialisieren funktioniert wunderbar, mit dem manipulieren habe ich noch etwas Probleme. Allerdings dürfte das Problem nicht der jq-Filter, sondern die Übergabe des aktuellen Listen-Wertes sein.

Ich habe das Ganze mittels eines Tests eingrenzen können (siehe Anlage).
  • Verwende ich beim jq-Filter die Eingangsvariable "ChecklisteOriginal" funktioniert das Ganze nicht, im Log erscheint dann auch "unknown filter 'jq' ". Ich vermute, dass <KIX_TICKET_DynamicField_ChecklisteOrganisationEinstellung_ObjectValue> hier null zurück gibt.
  • Verwende ich die Eingangsvariable "Test", in der meine Checkliste in Rohform steckt (kopiert aus der ursprünglichen Initialisierung), funktioniert es einwandfrei.

Auch im testweise erzeugten Ticket-Artikel ist "ChecklisteOriginal" leer (vermutlich null, da noch nichtmal "-" ausgegeben wird) und "Test" der übergebene JSON. Ich folgere daraus, dass man auf das dynamische Feld nicht mit ObjectValue sondern anderweitig zugreifen muss. Leider habe ich jedoch bisher nicht herausfinden können, wie.

Hat hier jemand eine Idee?

Vielen Dank im Voraus
Alexander

Frank Niethardt

Moin Alexander,

evtl. ist das ein Fall für ObjectValue_0?

Viele Grüße
Frank

Alexander Gensler

Hallo Frank,

perfekt, das war es :)

Viele Grüße
Alexander

Alexander Gensler

#6
Hallo zusammen,

es sind weitere Fragen zum Thema jq aufgetaucht:
  • Umlaute: Nachdem ich eine Liste mit jq manipuliert habe, sind Umlaute standardmäßig nicht richtig codiert (siehe Anlage). Ich habe schon versucht, die Umlaute durch die Codierungswerte (z.B. U+00FC) zu ersetzen, leider ohne Erfolg. Weiß hier jemand, wie man in jq mit Umlauten umgehen muss?
  • jq: Die | von jq wird ja durch ein :: in KIX ersetzt. Wie wird denn das Update-Assignment |= ersetzt? Ich habe ::= probiert, dann zerhaut es mir aber die Checkliste. Folgenden Befehl von jqplay möchte ich umsetzen:
    [.[]|(select(.id=="100").value="OK")|(.sub[]|=(select(.id=="110").value="OK"))]

In jqplay kann ich damit erfolgreich sowohl den Value bei ID 100, als auch den Value bei der Sub-ID 110 auf OK setzen.
Die JSON-Checkliste ist wie folgt aufgebaut (Ausschnitt):
[
    {
        "id": "100",
        "title": "Raumverwaltung",
        "description": "",
        "input": "ChecklistState",
        "value": "-",
        "sub": [
            {
                "id": "110",
                "title": "Zuweisung Raum",
                "description": "",
                "input": "ChecklistState",
                "value": "-",
                "sub": []
            },
            {
                "id": "120",
                "title": "Raumbelegungsplan pflegen",
                "description": "",
                "input": "ChecklistState",
                "value": "-",
                "sub": []
            },
            {
                "id": "130",
                "title": "Hausmeister informieren",
                "description": "",
                "input": "ChecklistState",
                "value": "-",
                "sub": []
            },
            {
                "id": "140",
                "title": "Türschilder anpassen",
                "description": "",
                "input": "ChecklistState",
                "value": "-",
                "sub": []
            }
        ]
    }
]


Viele Grüße
Alexander

Frank Niethardt

Hallo Alexander,

das ist die Schönheit von OpenSource https://github.com/kix-service-software/kix-backend/blob/8800d5b78e1a27895c7e7325a20acfb809fdd157/Kernel/System/Automation/MacroAction.pm#L1196

        elsif ( $Filter =~ /^jq((.*?))$/ && IsStringWithData($Value) ) {
            my $JqExpression = $2;
            $JqExpression =~ s/\s+::\s+/|/g;
            $JqExpression =~ s/&quot;/"/g;
            $Value = `echo '$Value' | jq -r '$JqExpression'`;
            chomp $Value;
        }

Es wird also genau ' :: ' durch ein '|' ersetzt, wobei die RegEx auf beiden Seiten mindestens ein Leerzeichen erwartet. Also sollte ein ' :: =' zu einem '|=' werden.

Was die Umlaute angeht, sieht es eher so aus als würde er UTF-8 Umlaute in einem nicht-UTF-8 Kontext darstellen. Also müsste man eher mit Latin1-Kodierungen arbeiten, statt Unicode. Aber da hab ich keine Erfahrung.

Viele Grüße
Frank

Alexander Gensler

Hallo Frank,

besten Dank, was so ein einfaches Leerzeichen doch bewirken kann :)

Das Umlaut-Problem ist tatsächlich für mich ein bisschen schwierig einzugrenzen, wo es herrührt:
Bevor der jq-Filter drüber läuft sind die Umlaute richtig in der Checkliste, der Datentyp des dynamischen Feldes selbst kann es also nicht sein. Gleichzeitig sollte die jq v1.5 auch kein Problem verursachen, da es mit einer Test-JSON auf meinem Rechner problemlos funktioniert.

@KIX-Team: ist ggf. der Datentyp, der für die Variable $CheckListUpdate genutzt wird, nicht geeignet, Umlaute darzustellen?

Viele Grüße
Alexander

Alexander Gensler

Hallo zusammen,

habe gerade gesehen, dass es bei jq einen Parameter -a (bzw. --ascii-output) gibt: https://jqlang.github.io/jq/manual/v1.5/#invoking-jq
Ggf. könnte das mein Problem mit den Umlauten beheben, allerdings habe ich es bisher noch nicht geschafft, den Parameter erfolgreich jq mitzugeben.
Ich habe Franks Tipp befolgt und mal in den Quellcode geschaut, dort wird jq nach Regex-Prüfung mit dem Parameter -r (Raw-Output) ausgeführt. Gehe ich richtig in der Annahme, dass ich den Parameter -a gar nicht über die Aktionskonfiguration reinbekomme?

Viele Grüße
Alexander


Frank Niethardt

#10
Moin,

ich habe wegen einer ähnlichen Aufgabenstellung jetzt auch eine wunderbare Checkliste, die ich in Einzelaufgaben zersplittern möchte. Diese enthält jedoch Umlaute, wodurch der jq Filter gar nichts mehr zurückgibt. Also auch keine defekten Umlaute. Das kann ich auch auf der Kommandozeile im backend-Container nachvollziehen. Sobald ich die Umlaute ersetze, durch ae und ue in meinem Fall, funktioniert jq auf der Kommandozeile und macht das Richtige.

Ich bin mir noch nicht ganz sicher, wie man das Encoding über KIX sauber bekommt. Ein dazwischengeworfenes "|JSON|" vorm "jq" hat jedenfalls nichts gebracht...

Der Unterschied zwischen Alexander und mir ist vermutlich, dass ich die Ursprungscheckliste über die UI zusammengeklickert habe...

UPDATE: Ich habe noch ein wenig rumgespielt und der Kommandozeilentest funktioniert, sobald ich das ursprüngliche JSON im Editor in eine "pretty" Darstellung bringe. Es hat an der Stelle also nicht direkt mit den Umlauten zu tun. Ich teste weiter...

UPDATE2: Es hilft deutlich, wenn man beim Platzhalter "DynamicField" und den Feldnamen richtig schreibt. :/
Jetzt habe ich auch das Umlautproblem. 
jq bearbeitet JSON und JSON ist definiert als UTF-8 - das scheidet also aus.
Ich vermute, dass perl beim qx// wohl nicht sauber mit UTF-8 bei der Aus- und/oder Eingabe arbeitet...

Viele Grüße
Frank

Frank Niethardt

Ok, ich hab's gefunden. I/O scheint an der Stelle einfach kein UTF-8 zu machen. Aber man kann es einfach einbauen, indem man in der Zeile vor den jq Aufruf den Hinweis aus der Perldoc (https://perldoc.perl.org/5.28.1/perlop#qx/STRING/) folgt und die I/O auf UTF-8 umschaltet:

        elsif ( $Filter =~ /^jq((.*?))$/ && IsStringWithData($Value) ) {
            my $JqExpression = $2;
            $JqExpression =~ s/\s+::\s+/|/g;
            $JqExpression =~ s/&quot;/"/g;
            use open IN => ":encoding(UTF-8)";
            $Value = `echo '$Value' | jq -r '$JqExpression'`;
            chomp $Value;
        }

Viele Grüße
Frank

Alexander Gensler

Hallo Frank,

vielen Dank für deine umfangreiche Recherche.
@KIX-Team: Es wäre super, wenn Ihr das in einem der nächsten Updates einbauen könnt.

Viele Grüße
Alexander

Beatrice Müller

Hallo Alexander,

wir haben die Umlaut-Thematik mit in unser Story-Board aufgenommen.
@Frank: Vielen Dank für deinen Beitrag.

Viele Grüße
Beatrice

Torsten Thau

Hallo Alexander,

ich habe versucht das Verhalten nachzustellen und mir dazu den Job im Screenshot Anhang erstellt. Da habe ich einige Umlaute eingefügt. JQ hat den Auftrag den JSON-String mit einem "OK" zu versehen. Das tut es auch. Aber auch danach sind meine Umlaute noch als solche zu erkennen... Wie kommt es bei Dir zu den defekten Umlauten?

CU, Torsten