Loading
Service
Automatisches Ausfüllen von Meilensteinen für Kundenvorgänge mithilfe eines Apex-Auslösers

Automatisches Ausfüllen von Meilensteinen für Kundenvorgänge mithilfe eines Apex-Auslösers

Erstellen Sie einen Apex-Auslöser, mit dem Meilensteine in Kundenvorgängen, die eindeutige Kriterien erfüllen, automatisch als "Abgeschlossen" markiert werden. Definieren Sie in Ihrem Auslöser, welche Ereignisse und welche zugehörigen Kundenvorgangskriterien erfüllt sein müssen, damit ein Meilenstein als abgeschlossen markiert wird. Sie können einen ähnlichen Auslöser implementieren, um die Meilensteine für Arbeitsaufträge automatisch zu vervollständigen.

Erforderliche Editionen

Unterstützte Editionen anzeigen.
Erforderliche Benutzerberechtigungen
Definieren von Apex-Auslösern und -Klassen: Autor-Apex
Tipp
Tipp In Lightning Experience können Supportmitarbeiter in der Komponente "Meilensteine" auf den Link "Als abgeschlossen markieren" klicken, um einen Meilenstein als abgeschlossen zu markieren. Dieser Vorgang wird nicht automatisch ausgeführt, ist aber ganz einfach. Weitere Informationen finden Sie unter Einrichten der Meilensteinüberwachung.

Die folgenden Auslöser markieren bestimmte Typen von Meilensteinen des Typs "Abgeschlossen", wenn der Kundenvorgang, für den sie gelten, eindeutige Kriterien erfüllt. Es wurden zudem eine Meilensteindienstprogramm-Apex-Klasse und zugehörige Einheitentests bereitgestellt. Definieren Sie die Meilensteindienstprogramm-Klasse, bevor Sie einen der Auslöser verwenden.

Meilensteindienstprogramm-Apex-Klasse
Apex-Klassen reduzieren die Größe Ihrer Auslöser und erleichtern das Wiederverwenden und Verwalten von Apex-Code. Definieren dieser Apex-Klasse in Ihrer Organisation:
  1. Geben Sie unter "Setup" im Feld Schnellsuche den Text Apex-Klassen ein und klicken Sie dann auf Apex-Klassen.
  2. Klicken Sie auf Neu.
  3. Kopieren Sie den Klassentext und fügen Sie ihn in das Textfeld ein.
  4. Klicken Sie auf Speichern.
public class MilestoneUtils {
    public static void completeMilestone(List<Id> caseIds, 
            String milestoneName, DateTime complDate) {  
    List<CaseMilestone> cmsToUpdate = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds and cm.MilestoneType.Name=:milestoneName 
            and completionDate = null limit 1];
    if (cmsToUpdate.isEmpty() == false){
        for (CaseMilestone cm : cmsToUpdate){
            cm.completionDate = complDate;
            }
        update cmsToUpdate;
        }
    }
}
Apex-Klasseneinheitentest
Sie können Apex-Einheitentests in der Entwicklerkonsole einrichten, um Ihren Code auf Probleme zu untersuchen.
/**
* This class contains unit tests for validating the behavior of Apex classes
* and triggers.
*
* Unit tests are class methods that verify whether a particular piece
* of code is working properly. Unit test methods take no arguments,
* commit no data to the database, and are flagged with the testMethod
* keyword in the method definition.
*
* All test methods in an organization are executed whenever Apex code is deployed
* to a production organization to confirm correctness, ensure code
* coverage, and prevent regressions. All Apex classes are
* required to have at least 75% code coverage in order to be deployed
* to a production organization. In addition, all triggers must have some code coverage.
*
* The @isTest class annotation indicates this class only contains test
* methods. Classes defined with the @isTest annotation do not count against
* the organization size limit for all Apex scripts.
*
* See the Apex Language Reference for more information about Testing and Code Coverage.
*/
@isTest
private class MilestoneTest {

static testMethod void TestCompleteMilestoneCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Id contactId = cont.Id;

Entitlement entl = new Entitlement(Name='TestEntitlement', AccountId=busAcc.Id);
insert entl;

String entlId;
if (entl != null)
entlId = entl.Id; 

List<Case> cases = new List<Case>{};
if (entlId != null){
Case c = new Case(Subject = 'Test Case with Entitlement ', 
EntitlementId = entlId, ContactId = contactId);
cases.add(c);
}
if (cases.isEmpty()==false){
insert cases;
List<Id> caseIds = new List<Id>();
for (Case cL : cases){
caseIds.add(cL.Id);
}
milestoneUtils.completeMilestone(caseIds, 'First Response', System.now());
}
}

static testMethod void testCompleteMilestoneViaCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Id contactId = cont.Id;

Entitlement entl = new Entitlement(Name='TestEntitlement', AccountId=busAcc.Id);
insert entl;

String entlId;
if (entl != null)
entlId = entl.Id; 

List<Case> cases = new List<Case>{};
for(Integer i = 0; i < 1; i++){
Case c = new Case(Subject = 'Test Case ' + i);
cases.add(c);
if (entlId != null){
c = new Case(Subject = 'Test Case with Entitlement ' + i, 
EntitlementId = entlId);
cases.add(c);
}
}
}
}
Beispielauslöser 1
Sie können einen Meilenstein mit dem Namen "Lösungszeitspanne" erstellen, für den es erforderlich ist, dass Kundenvorgänge in einem bestimmten Zeitraum abgeschlossen werden. Hierbei handelt es sich um eine großartige Möglichkeit, die Lösungszeitspanne eines Kundenvorgangs in Service Level Agreements (SLAs) zu erzwingen. Dieser Beispielkundenvorgangsauslöser markiert jeden Meilenstein vom Typ "Lösungszeitspanne" als "Abgeschlossen", wenn sein Kundenvorgang geschlossen ist. Auf diese Weise muss der Supportmitarbeiter den Meilenstein nach dem Schließen des Kundenvorgangs nicht manuell als abgeschlossen markieren.
Hinweis
Hinweis Dieser Auslöser verweist auf die Meilensteindienstprogramm-Testklasse. Daher müssen Sie zunächst die Testklasse definieren.

Definieren dieses Auslösers in Ihrer Organisation:

  1. Geben Sie unter "Setup" im Feld "Schnellsuche" den Text Kundenvorgangsauslöser ein und klicken Sie dann auf Kundenvorgangsauslöser.
  2. Klicken Sie auf Neu.
  3. Kopieren Sie den Auslösertext und fügen Sie ihn in das Textfeld ein.
  4. Klicken Sie auf Speichern.
trigger CompleteResolutionTimeMilestone on Case (after update) {
    if (UserInfo.getUserType() == 'Standard'){
        DateTime completionDate = System.now(); 
            List<Id> updateCases = new List<Id>();
            for (Case c : Trigger.new){
                    if (((c.isClosed == true)||(c.Status == 'Closed'))&&((c.SlaStartDate 
                        <= completionDate)&&(c.SlaExitDate == null)))
        updateCases.add(c.Id);
        }
    if (updateCases.isEmpty() == false)
        milestoneUtils.completeMilestone(updateCases, 'Resolution Time', completionDate);
    }
}
Beispielauslöser 2
Sie können einen Meilenstein mit dem Namen "Erste Antwort" erstellen, bei dem Supportmitarbeiter innerhalb von X Minuten oder Stunden nach der Erstellung des Kundenvorgangs mit einem Kundenvorgangskontakt in Kontakt treten müssen. Hierbei handelt es sich um eine gute Möglichkeit, sicherzustellen, dass Ihr Support-Team schnellstmöglich mit Kundenvorgangskontakten kommuniziert. Dieser Beispiel-E-Mail-Auslöser markiert den Meilenstein "Erste Antwort" als "Abgeschlossen", wenn eine E-Mail an den Kundenvorgangskontakt gesendet wurde. Auf diese Weise muss der Supportmitarbeiter den Meilenstein "Erste Antwort" nicht manuell als abgeschlossen markieren, nachdem er dem Kundenvorgangskontakt eine E-Mail gesendet hat.
Hinweis
Hinweis Dieser Auslöser verweist auf die Meilensteindienstprogramm-Testklasse. Daher müssen Sie zunächst die Testklasse definieren.

Definieren dieses Auslösers in Ihrer Organisation:

  1. Geben Sie unter "Setup" im Feld "Schnellsuche" den Text Auslöser für E-Mail-Nachricht ein und klicken Sie dann auf Auslöser für E-Mail-Nachricht.
  2. Klicken Sie auf Neu.
  3. Kopieren Sie den Auslösertext und fügen Sie ihn in das Textfeld ein.
  4. Klicken Sie auf Speichern.
trigger CompleteFirstResponseEmail on EmailMessage (after insert) {
    if (UserInfo.getUserType() == 'Standard'){
        DateTime completionDate = System.now();
        Map<Id, String> emIds = new Map<Id, String>();
        for (EmailMessage em : Trigger.new){
            if(em.Incoming == false)
                emIds.put(em.ParentId, em.ToAddress);
        }
        if (emIds.isEmpty() == false){
            Set <Id> emCaseIds = new Set<Id>();
            emCaseIds = emIds.keySet();
                List<Case> caseList = [Select c.Id, c.ContactId, c.Contact.Email,
                    c.OwnerId, c.Status,
                    c.EntitlementId,
                    c.SlaStartDate, c.SlaExitDate
                    From Case c where c.Id IN :emCaseIds];
            if (caseList.isEmpty()==false){
                    List<Id> updateCases = new List<Id>();
                    for (Case caseObj:caseList) {
                        if ((emIds.get(caseObj.Id)==caseObj.Contact.Email)&&
                            (caseObj.Status == 'In Progress')&&
                            (caseObj.EntitlementId != null)&&
                            (caseObj.SlaStartDate <= completionDate)&&
                            (caseObj.SlaStartDate != null)&&
                            (caseObj.SlaExitDate == null))
                                updateCases.add(caseObj.Id);
                    }
                    if(updateCases.isEmpty() == false)
                        milestoneUtils.completeMilestone(updateCases, 
                                'First Response', completionDate);
            }
        }
    }        
}
Beispielauslöser 3
Während der vorherige Auslöser E-Mails behandelte, markiert dieser Beispiel-Kundenvorgangskommentarauslöser den Meilenstein "Erste Antwort" als "Abgeschlossen", wenn der Kundenvorgang öffentlich kommentiert wird. Sie können ihn verwenden, wenn ein öffentlicher Kundenvorgangskommentar eine gültige erste Antwort in Ihren Supportbegriffen ist.
Hinweis
Hinweis Dieser Auslöser verweist auf die Meilensteindienstprogramm-Testklasse. Daher müssen Sie zunächst die Testklasse definieren.

Definieren dieses Auslösers in Ihrer Organisation:

  1. Geben Sie unter "Setup" im Feld "Schnellsuche" den Text Kundenvorgangskommentar-Auslöser ein und klicken Sie dann auf Kundenvorgangskommentar-Auslöser.
  2. Klicken Sie auf Neu.
  3. Kopieren Sie den Auslösertext und fügen Sie ihn in das Textfeld ein.
  4. Klicken Sie auf Speichern.
trigger CompleteFirstResponseCaseComment on CaseComment (after insert) {
    if (UserInfo.getUserType() == 'Standard'){
        DateTime completionDate = System.now();
        List<Id> caseIds = new List<Id>();
        for (CaseComment cc : Trigger.new){
                if(cc.IsPublished == true)
                caseIds.add(cc.ParentId);
        }
        if (caseIds.isEmpty() == false){
            List<Case> caseList = [Select c.Id, c.ContactId, c.Contact.Email,
                    c.OwnerId, c.Status,
                    c.EntitlementId, c.SlaStartDate,
                    c.SlaExitDate
                    From Case c
                    Where c.Id IN :caseIds];
        if (caseList.isEmpty() == false){
            List<Id> updateCases = new List<Id>();
            for (Case caseObj:caseList) {
                if ((caseObj.Status == 'In Progress')&&
                        (caseObj.EntitlementId != null)&&
                        (caseObj.SlaStartDate <= completionDate)&&
                        (caseObj.SlaStartDate != null)&&
                        (caseObj.SlaExitDate == null))
                    updateCases.add(caseObj.Id);
                }
                if(updateCases.isEmpty() == false)
                    milestoneUtils.completeMilestone(updateCases, 
                    'First Response', completionDate);
            }
        }
    }
}
 
Laden
Salesforce Help | Article