@fye/netsuite-client

Generic functionality for connecting to NetSuite Web Services from Node

Usage no npm install needed!

<script type="module">
  import fyeNetsuiteClient from 'https://cdn.skypack.dev/@fye/netsuite-client';
</script>

README

Netsuite Client

This package contains functionality for connecting to NetSuite Web Services from Node, handling token authorization and SOAP XML parsing.

Install

npm install @fye/netsuite-client

Use in your node app

Import

const { NetSuiteClient } = require('netsuite-client');

Instantiate

When instatiating your netsuite client object, you'll need to provide a config object with connection details. See netsuite-config-template.json in the ../__tests__/functional folder.

const netsuiteConfig = {
  // various properties
  // see netsuite-config-template.json
  // or the defaultConfig in netsuite-client.js
};
netsuiteConfig.bodyFieldsOnly = false;
const netsuiteClient = new NetSuiteClient(netsuiteConfig);

Get a SalesOrder record and view its properties

const soExternalId;  // SFCC order id
const netsuiteSalesOrder = await netsuiteClient.getSalesOrder({externalId: soExternalId});
console.log(`orderStatus: ${netsuiteSalesOrder.orderStatus}`);
console.log(`internalId: ${netsuiteSalesOrder.internalId}`);
console.log(`externalId: ${netsuiteSalesOrder.externalId}`);
console.log(`customerName: ${netsuiteSalesOrder.customerName}`);
console.log(`orderTrackingUrl: ${netsuiteSalesOrder.orderTrackingUrl}`);
// ...
const netsuiteSalesOrderShipping = netsuiteSalesOrder.shipping;
console.log(`address: ${netsuiteSalesOrderShipping.address}`);
console.log(`quantity: ${netsuiteSalesOrderShipping.quantity}`);
console.log(`date: ${netsuiteSalesOrderShipping.date}`);
console.log(`method: ${netsuiteSalesOrderShipping.method}`);
console.log(`trackingNumber: ${netsuiteSalesOrderShipping.trackingNumber}`);
// ...
const netsuiteSalesOrderBilling = netsuiteSalesOrder.billing;
console.log(`address: ${netsuiteSalesOrderBilling.address}`);
console.log(`paymentMethod: ${netsuiteSalesOrderBilling.paymentMethod}`);
console.log(`creditCardNumber: ${netsuiteSalesOrderBilling.creditCardNumber}`);
console.log(`creditCardExpirationDate: ${netsuiteSalesOrderBilling.creditCardExpirationDate}`);
console.log(`creditCardProcessor: ${netsuiteSalesOrderBilling.creditCardProcessor}`);
// ...
const products = netsuiteSalesOrder.products;
products.forEach(netsuiteSalesOrderProduct => {
  console.log(`internalId: ${netsuiteSalesOrderProduct.internalId}`);
  console.log(`name: ${netsuiteSalesOrderProduct.name}`);
  console.log(`description: ${netsuiteSalesOrderProduct.description}`);
  console.log(`quantity: ${netsuiteSalesOrderProduct.quantity}`);
  console.log(`purchaseOrderInternalId: ${netsuiteSalesOrderProduct.purchaseOrderInternalId}`);
  // ...
});
const discounts = netsuiteSalesOrder.discounts;
products.forEach(netsuiteSalesOrderDiscount => {
  console.log(`internalId: ${netsuiteSalesOrderDiscount.internalId}`);
  console.log(`name: ${netsuiteSalesOrderDiscount.name}`);
  console.log(`description: ${netsuiteSalesOrderDiscount.description}`);
  console.log(`amount: ${netsuiteSalesOrderDiscount.amount}`);
  console.log(`grossAmount: ${netsuiteSalesOrderDiscount.grossAmount}`);
  // ...
});
const taxes = netsuiteSalesOrder.taxes;
taxes.forEach(netsuiteSalesOrderTax => {
  console.log(`taxTypeName: ${netsuiteSalesOrderTax.taxTypeName}`);
  console.log(`netAmount: ${netsuiteSalesOrderTax.netAmount}`);
  console.log(`taxBasis: ${netsuiteSalesOrderTax.taxBasis}`);
  console.log(`taxRate: ${netsuiteSalesOrderTax.taxRate}`);
  console.log(`taxAmount: ${netsuiteSalesOrderTax.taxAmount}`);
  // ...
});
// call the netsuiteSalesOrder.dump() method to see all of the properties

Search for SalesOrders

// Search for sales orders on November 12th, 2019 with a status of Billed
const fromDate = new Date('2019-11-11T21:00:00.000-08:00');
const toDate = new Date('2019-11-11T21:00:00.000-08:00');
const status = netSuiteSalesOrderStatus.BILLED;
const orders = await netsuiteClient.searchForSalesOrders({fromDate, toDate, status});
orders.forEach(netsuiteSalesOrder => {
  netsuiteSalesOrder.dump();
});

Update a SalesOrder

// Update the transaction date to today's date
const soExternalId;  // SFCC order id
const newTransactionDate = new Date();
let updateValues = [{ name: 'tranDate', value: newTransactionDate.toISOString() }];
let response = await netsuiteClient.updateSalesOrder({ soExternalId, updateValues });

Get a PurchaseOrder record and view its properties

const poInternalId;  // purchase order's internal id
const netsuitePurchaseOrder = await netsuiteClient.getPurchaseOrder(poInternalId);
console.log(`internalId: ${netsuitePurchaseOrder.internalId}`);
console.log(`createdDate: ${netsuitePurchaseOrder.createdDate}`);
console.log(`lastModifiedDate: ${netsuitePurchaseOrder.lastModifiedDate}`);
console.log(`memo: ${netsuitePurchaseOrder.memo}`);
console.log(`status: ${netsuitePurchaseOrder.status}`);
// ...
const netsuitePurchaseOrderVendor = netsuitePurchaseOrder.vendor;
console.log(`billingAddress: ${netsuitePurchaseOrderVendor.billingAddress}`);
console.log(`internalId: ${netsuitePurchaseOrderVendor.internalId}`);
console.log(`name: ${netsuitePurchaseOrderVendor.name}`);
console.log(`orderId: ${netsuitePurchaseOrderVendor.orderId}`);
const netsuitePurchaseOrderShipping = netsuitePurchaseOrder.shipping;
console.log(`address: ${netsuitePurchaseOrderShipping.address}`);
console.log(`date: ${netsuitePurchaseOrderShipping.date}`);
console.log(`method: ${netsuitePurchaseOrderShipping.method}`);
console.log(`trackingNumber: ${netsuitePurchaseOrderShipping.trackingNumber}`);
const products = netsuitePurchaseOrder.products;
products.forEach(netsuitePurchaseOrderProduct => {
  console.log(`internalId: ${netsuitePurchaseOrderProduct.internalId}`);
  console.log(`name: ${netsuitePurchaseOrderProduct.name}`);
  console.log(`description: ${netsuitePurchaseOrderProduct.description}`);
  console.log(`quantity: ${netsuitePurchaseOrderProduct.quantity}`);
  console.log(`quantityReceived: ${netsuitePurchaseOrderProduct.quantityReceived}`);
  // ...
});
const expenses = netsuitePurchaseOrder.expenses;
expenses.forEach(netsuitePurchaseOrderExpense => {
  console.log(`internalId: ${netsuitePurchaseOrderExpense.internalId}`);
  console.log(`name: ${netsuitePurchaseOrderExpense.name}`);
  console.log(`amount: ${netsuitePurchaseOrderExpense.amount}`);
  console.log(`grossAmount: ${netsuitePurchaseOrderExpense.grossAmount}`);
  console.log(`locationName: ${netsuitePurchaseOrderExpense.locationName}`);
  // ...
});
// call the netsuitePurchaseOrder.dump() method to see all of the properties

Search for PurchaseOrders

// Find all of the purchase orders for a given sales order
const soInternalId;  // sales order's internal id
const orders = await netsuiteClient.searchForPurchaseOrders(soInternalId);
orders.forEach(netsuitePurchaseOrder => {
  netsuitePurchaseOrder.dump();
});

Get an ItemFulfillment record and view its properties

const ifInternalId;  // item fulfillment's internal id
const netsuiteItemFulfillment = await netsuiteClient.getItemFulfillment(ifInternalId);
console.log(`internalId: ${netsuiteItemFulfillment.internalId}`);
console.log(`createdDate: ${netsuiteItemFulfillment.createdDate}`);
console.log(`lastModifiedDate: ${netsuiteItemFulfillment.lastModifiedDate}`);
console.log(`memo: ${netsuiteItemFulfillment.memo}`);
console.log(`customerName: ${netsuiteItemFulfillment.customerName}`);
// ...
const netsuiteItemFulfillmentShipping = netsuiteItemFulfillment.shipping;
console.log(`address: ${netsuiteItemFulfillmentShipping.address}`);
console.log(`method: ${netsuiteItemFulfillmentShipping.method}`);
console.log(`status: ${netsuiteItemFulfillmentShipping.status}`);
const products = netsuiteItemFulfillment.products;
products.forEach(netsuiteItemFulfillmentProduct => {
  console.log(`internalId: ${netsuiteItemFulfillmentProduct.internalId}`);
  console.log(`name: ${netsuiteItemFulfillmentProduct.name}`);
  console.log(`description: ${netsuiteItemFulfillmentProduct.description}`);
  console.log(`quantity: ${netsuiteItemFulfillmentProduct.quantity}`);
  console.log(`vendorName: ${netsuiteItemFulfillmentProduct.vendorName}`);
  // ...
});
const packages = netsuiteItemFulfillment.packages;
packages.forEach(netsuiteItemFulfillmentPackage => {
  console.log(`weight: ${netsuiteItemFulfillmentPackage.weight}`);
  console.log(`description: ${netsuiteItemFulfillmentPackage.description}`);
  console.log(`trackingNumber: ${netsuiteItemFulfillmentPackage.trackingNumber}`);
});
// call the netsuiteItemFulfillment.dump() method to see all of the properties

Search for ItemFulfillments

// Find all of the item fulfillments for a given sales order
const soInternalId;  // sales order's internal id
const itemFulfillments = await netsuiteClient.searchForItemFulfillments(soInternalId);
itemFulfillments.forEach(netsuiteItemFulfillment => {
  netsuiteItemFulfillment.dump();
});

Get a CashSale record and view its properties

const csInternalId;  // cash sales's internal id
const netsuiteCashSale = await netsuiteClient.getCashSale(csInternalId);
console.log(`internalId: ${netsuiteCashSale.internalId}`);
console.log(`transactionDate: ${netsuiteCashSale.transactionDate}`);
console.log(`memo: ${netsuiteCashSale.memo}`);
console.log(`salesEffectiveDate: ${netsuiteCashSale.salesEffectiveDate}`);
console.log(`nexusName: ${netsuiteCashSale.nexusName}`);
// ...
const netsuiteCashSaleShipping = netsuiteCashSale.shipping;
console.log(`address: ${netsuiteCashSaleShipping.address}`);
console.log(`quantity: ${netsuiteCashSaleShipping.quantity}`);
console.log(`amount: ${netsuiteCashSaleShipping.amount}`);
console.log(`grossAmount: ${netsuiteCashSaleShipping.grossAmount}`);
console.log(`taxAmount: ${netsuiteCashSaleShipping.taxAmount}`);
// ...
const netsuiteCashSaleBilling = netsuiteCashSale.billing;
console.log(`address: ${netsuiteCashSaleBilling.address}`);
console.log(`paymentMethod: ${netsuiteCashSaleBilling.paymentMethod}`);
console.log(`creditCardNumber: ${netsuiteCashSaleBilling.creditCardNumber}`);
console.log(`creditCardExpirationDate: ${netsuiteCashSaleBilling.creditCardExpirationDate}`);
console.log(`creditCardProcessor: ${netsuiteCashSaleBilling.creditCardProcessor}`);
// ...
const products = netsuiteCashSale.products;
products.forEach(netsuiteCashSaleProduct => {
  console.log(`internalId: ${netsuiteCashSaleProduct.internalId}`);
  console.log(`name: ${netsuiteCashSaleProduct.name}`);
  console.log(`description: ${netsuiteCashSaleProduct.description}`);
  console.log(`quantity: ${netsuiteCashSaleProduct.quantity}`);
  console.log(`amount: ${netsuiteCashSaleProduct.amount}`);
  // ...
});
const discounts = netsuiteCashSale.discounts;
products.forEach(netsuiteCashSaleDiscount => {
  console.log(`internalId: ${netsuiteCashSaleDiscount.internalId}`);
  console.log(`name: ${netsuiteCashSaleDiscount.name}`);
  console.log(`description: ${netsuiteCashSaleDiscount.description}`);
  console.log(`amount: ${netsuiteCashSaleDiscount.amount}`);
  console.log(`grossAmount: ${netsuiteCashSaleDiscount.grossAmount}`);
  // ...
});
const taxes = netsuiteCashSale.taxes;
taxes.forEach(netsuiteCashSaleTax => {
  console.log(`taxTypeName: ${netsuiteCashSaleTax.taxTypeName}`);
  console.log(`netAmount: ${netsuiteCashSaleTax.netAmount}`);
  console.log(`taxBasis: ${netsuiteCashSaleTax.taxBasis}`);
  console.log(`taxRate: ${netsuiteCashSaleTax.taxRate}`);
  console.log(`taxAmount: ${netsuiteCashSaleTax.taxAmount}`);
  // ...
});
// call the netsuiteCashSale.dump() method to see all of the properties

Search for CashSales

// Find all of the cash sales for a given sales order
const soInternalId;  // sales order's internal id
const cashSales = await netsuiteClient.searchForCashSales(soInternalId);
cashSales.forEach(netsuiteCashSale => {
  netsuiteCashSale.dump();
});

Upload a file

const fileRef = await netsuiteClient.upload(
  './some/local/dir/my-file.csv', // local file 
  'uploads/my-file.csv', // NetSuite target file path
);

Other

Checkout other methods: look at the netsuite object console.log(netsuiteClient); and read netsuite-client.js.

Testing

  • Create a netsuite-config.json file; see netsuite-config-template.json for an example in the Functional test folder.
  • Run yarn run test to execute the test scripts.