Client needs to create RMA record for a sales order based on the item selected on the website.
/**
* @NApiVersion 2.1
* @NScriptType Suitelet
*/
define(['N/error', 'N/https', 'N/record', 'N/search'],
/**
* @param{error} error
* @param{https} https
* @param{record} record
* @param{search} search
*/
(error, https, record, search) => {
function checkForParameter(parameter) {
if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null"
&& parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
return true;
} else {
log.debug("empty")
return false;
}
}
function responseMessage(status,message,isSuccess){
let messageDetails ={
'status': status,
'message': message,
'isSuccess': isSuccess
}
return messageDetails
}
function toFindOrderDetails(orderID){
try {
var salesorderSearchObj = search.create({
type: "salesorder",
filters:
[
["type", "anyof", "SalesOrd"],
"AND",
["status", "anyof", "SalesOrd:D", "SalesOrd:E", "SalesOrd:F", "SalesOrd:G", "SalesOrd:B"],
"AND",
["mainline", "is", "F"],
"AND",
["shipping", "is", "F"],
"AND",
["quantityshiprecv", "greaterthan", "0"],
"AND",
// ["customermain.internalid","anyof",customerID],
// "AND",
["taxline", "is", "F"],
"AND",
[[["numbertext", "is", orderID]], "OR", [["formulatext: {otherrefnum}", "is", orderID]]]
],
columns:
[
search.createColumn({
name: "item",
summary: "GROUP",
label: "Item"
}),
search.createColumn({
name: "quantity",
summary: "GROUP",
label: "Quantity"
}),
search.createColumn({
name: "quantity",
join: "applyingTransaction",
summary: "SUM",
label: "Quantity"
}),
search.createColumn({
name: "line",
summary: "GROUP",
label: "Line ID"
}),
search.createColumn({
name: "formulanumeric",
summary: "SUM",
formula: "CASE WHEN {applyingtransaction.type} = 'Return Authorization' THEN {applyingtransaction.quantity} ELSE 0 END",
label: "Formula (Numeric)"
}),
search.createColumn({
name: "quantityshiprecv",
summary: "GROUP",
label: "Quantity Fulfilled/Received"
}),
search.createColumn({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
})
]
});
var searchResultCount = salesorderSearchObj.runPaged().count;
let orderDetails = []
if (searchResultCount > 0) {
salesorderSearchObj.run().each(function (result) {
orderDetails.push(result.getValue({
name: "internalid",
summary: "GROUP",
label: "Internal ID"
})
)
});
return orderDetails
}
}catch (e) {
log.debug("error@toFindSODetails",e)
let responseBody={
'status': 500,
'message': e.message,
'isSuccess': false,
}
return scriptContext.response.write(JSON.stringify(responseBody))
}
}
/**
* Defines the Suitelet script trigger point.
* @param {Object} scriptContext
* @param {ServerRequest} scriptContext.request - Incoming request
* @param {ServerResponse} scriptContext.response - Suitelet response
* @since 2015.2
*/
const onRequest = (scriptContext) => {
try{
//log.debug("RequestBody",scriptContext.request.body);
if(scriptContext.request.method!=='POST')
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Method Not Allowed',false)))
/* Login Key Validation*/
let login_key= scriptContext.request?.headers?.login_key;
log.debug("Login Key",login_key)
if(!login_key || login_key!=='c782779b77215248bb2372c545132ae1')
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Invalid Login Attempt',false)))
/* requestBody Validation*/
let requestBody=JSON.parse(scriptContext.request.body);
log.debug("requestBody",requestBody)
if(!requestBody)
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Request Body Is Empty',false)))
/* Name */
if (!checkForParameter(requestBody.first_name))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Name Is Empty',false)))
/* Phone */
if (!checkForParameter(requestBody.phone))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Phone Is Empty',false)))
/* Address */
if (!checkForParameter(requestBody.first_name))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Name Is Empty',false)))
/* Order ID Validation */
if (!checkForParameter(requestBody.order_id))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Order ID Is Empty',false)))
/* Email Validation */
if (!checkForParameter(requestBody.email))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Email ID Is Empty',false)))
/* Website Validation */
if (!checkForParameter(requestBody.website))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Website Is Empty',false)))
if(requestBody.items.length<=0)
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Item Array Is Empty',false)))
let soInternalId=toFindOrderDetails(requestBody.order_id)
if(!soInternalId || soInternalId.length<=0)
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Order Not Found',false)))
let itemArray=requestBody.items;
let rmaRecord=record.transform({
fromType: record.Type.SALES_ORDER,
fromId: soInternalId[0],
toType: record.Type.RETURN_AUTHORIZATION,
isDynamic: false
})
let lineCount=rmaRecord.getLineCount({
sublistId: 'item'
});
log.debug("LineCount",lineCount)
for(let i=0;i<itemArray.length;i++){
if(!checkForParameter(itemArray[i]['item']))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Item Is Empty In Line Numebr '+(i+1),false)))
if(!checkForParameter(itemArray[i]['quantity']))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Quantity Is Empty In Line Numebr '+(i+1),false)))
if(!checkForParameter(itemArray[i]['lineId']))
return scriptContext.response.write(JSON.stringify(responseMessage(500,'Line ID Is Empty In Line Numebr '+(i+1),false)))
}
let mainFlag=0;
for(let i=lineCount;i>0;i--){
let flag=0;
let item=rmaRecord.getSublistText({
sublistId: 'item',
fieldId: 'item',
line: i-1
});
let quantity=rmaRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i-1
});
let srcLine=rmaRecord.getSublistValue({
sublistId: 'item',
fieldId: 'orderline',
line:i-1
})
// log.debug("SRC LINE",srcLine)
// log.debug("item",item)
for(let j=0;j<itemArray.length;j++){
//log.debug("Item",itemArray[j]['item'])
if(item==itemArray[j]['item']){
//log.debug("Inside Main If")
if(srcLine==itemArray[j]['lineId']){
// log.debug("Inside Second If")
rmaRecord.setSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: itemArray[j]['quantity'],
line: i-1
})
flag=flag+1;
}
}
}
if(flag<=0){
rmaRecord.removeLine({
sublistId: 'item',
line: i-1
})
}else{
mainFlag=mainFlag+1;
}
}
if(mainFlag>0){
// let tranbefore=rmaRecord.getValue({
// fieldId: 'tranid'
// });
//log.debug("Before",tranbefore)
rmaRecord.setValue({
fieldId: 'custbody_retail_website',
value: requestBody.website
})
let id=rmaRecord.save({
enableSourcing: true,
ignoreMandatoryFields: true
});
let afterRMA=record.load({
type: record.Type.RETURN_AUTHORIZATION,
id: id
});
let tranNumber=afterRMA.getValue({
fieldId: 'tranid'
});
log.debug("After",tranNumber)
let responseBody={
'status': 200,
'message': 'RMA Record Created',
'isSuccess': true,
order_number: tranNumber
}
return scriptContext.response.write(JSON.stringify(responseBody))
}else{
let responseBody={
'status': 500,
'message': 'Order Not Created',
'isSuccess': false,
}
return scriptContext.response.write(JSON.stringify(responseBody))
}
}catch (e) {
log.debug("error@onRequest",e)
let responseBody={
'status': 500,
'message': e.message,
'isSuccess': false,
}
return scriptContext.response.write(JSON.stringify(responseBody))
}
}
return {onRequest}
});