元の質問 : 商談レコードコピー時に商談チームも引き継ぎたい
複製時に元の商談オブジェクトのIdを保存するにはどうするか?
単純に元のIdというカスタムフィールドを作った場合。保存時にブランクなら自分自身を入れておく?
複製した場合には複製元がコピーされるかな?
実際にやってみたら、カスタムフィールドに値が入っていたら複製できるようです。
とすると、このフィールドがブランクの時には自分自身のIdを保存しておけばいい。
複製として作成された場合はこのフィールドがブランクでなかったら商談チームを複製する処理を走らせれば出来るかな?
結果
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トリガーにしたので使いませんでした)
- Automatically create Opportunity Team members based on Account Team using a Record Triggered Flow
- Auto Add Opportunity Team Member to Opportunity Follower
- Collaborate on Deals by Using Opportunity Teams
商談でチームを使うには、設定から有効化しないといけませんでした。