Global API
Code Examples
Future vs Immediate
2min
future method is for when large or multiple records are created the code will run in the "future" and it queues the request this is used when you have more than one update occurring, such as when you have a header record with child records eg sales order with sales order transaction items the first example below shows the @future callout, and does not have a response section of invokable fields immediate, allows only single record creation however it also allows passing of return values such as the netsuite api response the second example below shows the @future method commented out, and the addition of response invokable fields you'll also notice the response is "wrapped" so it properly passes between objects note the inclusion of "list \<results>" instead of "void" and the methods both have return statements the response invokable values then become avaiable in the "advanced" section of the apex action in flow, and you can set variables with the values passed back from apex code example future method // start apex class public with sharing class createnscontactusingfuture { public createnscontactusingfuture() { } @invocablemethod(label='create netsuite contact' description='create netsuite contact' category='breadwinner') public static void createnetsuitecontactusingfuture(list\<requests> requestlist){ createnetsuitecontact(json serialize(requestlist)); } @future(callout = true) public static void createnetsuitecontact(string requestlistjson){ list\<requests> requestlist = (list\<requests>)json deserialize(requestlistjson, list\<requests> class); list\<object> netsuitecontactlist = new list\<object>(); for(requests req requestlist){ netsuitecontactlist add(generatenetsuitecontactmap(req)); } // sending request to netsuite via exposed global api map\<string, object> reqjsonmap = new map\<string, object>(); reqjsonmap put('contacts' , netsuitecontactlist); string reqjson = json serialize(reqjsonmap); map\<string, object> finalreqmap = new map\<string, object>(); finalreqmap put('version' , '1 0'); finalreqmap put('action' , 'createcontact'); finalreqmap put('requestjson' , reqjson); system debug('request ' + finalreqmap); map\<string, object> respmap = breadwinner ns breadwinnernetsuiteapi call(finalreqmap); system debug('response ' + respmap); } public class requests{ @invocablevariable(label='alternate email' description='alternate email') public string altemail; @invocablevariable(label='assistant' description='assistant') public string assistant; @invocablevariable(label='comments' description='comments') public string comments; @invocablevariable(label='billing street' description='billing street') public string billingstreet; @invocablevariable(label='shipping street' description='shipping street') public string shippingstreet; @invocablevariable(label='billing country' description='billing country') public string billingcountry; @invocablevariable(label='billing postal code' description='billing postal code') public string billingpostalcode; @invocablevariable(label='billing city' description='billing city') public string billingcity; @invocablevariable(label='billing state' description='billing state') public string billingstate; @invocablevariable(label='shipping country' description='shipping country') public string shippingcountry; @invocablevariable(label='shipping postal code' description='shipping postal code') public string shippingpostalcode; @invocablevariable(label='shipping city' description='shipping city') public string shippingcity; @invocablevariable(label='shipping state' description='shipping state') public string shippingstate; @invocablevariable(label='company' description='company') public string company; @invocablevariable(label='custom form' description='custom form') public string customform; @invocablevariable(label='email' description='email') public string email; @invocablevariable(label='external id' description='external id') public string externalid; @invocablevariable(label='fax' description='fax') public string fax; @invocablevariable(label='first name' description='first name') public string firstname; @invocablevariable(label='home phone' description='home phone') public string homephone; @invocablevariable(label='internalid' description='internalid') public string internalid; @invocablevariable(label='is inactive' description='is inactive') public boolean isinactive; @invocablevariable(label='is private' description='is private') public boolean isprivate; @invocablevariable(label='last name' description='last name') public string lastname; @invocablevariable(label='middle name' description='middle name') public string middlename; @invocablevariable(label='mobile phone' description='mobile phone') public string mobilephone; @invocablevariable(label='office phone' description='office phone') public string officephone; @invocablevariable(label='phone' description='phone') public string phone; @invocablevariable(label='salutation' description='salutation') public string salutation; @invocablevariable(label='subsidiary' description='subsidiary') public string subsidiary; @invocablevariable(label='title' description='title') public string title; } public static map\<string, object> generatenetsuitecontactmap(requests req){ map\<string, object> netsuitecontactmap = new map\<string, object>(); // assign values from the request to netsuite contact list\<object> addressbooklist = new list\<object>(); map\<string, object> billingaddressbook = new map\<string, object>(); map\<string, object> billingaddressbookaddress = new map\<string, object>(); if(req billingcity != null && string isnotblank(req billingcity)) billingaddressbookaddress put('city' , req billingcity); if(req billingstate != null && string isnotblank(req billingstate)) billingaddressbookaddress put('state' , req billingstate); if(req billingcountry != null && string isnotblank(req billingcountry)) billingaddressbookaddress put('country' ,req billingcountry); if(req billingpostalcode != null && string isnotblank(req billingpostalcode)) billingaddressbookaddress put('zip' , req billingpostalcode); billingaddressbook put('defaultbilling' , true); billingaddressbook put('isresidential' , true); if(req billingstreet != null && string isnotblank(req billingstreet)){ string billingaddr = string isnotblank(req billingstreet) ? req 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); } billingaddressbookaddress put('addr1' , billingaddr1); billingaddressbookaddress put('addr2' , billingaddr2); billingaddressbookaddress put('addr3' , billingaddr3); } billingaddressbook put('addressbookaddress', billingaddressbookaddress); addressbooklist add(billingaddressbook); map\<string, object> shippingaddressbookaddress = new map\<string, object>(); if(req shippingcity != null && string isnotblank(req shippingcity)) shippingaddressbookaddress put('city' , req shippingcity); if(req shippingstate != null && string isnotblank(req shippingstate)) shippingaddressbookaddress put('state' , req shippingstate); if(req shippingcountry != null && string isnotblank(req shippingcountry)) shippingaddressbookaddress put('country' ,req shippingcountry); if(req shippingpostalcode != null && string isnotblank(req shippingpostalcode)) shippingaddressbookaddress put('zip' , req shippingpostalcode); map\<string, object> shippingaddressbook = new map\<string, object>(); shippingaddressbook put('defaultshipping' , true); shippingaddressbook put('isresidential' , true); if(req shippingstreet != null && string isnotblank(req shippingstreet)){ string shippingaddr = string isnotblank(req shippingstreet) ? req 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); } shippingaddressbookaddress put('addr1' , shippingaddr1); shippingaddressbookaddress put('addr2' , shippingaddr2); shippingaddressbookaddress put('addr3' , shippingaddr3); } shippingaddressbook put('addressbookaddress', shippingaddressbookaddress); addressbooklist add(shippingaddressbook); // adding shipping and billing address list to map netsuitecontactmap put('addressbooklist',new map\<string,object>{'addressbook'=>addressbooklist}); if(req altemail != null) netsuitecontactmap put('altemail',req altemail); if(req assistant != null) netsuitecontactmap put('assistant',req assistant); if(req comments != null) netsuitecontactmap put('comments',req comments); if(req company != null) netsuitecontactmap put('company', new map\<string, object>{'internalid'=>req company}); if(req customform != null) netsuitecontactmap put('customform' ,new map\<string, object>{'internalid' => req customform}); if(req email != null) netsuitecontactmap put('email',req email); if(req externalid != null) netsuitecontactmap put('externalid',req externalid); if(req fax != null) netsuitecontactmap put('fax',req fax); if(req firstname != null) netsuitecontactmap put('firstname',req firstname); if(req homephone != null) netsuitecontactmap put('homephone',req homephone); if(req isinactive != null) netsuitecontactmap put('isinactive',req isinactive); if(req isprivate != null) netsuitecontactmap put('isprivate',req isprivate); if(req lastname != null) netsuitecontactmap put('lastname',req lastname); if(req middlename != null) netsuitecontactmap put('middlename',req middlename); if(req mobilephone != null) netsuitecontactmap put('mobilephone',req mobilephone); if(req officephone != null) netsuitecontactmap put('officephone',req officephone); if(req phone != null) netsuitecontactmap put('phone',req phone); if(req salutation != null) netsuitecontactmap put('salutation',req salutation); if(req subsidiary != null) netsuitecontactmap put('subsidiary', new map\<string, object>{'internalid'=>req subsidiary}); if(req title != null) netsuitecontactmap put('title',req title); return netsuitecontactmap; } } code example immediate with debug values // start apex class public with sharing class createnscontactwithdebug { public createnscontactwithdebug() { } @invocablemethod(label='create netsuite contact with api debug' description='create netsuite contact with api debug' category='breadwinner') public static list \<results> createnscontactwithdebug(list\<requests> requestlist){ return createnetsuitecontact(json serialize(requestlist)); } //not desired when api reponse requested @future(callout = true) public static list \<results> createnetsuitecontact(string requestlistjson){ list\<requests> requestlist = (list\<requests>)json deserialize(requestlistjson, list\<requests> class); list\<object> netsuitecontactlist = new list\<object>(); //create a results object to hold the return values results response = new results(); for(requests req requestlist){ netsuitecontactlist add(generatenetsuitecontactmap(req)); } // sending request to netsuite via exposed global api map\<string, object> reqjsonmap = new map\<string, object>(); reqjsonmap put('contacts' , netsuitecontactlist); string reqjson = json serialize(reqjsonmap); map\<string, object> finalreqmap = new map\<string, object>(); finalreqmap put('version' , '1 0'); finalreqmap put('action' , 'createcontact'); finalreqmap put('requestjson' , reqjson); system debug('request ' + finalreqmap); map\<string, object> respmap = breadwinner ns breadwinnernetsuiteapi call(finalreqmap); system debug('response ' + respmap); //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; //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='alternate email' description='alternate email') public string altemail; @invocablevariable(label='assistant' description='assistant') public string assistant; @invocablevariable(label='comments' description='comments') public string comments; @invocablevariable(label='billing street' description='billing street') public string billingstreet; @invocablevariable(label='shipping street' description='shipping street') public string shippingstreet; @invocablevariable(label='billing country' description='billing country') public string billingcountry; @invocablevariable(label='billing postal code' description='billing postal code') public string billingpostalcode; @invocablevariable(label='billing city' description='billing city') public string billingcity; @invocablevariable(label='billing state' description='billing state') public string billingstate; @invocablevariable(label='shipping country' description='shipping country') public string shippingcountry; @invocablevariable(label='shipping postal code' description='shipping postal code') public string shippingpostalcode; @invocablevariable(label='shipping city' description='shipping city') public string shippingcity; @invocablevariable(label='shipping state' description='shipping state') public string shippingstate; @invocablevariable(label='company' description='company') public string company; @invocablevariable(label='custom form' description='custom form') public string customform; @invocablevariable(label='email' description='email') public string email; @invocablevariable(label='external id' description='external id') public string externalid; @invocablevariable(label='fax' description='fax') public string fax; @invocablevariable(label='first name' description='first name') public string firstname; @invocablevariable(label='home phone' description='home phone') public string homephone; @invocablevariable(label='internalid' description='internalid') public string internalid; @invocablevariable(label='is inactive' description='is inactive') public boolean isinactive; @invocablevariable(label='is private' description='is private') public boolean isprivate; @invocablevariable(label='last name' description='last name') public string lastname; @invocablevariable(label='middle name' description='middle name') public string middlename; @invocablevariable(label='mobile phone' description='mobile phone') public string mobilephone; @invocablevariable(label='office phone' description='office phone') public string officephone; @invocablevariable(label='phone' description='phone') public string phone; @invocablevariable(label='salutation' description='salutation') public string salutation; @invocablevariable(label='subsidiary' description='subsidiary') public string subsidiary; @invocablevariable(label='title' description='title') public string title; } public class results { @invocablevariable(label='netsuiteresponse' description='results from netsuite api call') public string netsuiteresponse; } public static map\<string, object> generatenetsuitecontactmap(requests req){ map\<string, object> netsuitecontactmap = new map\<string, object>(); // assign values from the request to netsuite contact list\<object> addressbooklist = new list\<object>(); map\<string, object> billingaddressbook = new map\<string, object>(); map\<string, object> billingaddressbookaddress = new map\<string, object>(); if(req billingcity != null && string isnotblank(req billingcity)) billingaddressbookaddress put('city' , req billingcity); if(req billingstate != null && string isnotblank(req billingstate)) billingaddressbookaddress put('state' , req billingstate); if(req billingcountry != null && string isnotblank(req billingcountry)) billingaddressbookaddress put('country' ,req billingcountry); if(req billingpostalcode != null && string isnotblank(req billingpostalcode)) billingaddressbookaddress put('zip' , req billingpostalcode); billingaddressbook put('defaultbilling' , true); billingaddressbook put('isresidential' , true); if(req billingstreet != null && string isnotblank(req billingstreet)){ string billingaddr = string isnotblank(req billingstreet) ? req 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); } billingaddressbookaddress put('addr1' , billingaddr1); billingaddressbookaddress put('addr2' , billingaddr2); billingaddressbookaddress put('addr3' , billingaddr3); } billingaddressbook put('addressbookaddress', billingaddressbookaddress); addressbooklist add(billingaddressbook); map\<string, object> shippingaddressbookaddress = new map\<string, object>(); if(req shippingcity != null && string isnotblank(req shippingcity)) shippingaddressbookaddress put('city' , req shippingcity); if(req shippingstate != null && string isnotblank(req shippingstate)) shippingaddressbookaddress put('state' , req shippingstate); if(req shippingcountry != null && string isnotblank(req shippingcountry)) shippingaddressbookaddress put('country' ,req shippingcountry); if(req shippingpostalcode != null && string isnotblank(req shippingpostalcode)) shippingaddressbookaddress put('zip' , req shippingpostalcode); map\<string, object> shippingaddressbook = new map\<string, object>(); shippingaddressbook put('defaultshipping' , true); shippingaddressbook put('isresidential' , true); if(req shippingstreet != null && string isnotblank(req shippingstreet)){ string shippingaddr = string isnotblank(req shippingstreet) ? req 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); } shippingaddressbookaddress put('addr1' , shippingaddr1); shippingaddressbookaddress put('addr2' , shippingaddr2); shippingaddressbookaddress put('addr3' , shippingaddr3); } shippingaddressbook put('addressbookaddress', shippingaddressbookaddress); addressbooklist add(shippingaddressbook); // adding shipping and billing address list to map netsuitecontactmap put('addressbooklist',new map\<string,object>{'addressbook'=>addressbooklist}); if(req altemail != null) netsuitecontactmap put('altemail',req altemail); if(req assistant != null) netsuitecontactmap put('assistant',req assistant); if(req comments != null) netsuitecontactmap put('comments',req comments); if(req company != null) netsuitecontactmap put('company', new map\<string, object>{'internalid'=>req company}); if(req customform != null) netsuitecontactmap put('customform' ,new map\<string, object>{'internalid' => req customform}); if(req email != null) netsuitecontactmap put('email',req email); if(req externalid != null) netsuitecontactmap put('externalid',req externalid); if(req fax != null) netsuitecontactmap put('fax',req fax); if(req firstname != null) netsuitecontactmap put('firstname',req firstname); if(req homephone != null) netsuitecontactmap put('homephone',req homephone); if(req isinactive != null) netsuitecontactmap put('isinactive',req isinactive); if(req isprivate != null) netsuitecontactmap put('isprivate',req isprivate); if(req lastname != null) netsuitecontactmap put('lastname',req lastname); if(req middlename != null) netsuitecontactmap put('middlename',req middlename); if(req mobilephone != null) netsuitecontactmap put('mobilephone',req mobilephone); if(req officephone != null) netsuitecontactmap put('officephone',req officephone); if(req phone != null) netsuitecontactmap put('phone',req phone); if(req salutation != null) netsuitecontactmap put('salutation',req salutation); if(req subsidiary != null) netsuitecontactmap put('subsidiary', new map\<string, object>{'internalid'=>req subsidiary}); if(req title != null) netsuitecontactmap put('title',req title); return netsuitecontactmap; } }