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