/**
* @NApiVersion 2.x
* @NModuleScope SameAccount
* @NScriptType Suitelet
*/
/*
***********************************************************************
*
* Author: Jobin and Jismi IT Services LLP
*
* REVISION HISTORY
*
* Revision 1.0
*
* Description: Script to print kit items on clicking the button "Print commercial invoice"
*
* Revision 2.0
*
***********************************************************************/
/**
* The following entry point is deployed on Item Fulfillment
*/
define(['N/render','N/record','N/runtime','N/search'], function(render,record,runtime,search) {
/**
* Function to get the item details from the item record
* @param {ffID} ffID
* @return {itemArr} itemArr
**/
function getItemDetails(ffID) {
try{
//var itemLineObj = {}
var itemArr = []
var totalVal = 0;
var itemfulfillmentSearchObj = search.create({
type: "itemfulfillment",
filters:
[
["type", "anyof", "ItemShip"],
"AND",
["internalid", "anyof", ffID],
"AND",
["cogs", "is", "F"],
"AND",
["taxline", "is", "F"],
"AND",
["shipping", "is", "F"]
],
columns:
[
search.createColumn({
name: "itemid",
join: "item",
label: "Name"
}),
search.createColumn({
name: "salesdescription",
join: "item",
label: "Description"
}),
search.createColumn({name: "quantity", label: "Quantity"}),
search.createColumn({name: "custcol_eb_manufacturertariff", label: "Manufacturer Tariff"}),
search.createColumn({
name: "countryofmanufacture",
join: "item",
label: "Manufacturer Country"
}),
search.createColumn({name: "unitabbreviation", label: "Units"}),
search.createColumn({name: "custcol_eb_rate_2", label: "EB | Rate 2"}),
search.createColumn({name: "custcol_eb_discount", label: "Discount"}),
search.createColumn({name: "custcol_eb_amount_2", label: "EB | Amount 2 "}),
search.createColumn({name: "custcol_eb_composition", label: "Composition"}),
search.createColumn({name: "billcity", label: "Billing City"}),
search.createColumn({name: "billaddress", label: "Billing Address"}),
search.createColumn({
name: "internalid",
join: "item",
label: "Internal ID"
}),
search.createColumn({
name: "type",
join: "item",
label: "Type"
}),
search.createColumn({
name: "memo",
join: "createdFrom",
label: "Memo"
}),
search.createColumn({
name: "internalid",
join: "customerMain",
label: "Internal ID"
}),
search.createColumn({
name: "category",
join: "customerMain",
label: "Category"
})
]
});
var searchResultCount = itemfulfillmentSearchObj.runPaged().count;
// log.debug("searchResultCount",searchResultCount)
if (searchResultCount > 0) {
itemfulfillmentSearchObj.run().each(function (result) {
// .run().each has a limit of 4,000 results
var itemObj = {}
var componentName = result.getValue(itemfulfillmentSearchObj.columns[0]);
var componentDes = result.getValue(itemfulfillmentSearchObj.columns[1]);
var componentQnty = result.getValue(itemfulfillmentSearchObj.columns[2]);
var componentManufcr = result.getValue(itemfulfillmentSearchObj.columns[3]);
var componentManufcrCntry = result.getValue(itemfulfillmentSearchObj.columns[4]);
var componentUnit = result.getValue(itemfulfillmentSearchObj.columns[5]);
var componentRate = result.getValue(itemfulfillmentSearchObj.columns[6]);
var componentDiscount = result.getValue(itemfulfillmentSearchObj.columns[7]);
var componentAmount = result.getValue(itemfulfillmentSearchObj.columns[8]);
var composition = result.getValue(itemfulfillmentSearchObj.columns[9]);
var city = result.getValue(itemfulfillmentSearchObj.columns[10]);
var address = result.getValue(itemfulfillmentSearchObj.columns[11]);
var internalId = result.getValue(itemfulfillmentSearchObj.columns[12]);
var recType = result.getValue(itemfulfillmentSearchObj.columns[13]);
var salesMemo=result.getValue(itemfulfillmentSearchObj.columns[14]);
var customerId=result.getValue(itemfulfillmentSearchObj.columns[15]);
var custCategory=result.getValue(itemfulfillmentSearchObj.columns[16]);
if (recType == 'Assembly')
recType = "assemblyitem"
else if (recType === 'Kit')
recType = "kititem"
else if (recType == "InvtPart")
recType = "inventoryitem"
else if (recType == "InvtPart")
recType = "lotnumberedinventoryitem"
else if (recType == "service")
recType = "serviceitem"
else if (recType == "OthCharge")
recType = "otherchargeitem"
else if (recType == "NonInvtPart")
recType = "noninventoryitem"
else if (recType == "discount")
recType = "discountitem"
var ItemRec = record.load({
type: recType,
id: internalId
})
itemObj.salesMemo = salesMemo;
itemObj.customerId = customerId;
itemObj.custCategory = custCategory;
itemObj.componentName = componentName;
itemObj.componentDes = componentDes;
itemObj.componentQnty = componentQnty;
itemObj.componentManufcr = componentManufcr;
itemObj.componentManufcrCntry = componentManufcrCntry;
itemObj.componentUnit = componentUnit;
itemObj.componentRate = componentRate;
itemObj.componentDiscount = componentDiscount;
itemObj.componentAmount = (componentAmount - ((componentAmount * componentDiscount) / 100)).toFixed(2);
itemObj.composition = composition;
itemObj.city = city;
itemObj.address = address;
itemObj.tariff = ItemRec.getValue({fieldId: 'manufacturertariff'});
itemObj.totalVal = (totalVal + (componentAmount - ((componentAmount * componentDiscount) / 100))).toFixed(2);
itemArr.push(itemObj)
return true;
});
log.debug('item Array...', itemArr)
return itemArr;
}
}catch(e){
log.debug("error",e)
}
}
function itemfullfilldetaiis(ffID){
try{
var recorddetailsObj = {}
var itemfulfillmentSearch = search.create({
type: "itemfulfillment",
filters:
[
["type", "anyof", "ItemShip"],
"AND",
["internalid", "anyof", ffID]
],
columns:
[
search.createColumn({
name: "memo",
join: "createdFrom",
label: "Memo"
}),
search.createColumn({
name: "internalid",
join: "customerMain",
label: "Internal ID"
}),
search.createColumn({
name: "category",
join: "customerMain",
label: "Category"
})
]
});
var searchResultCount = itemfulfillmentSearch.runPaged().count;
itemfulfillmentSearch.run().each(function (result) {
// .run().each has a limit of 4,000 results
var salesMemo = result.getValue(itemfulfillmentSearch.columns[0]);
var customerId = result.getValue(itemfulfillmentSearch.columns[1]);
var custCategory = result.getText(itemfulfillmentSearch.columns[2]);
recorddetailsObj.salesMemo = salesMemo;
recorddetailsObj.customerId = customerId;
recorddetailsObj.custCategory = custCategory;
});
log.debug('item Array...', recorddetailsObj)
return recorddetailsObj;
}catch (e) {
log.debug("error",e)
}
}
/**
* Defines the Suitelet script trigger point.
* @param {Object} context
* @param {ServerRequest} context.request - Incoming request
* @param {ServerResponse} context.response - Suitelet response
* @since 2015.2
*/
function onRequest(context) {
try {
var response = context.response;
var scriptInstance = runtime.getCurrentScript();
// Get the internal ID of the fulfillment that initiated this script
var ffID = context.request.parameters.fulfillmentID;
// log.debug("ffID",ffID)
var itemFulfillmentRecord = record.load({
type: record.Type.ITEM_FULFILLMENT,
id: ffID
})
var soID = itemFulfillmentRecord.getValue({
fieldId: 'createdfrom'
})
var salesOrderRecord = record.load({
type: record.Type.SALES_ORDER,
id: soID
})
//
var itemCount = itemFulfillmentRecord.getLineCount({sublistId: 'item'});
var soCount = salesOrderRecord.getLineCount({sublistId: 'item'});
//log.debug("before for loop", scriptInstance.getRemainingUsage());
var itemFulfillmentId = itemFulfillmentRecord.id;
// setting the value to the custo field in the IF record
for(var i=0; i<itemCount; i++){
var ifItem = itemFulfillmentRecord.getSublistValue({sublistId:'item',fieldId:'item',line: i});
var soUnitPrice;
//loop through SO to find its unit price
for(var j=0; j<soCount; j++){
var soItem = salesOrderRecord.getSublistValue({sublistId:'item',fieldId:'item',line: j});
if (ifItem == soItem){
soUnitPrice = salesOrderRecord.getSublistValue({sublistId:'item',fieldId:'rate',line: j});
break;
}
}
var qty = itemFulfillmentRecord.getSublistValue({sublistId:'item',fieldId:'quantity',line: i});
var ifAmount = soUnitPrice * qty;
itemFulfillmentRecord.setSublistValue({sublistId:'item',fieldId:'custcol_eb_amount_2',value:ifAmount,line: i});
itemFulfillmentRecord.setSublistValue({sublistId:'item',fieldId:'custcol_eb_rate_2',value:soUnitPrice,line: i});
log.debug("EB | Amount 2",itemFulfillmentRecord.getSublistValue({sublistId:'item',fieldId:'custcol_eb_amount_2',line: i}));
log.debug("EB | Rate 2",itemFulfillmentRecord.getSublistValue({sublistId:'item',fieldId:'custcol_eb_rate_2',line: i}));
log.debug("for loop ["+ i + "]",scriptInstance.getRemainingUsage());
}
itemFulfillmentRecord.save();
//loop through itemfulfillment record
for (var i = 0; i < itemCount; i++) {
var ifItem = itemFulfillmentRecord.getSublistValue({sublistId: 'item', fieldId: 'item', line: i});
var itemType = itemFulfillmentRecord.getSublistValue({
sublistId: "item",
fieldId: "itemtype",
line: i
});
//log.debug("itemType", itemType)
var itemID = itemFulfillmentRecord.getSublistValue({
sublistId: "item",
fieldId: "item",
line: i
});
// log.debug("itemID", itemID)
}
var itemdetails = getItemDetails(ffID)
var recordDetails=itemfullfilldetaiis(ffID)
log.debug("recordDetails", recordDetails)
var pdfFiles = renderTemplateFile(itemdetails, ffID,recordDetails)
response.writeFile(pdfFiles, true)
}catch(e){
log.debug("error",e)
}
}
/**
* Function to render the pdf template from the item fulfillment record
* @param {itemLineDetails,ffID}itemLineDetails,ffID
* @return {pdf} pdf
**/
function renderTemplateFile(itemLineDetails,ffID,recordDetails) {
try{
var templateRenderer = render.create();
//template id 107
templateRenderer.setTemplateById(135);
// log.debug("testing id")
templateRenderer.addRecord('record', record.load({
type: record.Type.ITEM_FULFILLMENT,
id: ffID
}));
templateRenderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: "itemLineDetails",
data: {
itemLineDetails: itemLineDetails
}
});
templateRenderer.addCustomDataSource({
format: render.DataSource.OBJECT,
alias: 'recordDetails',
data: recordDetails
});
var pdf = templateRenderer.renderAsPdf();
pdf.name = "Commercial Invoice " + ffID + ".pdf";
return pdf;
// log.debug("end", scriptInstance.getRemainingUsage());
} catch(e){
log.debug("error",e)
}
}
return {
onRequest: onRequest
}
})