docs: function(args, connectionInfo) {
    // args.consignmentIdToProductIdMap.value MUST already be set by the caller
    // args.consignmentProductId.value MUST be set for the very first call
    args.arrayIndex = {value: 0};
    args.consignmentProductId = {value: args.consignmentIdToProductIdMap.value[args.arrayIndex.value].productId};
    args.getArray = function(){
      return this.consignmentIdToProductIdMap.value;
    };
    args.getArrayIndex = function(){
      return this.arrayIndex.value;
    };
  
    // iterate serially through a promise chain for all args.consignmentIds.value
    return utils.processPromisesSerially(
      args.getArray(),
      args.getArrayIndex(),
      args,
      function mergeStrategy(newData, previousData, args){
        log.debug('resolveMissingSuppliers - inside mergeStrategy()');
        var product = newData.products[0];
        //log.silly('newData: ', newData);
        //log.silly('product: ', product);
        var updateMe = args.getArray()[args.getArrayIndex()];
        updateMe.supplier = product.supplier_name || product.supplier_code;
        log.debug('updated consignmentIdToProductIdMap: ', args.getArray()[args.getArrayIndex()]);
  
        previousData = args.getArray();
        return Promise.resolve(previousData); // why do we need a promise?
      },
      function setupNext(updateArgs){
        log.debug('resolveMissingSuppliers - inside setupNext()');
        updateArgs.arrayIndex.value = updateArgs.getArrayIndex() + 1;
        if (updateArgs.getArrayIndex() < updateArgs.getArray().length) {
          updateArgs.consignmentProductId.value = updateArgs.getArray()[updateArgs.getArrayIndex()].productId;
          log.debug('resolveMissingSuppliers - next is consignmentId: ' + updateArgs.consignmentProductId.value);
        }
        else {
          updateArgs.consignmentProductId.value = null;
          log.debug('resolveMissingSuppliers - finished iterating through all the consignmentIds');
        }
        return updateArgs;
      },
      function executeNext(updatedArgs){
        log.debug('resolveMissingSuppliers - inside executeNext()');
        log.debug('resolveMissingSuppliers - executing for consignmentProductId: ' + updatedArgs.consignmentProductId.value);
        //log.silly('updatedArgs: ', updatedArgs);
        var args = argsForInput.products.fetchById();
        args.apiId.value = updatedArgs.consignmentProductId.value;
        return product.endpoints.fetchProduct(args, connectionInfo);
      }
    );
  }