title: Why can't I create a vendor bill in SuiteScript?
body: <p>I am unable to save a vendor bill, as it will come up with an error that inventory details are required when I do not enter them. However, when I attempt to enter any values for the inventory-related fields, it will come up with an error of "You cannot create an inventory detail for this item.". The available item fields are as follows (copied from debugger):</p>
  
  <pre><code>amount = {string}  
  amounthasbeenset = {string} 
  billreceipts = {string}  
  billvariancestatus = {string}  
  billvariancestatusallbook = {string}  
  binitem = {string}  
  class = {string}  
  customer = {string}  
  ddistrib = {string}  
  department = {string}  
  description = {string}  
  fulfillable = {string}  
  fulfillmentstatus = {string}  
  generateaccruals = {string}  
  groupsetup = {string}  
  hasimmutableamortization = {string}  
  id = {string}  
  inboundshipmentitem = {string}  
  includegroupwrapper = {string}  
  ingroup = {string}  
  initoqpbucket = {string}  
  initquantity = {string}  
  inventorydetailavail = {string}  
  inventorydetailreq = {string}  
  isbillable = {string}  
  islinefulfilled = {string}  
  islinkedtodropshippoline = {string}  
  isnoninventory = {string}  
  isnumbered = {string}  
  isserial = {string}  
  item = {string}  
  itemhandlingcost = {string}  
  itemresidamt = {string}  
  itemresidamtispct = {string}  
  itemshippingcost = {string}  
  itemsubtype = {string}  
  itemtype = {string}  
  landedcostcategory = {string}  
  landedcostset = {string}  
  linenumber = {string}  
  location = {string}  
  locationusebins = {string}  
  locationusesbins = {string}  
  mandatorylocation = {string}
  marginal = {string}  
  matrixtype = {string}  
  olditemid = {string}  
  options = {string}  
  oqpbucket = {string}  
  orderdoc = {string}  
  orderline = {string}  
  origlocation = {string}  
  origrate = {string}  
  printitems = {string}  
  quantity = {string}  
  rate = {string}  
  rateschedule = {string}  
  scheduletype = {string}  
  tracklandedcost = {string}  
  vendorname = {string}  
  weightinlb = {string}  
  </code></pre>
  
  <p>I am setting the following inventory detail values (in addition to item, quantity, and location). There is no inventoryassignment sublist.</p>
  
  <pre><code>inventorydetailavail = F
  inventorydetailreq = F
  binitem = F
  isserial = F
  isnumbered = F
  locationusesbins = F
  locationusebins = F
  itemtype = NonInvtPart
  isnoninventory = T
  </code></pre>
  
  <p>Here is an example of the code I am using:</p>
  
  <pre><code>define(['N/record','N/redirect','N/search'],
  function(record, redirect, search) {
  
  /**
   * Definition of the Suitelet script trigger point.
   *
   * @param {Object} context
   * @param {ServerRequest} context.request - Encapsulation of the incoming request
   * @param {ServerResponse} context.response - Encapsulation of the Suitelet response
   * @Since 2015.2
   */
  function onRequest(context) {
  
      var request = context.request;
      var response = context.response;
  
      var id = context.request.parameters.custom_id;
      if (!id) {
          context.response.write('The parameter "custom_id" is required');
          return;
      }
      else {
          alert('ID is ' + id);
      }
  
      var loadedRecord = record.load({
          type: record.Type.INBOUND_SHIPMENT,
          id: id
      });
  
      alert('Generating vendor bill');
  
      var shipmentBaseCurrency = loadedRecord.getValue('shipmentbasecurrency');
  
      var vendorBill = record.create({
          type: record.Type.VENDOR_BILL,
          isDynamic: true
      });
  
      vendorBill.setValue('currency', shipmentBaseCurrency);
  
      var receivingLocation = '';
  
      var lines = loadedRecord.getLineCount({sublistId: 'items'});
      log.debug("tran. lines: " + lines);
  
      var total;
  
      for (var i = 0; i &lt; lines; i++) {
  
          var quantity = (parseFloat(loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "quantityreceived",
              line: i
          })) || 0);
  
          var purchaseOrder = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "purchaseorder",
              line: i
          });
  
          var item = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "itemid",
              line: i
          });
  
          var description = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "shipmentitemdescription",
              line: i
          });
  
          var recLoc = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "receivinglocation",
              line: i
          });
  
          receivingLocation = recLoc;
  
          var totalUnitCost = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "totalunitcost",
              line: i
          });
  
          var amount = loadedRecord.getSublistValue({
              sublistId: "items",
              fieldId: "shipmentitemamount",
              line: i
          });
  
          log.debug("item quantity: " + quantity);
  
          vendorBill = addVendorBillLine(vendorBill, item, quantity, receivingLocation);
  
      } // for (var i = 0; i &lt; lines; i++)
  
      var vbPostPeriodValStr = String(getPostingPeriod());
      try {
          vendorBill.setText('postingperiod', vbPostPeriodValStr);
      }
      catch(e) {
          log.error('Issue setting posting period for vendor bill', e.message);
      }
  
      vendorBill.setValue('location', receivingLocation);
  
      try {
          var vendorBillId = vendorBill.save(); 
          log.debug('*******Vendor Bill Saved*******', 'Vendor bill successfully saved: ' + vendorBillId);
          redirect.toRecord({
              type: record.Type.VENDOR_BILL, 
              id: vendorBillId 
          });
      }
      catch(e) {
          log.debug('Error saving vendor bill', e.message);
          context.response.write('Error: ' + e.message);
      }
  }
  
  function addVendorBillLine(vendorBill, item, quantity, location) {
      try {
          var lineNum = vendorBill.selectNewLine({
              sublistId: 'item'
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "item",
              value: item
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "quantity",
              value: quantity
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "location",
              value: location
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "itemtype",
              value: 'NonInvtPart'
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "isnoninventory",
              value: 'T'
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "inventorydetailreq",
              value: 'F'
          });
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "inventorydetailavail",
              value: 'F'
          });
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "binitem",
              value: 'F'
          });
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "locationusebins",
              value: 'F'
          });
  
          vendorBill.setCurrentSublistValue({
              sublistId: "item",
              fieldId: "vendorname",
              value: 'Test Vendor'
          });
  
          vendorBill.commitLine({sublistId:"item"});
  
          log.debug('Committing vendor bill expense line addition','Name: ' + item + ", Quantity: " + quantity);
      }
      catch(e){
          log.debug('Issue committing vendor bill item line addition', e.message);
      }
  
      return vendorBill;
  }
  
  function getPostingPeriod() {
      var monthAbbr = [
          "Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
      ];
  
      var d = new Date();
      return monthAbbr[d.getMonth()] + ' ' + d.getFullYear();
  }
  
  return {
      onRequest: onRequest
  };
  
  });
  </code></pre>