/**
|
* 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;
|
}
|
|
}
|