You need to sign in to do that
Don't have an account?
S Sai
Automatically assign contact roles to opportunities
AFTER LEAD CONVERT IN OPPORTUNITY RECORD CREATE TWO CONACT ROLE RECORDS USING THIS TRIGGER.
I WANT TO CREATE ONLY ONE RECORD .
trigger CreateContactRole on Opportunity (after insert, after update) {
//get the id of all involved accounts
Set<ID> accountIds = new Set<ID>();
for(Opportunity opt:Trigger.New){
accountIds.add(opt.AccountId);
}
//get all contacts for those accounts
list<Contact> contacts = new list<Contact>();
contacts = [select id, AccountId from Contact where AccountId in: accountIds order by createddate Limit 5000];
//organize these contacts by account
Map<Id,List<Contact>> contactsByAccount = new Map<ID,List<Contact>>();
for(Contact c:contacts){
if(contactsByAccount.get(c.AccountId) == null){
contactsByAccount.put(c.AccountId,new List<Contact>());
}
contactsByAccount.get(c.AccountId).add(c);
}
// check to see if the Opportunity already has a contact role. If it does, add to a set of Ids to exclude
List<OpportunityContactRole> existingOCR = new List<OpportunityContactRole>();
Set<Id> existingOCRIds = new Set<Id>();
existingOCR = [select OpportunityId from OpportunityContactRole where OpportunityId in:Trigger.newMap.keySet() limit 5000];
for(OpportunityContactRole ocr:existingOCR) if(!existingOCRIds.contains(ocr.OpportunityId)) existingOCRIds.add(ocr.OpportunityId);
//create the OpportunityContactRole objects
list<OpportunityContactRole> lstOCR = new list<OpportunityContactRole>();
for(Opportunity opt:Trigger.New){
if(!existingOCRIds.contains(opt.Id) && contactsByAccount.get(opt.AccountId) != null){
Boolean firstContact = true;
for(Contact c: contactsByAccount.get(opt.AccountId)){
OpportunityContactRole ocr = new OpportunityContactRole(OpportunityId=opt.id, ContactId=c.id);
if(firstContact) {
ocr.IsPrimary = FALSE;
firstContact = FALSE;
}
lstOCR.add(ocr);
}
}
}
insert lstOCR;
}
THANKS IN ADVANCED
I WANT TO CREATE ONLY ONE RECORD .
trigger CreateContactRole on Opportunity (after insert, after update) {
//get the id of all involved accounts
Set<ID> accountIds = new Set<ID>();
for(Opportunity opt:Trigger.New){
accountIds.add(opt.AccountId);
}
//get all contacts for those accounts
list<Contact> contacts = new list<Contact>();
contacts = [select id, AccountId from Contact where AccountId in: accountIds order by createddate Limit 5000];
//organize these contacts by account
Map<Id,List<Contact>> contactsByAccount = new Map<ID,List<Contact>>();
for(Contact c:contacts){
if(contactsByAccount.get(c.AccountId) == null){
contactsByAccount.put(c.AccountId,new List<Contact>());
}
contactsByAccount.get(c.AccountId).add(c);
}
// check to see if the Opportunity already has a contact role. If it does, add to a set of Ids to exclude
List<OpportunityContactRole> existingOCR = new List<OpportunityContactRole>();
Set<Id> existingOCRIds = new Set<Id>();
existingOCR = [select OpportunityId from OpportunityContactRole where OpportunityId in:Trigger.newMap.keySet() limit 5000];
for(OpportunityContactRole ocr:existingOCR) if(!existingOCRIds.contains(ocr.OpportunityId)) existingOCRIds.add(ocr.OpportunityId);
//create the OpportunityContactRole objects
list<OpportunityContactRole> lstOCR = new list<OpportunityContactRole>();
for(Opportunity opt:Trigger.New){
if(!existingOCRIds.contains(opt.Id) && contactsByAccount.get(opt.AccountId) != null){
Boolean firstContact = true;
for(Contact c: contactsByAccount.get(opt.AccountId)){
OpportunityContactRole ocr = new OpportunityContactRole(OpportunityId=opt.id, ContactId=c.id);
if(firstContact) {
ocr.IsPrimary = FALSE;
firstContact = FALSE;
}
lstOCR.add(ocr);
}
}
}
insert lstOCR;
}
THANKS IN ADVANCED
Hi,
As an immediate solution I would recommend you run the trigger only for after update and remove the after insert scenario. Please test after that and confirm if now only 1 record in created instead of 2. If Yes, then look for workflows/process builders/triggers that maybe firing on Opportunity insert and updating it in the backend.
If you need to use both insert and update then use a static boolean variable to handle that the trigger only fires for insert and not updates.
public class P {
public static boolean firstRun = true;
}
trigger T1 on Account (after insert, after update) {
if(Trigger.isInsert){
if(Trigger.isUpdate){
if(p.firstRun){
// your functionality here
p.firstRun=false;
}
}
}
}
Thanks
Vivian
Hi,
Did you try the 1st approach I suggested?
I would recommend you run the trigger only for after update and remove the after insert scenario. Does this scenario create 2 records?
Thanks
Vivian