Purchase order list API using Restlet

/**
* @NApiVersion 2.1
* @NScriptType Restlet
*/
define(['N/search','./moment.min.js','./hs.2x.logger.js'],
/**
* @param{search} search
*/
(search,moment,logger) => {
let DEFAULT_PAGE_SIZE = 25
let API = 'PURCHASEORDER'
/**
* 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 {
let response = {};
let pageInfo = getPos(requestBody);
if (pageInfo.poIds.length == 0) {
response = {
success:true,
page:0,
total_pages:0,
total_results:0,
pageSize:0,
results_returned:0,
results: []
}
} else {

pageInfo.results = getPoResults(pageInfo.poIds);
delete pageInfo["poIds"];
response=pageInfo;
response.success = true
}
let logData = logger.success({
method:logger.method['POST'] ,
message: 'Get Purchase Orders :'+ JSON.stringify(requestBody),
api: logger.api[API],
payload: JSON.stringify(response)
});

return response
}
catch(err)
{
log.debug("error@post",err);
let logData = logger.error({
method:logger.method['POST'] ,
message: 'Get Purchase Orders :' +JSON.stringify(requestBody) + 'error :' +JSON.stringify(err),
api: logger.api[API],
payload: {},
});
return {
success:false,
message:err
}
}
}

let dateTimeToUtc = (dateVal) =>{
let targetDateFormat = 'MM/DD/YYYY h:mm a';
return dateVal ? moment(dateVal, targetDateFormat).format('YYYY-MM-DDThh:mm:ss.000') + 'Z' : null;
};

let validateNum =(val) => {
let parsedNum = Number(val);
return isNaN(parsedNum) ? null : parsedNum;
};

let splitLines = (val) => {
if(val)
{
return val.split('\n')
}
return [];
}

const getPoResults = (poIds) => {

let imageMap = getImages(poIds)

let poSearch = search.create({
type: "transaction",
filters:
[
["type","anyof","ItemRcpt","PurchOrd"],
"AND",
[["internalid","anyof",poIds] ,'OR',['createdfrom','anyof',poIds]]
],
columns:[
search.createColumn({name: "type", label: "type", sort: search.Sort.DESC}),
search.createColumn({name: "item", label: "itemToSort", sort: search.Sort.DESC}),
search.createColumn({
name: "datecreated",
sort: search.Sort.DESC,
label: "dateCreated"
}),
search.createColumn({name: "item", label: "item"}),
search.createColumn({name: "createdfrom", label: "createdFrom"}),
search.createColumn({name: "status", label: "status"}),
search.createColumn({name: "tranid", label: "ponum"}),
search.createColumn({name: "entity", label: "vendor"}),
search.createColumn({name: "location", label: "locationId"}),
search.createColumn({name: 'formulatext',formula:"{entity}", label: "vendorName"}),
search.createColumn({name: 'formulatext',formula:"{item}", label: "itemName"}),
search.createColumn({name: 'formulatext',formula:"{location}", label: "location"}),
search.createColumn({name: 'formulatext',formula:"{item.displayname}", label: "itemDescription"}),
search.createColumn({name: 'formulatext',formula:"{createdby}", label: "createdByText"}),
search.createColumn({name: "quantity", label: "quantity"}),
search.createColumn({name: 'internalid', label: "internalId"}),
search.createColumn({name: "serialnumbers", label: "assetTags"}),
search.createColumn({name: "quantityshiprecv", label: "quantityReceived"}),
search.createColumn({name: "createdby", label: "createdBy"}),
search.createColumn({name: "isserialitem", join: "item", label: "isSerial"})
]
})
let searchColumns = poSearch.columns;
let results = [],poArray =[];
poSearch.run().each(function(result){
let singleObj = {}
searchColumns.forEach((col)=>{
singleObj[col.label] = result.getValue(col)
})

if(singleObj.type=="ItemRcpt")
{
let existingIndex = poArray.indexOf(singleObj.createdFrom)
if(singleObj.item)
{
results[existingIndex].receipts.push({
dateCreated:dateTimeToUtc(singleObj.dateCreated),
receiptId:singleObj.internalId,
itemLines:[{ itemId: singleObj.item,
itemName:singleObj.itemName,
itemDescription:singleObj.itemDescription,
isSerial:singleObj.isSerial,
quantity: singleObj.quantity,
assetTags: splitLines(singleObj.assetTags)}]
})
}
}
else
{
let existingIndex = poArray.indexOf(singleObj.internalId)
if(existingIndex == -1)
{
results.push({
createdBy:singleObj.createdBy,
internalId:singleObj.internalId,
dateCreated:dateTimeToUtc(singleObj.dateCreated),
ponum:singleObj.ponum,
vendor:singleObj.vendor,
vendorName:singleObj.vendorName,
status:"pendingReceipt"==singleObj.status?'open':'partial',
locationId:singleObj.locationId,
location:singleObj.location,
imageUrls:imageMap[singleObj.internalId]?imageMap[singleObj.internalId]:[],
itemLines:[],
receipts:[]
});
poArray.push(singleObj.internalId);
}
else {
results[existingIndex].itemLines.push({
itemId:singleObj.item,
itemName:singleObj.itemName,
itemDescription:singleObj.itemDescription,
isSerial:singleObj.isSerial,
quantity:singleObj.quantity,
quantityRecieved:singleObj.quantityRecieved
})
}
}


return true;
});
return results
}

const getPos = (requestBody)=>{
let pageNumber = Number(requestBody.pageNumber || 1)
let site = requestBody.site
let nsOrderStatus = requestBody.nsOrderStatus || 'open/partial'

let orderStatus = {
'open/partial': ["PurchOrd:B","PurchOrd:D","PurchOrd:E"],
'open': ["PurchOrd:B"],
'partial': ["PurchOrd:D","PurchOrd:E"]
}[nsOrderStatus] || ["PurchOrd:B","PurchOrd:D","PurchOrd:E"]


let searchFilters =[
["type","anyof","PurchOrd"],
"AND",
["mainline","is","T"],
"AND",
["status","anyof",orderStatus]
]

if(site)
{
searchFilters.push("AND",["location","is",site])
}
let pageSize = requestBody.pageSize || DEFAULT_PAGE_SIZE
pageSize = pageSize<5?5:pageSize
let poSearch = search.create({
type: "transaction",
filters:searchFilters,
columns:[
search.createColumn({
name: "datecreated",
sort: search.Sort.DESC,
label: "Date Created"
}),
'internalid'
]
})
let pageData = poSearch.runPaged({
pageSize: pageSize
})
let pageRanges = pageData.pageRanges
let currentPageData
if (pageRanges[pageNumber - 1]) {
currentPageData = pageData.fetch(pageRanges[pageNumber - 1])
} else {
throw { name: 'INVALID_PAGE', message: 'Page number is not available/valid #' + pageNumber }
}

let poIds = []
currentPageData.data.forEach((singleResult) => {
poIds.push(singleResult.getValue('internalid'))
})

return {
poIds,
page:pageNumber,
pageSize:pageSize,
total_pages:pageRanges.length,
total_results:pageData.count,
results_returned:poIds.length
}

}

let getImages = (poIds)=>{

let imageMap = {}

let imageRecordSearch = search.create({
type: "customrecord_mob_po_receipt_images",
filters:
[
["custrecord_mob_po_attached","anyof",poIds]
],
columns:
[
search.createColumn({name: "custrecord_mob_po_attached", label: "Purchase Order"}),
search.createColumn({name: "custrecord_mob_reciept_img", label: "Reciept Image"})
]
});

imageRecordSearch.run().each(function(result){
let po= result.getValue({name: "custrecord_mob_po_attached", label: "Purchase Order"})
let image = result.getValue({name: "custrecord_mob_reciept_img", label: "Reciept Image"})

if(imageMap[po])
{
imageMap[po].push(image)
}
else
{
imageMap[po] = [image]
}

return true;
});
return imageMap;
}

return {post}

});
<restlet scriptid="customscript_app_get_purchaseorders">
  <description></description>
  <isinactive>F</isinactive>
  <name>APP Get Purchase Orders</name>
  <notifyadmins>F</notifyadmins>
  <notifyemails></notifyemails>
  <notifyowner>T</notifyowner>
  <notifyuser>F</notifyuser>
  <scriptfile>[/SuiteScripts/APP Get Purchase Orders.js]</scriptfile>
  <scriptdeployments>
    <scriptdeployment scriptid="customdeploy_app_get_purchaseorders">
      <allemployees>F</allemployees>
      <allpartners>F</allpartners>
      <allroles>F</allroles>
      <audemployee>[ACCOUNT_SPECIFIC_VALUE]</audemployee>
      <audslctrole>[scriptid=customrole_restlet_authentication]</audslctrole>
      <isdeployed>T</isdeployed>
      <loglevel>DEBUG</loglevel>
      <status>RELEASED</status>
      <title>APP Get Purchase Orders</title>
    </scriptdeployment>
  </scriptdeployments>
</restlet>

Leave a comment

Your email address will not be published. Required fields are marked *