Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

How to modify "Cost Plan Name".

WataruS
Tera Contributor

I would like to change the "Cost Name" in Cost Plans.

I want the cost name automatically generated after pressing the Create labor costs button to display the name of the assigned employee.

I believe the name generated by the CostPlanForFinancialAttributes script is defined. How can I modify this to output the employee name as the cost name?

I want to add the employee name after the default generated name, like _XX.

1 ACCEPTED SOLUTION

Vinay3
ServiceNow Employee
ServiceNow Employee

@WataruS You can have the employee name added to the cost plan name easily using the out of box logic by making the 'User' field a financial attribute.

Please check out this page to know more: https://www.servicenow.com/community/spm-articles/generate-labor-cost-plans-by-individual-resources-...

View solution in original post

5 REPLIES 5

M Iftikhar
Tera Sage

Hi @WataruS,

 

The cost plan name is generated in the CostPlanForFinancialAttributes script include, specifically in the _setAttributeValuesAndCostPlanName method. Out-of-the-box it always starts with "Resource" and then concatenates attribute display values. 

If you want to append the assigned employee name (e.g. Resource_Capex_Internal_Alexa Smith), the recommended approach is to leave OOTB code intact (so you don’t lose changes during upgrades) and add your own customization layer. 

Option: To Extend the script include (not recommended for upgrades) 

_setAttributeValuesAndCostPlanName: function(attributeValues, gr) { 
   let costPlanName = gs.getMessage('Resource'); 
 
   // set values of attributes and unit_cost present in attributeValues object 
   for (const [column, obj] of Object.entries(attributeValues)) { 
       if (column === 'unit_cost') { 
           gr.setValue(column, obj); 
       } else { 
           gr.setValue(column, obj.value); 
       } 
       let name = costPlanName + "_" + obj.displayValue; 
       costPlanName = (obj.value && column !== 'unit_cost') ? name : costPlanName; 
   } 
 
   // Append employee name if available 
   if (attributeValues['resource'] && attributeValues['resource'].value) { 
       let userGr = new GlideRecord('sys_user'); 
       if (userGr.get(attributeValues['resource'].value)) { 
           costPlanName += "_" + userGr.getDisplayValue(); 
       } 
   } 
 
   gr.setValue('name', costPlanName); 
} 
 

 

Recommended Option: Use a Business Rule on cost_plan 

  • Create an after insert Business Rule on the cost_plan table. 
  • Check if it’s a labor cost plan (is_labor_cost_plan = true). 
  • Query the related resource_allocation > resource (sys_user). 
  • Update the name field to append the employee’s display name. 

Why this way? 

  • Keeps the OOTB Script Includes upgrade-safe. 
  • Your logic is isolated and easy to maintain. 
  • You can always remove the BR if the requirement changes. 

 P.S. Please make sure to test this first in your PDI or a lower environment.

Thanks & Regards,  
Muhammad Iftikhar  
If my response helped, please mark it as the accepted solution so others can benefit as well. 

Thanks & Regards,
Muhammad Iftikhar

If my response helped, please mark it as the accepted solution so others can benefit as well.

Hi, @M Iftikhar 

Thank you for answering.

First, I tried adding to the script, but it didn't work properly and the employee's name wasn't added. Is there anything else I should add here?

 

Considering the impact of the update, I understand that addressing it through business rules is preferable.

Could you please provide a bit more detail on how to configure the following two points?

  • Query the related resource_allocation > resource (sys_user). 
  • Update the name field to append the employee’s display name. 

Hi @WataruS,

Could you please try the below script in your business rule and see if it helps?

(function executeRule(current, previous /*null when async*/) {

if (!current.is_labor_cost_plan)
return;

   // Find related allocation
    var alloc = new GlideRecord('resource_allocation');
    alloc.addQuery('task', current.task);
    alloc.query();
    if (alloc.next() && alloc.user) {
        var user = new GlideRecord('sys_user');
        if (user.get(alloc.user)) {
            current.name = current.name + "_" + user.getDisplayValue();
            current.update();
        }
    }
})(current, previous);
 
 

This logic checks for the related resource_allocation, pulls the associated sys_user, and appends the display name to the cost plan record’s name field.

MIftikhar_0-1758190963651.png

 

Thanks & Regards,  
Muhammad Iftikhar  

If my response helped, please mark it as the accepted solution so others can benefit as well.

 

Thanks & Regards,
Muhammad Iftikhar

If my response helped, please mark it as the accepted solution so others can benefit as well.

Hi @M Iftikhar 

Thank you for your information.

I have created the Business rule based on your information.

WataruS_1-1758241326043.png

WataruS_2-1758241409659.png

 

 

However, the employee's name was not added.

Are there any other items that need to be configured?

WataruS_0-1758241179129.png