define([‘N/search’, ‘N/record’], function (search, record) {
function getInputData() {
return search.create({
type: “itemfulfillment”,
filters: [
[“type”, “anyof”, “ItemShip”],
“AND”,
[“status”, “anyof”, “ItemShip:C”],
“AND”,
[“taxline”, “is”, “F”],
“AND”,
[“shipping”, “is”, “F”],
“AND”,
[“cogs”, “is”, “F”],
“AND”,
[“createdfrom”, “anyof”, “2908708”],
“AND”,
[“mainline”, “is”, “T”],
“AND”,
[“createdfrom.status”, “noneof”, “SalesOrd:G”],
“AND”,
[“createdfrom.type”, “anyof”, “SalesOrd”]
],
columns: [
search.createColumn({ name: “createdfrom”, label: “Created From” }),
search.createColumn({ name: “tranid”, label: “Document Number” }),
search.createColumn({ name: “statusref”, label: “Status” }),
search.createColumn({ name: “item”, label: “Item” }),
search.createColumn({ name: “quantity”, label: “Quantity” }),
search.createColumn({ name: “line”, label: “Line ID” }),
search.createColumn({ name: “lineuniquekey”, label: “Line Unique Key” })
]
});
}
function map(context) {
let searchResult = JSON.parse(context.value);
log.debug(“searchResult”, searchResult);
let createdFrom = searchResult.values.createdfrom.value;
context.write({
key: createdFrom,
value: searchResult
});
}
function reduce(context) {
try {
let salesOrderId = context.key;
let fulfillments = context.values.map(function (value) {
return JSON.parse(value);
});
log.debug(‘Transforming Sales Order’, ‘Sales Order ID: ‘ + salesOrderId);
let invoice = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: salesOrderId,
toType: record.Type.INVOICE
});
let invoiceLines = invoice.getLineCount({ sublistId: ‘item’ });
log.debug(‘Invoice Line Count’, ‘Invoice Lines: ‘ + invoiceLines);
let salesOrder = record.load({
type: record.Type.SALES_ORDER,
id: salesOrderId
});
let salesOrderLines = salesOrder.getLineCount({ sublistId: ‘item’ });
let orderLineQuantities = {};
for (let j = 0; j < fulfillments.length; j++) {
let fulfillment = record.load({
type: record.Type.ITEM_FULFILLMENT,
id: fulfillments[j].id
});
let fulfillmentLines = fulfillment.getLineCount({ sublistId: ‘item’ });
for (let k = 0; k < fulfillmentLines; k++) {
let orderline = fulfillment.getSublistValue({
sublistId: ‘item’,
fieldId: ‘orderline’,
line: k
});
log.debug(‘Order Line ID’, ‘Order Line ID: ‘ + orderline);
let quantity = fulfillment.getSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: k
});
log.debug(‘Quantity’, ‘Quantity: ‘ + quantity);
if (orderLineQuantities.hasOwnProperty(orderline)) {
orderLineQuantities[orderline] += quantity;
} else {
orderLineQuantities[orderline] = quantity;
}
log.debug(‘Order Line: ‘ + orderline, ‘Quantity: ‘ + quantity + ‘, Accumulated Quantity: ‘ + orderLineQuantities[orderline]);
}
}
let linesToDelete = [];
for (let i = parseInt(invoiceLines) – 1; i >= 0; i—) {
let invoiceLineId = invoice.getSublistValue({
sublistId: ‘item’,
fieldId: ‘orderline’,
line: i
});
let itemName = invoice.getSublistText({
sublistId: ‘item’,
fieldId: ‘item’,
line: i
});
log.debug(‘Invoice Line ID’, ‘Invoice Line ID: ‘ + invoiceLineId + ” Item Name “ + itemName);
log.debug(“orderLineQuantities”, orderLineQuantities);
let salesOrder = record.load({
type: record.Type.SALES_ORDER,
id: salesOrderId
});
let salesOrderLines = salesOrder.getLineCount({ sublistId: ‘item’ });
if (orderLineQuantities.hasOwnProperty(invoiceLineId)) {
let totalQuantity = orderLineQuantities[invoiceLineId];
for (let m = 0; m < salesOrderLines; m++) {
let salesOrderLineId = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘line’,
line: m
});
if (salesOrderLineId == invoiceLineId) {
let salesOrderLineFieldValue = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘quantitybilled’,
line: m
});
totalQuantity -= salesOrderLineFieldValue;
break;
}
}
invoice.setSublistValue({
sublistId: ‘item’,
fieldId: ‘quantity’,
line: i,
value: totalQuantity
});
}
else {
let itemId = invoice.getSublistValue({
sublistId: ‘item’,
fieldId: ‘item’,
line: i
});
log.debug(‘Item ID’, ‘Item ID: ‘ + itemId);
let itemFields = search.lookupFields({
type: search.Type.ITEM,
id: itemId,
columns: [‘recordtype’]
});
let itemType = itemFields.recordtype;
log.debug(‘Item Type’, ‘Item Type: ‘ + itemType);
let itemRecord = record.load({
type: itemType,
id: itemId
});
let flag = 0;
let itemFulfillmentCheckbox = itemRecord.getValue({ fieldId: ‘isfulfillable’ });
if ((itemType === ‘discountitem’ || (itemType === ‘noninventoryitem’ && !itemFulfillmentCheckbox)) && i > 0) {
log.debug(“dis , noninv”);
for (let t = 0; t < salesOrderLines; t++) {
let salesOrderLineId = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘line’,
line: t
});
let itemInSo = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘item’,
line: t
});
if ((itemId == itemInSo) && (salesOrderLineId == invoiceLineId)) {
for (let h = parseInt(t) – 1; h >= 0; h—) {
let nextItem = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘item’,
line: h
});
let itemTypeInSo = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘itemtype’,
line: h
});
let secondLineId = salesOrder.getSublistValue({
sublistId: ‘item’,
fieldId: ‘line’,
line: h
});
log.debug(‘Item Type in SO’, ‘Item Type in SO: ‘ + itemTypeInSo);
let itemFieldsInSo = search.lookupFields({
type: search.Type.ITEM,
id: nextItem,
columns: [‘recordtype’]
});
let itemTypeSO = itemFieldsInSo.recordtype;
log.debug(‘Item Type’, ‘Item Type: ‘ + itemTypeSO);
let itemRecordInSO = record.load({
type: itemTypeSO,
id: nextItem
});
let itemFulfillmentCheckboxInSO = itemRecordInSO.getValue({ fieldId: ‘isfulfillable’ });
if ((itemTypeInSo == ‘InvtPart’) || (itemTypeInSo == “NonInvtPart” && itemFulfillmentCheckboxInSO)) {
if (orderLineQuantities.hasOwnProperty(secondLineId)) {
flag = parseInt(flag) + 1;
}
break;
}
}
}
}
}
log.debug(‘Flag’, ‘Flag: ‘ + flag);
if (flag == 0) {
invoice.removeLine({
sublistId: ‘item’,
line: i
});
}
}
}
log.debug(‘Lines to Delete total’, ‘Lines to Delete: ‘ + linesToDelete);
log.debug(‘Before Save Invoice’, ‘Attempting to save invoice’);
let invoiceId = invoice.save({ ignoreMandatoryFields: true });
log.debug(‘Invoice Created’, ‘Invoice ID: ‘ + invoiceId);
} catch (e) {
log.error(‘Error Transforming Sales Order to Invoice’, ‘Sales Order ID: ‘ + salesOrderId + ‘, Error: ‘ + e.name + ‘ – ‘ + e.message);
}
}