RE: Scripting help
Hi,
I’m trying to take custom records and add them to expense lines on a vendor bill based on their invoices. I need a bill created for each invoice # with the coordinating custom records on the expense lines. This is the code I have so far, and I’m having trouble combing them based on their invoice #s. Does anyone know what looks wrong or have any other suggestions I could try? I’ve considering trying a group search.
/**
* This script looks for Fedex billings with "Include in Fedex Bill" checked.
* Fedex billings with the same invoice #s are combined into one vendor bill,
* and the Fedex billings are inactivated.
*
* @NApiVersion 2.x
* @NScriptType ScheduledScript
* @NModuleScope SameAccount
*/
define(['N/search', 'N/log', 'N/record', 'N/format'], function (search, log, record, format) {
function fedexBillSearch() {
return search.create({
type: 'customrecordfedexbilling',
filters: [
['custrecord72', 'is', 'T'],
'AND',
['isinactive', 'is', 'F']
],
columns: [
'custrecordfedexsoshipamount',
search.createColumn({
name: 'internalid',
join: 'CUSTRECORDFEDEXCUSTOMER'
}),
'custrecordfedexlocation',
'custrecordfedexso',
search.createColumn({
name: 'formulatext',
formula: "CONCAT(CONCAT(TO_CHAR({today}),' - '), {custrecordfedexinvoice})"
}),
search.createColumn({
name: 'custrecordfedexinvoice',
sort: search.Sort.ASC
}),
search.createColumn({
name: 'custrecordfedexinvdate',
sort: search.Sort.ASC
}),
'internalid'
]
});
}
function getAllResults(searchObj) {
var start = 0;
var allResults = [];
var results = [];
var resultSet = searchObj.run();
results = resultSet.getRange({
start: start,
end: start + 1000
});
allResults = allResults.concat(results);
while (results.length) {
start += 1000;
results = resultSet.getRange({
start: start,
end: start + 1000
});
allResults = allResults.concat(results);
}
return allResults;
}
/**
* This function groups Fedex billings based on invoice #s
* @param {N/search.Result[]} results - Array of search results
* @param {string} fedexinvoice - Name of the field used for grouping
* @returns {Object} - Grouped invoice records
*/
function groupInvoices(results, fedexInvoice) {
var groupedRecords = {};
for (var i = 0; i < results.length; i++) {
var fedexInvoice = record.getValue('custrecordfedexinvoice');
var record = results[i];
var propertyValue = record[fedexInvoice];
if (!groupedRecords[propertyValue]) {
groupedRecords[propertyValue] = [];
}
groupedRecords[propertyValue].push(record);
}
return groupedRecords;
}
/**
* This function creates an array of order information from the search results
* @param {N/search.Result} result - Result object from the search
* @returns {Object} - Order information
*/
function getOrderInfo(results) {
var orderInfo = {};
orderInfo.fulfillid = results.id;
orderInfo.amount = results.getValue('custrecordfedexsoshipamount');
orderInfo.customer = results.getValue({
name: 'internalid',
join: 'CUSTRECORDFEDEXCUSTOMER'
});
orderInfo.location = results.getValue('custrecordfedexlocation');
orderInfo.salesOrder = results.getValue('custrecordfedexso');
orderInfo.externalId = results.getValue({
name: 'formulatext',
formula: "CONCAT(CONCAT(TO_CHAR({today}),' - '), {custrecordfedexinvoice})"
});
orderInfo.invoiceDate = results.getValue('custrecordfedexinvdate');
orderInfo.internalId = results.getValue('internalid');
return orderInfo;
}
function createFedexVendorBill(orderInfo) {
var newFedexVendorBill = record.create({
type: record.Type.VENDOR_BILL,
isDynamic: true
});
var formattedDate = format.parse({
value: orderInfo.invoiceDate,
type: format.Type.DATE
});
newFedexVendorBill.setValue({
fieldId: 'entity',
value: 341
});
newFedexVendorBill.setValue({
fieldId: 'customform',
value: 135
});
newFedexVendorBill.setValue({
fieldId: 'memo',
value: orderInfo.externalId
});
newFedexVendorBill.setValue({
fieldId: 'trandate',
value: formattedDate
});
newFedexVendorBill.setValue({
fieldId: 'account',
value: 112
});
newFedexVendorBill.selectNewLine({
sublistId: 'expense'
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'account',
value: 291
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'amount',
value: orderInfo.amount
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'location',
value: orderInfo.location
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'department',
value: 1
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'custcolrelcustomer',
value: orderInfo.customer
});
newFedexVendorBill.setCurrentSublistValue({
sublistId: 'expense',
fieldId: 'custcolrelsalesorderline',
value: orderInfo.salesOrder
});
newFedexVendorBill.commitLine({
sublistId: 'expense'
});
var newFedexVendorBillId = newFedexVendorBill.save();
return newFedexVendorBillId;
}
function vendorBillSearch(orderInfo) {
var checkForDupe = search.create({
type: 'vendorbill',
filters: [
['externalidstring', 'contains', orderInfo.externalId]
],
columns: [
'internalid'
]
});
return getAllResults(checkForDupe);
}
function inactivateFedexBills(orderInfo) {
record.submitFields({
type: 'customrecordfedexbilling',
id: orderInfo.internalId,
values: {
isinactive: true
}
});
}
function execute(scriptContext) {
var fedexBillSearchObj = fedexBillSearch();
var results = getAllResults(fedexBillSearchObj);
log.debug('search', fedexBillSearchObj);
log.debug('results', results);
var invoiceGroup = groupInvoices(results, 'custrecordfedexinvoice');
log.debug('invoice groups', invoiceGroup);
for (var invoiceNumber in invoiceGroup) {
var customRecords = invoiceGroup[invoiceNumber];
for (var i = 0; i < customRecords.length; i++) {
var customRecord = customRecords[i];
var orderInfo = getOrderInfo(customRecord);
log.debug('orderInfo', orderInfo);
var billResults = vendorBillSearch(orderInfo); // Call vendorBillSearch function
log.debug('billResults', billResults);
if (billResults.length === 0) { // Checking if the vendor bill is a duplicate
var newFedexVendorBillId = createFedexVendorBill(orderInfo);
log.debug('Created Vendor Bill', newFedexVendorBillId);
inactivateFedexBills(orderInfo); // Call inactivateFedexBills function
}
}
}
}
return {
execute: execute
};
});
Hi,
What’s happening currently and what do you expect?
Thanks,
Chris
Thanks for the help. The records aren’t combining based on their invoice #s onto the expense lines of the bills, and instead it’s still making individual bills for each record. For example: if 3 of the custom records have the same invoice #, they would be added as three expense lines on the same bill. I thought by grouping them before creating an array of the search results would do it, but I think I am missing a step somewhere.