Action Framework - Kundenaktionen

Einleitung

Kundenaktionen (auch Datenobjektaktionen oder Unit-Aktionen genannt) sind Teil des ConSol CM Action Frameworks. Sie können für einen Kunden, d. h. einen Kontakt oder eine Firma, ausgeführt werden. Die Aktionen können automatisch vom System durchgeführt werden oder manuell von einem Bearbeiter mit den entsprechenden Berechtigungen angestoßen werden. Mögliche Anwendungsfälle für Kundenaktionen sind beispielsweise:

Sie können folgende Arten von Kundenaktionen verwenden:

Beachten Sie, dass nur Bearbeiter, die mindestens eine Rolle mit den folgenden Zugangsberechtigungen für die entsprechende Kundengruppe haben, die Kundenaktionen verwenden dürfen, d. h. nur bei ihnen werden die Aktivitäten im Web Client angezeigt!

Abbildung 258: ConSol CM Web Client - Beispiel für manuelle Kundenaktivitäten

Kundenaktionen werden als Groovy-Skripte definiert, die im Abschnitt Skripte und Templates des Admin Tools gespeichert werden. Skripte und Templates für Kunden werden normalerweise Datenobjekt- oder Unit-Skripte genannt.

Die Ausführung von Kundenaktionen kann mit Bedingungsskripten gesteuert werden, d. h. Sie können ein Datenobjekt-Bedingungsskript implementieren, das vor der Kundenaktionen selber ausgeführt wird. Das Ausführungsscript wird nur ausgeführt, wenn das Bedingungsskript true zurückgibt.

Es gibt also zwei Arten von Skripten, mit denen Sie im ConSol CM Action Framework arbeiten:

Führen Sie zur Implementierung einer Kundenaktion folgende drei Schritte durch:

  1. Erstellen Sie ein Skript für die Kundenaktion (entweder nur ein Ausführungsskript oder ein Ausführungsskript und ein Bedingungsskript).
  2. Erstellen Sie die Kundenaktionen, die die Skripte verwenden.
  3. Weisen Sie die Kundenaktionen den Kundengruppen zu, in denen sie verfügbar sein sollen. Sie können diese Aktionen den Kontakten und/oder Firmen einer Kundengruppe zuweisen.

In den folgenden Abschnitten sind diese drei Schritte detailliert beschrieben.

Verwaltung von Kundenaktionen mit dem Admin Tool

In diesem Handbuch werden die Begriffe Kunde und Kundendefinition verwendet. Die entsprechenden Skripte verwenden allerdings den Begriff Datenobjekt und die Namen der entsprechenden Java-Klassen sind Unit und UnitDefinition. Alle anderen Java-Klassen, die Kundenobjekte verarbeiten, heißen ebenfalls noch Unit... Beachten Sie dies bei Ihrer Arbeit als ConSol CM-Administrator und -Programmierer. Details finden Sie in der ConSol CM Java API Doc.

Schritt 1: Schreiben des Datenobjekt-Ausführungsskripts

Erstellen Sie ein neues Admin-Tool-Skript des Typs Datenobjekt-Aktion. Falls nötig, erstellen Sie ein weiteres Skript des Typs Datenobjekt-Bedingung.

Eine detaillierte Beschreibung der Admin-Tool-Skripte finden Sie im Abschnitt Admin-Tool-Skripte. Eine Einführung in die Admin-Tool-Skripte für Kundenaktionen finden Sie im Abschnitt Skripte für das Action Framework: Programmierung von Kundenaktionen dieses Kapitels.

Abbildung 259: ConSol CM Admin Tool - Skripte für Kundenaktionen

//create and return action result that will tell the web to create a new ticket with unit as

//a main customer

def queueId = queueService.getByName("Helpdesk").getId();

Map<String, Object> valuesMap = new HashMap<String, Object>

valuesMap.put(PostActionParameter.UNIT_ID, unit.getId())

valuesMap.put(PostActionParameter.QUEUE_ID, queueId)

return unitActionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, valuesMap)

Code-Beispiel 25: Datenobjekt-Ausführungsskript für CM-Version 6.9.4

// offer Create Ticket page for a new Service Desk ticket

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

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

def newtic = new Ticket()

def qu = queueService.getByName("ServiceDesk")

newtic.setQueue(qu)

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, newtic, unit)

Code-Beispiel 26: Datenobjekt-Ausführungsskript für CM-Version 6.10

Schritt 2: Erstellen der Kundenaktionen, die das Skript verwenden

Öffnen Sie das Navigationselement Aktionen der Navigationsgruppe Kunden im Admin Tool und fügen Sie ein neues Aktionsobjekt hinzu, indem Sie auf den Button Hinzufügen klicken. Für das Erstellen und das Editieren einer Kundenaktion wird das gleiche Pop-up-Fenster verwendet.

Abbildung 260: ConSol CM Admin Tool - Editieren einer Kundenaktion

Im Pop-up-Fenster müssen die Parameter für die neue Aktion definiert werden:

Speichern Sie die Aktion. Danach können Sie sie den Kundengruppen zuweisen. Siehe folgenden Schritt.

Schritt 3: Zuweisen von Kundenaktionen zu Kundengruppen

Damit die Kundenaktion wirksam wird, müssen Sie sie einer Kundengruppe zuweisen. Danach steht sie für alle Kunden dieser Kundengruppe zur Verfügung. Abhängig von der initialen Definition (Kontakt- oder Firmenaktion) wird die Aktion für Kontakte oder für Firmen in der Kundengruppe verfügbar sein. Um eine Kundenaktion einer Kundengruppe zuzuweisen, öffnen Sie im Admin Tool das Navigationselement Kundengruppen in der Navigationsgruppe Kunden. Wählen Sie die Kundengruppe aus, die Sie editieren möchten und klicken Sie auf den Button Bearbeiten, um das Pop-up-Fenster zu öffnen, in dem Sie die Kundenaktionen zuweisen können. Alle Kundenaktionen, die Sie unter Aktionen (siehe Schritt 2) gespeichert haben, werden hier für den jeweiligen Aktionstyp angeboten. Eine Aktion, die für den Typ Aktualisieren definiert wurde (siehe Schritt 2), wird z. B. nur als Aktualisierungsaktion angeboten.

Abbildung 261: ConSol CM Admin Tool - Zuweisen von Kundenaktionen zu einer Kundengruppe

Sie können die folgenden Aktionstypen einer Kundengruppe zuweisen:

Verwendung von Kundenaktionen als Bearbeiter (Benutzer)

Als Bearbeiter (Benutzer) sind nur die Kundenaktionen des Typs Manuell für Sie relevant. Die Skripte Erzeugen, Aktualisieren und Löschen laufen im Hintergrund.

Manuelle Aktionen werden im Web Client angeboten, ähnlich wie Workflow-Aktivitäten für Tickets. Siehe Beispiel 1 im nächsten Abschnitt.

Beispiele für Datenobjekt-Ausführungsskripte

Beispiel 1: Einfache manuelle Aktion

Eine manuelle Aktion wird als Admin-Tool-Skript programmiert und gespeichert. Dann wird eine Firmenaktion definiert, die dieses Skript verwendet, und die Aktion wird einer Kundengruppe zugewiesen.

Abbildung 262: ConSol CM Admin Tool - Datenobjekt-Ausführungsskript für eine Firmenaktion

Abbildung 263: ConSol CM Admin Tool - Definieren der Firmenaktion

Abbildung 264: ConSol CM Admin Tool - Zuweisen einer Firmenaktion zu einer Kundengruppe

Der Bearbeiter kann die Aktion manuell im Web Client ausführen.

Abbildung 265: ConSol CM Web Client - Verwenden einer manuellen Firmenaktion

Das Skript könnte zum Beispiel folgendermaßen aussehen:

// check service status for a Reseller company and set new status

// this is an example for documentation purposes

 

import com.consol.cmas.common.model.customfield.enums.EnumValue

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

 

// ... do something, e.g., reference an external system to find the current service status of the company) ...

def ser_stat = enumService.getValueByName("service_status","ok")

 

// set the new service status for the company

unit.set("ResellerCompanyData:service_status","ok")

unitService.update(unit)

 

return actionScriptResultFactory.getPostAction(PostActionType.SUCCESS, "info.dataobject.action.success").withRefreshContent();

Code-Beispiel 27: Datenobjekt-Ausführungsskript, CM-Version 6.10

Beispiel 2: Neues Ticket für einen Kunden

Das folgende Skript öffnet die Seite Neues Ticket für den Kontakt oder die Firma, für den/die die Aktion ausgeführt wurde. Die Ziel-Queue ist ServiceDesk. Auf diese Weise kann man schnell ein neues Service-Desk-Ticket für den offenen Kontakt bzw. die offene Firma erstellen. Der folgende Abschnitt enthält eine Einführung in die Admin-Tool-Skripte für das Action Framework.

import com.consol.cmas.common.model.scripting.unit.PostActionParameterimport

import com.consol.cmas.core.server.service.UnitActionScriptResultFactoryimport

import com.consol.cmas.common.model.scripting.unit.PostActionType

 

def queueId = queueService.getByName("ServiceDesk").getId();

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.UNIT_ID, unit.getId())

valuesMap.put(PostActionParameter.QUEUE_ID, queueId)

return unitActionScriptResultFactory.getPostAction("createTicket", valuesMap)

Code-Beispiel 28: Kundenskript (CM-Version 6.9.4)

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

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

def newtic = new Ticket()

def qu = queueService.getByName("ServiceDesk")

newtic.setQueue(qu)

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, newtic, unit)

Code-Beispiel 29: Kundenskript (CM-Version 6.10)

Denken Sie daran, dass die Checkbox Firma als Kunde im Kundendatenmodell der jeweiligen Kundengruppe markiert sein muss, wenn es möglich sein soll, ein Ticket mit der Firma als Hauptkunde zu erstellen.

Skripte für das Action Framework: Programmierung von Kundenaktionen

Kundenaktionen werden in Admin-Tool-Skripten definiert, d. h. Groovy-Skripten, die im Bereich Skripte und Templates des Admin Tools gespeichert sind. Für diese Skripte ist das vordefinierte Objekt unit (d. h. ein Objekt der Klasse Unit) verfügbar. Objekte der Klasse Unit können je nach Kontext eine Firma oder einen Kontakt darstellen.

Es gibt zwei Arten von Skripten im Action Framework:

Datenobjekt-Ausführungsskripte

Die Aktionen in diesem Skript werden entweder automatisch durch die Systemoperationen Erzeugen, Aktualisieren oder Löschen angestoßen oder durch eine manuelle Aktion des Bearbeiters (mit den Aktivitäten im Web Client) ausgelöst.

Skripte für automatische Kundenaktionen

unit.set("personalData.name", "Skywalker")

unitService.update(unit)

Code-Beispiel 30: Setzen eines Wertes in den Kundendaten und Aktualisieren der Unit

Wenn Sie unitService.update(unit) wie im obigen Beispiel verwenden, sollten Sie ein Datenobjekt-Bedingungsskript einsetzen, um Endlosschleifen zu vermeiden. Siehe auch den Hinweis im Abschnitt Datenobjekt-Bedingungsskripte.

Skripte für manuelle Kundenaktionen

In Skripten für manuelle Kundenaktionen können Sie einige spezielle Methoden und Objekte verwenden.

CM-Version 6.9:

CM-Versionen 6.10 und höher:

Eine detaillierte Erklärung der PostActionTypes in CM-Versionen 6.10 und höher finden Sie im Abschnitt Skripte für das Action Framework.

Erstellen einer Unit

(PostActionType.CREATE_UNIT) leitet den Benutzer auf die Seite zur Erstellung einer Unit weiter. Dabei wird der optionale Parameter PostActionParameter.CUSTOMER_GROUP_ID verwendet, um zu definieren, für welche Kundengruppe die neue Unit erstellt werden soll. Optional kann eine Map mit Datenobjektgruppenfelder übergeben werden (PostActionParameter.FIELDS_MAP), um die Datenobjektgruppenfelder der Unit mit übergebenen Werten zu füllen.

import com.consol.cmas.common.model.customfield.meta.FieldKey

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

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

import com.consol.cmas.common.model.scripting.unit.PostActionParameter

import com.consol.cmas.common.model.scripting.unit.PostActionType

 

Map<FieldKey, AbstractField<?>> fieldsMap = new HashMap<FieldKey, AbstractField<?>>()

FieldKey firstName = new FieldKey("customer", "firstname")

FieldKey name = new FieldKey("customer", "name")

fieldsMap.put(firstName, new StringField(firstName, "Han"))

fieldsMap.put(name, new StringField(name, "Solo"))

 

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.CUSTOMER_GROUP_ID, unit.getCustomerGroup().getId())

valuesMap.put(PostActionParameter.FIELDS_MAP, fieldsMap)

 

return unitActionScriptResultFactory.getPostAction(PostActionType.CREATE_UNIT, valuesMap)

Code-Beispiel 31: Firmenskript, mit dem einige Unit-Daten gefüllt werden, CM-Version 6.9.4

// used for companies in MyCustomerGroup to create new contacts easily

 

import com.consol.cmas.common.model.customfield.meta.*

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

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

 

def myunit = new Unit()

 

def mycustomergroup = customerGroupService.getByName("MyCustomerGroup")

myunit.setCustomerGroup(mycustomergroup)

 

def mycustomerdefinition = unitDefinitionService.getByName("customer")

myunit.setDefinition(mycustomerdefinition)

myunit.set("company()", unit)

 

myunit.set("customer.firstname", "Han")

myunit.set("customer.name", "Solo")

 

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_UNIT, myunit)

Code-Beispiel 32: Firmenskript, mit dem einige Unit-Daten gefüllt werden, CM-Version 6.10

Abbildung 266: ConSol CM Web Client - Manuelle Firmenaktion

Abbildung 267: ConSol CM Web Client - Seite zum Erstellen einer Unit geöffnet und durch Firmenaktion teilweise gefüllt

Die Namen der im Skript verwendeten Datenobjektgruppenfelder müssen natürlich aus dem Kundendatenmodell stammen, das der Kundengruppe zugewiesen ist, für die ein neuer Kontakt erstellt werden soll.

Abbildung 268: ConSol CM Admin Tool - Skript zum Erstellen einer Unit-Seite als Firmenaktion

Erstellen eines Tickets

(PostActionType.CREATE_TICKET) leitet den Benutzer auf die Seite zum Erstellen eines Tickets weiter. Dabei werden die optionalen Parameter PostActionParameter.UNIT_ID mit der ID des Hauptkunden, PostActionParameter.QUEUE_ID mit der ID der Queue und die Map mit den Benutzerdefinierten Feldern PostActionParameter.FIELDS_MAP verwendet.

// offer Create Ticket page for a new HelpDesk 1st level ticket

 

import com.consol.cmas.common.model.scripting.unit.PostActionType

import com.consol.cmas.common.model.scripting.unit.PostActionParameter

 

def queueId = queueService.getByName("HelpDesk_1st_Level").getId()

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.UNIT_ID, unit.getId())

valuesMap.put(PostActionParameter.QUEUE_ID, queueId)

return unitActionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, valuesMap)

Code-Beispiel 33: Mit dem Skript wird ein Aktionsergebnis erzeugt und zurückgegeben, das den Web Client anweist, ein neues Ticket mit der Unit als Hauptkontakt zu erstellen, CM-Version 6.9.4

// offer Create Ticket page for a new Service Desk ticket

 

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

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

def newtic = new Ticket()

def qu = queueService.getByName("ServiceDesk")

newtic.setQueue(qu)

return actionScriptResultFactory.getPostAction(PostActionType.CREATE_TICKET, newtic, unit)

Code-Beispiel 34: Mit dem Skript wird ein Aktionsergebnis erzeugt und zurückgegeben, das den Web Client anweist, ein neues Ticket mit der Unit als Hauptkontakt zu erstellen, CM-Version 6.10

Denken Sie daran, dass die Kundengruppe, auf die das Skript angewendet werden soll, der Queue zugewiesen sein muss, in der das Ticket erstellt werden soll (in diesem Beispiel HelpDesk_1st_Level).

Abbildung 269: ConSol CM Web Client - Manuelle Kontaktaktion

Abbildung 270: ConSol CM Web Client - Seite zum Erstellen eines Tickets geöffnet und durch Kontaktaktion teilweise gefüllt

Öffnen einer Unit-Seite

(PostActionType.GOTO_UNIT) leitet auf eine Unit-Seite weiter. Sie verwendet den obligatorischen Parameter PostActionParameter.UNIT_ID mit der ID der Unit.

import com.consol.cmas.common.model.scripting.unit.PostActionType

import com.consol.cmas.common.model.scripting.unit.PostActionParameter

 

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.UNIT_ID, unit.get("company()").getId())

return unitActionScriptResultFactory.getPostAction(PostActionType.GOTO_UNIT, valuesMap)

Code-Beispiel 35: Skript, das die Firmenseite öffnet, CM-Version 6.9.4

Beispiel: Aufrufen der Kontaktdetailseite eines Endkunden und Öffnen der Firmendetailseite der Händlerfirma, die für diesen Endkunden zuständig ist. Eine Relation zwischen Firma und Kontakt muss zuvor hergestellt worden sein. Wenn mehr als eine Händlerrelation definiert wurde, wird die erste Relation in der Liste verwendet.

Abbildung 271: ConSol CM Web Client - Kundenaktion auf Kontaktdetailseite (Aktivität öffnet die Firmendetailseite des zuständigen Händlers, CM-Version 6.10)

// Open company detail page of responsible reseller company, uses first reseller in list

// should only be executed if this relation exists. A condition script is used to check

 

import com.consol.cmas.common.service.UnitRelationDefinitionService

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

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

 

// find responsible reseller

def unit_rel_def = unitRelationDefinitionService.getByName("ResellerDirectCustomersRelation")

 

Set<UnitRelation> res_relations = unitRelationService.getByDefinitionAndTarget(unit_rel_def, unit)

 

if (res_relations.size() > 0) {

def source_unit = res_relations.toArray()[0].getSourceUnit()

// log.info("SOURCE UNIT IS NOW " + source_unit.get("ResellerCompanyData:company_name"))

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_UNIT, source_unit)

 

} else {

log.info("ERROR -- no responsible reseller unit found")

return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "action.result.failure" )

}

Code-Beispiel 36: Skript, das die Firmenseite öffnet, CM-Version 6.10

Falls die Aktion Seite des Wiederverkäufers öffnen (OpenResponsibleResellerPage) nur im Web Client angeboten werden soll, wenn ein zuständiger Händler festgelegt wurde, können Sie mit einem Datenobjekt-Bedingungsskript arbeiten. Dies muss als Admin-Tool-Skript des Typs Datenobjekt-Bedingung erstellt werden und der Kundenaktion im Abschnitt Aktionen zugewiesen werden.

Abbildung 272: ConSol CM Admin Tool - Zuweisen eines Datenobjekt-Bedingungsskripts

// Checks if reseller relation is set

 

import com.consol.cmas.common.service.UnitRelationDefinitionService

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

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

 

// find responsible reseller

def unit_rel_def = unitRelationDefinitionService.getByName("ResellerDirectCustomersRelation")

Set<UnitRelation> res_relations = unitRelationService.getByDefinitionAndTarget(unit_rel_def, unit)

if (res_relations.size() > 0) {

return true

} else {

return false

}

Code-Beispiel 37: Datenobjekt-Bedingungsskript, das überprüft, ob es eine Reseller-Relation gibt

Öffnen einer Ticketseite

(PostActionType.GOTO_TICKET) leitet auf eine Ticketseite weiter. Sie verwendet den obligatorischen Parameter PostActionParameter.TICKET_ID mit der ID des Tickets.

import com.consol.cmas.common.model.scripting.unit.PostActionType

import com.consol.cmas.common.model.scripting.unit.PostActionParameter

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

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

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

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

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

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

import com.consol.cmas.common.model.customfield.meta.FieldKey

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

import com.consol.cmas.common.model.ContactTicketRole

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

import com.consol.cmas.common.model.scripting.unit.UnitActionScriptResult

 

 

//get AM queue for search

def q_id = (workflowApi.getQueueByName("AccountManagement")).id

def q_ids = new HashSet()

q_ids.add(q_id)

 

//find AM ticket for the company

def crit = new TicketCriteria()

crit.setQueueIds(q_ids)

 

// create list field key

def contactSearchListFieldKey = new FieldKey("queue_fields","contacts")

 

// prepare list field

def contactsListField = new ListField(contactSearchListFieldKey )

 

// create member field key

def contactSearchFieldKey = new FieldKey("queue_fields","contacts_member")

 

// create unit member field with Unit and ticket main role

 

def contactsMember = new

ContactReferenceSearchField(contactSearchFieldKey, unit,

ContactTicketRole.MAIN_ROLE)

 

// put member field in Unit list field

contactsListField.addChild(contactsMember)

 

// put field(s) into the criteria

crit.setFields([contactsListField] as Set)

 

// seek and find

def foundTickets = ticketService.getByCriteria(crit)

 

if ( foundTickets ) {

def AM_tic = foundTickets.first()

def AM_tic_id = AM_tic.id

 

// go to AM ticket

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.TICKET_ID, AM_tic_id)

return unitActionScriptResultFactory.getPostAction(PostActionType.GOTO_TICKET, valuesMap)

}

 

// Default: found nothing

return null

Code-Beispiel 38: Öffnen einer Ticketseite im Ansichtsmodus, CM-Version 6.9

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

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

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

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

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

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

import com.consol.cmas.common.model.customfield.meta.FieldKey

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

import com.consol.cmas.common.model.ContactTicketRole

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

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

 

//get AM queue for search

def q_id = (workflowApi.getQueueByName("AccountManagement")).id

def q_ids = new HashSet()

q_ids.add(q_id)

//find AM ticket for the company

def crit = new TicketCriteria()

crit.setQueueIds(q_ids)

// Listenfeld-Key erzeugen

def contactSearchListFieldKey = new FieldKey("queue_fields","contacts")

// Listenfeld vorbereiten

def contactsListField = new ListField(contactSearchListFieldKey )

// Memberfeld-Key erzeugen

def contactSearchFieldKey = new FieldKey("queue_fields","contacts_member")

// Unit-Memberfeld mit Unit und Ticket-Hauptrolle erzeugen

// COmpany is MAIN CONTACT at the AM ticket!

def contactsMember = new ContactReferenceSearchField(contactSearchFieldKey, unit, ContactTicketRole.MAIN_ROLE)

// Member-Feld in Unit-Listenfeld stopfen

contactsListField.addChild(contactsMember)

// Feld(er) in die Kriterien stopfen

crit.setFields([contactsListField] as Set)

// Suchen und finden

def foundTickets = ticketService.getByCriteria(crit)

println "Found tickets: ${foundTickets}"

 

if ( foundTickets ) {

def AM_tic = foundTickets.first()

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_TICKET, AM_tic)

}

// Default: found nothing

return null

Code-Beispiel 39: Öffnen einer Ticketseite im Ansichtsmodus, CM-Version 6.10

Beachten Sie bei der Verwendung von einem der obigen Skripte, dass die Datenobjektgruppenfelder der Firma für die Ticketsuche indiziert sein müssen (Annotation field-indexed = true).

Abbildung 273: ConSol CM Web Client - Firmenaktion auf der Firmenseite (1)

Abbildung 274: ConSol CM Web Client - AM-Seite nach der Firmenaktion AM-Ticket anzeigen

Öffnen einer Webseite

(PostActionType.GOTO_PAGE) leitet an eine URL weiter. Sie verwendet den obligatorischen Parameter PostActionParameter.URL mit der URL.

Der folgende Code zeigt ein einfaches Beispiel für eine festgelegte URL für jede Firma.

import com.consol.cmas.common.model.scripting.unit.PostActionType

import com.consol.cmas.common.model.scripting.unit.PostActionParameter

 

Map<String, Object> valuesMap = new HashMap<String, Object>()

valuesMap.put(PostActionParameter.URL, unit.get("company:www"))

return unitActionScriptResultFactory.getPostAction(PostActionType.GOTO_PAGE, valuesMap)

Code-Beispiel 40: Skript, das eine bestimmte Website (URL) öffnet, CM-Version 6.9.4

// opens company's web site

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

 

def url = unit.get("url")

 

if (!url) {

return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "error.script.no.url")

} else {

return actionScriptResultFactory.getPostAction(PostActionType.GOTO_PAGE,url)

}

Code-Beispiel 41: Skript, das eine bestimmte Website (URL) öffnet, CM-Version 6.10

Der String error.script.no.url ist ein in der Navigationsgruppe Bezeichnungen definiertes Label, siehe Abschnitt Bezeichnungen.

Abbildung 275: ConSol CM Web Client - Firmenaktion auf der Firmenseite (2)

Um eine festgelegte URL zu öffnen, können Sie ein Datenobjektgruppenfeld des Typs string mit der Annotation text-type = url verwenden. Dies erzeugt automatisch einen Hyperlink. Deswegen ist die Verwendung des Parameters GOTO_URL in Datenobjekt-Ausführungsskripten nur empfehlenswert, wenn die URL mit dem Skript dynamisch gebildet wird.

Datenobjekt-Bedingungsskripte

Ein Datenobjekt-Bedingungsskript definiert, ob die Aktion im Web Client angezeigt werden soll oder nicht. Es wird vor dem Datenobjekt-Ausführungsskript ausgeführt. Wenn es false zurückgibt, wird das Datenobjekt-Ausführungsskript nicht ausgeführt.

if(unit.getFieldValue("customer.personalData") == null) {

return true

} else {

return false

}

Code-Beispiel 42: Datenobjekt-Bedingungsskript

Um ein Datenobjekt-Bedingungsskript einsetzen zu können, müssen Sie folgende Schritte durchführen:

  1. Schreiben Sie ein Admin-Tool-Skript des Typs Datenobjekt-Bedingung. Das Skript muss die Bedingungen für die Rückgabe von true und false definieren. Siehe Beispiel oben. An dieser Stelle müssen Sie bereits wissen, für welche Kundengruppen und Datenmodelle das Skript verwendet werden soll, um sicherzustellen, dass das Skript die richtigen Datenfelder referenziert.
  2. Weisen Sie das Datenobjekt-Bedingungsskript einer oder mehreren Kundenaktionen zu. Dies wird im Abschnitt Aktionen der Navigationsgruppe Kunden gemacht. Auf diese Weise wird dieses Datenobjekt-Bedingungsskript immer vor dem Datenobjekt-Ausführungsskript dieser Kundenaktion ausgeführt.

Das ist alles. Sie müssen das Bedingungsskript keiner Kundengruppe zuweisen. Dies geschieht implizit, wenn die entsprechende Kundenaktion den Kontakten oder Firmen bestimmter Kundengruppen zugewiesen wird.

Wichtige Groovy-Objekte

Objekt UnitActionScriptResult (CM-Version 6.9)

Das Objekt UnitActionScriptResult wird nur für manuelle Aktionen berücksichtigt. Es steht für Aktionen wie Erzeugen, Aktualisieren oder Löschen nicht zur Verfügung. Das Objekt UnitActionScriptResult wird von der Methode unitActionScriptResultFactory.getPostAction(String, Map<String, Object>) erzeugt. Mit dieser Klasse (bzw. diesem Objekt) werden Informationen gespeichert, die die Prozesse beeinflussen, die nach dem Ausführen der manuellen Aktion im Web Client stattfinden. Das Objekt UnitActionScriptResult enthält den manuellen Aktionstyp, die IDs des Tickets, der Unit, der Queue und der Kundengruppe. Nach dem Ausführen der manuellen Aktion kann der Benutzer auf eine andere Seite weitergeleitet werden.

Objekt actionScriptResult (CM-Version 6.10 und höher)

Ab CM-Version 6.10 bietet das Action Framework die Klassen ActionScriptResult und ActionScriptResultFactory. Ein Objekt (singleton) der Klasse ActionScriptResultFactory ist als actionScriptResultFactory in allen Aktionsskripten, unabhängig vom Typ des Aktionsskripts, verfügbar.

Details finden Sie im Abschnitt Skripte für das Action Framework.

Die Kundenaktionen Erzeugen, Aktualisieren und Löschen werden in den Kernmethoden create, update und delete des Objekts unitService ausgeführt.

Wenn also ein Ausführungsskript das Typs Aktualisieren den Kunden mit der Methode unitService.update(Unit) aktualisiert, kann dies den Fehler java.lang.StackOverflowError verursachen, da die Aktualisierungsaktion unendlich oft ausgeführt wird. In diesem Fall sollten Sie ein Datenobjekt-Bedingungsskript verwenden, um solche Endlosschleifen zu vermeiden.

Arbeiten mit dem Changes-Objekt in Kundenaktionen des Typs Aktualisieren

Ab CM-Version 6.10.5.4 ist es möglich, die Änderungen zu überwachen, die während einer Aktion zur Kundenaktualisierung durchgeführt wurden. (Das gleiche gilt für die Aktionen Aktualisieren von Ressourcen, siehe Abschnitt Arbeiten mit dem Changes-Objekt in Ressourcenaktionen des Typs Aktualisieren).

Mit dem Objekt der Klasse UnitChanges in Unit-Aktionen können Sie herausfinden, welche Änderungen erfolgt sind.

Denken Sie daran, dass das Skript Aktualisieren in folgenden Fällen ausgeführt wird:

Es gibt zwei Methoden des unitChanges-Objekts, die Informationen über die geänderten Daten bereitstellen: 

Da die Rückgabeparameter der Methode ziemlich komplexe Bestandteile haben, empfehlen wir, die API Doc der Klasse UnitChanges zu lesen. Das folgende Codebeispiel enthält ein Skript, in dem das Objekt unitChanges verwendet wird.

// Update Action Script UpdateContactData.groovy for contacts in Reseller group

import com.consol.cmas.common.model.content.unit.UnitCommentEntry

import com.consol.cmas.common.model.content.unit.UnitAttachmentEntry

log.info 'Contact data have been UPDATEd!'

// Are there any changes?

if (changes) {

log.info 'Yes, changes have been made to unit'

log.info 'Changes object is a ' + changes.class

}

// Have Custom Fields (Data Object Group Fields) been changed? If yes - which?

if (changes.customFieldChangeInfo) {

log.info 'Yes, changes have been made to Custom Fields'

log.info changes.customFieldChangeInfo

log.info changes.customFieldChangeInfo.each { k, v ->

log.info "Changed field: ${k.groupName}/ ${k.fieldName}"

log.info "New value: ${v.value.value}"

log.info "Old value: ${v.previousValue.value}"

}

} else {

log.info 'No changes to Custom Fields'

}

 

// Have comments or attachmenst been changed? If yes - which?

log.info changes.contentChangeInfo

if (changes.contentChangeInfo){

log.info 'Yes, changes have been made in detail section'

if (changes.contentChangeInfo.value){

log.info changes?.contentChangeInfo.each { ctEntry ->

 

if (ctEntry?.value[0] instanceof UnitCommentEntry){

log.info 'A comment has been added.'

log.info 'Old value: ' + ctEntry?.previousValue

log.info 'New value: ' + ctEntry.value[0]?.text

log.info 'Made by the engineer ' + ctEntry.value[0]?.engineer?.name

log.info 'Creation date of the comment: ' + ctEntry.value[0]?.creationDate

} else if (ctEntry?.value[0] instanceof UnitAttachmentEntry){

log.info 'An attachment has been added.'

log.info 'Old value: ' + ctEntry?.previousValue

log.info 'New value text: ' + ctEntry.value[0]?.text

log.info 'New value file name: ' + ctEntry.value[0]?.filename

}

}

} else {

log.info 'Entry has been deleted.'

}

}

Code-Beispiel 43: Unit-Aktualisierungsskript, in dem Änderungen überwacht und in die Datei server.log geschrieben werden

Wenn bei einem Kontakt der Kundengruppe Resellers Änderungen an den Datenobjektgruppenfeldern phone und vip_person gemacht wurden, wird folgender Text in der Datei server.log angezeigt.

database_UpdateContactData] [Susan-] Contact data have been UPDATEd!

database_UpdateContactData] [Susan-] Yes, changes have been made to unit

database_UpdateContactData] [Susan-] Changes object is a class com.consol.cmas.common.model.history.unit.UnitChanges

database_UpdateContactData] [Susan-] Yes, changes have been made to Custom Fields

database_UpdateContactData] [Susan-] {(phone,ResellerCustomerData)=Modification{value=AbstractField{key=(phone,ResellerCustomerData), value=0211/1231777}, previousValue=AbstractField{key=(phone,ResellerCustomerData), value=0211/1231666}}, (vip_person,ResellerCustomerData)=Modification{value=AbstractField{key=(vip_person,ResellerCustomerData), value=false}, previousValue=AbstractField{key=(vip_person,ResellerCustomerData), value=true}}}

database_UpdateContactData] [Susan-] Changed field: ResellerCustomerData/ phone

database_UpdateContactData] [Susan-] New value: 0211/1231777

database_UpdateContactData] [Susan-] Old value: 0211/1231666

database_UpdateContactData] [Susan-] Changed field: ResellerCustomerData/ vip_person

database_UpdateContactData] [Susan-] New value: false

database_UpdateContactData] [Susan-] Old value: true

Code-Beispiel 44: Log-Ausgabe für das obige Skript