Populate Credit Memo in Sales Order

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}

    });

Leave a comment

Your email address will not be published. Required fields are marked *