---
title: Class (Apex)
slug: netsuite/ZkGb-class-apex
description: Learn how to use the Apex class included in this document to create NetSuite Sales Orders in Salesforce. The class features a method that initiates an API call to create sales orders, with a response returned for further processing. You will also discover
docTags: 
createdAt: 2022-05-13T10:51:48.000Z
---



:::CodeblockTabs
```apex
// Start Apex Class
public with sharing class createNSSalesOrderRunAsync {
    public createNSSalesOrderRunAsync() {
    }

    @InvocableMethod(label='Create NetSuite Sales Order' description='Create NetSuite Sales Order')
    public static List<Response> createNetSuiteSalesOrder(List<Requests> requestList){
        List<Response> resToBeReturnedList = new List<Response>();
        List<Object> netSuiteSalesOrderList = new List<Object>();

        for(Requests req : requestList){
            netSuiteSalesOrderList.add(generateNetSuiteSalesOrderMap(req));
        }
        // Sending request to NetSuite via exposed Global API
        Map<String, Object> reqJSONMap = new Map<String, Object>(); 
        reqJSONMap.put('salesOrders' , netSuiteSalesOrderList);
        String reqJSON = JSON.serialize(reqJSONMap); 

        Map<String, Object> finalReqMap = new Map<String, Object>(); 
        finalReqMap.put('version' , '1.0'); 
        finalReqMap.put('action' , 'createSalesOrder');
        finalReqMap.put('RequestJSON' , reqJSON); 
        System.debug('Request ::: ' + finalReqMap); 
        
        Map<String, Object> respMap = breadwinner_ns.BreadwinnerNetSuiteAPI.call(finalReqMap);
        System.debug('Response ::: ' + respMap);
        
        Map<String,Object> soResponseJSONMap = (Map<String,Object>)JSON.deserializeUntyped((String)respMap.get('responseJSON'));

        Response responseReturn = new Response();
        if(soResponseJSONMap !=NULL && soResponseJSONMap.containskey('status') && soResponseJSONMap.get('status')!=null){
            responseReturn.statusCode = (String)soResponseJSONMap.get('status');
        }
        
        if(soResponseJSONMap !=NULL && soResponseJSONMap.containskey('salesOrders') && soResponseJSONMap.get('salesOrders')!=null){
            List<Object> soObj = (List<Object>)soResponseJSONMap.get('salesOrders');
            Map<String,Object> savedSO = (Map<String,Object>)soObj[0];
            responseReturn.recordId = (String)savedSO.get('salesforceID');
        }
            
        
         if(soResponseJSONMap !=NULL && soResponseJSONMap.containskey('errors') && soResponseJSONMap.get('errors')!=null){
            
            responseReturn.error = JSON.serialize((List<Object>)soResponseJSONMap.get('errors'));
        }
        resToBeReturnedList.add(responseReturn);
        //sendReqFuture(JSON.serialize(finalReqMap));

        return resToBeReturnedList;
    }
    
    /*@future(callout = true)
    public static void sendReqFuture(String jsonString){
        Map<String, Object> finalReqMap = (Map<String, Object>)JSON.deserializeUntyped(jsonString);
        Map<String, Object> respMap = breadwinner_ns.BreadwinnerNetSuiteAPI.call(finalReqMap);
        System.debug('Response ::: ' + respMap);
    }*/

    public class Requests{
      @InvocableVariable(label='Class' description='Class')
      public String classification; //lookup

      @InvocableVariable(label='Created From' description='Created From') 
      public String createdFrom; //lookup

      @InvocableVariable(label='Currency' description='Currency')
      public String currencyRecord; //lookup

      @InvocableVariable(label='Custom Form' description='Custom Form')
      public String customForm; //lookup

      @InvocableVariable(label='Department' description='Department')
      public String department; //lookup
      
      @InvocableVariable(label='Location' description='Location')
      public String location; //lookup

      @InvocableVariable(label='Discount Item' description='Discount Item')
      public String discountItem; //lookup

      @InvocableVariable(label='Discount Rate' description='Discount Rate')
      public String discountRate;

      @InvocableVariable(label='Discount Total' description='Discount Total')
      public Double discountTotal;

      @InvocableVariable(label='Entity' description='Entity')
      public String entity;//lookup

      @InvocableVariable(label='Exchange Rate' description='Exchange Rate')
      public Double exchangeRate;

      @InvocableVariable(label='External Id' description='External Id')
      public String externalId;

      @InvocableVariable(label='Handling Cost' description='Handling Cost')
      public Double handlingCost;

      @InvocableVariable(label='Memo' description='Memo')
      public String memo;

      @InvocableVariable(label='Other Ref Num Id' description='Other Ref Num Id')
      public String otherRefNum;

      @InvocableVariable(label='Sales Rep' description='Sales Rep')
      public String salesRep;

      @InvocableVariable(label='Shipping Cost' description='Shipping Cost')
      public Double shippingCost;

      @InvocableVariable(label='Status' description='Status')
      public String status;

      @InvocableVariable(label='Sub Total Cost' description='Sub Total Cost')
      public Double subTotal;

      @InvocableVariable(label='Subsidiary' description='Subsidiary')
      public String subsidiary;

      @InvocableVariable(label='Tax Total' description='Tax Total')
      public Double taxTotal;

      @InvocableVariable(label='Total' description='Total')
      public Double total;

      @InvocableVariable(label='Tran Date' description='Tran Date')
      public DateTime tranDate;

      @InvocableVariable(label='Tran Id' description='Tran Id')
      public String tranId;

      //Sales Order Line items
      @InvocableVariable(label='Sales Order Line Items' description='Sales Order Line Items') 
      public List<SObject> soLines;

      @InvocableVariable(label='Line Description' description='Line Description')
      public String lineDescription; 

      @InvocableVariable(label='Line Unit Amount' description='Line Unit Amount')
      public String lineUnitAmount;

      @InvocableVariable(label='Line Quantity' description='Line Quantity')
      public String lineQuantity; 

      @InvocableVariable(label='Line Department' description='Line Department')
      public String lineDepartment; //lookup

       @InvocableVariable(label='Line Gross Amt' description='Line Gross Amt')
       public String GrossAmt;

       @InvocableVariable(label='Line Item' description='Line Item')
       public String Items;

       @InvocableVariable(label='Line Number' description='Line Number')
       public String Line;

       @InvocableVariable(label='Line Location' description='Line Location')
       public String lineLocation;

       @InvocableVariable(label='Line Price' description='Line Price')
       public String Price;

       @InvocableVariable(label='Line Rate' description='Line Rate')
       public String Rate;

       @InvocableVariable(label='Line RevRec EndDate' description='Line RevRec EndDate')
       public String RevRecEndDate;

       @InvocableVariable(label='Line RevRec Schedule' description='Line RevRec Schedule')
       public String RevRecSchedule;

       @InvocableVariable(label='Line RevRec StartDate' description='Line RevRec StartDate')
       public String RevRecStartDate;

       @InvocableVariable(label='Line Tax1 Amt' description=' Line Tax1 Amt')
       public String Tax1Amt;

       @InvocableVariable(label='Line Tax Code' description='Line Tax Code')
       public String TaxCode;

       @InvocableVariable(label='Line Tax Rate1' description='Line Tax Rate1')
       public String TaxRate1;

  }
    public class Response{
        @InvocableVariable(label='status Code' description='Status of the request')
        public string statusCode;

        @InvocableVariable(label='SF Record Id' description='SF Record Id')
        public Id recordId;

        @InvocableVariable(label='Error' description='Error')
        public string error;
    }

    public static Map<String, Object> generateNetSuiteSalesOrderMap(Requests req){
        Map<String, Object> netSuiteSalesOrderMap = new Map<String, Object>(); 
        // Assign values from the Request to NetSuite Sales Order

     If(req.classification != NULL)
        netSuiteSalesOrderMap.put('classification', new Map<String, Object>{'internalId'=>req.classification});

     If(req.currencyRecord != NULL)
        netSuiteSalesOrderMap.put('currencyRecord', new Map<String, Object>{'internalId'=>req.currencyRecord});

     If(req.customForm != NULL)
        netSuiteSalesOrderMap.put('customForm', new Map<String, Object>{'internalId'=>req.customForm});

     If(req.createdFrom != NULL)
        netSuiteSalesOrderMap.put('createdFrom', new Map<String, Object>{'internalId'=>req.createdFrom});

     If(req.department != null)
        netSuiteSalesOrderMap.put('department', new Map<String, Object>{'internalId'=>req.department});
        
     If(req.location != null)
        netSuiteSalesOrderMap.put('location', new Map<String, Object>{'internalId'=>req.location});

     If(req.discountItem != NULL)
        netSuiteSalesOrderMap.put('discountItem', new Map<String, Object>{'internalId'=>req.discountItem});

     If(req.discountRate != NULL)
        netSuiteSalesOrderMap.put('discountRate',req.discountRate); 

     If(req.discountTotal != NULL)
        netSuiteSalesOrderMap.put('discountTotal',req.discountTotal);

     If(req.entity != NULL)
        netSuiteSalesOrderMap.put('entity', new Map<String, Object>{'internalId'=>req.entity});

     If(req.exchangeRate != NULL)
        netSuiteSalesOrderMap.put('exchangeRate',req.exchangeRate);

     If(req.externalId != NULL)
        netSuiteSalesOrderMap.put('externalId',req.externalId);

     If(req.handlingCost != NULL)
        netSuiteSalesOrderMap.put('handlingCost',req.handlingCost);

     If(req.memo != NULL)
        netSuiteSalesOrderMap.put('memo',req.memo); 

     If(req.otherRefNum != NULL)
        netSuiteSalesOrderMap.put('otherRefNum',req.otherRefNum); 

     If(req.salesRep != NULL)
        netSuiteSalesOrderMap.put('salesRep', new Map<String, Object>{'internalId'=>req.salesRep}); 

     If(req.shippingCost != NULL)
        netSuiteSalesOrderMap.put('shippingCost',req.shippingCost);

     If(req.status != NULL)
        netSuiteSalesOrderMap.put('status',req.status);

     If(req.subTotal != NULL)
        netSuiteSalesOrderMap.put('subTotal',req.subTotal);

     If(req.subsidiary != NULL)
        netSuiteSalesOrderMap.put('subsidiary', new Map<String, Object>{'internalId'=>req.subsidiary});

     If(req.taxTotal != NULL)
        netSuiteSalesOrderMap.put('taxTotal',req.taxTotal);

     If(req.total != NULL)
        netSuiteSalesOrderMap.put('total',req.total);

     if(req.tranDate != null){
        netSuiteSalesOrderMap.put('tranDate',req.tranDate.getTime()/1000);
       } 
     If(req.tranId != NULL)
        netSuiteSalesOrderMap.put('tranId',req.tranId);

         if(!(req.soLines).isEmpty()){
         // Initializing the Sales Order Line Items 
         List<Object> lineItemList = new List<Object>(); 
             for(SObject sobj : req.soLines){ 
                 Map<String, Object> lineItemMap = new  Map<String, Object>();  
                 if(req.lineDescription != null){   
                     lineItemMap.put('description', sobj.get(req.lineDescription)); 
                 }
                 if(req.lineUnitAmount != null){
                     lineItemMap.put('amount', sobj.get(req.lineUnitAmount));
                 }
                 if(req.lineQuantity != null){
                     lineItemMap.put('quantity', sobj.get(req.lineQuantity));
                 }
                 if(req.lineDepartment != null)
                    lineItemMap.put('department' , new Map<String, Object>{'internalId' => sobj.get(req.lineDepartment)}); 

                 if(req.GrossAmt != null)
                    lineItemMap.put('grossAmt', sobj.get(req.GrossAmt));

                 if(req.Items != null)
                     lineItemMap.put('item' , new Map<String, Object>{'internalId' => sobj.get(req.Items)});

                 if(req.Line != null)
                    lineItemMap.put('line', sobj.get(req.Line));

                 if(req.lineLocation != null)
                     lineItemMap.put('location' , new Map<String, Object>{'internalId' => sobj.get(req.lineLocation)});

                 if(req.Price != null)
                   lineItemMap.put('price' , new Map<String, Object>{'internalId' => sobj.get(req.Price)});

                 if(req.Rate != null)
                    lineItemMap.put('rate', String.valueOf(sobj.get(req.Rate)));

                 if(req.RevRecStartDate != null){
                    DateTime getStartDate = DateTime.valueOf(sobj.get(req.RevRecStartDate));
                    lineItemMap.put('revRecStartDate', getStartDate.getTime()/1000);
                  }

                 if(req.RevRecEndDate  != null){
                    DateTime getEndDate = DateTime.valueOf(sobj.get(req.RevRecEndDate));
                    lineItemMap.put('revRecEndDate', getEndDate.getTime()/1000);
                  }

                 if(req.RevRecSchedule != null)
                     lineItemMap.put('revRecSchedule', new Map<String, Object>{'internalId' => sobj.get(req.RevRecSchedule)});

                 if(req.Tax1Amt != null)
                    lineItemMap.put('tax1Amt', sobj.get(req.Tax1Amt));

                 if(req.TaxCode != null)
                    lineItemMap.put('taxCode' , new Map<String, Object>{'internalId' => sobj.get(req.TaxCode)});

                 if(req.TaxRate1 != null)
                    lineItemMap.put('taxRate1', sobj.get(req.TaxRate1));

                 lineItemList.add(lineItemMap); 
           }
                 // Adding the Line Items to Sales Order 
                 Map<String, Object> LineItemObjMap  = new Map<String, Object>(); 
                 LineItemObjMap .put('item',lineItemList);
                 netSuiteSalesOrderMap.put('itemList',LineItemObjMap );
       }
        return netSuiteSalesOrderMap;
   }
 }
```

Apex Test

```apex
// Start Apex Test Class
@isTest
private class createNSSalesOrderRunAsyncTest{
      @isTest
      static void BW_createSalesOrder(){
         List<createNSSalesOrderRunAsync.Requests> requestList = new List<createNSSalesOrderRunAsync.Requests>(); 
         createNSSalesOrderRunAsync.Requests req = new createNSSalesOrderRunAsync.Requests(); 
         List<SObject> soLines = new List<SObject>(); 
         OpportunityLineItem opp = new OpportunityLineItem();
         opp.Description = 'Qualification';
         opp.UnitPrice = 1;
         opp.Quantity = 1;
         soLines.add(opp);

         req.classification='class';
         req.currencyRecord='test';
         req.customForm='type';
         req.createdFrom='form';
         req.department='Name';
         req.Items='Name';
         req.TaxRate1='Name';
         req.TaxCode='Name';
         req.Tax1Amt='Name';
         req.RevRecSchedule='Name';
         req.Rate='Name';
         req.Price='Name';
         req.Location='Name';
         req.Line='Name';
         req.GrossAmt='Name';
         req.discountItem='test';
         req.discountRate='10';
         req.discountTotal=100;
         req.entity='entity';
         req.exchangeRate=10;
         req.externalId='id';
         req.handlingCost=15;
         req.memo='memo';
         req.otherRefNum='other';
         req.salesRep='salesrep';
         req.shippingCost=100;
         req.status='staus';
         req.subTotal=10;
         req.subsidiary='sub';
         req.taxTotal=5;
         req.total=100;
         req.tranId='tranid';
         req.soLines = soLines;
         req.lineDescription='Description';
         req.lineUnitAmount='UnitPrice';
         req.lineQuantity='Quantity';
         req.lineDepartment='Name';
         req.lineLocation='Name';
         requestList.add(req); 
         createNSSalesOrderRunAsync.createNetSuiteSalesOrder(requestList);
     }
}

```
:::













﻿





