---
title: Class (Apex)
slug: netsuite/9LBL-class-apex
description: Learn about the Apex class "BW_CreateNetSuiteCompany_Invokable" and its main method "execute" for processing requests in Flow. This document explains how the class creates a NetSuite customer, formats address fields, and makes API calls. Discover how the 
docTags: 
createdAt: 2022-02-22T20:03:12.000Z
---

:::CodeblockTabs
BW\_CreateNetSuiteCompany\_Invokable

```apex
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


```
:::

