Budget Percentages in Custom Budgets – An Approach using custom MDF objects and the Integration Center
If you have been around SuccessFactors Compensation long enough (like 10 or more years), you may remember doing budgets with Budget Groups and Families. This functionality allowed for custom percentage budgets, with different groups assigned different percentages. While this function still exists, the introduction of “PercentOfCustomField” mode for budget calculations completely made it obsolete, due to the huge increase in flexibility and removal of huge administration tasks. However, there is one problem with the new function that didn’t exist before – the budget percentages show as “100%”, rendering them somewhat useless. The normal response of the Compensation Consultant is to simply hide the percentage and show the amount, but customers do grumble. I am going to show you a method today that shows the budget percentages in the budget box.
Note: this solution depends upon MDF objects and Employee Central.
The normal budget configuration would look something like this:
Where the column with the ID “customBudgetPot” is going to have a formula like this:
and the lookup table named “budgetTable” would look like:
This results in the following:
Note that the percentages that are shown bear little resemblance to the budget percentages loaded for each employee. In my experience, customers don’t see these values as a benefit and often ask for the actual percentages to be shown.
My solution to this problem is somewhat involved. It involves MDF objects, the Integration Centre, and Business Rules. So, while it works, it does take some effort to initially configure. This means that you will need to balance the effort with the customer’s priority on the requirement.
Creating the MDF objects
Following the instructions in this blog post: https://blogs.sap.com/2020/07/13/compensation-planning-simplified-with-mdf-integration, create the following MDF object:
Of course, the Code and Label of this object are up to you. The key parts are to make sure the API Visibility is “Editable”, the externalCode field is set to Data Type “User” and there is a custom column of type “Decimal”.
For my example, I wanted to replicate the “lookup” function, so I needed to create another MDF object to hold the data:
Here, the key things are setting the Label for externalCode to “Country” and adding the custom budgetPct as a Decimal. I also hid the externalName column, but this isn’t required. If there are more inputs to the lookup beyond country, add those as more custom columns.
This budget lookup table is then populated either through upload or via the UI:
The main difference between this lookup table and the Compensation lookup tables is that there is no wildcard function. This can be reproduced using the business rules, see below.
Creating the Business Rule
While most Compensation consultants have become adept in creating business rules for eligibility, this solution uses them in a slightly different way. The idea here is that the Integration Centre will create the MDF object “shell” for each employee, it is actually the business rule that populates the created data with the budget percentage through an “onSave” rule.
The first step is to navigate to “Configure Business Rules” and create a new rule by clicking on the + sign:
Choose “Rules for MDF Based Objects” as the Scenario and then give the rule a Name and ID. For Base Object, choose the first MDF object created above (the one with “User” as the Data Type for externalCode). For Purpose, choose “Evaluate” (as this is an onSave rule, rather than an onInit or other type). Click on Continue.
Here is the rule:
There are three parts to the rule:
- Set a variable named var_budgetpct that uses the Lookup function
the Base Object here is the second MDF object created above. Then use the externalCode field of the first MDF object to reference back into the Employee Central record and pull out the appropriate field (you will notice some fields are italicised and others are not – you only can link to the non-italicised types because these match the type of the “Country” field. If your scenario has more than one input to the lookup, click on the “+” icon and add it there, as each row is treated as an “and”
- If the variable in step 1 is null (i.e., there is no element in the lookup that matches) then Set the field budgetpct in the MDF object to 2. This is equivalent to the “default” row we to which we are accustomed
- If the variable is not null, set the budgetpct to be the value of the variable (i.e., the value from the Lookup)
If there is a need for more complex logic to determine the budget percentage, this is the place for it. You don’t even have to have a lookup table; you can use any combination of if-then-else if-else logic to Set the output.
Attaching the rule to the MDF object
Since the rule is supposed to be an onSave rule, we need to attach it to the MDF object. Navigate to Configure Object Definitions and find the first MDF object that was created above. Select “Make Correction” from the “Take Action” button in the top right. Scroll down to find the “Save Rules” section and select the rule created above.
Click on Save to record the change.
Integration Centre will be used to create MDF entries based upon Job Information records. Only the effective date and the employee ID will be pulled from Job Information – this will be used to make a “shell” MDF object that will then be populated with the budget percentage from the onSave business rule that we made above.
Navigate to the Integration Centre. Click on “+ Create” in the top right. Select “More Integration Types”
On the next page, select “Scheduled” for Trigger Type (although “None Selected” is also viable if you wish to just run the integration manually), set both Source Type and Destination Type to “SuccessFactors” and choose “OData v2” for Format. Click on “Create”.
On the next page, scroll down and select “Job Information (EmpJob)”:
And then click on “Select”, give the integration a name and then click “Next”. Click on the icon in the top right that looks like two plugs:
The screen that is then shown is broken into three panes. The left shows the Source object, the middle shows the Destination, and the right shows the Preview of the code. When you first start, both the Source and Destination are set to Job Information. We need to change the Destination to be the MDF object. To do this, select the Job Information object in the middle pane and then click on the Trash Can:
Next, click on the + icon in the middle pane and search for the MDF object. Select it and then click “Add”:
Note: if your object is not found, navigate to OData API Metadata Refresh and Export and refresh the Cache.
From the left pane, click and drag the “Start Date” field to the middle pane and drop it on the “effectiveStartDate” field. Repeat this process for the “User ID” field from the left to drop it on the “externalCode” field in the middle.
In the right pane, you should see a preview of the data that will be extracted.
Click on “Next”. On this page, it is possible to set up filters to limit the integration to certain employees (based on Job Information fields) or to control how the data is sorted. For this example, none of this is needed.
Click on “Next”. On this page, set the schedule as needed. Daily would probably be appropriate, but for this example, I chose “Once”.
Click on “Next”. Review the configuration; it should look like this:
If happy, click on “Run Now”. An email will be sent when complete. You can check the data that is created by navigating to Manage Data, selecting the MDF object, and viewing any of the records:
Setting up the Budget
With the challenging setup done, the budget configuration is quite straight-forward. In Compensation Home, open your template and go to the budgets screen. Here, change the budget to the following configuration:
The keys here are setting Based On to “user”, selecting the MDF object in the EC Field Mapping and changing the Base Custom Field to whatever the target column is (normally “curSalary”, but my example is using “meritTarget”, as it is set up for periodic planning rather than annual).
Also, map the “Budget Pct” column to the MDF field to remove the lookup table dependency (or remove it and the “Budget Contribution” columns, as they are both now superfluous)
Once you generate new worksheets, the budget will be shown as:
Notice the budget percentage shown now as the actual percentage, rather than as a meaningless 100%.
While the method described in this blog are somewhat complex, once set up, they are self-sustaining with the Integration Centre set on a schedule.
- Solves a customer problem
- Cleaner calculations
- Performance Increase
- Possible to have more than five drivers for budget percentage (there are no limits in the Business Rules Lookup() function)
- Additional data can be stored in the MDF object using this basic method
- Complex setup
- Depends on a schedule, so there could be a lag between the job and the worksheet when new employees join
- Processing time of Integration Centre
- Not possible with non-EC integrated templates
- Different way of loading budget percentages vs. other lookup tables
- Complex logic maybe needed for Business Rules to replicate wild card matching
Ultimately, it will depend on the client as to whether this process is worth the admittedly small benefit of seeing the budget percentage.