Wichtige Klassen und Objekte

In diesem Kapitel werden folgende Themen behandelt:

Einleitung

Zur Erleichterung der Programmierung von ConSol CM-Skripten bietet die CM-Workflow-API einfachen Zugriff auf die häufig verwendeten Objekte. Zudem können verschiedene Objekte und Methoden über Convenience-Klassen und -Methoden auf kurzem Weg aufgerufen werden.

Wichtige Objekte

Einige Objekte sind in Workflow-Skripten implizit verfügbar.

Die gleichen Objekte sind in Admin-Tool-Skripten nicht implizit verfügbar, d. h. in Admin-Tool-Skripten müssen Sie für die entsprechenden Klassen oder Pakete Import-Anweisungen verwenden!

Ticket

In jedem Workflow-Skript kann man über das Objekt ticket einfach auf das aktuelle Ticket zugreifen. Es leitet sich aus der Klasse Ticket ab und ist implizit verfügbar. Es sind kein Import und keine Instanziierung erforderlich.

Beispiel:

def myId = ticket.getId()

//or shorter, Groovy-like:

def myId = ticket.id

Code-Beispiel 13: Verwenden des Ticket-Objekts

workflowAPI

Das Objekt workflowApi ist ebenfalls implizit vorhanden. Es bietet einfachen Zugriff auf das Interface WorkflowContextService, das für viele Operationen verwendet wird.

Beispiele:

workflowApi.sendEmail(contact_e,subj,text,replyto,null)

Code-Beispiel 14: Verwenden von workflowApi zum Senden einer E-Mail (Ältere Variante. In der aktuellen Variante wird ein Objekt der Klasse Mail verwendet.)

def curr_eng = workflowApi.getCurrentEngineer()

ticket.setEngineer(curr_eng)

Code-Beispiel 15: Verwenden von workflowApi zum Zuweisen eines Tickets an den aktuellen Bearbeiter

workflowApi.deactivateTimer("defaultScope/Service_Desk/TimeTrigger1")

Code-Beispiel 16: Verwenden von workflowApi zum Deaktivieren eines Triggers

workflowApi.addValidationError("1", "The ticket cannot be closed before a solution is provided. Please fill-in solution and mark it with text class SOLUTION first.")

Code-Beispiel 17: Verwenden von workflowAppi zum Anzeigen einer GUI-Meldung für den Bearbeiter

trigger

Dieses Objekt ist implizit in Skripten von Zeit-Triggern (Skript zu Beginn, Skript nach Ablauf) verfügbar.

def addedEscalMillis = 0

switch (ticket.queue.name) {

case "HelpDesk_1st_Level":

addedEscalMillis = 12*60*60*1000L;

break;

case "HelpDesk_2nd_Level":

addedEscalMillis = 24*60*60*1000L;

break;

case "ServiceDesk":

addedEscalMillis = 4*60*60*1000L;

}

trigger.setDueTime(addedEscalMillis)

Code-Beispiel 18: Beispiel für ein Skript zu Beginn

Convenience-Klassen und Methoden

Die ConSol CM-API bietet verschiedene Convenience-Interfaces und -Methoden, die den Zugriff auf die meisten Objekte der alltäglichen CM-Programmierung deutlich vereinfachen. Die meisten dieser Convenience-Interfaces gehören zum Paket com.consol.cmas.common.service und seinen Unterpaketen. Details dazu finden Sie in der ConSol CM-Java-API-Dokumentation. An dieser Stelle zeigen wir Ihnen einige Beispiele, die für die meisten CM-Programmierer nützlich sein können.

Die implementierende Instanz des Interface ist immer verfügbar, indem Sie den ersten Buchstaben (ein Großbuchstabe) im Klassennamen durch einen Kleinbuchstaben ersetzen, z. B. das Objekt (Singleton) mit dem Interface EngineerService ist mit dem Objekt engineerService verfügbar, siehe Beispiel 2.

Beispiel 1: Verwenden von ConfigurationService zum Abrufen von System-Properties

def tic_nr = configurationService.getValue("custom-mycompany-properties","engineer_management.ticket.nr")

 

// then: ... do something with the engineer management ticket,

// e.g. find out the name of the next engineer a service ticket

//should be assigned

Code-Beispiel 19: Verwenden von ConfigurationService zum Abrufen der Nummer des Bearbeiterverwaltungs-Tickets

def baseUrl = configurationService.getValue("custom-mycompany-properties","base.url.mycompany")

def url = baseUrl + "/cm-client/ticket/ticket_name/" + ticket.getName()

def itComplete = url + " " + ticket.getName()

//alternative: def itComplete = "${url} ${ticket.name}"

 

// ... do something with the ticket url, e.g. place a link to a child ticket in a table of the parent ticket

Code-Beispiel 20: Verwenden von ConfigurationService zum Abrufen der Basis-URL des Systems

Beispiel 2: Verwenden von EngineerService zum Zuweisen des Tickets an einen Genehmiger

// Script does the following:

// Hand-over ticket to approver only when approver has been set in ticket as additional engineer

// Import package, because classes are not available in workflow otherwise:

import com.consol.cmas.common.model.ticket.user.function.*

 

// Get the name of the approver which has been written/stored in a Custom Field, // namely the field with the name

// CF_ApproverName in the Custom Field Group CF_GroupApproverData. The value could be for example Mr. Miller:

def gen = ticket.get("CF_GroupApproverData.CF_ApproverName").getName()

 

// Get the engineer object where the name Mr. Miller is set, i.e.

// the engineer object of the desired approver:

def gen_eng = engineerService.getByName(gen)

 

// Get the ticketFunction object which represents the ticketFunction (engineer role) Approver:

TicketFunction tf = ticketFunctionService.getByName("Approver")

 

// Add the engineer object of Mr. Miller as Approver. i.e.

// in the ticketFunction (engineer role) Approver to the ticket.

// One of the paramaters is ticket. This does not have to be instantiated,

// because it is implicitly present in workflow

// scripts:

def tu = ticketUserService.addTicketUser(ticket, gen_eng, tf, "Approver")

 

// Assign the ticket to the engineer, i.e. set the engineer Mr. Miller also as ticket owner.

def tic2 = workflowApi.assignEngineer(ticket, gen_eng)

Code-Beispiel 21: Verwendung von EngineerService

Es gibt zwei Zuweisungen:

  1. Hr. Miller wird als zusätzlicher Bearbeiter in der Bearbeiterfunktion Genehmiger gesetzt.
  2. Hr. Miller wird als zugewiesener Bearbeiter des Tickets gesetzt.

Beispiel 3: Verwenden von EnumService zum Abrufen eines Enum-Werts über den Namen

def enumValueMLA = enumService.getValueByName( "priority", "REGULAR" )

ticket.set( "helpdesk_fields.prio", enumValueMLA )

Code-Beispiel 22: Verwenden von EnumService zum Abrufen eines Enum-Werts über den Namen

Beispiel 4: Verwenden von TicketService zum Abrufen aller Tickets einer bestimmten Sicht

List<Ticket> mylist = ticketService.getByView(new ViewCriteria(

viewService.getByName("helpdesk_active_tickets"),

ViewAssignmentParameter.allAssignedTickets(),

ViewGroupParameter.allTickets(),

viewOrderParameter.addByName(true)))

Code-Beispiel 23: Verwenden von TicketService zum Finden der Tickets einer Sicht

Beispiel 5: Verwenden von EngineerRoleRelationService zum Senden einer E-Mail an alle Bearbeiter mit einer Rolle

// Send e-mail to all engineers of a regular role

 

def mail = new Mail()

mail.setTo(engineerRoleRelationService.getEngineersWithRoles(roleService.getByName("Supervisor"))*.email.join(","))

mail.setSubject("Ticket (${ticket.name}) -- Escalation!")

mail.setText(workflowApi.renderTemplate("Ticket escalation note to supervisor"))

mail.send()

Code-Beispiel 24: Verwenden von EngineerRoleRelationService zum Senden einer E-Mail an alle Bearbeiter einer Rolle