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:
In den folgenden Abschnitten sind diese drei Schritte detailliert beschrieben.
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.
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
Ö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:
wird. (Das Skript wird nicht ausgeführt, wenn der Kommentar einer Relation geändert wird.)
Speichern Sie die Aktion. Danach können Sie sie den Kundengruppen zuweisen. Siehe folgenden Schritt.
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:
Für jeden Typ können Sie das Systemverhalten für die folgenden Operationen festlegen:
wird. (Das Skript wird nicht ausgeführt, wenn der Kommentar einer Relation geändert wird.)
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.
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
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.
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:
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.
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.
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.
(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
(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
(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
(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
(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.
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:
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.
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.
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.
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