Skripte für das Action Framework

Einleitung

Das ConSol CM Action Framework bietet die Möglichkeit, Aktionen zu starten, die sich nicht auf Workflow-Aktivitäten beziehen, d. h. Aktionen können in einem anderen Kontext als im Workflow-Kontext gestartet oder angestoßen werden.

Das Action Framework besteht (in ConSol CM-Version 6.10) aus drei Komponenten, die in den entsprechenden Handbuchabschnitten detailliert beschrieben sind.

Im vorliegenden Abschnitt erfahren Sie mehr über die Programmierung mit dem Action Framework.

Admin-Tool-Skripte für das Action Framework

Skripttypen

Jede Aktion basiert auf einem Admin-Tool-Skript, wie in den oben erwähnten Abschnitten beschrieben. Für jedes Admin-Tool-Skript muss der richtige Skripttyp gesetzt werden.

Beachten Sie, dass für jedes Ausführungsskript ein Bedingungsskript definiert werden kann. Es muss im Admin Tool in der Definition der Aktion mit dem Ausführungsskript verknüpft werden. Das Bedingungsskript wird vor dem Ausführungsskript ausgeführt.

Daher wird das Ausführungsskript nur ausgeführt, wenn entweder

oder

Es stehen folgende Skripttypen für das Action Framework zur Verfügung:

Rückgabewerte der Skripte

Der Rückgabewert eines Bedingungsskripts muss entweder true oder false sein.

Der Rückgabewert eines manuellen Ausführungsskripts muss einer der folgenden PostActionTypes sein:

Eine detaillierte Beschreibung finden Sie im folgenden Abschnitt.

Aktionstypen

Eine Aktion kann von einem der folgenden Typen sein:

Programmieren mit dem Action Framework

Eine Kernkomponente der Programmierungsskripte für manuelle Aktionen im ConSol CM Action Framework ist die Klasse ActionScriptResultFactory. Alle Instanzen dieser Klasse stehen in jedem Ausführungsskript als actionScriptResultFactory zur Verfügung. Der Typ des zurückgegebenen PostActionScriptResult, d. h. der PostActionType, definiert den Schritt, der direkt auf die Ausführung eines manuellen Ausführungsskripts folgt. Mithilfe des PostActionType können Sie das gewünschte Systemverhalten implementieren.

Seite Neues Ticket öffnen

Beispiel:

import com.consol.cmas.core.server.service.action.PostActionType

import com.consol.cmas.common.model.ticket.Ticket

 

Ticket ticket = new Ticket();

ticket.setQueue(queueService.getByName("Helpdesk"))

ticket.setSubject("sample subject")

ticket.set("queue_fields.string", "test")

ticket.set("queue_fields", "boolean", "true")

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, ticket)

//to additionally set main contact use

//return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, ticket, unit)

Code-Beispiel 66: Öffnen der Seite Neues Ticket

Ticketseite im Anzeigemodus öffnen

Beispiel:

UnitCriteria unitCriteria = new UnitCriteria();

Unit companyPattern = new Unit("company", customerGroup);

mdcmCriteriaBuilder.setReferencedCompanyCriteria(unitCriteria, companyPattern);

Code-Beispiel 67: Öffnen der Ticketseite im Anzeigemodus

Ticketseite im Anzeigemodus öffnen und vorher ACF anzeigen

Beispiel:

(...)

 

def executionContext = activityFormDefinitionService.getExecutionContext(newtic, "defaultScope/TaskInProgress/AcceptTask")

if (!executionContext) {

return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "action.fail.wrong.activity")

}

 

// Modify entities from the execution context - not the original ones

// - since the user may still press cancel.

executionContext.ticket.add("SpecialTasks_Fields","Deadline", new Date());

 

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_TICKET, newtic, executionContext);

Code-Beispiel 68: Öffnen der Ticketseite im Anzeigemodus, nach Anzeige eines ACFs

Beachten Sie Folgendes: Die Implementierungsklasse für das Bean activityFormDefinitionService ist ActivityControlFormService. Weitere Informationen dazu finden Sie in der Dokumentation der Klasse. Die Verwendung in Skripten erfolgt über den Bean-Namen, siehe obiges Skript.

Seite Neuen Kunden (Kontakt oder Firma) öffnen

Beispiel:

import com.consol.cmas.common.model.customfield.Unit

import com.consol.cmas.core.server.service.action.PostActionType

 

Unit contact = new Unit("customer", unit.getCustomerGroup());

contact.set("firstname", "Luke");

contact.set("name", "Skywalker");

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_UNIT, contact);

Code-Beispiel 69: Unit-Ausführungsskript (Kunde implizit verfügbar), um die Seite Neuer Kunde zu öffnen

Seite einer Unit (= Kunde, d. h. Kontakt oder Firma) im Anzeigemodus öffnen

Beispiel:

import com.consol.cmas.common.model.customfield.Unit

import com.consol.cmas.core.server.service.action.PostActionType

 

Unit contact = unitService.getByCustomerGroup(unit.getCustomerGroup()).get(0)

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_UNIT, contact)

Code-Beispiel 70: Unit-Ausführungsskript (Unit implizit verfügbar), um die Kundenseite im Anzeigemodus zu öffnen

Seite Neue Ressource öffnen

Beispiel:

import com.consol.cmas.common.model.resource.Resource

import com.consol.cmas.common.model.resource.meta.ResourceType

import com.consol.cmas.core.server.service.action.PostActionType

 

ResourceType type = resourceTypeService.getByName("resource type 1")

Resource resource = new Resource(type)

resource.setFieldValue("group1", "stringField1", "value1")

resource.setFieldValue("group2", "numberField1", 1L)

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_RESOURCE, resource)

Code-Beispiel 71: Öffnen der Seite Neue Ressource

Ressourcenseite im Anzeigemodus öffnen

Beispiel:

import com.consol.cmas.common.model.resource.Resource

import com.consol.cmas.core.server.service.action.PostActionType

 

Resource resource = resourceService.getAll().iterator().next()

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_RESOURCE, resource);

Code-Beispiel 72: Öffnen einer Ressourcenseite im Anzeigemodus

Eine URL öffnen

Beispiel:

import com.consol.cmas.core.server.service.action.PostActionType

 

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_PAGE, "http://consol.de");

Code-Beispiel 73: Öffnen einer URL

Ergebnismeldung im Web Client anzeigen: SUCCESS

Eine detaillierte Beschreibung finden Sie im Abschnitt Rückgabewerte und Rückgabemeldungen.

Ergebnismeldung im Web Client anzeigen: FAILURE

Eine detaillierte Beschreibung finden Sie im Abschnitt Rückgabewerte und Rückgabemeldungen.

Rückgabewerte und Rückgabemeldungen

Um den Rückgabewert einer ConSol CM-Aktion für den Bearbeiter im Web Client anzuzeigen, müssen Sie einen der beiden PostActionTypes verwenden:

Sie müssen für jedes Ausführungsskript einen Rückgabewert setzen. Es ist nicht möglich, ein Ausführungsskript ohne Rückgabewert zu beenden (in diesem Fall tritt ein Laufzeitfehler auf).

Beispiel für positives Feedback:

return actionScriptResultFactory.getPostAction(PostActionType.SUCCESS, "cmweb.search.assigned").withRefreshContent();

Abbildung 404: ConSol CM Web Client - Erfolgsmeldung nach Suche-Aktion

Beispiel für negatives Feedback:

return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "cmweb.search.assigned").withRefreshContent();

Abbildung 405: ConSol CM Web Client - Fehlermeldung nach Suche-Aktion

Der angezeigte Text (z. B. Aktion erfolgreich oder Aktion gescheitert) kann mit einer der folgenden beiden Methoden abgerufen werden:

CM-Standardwerte für Rückgabemeldungen

action.result.success=Action succeeded

action.result.failure=Aktion gescheitert

Verwenden systemspezifischer Labels

Sie können Ihre eigenen Labels für die Anzeige von Meldungen im Web Client definieren. Eine detaillierte Erklärung dazu finden Sie im Abschnitt Bezeichnungen.

Arbeiten mit Relationsaktionen

Relationsaktionen sind in den CM-Versionen 6.10.5.4 und höher verfügbar. Sie sind für die drei wichtigsten Objekttypen verfügbar und werden im Admin Tool in den entsprechenden Navigationselementen definiert. Detaillierte Erklärungen finden Sie in den entsprechenden Abschnitten dieses Handbuchs.

Eine Relationsaktion wird ausgeführt, wenn die Relation

wird. Sie wird nicht ausgeführt, wenn der Kommentar einer Relation geändert wird.

Bedenken Sie, dass eine Relationsaktion immer ausgeführt wird, wenn der Objekttyp, für den die Relation definiert ist, beteiligt ist. Das bedeutet, dass zwei Aktionen ausgeführt werden, wenn sowohl das Quell- als auch das Zielobjekt zu einem Typ mit einer Relationsaktion gehören.

In Skripten, die Relationsaktionen definieren, sind folgende Objekte verfügbar:

Beachten Sie, dass es in CM-Version 6.10.5.4 nicht möglich ist, innerhalb eines Relationsaktions-Skripts zwischen den Vorgängen ERSTELLEN und LÖSCHEN zu unterscheiden.

Im folgenden Beispiel soll die Person, die der Ansprechpartner für eine SLA ist, eine E-Mail erhalten, wenn eine neue Relation zwischen der SLA und einem Kunden erstellt wird, oder eine vorhandene Relation gelöscht wird.

Gehen Sie folgendermaßen vor:

  1. Definieren Sie eine Relation, in diesem Beispiel SLA_to_Company_Relation, bei der Quelle = Ressourcentyp SLAs und Ziel = Firma ist, für mehrere Kundengruppen.
  2. Schreiben Sie das Ressourcenaktions-Skript, in diesem Beispiel: SLA_CompanyRelationAction.groovy
  3. Definieren Sie eine Ressourcenaktion (in diesem Beispiel: SLA_CompanyRelationAction) des Typs Relation, die das Skript als Ausführungsskript verwendet.
  4. Weisen Sie die Ressourcenaktion einem Ressourcentyp zu, in diesem Beispiel dem Typ SLAs.
  5. Testen Sie den gewünschten Anwendungsfall im Web Client

Beispiel für Relationsaktions-Skript SLA_CompanyRelationAction.groovy:

import com.consol.cmas.common.model.mail.MailSendHolder

log.info 'SLA to company relation action has been triggered!'

def myUnit = relation.targetUnit

def myUnitDef = relation.targetUnit.definition.name

log.info 'myUnitDef is ' + myUnitDef

def nameField

def groupField

switch(myUnitDef) {

case "ResellerCompany": nameField = "company_name";

break;

case "company": nameField = "name1";

break;

case "DirCustCompany": nameField = "dir_cust_company_name"

break;

}

def myCustName = myUnit.get(nameField)

log.info 'customer name is ' + myCustName

def contPersMail = resource.get("SLA_Fields_basic.responsible_person_email")

if (contPersMail) {

log.info ' Email about SLA will be sent to ' + contPersMail

 

// Send an email asynchronuously. Mail object is not available outside workflow context!

def pResName = resource.get("SLA_Fields_basic.SLA_Name")

 

// alternative to fixed text: use text template

def pText = "A relation has been modified from resource " + pResName + " to company " + myCustName

def pTo = contPersMail

def pSubject = " new or deleted SLA relation - please take care"

def pHtml = false

def pFromEmail = configurationService.getValue("cmweb-server-adapter","mail.reply.to")

 

def holder = MailSendHolder.createSelfSendHolder(pText, pHtml, null, null)

holder.setSubject(pSubject)

holder.setTo(pTo)

holder.setFrom(pFromEmail)

mailService.sendMailAsynchronous(holder)

} else {

log.info 'No mail sent to SLA contact person, no email address found'

}

Code-Beispiel 74: Relationsaktions-Skript, mit dem eine E-Mail gesendet wird, wenn eine Relation zwischen Ressource und Firma erstellt oder gelöscht wird