Scenario:
The client needs a Restlet API that will create a PO in NetSuite
/**
* @NApiVersion 2.1
* @NScriptType Restlet
*/
/*******************************************************************************
* CLIENTNAME: Branded
* Create a Restlet to create a PO in NetSuite
*************************************************************************
* Date : 04-01-2022
*
* Author: Jobin & Jismi IT Services LLP
* Script Description :
* Create a Restlet to create a PO in NetSuite.
* Date created :11-01-2022
* REVISION HISTORY
* Revision 1.0 ${11-01-2022}
*
******************************************************************************/
define(['N/error', 'N/record','N/format'],
/**
* @param{error} error
* @param{record} record
*/
(error, record,format) => {
/**
* To Generate Full Address
* @param{Object} obj - Object contains address
* @param{string} obj.address1 - Object contains address
* @param{string} obj.city - Object contains address
* @param{string} obj.state - Object contains address
* @param{string} obj.country - Object contains address
* @param{string} obj.zip - Object contains address
* @returns {Boolean|string} - formatted the object into address text
*/
function generateAddressText(obj) {
// if(!obj?.address1 || !obj?.city )
// return false;
return obj?.address1 + "\n" + obj?.city + "\n" + obj?.state + "\n" + obj?.country + "\n" + obj?.zip;
}
/**
*
* @param dateValue
* @returns {Date|string|number}
*/
function generateDate(dateValue){
let day=dateValue.getDate()+1;
let month=dateValue.getMonth()+1;
let year=dateValue.getFullYear();
let org=month+"/"+day+"/"+year
//let org=day+"."+month+"."+year;
let date=tdate=format.parse({
value:org,type:format.Type.DATE
});
log.debug("date2",date);
return date;
}
/**
* Defines the function that is executed when a POST request is sent to a RESTlet.
* @param {string | Object} requestBody - The HTTP request body; request body is passed as a string when request
* Content-Type is 'text/plain' or parsed into an Object when request Content-Type is 'application/json' (in which case
* the body must be a valid JSON)
* @returns {string | Object} HTTP response body; returns a string when request Content-Type is 'text/plain'; returns an
* Object when request Content-Type is 'application/json' or 'application/xml'
* @since 2015.2
*/
const post = (requestBody) => {
try {
//Checking Body Is Fields Empty
if (!requestBody?.bodyfield)
return JSON.stringify({
summary: {
message: "FAILED",
reason: "BODY_FIELD_MISSING",
error: ["Body field is empty"]
},
details: []
});
//Checking Record Type
let type = requestBody.type;
if (type !== "purchaseorder")
return JSON.stringify({
summary: {
message: "FAILED",
reason: "INVALID_RECORD_TYPE",
error: ["Record Type Is Different"]
},
details: []
});
if (!(requestBody?.sublist?.item && util.isArray(requestBody?.sublist?.item) && requestBody?.sublist?.item.length) && !(requestBody?.sublist?.expense))
return JSON.stringify({
summary: {
message: "FAILED",
reason: "SUBLIST_MISSING",
error: ["No Content in Sublist"]
},
details: []
});
const bodyFileds = [
{
fieldId: 'entity',
value: requestBody.bodyfield.vendor,
text: null,
isMandatory: true,
},
{
fieldId: 'subsidiary',
value: requestBody.bodyfield.subsidiary,
text: null,
isMandatory: false,
},
{
fieldId: 'trandate',
value: new Date(requestBody.bodyfield.trandate),
text: null,
isMandatory: false,
},
{
fieldId: 'duedate',
value: new Date(requestBody.bodyfield['recieveby']),
text: null,
isMandatory: false,
},
]
// Checking Mandatory Fields
for (let ele of bodyFileds) {
log.debug({title: ele.fieldId, details: ele.value})
if (!ele.value && !ele.text && ele.isMandatory) {
return JSON.stringify({
summary: {
message: "FAILURE",
reason: "FIELD_IS_MANDATORY",
error: [ele.fieldId + " Field Is Mandatory"]
},
details: []
})
}
}
// Purchase Order Creation
var objRecord = record.create({
type: record.Type.PURCHASE_ORDER,
isDynamic: true
});
// Setting Values in body Field
for (let ele of bodyFileds) {
if (ele.fieldId === 'trandate') {
// let tdate=generateDate(ele.value)
// log.debug("Date in body",tdate);
objRecord.setValue({
fieldId: ele.fieldId,
value: ele.value
});
}
if (ele.fieldId === 'recieveby') {
// let tdate=generateDate(ele.value)
// log.debug("Date in body",tdate);
objRecord.setValue({
fieldId: ele.fieldId,
value: ele.value
});
}
if (ele.text) {
objRecord.setText({
fieldId: ele.fieldId,
value: ele.text
});
}
else {
objRecord.setValue({
fieldId: ele.fieldId,
value: ele.value
});
}
objRecord.setValue({
fieldId: "department",
value: 12
})
}
//Setting Values In Item Sublist Field
if (requestBody?.sublist?.item && util.isArray(requestBody?.sublist?.item) && requestBody?.sublist?.item.length > 0) {
const fieldMap = [{
fieldId: 'item',
jsonKey: 'item',
isValue: true,
isText: false
},
{
fieldId: 'quantity',
jsonKey: 'quantity',
isValue: true,
isText: false
},
{
fieldId: 'class',
jsonKey: 'class',
isValue: true,
isText: false
},
]
for (let ele of requestBody.sublist.item) {
objRecord.selectNewLine({
sublistId: 'item'
});
for (let field of fieldMap) {
if (field.isText) {
objRecord.setCurrentSublistText({
sublistId: 'item',
fieldId: field.fieldId,
text: ele[field.jsonKey]
});
} else {
objRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: field.fieldId,
value: ele[field.jsonKey]
});
}
}
objRecord.commitLine({
sublistId: 'item'
});
}
}
//Setting Values In Expense Sublist Field
if (requestBody?.sublist?.expense && util.isArray(requestBody?.sublist?.expense) && requestBody?.sublist?.expense.length > 0) {
const fieldMap = [{
fieldId: 'category',
jsonKey: 'category',
isValue: true,
isText: false
},
{
fieldId: 'amount',
jsonKey: 'amount',
isValue: true,
isText: false
},
{
fieldId: 'department',
jsonKey: 'department',
isValue: true,
isText: false
},
{
fieldId: 'class',
jsonKey: 'class',
isValue: true,
isText: false
},
]
for (let ele of requestBody.sublist.expense) {
objRecord.selectNewLine({
sublistId: 'expense'
});
for (let field of fieldMap) {
if (field.isText) {
objRecord.setCurrentSublistText({
sublistId: 'expense',
fieldId: field.fieldId,
text: ele[field.jsonKey]
});
log.debug("problem text", field.fieldId)
} else {
log.debug("value", ele[field.jsonKey])
objRecord.setCurrentSublistValue({
sublistId: 'expense',
fieldId: field.fieldId,
value: ele[field.jsonKey]
});
log.debug("problem value", field.fieldId)
}
}
objRecord.commitLine({
sublistId: 'expense'
});
}
}
//Purchase Order Saving
let recPO = objRecord.save({
ignoreMandatoryFields: false
});
log.debug("PO record", recPO)
return JSON.stringify({
summary: {
message: "SUCCESS",
reason: "RECORD_CREATED",
error: []
},
details: [{
internalId: recPO
//internalID:"Success"
}
]
})
} catch (e) {
log.debug(e);
return JSON.stringify({
summary: {
message: "FAILURE",
reason: "ERROR",
error: [{name: e?.name, message: e?.message}]
},
details: []
});
}
}
return { post}
});