Jira Code: AN-80
Added a UPC field and customer PO# in the already existing BOL print out in the SO. The advanced PDF is rendered using a suitelet script and get the UPC field value from the record and replace these values in the advanced PDF template.
Suitelet
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/*******************************************************************************
* CLIENTNAME:AURORA NATURALS AN-65 Print BOL
*
* **************************************************************************
* Date : 13/05/2019
*
* Author: Jobin & Jismi IT Services LLP Script Description : To Print BOL From
* SO Date created : 13/05/2019
*
* REVISION HISTORY
*
* Revision 1.0 ${13/05/2019} aj : created
*
*
******************************************************************************/
define(
[ 'N/file', 'N/render', 'N/record', 'N/search' ],
function(file, render, record, search) {
/*****
* searchForIF
*/
function searchForIF(item,soId)
{
try{
/***********************************************************
* Search for item lines
*/
var salesorderSearchObj = search.create({
type : "salesorder",
filters : [
[ "type", "anyof", "SalesOrd" ],
"AND",
[ "internalidnumber", "equalto", soId ],
"AND",
["item","anyof",item],
"AND",
[ "applyingtransaction.type", "anyof",
"ItemShip" ] ],
columns : [ search.createColumn({
name : "item",
label : "Item"
}), search.createColumn({
name : "applyingtransaction",
label : "Applying Transaction"
}), search.createColumn({
name : "salesdescription",
join : "item",
label : "Description"
}), search.createColumn({
name : "custcol_item_origin",
label : "Origin"
}), search.createColumn({
name : "quantity",
label : "Quantity"
}) ,
search.createColumn({
name: "type",
join: "applyingTransaction",
label: "Type"
}),
search.createColumn({
name: "quantity",
join: "applyingTransaction",
label: "Quantity"
})
]
});
var searchResultCount = salesorderSearchObj.runPaged().count;
// log.debug("salesorderSearchObj result count",
// searchResultCount);
var lotNumber="";
var salesorderSearchResult = salesorderSearchObj.run()
.getRange({
start : 0,
end : 100
});
var object = {};
for (var j = 0; j < salesorderSearchResult.length; j++) {
// ujna
var applyingType = salesorderSearchResult[j].getText({
name: "type",
join: "applyingTransaction",
label: "Type"
})
log.debug("applyingType",applyingType)
var ifNum = salesorderSearchResult[j].getValue({
name : "applyingtransaction",
label : "Applying Transaction"
})
// to get the LOT NUMBER
if (checkif(item) && checkif(ifNum))
lotNumber = lotNumber+ getLotNumberOfItem(item, ifNum);
else
lotNumber = lotNumber+"";
log.debug("lotNumber",lotNumber);
}
return lotNumber;
}catch(e)
{
log.debug(" Err @ searchForIF",e)
log.error(" Err @ searchForIF",e)
}
}
// To check whether a value exists in parameter
function checkif(parameter) {
if (parameter != null && parameter != undefined
&& parameter != false && parameter != "null"
&& parameter != "undefined" && parameter != "false"
&& parameter != "" && parameter != " ") {
return true;
}
}
/*******************************************************************
*
*/
function getLotNumberOfItem(item, ifNum) {
try {
var lotNumber='';
var itemfulfillmentSearchObj = search.create({
type : "itemfulfillment",
filters : [ [ "type", "anyof", "ItemShip" ], "AND",
[ "internalidnumber", "equalto", ifNum ],
"AND",
[ "item.internalidnumber", "equalto", item ]
/* ,"AND", [ "mainline", "is", "T" ] */],
columns : [ search.createColumn({
name : "inventorynumber",
join : "inventoryDetail",
label : " Number"
}) ]
});
var searchResultCount = itemfulfillmentSearchObj.runPaged().count;
if (searchResultCount > 0) {
var itemfulfillmentSearchResult = itemfulfillmentSearchObj
.run().getRange({
start : 0,
end : 1000
});
for (var j = 0; j < itemfulfillmentSearchResult.length; j++) {
lotNumber =lotNumber+ itemfulfillmentSearchResult[j].getText({
name : "inventorynumber",
join : "inventoryDetail",
label : " Number"
})+' <br /> ';
}
}
return lotNumber;
} catch (e) {
log.debug("Err@getLotNumberOfItem", e)
log.error("Err@getLotNumberOfItem", e)
}
}
function onRequest(context) {
try {
var soId = context.request.parameters.recId;
var itemArr = [], items = [];
var itemObj = {};
/***********************************************************
* Search for item lines
*/
var objRecord = record.load({
type : 'salesorder',
id : soId
});
//AJ MOD ON 27.05.2019
var lineNum = objRecord.getLineCount({
sublistId: 'item'
});
var items=[];
for(var i=0;i<lineNum;i++)
{
var itemObj={};
var itemID =objRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
var item=objRecord.getSublistText({
sublistId: 'item',
fieldId: 'custcol_item_id_line',
line: i
});
var upc=objRecord.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_so_item_upc',
line: i
});
var qty=objRecord.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
});
var origin=objRecord.getSublistValue({
sublistId: 'item',
fieldId: 'custcol_item_origin',
line: i
});
var description=objRecord.getSublistValue({
sublistId: 'item',
fieldId: 'description',
line: i
});
// to get the item details
var lotNumbers = searchForIF(itemID,soId);
log.debug("lotNumbers inn rec",lotNumbers);
itemObj = {
item : item,
itemID : itemID,
lotNumber : lotNumbers,
qty : qty,
upc : upc,
origin : origin,
description : description
};
items.push(itemObj);
}
var myFile = render.create();
var template = 114;
myFile.setTemplateById(template);
myFile.addRecord({
templateName : 'record',
record : objRecord
});
/** *Modified on 17 May 2019 * */
myFile.addCustomDataSource({
format : render.DataSource.JSON,
alias : "items",
data : JSON.stringify({
items : items
}).replace(/&/g,'&')
});
var transactionFile = myFile.renderAsPdf();
context.response.writeFile(transactionFile, true);
} catch (error) {
log.error('error @ onRequest', error)
log.debug('error @ onRequest', error)
}
}
return {
onRequest : onRequest
};
});
Advanced PDF template
<?xml version="1.0"?><!DOCTYPE pdf PUBLIC "-//big.faceless.org//report" "report-1.1.dtd">
<pdf>
<head>
<#assign aDateTime = .now>
<#assign aDate = aDateTime?date>
<link name="NotoSans" type="font" subtype="truetype" src="${nsfont.NotoSans_Regular}" src-bold="${nsfont.NotoSans_Bold}" src-italic="${nsfont.NotoSans_Italic}" src-bolditalic="${nsfont.NotoSans_BoldItalic}" bytes="2" />
<#if .locale == "zh_CN">
<link name="NotoSansCJKsc" type="font" subtype="opentype" src="${nsfont.NotoSansCJKsc_Regular}" src-bold="${nsfont.NotoSansCJKsc_Bold}" bytes="2" />
<#elseif .locale == "zh_TW">
<link name="NotoSansCJKtc" type="font" subtype="opentype" src="${nsfont.NotoSansCJKtc_Regular}" src-bold="${nsfont.NotoSansCJKtc_Bold}" bytes="2" />
<#elseif .locale == "ja_JP">
<link name="NotoSansCJKjp" type="font" subtype="opentype" src="${nsfont.NotoSansCJKjp_Regular}" src-bold="${nsfont.NotoSansCJKjp_Bold}" bytes="2" />
<#elseif .locale == "ko_KR">
<link name="NotoSansCJKkr" type="font" subtype="opentype" src="${nsfont.NotoSansCJKkr_Regular}" src-bold="${nsfont.NotoSansCJKkr_Bold}" bytes="2" />
<#elseif .locale == "th_TH">
<link name="NotoSansThai" type="font" subtype="opentype" src="${nsfont.NotoSansThai_Regular}" src-bold="${nsfont.NotoSansThai_Bold}" bytes="2" />
</#if>
<macrolist>
<macro id="nlheader">
<table style="width: 100%; font-size: 10pt;"><tr>
<td rowspan="4" style="padding: 0;"><img src="https://system.na3.netsuite.com/core/media/media.nl?id=10877&c=1313499&h=9b939ca23701b30441fb" style="width: 70%; height: 70%;" /></td>
<td colspan="3" rowspan="4" style="font-size:9pt;align:center">Aurora Products, Inc.<br />205 Edison Road (PEZ BLVD)<br />Orange, CT 06477<br />P:203.375.9956 F:203.375.9734<br /><br />Thank you for your order!!!</td>
<td align="right" colspan="2" style="padding: 0;"><span><b style="font-size: 16pt;">Bill Of Lading </b><br /><b style="font-size: 10pt;">From SO: ${record.tranid}<br />Date: ${aDate} <br />Custom PO#: ${record.otherrefnum}<br/> </b></span><b>Page <pagenumber/> of <totalpages/></b></td>
</tr>
</table>
</macro>
<macro id="nlfooter">
</macro>
</macrolist>
<style type="text/css">* {
<#if .locale == "zh_CN">
font-family: NotoSans, NotoSansCJKsc, sans-serif;
<#elseif .locale == "zh_TW">
font-family: NotoSans, NotoSansCJKtc, sans-serif;
<#elseif .locale == "ja_JP">
font-family: NotoSans, NotoSansCJKjp, sans-serif;
<#elseif .locale == "ko_KR">
font-family: NotoSans, NotoSansCJKkr, sans-serif;
<#elseif .locale == "th_TH">
font-family: NotoSans, NotoSansThai, sans-serif;
<#else>
font-family: NotoSans, sans-serif;
</#if>
}
table {
font-size: 9pt;
table-layout: fixed;
}
th {
font-weight: bold;
font-size: 8pt;
vertical-align: middle;
padding: 5px 6px 3px;
background-color: #e3e3e3;
color: #333333;
}
td {
padding: 4px 6px;
}
td p { align:left }
.headOfItem{
font-weight: bold;
font-size: 8pt;
vertical-align: middle;
}
.itemtable tr td{
border:1;
}
</style>
</head>
<body header="nlheader" header-height="15%" footer="nlfooter" footer-height="20pt" padding="0.5in 0.5in 0.5in 0.5in" size="Letter">
<table style="width: 100%; margin-top: 10px;"><tr>
<td style="font-size: 8pt;width:10%"><b>${record.billaddress@label} :</b></td>
<td style="padding: 0;width:35%">${record.billaddress}</td>
<td style="font-size: 8pt; width:10%;"><b>${record.shipaddress@label} :</b></td>
<td style="padding: 0;width:35%;">${record.shipaddress}</td>
</tr></table>
<table style="width: 100%; margin-top: 10px;"><tr>
<td style="font-size:10pt;font-weight:bold;">Customer Instructions</td>
<td style="font-size:10pt;font-weight:bold;">Special Instructions</td>
</tr>
<tr>
<td style="padding-top: 2px;">${record.custbody_ship_instruction}</td>
<td style="padding-top: 2px;">${record.custbody_spe_instruction}</td>
</tr></table>
<br /><#if record.item?has_content>
<table class="itemtable" style="width: 100%; border:1;"><!-- start items --><#list items.items as item><#if item_index==0><tr>
<td class="headOfItem" style="width: 25%;">Part Number</td>
<td class="headOfItem" style="border-right: 0; width: 38%;">Description</td>
<td class="headOfItem" style="border-right: 0;border-left: 0;width: 14%;">UPC</td>
<td class="headOfItem" style="border-right: 0;border-left: 0;width: 16%;">COO</td>
<td class="headOfItem" style="border-left: 0;align:center; width: 12%;">Qty</td>
<td class="headOfItem" style="width: 25%;">Lot Number</td>
</tr>
</#if>
<tr>
<!-- <#if item.itemtype=='InvtPart' || item.itemtype=='Assembly' >
<td style="width: 20%;">${item.item ? keep_before(" ")}</td>
<#else>
<td style="width: 20%;">${item.item}</td>
</#if>-->
<td style="width: 25%;">${item.item}</td>
<td style="border-right: 0; width: 38%;">${item.description}</td>
<td style="border-right: 0;border-left: 0; width: 14%;">${item.upc}</td>
<td style="border-right: 0;border-left: 0; width: 16%;">${item.origin}</td>
<td style="border-left: 0;align:center; width: 12%;">${item.qty}</td>
<td style="width: 25%;">${item.lotNumber}</td>
</tr>
</#list><!-- end items --></table>
</#if>
<table style="page-break-inside: avoid; width: 100%; margin-top: 10px; border:0; margin-left:50%; "><tr>
<td align="left" font-size="13pt;" margin-left="35%" ><b>Total Qty: ${record.custbody_total_qty_case_so}</b></td></tr>
<tr><td align="left" font-size="13pt;" margin-left="35%"><b>Total Weight: ${record.custbody_atlas_order_weight}</b></td>
</tr>
</table>
</body>
</pdf>