• Troy Center
  • 30 Points
  • Member since 2014

  • Chatter
  • 0
    Best Answers
  • 0
    Likes Received
  • 1
    Likes Given
  • 1
  • 24
I have these requirements. 
The BillingCode generated must be unique in the org. 
The BillingCode should whenever possible match the first three alpha letters of the Account Name, prefixed with 280. 

if Account name is A A Highlight, the Billing Code would be 280AAH, unless that was taken, 280AA? (? is single wildcard alpha char) is acceptable and if they are all taken, 280A?? would be acceptable. Of course in the end, Any available 280??? code is acceptable. 
Accept of course that there are only 17,576 available codes using this. That is acceptable too, exit and do nothing. 

AND Thanks. Think of this as a challenge. The Nested loops were flagged as potentially problematic. Is there another way to do this within these requirements? Thanks. Troy

Class and test Class below. Should work in a sandbox. You need to create the Billing_Code__c field on Account. Text, 6 characters. 
public with sharing class testbillingcode {
    public testbillingcode(list<Id> acctToCheck) {
        //Update the Accounts. 
        if(acctToCheck.size() > 0){
            list<Account> acctsList = [SELECT Id, Name, Billing_Code__c FROM Account WHERE Id IN :acctToCheck];
            List<Account> acctToUpdate = new List<Account>(); 
            if(acctsList.size() > 0){
                for(Account a : acctsList){
                    String strAccountName = a.Name; 
                    //Remove all Special Characters from Name String. 
                    strAccountName = strAccountName.replaceAll('(\\s+)', '');
                    strAccountName = strAccountName.replaceAll('[^a-zA-Z0-9\\s+]','');                    
                    String strAccountNameFirstCharacters = strAccountName.left(3).toUpperCase();

                    BillingCodeGenerator acctBillingCode = new BillingCodeGenerator(strAccountNameFirstCharacters);
                    String finalBillCode = acctBillingCode.getValue();
                    a.Billing_Code__c = finalBillCode;
                    a.Time_Code__c = '0'+finalBillCode+'01';
                update acctToUpdate;    

    public class BillingCodeGenerator {
        private final String value;
        public BillingCodeGenerator(String strAccountNameFirstCharacters) {
            this.value = this.generateValue(strAccountNameFirstCharacters);
        public String getValue() {
            return this.value;
        private String generateValue(String strAccountNameFirstCharacters) {
            Boolean FoundValidBillingCode = False; 
            String strAlphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

            //Select All Billing Codes from Salesforce where like 280
            List<Account> lstBillingCodeAccts = [SELECT Billing_Code__c FROM Account WHERE Billing_Code__c LIKE '280%'];
            List<String> lstBillingCodes = new List<String>();

            for(Account a : lstBillingCodeAccts){

            //Search for perfect match
            String strBillingCodePrefix = '280'+strAccountNameFirstCharacters;
                //Did not find in SF. Use this Billing Code. Perfect Match found.
                FoundValidBillingCode = True;
                return strBillingCodePrefix;
            if(FoundValidBillingCode == False){
               for(integer x = 0; x <= 25; x++){
                    strBillingCodePrefix = strBillingCodePrefix.left(5) +  strAlphabet.substring(x, x+1);
                    if(!lstBillingCodes.contains(strBillingCodePrefix) && !test.isRunningTest()){
                        FoundValidBillingCode = True;
                        return strBillingCodePrefix;
            if(FoundValidBillingCode == False){ 
                for(integer y = 0; y <= 25; y++){
                    for(integer x = 0; x <= 25; x++){
                        strBillingCodePrefix = strBillingCodePrefix.left(4) + strAlphabet.substring(x, x+1) + strAlphabet.substring(y, y+1);
                        if(!lstBillingCodes.contains(strBillingCodePrefix) && !test.isRunningTest()){
                            FoundValidBillingCode = True;
                            return strBillingCodePrefix; 
            if(FoundValidBillingCode == False) {
                for(integer z = 0; z <= 25; z++){
                    for(integer y = 0; y <= 25; y++){
                        for(integer x = 0; x <= 25; x++){
                            strBillingCodePrefix = '280' + strAlphabet.substring(x, x+1) + strAlphabet.substring(y, y+1) + strAlphabet.substring(z, z+1);
                                FoundValidBillingCode = True;
                                return strBillingCodePrefix;
            return null;

public class ContractTrigger_Tests {

    public static void ContractTrigger_AcctBillCodeUpd_ZZZ_test() {		
        List<Id> lstAcctIds = new List<Id>(); 

        Account acctOne = new Account();
            acctOne.Name = 'Z Z-X-TestAccountAgain'; //AccountName has space in it. 
            acctOne.Type = 'Prospect';
            acctOne.RecordTypeId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('Standard').getRecordTypeId();
        insert acctOne;
        // Account acctTest1 = [SELECT Id, Billing_Code__c, Type, Name FROM Account WHERE id = :acctOne.Id];
        System.assertEquals(null, acctOne.Billing_Code__c, 'Account Billing Code s/b null. Actual:: '+acctOne.Billing_Code__c);
        testbillingcode sendTest; 
        sendTest = new testbillingcode(lstAcctIds);

        Account acctResult2 = [SELECT Id,Billing_Code__c,Type FROM Account WHERE id = :acctOne.Id];
        System.assertEquals(6, acctResult2.Billing_Code__c.length(), 'Account Billing_Code__c s/b 6 characters. Actual:: '+acctResult2.Billing_Code__c.length());

        List<Account> acctResult3 = [SELECT Id,Billing_Code__c,Type FROM Account WHERE Account.Billing_Code__c=:acctResult2.Billing_Code__c];
        System.assertEquals(1, acctResult3.size(), 'Only one account should have this Billing Code. Actual:: '+acctResult3.size());


Test class:

 * @description - This class is the test class for WOD_ProjectTriggerHandler,WOD_BusinessRules_ACK_DOC_Helper and WOD_ProjectDataService
public with sharing class WOD_ProjectTriggerHandlerTest {
    public WOD_ProjectTriggerHandlerTest() {
    public static void runTestSetup(){
        twod_bm__Project__c project =  WOD_DataFactoryTest.createProject();
        project.twod_bm__Project_Status__c = 'Submitted';
        project.twod_bm__Is_Migrated_Data__c = true;
       // update project;
        // Adding Strategic Account also
        Account acc = WOD_DataFactoryTest.createAccount();
        acc.twod_bm__Strategic_Account__c = true;
        update acc;
        WOD_2__Inventory__c inventory =  WOD_DataFactoryTest.createInventory(project.Id);
        inventory.twod_bm__Inventory_Status__c = 'Pending Review';
        inventory.twod_bm__Guarantee_Issued__c = false;
        inventory.twod_bm__Strategic_Building__c = true;
        inventory.twod_bm__Strategic_AccountName__c = acc.id;
        inventory.twod_bm__Strategic_Price_Available__c = true;
        update inventory;
        WOD_2__Inventory__c inv = WOD_DataFactoryTest.createInventory(project.Id);
        inv.twod_bm__Guarantee_Issued__c = true;
        inv.twod_bm__Admin_Review__c = true;
        inv.twod_bm__Specification_Check__c = true;
        inv.twod_bm__Is_Building_Approved__c = true;
        update inv;
        twod_bm__Inspection__c ins = WOD_DataFactoryTest.createInspection(inv.id);
        ins.twod_bm__Type__c = 'Final Inspection';
        ins.twod_bm__Status__c = 'Pending Inspection';
        ins.twod_bm__Inspection_Rating__c = 'Conditionally accepted with Punchlist';
        update ins;
        twod_bm__Customer_Communication__c custComm = new twod_bm__Customer_Communication__c();
        custComm.twod_bm__Building__c = inventory.id;
        custComm.twod_bm__Status__c = 'Awaiting Response';
        //insert custComm;
        WOD_2__Warranty_Registration__c objwarranty= WOD_DataFactoryTest.createWarrantyRegistration(inventory.id);
    static void handlerMethods(){
        Account acc = new Account();
        acc.Name = 'Test Property Owner';
       // insert acc;

        twod_bm__Project__c proj = WOD_DataFactoryTest.createProject();
        WOD_2__Inventory__c inv = WOD_DataFactoryTest.createInventory(proj.Id);
        WOD_2__Warranty_Registration__c objwarranty= WOD_DataFactoryTest.createWarrantyRegistration(inv.id);
        Assembly__c ass = WOD_DataFactoryTest.createAssembly(inv.Id);

        proj.twod_bm__Property_Owner__c = acc.Id;
        proj.twod_bm__Submitted_Internally__c = true;
        proj.twod_bm__Project_Status__c = 'Submitted';
       // update proj;
        proj.twod_bm__General_Contractor__c = acc.Id;
       // update proj;
        WOD_ProjectTriggerHandler.createOpenItems(new List<twod_bm__Project__c>{proj});
    static void handlerMethodsForDelete(){
        Account acc = new Account();
        acc.Name = 'Test Property Owner';
        //insert acc;

        twod_bm__Project__c proj = WOD_DataFactoryTest.createProject();
        WOD_2__Inventory__c inv = WOD_DataFactoryTest.createInventory(proj.Id);
        WOD_2__Warranty_Registration__c objwarranty= WOD_DataFactoryTest.createWarrantyRegistration(inv.id);
        Assembly__c ass = WOD_DataFactoryTest.createAssembly(inv.Id);
        proj.twod_bm__Property_Owner__c = acc.Id;
        proj.twod_bm__Submitted_Internally__c = true;
        proj.twod_bm__Project_Status__c = 'Submitted';
        //update proj;
        proj.twod_bm__General_Contractor__c = acc.Id;
       // update proj;
        delete proj;

Good day,

I have the following problem. I have created a few reports in my dev org and moved them to a newly created report folder. When I created my branch and retrieved the reports, only the folder was retrieved. There is no option to retrieve the created reports. Could you please give me advice how to do it? 

Hi Everyone!

Am new to slaesforce and Am trying to learn apex. 

Can anyone breakdown the following..



Schema  --> is a class 
SObjectType--> Am guessing it is an inner class
Event--> I understand this can be any object api name but how does that translate to apex? how are we able to call an object name on class? is it because that the object name is a variable inside the inner class?
getRecordTypeInfosByName() --> I guess it is a method inside the inner class
get(Label.RecordTypeName) --> another method but how are we able to call method from a method? method1().method2()??
getRecordTypeId(); --> another method???

Am pretty new to oops(apex) and would like to know how they are internally structure for the way the calls are happeining in the above statement?
can any one explain please.

Thanks in advance!

Failed to save customLookup.cmp: Invalid definition for null:customLookUpController: ApexService.getType() return null with currentNamespace: c, namespace: null, name: customLookUpController: Source
Kill the process running on port 1717 or use a custom connected app and update OauthLocalPort in the sfdx-project.json file.
Hi All,

I am trying to authorize an org (Dev org not sandbox) from VS Code and I am in my Company network and default port Id 1717 wouldnt work for me. I have followed the below steps to create a Connected App and change port number in sfdx-project.json file. But still its taking me to old 1717 localhost even after changin the port number.

From Connected App..
User-added image

From VSCode project setup..

User-added image

I have also tried to put 443 in the redirected URL instead of 1717. But it doesnt work either.

Is there any mistake that I have done while setting up the Conncted App ? BTW, I am not using JWT AUthentication. Its just web based authentication. How else can I change the default port number ?

PS : I have used both "oauthLocalPort" : "443" and "oauthLocalPort" : 443. 
I properly installed CLI. In a command window, I enter:

sfdx force:auth:web:login -d -a DevHub

in order to log in to the trial Dev Hub that I created. The aforementioned command opens the Salesforce login page in the web browser, so I log in using my Developer Hub Trial Org credentials and click Allow. After that, web browser show me an error: "This site can't be reached. localhost took too long to respond".

This is the URL that Salesforce use after I authenticate in the browser: http://localhost:1717/OauthRedirect?code=aPrxbOND3gL_2LbSR7rKPdvD0XBVk2YpErl3pphY2f3xvZ1wf5SSPJByDleRLPMtzCQWnNGAdg%3D%3D&state=f2f8254fac23

I don't know what happen.

User-added image

User-added image

User-added image
Hi guys, is there a global search in Lightning similar to Classic that use &startURL=/_ui/search/ui/UnifiedSearchResults?str=valueToSearch ?.
If you know something please let me know. Thank you.

I have been going through this code for an hour now and cannot figure out why it is an "Illegal Assignment from String to List". Isn't an Email field a string?

The error is shown at the line I flagged, however the error might be somewhere else in my code too.
public class sendEmail {
    public String subject { get; set; }
    public String body { get; set; }
    private final <Object> WebInquiry;
    // Create a constructor that populates the Account object
    public sendEmail() {
        WebInquiry = [SELECT Email__c FROM <Object> WHERE id = :ApexPages.currentPage().getParameters().get('id')];
    public <Object> getWebInq() {
        return WebInquiry;

    public PageReference send(){
        // Define the email
        Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
String address;
        address = WebInquiry.Email__c;

****ERROR HERE****        String[] toAddresses = address;
        // Sets the paramaters of the email
        email.setSubject( subject );
        email.setToAddresses( toAddresses );
        email.setPlainTextBody( body );
        // Sends the email
        Messaging.SendEmailResult [] r =
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});  
        return null;


Thanks for your help!
the challenge is as follows :

Create a camping component that contains a campingHeader and a campingList component.
1.The campingList component contains an ordered list of camping supplies that include Bug Spray, Bear Repellant, and Goat Food.
2.The campingHeader component contains an H1 heading style with a font size of 18 points and displays 'Camping List'.

so i made a lightening application named "camping.app" having code :

<aura:application >

where lightening component "campingHeader.cmp" having code :

<aura:component >
    <h1> Camping List </h1>

for I have "campingHeader.css" having code :

h1.THIS {
    font-size: 18px;

and lightening component "campingList.cmp" having code :

<aura:component >
       <li>Bug Spray</li>
       <li>Bear Repellant</li>
       <li>Goat Food</li>      

when i preview the application it is working nice; but when checking the challenge it says :
"Challenge Not yet complete... here's what's wrong: 
The 'camping' Lightning Component does not include either the campingHeader or campingList component."

please help me know where I m doing wrong. Thanx waiting for your reply
Hi Anybody, who took the TrailHead. Visual Workflow challange, I am not able to change the close date of the Opportunity by adding 30 days to it.

{!$Flow.CurrentDate} + 30 does not let me save.

thanks in Advance
I want to initiate a Flow from a button on a Custom Object.  How do I capture the ID of that Custom Object record and be able to use it in the Flow?

I have written a fucntionality to convert lead to case. The only problem is I have a field on Lead as Web-to-Lead Notes which is Text Area long and that is being popualated on Case Subject on Conversion. It gives error if the length is big. So I need to truncate the length of Lead to Web Notes field to 50 to properly fit in the Case Subject. Please help. Here is my code VFP and Apex:

Visualforce Page:
<apex:page standardController="Lead" extensions="CaseConverter">
    <apex:form >
        <apex:pageBlock title="Convert information to a new Case.">
            <apex:pageBlockButtons >
                <apex:commandbutton action="{!createCase}" value="Finish"/>
                <apex:commandbutton action="{!returnToLead}" value="Previous"/>
            <apex:pageBlockSection title="Lead content Section">            
                <tr><th class="labelCol vfLabelColTextWrap " scope="row">Lead Record Type</th><td class="dataCol "><span id="j_id0:j_id1:j_id2:j_id6:nameId">{!recordTypeName}</span></td></tr>
                <apex:outputText value="{!lead.Web_To_Lead_Notes__c} " rendered="true"/>
                <apex:outputField value="{!lead.Name}" id="nameId"/>
                <apex:outputField value="{!lead.Company}" id="companyId"/>
                <apex:outputField value="{!lead.Phone}" id="phoneid"/>
                <apex:outputField value="{!lead.City}" id="cityId"/>
                <apex:outputField value="{!lead.Street}" id="streetId"/>
                <apex:outputField value="{!lead.Country}" id="countryid"/>
                <apex:outputField value="{!lead.Email}" id="emailid"/>
                <apex:outputField value="{!lead.PostalCode}" id="postalId"/>
                <apex:outputField value="{!lead.MobilePhone}" id="mobileId"/>
                <apex:outputField value="{!lead.Website}" id="websiteId"/>
                <apex:outputField value="{!lead.Description}" id="descriptionId"/>
                <apex:outputField value="{!lead.Industry}" id="industryId"/>                           
   Apex Class:
public with sharing class CaseConverter {
    public Lead curLead{set;get;}
    private final String name;
    private final String company;
    private final String phone;
    private final String city;
    private final String street;
    private final String country;
    private final String email;
    private final String postal;
    private final String mobile;
    private final String website;
    private final String description;
    private final String industry;
    private final String leadId;
    public String Web_To_Lead_Notes_Case;
    public string accountOwnerId;
    //getter,setter for the selected list values
    public String statusCaseSelected{get;set;}
    public String originSelected{get;set;}
    //getter,setter for the input fields
    public String subjectInput{get;set;}
    //getter,setter for the input fields
    public String recordTypeName{get;set;}
    //getter setter for the checkboxes
    public Boolean createAccount{get;set;}
    /*get the select options from the case system schema for the status field
    * Input: nothing
    * Output: List of the select options from case status
    public List<Selectoption> getStatusCaseItems(){
        List<Selectoption> statusValues = new List<Selectoption>();
        Schema.Describefieldresult systemCaseStatus = Case.Status.getDescribe();
        for(Schema.Picklistentry plEntry : systemCaseStatus.getPicklistValues()){
                new Selectoption(
        return statusValues;
    /*get the select options from the case system schema for the origin field
    * Input: nothing
    * Output: List of the select options from case origin
    public List<Selectoption> getOriginItems(){
        List<Selectoption> originValues = new List<Selectoption>();
                       new Selectoption(
                                'Customer Service','Customer Service'
        return originValues;

    //constructor, this page will be called from the LeadToCase Page
    public CaseConverter(ApexPages.StandardController controller) {
        this.curLead= (Lead)controller.getRecord();
        List<QueueSobject> lstQueues = [SELECT Id,queue.Name, QueueId FROM QueueSobject WHERE SobjectType = 'Case'and queue.Name = 'Customer Service Cases'];
        curLead.OwnerId = lstQueues[0].QueueId;
        List<recordType> recordTypeList = [select Name from recordType where Id = :curlead.recordTypeId];
        if(recordTypeList.Size() > 0 ) {
            recordTypeName = recordTypeList[0].Name;
        this.name = curLead.FirstName + ' ' + curLead.LastName;
        this.company = curLead.Company;
        this.phone = curLead.Phone;
        this.city = curLead.City;
        this.street = curLead.Street;
        this.country = curLead.Country;
        this.email = curLead.Email;
        this.postal = curLead.PostalCode;
        this.mobile = curLead.MobilePhone;
        this.website = curLead.Website;
        this.description = curLead.Description;
        this.industry = curLead.Industry;
        this.leadId = curLead.Id; 
        this.Web_To_Lead_Notes_Case = curLead.Web_To_Lead_Notes__c;
        subjectInput = curLead.Web_To_Lead_Notes__c; 
  • April 03, 2015
  • Like
  • 0
I want to display current date  on a  field. i have writtened in formulae editor
which results error and i have tried 
$System.OriginDateTime. but even getting wrong date.

I want to use record Type to limit trigger action. 


Now I use querey to get it my code liks below

string Id = [SELECT id from RecordType where Name ='Someone'].Id;


I also found this page, we could use method to get the Record Type Id to avoid the query.

I still can't understand it.


Is there some simple and easy wayt to get the ID only by Record Type's Name?



Can anyone please let me know why is this checkbox 'Starts with a vowel sound' is used while creating objects in salesforce?


I read somewhere that 'This is used for languages where words need different treatment depending on the first character'.


If anyone can explain me with example on how it works that would be great.


Thanks in advance

Priya Nair

  • April 26, 2010
  • Like
  • 0
Hi,  wondered if anyone could help determine why my Return URL is not working on a custom button.
The above related to a new custom object related to the opportunity, on saving I would like it to return back to the opportunity.   I have tried lots of different options, even sending it to an external website to see what happens, but everytime it just takes me to the saved new record.
Is this not possible to do with custom objects, same code "retURL" works on custom event buttons.
Thanks for any assistance
I want to initiate a Flow from a button on a Custom Object.  How do I capture the ID of that Custom Object record and be able to use it in the Flow?