Suitelet API to create RMa record in NetSuite

Client needs to create RMA record for a sales order based on the item selected on the website.

/**
 * @NApiVersion 2.1
 * @NScriptType Suitelet
 */
define(['N/error', 'N/https', 'N/record', 'N/search'],
    /**
     * @param{error} error
     * @param{https} https
     * @param{record} record
     * @param{search} search
     */
    (error, https, record, search) => {

        function checkForParameter(parameter) {
            if (parameter !== "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null"
                && parameter !== "undefined" && parameter !== " " && parameter !== 'false') {
                return true;
            } else {
                log.debug("empty")
                return false;
            }
        }

        function responseMessage(status,message,isSuccess){
            let messageDetails ={
                'status': status,
                'message': message,
                'isSuccess': isSuccess
            }
            return messageDetails
        }

        function toFindOrderDetails(orderID){
            try {
                var salesorderSearchObj = search.create({
                    type: "salesorder",
                    filters:
                        [
                            ["type", "anyof", "SalesOrd"],
                            "AND",
                            ["status", "anyof", "SalesOrd:D", "SalesOrd:E", "SalesOrd:F", "SalesOrd:G", "SalesOrd:B"],
                            "AND",
                            ["mainline", "is", "F"],
                            "AND",
                            ["shipping", "is", "F"],
                            "AND",
                            ["quantityshiprecv", "greaterthan", "0"],
                            "AND",
                            // ["customermain.internalid","anyof",customerID],
                            // "AND",
                            ["taxline", "is", "F"],
                            "AND",
                            [[["numbertext", "is", orderID]], "OR", [["formulatext: {otherrefnum}", "is", orderID]]]
                        ],
                    columns:
                        [
                            search.createColumn({
                                name: "item",
                                summary: "GROUP",
                                label: "Item"
                            }),
                            search.createColumn({
                                name: "quantity",
                                summary: "GROUP",
                                label: "Quantity"
                            }),
                            search.createColumn({
                                name: "quantity",
                                join: "applyingTransaction",
                                summary: "SUM",
                                label: "Quantity"
                            }),
                            search.createColumn({
                                name: "line",
                                summary: "GROUP",
                                label: "Line ID"
                            }),
                            search.createColumn({
                                name: "formulanumeric",
                                summary: "SUM",
                                formula: "CASE WHEN {applyingtransaction.type} = 'Return Authorization' THEN {applyingtransaction.quantity} ELSE 0 END",
                                label: "Formula (Numeric)"
                            }),
                            search.createColumn({
                                name: "quantityshiprecv",
                                summary: "GROUP",
                                label: "Quantity Fulfilled/Received"
                            }),
                            search.createColumn({
                                name: "internalid",
                                summary: "GROUP",
                                label: "Internal ID"
                            })
                        ]
                });
                var searchResultCount = salesorderSearchObj.runPaged().count;
                let orderDetails = []
                if (searchResultCount > 0) {
                    salesorderSearchObj.run().each(function (result) {
                        orderDetails.push(result.getValue({
                                name: "internalid",
                                summary: "GROUP",
                                label: "Internal ID"
                            })
                        )
                    });
                    return orderDetails
                }
            }catch (e) {
                log.debug("error@toFindSODetails",e)
                let responseBody={
                    'status': 500,
                    'message': e.message,
                    'isSuccess': false,
                }
                return scriptContext.response.write(JSON.stringify(responseBody))
            }
        }
        /**
         * Defines the Suitelet script trigger point.
         * @param {Object} scriptContext
         * @param {ServerRequest} scriptContext.request - Incoming request
         * @param {ServerResponse} scriptContext.response - Suitelet response
         * @since 2015.2
         */
        const onRequest = (scriptContext) => {
            try{

                //log.debug("RequestBody",scriptContext.request.body);
                if(scriptContext.request.method!=='POST')
                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Method Not Allowed',false)))

                /* Login Key Validation*/

                let login_key= scriptContext.request?.headers?.login_key;
                log.debug("Login Key",login_key)
                if(!login_key || login_key!=='c782779b77215248bb2372c545132ae1')
                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Invalid Login Attempt',false)))


                /* requestBody Validation*/

                let requestBody=JSON.parse(scriptContext.request.body);
                log.debug("requestBody",requestBody)
                if(!requestBody)
                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Request Body Is Empty',false)))

                /* Name */
                if (!checkForParameter(requestBody.first_name))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Name Is Empty',false)))

                /* Phone */
                if (!checkForParameter(requestBody.phone))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Phone Is Empty',false)))

                /* Address */
                if (!checkForParameter(requestBody.first_name))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Name Is Empty',false)))

                /* Order ID Validation */
                if (!checkForParameter(requestBody.order_id))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Order ID Is Empty',false)))

                /* Email Validation */
                if (!checkForParameter(requestBody.email))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Email ID Is Empty',false)))

                /* Website Validation */
                if (!checkForParameter(requestBody.website))

                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Website Is Empty',false)))


                if(requestBody.items.length<=0)
                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Item Array Is Empty',false)))

                let soInternalId=toFindOrderDetails(requestBody.order_id)
                if(!soInternalId || soInternalId.length<=0)
                    return scriptContext.response.write(JSON.stringify(responseMessage(500,'Order Not Found',false)))

                let itemArray=requestBody.items;

                let rmaRecord=record.transform({
                    fromType: record.Type.SALES_ORDER,
                    fromId: soInternalId[0],
                    toType: record.Type.RETURN_AUTHORIZATION,
                    isDynamic: false
                })
                let lineCount=rmaRecord.getLineCount({
                    sublistId: 'item'
                });
                log.debug("LineCount",lineCount)
                for(let i=0;i<itemArray.length;i++){
                    if(!checkForParameter(itemArray[i]['item']))
                        return scriptContext.response.write(JSON.stringify(responseMessage(500,'Item Is Empty In Line Numebr '+(i+1),false)))
                    if(!checkForParameter(itemArray[i]['quantity']))
                        return scriptContext.response.write(JSON.stringify(responseMessage(500,'Quantity Is Empty In Line Numebr '+(i+1),false)))
                    if(!checkForParameter(itemArray[i]['lineId']))
                        return scriptContext.response.write(JSON.stringify(responseMessage(500,'Line ID Is Empty In Line Numebr '+(i+1),false)))
                }
                let mainFlag=0;
                for(let i=lineCount;i>0;i--){
                    let flag=0;
                    let item=rmaRecord.getSublistText({
                        sublistId: 'item',
                        fieldId: 'item',
                        line: i-1
                    });
                    let quantity=rmaRecord.getSublistValue({
                        sublistId: 'item',
                        fieldId: 'quantity',
                        line: i-1
                    });
                    let srcLine=rmaRecord.getSublistValue({
                        sublistId: 'item',
                        fieldId: 'orderline',
                        line:i-1
                    })
                    // log.debug("SRC LINE",srcLine)
                    // log.debug("item",item)
                    for(let j=0;j<itemArray.length;j++){
                        //log.debug("Item",itemArray[j]['item'])
                        if(item==itemArray[j]['item']){
                            //log.debug("Inside Main If")
                            if(srcLine==itemArray[j]['lineId']){
                                //  log.debug("Inside Second If")
                                rmaRecord.setSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'quantity',
                                    value: itemArray[j]['quantity'],
                                    line: i-1
                                })
                                flag=flag+1;
                            }
                        }
                    }
                    if(flag<=0){
                        rmaRecord.removeLine({
                            sublistId: 'item',
                            line: i-1
                        })
                    }else{
                        mainFlag=mainFlag+1;
                    }
                }
                if(mainFlag>0){
                    // let tranbefore=rmaRecord.getValue({
                    //     fieldId: 'tranid'
                    // });
                    //log.debug("Before",tranbefore)
                    rmaRecord.setValue({
                        fieldId: 'custbody_retail_website',
                        value: requestBody.website
                    })
                    let id=rmaRecord.save({
                        enableSourcing: true,
                        ignoreMandatoryFields: true
                    });
                    let afterRMA=record.load({
                        type: record.Type.RETURN_AUTHORIZATION,
                        id: id
                    });
                    let tranNumber=afterRMA.getValue({
                        fieldId: 'tranid'
                    });
                    log.debug("After",tranNumber)
                    let responseBody={
                        'status': 200,
                        'message': 'RMA Record Created',
                        'isSuccess': true,
                        order_number: tranNumber

                    }
                    return scriptContext.response.write(JSON.stringify(responseBody))
                }else{
                    let responseBody={
                        'status': 500,
                        'message': 'Order Not Created',
                        'isSuccess': false,
                    }
                    return scriptContext.response.write(JSON.stringify(responseBody))

                }


            }catch (e) {
                log.debug("error@onRequest",e)
                let responseBody={
                    'status': 500,
                    'message': e.message,
                    'isSuccess': false,
                }
                return scriptContext.response.write(JSON.stringify(responseBody))
            }
        }

        return {onRequest}

    });

Leave a comment

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