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