У меня возникли проблемы со сравнением старого и нового владельца учетной записи, связанной с контактом, для выполнения пункта 6 требования.

Может кто-нибудь предложить, как мне удовлетворить условие № 6 в логике.

Я пытаюсь написать триггер для достижения следующего

// Когда Контакт создан или обновлен -

// Отправляем электронное письмо контакту от имени AccountOwner

// Создать дополнительную задачу для AccountOWner

// Сохраняем письмо и задачу как действие

// Если контакт вставлен

// Проверяем следующие условия

  /*

  1. Account Id not null  - checked

  2. Contact Email not null - checked

  3. Account Shipping Address =='USA' - checked 

  4. Account Status == Active  - checked 

  5. Account Record Type == 'MarketingAccount' - checked

  6. AccountOwner != 'Guest' AND AccountOwner == ContactOwner AND AccountOwner = 'user in marketing profile'   - having trouble 


  */

// Если контакт обновлен

  // listen to only this event (Account Owner changed from 'Guest' to 'user in Marketing profile')

  // Check following conditions

  1. Account Id not null  - checked

  2. Contact Email is not null - checked

  3. Account Shipping Address IS IN 'USA' - checked 

   4. Account Status == Active  - checked 

   5. Account Record Type == 'MarketingAccount' = checked

  6. Account owner ! = 'Guest' AND AccountOwner == ContactOwner AND AccountOwner = 'user in marketing profile' AND (PreviousAccountOwner != Current Account OWner) AND  (PreviousAccountOwner == 'Guest' AND  CurrentAccountOwner == 'User in Marketing Profile' )  // having trouble
   public with sharing class HelperContactTrigger{

      public static List<Contact> sendEmail(List<Contact>Contacts,Map<id,Contact> oldMapContact,Map<ID,Contact> newMapContact ) {

      Id recordTypeId =  Schema.SObjectType.Account.getRecordTypeInfosByDeveloperName().get('Marketing_Account').getRecordTypeId();

     // Get Old and New Contact record 
     Contact oldContact = Trigger.oldMapContact.get(Id);
     Contact newContact = Trigger.newMapContact.get(Id);

    // Get the email template 
    EmailTemplate et = [Select Id from EmailTemplate where Name=:'Marketing: New Contact Email'];


    // Create instance of Messaging.SingleEmailMessage
    List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();   

    // Prepare a list of all contacts that should receive an email based on conditions for insert and update


    // Contact is Updated 

    for (Contact con: Contacts){

        Contact oldContact = oldMapContact.get(con.Id);
        Contact newContact = newMapContact.get(con.Id);

        if(con.AccountId != null && con.Email != null && con.Account.Dealer_Status__c == 'Active' && con.Account.ShippingCountry =='USA' && con.Account.RecordTypeId == recordTypeId && (con.Account.Owner.Name != 'Guest' && con.Owner.Name==con.Account.Owner.Name ) ) {

            //initialize messaging method
            Messaging.SingleEmailMessage singleMail = new Messaging.SingleEmailMessage();

            //set object Id
            singleMail.setTargetObjectId(con.Id);

            //set template Id
            singleMail.setTemplateId(et.Id);

            //flag to trueto insert activity history
            // Check if this is default, if yes -- remove this line

            singleMail.setSaveAsActivity(true);

            //add mail
            emails.add(singleMail);
        }    
    }

    //send mail
    Messaging.sendEmail(emails);

    return Contacts;          

 }

}


 ***************************


trigger ContactTrigger on Contact (after insert, after update) {


 if (Trigger.isAfter) {
    if (Trigger.isInsert || Trigger.IsUpdate ) {
        HelperContactTrigger.sendEmail(Trigger.New,Trigger.oldMap,Trigger.newMap);
    }
 }     

}
0
GroundToCloud 14 Янв 2020 в 20:55
Я не понимаю из вашего описания, что вы пытались сделать, чтобы удовлетворить критерию № 6, и где вы терпите неудачу/какие ошибки вы видите. Я не думаю, что этот форум предназначен для того, чтобы другие люди могли закончить ваш код за вас. Пожалуйста, сообщите
 – 
Z33dawg
14 Янв 2020 в 22:17
Я понимаю, что этот форум не предназначен для того, чтобы другие люди заканчивали код за меня, и это, конечно, не входило в мои намерения. Я четко упомянул: «Может кто-нибудь предложить, как мне удовлетворить условие № 6 в логике».
 – 
GroundToCloud
14 Янв 2020 в 22:30
Просто ищу небольшую отладку с вашей стороны. как вы думаете, что не работает и почему? Это облегчает ответ. Надеюсь, мой ответ поможет вам в пути!
 – 
Z33dawg
14 Янв 2020 в 22:40
Ваш ответ, безусловно, помог мне двигаться в правильном направлении. Спасибо!!
 – 
GroundToCloud
14 Янв 2020 в 22:54

1 ответ

Лучший ответ

Я думаю, ваша проблема в том, что в вашем контактном триггере список Trigger.New содержит только информацию о контактном поле. Вы не можете получить доступ к полям родительского объекта напрямую, вам нужно сначала запросить их.

Т. е. в вашем коде con.Account.Owner.Name вернет значение null. Вам нужно запросить Account.Owner.Name, чтобы он вернул фактическое значение, хранящееся там.

Чтобы получить доступ к значениям поля «Родительская учетная запись» для контактов в Trigger.New, вам потребуется выполнить запрос SOQL. Я бы сохранил возвращенные записи на карте или в списке, а затем использовал бы это для проверки ваших критериев в # 6.

Смотрите эти ресурсы:

https://developer.salesforce.com/forums/?id=906F00000008sxRIAQ

Требуется разъяснение по Trigger.new

Доступ к полю родительского объекта в триггере вершины

2
Z33dawg 14 Янв 2020 в 22:25