LoginSignup
1
0

More than 1 year has passed since last update.

商談レコードを複製する時に商談チームも複製する

Last updated at Posted at 2022-04-27

元の質問 : 商談レコードコピー時に商談チームも引き継ぎたい

複製時に元の商談オブジェクトのIdを保存するにはどうするか?

単純に元のIdというカスタムフィールドを作った場合。保存時にブランクなら自分自身を入れておく?
複製した場合には複製元がコピーされるかな?

実際にやってみたら、カスタムフィールドに値が入っていたら複製できるようです。
とすると、このフィールドがブランクの時には自分自身のIdを保存しておけばいい。

複製として作成された場合はこのフィールドがブランクでなかったら商談チームを複製する処理を走らせれば出来るかな?

image.png

結果

Apexトリガーを実装すればできました。
ポイントとしては Map> oppTeamMap に元々も商談のチーム情報を元々の商談のIdをキーにして作成しておきます。
Map oppMapに複製後の商談のIdと元々の商談のIdを持っておけば、この2つの変数の組み合わせで複製後の商談のIdから元々も商談のチーム情報を参照できます。
(このような使い方がフローでどうなるのかが理解できないです。そのため実際には私が管理している環境ではフローは使わないです。)

trigger cloneTeam on Opportunity (before insert,after insert) {
    
    //Save Source_Opp_Id__c
    if (Trigger.isBefore) {
        for (Opportunity opp : Trigger.new){
            if (opp.Source_Opp_Id__c == null) opp.Source_Opp_Id__c = opp.Id;
        }
    }
    
    if (Trigger.isAfter) {
        Map<Id,Id> oppMap = new Map<Id,Id>();
        Set<Id> OppIdSet = new Set<Id>();
        for (Opportunity opp : Trigger.new){
            if (opp.Id != opp.Source_Opp_Id__c) {
                OppIdSet.add(opp.Source_Opp_Id__c);
                oppMap.put(opp.Id,opp.Source_Opp_Id__c);
            }
            
        }
        
        List<OpportunityTeamMember> oppTeamList = [SELECT Id,OpportunityId,OpportunityAccessLevel, TeamMemberRole,UserId FROM OpportunityTeamMember WHERE OpportunityId =: OppIdSet Order By OpportunityId];
        system.debug(Logginglevel.INFO,'--oppTeamList------------------>>  ' + oppTeamList ); 
        String keyId = null;
        List<OpportunityTeamMember> oppTeamList2 = new List<OpportunityTeamMember>();
        Map<Id,List<OpportunityTeamMember>> oppTeamMap = new Map<Id,List<OpportunityTeamMember>>();
        
        for ( OpportunityTeamMember oppt : oppTeamList)	{
            if (keyId != oppt.OpportunityId) {
                if (keyId != null) oppTeamMap.put(keyId,oppTeamList2);
                keyId = oppt.OpportunityId;
                oppTeamList2 = new List<OpportunityTeamMember>();
                oppTeamList2.add(oppt);
            } else {
                oppTeamList2.add(oppt);
            }            
        }//end of for
        oppTeamMap.put(keyId,oppTeamList2);
        system.debug(Logginglevel.INFO,'--oppTeamMap------------------>>  ' + oppTeamMap ); 
        
        List<OpportunityTeamMember> InsertOppTeamList = new List<OpportunityTeamMember>();
        for (Opportunity opp : Trigger.new){
            Id oppId = (Id)oppMap.get(opp.Id);
            if (oppId != null) {
                List<OpportunityTeamMember> OppList = (List<OpportunityTeamMember>)oppTeamMap.get(oppId);
                if (OppList != null) {
                    for (OpportunityTeamMember oppt : OppList){
                        OpportunityTeamMember opptN = new OpportunityTeamMember();
                        opptN.OpportunityId = opp.Id;
                        opptN.OpportunityAccessLevel = oppt.OpportunityAccessLevel;
                        opptN.TeamMemberRole = oppt.TeamMemberRole;
                        opptN.UserId = oppt.UserId;
                        InsertOppTeamList.add(opptN);
                    }
                }//end of if
            }
        }//end of for
        system.debug(Logginglevel.INFO,'-- 1 !!------------------>>  ' ); 
        if (InsertOppTeamList.size() > 0 ) insert InsertOppTeamList;
        system.debug(Logginglevel.INFO,'-- 2 !!------------------>>  ' ); 
    }

}

集めた参考になりそうな記事(でもApexトリガーにしたので使いませんでした)

商談でチームを使うには、設定から有効化しないといけませんでした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0