Description
Populate all related credit memo in a sales order.
Solution
/**
* @NApiVersion 2.1
* @NScriptType UserEventScript
*/
define(['N/record', 'N/search'],
/**
* @param{record} record
* @param{search} search
*/
(record, search) => {
/**
* Function to search the created from record
* @param createdFromId is the created from id from the credit memo record
* @returns {{}}
*/
function createdFromRecordSearch(createdFromId) {
try {
let transactionSearchObj = search.create({
type: "transaction",
filters:
[
["type", "anyof", "RtnAuth", "CustInvc"],
"AND",
["internalid", "is", createdFromId],
"AND",
["mainline", "is", "T"]
],
columns:
[
search.createColumn({name: "internalid", label: "Internal ID"}),
search.createColumn({name: "type", label: "Type"})
]
});
let searchResultCount = transactionSearchObj.runPaged().count;
log.debug("transactionSearchObj result count", searchResultCount);
let recordId, recordType
if (searchResultCount > 0) {
let resultObj = {};
transactionSearchObj.run().each(function (result) {
let resObj = {};
recordId = result.getValue({
name: "internalid", label: "Internal ID"
});
recordType = result.getValue({
name: "type", label: "Type"
});
resObj.recordType = recordType;
resObj.internalid = recordId
resultObj = resObj;
return true;
});
return resultObj;
} else {
return {};
}
} catch (err) {
log.debug("error@createdFromRecordSearch", err)
return {};
}
}
/**
* Function to search the related transactions
* @param recordId is the internal id of the record
* @param recordType is the record type
* @returns {{}}
*/
function relatedTransaction(recordId, recordType) {
try {
var transactionSearchObj = search.create({
type: "transaction",
filters:
[
["type", "is", recordType],
"AND",
["internalid", "is", recordId],
"AND",
["mainline", "is", "T"]
],
columns:
[
search.createColumn({name: "createdfrom", label: "Created From"}),
search.createColumn({
name: "internalid",
join: "createdFrom",
label: "Internal ID"
}),
search.createColumn({
name: "type",
join: "createdFrom",
label: "Type"
})
]
});
let searchResultCount = transactionSearchObj.runPaged().count;
log.debug("SearchObj result count", searchResultCount);
let transactionId, transactionType
if (searchResultCount > 0) {
let obj = {};
transactionSearchObj.run().each(function (result) {
let transObj = {};
transactionId = result.getValue({
name: "internalid",
join: "createdFrom",
label: "Internal ID"
});
transactionType = result.getValue({
name: "type",
join: "createdFrom",
label: "Type"
});
transObj.transactionId = transactionId;
transObj.transactionType = transactionType;
obj = transObj;
return true;
});
return obj;
} else {
return {};
}
} catch (err) {
log.debug("error@relatedSalesOrder", err)
return {};
}
}
function invoiceSearch(invoiceArray)
{
try
{
let invoiceSearchObj = search.create({
type: "invoice",
filters:
[
["type","anyof","CustInvc"],
"AND",
["internalid","is",invoiceArray],
"AND",
["mainline","is","T"]
],
columns:
[
search.createColumn({
name: "internalid",
join: "createdFrom",
label: "Internal ID"
}),
search.createColumn({name: "createdfrom", label: "Created From"}),
search.createColumn({name: "internalid", label: "Internal ID"})
]
});
let searchResultCount = invoiceSearchObj.runPaged().count;
log.debug("invoiceSearchObj result count",searchResultCount);
let soArray=[];
invoiceSearchObj.run().each(function(result){
// let obj={}
// .run().each has a limit of 4,000 results
let soId = result.getValue({
name: "internalid",
join: "createdFrom",
label: "Internal ID"
});
let invId = result.getValue({
name: "internalid", label: "Internal ID"
})
if(soId){
// obj.invId= invId;
// obj.soId= soId;
soArray.push(soId);
return true;
}
});
return soArray;
}
catch(err)
{
log.debug("error@invoiceSearch",err)
}
}
/**
* Defines the function definition that is executed after record is submitted.
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type; use values from the context.UserEventType enum
* @since 2015.2
*/
const afterSubmit = (scriptContext) => {
try {
if (scriptContext.type === 'create'){
let currentRec = scriptContext.newRecord;
log.debug("currentRec", currentRec);
let creditMemoId = currentRec.id
let createdFrom = currentRec.getValue({
fieldId: 'createdfrom'
});
// log.debug("createdFrom",createdFrom);
let lineCount = currentRec.getLineCount({
sublistId: 'apply'
});
log.debug("lineCount",lineCount)
let recType,recId,applyvalue;
let invoiceArray =[]
for(let i = 0 ; i < lineCount; i++){
recType = currentRec.getSublistValue({
sublistId: 'apply',
fieldId: 'trantype',
line: i
});
recId = currentRec.getSublistValue({
sublistId: 'apply',
fieldId: 'internalid',
line: i
});
applyvalue = currentRec.getSublistValue({
sublistId: 'apply',
fieldId: 'apply',
line: i
});
if(applyvalue == true && recType === 'CustInvc' ){
log.debug("recType",recType);
log.debug("recId",recId);
log.debug("applyvalue",applyvalue);
invoiceArray.push(recId);
let soSearch = invoiceSearch(invoiceArray);
log.debug("soSearch",soSearch);
let distinctInternalSoArray = soSearch.filter((x, i, a) => a.indexOf(x) == i);
log.debug("distinctInternalSoArray",distinctInternalSoArray)
for(let k =0; k <distinctInternalSoArray.length;k++){
let data = record.load({
type: search.Type.SALES_ORDER,
id: distinctInternalSoArray[k],
});
log.debug("data",data)
let creditId = data.getValue({
fieldId:'custbody_jj_credit_memo_mosi300'
})
log.debug("id",creditId)
creditId.push(creditMemoId);
record.submitFields({
type: record.Type.SALES_ORDER,
id: distinctInternalSoArray[k],
values: {
'custbody_jj_credit_memo_mosi300': creditId
},
options: {
enableSourcing: false,
ignoreMandatoryFields : true
}
});
}
}
}
if (!createdFrom)
return false;
let createdFromData = createdFromRecordSearch(createdFrom);
log.debug("createdFromData",createdFromData);
if ((Object.keys(createdFromData).length) < 1)
return false;
log.debug("Object.keys(createdFromData).length", Object.keys(createdFromData).length)
let recordId = createdFromData.internalid;
let recordType = createdFromData.recordType;
log.debug("recordType", recordType);
if (!recordId || !recordType)
return false;
let transactionData = relatedTransaction(recordId, recordType);
log.debug("transactionData",transactionData)
if ((Object.keys(transactionData).length) < 1)
return false;
let transId = transactionData.transactionId;
let transType = transactionData.transactionType;
log.debug("transType",transType)
if (!transId || !transType)
return false;
if(transType === 'CashSale')
return false;
if (transType === 'CustInvc') {
log.debug("log worked");
transactionData = relatedTransaction(transId, transType);
if ((Object.keys(transactionData).length) < 1)
return false;
transId = transactionData.transactionId;
transType = transactionData.transactionType;
}
let salesOrderData = record.load({
type: record.Type.SALES_ORDER,
id: transId
// isDynamic: true
});
let oldCreditMemo = salesOrderData.getValue({
fieldId: 'custbody_jj_credit_memo_mosi300',
});
oldCreditMemo.push(creditMemoId);
log.debug("newCreditMemoValue", oldCreditMemo);
let recordAfterSave = salesOrderData.setValue({
fieldId: 'custbody_jj_credit_memo_mosi300',
value: oldCreditMemo,
});
salesOrderData.save({
enableSourcing: true,
ignoreMandatoryFields: true
});
}
}
catch (err) {
log.debug("error@AfterSubmit")
}
}
return {afterSubmit}
});