Global API
...
Code Examples
Invokable Class for Flow
Class (Apex)
1min
BW_CreateNetSuiteCompany_Invokable
public class BW_CreateNetSuiteCompany_Invokable { @InvocableMethod(label='Create NetSuite Company' description='Creates NetSuite Companies invoked by Flow' category='Account') // The main method to be implemented. The Flow calls this at run time. public static List <Results> execute (List<Requests> requestList) { // Get the user input from the flow String testMode = requestList[0].testMode; String firstName = requestList[0].firstName; String lastName = requestList[0].lastName; String companyName = requestList[0].companyName; String accountNumber = requestList[0].AccountNumber; //accountNumber String phone = requestList[0].Phone; //phone String website = requestList[0].Website; //url String billingStreet = requestList[0].BillingStreet; String billingCity = requestList[0].BillingCity; String billingState = requestList[0].BillingState; String billingPostalCode = requestList[0].BillingPostalCode; String shippingStreet = requestList[0].ShippingStreet; String shippingCity = requestList[0].ShippingCity; String shippingState = requestList[0].ShippingState; String shippingPostalCode = requestList[0].ShippingPostalCode; String subsidiaryId = requestList[0].SubsidiaryID; //String taxNumber = requestList[0].taxNumber; //Example of custom Field SF: ncf_entity_tax_reg_no__c NS: custentity_tax_reg_no //Create a Results object to hold the return values Results response = new Results(); if (testMode == 'sendtonetsuite') { //using the testMode parameter filled with 'sendtonetsuite' is required for this class, as a security feature. You may want to remove this for production deploy. try{ List<Object> netSuiteCustomerList = new List<Object>(); Map<String, Object> netSuiteCustomerMap = new Map<String, Object>(); netSuiteCustomerMap.put('subsidiary', new Map<String, Object>{'internalId'=>'8'}); //subsidiaryId); //Assign value of Account to NetSuite Customer netSuiteCustomerMap.put('accountNumber',accountNumber); netSuiteCustomerMap.put('companyName',companyName); netSuiteCustomerMap.put('phone',phone); netSuiteCustomerMap.put('url',website); //netSuiteCustomerMap.put('custentity_tax_reg_no',taxNumber); //Custom Field example String billingAddr = String.isNotBlank(billingStreet) ? billingStreet : ''; String billingAddr1 = ''; String billingAddr2 = ''; String billingAddr3 = ''; if(billingAddr.length() >= 0 && billingAddr.length() <= 150){ billingAddr1 = billingAddr.substring(0,billingAddr.length()); }else if(billingAddr.length() > 150 && billingAddr.length() <= 300){ billingAddr1 = billingAddr.substring(0,150); billingAddr2 = billingAddr.substring(150,billingAddr.length()); }else if(billingAddr.length() > 300 && billingAddr.length() <= 450){ billingAddr1 = billingAddr.substring(0,150); billingAddr2 = billingAddr.substring(150,300); billingAddr3 = billingAddr.substring(300,billingAddr.length()); }else if(billingAddr.length() > 450){ billingAddr1 = billingAddr.substring(0,150); billingAddr2 = billingAddr.substring(150,300); billingAddr3 = billingAddr.substring(300,450); } Map<String, Object> billingAddrFieldMap = new Map<String, Object>(); billingAddrFieldMap.put('addr1' , billingAddr1); billingAddrFieldMap.put('addr2' , billingAddr2); billingAddrFieldMap.put('addr3' , billingAddr3); billingAddrFieldMap.put('city' , billingCity); billingAddrFieldMap.put('state' , billingState); billingAddrFieldMap.put('zip' , billingPostalCode); Map<String, Object> abaAddressForBillingMap = new Map<String, Object>(); abaAddressForBillingMap.put('addressbookAddress' , billingAddrFieldMap); String shippingAddr = String.isNotBlank(shippingStreet) ? shippingStreet : ''; String shippingAddr1 = ''; String shippingAddr2 = ''; String shippingAddr3 = ''; if(shippingAddr.length() >= 0 && shippingAddr.length() <= 150){ shippingAddr1 = shippingAddr.substring(0,shippingAddr.length()); }else if(shippingAddr.length() > 150 && shippingAddr.length() <= 300){ shippingAddr1 = shippingAddr.substring(0,150); shippingAddr2 = shippingAddr.substring(150,shippingAddr.length()); }else if(shippingAddr.length() > 300 && shippingAddr.length() <= 450){ shippingAddr1 = shippingAddr.substring(0,150); shippingAddr2 = shippingAddr.substring(150,300); shippingAddr3 = shippingAddr.substring(300,shippingAddr.length()); }else if(shippingAddr.length() > 450){ shippingAddr1 = shippingAddr.substring(0,150); shippingAddr2 = shippingAddr.substring(150,300); shippingAddr3 = shippingAddr.substring(300,450); } Map<String, Object> shippingAddrFieldMap = new Map<String, Object>(); shippingAddrFieldMap.put('addr1' , shippingAddr1); shippingAddrFieldMap.put('addr2' , shippingAddr2); shippingAddrFieldMap.put('addr3' , shippingAddr3); shippingAddrFieldMap.put('city' , shippingCity); shippingAddrFieldMap.put('state' , shippingState); shippingAddrFieldMap.put('zip' , shippingPostalCode); Map<String, Object> abaAddressForShippingMap = new Map<String, Object>(); abaAddressForShippingMap.put('addressbookAddress' , shippingAddrFieldMap); Map<String, Object> abBillingShippingMap = new Map<String, Object>(); abBillingShippingMap.put('addressbook' , new List<Object>{abaAddressForBillingMap,abaAddressForShippingMap}); netSuiteCustomerMap.put('addressbookList' , abBillingShippingMap); //Enable This Section for Custom Fields /* // Initializing the Custom Fields List<Object> custCustomFieldList = new List<Object>(); Map<String, Object> custCustomField1 = new Map<String, Object>(); custCustomField1.put('fieldType', 'string'); custCustomField1.put('scriptId', 'custentity_tax_reg_no'); custCustomField1.put('value', taxNumber); custCustomFieldList.add(custCustomField1); // Adding the Customer Custom Fields netSuiteCustomerMap.put('customFieldList', new Map<String, Object>{'customField'=>custCustomFieldList}); */ netSuiteCustomerList.add(netSuiteCustomerMap); Map<String, Object> reqJSONMap = new Map<String, Object>(); reqJSONMap.put('customers' , netSuiteCustomerList); String reqJSON = JSON.serialize(reqJSONMap); Map<String, Object> finalReqMap = new Map<String, Object>(); finalReqMap.put('version' , '1.0'); finalReqMap.put('action' , 'createCustomer'); finalReqMap.put('RequestJSON' , reqJSON); System.debug('Request ::: ' + finalReqMap); //Namespace should be same as breadwinner objects in this org //Map<String, Object> respMap = ns_rc_02.BreadwinnerNetSuiteAPI.call(finalReqMap); Map<String, Object> respMap = breadwinner_ns.BreadwinnerNetSuiteAPI.call(finalReqMap); System.debug('Response ::: ' + respMap); response.companyInternalId = 'Blank'; //Take the NetSuite response map and convert to single string String nsResponseString = ''; for(String key : respMap.keySet()){ if(nsResponseString.length() !=0){ nsResponseString += '::'; } nsResponseString += key + '=' + respMap.get(key); } response.netSuiteResponse = nsResponseString; } catch(Exception e) { System.debug('Exception Error ::: ' + e); response.netSuiteResponse = 'Exception: ' + e; } } //Only executes if test mode set correctly. This should be removed/reworked prior to production deploy. // Send return values to Flow //Add the return values to the Results object //response.outputMember = outputMember; response.testMode = testMode; response.firstName = 'name'; response.lastName = 'changes'; response.companyName = companyName; //Wrap the Results object in a List container //(an extra step added to allow this interface to also support bulkification) List<Results> responseWrapper= new List<Results>(); responseWrapper.add(response); return responseWrapper; } public class Requests { //@InvocableVariable(label='Records for Input' description='Creates NetSuite Companies invoked by Flow' required=false) //public List<SObject> inputCollection; @InvocableVariable(label='testMode') public string testMode; @InvocableVariable(label='firstName') public string firstName; @InvocableVariable(label='lastName') public string lastName; @InvocableVariable(label='companyName') public string companyName; @InvocableVariable(label='AccountNumber') public string AccountNumber; @InvocableVariable(label='Phone') public string Phone; @InvocableVariable(label='Website') public string Website; @InvocableVariable(label='BillingStreet') public string BillingStreet; @InvocableVariable(label='BillingCity') public string BillingCity; @InvocableVariable(label='BillingState') public string BillingState; @InvocableVariable(label='BillingPostalCode') public string BillingPostalCode; @InvocableVariable(label='ShippingStreet') public string ShippingStreet; @InvocableVariable(label='ShippingCity') public string ShippingCity; @InvocableVariable(label='ShippingState') public string ShippingState; @InvocableVariable(label='ShippingPostalCode') public string ShippingPostalCode; @InvocableVariable(label='SubsidiaryId') public string SubsidiaryId; //Custom Field Example /* @InvocableVariable(label='taxNumber') public string taxNumber; */ } public class Results { //@InvocableVariable(label='Records for Output' description='Creates NetSuite Companies invoked by Flow' required=false) //public SObject outputMember; @InvocableVariable(label='testMode') public string testMode; @InvocableVariable(label='firstName') public string firstName; @InvocableVariable(label='lastName') public string lastName; @InvocableVariable(label='companyName') public string companyName; @InvocableVariable(label='companyInternalId') public string companyInternalId; @InvocableVariable(label='netSuiteResponse') public string netSuiteResponse; } } //Original from: https://mukulmahawariya11.medium.com/calling-invocable-apex-from-flow-838879a332f7 //Retooled for standard @invokable according to SF Docs: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_annotation_InvocableMethod.htm


Updated 03 Mar 2023
Did this page help you?