function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
astraeaastraea 

Can I update Campaign Member Status with Apex ?

Hi all,

 

I'm trying to update campaign member status with Apex.

 

I created Visualforce page.

In save() method, I tried to update campaign member status.

 

Here is my code.

 

//current value CampaignMemberStatus oldDefault = [select Id from CampaignMemberStatus where CampaignId = :currentId and isDefault = true LIMIT 1]; CampaignMemberStatus oldRespond = [select Id from CampaignMemberStatus where CampaignId = :currentId and HasResponded = true LIMIT 1]; //update label (It's a default) CampaignMemberStatus oldstatus = new CampaignMemberStatus( Id = oldDefault.Id, Label = 'entry'); update oldstatus; //change sortorder (It's hasResponded) CampaignMemberStatus oldorder = new CampaignMemberStatus( Id = oldRespond.Id, SortOrder = 3); update oldorder; //add attend CampaignMemberStatus newstatus = new CampaignMemberStatus( CampaignId = currentId, Label = 'attend', SortOrder = 2, isDefault = false, HasResponded = false); insert newstatus;

 

I can change SortOrder and insert attend(not default and not hasresponded value).

But I can't update the default's label.

 

Is it impossible?

How can I do?

 

Any solution to this problem is greatly appreciated.

 

astraea

um-dontaskmeum-dontaskme

Not sure if it would directly solve your issue, but I created an Apex trigger in our system that completely deletes all Campaign Member Status values from a Campaign and then rebuilds the values with our approved list.  It runs whenever a Campaign is created or cloned, so all new Campaigns have the same set of approved status values. 

 

It also has some additional statements at the beginning that change whether a status counts as a response based on what type of Campaign it was.  Those need to run when the Campaign is updated and the Lead Source field changes.  For example, we have an Unable to Reach status.  For a direct mail Campaign, this is still a response, because they responded to the Campaign and we just weren't able to follow up on the phone.  For outbound telemarketing, it's not a response, because we never connected with them.  So, basically the code looks more complex than it needs to because of our customizations.  If you can get past them, the later part of the code wipes out the defaults statuses and rebuilds.

 

 

trigger SetCampaignMemberStatus on Campaign (after insert, after update)
{
    List <CampaignMemberStatus> DefaultStatuses = new List<CampaignMemberStatus>();
    List <CampaignMemberStatus> OtherStatuses = new List<CampaignMemberStatus>();
    List <CampaignMemberStatus> NewStatuses = new List<CampaignMemberStatus>();
    List <ID> Telemarketing = new List<ID>();
    List <ID> NonTelemarketing = new List<ID>();

    if (Trigger.isUpdate)
    {

    Telemarketing.clear();
    NonTelemarketing.clear();
    
        //Sort Campaigns moving to Telemarketing and those moving out of Telemarketing - ignore all others
        for ( Integer i = 0 ; i < Trigger.new.size() ; i++ )
        {
            if ((Trigger.new[i].Lead_Source__c == 'Telemarketing') &&
                (Trigger.old[i].Lead_Source__c != 'Telemarketing'))
            {
                Telemarketing.add(Trigger.new[i].id);
            }
            else if ((Trigger.new[i].Lead_Source__c != 'Telemarketing') &&
                (Trigger.old[i].Lead_Source__c == 'Telemarketing'))
            {
                NonTelemarketing.add(Trigger.new[i].id);
            }
        }

        //Collect all the CampaignMemberStatus records related to these Campaigns that might change value
        If (Telemarketing.isEmpty() == false || NonTelemarketing.isEmpty() == false) {
        
        List <CampaignMemberStatus> NonResponses = [SELECT id, CampaignID, HasResponded, IsDefault, Label, SortOrder
                                        FROM CampaignMemberStatus
                                        WHERE CampaignID in :Telemarketing AND (Label = 'Unable to Reach' OR
                                                Label = 'Calling In Progress' OR Label = 'Do Not Pursue')];

        List <CampaignMemberStatus> Responses = [SELECT id, CampaignID, HasResponded, IsDefault, Label, SortOrder
                                        FROM CampaignMemberStatus
                                        WHERE CampaignID in :NonTelemarketing AND (Label = 'Unable to Reach' OR
                                                Label = 'Calling In Progress' OR Label = 'Do Not Pursue')];

        for (CampaignMemberStatus ncms : NonResponses)
        {
            ncms.HasResponded = false;
        }

        update(NonResponses);

        for (CampaignMemberStatus rcms : Responses)
        {
            rcms.HasResponded = true;
        }

        update(Responses);
    }

    }
    else if (Trigger.IsInsert)
    {
        // Start by gathering any existing Campaign Member Status values and clearing them

        //Collect all the CampaignMemberStatus records related to these Campaigns, separating the defaults
        for (CampaignMemberStatus cms: [SELECT id, CampaignID, HasResponded, IsDefault, Label, SortOrder
                                        FROM CampaignMemberStatus
                                        WHERE CampaignID in :Trigger.new])
        {
            if (cms.IsDefault == true)
            {
                DefaultStatuses.add(cms);
            }
            else
            {
                OtherStatuses.add(cms);
            }
        }

        //Must remove the default tag before deleting
        for (CampaignMemberStatus dcms : DefaultStatuses)
        {
            dcms.IsDefault = false;
        }

        update(DefaultStatuses);
        delete(DefaultStatuses);
        delete(OtherStatuses);


        //Starting with a clean slate - set new values - some values are different if the Campaign is Telemarketing
        for (Campaign c :Trigger.new)
        {
            if (c.Lead_Source__c != 'Telemarketing')
            {
                CampaignMemberStatus c3 = new CampaignMemberStatus(CampaignID = c.id,
                                                                   Label = 'Calling In Progress',
                                                                   IsDefault = false,
                                                                   HasResponded = true,
                                                                   SortOrder = 3);
                NewStatuses.add(c3);

                CampaignMemberStatus c4 = new CampaignMemberStatus(CampaignID = c.id,
                                                                   Label = 'Unable to Reach',
                                                                   IsDefault = false,
                                                                   HasResponded = true,
                                                                   SortOrder = 4);
                NewStatuses.add(c4);

                CampaignMemberStatus c6 = new CampaignMemberStatus(CampaignID = c.id,
                                                                   Label = 'Do Not Pursue',
                                                                   IsDefault = false,
                                                                   HasResponded = true,
                                                                   SortOrder = 6);
                NewStatuses.add(c6);
            }
            else if (c.Lead_Source__c == 'Telemarketing')
            {
                CampaignMemberStatus c3 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Calling In Progress',
                                                                   IsDefault = false, HasResponded = false,
                                                                   SortOrder = 3);
                NewStatuses.add(c3);

                CampaignMemberStatus c4 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Unable to Reach',
                                                                   IsDefault = false, HasResponded = false,
                                                                   SortOrder = 4);
                NewStatuses.add(c4);

                CampaignMemberStatus c6 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Do Not Pursue',
                                                                   IsDefault = false, HasResponded = false,
                                                                   SortOrder = 6);
                NewStatuses.add(c6);

            }

            CampaignMemberStatus c1 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Sent/Targeted',
                                                               IsDefault = true, HasResponded = false,
                                                               SortOrder = 1);
            NewStatuses.add(c1);

            CampaignMemberStatus c2 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Responded/Contacted',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 2);
            NewStatuses.add(c2);

            CampaignMemberStatus c5 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Not Interested',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 5);
            NewStatuses.add(c5);

            CampaignMemberStatus c7 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Bad Contact Data',
                                                               IsDefault = false, HasResponded = false,
                                                               SortOrder = 7);
            NewStatuses.add(c7);

            CampaignMemberStatus c8 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Registered',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 8);
            NewStatuses.add(c8);

            CampaignMemberStatus c9 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Attended',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 9);
            NewStatuses.add(c9);

            CampaignMemberStatus c10 = new CampaignMemberStatus(CampaignID = c.id, Label = 'No Show',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 10);
            NewStatuses.add(c10);

            CampaignMemberStatus c12 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Qualified',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 12);
            NewStatuses.add(c12);

            CampaignMemberStatus c11 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Event Cancelled',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 11);
            NewStatuses.add(c11);

            CampaignMemberStatus c13 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Already Owns or Opportunity',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 13);
            NewStatuses.add(c13);

            CampaignMemberStatus c14 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Nurturing',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 14);
            NewStatuses.add(c14);

            CampaignMemberStatus c15 = new CampaignMemberStatus(CampaignID = c.id, Label = 'Referred Elsewhere',
                                                               IsDefault = false, HasResponded = true,
                                                               SortOrder = 15);
            NewStatuses.add(c15);
        }

        insert(NewStatuses);
    }
}

 

 

 

We also have a basic test class for this, but note that it refers to a constant class that we maintain to simplify future updates.

 

 

@isTest
private class TestSetCampaignMemberStatus
{
    static testMethod void TestSetCampaignMemberStatus()
    {
        Campaign testCampaign;
        Campaign testCampaign2;
        Campaign testCampaign3;
        CampaignMemberStatus assertCMS;
        CampaignMemberStatus assertCMS2;
        CampaignMemberStatus assertCMS3;
        CampaignMemberStatus assertCMS4;
        CampaignMemberStatus assertCMS5;
        List<Campaign> campaignList;

        //Create test global budget and marketing budget - inserting does not trigger the code

        Global_Marketing_Budget__c glbudget = new Global_Marketing_Budget__c(name = 'Test Global Budget',
                                                                             Quarter_Start_Date__c = System.today(),
                                                                             Official_Global_Program_Budget__c = 4000000);
        insert glbudget;

        Marketing_Budget__c budget = new Marketing_Budget__c(name = 'Test Budget',
                                                             CurrencyISOCode = 'USD',
                                                             Global_Marketing_Budget__c = glbudget.id,
                                                             MQL_Goal__c = 0,
                                                             QSP_Goal__c = 0,
                                                             Accounting_Unit__c = '12345',
                                                             Quarter_Budget__c = 100000,
                                                             Budget_Allocation__c = 'Healthcare',
                                                             Quarter_Start_Date__c = System.today());
        insert budget;


        testCampaign = new Campaign ( name = 'Test Campaign1',
                                      Program_Budget__c = 10000,
                                      StartDate = System.today(),
                                      EndDate = System.today(),
                                      Target_Date__c = System.today(),
                                      Lead_Source__c = LwsnConst.CAMP_LEAD_SRC_DIRECT_MAIL_STR,
                                      Program__c = 'Miscellaneous',
                                      Initiative__c = LwsnConst.CAMP_INIT_HC_STR,
                                      Marketing_Budget__c = budget.id);
        insert testCampaign;
        
        testCampaign2 = new Campaign ( name = 'Test Campaign1',
                                      Program_Budget__c = 10000,
                                      StartDate = System.today(),
                                      EndDate = System.today(),
                                      Target_Date__c = System.today(),
                                      Lead_Source__c = LwsnConst.CAMP_LEAD_SRC_TELEMRKT_STR,
                                      Program__c = 'Miscellaneous',
                                      Initiative__c = LwsnConst.CAMP_INIT_HC_STR,
                                      Marketing_Budget__c = budget.id);
        insert testCampaign2;

        campaignList = new List<Campaign>();
        campaignList.Add(testCampaign);
        campaignList.Add(testCampaign2);
        
        //Test that the Campaign Member Status values are correct
        assertCMS = [ select Id, Label, HasResponded, CampaignId from CampaignMemberStatus where CampaignId = :testCampaign.id AND Label = 'Unable to Reach'];
        System.assert(assertCMS.HasResponded == true);

        assertCMS4 = [ select Id, Label, HasResponded, CampaignId from CampaignMemberStatus where CampaignId = :testCampaign2.id AND Label = 'Unable to Reach'];
        System.assert(assertCMS4.HasResponded == false);
                
        //Update the test Campaign to new values
        testCampaign.Lead_Source__c = LwsnConst.CAMP_LEAD_SRC_TELEMRKT_STR;
        testCampaign2.Lead_Source__c = LwsnConst.CAMP_LEAD_SRC_DIRECT_MAIL_STR;
        Update campaignList;
        
        //Test that the Campaign Member Status values are correct
        assertCMS2 = [ select Id, Label, HasResponded, CampaignId from CampaignMemberStatus where CampaignId = :testCampaign.id AND Label = 'Unable to Reach'];
        System.assert(assertCMS2.HasResponded == false);

        assertCMS5 = [ select Id, Label, HasResponded, CampaignId from CampaignMemberStatus where CampaignId = :testCampaign2.id AND Label = 'Unable to Reach'];
        System.assert(assertCMS5.HasResponded == true);
        
        testCampaign3 = new Campaign ( name = 'Test Campaign2',
                                      Program_Budget__c = 10000,
                                      StartDate = System.today(),
                                      EndDate = System.today(),
                                      Target_Date__c = System.today(),
                                      Lead_Source__c = LwsnConst.CAMP_LEAD_SRC_TELEMRKT_STR,
                                      Program__c = 'Miscellaneous',
                                      Initiative__c = LwsnConst.CAMP_INIT_HC_STR,
                                      Marketing_Budget__c = budget.id);
        insert testCampaign3;

        //Test that the Campaign Member Status values are correct
        assertCMS3 = [ select Id, Label, HasResponded, CampaignId from CampaignMemberStatus where CampaignId = :testCampaign3.id AND Label = 'Unable to Reach'];
        System.assert(assertCMS3.HasResponded == false);        
   }
}