The Overcast Component does not provide any fine-grained business logic when executing a scenario. However, as you can see Overcast Components accessing backend data by reference, Enhancement Points are available. This page describes the Overcast Component Plugin concept as an enhancement point.
Apex Class templates can be found Overcast Component Plugin Template.
The timing at which each Plugin method is executed in a typical component (Non-Post type components, or components that are not "Auto Run") is shown in the sequence diagram.
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxMDUpLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=MZl1jXLoBsAdaTVbaTMzRKJrW3CStRe3~63~txtUmksiVi2XLMWe4dVJVBw6uU5~Jh-fV8iA1JWpLr2lEdJuMPrT3qpbdX5bqLix13l067f843xuTikLVKCgjo~Zcho-OYZENo1MNk5TInLV6DoHiW-qyb3y4wftmYtk3As3xlGWNVmonE78wtK6y00JdCww0IDsinZYXNZ5N9zz4~2pOSV~iNUKIeOAKLzyf-ipCqtDOsbTJNXRsjxt5lW8VGECXyVlTEHNybm2Q7hIXAPaQJ70xcR~wBXW-f7zf39AtQKuzvHo9XFpnYJIYnLTiqVm6cpVEXhXLldzV7iY00XgZw__&Key-Pair-Id=K2TK3EG287XSFC)
The Post component and components that are not "Auto Run" is the same as the sequence above when the scenario is executed, but each method of the plug-in is called even before the scenario is executed.
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxMDYpLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=AB67zuI4oWr0HaBeBTZCO3VwYNuBpl2JQofHLS0boR1We7H-7-WTbeSC7nJUxAz8zBDjVX6gj98bmNvfzzrWQHQF08mc9IwhVWKfxmftheAyYGbJ6xSwjec1uSfQqeYdJIWwdNcIhE8hiPZSNRlI477HLDr~k2Ty6MR-gwIVV-WuUo3~Px-ek4YEHMTPBMe-DdS7l7zRIyWwXjKXoaQ9Lqb9YVO7fGlhMge3X98WoXV7c1X0MX2boEIezmOy~p6MX-gjrrIbzXio3Bmjo4yPsxM6jAZgrortMGlvpiNZEJ-ccaJoqjF0-QsvZVF1qZPkev1blPcpvl9K5aodi9HkYg__&Key-Pair-Id=K2TK3EG287XSFC)
It is mainly implemented to modify the data before sending it to the backend.
e.g. When no value is passed to BAPI_SALESORDER_GETLIST.CUSTOMER_NUMBER, this BAPI will try to bring all the data. To prevent this, set the Dummy parameter if there is no data in CUSTOMER_NUMBER to prevent getting all the data.
global void beforeScenarioCall(Id recordId, Map<String, Object> referenceFieldValues, Map<String, Object> importParameters, Map<String, Object> settings) {
if (!importParameters.containsKey('BAPI_SALESORDER_GETLIST')) {
return;
}
Map<String,Object> getList = (Map<String,Object>)importParameters.get('BAPI_SALESORDER_GETLIST');
if (getList.containsKey('CUSTOMER_NUMBER') && String.isBlank((String)getList.get('CUSTOMER_NUMBER'))) {
getList.put('CUSTOMER_NUMBER', 'DUMMY_BP');
}
return;
}
It is mainly used to modify the data returned from Backend.
e.g. When the PO Number is empty, "-" will be displayed.
global void afterScenarioCall(Map<String, Object> returnedData, overcast.ComponentDefinition.Component cmp, Map<String, Object> settings) {
if (!returnedData.containsKey('SALES_ORDERS')) {
return;
}
List<Object> salesOrders = (List<Object>)returnedData.get('SALES_ORDERS');
for (Object salesOrder : salesOrders) {
Map<String,Object> orderMap = (Map<String,Object>)salesOrder;
if (String.isBlank((String)orderMap.get('PURCH_NO'))) {
orderMap.put('PURCH_NO', '-');
}
}
}
This method is mainly used to control the input of Filter and Post-based Components.
e.g. in SAP Sales Order List (sapSalesOrders) has 2 input field, and If you want to hide the MATERIAL filter only when it is executed on Opportunity.
global void afterComponentMetadataLoaded(Id recordId, overcast.ComponentDefinition.Component cmp) {
overcast.ComponentDefinition.Section section = cmp.findSection('BAPI_SALESORDER_GETLIST');
if (section == null) {
return;
}
overcast.ComponentDefinition.Field field = section.findField('MATERIAL');
if (field == null) {
return;
}
System.debug(recordId.getSObjectType().getDescribe().getName());
if (recordId.getSObjectType().getDescribe().getName() == 'Opportunity') {
field.display = false;
}
}
Result:
Run on Account:
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxNDEpLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=Uapzgp-W15iC5gNUFOLfTQBED~lgN38pXRN~W8-33k~VTGjRk-YApImB5b~QWTOk~GEX9U9MRNU60X3UEwajWt~LeiKmkIdTvBZFc~PEVo4tz92aF~h~h1JPv2lvw44kzvmkwOUYVm1QeddsdX3nh70IDB6oCGLnCXfePWyiYYddHgynsW3sd4oYkwf6zZAvocoBYAH2jy9REd0xsK7ZNDW1fkDyMANEhQtAA4WAC7~xRmNlAionUEMml~Dts0HUcoKyXGYsMEWAymaFlXBg1Zm~haW8AVNDdHLNveWwg79urVfJa5-IrQKnNoh6P5ZBK5X5VDtowA-m2S6URtyJ3Q__&Key-Pair-Id=K2TK3EG287XSFC)
Run on Opportunity
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxNDApLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=KWrYqF-Fx62AT6S8p2yZI1xQ9H5bddTzaORNWuqvR~jTYcX3~~uo2NQY4ql70PWTSUYnimlyrhW~OGAWuM0exBfnZwFndeYRT9OmdIQhBvEB2Op8ig3BiDsHs9d0-YBq-r5TkcH3W3Br3DZEjM1aMCGOLnXeabCx4guXCvoTuNBhx5MTNsTb~DEmqXuwY2ttZ5cfGRfKGf0e2b9w-dt341ejURjqRcsZ2O9I4mMnnvNh7xgJqJAZ3Kvw89ZtOIxO3KMMllHaZDnp7Lu~gFFH8jq7~xuF6n~KhlovzYvaMxtmy61-cnEIDnymr4gB1KDiK6WArwf9Ij6xMSsmpnsGqg__&Key-Pair-Id=K2TK3EG287XSFC)
Used when you want to dynamically add, remove, or change the value of ReferenceValues at runtime.
e.g. If you want to set default value (1400-100) to the MATERIAL field only when it is executed on Opportunity.
global void afterReferenceValuesLoaded(Id recordId, String componentName, Map<String, Map<String, Object>> referenceValues)
{
if (!referenceValues.containsKey('BAPI_SALESORDER_GETLIST')) {
return;
}
Map<String,Object> getList = referenceValues.get('BAPI_SALESORDER_GETLIST');
if (recordId.getSObjectType().getDescribe().getName() == 'Opportunity') {
if (!getList.containsKey('MATERIAL')) {
getList.put('MATERIAL', '1400-100');
}
}
return;
}
Result:
Run on Account
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxNDMpLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=Y24faakUzxvw19ItH852HgNK3A4IwPPkBpfkal1pchxqOn7fCuoTd4RyyBvOxeiftsYVtYut2O4Y6-Mo~B00a-H3fV9awbU-AKTPgoiVC377S8zj16pyhg3AGvnofMNynj9W5W3IVyIy2PVlcmDrWbhoTmadD5hSr9hCYLG8tBiCGENjf-z4QDqavS1JqRMgS6SZtkwXCClSx~U7z2q3RqdXGShaI3ZfRx4UqEdrQX8sMjZ4YclvExx2ayDhQSo1hWz8q9EqbXfsOxB8aLw367Bb7OOxbQ9DxdER1DV~fzhTFe8clKDj6ZotYM-ZzK36KnP0VS~2Hd5e0iY-aLIoow__&Key-Pair-Id=K2TK3EG287XSFC)
Run on Opportunity
.png?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kemY4dnF2MjRlcWhnLmNsb3VkZnJvbnQubmV0L3VzZXJmaWxlcy83NDg4LzMyMTM5L2NrZmluZGVyL2ltYWdlcy9xdS9pbWFnZSgxNDIpLnBuZyIsIkNvbmRpdGlvbiI6eyJEYXRlTGVzc1RoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTc2NTgzMDc3NH19fV19&Signature=Q42x90ZWhLR18t24CS07TCN0h5x~-LTJcOA9xsOb0dQiOVExeEORGmWGcN-fs1P-C6op4ul4oj0QyrdQvbIeEmhFxgvuB3bUTYXUXHUxZJn7sZdz87fu3g~klJ85ktob03OyxE1lnFfQ38qk4e3feYF6Xo1E04cxIUZesm1Exsj~WrUs0qTKRzzTqBpK-TpvUgKn4sif4Kv4j96NDIISJe2IJ229X0Gu7kLjvfkTCKmt9T4LeDuqcMgzOPOTnsRogvS5t4WD2d9GYbGhOpEgE2DVbBGfyNj1H1gHeYAN0RAm4mWqgkC1o7yoj-aI3QQgmePHvDT9-y4yYaeC6RnrFA__&Key-Pair-Id=K2TK3EG287XSFC)