/**
* @NApiVersion 2.1
* @NScriptType Restlet
*/
/**
* APP GET transfer Orders
*
* Get the Transfer orders
* .Inventory Transfer Orders with status "Pending Fulfillment" and sourceLocationId = siteId
* .Inventory Transfer Orders with status "Pending Receipt" and destinationLocationId = siteId
*/
define(['N/search','./moment.min.js','./hs.2x.logger.js'],
/**
* @param{search} search
*/
(search,moment,logger) => {
let API = 'TRANSFERORDER'
/**
* 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 = getTransferOrders(requestBody);
if (pageInfo.transferOrders.length == 0) {
response = {
success:true,
total_results:0,
results: []
}
} else {
pageInfo.results = getTransferOrderResults(pageInfo.transferOrders);
delete pageInfo["transferOrders"];
response=pageInfo;
response.success = true
}
let logData = logger.success({
method:logger.method['POST'] ,
message: 'Get Transfer 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 Transfer 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;
};
/**
* get all transfer order data
*/
const getTransferOrderResults = (transferOrderIds) => {
let transferorderSearchObj = search.create({
type: "transferorder",
filters:
[
["type","anyof","TrnfrOrd"],
"AND",
["status","anyof","TrnfrOrd:D","TrnfrOrd:B","TrnfrOrd:F","TrnfrOrd:E"],
"AND",
["internalid","anyof",transferOrderIds]
],
columns:
[
search.createColumn({name: "internalid", label: "internalId", summary:"GROUP"}),
search.createColumn({name: "item", label: "itemId", summary:"GROUP" , sort: search.Sort.ASC}),
search.createColumn({name: "datecreated", label: "dateCreated", summary:"MAX" , sort: search.Sort.DESC,}),
search.createColumn({name: "tranid", label: "transferOrderId", summary:"MAX" }),
search.createColumn({name: "formulatext", label: "status", summary:"MAX", formula:"{statusref.id}"}),
search.createColumn({name: "formulatext", label: "sourceLocationId", summary:"MAX", formula:"{location.id}"}),
search.createColumn({name: "formulatext", label: "destinationLocationId", summary:"MAX", formula:"{transferlocation.id}"}),
search.createColumn({name: 'formulatext', label: "itemName", summary:"MAX", formula:"{item}" }),
search.createColumn({name: 'formulatext', label: "itemDescription", summary:"MAX", formula:"{item.displayname}"}),
search.createColumn({name: "isserialitem", label: "isSerial", summary:"MAX", join: "item"}),
search.createColumn({name: "quantity", label: "quantity", summary:"MAX"}),
search.createColumn({name: "transferorderquantityreceived", label: "quantityReceived", summary:"MAX"}),
search.createColumn({name: "transferorderquantityshipped", label: "quantityShipped", summary:"MAX"})
]
});
let searchColumns = transferorderSearchObj.columns;
let results = [],transferOrderArray =[];
let pageData = transferorderSearchObj.runPaged({
pageSize: 1000
})
let pageRanges = pageData.pageRanges
pageRanges.forEach((pageRange)=>{
currentPageData = pageData.fetch(pageRange)
currentPageData.data.forEach((result) => {
let singleObj = {}
searchColumns.forEach((col)=>{
singleObj[col.label] = result.getValue(col)
})
let existingIndex = transferOrderArray.indexOf(singleObj.internalId)
if (existingIndex == -1) {
results.push({
createdBy: singleObj.createdBy,
internalId: singleObj.internalId,
dateCreated: dateTimeToUtc(singleObj.dateCreated),
transferOrderId: singleObj.transferOrderId,
sourceLocationId: singleObj.sourceLocationId,
destinationLocationId: singleObj.destinationLocationId,
vendorName: singleObj.vendorName,
status: singleObj.status,
itemLines: []
});
transferOrderArray.push(singleObj.internalId);
if(singleObj.itemId) {
results[existingIndex].itemLines.push({
itemId: singleObj.itemId,
itemName: singleObj.itemName,
itemDescription: singleObj.itemDescription,
isSerial: singleObj.isSerial,
quantity: singleObj.quantity,
quantityReceived: singleObj.quantityReceived != '' ? singleObj.quantityReceived : "0",
quantityShipped: singleObj.quantityShipped != '' ? singleObj.quantityShipped : "0"
})
}
}
else{
if(singleObj.itemId) {
results[existingIndex].itemLines.push({
itemId: singleObj.itemId,
itemName: singleObj.itemName,
itemDescription: singleObj.itemDescription,
isSerial: singleObj.isSerial,
quantity: singleObj.quantity,
quantityReceived: singleObj.quantityReceived != '' ? singleObj.quantityReceived : "0",
quantityShipped: singleObj.quantityShipped != '' ? singleObj.quantityShipped : "0"
})
}
}
})
})
return results
}
/**
* get all transfer order Ids
*/
const getTransferOrders = (requestBody)=>{
let site = requestBody.siteId
let searchFilters =[
["type","anyof","TrnfrOrd"],
"AND",
["mainline","is","T"],
"AND",
["status","anyof","TrnfrOrd:D","TrnfrOrd:B","TrnfrOrd:F","TrnfrOrd:E"]
]
if(requestBody.truckTransferOrders)
{
if(site)
{
site = getVehicles(site)
// log.debug("site",site)
if(site.length==0)
{
throw {name:"NO_TRUCKS_IN_LOCATION",message:"This location does not have trucks"}
}
else {
searchFilters.push("AND",site)
}
}
else
{
throw {name:"INVALID_SITE_ID", message:"siteId is null or invalid"}
}
}
else if(site)
{
searchFilters.push("AND",[
[
["status","anyof","TrnfrOrd:D","TrnfrOrd:B","TrnfrOrd:E"],
"AND",
["location","is",site]
],
"OR",
[
["status","anyof","TrnfrOrd:F","TrnfrOrd:E"],
"AND",
["transferlocation","is",site]
]
])
}
let transferOrderSearch = search.create({
type: "transaction",
filters:searchFilters,
columns:[
search.createColumn({
name: "datecreated",
sort: search.Sort.DESC,
label: "Date Created"
}),
'internalid'
]
})
let pageData = transferOrderSearch.runPaged({
pageSize: 1000
})
let pageRanges = pageData.pageRanges
let transferOrders = []
pageRanges.forEach((pageRange)=>{
currentPageData = pageData.fetch(pageRange)
currentPageData.data.forEach((singleResult) => {
transferOrders.push(singleResult.getValue('internalid'))
})
})
return {
transferOrders,
total_results:transferOrders.length
}
}
let getVehicles = (site) =>{
let name = search.lookupFields({
type:"location",
id:site,
columns:["name"]
}).name
let truckOrders = []
let truckOrdersDestination = []
if(name)
{
let locationSearch = search.create({
type:"location",
filters:[["name" ,"startswith",name],'AND',["custrecord_site_type","anyof","5"],"AND",["internalid","noneof",site]],
columns:["internalid"]
})
locationSearch.run().each((result)=>{
let truckId = result.getValue("internalid")
truckOrders.push(["location","is",truckId],"OR")
truckOrdersDestination.push(["transferlocation","is",truckId],"OR")
return true
})
if(truckOrders.length>0) {
truckOrders.pop()
truckOrdersDestination.pop()
return [
[
["status", "anyof", "TrnfrOrd:D", "TrnfrOrd:B", "TrnfrOrd:E"],
"AND",
truckOrders
],
"OR",
[
["status", "anyof", "TrnfrOrd:F", "TrnfrOrd:E"],
"AND",
truckOrdersDestination
]
]
}
else {
return []
}
}else
{
return []
}
}
return {post}
});