Hauptmenü

Komplexbeispiel :: Teamauswahl auf Basis Service einschränken

Begonnen von Torsten Thau, 21.03.2025 17:51:57

⏪ vorheriges - nächstes ⏩

Torsten Thau

(I) Die Anforderung

Basierend auf der Kategorisierung eines Tickets sollen die an diesem Ticket verfügbaren Teams eingeschränkt werden. Damit ist die Teamauswahl keine Frage der Berechtigung des ausführenden Nutzers, sondern der Klassifikation des Tickets.

In KIX17 war es zwar möglich an einem Service genau ein Team zu hinterlegen und diesen Wert als Initialisierung für die Queueauswahl zu nutzen. Es war jedoch nicht möglich mehrere Teams zu hinterlegen und die Queueauswahl auf diese einzuschränken. Dies hätte nur durch Entwicklungsleistung abgebildet werden können.

Nicht so in KIX18 auf Basis v34. Diese Anforderung illustriert sehr schön, wie die verschiedenen Bausteine ineinander greifen um eine spezielle Funktion nachzubauen, ohne dafür auch nur eine Zeile KIX-Quellcode ändern zu müssen. Erforderlich ist hierfür neben KIX Pro auch das AddOn "KIX Connect Database".

Es gilt weiterhin noch die Einschränkung, dass genau max. ein Service am Ticket hinterlegt wird. Eine Zuordnung von mehreren Services findet nicht statt. Dies kann in SysConfig "service-contract-configuration → singleSelection" (auf Wert true setzen) eingestellt werden.

(II) Die Konfiguration

Der Lösungsweg ist wie folgt:

  • (1) Die Assetklasse "Service" erweitern um mehrere Teams zu einem Service zuordnen zu können.
  • (2) Eine Datenquelle "Service :: Assigend Teams" definieren, die uns bei Angabe eines Services die zugeordneten Teams liefert.
  • (3) Ein Workflow-Rule-Macro "GetAssignedTeams4AffectedService" anlegen, welches die o.h. Datenquelle abfragt und den Rückgabewert aufbereitet zurück gibt.
  • (4) Eine Workflow-Rule "Limit Teams" einrichten, die das zuvor genannte Macro aufruft und sich um die Einschränkung der Team-Auswahl in der GUI kümmert (und noch ein wenig gesprächig ist um den Nutzer darauf hinzuweisen).


(III) Das Ergebnis

Werden nun noch die entsprechenden Daten gepflegt...

KIX18_UseCase_ServiceAssigedTeams_05.png

...funktioniert die Einschränkung schon - wie in den folgenden Screenshots gezeigt.

Zunächst die uneingeschränkte Team-/Queue-Auswahl:
KIX18_UseCase_ServiceAssigedTeams_10.png

Wenn wir nun bei der Ticketerstellung einen "betroffenen Service" eintragen und diesem sind Teams zugeordnet, werden die Teams ermittelt und der Nutzer erhält einen Hinweis, dass die Auswahl eingeschränkt wird (das ist nicht unedingt nötigt, fügt aber ein interessantes Feature in dieses Beispiel ein):
KIX18_UseCase_ServiceAssigedTeams_20.png

Nachdem der Hinweis bestätigt wurde wird die Team-Auswahl eingeschränkt:
KIX18_UseCase_ServiceAssigedTeams_21.png


Anmerkung: in v34 muss im Service noch der exakte "Fullname" des Teams stehen. Ab v35 kann der Typ "TeamReference" verwendet werden wobei dann auch die Query in der Datenquelle anzupassen ist.


Fazit: mit KIX18-Bordmitteln haben wir ein spezifisches komplexes Verhalten eingerichtet, wie es in KIX17 nicht ohne Code-Anpassung und spezifische Erweiterung möglich gewesen wäre.


------------------------------------------------------------------------------------------------------------------------


(IV) Die Details

Zugegeben ist das oben natürlich nur ein Überblick und bisweilen steckt der Teufel im Detail. Der detaillierte Lösungsweg schaut daher wie folgt aus:

(iv.1) Assetklasse "Service"
  • Die vorhandene Klassendefinition erweitern um folgenden Abschnitt (bzw. den bestehenden ersetzen wie im Kommentar beschrieben):
      # ...scroll to the bottom of the asset class definition and replace section "Service Catalog" with following...
      {
        'CountDefault' => 1,
        'CountMax' => 1,
        'CountMin' => 1,
        'CustomerVisible' => 0,
        'Input' => {
          'Type' => 'Dummy'
        },
        'Key' => 'SectionServiceCatalog',
        'Name' => 'Service Catalog',
        'Sub' => [
          # additional attribute for preferred queues/teams...
          # NOTE: from v35 attribute type "TeamReference" should be used instead
          {
            'CountDefault' => 1,
            'CountMax' => 15,
            'CountMin' => 0,
            'CustomerVisible' => 0,
            'Input' => {
              'MaxLength' => '100',
              'Type' => 'Text',
              'Required' => '1',
            },
            'Key' => 'AssignedTeam',
            'Name' => 'Assigned Team (full name)',
            'Searchable' => 1
          },
          # EO additional attribute for preferred queues/teams
          {
            'CountDefault' => 1,
            'CountMax' => 1,
            'CountMin' => 0,
            'CustomerVisible' => 0,
            'Input' => {
              'Type' => 'SLAReference'
            },
            'Key' => 'AssignedSLA',
            'Name' => 'Assigned SLA',
            'Searchable' => 1
          }
        ]
      }
    ];



(iv.2) Datenquelle "Service :: Assigend Teams"
  • Datenquellenverbindung "KIX-DB" anlegen:
    • Name := `KIX-DB`
    • Type := `DB`
    • DBType := `postgresql`
    • DSN := `DBI:Pg:dbname=kix;host=db`
    • Username := `kix`; Password := `kix`
  • Datenquelle "Service :: Assigend Teams" anlegen:
    • Comment := `Lists assigend teams for services.`
    • Type := Database
    • Connection := KIX-DB
    • Roles := `Agent User`, `Customer`
    • Listen- und Einzeleintrags-SELECT-Statement können identisch ausfallen
      SELECT DISTINCT(q.id) as "ID"
      FROM service s
          JOIN configitem_version v ON (v.configitem_id = s.id)
          JOIN xml_storage x ON (
              x.xml_type = 'ITSM::ConfigItem::92'
              AND x.xml_content_key LIKE '[1]{''Version''}[1]{''SectionServiceCatalog''}[1]{''AssignedTeam''}[%]{''Content''}'
              -- NOTE: from v35 on replace following with the line after
              AND xml_key::int = v.id
              -- AND xml_key = v.id
          )
          JOIN queue q ON (q.name = x.xml_content_value)
      WHERE s.id = ${Parameters.IDs?0};



(iv.3) Workflow-Rule-Macro "GetAssignedTeams4AffectedService"
  • Unter "Admin / KIX / Workflow / Rules / Macro" eine neue Macro anlegen
    • Macro Information
      • Name := `GetAssignedTeams4AffectedService`
      • Type := `Ticket`
      • Scope := `RuleSet`
      • Comment := ``
      • Valid := `valid`
    • Macro
      • (1) Set Variable `TeamIDs`
        • Value := ``
      • (2) Get Element List from Datasource `TeamIDList`
        • DataSource := `Service :: Assigend Teams`
        • Search := `{}`
        • Parameters := `{ "IDs": "${SelectedServiceIDs}" }`
      • (3) Conditional
        • IF := `(${TeamIDList:0.ID})`
        • THEN Macro Type `Ticket`
        • (1) Set Variable `TeamIDs`
          • Value := `${TeamIDList|JSON|jq( [.[] :: .ID ] :: join(",") )}`
      • (4) Set Variable `TeamIDs`
        • Value := `${TeamIDs}`



(iv.4) Workflow-Rule "Limit Teams" einrichten,

  • Unter "Admin / KIX / Workflow / Rules" eine neue Regel anlegen
    Rule "Limit Teams" on Ticket if !(TR.DynamicFields.isEmpty(AffectedServices))
      
      SetVariable SelSIDs "${TR.AffectedServices|JSON|jq([.[] ] :: join(","))}"
      
      ExecuteMacro "GetAssignedTeams4AffectedService" as AssignedTeams with { "SelectedServiceIDs": ${SelSIDs} }
      
      If "scalar( [${AssignedTeams.TeamIDs}] )"
        Tell Info "Hint" "Selectable teams are now limited to teams assigned to selected service."
        PossibleValues QueueID ${AssignedTeams.TeamIDs}
      EndIf
     
    End


------------------------------------------------------------------------------------------------------------------------

  • Update 2025/03/25-1: Änderung der Datasource ("xml_key::int = v.id", statt "xml_key = v.id::varchar") für Performancegewinn
  • Update 2025/03/25-2: Hinweis auf Änderung in v35 ergänzt