Create an additional column for showing the configurator image in the picking ticket (from the Sales order).
Check the picking ticket button functionality (Suitelet: JJ SL PickingTicketPrint.js) and update the script as well as the XML file(if available) to add the personalized image corresponding to the item line.

function pickingTicketPrint(request, response) {
try {
var renderer = nlapiCreateTemplateRenderer();
var salesOrderID = request.getParameter('custparam_recid');
var tranRec = nlapiLoadRecord('salesorder', salesOrderID);
//var data = nlapiLookupField('salesorder', salesOrderID, 'custbody_jj_optionhiddenfield')
var optionDataArray = tranRec.getFieldValue('custbody_jj_optionhiddenfield') ?
JSON.parse(tranRec.getFieldValue('custbody_jj_optionhiddenfield')) : {};
nlapiLogExecution('DEBUG', 'optionDataArray', JSON.stringify(optionDataArray));
var myXMLFile = nlapiLoadFile(268551);
var myXMLFile_value = myXMLFile.getValue();
var tableValue = getPickingTicketTable(salesOrderID, tranRec, optionDataArray);
if (tableValue) {
myXMLFile_value = myXMLFile_value.replace('<!-- ItemTable -->', tableValue);
}
renderer.setTemplate(myXMLFile_value);
renderer.addRecord('record', tranRec);
var xmlRendered = renderer.renderToString();
var file = nlapiXMLToPDF(xmlRendered);
response.setContentType('PDF', 'Print Picking Ticket', 'INLINE');
response.write(file.getValue());
} catch (e) {
nlapiLogExecution('DEBUG', 'error @ pickingTicketPrint', e);
}
}
function getPickingTicketTable(salesOrderID, tranRec, optionDataArray) {
var content;
var salesorderSearch = nlapiSearchRecord("salesorder", null, [
["type", "anyof", "SalesOrd"],
"AND", ["internalidnumber", "equalto", salesOrderID],
"AND", ["mainline", "is", "F"],
"AND", ["taxline", "is", "F"],
"AND", ["commit", "noneof", "3"],
"AND", ["shipping", "is", "F"]
], [
new nlobjSearchColumn("internalid", "item", null),
new nlobjSearchColumn("custitem41", "item", null) /*.setSort(false)*/, //MODIFIED BY ND-20/06/19(PROT-219)
new nlobjSearchColumn("quantitycommitted"),
new nlobjSearchColumn("custcol35"),
new nlobjSearchColumn("quantity"),// MODIFIED BY ND ON 08.07.2019 (To fetch the qty from the SO item sublist)
new nlobjSearchColumn("custcol_ptc_773_item_image_child")//personalised image update
]);
if (salesorderSearch) {
content = '<table style="width: 100%; margin-top: 10px;text-align:left;border: .5px solid #A9A9A9;">' +
'<thead><tr style="text-align:center;"><th width="170px" >BINS</th><th width="200px">Customize Via</th><th width="200px">Item</th>' + '<th align="left" width="150px" >To Ship</th><th width="150px" >Picked</th><th width="250px" >Options</th><th width="250px">Personalized Image</th></tr></thead>';
nlapiLogExecution('DEBUG', 'salesorderSearch.length', salesorderSearch.length);
for (var j = 0; j < salesorderSearch.length; j++) {
var context = nlapiGetContext();
var usageRemaining = context.getRemainingUsage();
nlapiLogExecution('DEBUG', 'usageRemaining', usageRemaining);
var searchresult = salesorderSearch[j];
var itemId = searchresult.getValue("internalid", "item");
var balanceToShip = searchresult.getValue("quantitycommitted");
var comit = searchresult.getValue("custcol35");
// var comit = searchresult.getValue("quantitycommitted");
var qty = searchresult.getValue("quantity");
var customize_via = searchresult.getText("custitem41", "item");
var personalized_imageURL = searchresult.getValue("custcol_ptc_773_item_image_child");//personalised image update
//AJ MOD ON 10.05.2019
/* nlapiLogExecution('DEBUG', 'comit',comit);
nlapiLogExecution('DEBUG', 'customize_via',customize_via);
nlapiLogExecution('DEBUG', 'searchresult',searchresult);*/
var row_no = j + 1;
nlapiLogExecution('DEBUG', 'balanceToShip', balanceToShip);
/* if (balanceToShip > 0) { JJ0016 commented*/
if (balanceToShip > 0) {
content += retriveBindetails(context, salesOrderID, tranRec, itemId, customize_via, row_no, optionDataArray, balanceToShip, qty, comit, personalized_imageURL);
nlapiLogExecution('DEBUG', 'Inn1', itemId);
}
nlapiLogExecution('DEBUG', 'itemId', itemId);
if (itemId == -3) {
content += displayDescription(tranRec, row_no);
} else if ((balanceToShip == "" || balanceToShip == null || balanceToShip == undefined || balanceToShip == '- None -' || balanceToShip == " ") && itemId != -3) {
content += retriveBindetails(context, salesOrderID, tranRec, itemId, customize_via, row_no, optionDataArray, "", qty, comit,personalized_imageURL);
nlapiLogExecution('DEBUG', 'Inn2', itemId);
}
}
content += '</table>';
nlapiLogExecution('DEBUG', 'Contents', content);
}
return content;
}
function retriveBindetails(context, salesOrderID, tranRec, itemId, customize_via, row, optionDataArray, balanceToShip, qty, comit,personalized_imageURL) {
try {
var usageRemaining_retriveBindetails = context.getRemainingUsage();
nlapiLogExecution('DEBUG', 'usageRemaining_retriveBindetails', usageRemaining_retriveBindetails);
var filter = [];
filter.push(new nlobjSearchFilter('internalidnumber', null, 'equalto', itemId));
nlapiLogExecution('DEBUG', "personalized_imageURL",personalized_imageURL);
var coloumn = [];
coloumn.push(new nlobjSearchColumn('type', null));
coloumn.push(new nlobjSearchColumn('itemid', null));
coloumn.push(new nlobjSearchColumn('displayname', null));
var searchresults = nlapiSearchRecord('item', null, filter, coloumn);
var type = 'inventoryitem';
var itemName = "";
if (searchresults) {
type = searchresults[0].getRecordType();
itemName = nlapiEscapeXML(searchresults[0].getValue('itemid') + ' ' + searchresults[0].getValue('displayname'));
}
nlapiLogExecution('DEBUG', 'itemName', itemName);
// nlapiLogExecution('DEBUG', "TYPE", type +' itemId'+itemId);
var itemRecord = null;
try {
itemRecord = nlapiLoadRecord(type, itemId);
} catch (e) {
itemRecord = nlapiLoadRecord('descriptionitem', itemId);
}
var binDetails = "";
var lineCount = itemRecord.getLineItemCount('binnumber');
if (lineCount > 0) {
for (var j = 1; j <= lineCount; j++) {
var binnumber = itemRecord.getLineItemValue('binnumber', 'binnumber', j);
// nlapiLogExecution('DEBUG', "binnumber",binnumber);
var binnumber_display = itemRecord.getLineItemValue('binnumber', 'binnumber_display', j);
// nlapiLogExecution('DEBUG', "binnumber_display",binnumber_display);
var onhand = itemRecord.getLineItemValue('binnumber', 'onhand', j);
if (onhand == null || onhand == undefined) {
onhand = 0;
}
if (j == 1) {
binDetails = binnumber_display + ":" + onhand;
} else {
binDetails = binDetails + ", " + binnumber_display + ":" + onhand;
}
}
}
// nlapiLogExecution('DEBUG', "binDetails",binDetails);
if (type == 'kititem') {
// itemRecord = nlapiLoadRecord(type, itemId);
var kititemSearch = nlapiSearchRecord("kititem", null, [
["type", "anyof", "Kit"],
"AND", ["internalidnumber", "equalto", itemId]
], [
new nlobjSearchColumn("memberitem"),
new nlobjSearchColumn("binnumber", "memberItem", null),
new nlobjSearchColumn("binonhandcount", "memberItem", null)
]);
// nlapiLogExecution('DEBUG', "kititemSearch",JSON.stringify(kititemSearch));
if (kititemSearch) {
for (var i = 0; i < kititemSearch.length; i++) {
var onHand = kititemSearch[i].getValue("binonhandcount", "memberItem", null);
var binnumber_Display = kititemSearch[i].getValue("binnumber", "memberItem", null);
if (onHand == null || onHand == undefined) {
onHand = 0;
}
if (i == 0) {
if (binnumber_Display) {
binDetails = binnumber_Display + ":" + onHand;
}
} else {
if (binnumber_Display) {
binDetails = binDetails + ", " + binnumber_Display + ":" + onHand;
}
}
}
}
}
var quantity = tranRec.getLineItemValue('item', 'quantity', row);
var itemRowContent = wrapTD(binDetails, "150px");
itemRowContent += wrapTD(customize_via, "100px");
itemRowContent += wrapTD(itemName, "250px");
//itemRowContent += wrapTD(description, "200px");
if (quantity == null) {
quantity = "";
}
/*AJ COMMENTED ON 10.05.19 if((type.indexOf('Kit')>-1 || type.indexOf('InvtPart')>-1 || type.indexOf('NonInvtPart')>-1) && itemName !='MISC TO BE DETERMINED' && itemName !='SUF SET UP FEE'){
*/
nlapiLogExecution('DEBUG', "type", type);
if (type.indexOf('noninventoryitem') > -1 || type.indexOf('Non-inventory Item') > -1 || type.indexOf('NonInvtPart') > -1) {
itemRowContent += wrapTD(qty, "75px"); // MODIFIED BY ND ON 08.07.2019 (to pull from the quantity for non-inventory items)
itemRowContent += wrapTD("", "75px");
itemRowContent += wrapTD(getOptions(itemName.trim(), optionDataArray, row, comit), "180px");
//itemRowContent += wrapTD("aaaa", "150px");
itemRowContent += wrapTD1(personalized_imageURL, "150px");
return wrapNonInvTr(itemRowContent);
} else if (type.indexOf('Kit') > -1 || type.indexOf('kititem') > -1) {
//commented JJ0016
/*itemRowContent += wrapTD(balanceToShip, "75px");*/
itemRowContent += wrapTD(qty, "75px");
itemRowContent += wrapTD("", "75px");
itemRowContent += wrapTD(getOptions(itemName.trim(), optionDataArray, row, comit), "180px");
//itemRowContent += wrapTD(personalized_imageURL,"150px");
itemRowContent += wrapTD1(personalized_imageURL, "150px");
return wrapNonInvTr(itemRowContent);
} else if ((type.indexOf('lotnumberedinventoryitem') > -1 || type.indexOf('InvtPart') > -1 || type.indexOf('Inventory Item') > -1 /*|| type.indexOf('Non-inventory Item') > -1 || type.indexOf('NonInvtPart') > -1*/) && itemName != 'MISC TO BE DETERMINED' && itemName != 'SUF SET UP FEE') {
// nlapiLogExecution('DEBUG', 'type other',type);
/* itemRowContent += wrapTD(balanceToShip, "75px"); -->JJ0016*/
itemRowContent += wrapTD(qty, "75px");
itemRowContent += wrapTD("", "75px");
//itemRowContent += wrapTD("", "180px");
itemRowContent += wrapTD(getOptions(itemName.trim(), optionDataArray, row, comit), "180px");
//itemRowContent += wrapTD(personalized_imageURL,"150px");
//itemRowContent += wrapTD("aaaa", "150px");
itemRowContent += wrapTD1(personalized_imageURL, "150px");
return wrapNonInvTr(itemRowContent);
} else {
/* itemRowContent += wrapTD(balanceToShip, "75px");*/
itemRowContent += wrapTD(qty, "75px");
itemRowContent += wrapTD("", "75px");
// itemRowContent += wrapTD("", "180px");
itemRowContent += wrapTD(getOptions(itemName.trim(), optionDataArray, row, comit), "180px");
//itemRowContent += wrapTD(personalized_imageURL,"150px");
itemRowContent += wrapTD1(personalized_imageURL, "150px");
return wrapInvTr(itemRowContent);
}
} catch (e) {
nlapiLogExecution('DEBUG', 'error @ retriveBindetails', e);
}
}
function displayDescription(tranRec, row) {
var description = nlapiEscapeXML(tranRec.getLineItemValue('item', 'description', row));
var itemRowContent = wrapTD('', "100px");
itemRowContent += wrapTD('Description', "150px");
itemRowContent += wrapTD(description, "200px");
itemRowContent += wrapTD("", "75px");
itemRowContent += wrapTD("", "75px");
itemRowContent += wrapTD("", "75px");
return wrapInvTr(itemRowContent);
}
function getOptions(itemName, optionDataArray, row, comit) {
nlapiLogExecution('DEBUG', '**********', '******************************');
nlapiLogExecution('DEBUG', 'itemName', itemName);
nlapiLogExecution('DEBUG', 'row', row);
nlapiLogExecution('DEBUG', 'comit', comit);
nlapiLogExecution('DEBUG', 'optionDataArray', JSON.stringify(optionDataArray));
var content1 = ""
nlapiLogExecution('DEBUG', 'optionDataArray.length ', optionDataArray.length);
for (var i = 0; i < optionDataArray.length; i++) {
// nlapiLogExecution('DEBUG', 'i ', i);
var obj = optionDataArray[i];
nlapiLogExecution('DEBUG', 'obj', JSON.stringify(obj));
nlapiLogExecution('DEBUG', 'i ' + optionDataArray.length, i);
if (obj.comit == "" || obj.comit == null || obj.comit == undefined || obj.comit == '- None -' || obj.comit == " " || comit == "" || comit == null || comit == undefined || comit == '- None -' || comit == " ") {
// nlapiLogExecution('DEBUG', 'test', c);
obj.comit = 0;
comit = 0;
}
if ((obj.name.toString().trim().replace(/ /g, '') == itemName.toString().trim().replace(/ /g, '')) && (obj.comit.toString().trim().replace(/ /g, '') == comit.toString().trim().replace(/ /g, ''))) {
var option = obj.options;
nlapiLogExecution('DEBUG', 'option', option);
if (option.indexOf('replaceplus') != -1 || option.indexOf('replaceand') != -1 || option.indexOf('replacelsst') != -1 || option.indexOf('replacegrt') != -1 || option.indexOf('break') != -1 || option.indexOf('replacespace') != -1 || option.indexOf('replacehash') != -1) {
// nlapiLogExecution('DEBUG', 'option with spcl chara', option);
content1 = option.replace(/replaceplus/g, '+');
content1 = content1.replace(/replacespace/g, ' ');
content1 = content1.replace(/replacehash/g, '#');
content1 = content1.replace(/break/g, '<br/>');
content1 = content1.replace(/replaceand/g, '&');
content1 = content1.replace(/replacelsst/g, '<');
content1 = content1.replace(/replacegrt/g, '>');
// nlapiLogExecution('DEBUG', 'content1 inside loop', content1);
// break; /* MODIFIED BY ND-11/06/19(PROT-217)*/
} else {
content1 = option
// nlapiLogExecution('DEBUG', 'content1 else', content1);
}
nlapiLogExecution('DEBUG', 'content1 return', content1);
return content1;
}
}
nlapiLogExecution('DEBUG', 'content1 returnempty', content1);
return "";
}
function wrapNonInvTr(value) {
return '<tr style="text-align:left;border: .05px solid #A9A9A9;" class="noninv" >' + value + '</tr>';
}
function wrapInvTr(value) {
return '<tr style="text-align:left;border: .05px solid #A9A9A9;" >' + value + '</tr>';
}
function wrapTD(value, width) {
return '<td style="text-align:left;border: .05px solid #A9A9A9;" width="' + width + '" ><p align="left">' + value + '</p></td>';
}
function wrapTD1(value, width) {
// var index=value.lastIndexOf(',');
// nlapiLogExecution('DEBUG', 'coma index', index);
// var value1=value.replaceAt(index,';');
// nlapiLogExecution('DEBUG','final value',value1)
var value1
value1 = value.replace(/&/g, "&")
value1 = value1.replace(/</g, "<")
value1 = value1.replace(/>/g, ">")
value1 = value1.replace(/"/g, """)
value1 = value1.replace(/'/g, "'");
nlapiLogExecution('DEBUG','final222 value',value1);
return '<td style="text-align:left;border: .05px solid #A9A9A9;" width="' + width + '" ><img style="display: block; width:100px; height:100px;" src="' + value1 + '" ></img></td>';
}