---
title: Invoice Flow (Apex)
slug: netsuite/invoice-flow-apex
docTags: 
createdAt: 2025-05-20T14:00:09.754Z
---

```apex

// Start Apex Class
public with sharing class createNSInvoiceRunAsync {
    public createNSInvoiceRunAsync() {
    }

@InvocableMethod(label='Create NetSuite Invoice' description='Create NetSuite Invoice')
public static List<Response> createNetSuiteInvoice(List<Requests> requestList){
        List<Response> resToBeReturnedList = new List<Response>();
        List<Object> netSuiteInvoiceList = new List<Object>();

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

        Map<String, Object> finalReqMap = new Map<String, Object>(); 
        finalReqMap.put('version' , '1.0'); 
        finalReqMap.put('action' , 'createInvoice');
        finalReqMap.put('RequestJSON' , reqJSON); 
        System.debug('Request ::: ' + finalReqMap); 

        Map<String, Object> respMap = breadwinner_ns.BreadwinnerNetSuiteAPI.call(finalReqMap);
        System.debug('Response ::: ' + respMap);

        return resToBeReturnedList;
    }

    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='Due Date' description='Due Date')
      public DateTime dueDate;

      @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='Location' description='Location')
      public String location; //lookup

      @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;

      //Invoice Line items
      @InvocableVariable(label='Invoice Line Items' description='Invoice Line Items') 
      public List<SObject> invLines;

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

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

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

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

       @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 Quantity' description='Line Quantity')
      public String lineQuantity; 

       @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> generateNetSuiteInvoiceMap(Requests req){
        Map<String, Object> netSuiteInvoiceMap = new Map<String, Object>(); 
        // Assign values from the Request to NetSuite Invoice

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

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

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

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

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

      If(req.dueDate != null) {
      netSuiteInvoiceMap.put('dueDate', req.dueDate.getTime()/1000);
      }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

         if(!(req.invLines).isEmpty()){
             // Initializing the Invoice Line Items 
             List<Object> lineItemList = new List<Object>(); 
             for(SObject sobj : req.invLines){ 
                 Map<String, Object> lineItemMap = new  Map<String, Object>();  
                 if(req.lineAmount != null)
                     lineItemMap.put('amount', sobj.get(req.lineAmount));

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

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

                 if(req.lineDescription != null)
                     lineItemMap.put('description', sobj.get(req.lineDescription));

                 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.lineQuantity != null)
                     lineItemMap.put('quantity', sobj.get(req.lineQuantity));

                 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 Invoice
             Map<String, Object> LineItemObjMap  = new Map<String, Object>(); 
             LineItemObjMap.put('item',lineItemList);
             netSuiteInvoiceMap.put('itemList',LineItemObjMap);

         }
         return netSuiteInvoiceMap;
     }
 }
```

