-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
4Questions
-
2Replies
Salesforce Developer Careers
Hey everyone,
As someone still relatively new to the world of Salesforce, I am curious to know your thoughts and experiences. The questions are directed towards those who already work as Salesforce developers, however, please share your thoughts if you are considering a Salesforce career or just starting out!
What is your current role?
Why did you choose to pursue a career as a Salesforce developer?
What is the hardest thing you faced when starting a career in Salesforce?
How have certifications played a role in your success?
How did you gain experience?
How did you land your first Salesforce job?
What is one thing you know now that you wish you had known when starting out?
What has been your biggest frustration?
What advice would you give to someone just starting out?
What are the best resources you have found for Salesforce career guidance?
As someone still relatively new to the world of Salesforce, I am curious to know your thoughts and experiences. The questions are directed towards those who already work as Salesforce developers, however, please share your thoughts if you are considering a Salesforce career or just starting out!
What is your current role?
Why did you choose to pursue a career as a Salesforce developer?
What is the hardest thing you faced when starting a career in Salesforce?
How have certifications played a role in your success?
How did you gain experience?
How did you land your first Salesforce job?
What is one thing you know now that you wish you had known when starting out?
What has been your biggest frustration?
What advice would you give to someone just starting out?
What are the best resources you have found for Salesforce career guidance?
-
- RandyBarton24
- May 01, 2015
- Like
- 0
- Continue reading or reply
Trigger.oldmap field value same as Trigger.newmap field value when field updated.
This one is making me a little crazy... I'm sure it's something small I am overlooking, but I can't seem to figure it out.
In my developer sandbox I have the following test class:
The method I am testing is as follows:
The 3 Debug statements return the following:
System.debug(o.Number_of_Providers__c); = 4
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 4
When I am expecting:
System.debug(o.Number_of_Providers__c); = 1
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 1
As a sanity check, I put the same code in a fresh dev org, run the test, and I get the results I am expecting. Any ideas?? Thank you in advance for your help.
In my developer sandbox I have the following test class:
@isTest static void numberOfProvidersUpdatedToLessThan3FromMoreThan3() { Account a = TestUtilities.insertBasicAccount(); Opportunity o = TestUtilities.createBasicOpportunity(a.Id); o.Number_of_Providers__c = 4; insert o; Test.startTest(); o.Number_of_Providers__c = 1; update o; Test.stopTest(); Opportunity o2 = TestUtilities.getOppData(o.Id); Map<String, Decimal> oppLineItemQty = new Map<String, Decimal>(); Map<String, Decimal> oppLineItemPrice = new Map<String, Decimal>(); if(o2.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : o2.OpportunityLineItems) { oppLineItemQty.put(oppLi.PricebookEntry.Name, oppLi.Quantity); oppLineItemPrice.put(oppLi.PricebookEntry.Name, oppLi.TotalPrice); } } System.assertNotEquals(o2.Pricebook2Id, null, 'The Pricebook was not set'); System.assert(o2.HasOpportunityLineItem, 'The Opportunity does not have any products'); System.assertEquals(2, o2.OpportunityLineItems.size(), 'Two products were expected on this Opportunity'); System.assert(oppLineItemPrice.containsKey('Monthly Service Fee'), 'The MSF Product was not added'); System.assert(oppLineItemPrice.containsKey('Setup Fee'), 'The SF Product was not added'); System.assert(!oppLineItemPrice.containsKey('Additional Providers'), 'The AP Product should have been removed'); System.assertEquals(1, oppLineItemQty.get('Monthly Service Fee'), 'The MSF quantity is incorrect'); System.assertEquals(1, oppLineItemQty.get('Setup Fee'), 'The SF quantity is incorrect'); System.assertEquals(379, oppLineItemPrice.get('Monthly Service Fee'), 'The MSF price is incorrect'); System.assertEquals(399, oppLineItemPrice.get('Setup Fee'), 'The SF price is incorrect'); }
The method I am testing is as follows:
public static void updateAPProductForNumberOfProvidersChange(Opportunity[] updatedOpps, Map<ID, Opportunity> oldOpportunityMap, Map<ID, Opportunity> newOpportunityMap) { Boolean hasAdditionalProviderLineItem = false; Map<Id, OpportunityLineItem> mapInsertOppLis = new Map<Id, OpportunityLineItem>(); Map<Id, OpportunityLineItem> mapUpdateOppLis = new Map<Id, OpportunityLineItem>(); Map<Id, OpportunityLineItem> mapDeleteOppLis = new Map<Id, OpportunityLineItem>(); if(!FlowControl.InClass1) { FlowControl.InClass1 = true; for(Opportunity o : updatedOpps) { System.debug(o.Number_of_Providers__c); System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); if(o.RecordTypeId != DEFAULT_RENEWAL_RECORD_TYPE.getRecordTypeId()){ if(o.Number_of_Providers__c != oldOpportunityMap.get(o.Id).Number_of_Providers__c){ if(o.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : newOppDataMap.get(o.Id).OpportunityLineItems) { if(oppLi.PricebookEntry.Product2.ProductCode == APProduct) { oppLi.Quantity = o.Number_of_Providers__c > 3 ? o.Number_of_Providers__c - 3 : 0; oppLi.UnitPrice = oppLi.PricebookEntry.UnitPrice; hasAdditionalProviderLineItem = true; if(oppLi.Quantity == 0) { mapDeleteOppLis.put(oppLi.Id, oppLi); System.debug(mapDeleteOppLis); } else { mapUpdateOppLis.put(oppLi.Id, oppLi); System.debug(mapUpdateOppLis); } } } if(!hasAdditionalProviderLineItem && o.Number_of_Providers__c > 3) { for(PriceBookEntry pbEntry : STANDARD_PRICEBOOK) { if(pbEntry.Product2.ProductCode == APProduct) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, o.Number_of_Providers__c -3); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } } else if(o.Number_of_Providers__c > 3 && o.Pricebook2Id != null) { for(PriceBookEntry pbEntry : STANDARD_PRICEBOOK) { if(pbEntry.Product2.ProductCode == APProduct) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, o.Number_of_Providers__c -3); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } } } } SRUtilities.runDml(mapInsertOppLis, mapUpdateOppLis, mapDeleteOppLis, 'OpportunityUtilities.updateAPProductForNumberOfProvidersChange'); if(!mapUpdateOppLis.isEmpty() || !mapInsertOppLis.isEmpty() || !mapDeleteOppLis.isEmpty()) OpportunityTriggerHandler.oppDataMap = OpportunityUtilities.getOppData(newOppDataMap); FlowControl.InClass1 = false; } }
The 3 Debug statements return the following:
System.debug(o.Number_of_Providers__c); = 4
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 4
When I am expecting:
System.debug(o.Number_of_Providers__c); = 1
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 1
As a sanity check, I put the same code in a fresh dev org, run the test, and I get the results I am expecting. Any ideas?? Thank you in advance for your help.
-
- RandyBarton24
- April 17, 2015
- Like
- 0
- Continue reading or reply
SOQL Relationship Question for PricebookEntries
Hey Everyone,
I'm wondering if this is possible or if there is a better solution. I am trying to access PricebookEntries from an Opportunity SOQL query. Let me try to explain with an example:
I am trying to access the info in order to auto-add products to an Opportunity in the following method (the "updatedOpps" parameter is the list returned from the above SOQL query; the method is called by an After Insert trigger on the Opportunity):
Thanks in advance for your help!
I'm wondering if this is possible or if there is a better solution. I am trying to access PricebookEntries from an Opportunity SOQL query. Let me try to explain with an example:
Opportunity[] updatedOpps = [SELECT Id, RecordTypeId, Number_of_Providers__c, RecurSoft__Contract_Signed_Date__c, RecurSoft__Contract_Term_Start_Date1__c, RecurSoft__Trial_End_Date1__c, Name, RecurSoft__Initial_Contract_Term__c, RecurSoft__Number_of_Free_Months__c, RecurSoft__Trial__c, HasOpportunityLineItem, Number_of_SF_products__c, Number_of_MSF_products__c, CampaignId, Campaign.Product_1_Name1__c, Campaign.Product_2_Name_2__c, Campaign.Name, Campaign.Type, Campaign.Trial_Period__c, Campaign.Free_Months__c, Campaign.Free_Months_Setting__c, Campaign.Promo_Product1__c, Campaign.Product_1_Sales_Price__c, Campaign.Product_2_Sale_Price__c, Pricebook2Id, Pricebook2.Name, Pricebook2.IsStandard, (select Id, Product2Id, UnitPrice, ProductCode from PricebookEntries), (SELECT Id, Is_Promo_Item__c, ListPrice, UnitPrice, OpportunityId, PricebookEntryId, PriceBookEntry.Name, PriceBookEntry.UnitPrice, PricebookEntry.Product2Id, PricebookEntry.Product2.Name, PricebookEntry.Pricebook2Id FROM OpportunityLineItems) FROM Opportunity WHERE Id IN :oppIds]);The query isn't working because there isn't a direct relationship between the Opportunity and PricebookEntry SObjects. I can access PricebookEntries through the OpportunityLineItem SObject, but what I really am looking to access is a list of all PricebookEntries in an Opportunities current Pricebook in order to add OpportunityLineItems. I really want to avoid looping through a separate query to get the PricebookEntries.
I am trying to access the info in order to auto-add products to an Opportunity in the following method (the "updatedOpps" parameter is the list returned from the above SOQL query; the method is called by an After Insert trigger on the Opportunity):
public static void addStandardProducts(Opportunity[] updatedOpps) { Set<String> currentOpportunityLineItems = new Set<String>(); Map<Id, OpportunityLineItem> mapInsertOppLis = new Map<Id, OpportunityLineItem>(); for(Opportunity o : updatedOpps) { if(o.RecordTypeId != DEFAULT_RENEWAL_RECORD_TYPE.getRecordTypeId()){ if(o.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : o.OpportunityLineItems) { currentOpportunityLineItems.add(oppLi.PricebookEntry.ProductCode); } } for(PriceBookEntry pbEntry : o.Pricebook2.PricebookEntries) { if(pbEntry.ProductCode == SFProduct && !currentOpportunityLineItems.contains(SFProduct)) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, 1); mapInsertOppLis.put(pbEntry.Id, newOppLi); } if(pbEntry.ProductCode == MSFProduct && !currentOpportunityLineItems.contains(MSFProduct)) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, 1); mapInsertOppLis.put(pbEntry.Id, newOppLi); } if(pbEntry.ProductCode == APProduct && !currentOpportunityLineItems.contains(APProduct) && o.Number_of_Providers__c > 3) { Decimal q = o.Number_of_Providers__c - 3; OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, q); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } insert mapInsertOppLis.values(); currentOpportunityLineItems.clear(); } }Any ideas of how this could be possible without a separate query? Or any ideas of a better solution altogether?
Thanks in advance for your help!
-
- RandyBarton24
- April 14, 2015
- Like
- 0
- Continue reading or reply
Eclipse vs. MavensMate vs. BrainEngine vs. WelkinSuite vs. Developer Console vs. ??
Hello,
I am looking for some feedback on the various IDE options for Salesforce. What makes you choose one over the other? Pros & Cons? Am I missing other options?
I would like to invest the time into learning an IDE very well, but was looking for some guidance in choosing the right one before I dive in to later decide I should have chose a different one because of x, y, or z.
I realize this is a subjective question, but hearing the opinions of those with experience will greatly help those with less experience like myself.
Thanks for your input!
I am looking for some feedback on the various IDE options for Salesforce. What makes you choose one over the other? Pros & Cons? Am I missing other options?
I would like to invest the time into learning an IDE very well, but was looking for some guidance in choosing the right one before I dive in to later decide I should have chose a different one because of x, y, or z.
I realize this is a subjective question, but hearing the opinions of those with experience will greatly help those with less experience like myself.
Thanks for your input!
-
- RandyBarton24
- March 06, 2015
- Like
- 0
- Continue reading or reply
Trigger.oldmap field value same as Trigger.newmap field value when field updated.
This one is making me a little crazy... I'm sure it's something small I am overlooking, but I can't seem to figure it out.
In my developer sandbox I have the following test class:
The method I am testing is as follows:
The 3 Debug statements return the following:
System.debug(o.Number_of_Providers__c); = 4
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 4
When I am expecting:
System.debug(o.Number_of_Providers__c); = 1
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 1
As a sanity check, I put the same code in a fresh dev org, run the test, and I get the results I am expecting. Any ideas?? Thank you in advance for your help.
In my developer sandbox I have the following test class:
@isTest static void numberOfProvidersUpdatedToLessThan3FromMoreThan3() { Account a = TestUtilities.insertBasicAccount(); Opportunity o = TestUtilities.createBasicOpportunity(a.Id); o.Number_of_Providers__c = 4; insert o; Test.startTest(); o.Number_of_Providers__c = 1; update o; Test.stopTest(); Opportunity o2 = TestUtilities.getOppData(o.Id); Map<String, Decimal> oppLineItemQty = new Map<String, Decimal>(); Map<String, Decimal> oppLineItemPrice = new Map<String, Decimal>(); if(o2.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : o2.OpportunityLineItems) { oppLineItemQty.put(oppLi.PricebookEntry.Name, oppLi.Quantity); oppLineItemPrice.put(oppLi.PricebookEntry.Name, oppLi.TotalPrice); } } System.assertNotEquals(o2.Pricebook2Id, null, 'The Pricebook was not set'); System.assert(o2.HasOpportunityLineItem, 'The Opportunity does not have any products'); System.assertEquals(2, o2.OpportunityLineItems.size(), 'Two products were expected on this Opportunity'); System.assert(oppLineItemPrice.containsKey('Monthly Service Fee'), 'The MSF Product was not added'); System.assert(oppLineItemPrice.containsKey('Setup Fee'), 'The SF Product was not added'); System.assert(!oppLineItemPrice.containsKey('Additional Providers'), 'The AP Product should have been removed'); System.assertEquals(1, oppLineItemQty.get('Monthly Service Fee'), 'The MSF quantity is incorrect'); System.assertEquals(1, oppLineItemQty.get('Setup Fee'), 'The SF quantity is incorrect'); System.assertEquals(379, oppLineItemPrice.get('Monthly Service Fee'), 'The MSF price is incorrect'); System.assertEquals(399, oppLineItemPrice.get('Setup Fee'), 'The SF price is incorrect'); }
The method I am testing is as follows:
public static void updateAPProductForNumberOfProvidersChange(Opportunity[] updatedOpps, Map<ID, Opportunity> oldOpportunityMap, Map<ID, Opportunity> newOpportunityMap) { Boolean hasAdditionalProviderLineItem = false; Map<Id, OpportunityLineItem> mapInsertOppLis = new Map<Id, OpportunityLineItem>(); Map<Id, OpportunityLineItem> mapUpdateOppLis = new Map<Id, OpportunityLineItem>(); Map<Id, OpportunityLineItem> mapDeleteOppLis = new Map<Id, OpportunityLineItem>(); if(!FlowControl.InClass1) { FlowControl.InClass1 = true; for(Opportunity o : updatedOpps) { System.debug(o.Number_of_Providers__c); System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); if(o.RecordTypeId != DEFAULT_RENEWAL_RECORD_TYPE.getRecordTypeId()){ if(o.Number_of_Providers__c != oldOpportunityMap.get(o.Id).Number_of_Providers__c){ if(o.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : newOppDataMap.get(o.Id).OpportunityLineItems) { if(oppLi.PricebookEntry.Product2.ProductCode == APProduct) { oppLi.Quantity = o.Number_of_Providers__c > 3 ? o.Number_of_Providers__c - 3 : 0; oppLi.UnitPrice = oppLi.PricebookEntry.UnitPrice; hasAdditionalProviderLineItem = true; if(oppLi.Quantity == 0) { mapDeleteOppLis.put(oppLi.Id, oppLi); System.debug(mapDeleteOppLis); } else { mapUpdateOppLis.put(oppLi.Id, oppLi); System.debug(mapUpdateOppLis); } } } if(!hasAdditionalProviderLineItem && o.Number_of_Providers__c > 3) { for(PriceBookEntry pbEntry : STANDARD_PRICEBOOK) { if(pbEntry.Product2.ProductCode == APProduct) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, o.Number_of_Providers__c -3); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } } else if(o.Number_of_Providers__c > 3 && o.Pricebook2Id != null) { for(PriceBookEntry pbEntry : STANDARD_PRICEBOOK) { if(pbEntry.Product2.ProductCode == APProduct) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, o.Number_of_Providers__c -3); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } } } } SRUtilities.runDml(mapInsertOppLis, mapUpdateOppLis, mapDeleteOppLis, 'OpportunityUtilities.updateAPProductForNumberOfProvidersChange'); if(!mapUpdateOppLis.isEmpty() || !mapInsertOppLis.isEmpty() || !mapDeleteOppLis.isEmpty()) OpportunityTriggerHandler.oppDataMap = OpportunityUtilities.getOppData(newOppDataMap); FlowControl.InClass1 = false; } }
The 3 Debug statements return the following:
System.debug(o.Number_of_Providers__c); = 4
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 4
When I am expecting:
System.debug(o.Number_of_Providers__c); = 1
System.debug(oldOpportunityMap.get(o.Id).Number_of_Providers__c); = 4
System.debug(newOppDataMap.get(o.Id).Number_of_Providers__c); = 1
As a sanity check, I put the same code in a fresh dev org, run the test, and I get the results I am expecting. Any ideas?? Thank you in advance for your help.
- RandyBarton24
- April 17, 2015
- Like
- 0
- Continue reading or reply
SOQL Relationship Question for PricebookEntries
Hey Everyone,
I'm wondering if this is possible or if there is a better solution. I am trying to access PricebookEntries from an Opportunity SOQL query. Let me try to explain with an example:
I am trying to access the info in order to auto-add products to an Opportunity in the following method (the "updatedOpps" parameter is the list returned from the above SOQL query; the method is called by an After Insert trigger on the Opportunity):
Thanks in advance for your help!
I'm wondering if this is possible or if there is a better solution. I am trying to access PricebookEntries from an Opportunity SOQL query. Let me try to explain with an example:
Opportunity[] updatedOpps = [SELECT Id, RecordTypeId, Number_of_Providers__c, RecurSoft__Contract_Signed_Date__c, RecurSoft__Contract_Term_Start_Date1__c, RecurSoft__Trial_End_Date1__c, Name, RecurSoft__Initial_Contract_Term__c, RecurSoft__Number_of_Free_Months__c, RecurSoft__Trial__c, HasOpportunityLineItem, Number_of_SF_products__c, Number_of_MSF_products__c, CampaignId, Campaign.Product_1_Name1__c, Campaign.Product_2_Name_2__c, Campaign.Name, Campaign.Type, Campaign.Trial_Period__c, Campaign.Free_Months__c, Campaign.Free_Months_Setting__c, Campaign.Promo_Product1__c, Campaign.Product_1_Sales_Price__c, Campaign.Product_2_Sale_Price__c, Pricebook2Id, Pricebook2.Name, Pricebook2.IsStandard, (select Id, Product2Id, UnitPrice, ProductCode from PricebookEntries), (SELECT Id, Is_Promo_Item__c, ListPrice, UnitPrice, OpportunityId, PricebookEntryId, PriceBookEntry.Name, PriceBookEntry.UnitPrice, PricebookEntry.Product2Id, PricebookEntry.Product2.Name, PricebookEntry.Pricebook2Id FROM OpportunityLineItems) FROM Opportunity WHERE Id IN :oppIds]);The query isn't working because there isn't a direct relationship between the Opportunity and PricebookEntry SObjects. I can access PricebookEntries through the OpportunityLineItem SObject, but what I really am looking to access is a list of all PricebookEntries in an Opportunities current Pricebook in order to add OpportunityLineItems. I really want to avoid looping through a separate query to get the PricebookEntries.
I am trying to access the info in order to auto-add products to an Opportunity in the following method (the "updatedOpps" parameter is the list returned from the above SOQL query; the method is called by an After Insert trigger on the Opportunity):
public static void addStandardProducts(Opportunity[] updatedOpps) { Set<String> currentOpportunityLineItems = new Set<String>(); Map<Id, OpportunityLineItem> mapInsertOppLis = new Map<Id, OpportunityLineItem>(); for(Opportunity o : updatedOpps) { if(o.RecordTypeId != DEFAULT_RENEWAL_RECORD_TYPE.getRecordTypeId()){ if(o.HasOpportunityLineItem) { for(OpportunityLineItem oppLi : o.OpportunityLineItems) { currentOpportunityLineItems.add(oppLi.PricebookEntry.ProductCode); } } for(PriceBookEntry pbEntry : o.Pricebook2.PricebookEntries) { if(pbEntry.ProductCode == SFProduct && !currentOpportunityLineItems.contains(SFProduct)) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, 1); mapInsertOppLis.put(pbEntry.Id, newOppLi); } if(pbEntry.ProductCode == MSFProduct && !currentOpportunityLineItems.contains(MSFProduct)) { OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, 1); mapInsertOppLis.put(pbEntry.Id, newOppLi); } if(pbEntry.ProductCode == APProduct && !currentOpportunityLineItems.contains(APProduct) && o.Number_of_Providers__c > 3) { Decimal q = o.Number_of_Providers__c - 3; OpportunityLineItem newOppLi = OpportunityUtilities.addOpportunityLineItem(o, pbEntry, q); mapInsertOppLis.put(pbEntry.Id, newOppLi); } } } insert mapInsertOppLis.values(); currentOpportunityLineItems.clear(); } }Any ideas of how this could be possible without a separate query? Or any ideas of a better solution altogether?
Thanks in advance for your help!
- RandyBarton24
- April 14, 2015
- Like
- 0
- Continue reading or reply