/**
* @NApiVersion 2.1
*/
define(['N/record', 'N/search'],
/**
*
* @param record record module
* @param search search module
* @returns ASN-XML String
*/
(record, search) => {
var errorStack = []
/**
* @description Check whether the given parameter argument has value on it or is it empty.
* ie, To check whether a value exists in parameter
* @param {*} parameter parameter which contains/references some values
* @param {*} parameterName name of the parameter, not mandatory
* @returns {Boolean} true if there exist a value, else false
*/
function checkForParameter(parameter, parameterName) {
if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
return true;
} else {
if (parameterName)
log.debug('Empty Value found', 'Empty Value for parameter ' + parameterName);
return false;
}
}
const xmlAsnShippingNote = {
/**
*
* @param itemFulfillmentId - The item fulfillment id
* @param exchangeRecordId - The record id of the exchange custom record
* @param salesOrderId - The corresponding sales order internal id
*
*/
xmlAsnFile: function (itemFulfillmentId, exchangeRecordId) {
try {
var ifObjRecord = record.load({
type: record.Type.ITEM_FULFILLMENT,
id: itemFulfillmentId,
isDynamic: true
});
let totalLinesDelivered = 0;
let totalQtyDelivered = 0;
let totalQtyOrdered = 0;
let isOrderComplete = false;
//fetch sales order details
const isNumberOrString = (value) => {
return (util.isString(value) || util.isNumber(value))
};
var eXchangeObjRecord = record.load({
type: 'customrecord_ahnz67_jj_foodstuffexchange',
id: exchangeRecordId,
isDynamic: true
})
log.debug("eXchangeObjRecord", eXchangeObjRecord)
//fetch sales order details
var soIds = eXchangeObjRecord.getValue({
fieldId: "custrecord_ahnz67_created_salesorder"
})
log.debug("soIds", soIds)
log.debug("soIds", soIds[0])
var soObjRecord = record.load({
type: record.Type.SALES_ORDER,
id: soIds[0],
isDynamic: true
});
var itemfulfillmentSearchObj = search.create({
type: "itemfulfillment",
// settings:[{"name":"consolidationtype","value":"ACCTTYPE"}],
filters:
[
["type","anyof","ItemShip"],
"AND",
["createdfrom","anyof",soIds],
"AND",
["quantity","greaterthan","0"],
"AND",
["status","anyof","ItemShip:C"],
"AND",
["shipping","is","F"],
"AND",
["taxline","is","F"],
"AND",
["cogs","is","F"]
],
columns:
[
search.createColumn({
name: "quantityuom", // Changed from "quantity" to "quantityuom"
summary: "SUM",
label: "Quantity in Transaction Units"
}),
search.createColumn({
name: "item",
summary: "GROUP",
label: "Item"
})
]
});
var totalQuantityByItem = {}; // Object to store total quantity for each item
var searchResultCount = itemfulfillmentSearchObj.runPaged().count;
log.debug("itemfulfillmentSearchObj result count",searchResultCount);
itemfulfillmentSearchObj.run().each(function(result){
var itemId = result.getValue({ name: "item", summary: "GROUP" });
let totalQDelivered = parseFloat(result.getValue({ name: "quantityuom", summary: "SUM" }) || 0);
// Store the total quantity for this item
totalQuantityByItem[itemId] = totalQDelivered;
// Add to the overall total quantity
totalQtyDelivered += totalQDelivered;
// Log the total quantity for this item
log.debug("Item ID: " + itemId + " Total Quantity Fulfilled: " + totalQtyDelivered);
return true;
});
log.debug("Final quanity to delivered Object",totalQuantityByItem);
log.debug("Final quanity to delivered",totalQtyDelivered);
totalLinesDelivered = Object.keys(totalQuantityByItem).length;
log.debug("lineCount",totalLinesDelivered);
const salesOrderLineCount = soObjRecord.getLineCount({ sublistId: "item" });
const orderedQuantities = {};
// Sum up quantities from the sales order
for (let i = 0; i < salesOrderLineCount; i++) {
const itemId = soObjRecord.getSublistValue({
sublistId: "item",
fieldId: "item",
line: i,
});
const qtyOrdered = parseFloat(
soObjRecord.getSublistValue({
sublistId: "item",
fieldId: "quantity",
line: i,
}) || 0
);
orderedQuantities[itemId] = qtyOrdered || 0;
totalQtyOrdered += qtyOrdered;
log.debug("Running Total Qty Ordered", { itemId, qtyOrdered, totalQtyOrdered });
}
if (totalQtyOrdered===totalQtyDelivered){
log.debug("Order complete is true ");
isOrderComplete=true;
}
else{
log.debug("Order complete is false");
isOrderComplete=false;
}
var priceBeforeGST_record = soObjRecord.getValue({
fieldId: "subtotal"
})
log.debug("priceBeforeGST_record", priceBeforeGST_record)
var asnConfirmationXml = '';
var XML_STRING = eXchangeObjRecord.getValue({
fieldId: 'custrecord_ahnz67_api_xmlresponse'
});
var jsonResponse = eXchangeObjRecord.getValue({
fieldId: 'custrecord_ahnz67_xml_to_json'
});
jsonResponse = JSON.parse(jsonResponse);
var EAN_Prefix = '';
var recordId = exchangeRecordId;
try {
// let temp = XML_STRING.split('</CUSTOMER>')[0]
EAN_Prefix = isNumberOrString(XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
} catch (e) {
EAN_Prefix = isNumberOrString(XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('</CUSTOMER>')[0].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
//errorStack.push(e.message)
log.debug("Error @ split for EAN_Prefix", e);
}
let currentTime = new Date().toISOString().split('.')[0];
let customerCompanyName = jsonResponse.purchase_order_150.customer.company.name;
let customerCompanyAddress1 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address1) ? jsonResponse.purchase_order_150.customer.company.street_address.address1 : "";
let customerCompanyAddress2 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address2) ? jsonResponse.purchase_order_150.customer.company.street_address.address2 : "";
let customerCompanyAddress3 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.address3) ? jsonResponse.purchase_order_150.customer.company.street_address.address3 : "";
let customerCompanyCity = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.city) ? jsonResponse.purchase_order_150.customer.company.street_address.city : "";
let customerCompanyCountry = isNumberOrString(jsonResponse.purchase_order_150.customer.company.street_address.country) ? jsonResponse.purchase_order_150.customer.company.street_address.country : "";
let customerCompanyPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address1) ? jsonResponse.purchase_order_150.customer.company.postal_address.address1 : "";
let customerCompanyPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address2) ? jsonResponse.purchase_order_150.customer.company.postal_address.address2 : "";
let customerCompanyPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.address3) ? jsonResponse.purchase_order_150.customer.company.postal_address.address3 : "";
let customerCompanyPostalCity = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.city) ? jsonResponse.purchase_order_150.customer.company.postal_address.city : "";
let customerCompanyPostalCountry = isNumberOrString(jsonResponse.purchase_order_150.customer.company.postal_address.country) ? jsonResponse.purchase_order_150.customer.company.postal_address.country : "";
let customerCompanyPhone = isNumberOrString(jsonResponse.purchase_order_150.customer.company.phone) ? jsonResponse.purchase_order_150.customer.company.phone : "";
let customerCompanyFax = isNumberOrString(jsonResponse.purchase_order_150.customer.company.fax) ? jsonResponse.purchase_order_150.customer.company.fax : "";
let customerSupplierStoreCode = isNumberOrString(jsonResponse.purchase_order_150.customer.supplier_store_code) ? jsonResponse.purchase_order_150.customer.supplier_store_code : "";
let customerStoreOwnerCode = isNumberOrString(jsonResponse.purchase_order_150.customer.store_owner_code) ? jsonResponse.purchase_order_150.customer.store_owner_code : "";
let supplierCompanyAddress1 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address1) ? jsonResponse.purchase_order_150.supplier.company.street_address.address1 : "";
let supplierCompanyAddress2 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address2) ? jsonResponse.purchase_order_150.supplier.company.street_address.address2 : "";
let supplierCompanyAddress3 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.address3) ? jsonResponse.purchase_order_150.supplier.company.street_address.address3 : "";
let supplierCompanyCity = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.city) ? jsonResponse.purchase_order_150.supplier.company.street_address.city : "";
let supplierCompanyCountry = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.street_address.country) ? jsonResponse.purchase_order_150.supplier.company.street_address.country : "";
let supplierCompanyPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address1) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address1 : "";
let supplierCompanyPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address2) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address2 : "";
let supplierCompanyPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.address3) ? jsonResponse.purchase_order_150.supplier.company.postal_address.address3 : "";
let supplierCompanyPostalCity = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.city) ? jsonResponse.purchase_order_150.supplier.company.postal_address.city : "";
let supplierCompanyPostalCountry = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.postal_address.country) ? jsonResponse.purchase_order_150.supplier.company.postal_address.country : "";
let supplierCompanyPhone = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.phone) ? jsonResponse.purchase_order_150.customer.company.phone : "";
let supplierCompanyFax = isNumberOrString(jsonResponse.purchase_order_150.supplier.company.fax) ? jsonResponse.purchase_order_150.supplier.company.fax : "";
let supplierInternalCode = isNumberOrString(jsonResponse.purchase_order_150.supplier.supplier_internal_code) ? jsonResponse.purchase_order_150.supplier.supplier_internal_code : "";
let foodstuffsSupplierCode = isNumberOrString(jsonResponse.purchase_order_150.supplier.foodstuffs_supplier_code) ? jsonResponse.purchase_order_150.supplier.foodstuffs_supplier_code : "";
let orderNumber = isNumberOrString(jsonResponse.purchase_order_150.order_header.order_num) ? jsonResponse.purchase_order_150.order_header.order_num : "";
let orderDate = isNumberOrString(jsonResponse.purchase_order_150.order_header.order_date) ? jsonResponse.purchase_order_150.order_header.order_date : "";
let purchaseDepartment = isNumberOrString(jsonResponse.purchase_order_150.order_header.purchasing_department) ? jsonResponse.purchase_order_150.order_header.purchasing_department : "";
let supplierEanPrefix = '';
try {
supplierEanPrefix = isNumberOrString(XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
} catch (e) {
supplierEanPrefix = isNumberOrString(XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<SUPPLIER>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
//errorStack.push(e.message)
log.debug("Error @ split for supplierEANPrefix", e);
}
let buyer = isNumberOrString(jsonResponse.purchase_order_150.order_header.buyer) ? jsonResponse.purchase_order_150.order_header.buyer : "";
// let deliverDate = isNumberOrString(jsonResponse.purchase_order_150.order_header.requested_deliver_date) ? jsonResponse.purchase_order_150.order_header.requested_deliver_date : "";
let deliverAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address1) ? jsonResponse.purchase_order_150.order_header.deliver_address.address1 : "";
let deliverAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address2) ? jsonResponse.purchase_order_150.order_header.deliver_address.address2 : "";
let deliverAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.address3) ? jsonResponse.purchase_order_150.order_header.deliver_address.address3 : "";
let deliverAddressCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.city) ? jsonResponse.purchase_order_150.order_header.deliver_address.city : "";
let deliverAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.postal_code) ? jsonResponse.purchase_order_150.order_header.deliver_address.postal_code : "";
let deliverAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.deliver_address.country) ? jsonResponse.purchase_order_150.order_header.deliver_address.country : "";
let billToName = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.name) ? jsonResponse.purchase_order_150.order_header.bill_to.company.name : "";
let billToEanPrefix = '';
try {
billToEanPrefix = isNumberOrString(XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_PREFIX">')[1].split('</ORG_ID>')[0] : ""
} catch (e) {
billToEanPrefix = isNumberOrString(XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0]) ? XML_STRING.split('<BILL_TO>')[1].split('<ORG_ID OrgType="EAN_Prefix">')[1].split('</ORG_ID>')[0] : ""
//errorStack.push(e.message)
log.debug("Error @ split for billToEanPREFIX", e);
}
let billToStreetAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address1) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address1 : "";
let billToStreetAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address2) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address2 : "";
let billToStreetAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address3) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.address3 : "";
let billToStreetCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.city) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.city : "";
let billToStreetAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.postal_code) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.postal_code : "";
let billToStreetAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.country) ? jsonResponse.purchase_order_150.order_header.bill_to.company.street_address.country : "";
let billToPostalAddress1 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address1) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address1 : "";
let billToPostalAddress2 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address2) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address2 : "";
let billToPostalAddress3 = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address3) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.address3 : "";
let billToPostalCity = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.city) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.city : "";
let billToPostalAddressPostalCode = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.postal_code) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.postal_code : "";
let billToPostalAddressCountry = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.country) ? jsonResponse.purchase_order_150.order_header.bill_to.company.postal_address.country : "";
let billToPhone = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.phone) ? jsonResponse.purchase_order_150.order_header.bill_to.company.phone : "";
let billToFax = isNumberOrString(jsonResponse.purchase_order_150.order_header.bill_to.company.fax) ? jsonResponse.purchase_order_150.order_header.bill_to.company.fax : "";
let currency = isNumberOrString(jsonResponse.purchase_order_150.order_header.currency) ? jsonResponse.purchase_order_150.order_header.currency : "";
let spInstructions = isNumberOrString(jsonResponse.purchase_order_150.order_header.special_instructions) ? jsonResponse.purchase_order_150.order_header.special_instructions : "";
let priceBeforeGst = isNumberOrString(jsonResponse.purchase_order_150.order_header.price_before_gst) ? jsonResponse.purchase_order_150.order_header.price_before_gst : "";
//The order item lines of the XML request
let order_line = util.isArray(jsonResponse.purchase_order_150.lines.order_line) ? jsonResponse.purchase_order_150.lines.order_line : [jsonResponse.purchase_order_150.lines.order_line];
//Create an Object of 'Supplier Product'
/* let requestedItemObject = order_line.reduce((accumulator, currentElement) => {
return accumulator[currentElement.supplier_product] = currentElement.supplier_product, accumulator;
}, {});
log.debug('requestedItemObject', requestedItemObject);*/
//Create an Object of 'Supplier Product'
let requestedItemObject1 = order_line.reduce((accumulator, currentElement) => {
// return accumulator[currentElement.supplier_product] = currentElement.supplier_product, accumulator;
return accumulator[currentElement.barcode_product] = currentElement.barcode_product, accumulator;
}, {});
log.debug('requestedItemObject1', requestedItemObject1);
let requestedItemObject2 = order_line.reduce((accumulator, currentElement) => {
return accumulator[currentElement.customer_product] = currentElement.customer_product, accumulator;
}, {});
log.debug('requestedItemObject2 customer product', requestedItemObject2);
let requestedItemObject = { ...requestedItemObject1, ...requestedItemObject2 };
log.debug('requestedItemObject', requestedItemObject)
//Pass the 'Supplier Product' as an Array of Numbers and executes an Item Saved Search
let itemSearchResult = dataSets.fetchItemsByUpcCode(Object.keys(requestedItemObject));
log.debug('itemSearchResult', itemSearchResult);
let itemMap = {};
if (itemSearchResult && util.isArray(itemSearchResult) && itemSearchResult.length)
itemMap = itemSearchResult.reduce((accumulator, currentElement) => {
//Item Map using GTIN CODE (UPC Code) as key
if (currentElement.upccode.value && !accumulator[currentElement.upccode.value])
accumulator[currentElement.upccode.value] = currentElement.internalid.value;
//Item Map using NORTH ISLAND SAP CODE as key
if (currentElement.custitemitem_sapnth.value && !accumulator[currentElement.custitemitem_sapnth.value])
accumulator[currentElement.custitemitem_sapnth.value] = currentElement.internalid.value;
//Item Map using SOUTH ISLAND SAP CODE as key
if (currentElement.custitemitem_sapsth.value && !accumulator[currentElement.custitemitem_sapsth.value])
accumulator[currentElement.custitemitem_sapsth.value] = currentElement.internalid.value;
return accumulator;
}, {});
log.debug('itemMap', itemMap);
asnConfirmationXml = `<ASN_150 partner="FOODSTUFFS" transaction="ASN" version="1.50" timestamp="${currentTime}" document_mode="Live">
<CUSTOMER>
<COMPANY>
<NAME>${customerCompanyName}</NAME>
<ORG_ID OrgType="EAN_Prefix">${EAN_Prefix}</ORG_ID>
<STREET_ADDRESS>
<ADDRESS1>${customerCompanyAddress1}</ADDRESS1>
<ADDRESS2>${customerCompanyAddress2}</ADDRESS2>
<ADDRESS3>${customerCompanyAddress3}</ADDRESS3>
<CITY>${customerCompanyCity}</CITY>
<COUNTRY>${customerCompanyCountry}</COUNTRY>
</STREET_ADDRESS>
<POSTAL_ADDRESS>
<ADDRESS1>${customerCompanyPostalAddress1}</ADDRESS1>
<ADDRESS2>${customerCompanyPostalAddress2}</ADDRESS2>
<ADDRESS3>${customerCompanyPostalAddress3}</ADDRESS3>
<CITY>${customerCompanyPostalCity}</CITY>
<COUNTRY>${customerCompanyPostalCountry}</COUNTRY>
</POSTAL_ADDRESS>
<PHONE>${customerCompanyPhone}</PHONE>
<FAX>${customerCompanyFax}</FAX>
</COMPANY>
<SUPPLIER_STORE_CODE>${customerSupplierStoreCode}</SUPPLIER_STORE_CODE>
<STORE_OWNER_CODE>${customerStoreOwnerCode}</STORE_OWNER_CODE>
</CUSTOMER>
<SUPPLIER>
<COMPANY>
<NAME>${jsonResponse.purchase_order_150.supplier.company.name}</NAME>
<ORG_ID OrgType="EAN_Prefix">${supplierEanPrefix}</ORG_ID>
<STREET_ADDRESS>
<ADDRESS1>${supplierCompanyAddress1}</ADDRESS1>
<ADDRESS2>${supplierCompanyAddress2}</ADDRESS2>
<ADDRESS3>${supplierCompanyAddress3}</ADDRESS3>
<CITY>${supplierCompanyCity}</CITY>
<COUNTRY>${supplierCompanyCountry}</COUNTRY>
</STREET_ADDRESS>
<POSTAL_ADDRESS>
<ADDRESS1>${supplierCompanyPostalAddress1}</ADDRESS1>
<ADDRESS2>${supplierCompanyPostalAddress2}</ADDRESS2>
<ADDRESS3>${supplierCompanyPostalAddress3}</ADDRESS3>
<CITY>${supplierCompanyPostalCity}</CITY>
<COUNTRY>${supplierCompanyPostalCountry}</COUNTRY>
</POSTAL_ADDRESS>
<PHONE>${supplierCompanyPhone}</PHONE>
<FAX>${supplierCompanyFax}</FAX>
</COMPANY>
<SUPPLIER_INTERNAL_CODE >${supplierInternalCode}</SUPPLIER_INTERNAL_CODE>
<FOODSTUFFS_SUPPLIER_CODE>${foodstuffsSupplierCode}</FOODSTUFFS_SUPPLIER_CODE>
</SUPPLIER>
<ORDER_HEADER>
<ORDER_NUM>${orderNumber}</ORDER_NUM>
<ORDER_DATE>${orderDate}</ORDER_DATE>
<PURCHASING_DEPARTMENT>${purchaseDepartment}</PURCHASING_DEPARTMENT>
<BUYER>${buyer}</BUYER>
<ORDER_COMPLETE>${isOrderComplete}</ORDER_COMPLETE>
<DELIVER_ADDRESS>
<ADDRESS1>${deliverAddress1}</ADDRESS1>
<ADDRESS2>${deliverAddress2}</ADDRESS2>
<ADDRESS3>${deliverAddress3}</ADDRESS3>
<CITY>${deliverAddressCity}</CITY>
<POSTAL_CODE>${deliverAddressPostalCode}</POSTAL_CODE>
<COUNTRY>${deliverAddressCountry}</COUNTRY>
</DELIVER_ADDRESS>
<BILL_TO>
<COMPANY>
<NAME>${billToName}</NAME>
<ORG_ID OrgType="EAN_Prefix">${billToEanPrefix}</ORG_ID>
<STREET_ADDRESS>
<ADDRESS1>${billToStreetAddress1}</ADDRESS1>
<ADDRESS2>${billToStreetAddress2}</ADDRESS2>
<ADDRESS3>${billToStreetAddress3}</ADDRESS3>
<CITY>${billToStreetCity}</CITY>
<POSTAL_CODE>${billToStreetAddressPostalCode}</POSTAL_CODE>
<COUNTRY>${billToStreetAddressCountry}</COUNTRY>
</STREET_ADDRESS>
<POSTAL_ADDRESS>
<ADDRESS1>${billToPostalAddress1}</ADDRESS1>
<ADDRESS2>${billToPostalAddress2}</ADDRESS2>
<ADDRESS3>${billToPostalAddress3}</ADDRESS3>
<CITY>${billToPostalCity}</CITY>
<POSTAL_CODE>${billToPostalAddressPostalCode}</POSTAL_CODE>
<COUNTRY>${billToPostalAddressCountry}</COUNTRY>
</POSTAL_ADDRESS>
<PHONE>${billToPhone}</PHONE>
<FAX>${billToFax}</FAX>
</COMPANY>
</BILL_TO>
<CURRENCY>${currency}</CURRENCY>
<SPECIAL_INSTRUCTIONS>${spInstructions}</SPECIAL_INSTRUCTIONS>
<PRICE_BEFORE_GST>${priceBeforeGST_record}</PRICE_BEFORE_GST>
</ORDER_HEADER>
<LINES>`
let LineCount = ifObjRecord.getLineCount({
sublistId: 'item'
});
for (let j = 0; j < LineCount; j++) {
ifObjRecord.selectLine({
sublistId: 'item',
line: j
})
let itemInternalId = ifObjRecord.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'item'
});
//Iterate over order_line to set them as Item in Item Sublist
for (let line of order_line) {
if (itemMap[(line.barcode_product).toString().trim()] == itemInternalId || itemMap[(line.customer_product).toString().trim()] == itemInternalId) {
// totalLinesDelivered += 1;
let itemQuantity = ifObjRecord.getCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity'
});
//totalQtyDelivered += itemQuantity;
let customerProduct = isNumberOrString(line.customer_product) ? line.customer_product : "";
let supplierProduct = isNumberOrString(line.supplier_product) ? line.supplier_product : "";
let barCodeProduct = isNumberOrString(line.barcode_product) ? line.barcode_product : "";
let productId = isNumberOrString(line.product_id) ? line.product_id : "";
let customerSequence = isNumberOrString(line.customer_sequence) ? line.customer_sequence : "";
let supplierSequence = isNumberOrString(line.supplier_sequence) ? line.supplier_sequence : "";
let prodDesc = isNumberOrString(line.product_desc) ? line.product_desc : "";
let qtyOrdered = isNumberOrString(line.qty_ordered) ? line.qty_ordered : "";
//totalQtyOrdered += qtyOrdered
let qtyCarton = isNumberOrString(line.qty_ordered) ? line.qty_in_carton : "";
let testSplit = '';
try {
testSplit = XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0];
} catch (e) {
log.debug("Error @ split for testSplit", e);
testSplit = ''
errorStack.push(e.message)
}
let unitMeasure = '';
try {
unitMeasure = isNumberOrString(XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<UNIT_OF_MEASURE uomcode=')[1].split('>')[1].split('</UNIT_OF_MEASURE')[0]) ? XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<UNIT_OF_MEASURE uomcode=')[1].split('>')[1].split('</UNIT_OF_MEASURE')[0] : ""
} catch (e) {
log.debug("Error @ split for unitMeasure", e);
unitMeasure = ''
errorStack.push(e.message)
}
let price = isNumberOrString(line.pricing_detail.price) ? line.pricing_detail.price : "";
let priceMeasure = '';
try {
priceMeasure = isNumberOrString(XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0]) ? XML_STRING.split(productId.toString().trim() + '</PRODUCT_ID>')[1].split('<PRICE_UNIT_OF_MEASURE priceuomcode=')[1].split('>')[1].split('</PRICE_UNIT_OF_MEASURE')[0] : "";
} catch (e) {
log.debug("Error @ split for priceMeasure", e);
priceMeasure = ''
errorStack.push(e.message)
}
let discount = isNumberOrString(line.pricing_detail.discount) ? line.pricing_detail.discount : "";
let discountList = isNumberOrString(line.pricing_detail.discount_list) ? line.pricing_detail.discount_list : "";
let bonusStock = isNumberOrString(line.pricing_detail.bonus_stock) ? line.pricing_detail.bonus_stock : "";
let linePrice = isNumberOrString(line.pricing_detail.line_price) ? line.pricing_detail.line_price : "";
asnConfirmationXml += `
<ORDER_LINE>
<CUSTOMER_PRODUCT>${customerProduct}</CUSTOMER_PRODUCT>
<SUPPLIER_PRODUCT>${supplierProduct}</SUPPLIER_PRODUCT>
<BARCODE_PRODUCT>${barCodeProduct}</BARCODE_PRODUCT>
<PRODUCT_ID>${productId}</PRODUCT_ID>
<CUSTOMER_SEQUENCE>${customerSequence}</CUSTOMER_SEQUENCE>
<SUPPLIER_SEQUENCE>${supplierSequence}</SUPPLIER_SEQUENCE>
<PRODUCT_DESC>${prodDesc}</PRODUCT_DESC>
<QTY_ORDERED>${qtyOrdered}</QTY_ORDERED>
<UNIT_OF_MEASURE uomcode="Retail Unit">${unitMeasure}</UNIT_OF_MEASURE>
<QTY_IN_CARTON>${qtyCarton}</QTY_IN_CARTON>
<QTY_FOR_DELIVERY>${itemQuantity}</QTY_FOR_DELIVERY>
<PRICING_DETAIL>
<PRICE>${price}</PRICE>
<PRICE_UNIT_OF_MEASURE priceuomcode="Retail Unit">${priceMeasure}</PRICE_UNIT_OF_MEASURE>
<DISCOUNT>${discount}</DISCOUNT>
<DISCOUNT_LIST>${discountList}</DISCOUNT_LIST>
<BONUS_STOCK>${bonusStock}</BONUS_STOCK>
<LINE_PRICE>${linePrice}</LINE_PRICE>
</PRICING_DETAIL>
</ORDER_LINE>`;
}
}
}
asnConfirmationXml += `</LINES>
<CONTROL>
<LINES_DELIVERED>${totalLinesDelivered}</LINES_DELIVERED>
<TOTAL_QTY_ORDERED>${totalQtyOrdered}</TOTAL_QTY_ORDERED>
<TOTAL_QTY_FOR_DELIVERY>${totalQtyDelivered}</TOTAL_QTY_FOR_DELIVERY>
</CONTROL>
</ASN_150>`
log.debug("asnConfirmationXml", asnConfirmationXml);
//Replace the xml escaped character & with encoded &
//asnConfirmationXml = asnConfirmationXml.replace(/&(?!amp;)/gi, encodeURIComponent("&"));
asnConfirmationXml = asnConfirmationXml.replace(/&/g, "&");
eXchangeObjRecord.setValue({
fieldId: 'custrecord_ahnz_78_asn_xml_message',
value: asnConfirmationXml
});
let itemFulfillmentArray = eXchangeObjRecord.getValue({
fieldId: 'custrecord_ahnz_78_item_fulfillment_asn',
});
itemFulfillmentArray.push(itemFulfillmentId);
// log.debug("itemFulfillmentArray", itemFulfillmentArray);
eXchangeObjRecord.setValue({
fieldId: 'custrecord_ahnz_78_item_fulfillment_asn',
value: itemFulfillmentArray
});
eXchangeObjRecord.setValue({
fieldId: 'custrecord_ahnz_78_jj_asn_error',
value: errorStack[0]
});
eXchangeObjRecord.save({
enableSourcing: true,
ignoreMandatoryFields: true
});
return asnConfirmationXml;
} catch (err) {
log.debug("Error @ AsnXmlMessage main", err);
record.submitFields({
type: "customrecord_ahnz67_jj_foodstuffexchange",
id: recordId,
values: {
custrecord_ahnz_78_jj_asn_error: err
},
options: { enableSourcing: true, ignoreMandatoryFields: true }
});
return false;
}
},
}
const dataSets = {
/**
* @description Object referencing NetSuite Saved Search
* @typedef {Object} SearchObj
* @property {Object[]} filters - Filters Array in Search
* @property {Object[]} columns - Columns Array in Search
*/
/**
* @description to format Saved Search column to key-value pair where each key represents each columns in Saved Search
* @param {SearchObj} savedSearchObj
* @param {void|String} priorityKey
* @returns {Object.<String,SearchObj.columns>}
*/
fetchSavedSearchColumn(savedSearchObj, priorityKey) {
let columns = savedSearchObj.columns;
let columnsData = {},
columnName = '';
columns.forEach(function (result, counter) {
columnName = '';
if (result[priorityKey]) {
columnName += result[priorityKey];
} else {
if (result.summary)
columnName += result.summary + '__';
if (result.formula)
columnName += result.formula + '__';
if (result.join)
columnName += result.join + '__';
columnName += result.name;
}
columnsData[columnName] = result;
});
return columnsData;
},
/**
* @description Representing each result in Final Saved Search Format
* @typedef formattedEachSearchResult
* @type {{value:any,text:any}}
*/
/**
* @description to fetch and format the single saved search result. ie, Search result of a single row containing both text and value for each columns
* @param {Object[]} searchResult contains search result of a single row
* @param {Object.<String,SearchObj.columns>} columns
* @returns {Object.<String,formattedEachSearchResult>|{}}
*/
formatSingleSavedSearchResult(searchResult, columns) {
let responseObj = {};
for (let column in columns)
responseObj[column] = {
value: searchResult.getValue(columns[column]),
text: searchResult.getText(columns[column])
};
return responseObj;
},
/**
* @description to iterate over and initiate format of each saved search result
* @param {SearchObj} searchObj
* @param {void|Object.<String,SearchObj.columns>} columns
* @returns {[]|Object[]}
*/
iterateSavedSearch(searchObj, columns) {
if (!checkForParameter(searchObj))
return false;
if (!checkForParameter(columns))
columns = dataSets.fetchSavedSearchColumn(searchObj);
let response = [];
let searchPageRanges;
try {
searchPageRanges = searchObj.runPaged({
pageSize: 1000
});
} catch (err) {
return [];
}
if (searchPageRanges.pageRanges.length < 1)
return [];
let pageRangeLength = searchPageRanges.pageRanges.length;
log.debug('pageRangeLength', pageRangeLength);
for (let pageIndex = 0; pageIndex < pageRangeLength; pageIndex++)
searchPageRanges.fetch({
index: pageIndex
}).data.forEach(function (result) {
response.push(dataSets.formatSingleSavedSearchResult(result, columns));
});
return response;
},
/**
* @description Saved Search for fetching the customer based on Store ID
* @param {Number} STORE_ID - FoodStuff Store ID
* @returns {boolean|*[]|Object[]} Search Result
*/
fetchCustomerByStoreId(STORE_ID) {
let customerSearchObj = search.create({
type: "customer",
filters: [
["isinactive", "is", "F"], //Inactive is false
"AND",
["custentitystore_id", "isnotempty", ""], //Foodstuffs Store ID (Custom) is not empty
"AND",
["custentitystore_id", "is", STORE_ID.toString().trim()] //Foodstuffs Store ID (Custom) is STORE_ID
],
columns: [
search.createColumn({ name: "internalid", label: "internalid" }), //Internal ID
search.createColumn({ name: "entityid", sort: search.Sort.ASC, label: "entityid" }), //Name
search.createColumn({ name: "hasduplicates", label: "hasduplicates" }), //Duplicate
search.createColumn({ name: "category", label: "category" }), //Category
search.createColumn({ name: "companyname", label: "companyname" }), //Company Name
search.createColumn({ name: "custentity2", label: "custentity2" }), //Customer Type (Custom)
search.createColumn({ name: "isperson", label: "isperson" }), //Is Individual
search.createColumn({ name: "salesrep", label: "salesrep" }), //Sales Rep
search.createColumn({ name: "territory", label: "territory" }), //Territory
search.createColumn({ name: "startdate", label: "startdate" }),//Start Date
search.createColumn({ name: "phone", label: "phone" }), //Phone
search.createColumn({ name: "email", label: "email" }), //Email
search.createColumn({ name: "billaddress1", label: "billaddress1" }), //Billing Address 1
search.createColumn({ name: "billaddress2", label: "billaddress2" }), //Billing Address 2
search.createColumn({ name: "billcity", label: "billcity" }), //Billing City
search.createColumn({ name: "billstate", label: "billstate" }), //Billing State/Province
search.createColumn({ name: "billzipcode", label: "billzipcode" }), //Billing Zip
search.createColumn({ name: "billcountry", label: "billcountry" }), //Billing Country
search.createColumn({ name: "shipaddress", label: "shipaddress" }), //Shipping Address
search.createColumn({ name: "billaddress", label: "billaddress" }), //Billing Address
search.createColumn({ name: "custentitystore_id", label: "custentitystore_id" }) //Foodstuffs Store ID (Custom)
]
});
let searchResultCount = customerSearchObj.runPaged().count;
log.debug("fetchCustomerByStoreId result count", searchResultCount);
return dataSets.iterateSavedSearch(customerSearchObj, dataSets.fetchSavedSearchColumn(customerSearchObj, 'label'));
},
/**
* @description Saved Search for fetching the items based on UPC Code / GTIN Code , North Island SAP Code (Custom), South Island SAP Code (Custom)
* @param {Array.<Number>} ITEM_ARRAY - UPC Codes as an Array
* @returns {boolean|[]|Object[]} - Search result
*/
fetchItemsByUpcCode(ITEM_ARRAY) {
var inventoryitemSearchObj = search.create({
type: "inventoryitem",
filters: [
["type", "anyof", "InvtPart"], //Type is Inventory Item
"AND",
["isinactive", "is", "F"], //Inactive is false
"AND",
[].concat(ITEM_ARRAY.reduce((accumulator, currentElement, currentIndex) => {
let formulaString = `formulanumeric: CASE '${currentElement.toString().trim()}' WHEN {upccode} THEN 1 WHEN {custitemitem_sapnth} THEN 1 WHEN {custitemitem_sapsth} THEN 1 ELSE 0 END`;
return 0 === currentIndex ? accumulator.push([formulaString, "equalto", 1]) :
accumulator.push("OR", [formulaString, "equalto", 1]),
accumulator;
}, []))
],
columns: [
search.createColumn({ name: "internalid", label: "internalid" }), //Internal ID
search.createColumn({ name: "itemid", label: "itemid" }), //Name
search.createColumn({ name: "upccode", sort: search.Sort.ASC, label: "upccode" }), //UPC Code
search.createColumn({
name: "custitemitem_sapnth",
sort: search.Sort.ASC,
label: "custitemitem_sapnth"
}), //North Island SAP Code (Custom)
search.createColumn({
name: "custitemitem_sapsth",
sort: search.Sort.ASC,
label: "custitemitem_sapsth"
}) //South Island SAP Code (Custom)
]
});
var searchResultCount = inventoryitemSearchObj.runPaged().count;
// log.debug("fetchItemsByUpcCode result count", searchResultCount);
return dataSets.iterateSavedSearch(inventoryitemSearchObj, dataSets.fetchSavedSearchColumn(inventoryitemSearchObj, 'label'));
},
};
return { xmlAsnShippingNote };
});