张宇恒
2022-12-23 ec47f5ab5923a315bf22e0df5af7371e9668589e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
 * Contactから CampaignMemberを登録する時、同時にリードを登録する。
 * 登録したリードを更に CampaignMemberに登録する。
 */
trigger CampaignMemberTrigger on CampaignMember (before insert) {
 
    // 登録された CampaignMemberの Contactが埋まっていたら、Contactから登録されたと判断し、
    // リードを作成する
    // 割り当てルールは動かさなくて、Contactの所有者をリードの所有者とする
    
    // リードのトリガーを動かないようにする
    StaticParameter.EscapeLeadTrigger = true;
    
    // リードのレコードタイプの取得
    RecordType stardardLead = [SELECT Id FROM RecordType WHERE SobjectType = 'Lead' AND IsActive = true AND DeveloperName = 'Standard'];
    
    // 処理のターゲットとなる CampaignMemberを格納
    // insertされた CampaignMemberのうち、Contactに値がはいっているものだけを対象とする
    List<CampaignMember> targetMember = new List<CampaignMember>();
    
    // ターゲットとなる CampaignMemberが参照している Contactの Idを格納、Contact一覧の selectに使用する
    List<Id> contactIds = new List<Id>();
    // ターゲットとなる CampaignMemberが参照している Campaignの Idを格納、Campaign一覧の selectに使用する
    List<Id> campaignIds = new List<Id>();
    
    // 作成するリードのリスト、最後の insertで使用する
    List<Lead> insertLeadList = new List<Lead>();
 
    // 作成する CampaignMemberのリスト、最後の insertで使用する
    List<CampaignMember> insertCampaignMemberList = new List<CampaignMember>();
    
    // ループの中で仕様する Sオブジェクト型変数
    Contact localContact = null;
    Campaign localCampaign = null;
    Lead localLead = null;
    CampaignMember localCampaignMember = null;
    
    // リードの割り当てルールが効くようにオプションを設定する
    // このオプションがないと、リードの割り当てルールが動かない
    //Database.DMLOptions dmo = new Database.DMLOptions();
    //dmo.assignmentRuleHeader.useDefaultRule= true;
    
    // CampaignMemberのループ
    // ターゲットとなる CampaignMemberのみを抽出
    for ( CampaignMember local : Trigger.New) {
        // contactに値が入っているか検査
System.debug( '-----:local.Sales_lead__c=' + local.Sales_lead__c + ', local.ContactId=' + local.ContactId);
        if ( local.ContactId != null && local.Sales_lead__c == '创建购买意向') {
            // 入っている、Contactから作られた CampaignMemberだ!
            targetMember.add( local);
            contactIds.add( local.ContactId);
            campaignIds.add( local.CampaignId);
            local.CalculationExcludes__c = true;
        }
    }
    
    // 医療従事者を selectしておく
    Map<Id, Contact> contactMap = new Map<Id, Contact>( [SELECT Id, LastName, FirstName, State__c, AccountId, Account.Name, Account.Department_Class__c,Phone, Email, Account.OwnerId FROM Contact WHERE Id IN :contactIds]);
System.debug( '-----:' + contactMap);
    
    // Campaignを selectしておく
    // CampaignMemberには キャンペーンIdしかなくて、キャンペーン名が取れないから
    Map<Id, Campaign> campaignMap = new Map<Id, Campaign>( [SELECT Id, Name FROM Campaign WHERE Id IN :campaignIds]);
System.debug( '-----:' + campaignMap);
    
    // LeadListを組み立てる
    for ( CampaignMember local : targetMember) {
        // コピー元となる医療従事者の情報を Mapからゲットしておく
        localContact = contactMap.get( local.ContactId);
        localCampaign = campaignMap.get( local.CampaignId);
        
        // リードの組み立て
        localLead = new Lead();
        localLead.RecordTypeId = stardardLead.Id;
        localLead.Contact__c = localContact.Id;
        localLead.LastName = localContact.LastName;
        localLead.FirstName = localContact.FirstName;
        localLead.Phone = localContact.Phone;
        localLead.Email = localContact.Email;
        localLead.Campaign__c = local.CampaignId;
        localLead.Hospital_Name__c = localContact.AccountId;
        localLead.Department_Class__c = localContact.Account.Department_Class__c;
        localLead.Company = localContact.Account.Name;
        localLead.Account_State__c = localContact.State__c;
        //localLead.Account_Salesdepartment__c = localContact.Salesdepartment__c;
        localLead.Account_for_search__c = localContact.Account.Name;
//        localLead.CalculationExcludes__c = true; リードにフラグの持つのは
        localLead.urgent__c = local.urgent__c;
        localLead.Opportunity_Division__c = local.Opportunity_Division__c;
        localLead.Request__c = local.Request__c;
        localLead.Request_Detail__c = local.Request_Detail__c;
        localLead.Product_Model__c = local.Product_Model__c;
        localLead.Purchase_Plan__c = local.Purchase_Plan__c;
        localLead.OwnerId = localContact.Account.OwnerId;
        localLead.SendMailToOwner__c = true;
        
System.debug( '-----:' + localLead);
        // オプションをセット、これがないとリードの割り当てルールが動かない
        //localLead.setOptions(dmo);
        // Listに入れておく
        insertLeadList.add( localLead);
    }
    
    // リードの作成処理
    if ( insertLeadList != null && insertLeadList.size() > 0) {
        insert insertLeadList;
    }
    
    
    // CampaigMemberを組み立てる
    for ( Lead lead : insertLeadList) {
        // CampaignMemberの組み立て
        localCampaignMember = new CampaignMember();
        localCampaignMember.CampaignId = lead.Campaign__c;
        localCampaignMember.LeadId = lead.id;
        localCampaignMember.status = '已参加';
        // Listに入れておく
        insertCampaignMemberList.add( localCampaignMember);
    }
    
    // CampaignMemberの作成処理
    if ( insertCampaignMemberList != null && insertCampaignMemberList.size() > 0) {
        insert insertCampaignMemberList;
    }
    
}