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