-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
2Questions
-
2Replies
Apex Trigger and Pardot Issue
Hi Everyone,
My company is using Sales Force and Pardot integration. We have the connector setup. According to Pardot, in sync between Pardot and Sales Force, Sales Force wins. If owner of the lead is James in Sales Force It should be James in Pardot. This is not the case with a apex trigger.
I wrote this lead trigger which assigns the ownership of a lead to current user if status is left msg,follow up . ..etc. As soon as i activate the trigger, connector users assigns the ownership to himself. This is automated. Connector user is a fake user. Even prospect is not in the pardot, it creates the prospect and assigns to Connector user and updates the lead owner with connector user. It almost feels like, there is a glitch. I tried workflow and process builder to function as my apex trigger but returned same error. I am very new to apex development. Please take a look at my code. Maybe i am missing something. Thank you very much.
My company is using Sales Force and Pardot integration. We have the connector setup. According to Pardot, in sync between Pardot and Sales Force, Sales Force wins. If owner of the lead is James in Sales Force It should be James in Pardot. This is not the case with a apex trigger.
I wrote this lead trigger which assigns the ownership of a lead to current user if status is left msg,follow up . ..etc. As soon as i activate the trigger, connector users assigns the ownership to himself. This is automated. Connector user is a fake user. Even prospect is not in the pardot, it creates the prospect and assigns to Connector user and updates the lead owner with connector user. It almost feels like, there is a glitch. I tried workflow and process builder to function as my apex trigger but returned same error. I am very new to apex development. Please take a look at my code. Maybe i am missing something. Thank you very much.
trigger trickOnLead on Lead (before insert, before update) { for (Lead ld : Trigger.new) { if(ld.IsRealOwner__c == True && ld.Status == 'Left Message' && UserInfo.getUserId() !='005U0000005Q12t' ) { ld.ownerid = UserInfo.getUserId(); } else if (ld.IsRealOwner__c = True && ld.Status == 'App Sent' && UserInfo.getUserId() !='005U0000005Q12t') { ld.ownerid = UserInfo.getUserId(); } else if (ld.IsRealOwner__c = True && ld.Status == 'Follow Up' && UserInfo.getUserId() !='005U0000005Q12t') { ld.ownerid = UserInfo.getUserId(); } else if (ld.IsRealOwner__c = True && ld.Status == 'App Received' && UserInfo.getUserId() !='005U0000005Q12t') { ld.ownerid = UserInfo.getUserId(); } } }
- Burak Yurttas 7
- July 28, 2016
- Like
- 0
- Continue reading or reply
Test Apex Class fails due to code coverage
Hi All,
I am very new to Force.com and Sales Force Apex classes. I found this article online which adds a next button to leads and cases. I was able to get it to work on Sandbox but failed to migrate it to production. Deployment fails due to code coverage. It only covers 66 percent. i can not find any solution for this. Any help would be appreciated.
Here is the article:
https://developer.salesforce.com/page/The_Get_Next_Button
Here is code:
I am very new to Force.com and Sales Force Apex classes. I found this article online which adds a next button to leads and cases. I was able to get it to work on Sandbox but failed to migrate it to production. Deployment fails due to code coverage. It only covers 66 percent. i can not find any solution for this. Any help would be appreciated.
Here is the article:
https://developer.salesforce.com/page/The_Get_Next_Button
Here is code:
@isTest(SeeAllData=true) private class TestNextButton { static Id retrieveNextCase(String userId) { //Really we're only specifying the user ID for the sake of the test methods if (userId=='') { //Use the currently running user userId = UserInfo.getUserId(); } //First find out which queues this user is a member of List<Id> listGroupIds = getQueuesForUser(userId); if(listGroupIds.size()>0) { //Find an open case that is assigned to one of those queues Case caseObj = [select c.Id,c.OwnerId from Case c where c.IsClosed=false and c.OwnerId in :listGroupIds limit 1 for update]; if (caseObj!=null) { //If we found one, assign it to the current user caseObj.OwnerId = userId; update caseObj; return caseObj.Id; } } return null; } static Id retrieveNextLead(String userId) { //Really we're only specifying the user ID for the sake of the test methods if (userId=='') { //Use the currently running user userId = UserInfo.getUserId(); } //First find out which queues this user is a member of List<Id> listGroupIds = getQueuesForUser(userId); if(listGroupIds.size()>0) { //Find an open lead that is assigned to one of those queues List<Lead> leads = [select l.Id,l.OwnerId from Lead l where l.IsConverted=false and l.OwnerId in :listGroupIds limit 1 for update]; if (leads.size()>0) { //If we found one, assign it to the current user leads[0].OwnerId = userId; update leads; return leads[0].Id; } } return null; } //Returns a list of ids of queues that this user is a member of public static List<Id> getQueuesForUser(String userId) { List<Id> listGroupIds = new List<Id>(); List<GroupMember> listGroupMembers = [Select g.GroupId From GroupMember g where g.Group.Type='Queue' and g.UserOrGroupId=:userId]; if (listGroupMembers!=null && listGroupMembers.size()>0) { for (GroupMember gm:listGroupMembers) { listGroupIds.add(gm.GroupId); } } return listGroupIds; } public static Group createTestGroup() { Group g = new Group(Type='Queue',Name='testRetrieveNextCase'); insert g; //Make this queue assignable to leads and cases List<QueueSobject> qs = new List<QueueSobject>(); qs.add(new QueueSobject(QueueId=g.Id,SObjectType='Case')); qs.add(new QueueSobject(QueueId=g.Id,SObjectType='Lead')); insert qs; return g; } static User createTestUser() { User user = new User(); user.Username = 'test'+System.currentTimeMillis()+'@RetrieveNextUtils.com'; user.LastName = 'LastTestName'; user.Email = 'test@RetrieveNextUtils.com'; user.alias = 'testAl'; user.TimeZoneSidKey = 'America/New_York'; user.LocaleSidKey = 'en_US'; user.EmailEncodingKey = 'ISO-8859-1'; user.ProfileId = [select id from Profile where Name='System Administrator'].Id; user.LanguageLocaleKey = 'en_US'; insert user; //setUser(user); return user; } public static testMethod void testRetrieveNextLead() { User u = createTestUser(); Group g = createTestGroup(); GroupMember gm = new GroupMember(UserOrGroupId=u.Id,GroupId=g.Id); insert gm; Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { Lead l = new Lead(LastName='Test',OwnerId=g.Id,Company='Test'); insert l; Id leadId = retrieveNextLead(u.Id); System.assertEquals(leadId,l.Id); Lead ownedLead = [select OwnerId from Lead where Id=:l.Id]; System.assertEquals(ownedLead.OwnerId,u.Id); } } public static testMethod void testNegativeRetrieveNextLead() { User u = createTestUser(); Group g = createTestGroup(); Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { //Do not insert this user in the queue -- he should not get the case Lead l = new Lead(LastName='Test',OwnerId=g.Id,Company='Test'); insert l; Id leadId = retrieveNextLead(u.Id); System.assertEquals(leadId,null); Lead ownedLead = [select OwnerId from Lead where Id=:l.Id]; System.assertNotEquals(ownedLead.OwnerId,u.Id); } } public static testMethod void testRetrieveNextCase() { User u = createTestUser(); Group g = createTestGroup(); GroupMember gm = new GroupMember(UserOrGroupId=u.Id,GroupId=g.Id); insert gm; Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { Case c = new Case(Subject='Test',OwnerId=g.Id); insert c; Id caseId = retrieveNextCase(u.Id); System.assertEquals(caseId,c.Id); Case ownedCase = [select OwnerId from Case where Id=:c.Id]; System.assertEquals(ownedCase.OwnerId,u.Id); } } public static testMethod void testNegativeRetrieveNextCase() { User u = createTestUser(); Group g = createTestGroup(); Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { //Do not insert this user in the queue -- he should not get the case Case c = new Case(Subject='Test',OwnerId=g.Id); insert c; Id caseId = retrieveNextCase(u.Id); System.assertEquals(caseId,null); Case ownedCase = [select OwnerId from Case where Id=:c.Id]; System.assertNotEquals(ownedCase.OwnerId,u.Id); } } }
- Burak Yurttas 7
- July 27, 2016
- Like
- 0
- Continue reading or reply
Test Apex Class fails due to code coverage
Hi All,
I am very new to Force.com and Sales Force Apex classes. I found this article online which adds a next button to leads and cases. I was able to get it to work on Sandbox but failed to migrate it to production. Deployment fails due to code coverage. It only covers 66 percent. i can not find any solution for this. Any help would be appreciated.
Here is the article:
https://developer.salesforce.com/page/The_Get_Next_Button
Here is code:
I am very new to Force.com and Sales Force Apex classes. I found this article online which adds a next button to leads and cases. I was able to get it to work on Sandbox but failed to migrate it to production. Deployment fails due to code coverage. It only covers 66 percent. i can not find any solution for this. Any help would be appreciated.
Here is the article:
https://developer.salesforce.com/page/The_Get_Next_Button
Here is code:
@isTest(SeeAllData=true) private class TestNextButton { static Id retrieveNextCase(String userId) { //Really we're only specifying the user ID for the sake of the test methods if (userId=='') { //Use the currently running user userId = UserInfo.getUserId(); } //First find out which queues this user is a member of List<Id> listGroupIds = getQueuesForUser(userId); if(listGroupIds.size()>0) { //Find an open case that is assigned to one of those queues Case caseObj = [select c.Id,c.OwnerId from Case c where c.IsClosed=false and c.OwnerId in :listGroupIds limit 1 for update]; if (caseObj!=null) { //If we found one, assign it to the current user caseObj.OwnerId = userId; update caseObj; return caseObj.Id; } } return null; } static Id retrieveNextLead(String userId) { //Really we're only specifying the user ID for the sake of the test methods if (userId=='') { //Use the currently running user userId = UserInfo.getUserId(); } //First find out which queues this user is a member of List<Id> listGroupIds = getQueuesForUser(userId); if(listGroupIds.size()>0) { //Find an open lead that is assigned to one of those queues List<Lead> leads = [select l.Id,l.OwnerId from Lead l where l.IsConverted=false and l.OwnerId in :listGroupIds limit 1 for update]; if (leads.size()>0) { //If we found one, assign it to the current user leads[0].OwnerId = userId; update leads; return leads[0].Id; } } return null; } //Returns a list of ids of queues that this user is a member of public static List<Id> getQueuesForUser(String userId) { List<Id> listGroupIds = new List<Id>(); List<GroupMember> listGroupMembers = [Select g.GroupId From GroupMember g where g.Group.Type='Queue' and g.UserOrGroupId=:userId]; if (listGroupMembers!=null && listGroupMembers.size()>0) { for (GroupMember gm:listGroupMembers) { listGroupIds.add(gm.GroupId); } } return listGroupIds; } public static Group createTestGroup() { Group g = new Group(Type='Queue',Name='testRetrieveNextCase'); insert g; //Make this queue assignable to leads and cases List<QueueSobject> qs = new List<QueueSobject>(); qs.add(new QueueSobject(QueueId=g.Id,SObjectType='Case')); qs.add(new QueueSobject(QueueId=g.Id,SObjectType='Lead')); insert qs; return g; } static User createTestUser() { User user = new User(); user.Username = 'test'+System.currentTimeMillis()+'@RetrieveNextUtils.com'; user.LastName = 'LastTestName'; user.Email = 'test@RetrieveNextUtils.com'; user.alias = 'testAl'; user.TimeZoneSidKey = 'America/New_York'; user.LocaleSidKey = 'en_US'; user.EmailEncodingKey = 'ISO-8859-1'; user.ProfileId = [select id from Profile where Name='System Administrator'].Id; user.LanguageLocaleKey = 'en_US'; insert user; //setUser(user); return user; } public static testMethod void testRetrieveNextLead() { User u = createTestUser(); Group g = createTestGroup(); GroupMember gm = new GroupMember(UserOrGroupId=u.Id,GroupId=g.Id); insert gm; Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { Lead l = new Lead(LastName='Test',OwnerId=g.Id,Company='Test'); insert l; Id leadId = retrieveNextLead(u.Id); System.assertEquals(leadId,l.Id); Lead ownedLead = [select OwnerId from Lead where Id=:l.Id]; System.assertEquals(ownedLead.OwnerId,u.Id); } } public static testMethod void testNegativeRetrieveNextLead() { User u = createTestUser(); Group g = createTestGroup(); Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { //Do not insert this user in the queue -- he should not get the case Lead l = new Lead(LastName='Test',OwnerId=g.Id,Company='Test'); insert l; Id leadId = retrieveNextLead(u.Id); System.assertEquals(leadId,null); Lead ownedLead = [select OwnerId from Lead where Id=:l.Id]; System.assertNotEquals(ownedLead.OwnerId,u.Id); } } public static testMethod void testRetrieveNextCase() { User u = createTestUser(); Group g = createTestGroup(); GroupMember gm = new GroupMember(UserOrGroupId=u.Id,GroupId=g.Id); insert gm; Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { Case c = new Case(Subject='Test',OwnerId=g.Id); insert c; Id caseId = retrieveNextCase(u.Id); System.assertEquals(caseId,c.Id); Case ownedCase = [select OwnerId from Case where Id=:c.Id]; System.assertEquals(ownedCase.OwnerId,u.Id); } } public static testMethod void testNegativeRetrieveNextCase() { User u = createTestUser(); Group g = createTestGroup(); Test.startTest(); //We have to runAs so that we don't get a MIXED_DML_EXCEPTION System.runAs(u) { //Do not insert this user in the queue -- he should not get the case Case c = new Case(Subject='Test',OwnerId=g.Id); insert c; Id caseId = retrieveNextCase(u.Id); System.assertEquals(caseId,null); Case ownedCase = [select OwnerId from Case where Id=:c.Id]; System.assertNotEquals(ownedCase.OwnerId,u.Id); } } }
- Burak Yurttas 7
- July 27, 2016
- Like
- 0
- Continue reading or reply
Explicit ORDER BY not allowed when locking rows
I'm trying to get pull the oldest case and assign it to a user. Without locking, we are experiening where users are clicking the button to call the query at the same time. If I add in For Update and remove order by, the oldest case isn't ever pulled. The newest case is. Does anyone have a work around to query the oldest case for update?
Case caseObj = [select c.CreatedDate,c.ID,c.OwnerId from Case c where
c.IsClosed=false
and c.OwnerId in :listGroupIds ORDER BY c.CreatedDate
limit 1
for update];
caseObj.OwnerId = userId;
update caseObj;
return caseObj.Id;
}
catch (QueryException e) {
System.debug ('No Cases Available');
}
Case caseObj = [select c.CreatedDate,c.ID,c.OwnerId from Case c where
c.IsClosed=false
and c.OwnerId in :listGroupIds ORDER BY c.CreatedDate
limit 1
for update];
caseObj.OwnerId = userId;
update caseObj;
return caseObj.Id;
}
catch (QueryException e) {
System.debug ('No Cases Available');
}
- Brian Cherry
- May 27, 2015
- Like
- 1
- Continue reading or reply