NetSuite setting sales order item price through client script - netsuite

Is it possible to set the price of a sales order item in NetSuite SuiteScript 2.0?
I've got the following function that will set the quanity, amount and description. However, I message is displayed saying that the amount and price does NOT match. It seems that the price field defaults back to the price of the original inventory (or non-inventory in this case) item. Even attempting to set a hard code the value in the function does not work.
function updateSalesOrderItem(configuredItem) {
console.log("updateSalesOrderItem....")
var salesOrder = currentRecord.get();
var lineItem = salesOrder.selectLine({
sublistId: "item",
line: lastItemModified.rowNumber
});
console.log({"lineItem": lineItem});
var priceSubListValue = salesOrder.getCurrentSublistValue({
sublistId: "item",
fieldId: "price"
});
console.log({"current price": priceSubListValue});
console.log(" Setting the quantity...");
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "quantity",
value: configuredItem.quantity
});
// Update the item price to suppress warning message. Before the item is configured, we don't know the price
// therefore it wouldn't match and the warning message is displayed
/*
var amt = parseFloat(configuredItem.amount);
var q = parseInt(configuredItem.quantity);
var p = amt/q;
var price = p.toFixed(2);
console.log({'price': price});
*/
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "price",
value: "999.99"
});
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "amount",
value: configuredItem.amount
});
console.log(" Setting the description...");
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "description",
value: configuredItem.description
});
salesOrder.commitLine({sublistId: "item"});
}

set the price level to custom prior to setting the rate.
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "price",
value: -1
});
salesOrder.setCurrentSublistValue({
sublistId: "item",
fieldId: "rate",
value: 999.00
});
If you are in a jCurve account and can't set a custom price level you may need to set set the item itself as having a variable price. That is available if you have Netsuite ecommerce available in your account.

Related

How to fix: "INVALID_FLD_VALUE" on entity creating a Sales Order

Im creating a script to create a Sales Order on netSuite, but im getting the fallowing error:
"INVALID_FLD_VALUE","message":"You entered an invalid field value of 10807 for the following field: entity"
What im doing wrong?
There is the Code:
var salesOrder;
var customerid;
var salesOrder = record.create({
type: record.Type.SALES_ORDER,
isDynamic: true
});
var ENTITY_VALUE = 10807;
salesOrder.setValue({fieldId:'entity',value:ENTITY_VALUE})
salesOrder.selectNewLine({
sublistId: 'item'
});
salesOrder.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'item',
value: 1175
});
salesOrder.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: 1
});
salesOrder.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'rate',
value: objectJson.total_tickets_revenue
});
salesOrder.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'amount',
value: objectJson.total_tickets_revenue
});
salesOrder.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'taxcode',
value: 5
});
salesOrder.commitLine({ //writes the line entry into the loaded record
sublistId: 'item'
});
salesOrder.save({
ignoreMandatoryFields: true,
enableSourcing: false
})
I'm guessing entity 10807 is not a customer.
You'll save yourself some work if you do:
var salesOrder = record.transform({fromType:'customer', fromId:'10807', toType:'salesorder', isDynamic:true});
Please re-activiate entity ID 10807. It's inactive.
Are you using OneWorld or any location/ department restrictions?
Sometimes invalid value errors will be thrown when the role running the script doesn’t have access to the subsidiary that the referenced record belongs to

Add New line item in Sales Order Using Suite Script 2.0

I want to add new line item in Sales Order based on the particular Inventory item I select. The new line item should be loaded with the existing item record details in it. For this, I used the below code, but its not working;
function recalc(type)
{
var itemId = nlapiGetCurrentLineItemValue('item', 'item'); //Get the Item ID
if(itemId == 16340) //Repair Cost
{
alert ("Hi");
//Insert item
nlapiSelectNewLineItem('item');
nlapiSetCurrentLineItemValue('item', 'item', 330); //Repair Cost
nlapiSetCurrentLineItemValue('item', 'quantity', 1);
nlapiSetCurrentLineItemValue('item', 'amount', '0.00');
nlapiCommitLineItem('item');
}
return true;
}
Can somebody help to rewrite the code in SS 2.0.
You can refer SuiteScript 1.0 to SuiteScript 2.0 API Map for NetSuite SuiteScript 1 to 2 API.
As for your question, you can use the following
function recalc(type) {
currentRecord.selectLine({ sublistId: 'item', line: LINE_NO });
var itemId = currentRecord.getCurrentSublistValue({ sublistId: 'item', fieldId: 'item' }); // Get the Item ID
if (itemId == 16340) {//Repair Cost
// Insert item
currentRecord.selectNewLine({ sublistId: 'item' });
currentRecord.setCurrentSublistValue({ sublistId: 'item', fieldId: 'item', value: 330 });//Repair Cost
currentRecord.setCurrentSublistValue({ sublistId: 'item', fieldId: 'quantity', value: 1 });//Repair Cost
currentRecord.setCurrentSublistValue({ sublistId: 'item', fieldId: 'amount', value: '0.00' });//Repair Cost
currentRecord.commitLine({ sublistId: 'item' });
}
return true;
}

Keep getting an error when trying to submit an Inbound Shipment via Netsuite Restlet

I keep getting the following error when trying to create a new Inbound Shipment record (new in Netsuite).
{"type":"error.SuiteScriptError","name":"USER_ERROR","message":"Please enter value(s) for: Item","stack":["anonymous(N/recordService)","<anonymous>(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:132)","<anonymous>(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:99)","doPost(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:34)"],"cause":{"type":"internal error","code":"USER_ERROR","details":"Please enter value(s) for: Item","userEvent":null,"stackTrace":["anonymous(N/recordService)","<anonymous>(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:132)","<anonymous>(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:99)","doPost(/SuiteScripts/KK_Sandbox_Scripts_SD/RestLets/InboundShipment.js:34)"],"notifyOff":false},"id":"","notifyOff":false}
Here is the code I have to set the record. I have verified that the sublist id is "items" and the fieldId is "itemid", but when I try to add the line, I get the above error.
function doPost(restletBody){
log.debug('Called from POST', restletBody);
var success = [],
errors = [];
restletBody.data.forEach(function(e)
{
try
{
log.debug('Called from POST', e.id);
//Create a new record
var rec =
r.create({
type: "inboundshipment",
isDynamic: true,
defaultValues: null
}).setValue({
fieldId: "externalid",
value: e.id,
ignoreFieldChange: false
});
var i = 1;
e.lineitems.items.forEach(function(item)
{
log.debug("Inside Line Items", item.itemid + " " + item.purchaseorder);
rec.selectNewLine({sublistId:"items"});
var field = rec.getSublistFields({
sublistId: 'items'
});
rec.setCurrentSublistValue({
sublistId: "items",
fieldId: "purchaseorder",
value: item.purchaseorder,
ignoreFieldChange: true
});
rec.setCurrentSublistValue({
sublistId: "items",
fieldId: "itemid",
value: item.itemid,
ignoreFieldChange: true
});
log.debug("Inside Line Items", "ITEM Added " + item.itemid );
rec.commitLine({sublistId:"items"});
log.debug("Inside Line Items", "Line Committed" );
++i;
});
rec.save();
}
catch(err)
{
var msg = '';
log.debug("There was an error", err);
}
})
return "";
}
I have tried changing the itemid to shipmentitem and id, and it doesn't work. Before, I was getting an error for PO, too, and it was because the name was wrong, but I fixed that (I believe) for the item.
One thing that might be affecting it (not sure) is that the PO list filters the item list. once the user selects the PO in the UI, it will filter the item list to only items on that PO. I have double-checked that the item I am trying to submit belongs to the PO I am trying to submit, but still receiving an error. Any ideas?
According to the NetSuite Record Browser, the field should be 'shipmentitem'.
rec.setCurrentSublistValue({
sublistId: "items",
fieldId: "shipmentitem",
value: item.itemid,
ignoreFieldChange: true
});
EDIT: Updated to reflect that the fieldname should be 'shipmentitem' as #shawleigh17 discovered so future users find the correct answer.
all you need is a PO line unique Id (line field id: lineuniquekey) of each from original PO/POs and transaction Id. This id you will set for shipmentitem sublist field of Inbound Shipment record.
objRecord.setCurrentSublistValue({
sublistId: 'items',
fieldId: 'purchaseorder',
value: objParam.purchaseOrderId,
forceSyncSourcing: true
});
objRecord.setCurrentSublistValue({
sublistId: 'items',
fieldId: 'shipmentitem',
value: objParam.lineUniqueIdFromPO,
forceSyncSourcing: true
});
and of course, do not forget to set quantity for quantityexpected

itemfulfillment: sublist item field inventorydetail is not a subrecord field

I want to do a bin itemfulfillment in netsuite.
But I can't get an example that works. When I run the below code I am receiving this error:
Sublist item field inventorydetail is not a subrecord field
I need to know what is the correct subrecord name to create an itemfulfillment
Thanks!
var sales_internalid = '2465'; //saleorderid
var einternalid = '110'; //employeeid
var winternalid = '1'; //washsoueid
var sinternalid = '6'; //itemid
var quantity = 1;
var displayname ='iphone';
var shipgroup = 1;
var salesOrder= nlapiCreateRecord('salesorder', sales_internalid, {recordmode: 'dynamic'});
var obj = nlapiTransformRecord('salesorder', sales_internalid, 'itemfulfillment');
obj.selectLineItem('item',1);
obj.setCurrentLineItemValue('item', 'item', sinternalid );
obj.setCurrentLineItemValue('item', 'location', winternalid );
obj.setCurrentLineItemValue('item', 'quantity', 1);
var subrecord= obj.editCurrentLineItemSubrecord('item', 'inventorydetail');
subrecord.selectLineItem('inventoryassignment', 1);
subrecord.selectNewLineItem('inventoryassignment');
subrecord.setCurrentLineItemValue('inventoryassignment', 'inventorynumber', '1');
subrecord.setCurrentLineItemValue('inventoryassignment', 'quantity', '1');
subrecord.commitLineItem('inventoryassignment');
subrecord.commit();
obj.commitLineItem('item');
var fulfillmentOrderId = nlapiSubmitRecord(itemFulfillment, true);
I had this same issue when doing my first Inventory Transfer via code for a client. Turns out the Bin Number field is only a subrecord when the feature "Advanced Bin Management" is enabled. If the account you are working in is setup to just "Use Bins" then the Bin Number field on the line items of transactions is set via its text value. Example is in SS 2.0 but I believe it gets the point across:
newRec = nsRecord.create({
type: nsRecord.Type.INVENTORY_ADJUSTMENT,
isDynamic: true
});
// In dynamic mode must set the subsidiary first.
newRec.setValue({
fieldId: bodyFields.subsidiary,
value: locSub[datain.Location]
});
newRec.setValue({
fieldId: bodyFields.adjustment_Location,
value: datain.Location
});
newRec.setValue({
fieldId: bodyFields.date,
value: date
});
newRec.selectNewLine({
sublistId: columnFields.type
});
newRec.setCurrentSublistValue({
sublistId: columnFields.type,
fieldId: columnFields.item,
value: datain.Item
});
newRec.setCurrentSublistValue({
sublistId: columnFields.type,
fieldId: columnFields.adjust_Qty,
value: datain.Quantity.toString()
});
if (parseFloat(datain.Quantity) > 0) { // If qty is positive must set the Est Unit Cost.
itemVals = nsSearch.lookupFields({
type: nsSearch.Type.ITEM,
id: datain.Item,
columns: fields
});
cost = itemVals.averagecost || itemVals.lastpurchaseprice;
newRec.setCurrentSublistValue({
sublistId: columnFields.type,
fieldId: columnFields.est_Unit_Cost,
value: cost
});
}
//
// Format for binnumbers field is 'ValueText(qty)\rValueText(qty)\rValueText(qty)
// the only exception is in cases of negative qty
//
binText = datain.Bin ? datain.Bin + '(' + datain.Quantity + ')' : '';
newRec.setCurrentSublistValue({
sublistId: columnFields.type,
fieldId: columnFields.bin_Numbers,
value: binText
});
newRec.commitLine({
sublistId: columnFields.type
});
invRecResult.invRecId = newRec.save({
enableSourcing: true,
ignoreMandatoryFields: true
});

How to set an address on customer using SuiteScript 2.0

I'm trying to set an address on a customer record. I've grasped that the address is a subrecord of a customer sublist and I believe I'm able to set fields on said subrecord, but I'm unable to get the changes to save. How can one set address information on a Customer using SuiteScript 2.0?
Current code:
customer.selectNewLine({
sublistId: 'addressbook'
});
var addressSubrecord = customer.getCurrentSublistSubrecord({
sublistId: 'addressbook',
fieldId: 'addressbookaddress'
});
subrecordAddressDetail.setValue({
fieldId: 'addr1',
value: 'Test Street'
});
subrecordAddressDetail.setValue({
fieldId: 'country',
value: 'US'
});
customer.commitLine({
sublistId: 'addressbook'
});
I've also tried adding customer.save() after .commitList, but I get the error Record has changed when I try to do so.
The part I was missing was that you need to save the parent record for any changes to a subrecord of a sublist to take effect. I was unable to save said parent record because I had made changes to that record and saved them previously which caused the Record has already changed error.
Generally addresses can be added to customer records by:
Selecting a line in the addressbook sublist.
Retrieving the address subrecord of the currently selected line.
Updating the subrecord.
Committing the selected line in the addressbook sublist.
Saving the parent record.
For example this will update the first address for a given customer or create it if it doesn't already exist:
function updateAddress(customer, address) {
var currentAddressCount = customer.getLineCount({
'sublistId': 'addressbook'
});
if (currentAddressCount === 0){
customer.selectNewLine({
sublistId: 'addressbook'
});
} else {
customer.selectLine({
sublistId: 'addressbook',
line: 0
});
}
var addressSubrecord = customer.getCurrentSublistSubrecord({
sublistId: 'addressbook',
fieldId: 'addressbookaddress'
});
// Set all required values here.
addressSubrecord.setValue({
fieldId: 'addr1',
value: address.line_one
})
customer.commitLine({
sublistId: 'addressbook'
});
customer.save()
}
I think you need to treat the address as a proper record. Therefore, after you retrieve it, set its values and then commit it separately. Something along these lines:
customer.selectNewLine({
sublistId: 'addressbook'
});
var addressSubrecord = customer.getCurrentSublistSubrecord({
sublistId: 'addressbook',
fieldId: 'addressbookaddress'
});
addressSubrecord.setValue({
fieldId: 'addr1',
value: 'Test Street'
});
addressSubrecord.setValue({
fieldId: 'country',
value: 'US'
});
addressSubrecord.save()
customer.commitLine({ //probably not necessary since address is already updated
sublistId: 'addressbook'
});

Resources