NetSuite to Magento Shipment sync using REST API

Scenario:

  • When an IF is generated for the Adobe Commerce order it will be synched to the Adobe Commerce website through a real time sync. 
  • The Shipment tracking numbers will be also synced to Website. 
  • The shipments of the items that are back ordered at the time of placing the order are not considered in the scenario. 
/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 */
/*******************************************************************************************************
 * Szco Supplies, Inc
 *
 * SZCO-755 : NetSuite - Magento Item Fulfillment Sync
 * 
 * *****************************************************************************************************
 * 
 * Author: Jobin and Jismi IT Services
 * 
 * Date Created : 20-August-2023
 * 
 *Description : This script is to implement an integration between NetSuite and Magento to sync the 
 Item fulfillments in NetSuite to Magento
 *
 * REVISION HISTORY
 * 
 * @version 1.0 SZCO-755 : 20-August-2023 : Created the initial build by JJ0152
 *
 ******************************************************************************************************/
define(['N/error', 'N/record', 'N/search', '../Common Library/jj_adobe_common_library.js', '../Common Library/jj_adobe_ns_utility.js'],
    /**
     * @param{error} error
     * @param{record} record
     * @param{runtime} runtime
     * @param{search} search
     */
    (error, record, search, adobeLib, jjUtil) => {
        /**
         * @desc function to fetch the integration record data
         * @param soId
         * @return {*}
         */

        function fetchIntegrationRecData(soId) {
            try {
                let integrationRecData = {};

                let customRecordSearch = search.create({
                    type: 'customrecord_jj_adobe_order_sync_szco227',
                    columns: [{
                        name: 'custrecord_jj_adobe_order_id'
                    }, {
                        name: 'internalid'
                    }],
                    filters: [["custrecord_jj_adobe_sales_order", "is", soId], "AND", ["isinactive", "is", "F"]]

                });
                let customRecordSearchCount = customRecordSearch.runPaged().count;
                integrationRecData.count = customRecordSearchCount;
                if (customRecordSearchCount > 0) {
                    customRecordSearch.run().each(function (result) {
                        integrationRecData.recId = result.getValue({
                            "name": "internalid"
                        });
                        integrationRecData.orderEnityId = result.getValue({
                            "name": "custrecord_jj_adobe_order_id"
                        });
                        return true;
                    });
                }
                else {
                    return { 'count': 0, 'recId': "", 'orderEnityId': "" };
                }
                return integrationRecData;
            } catch (e) {
                log.error("Error@fetchIntegrationRecData", e.message)
                return { 'count': 0, 'recId': "", 'orderEnityId': "" };
            }
        }


        /**
         * @desc function to set data in integration record
         * @param response
         * @param customRecDetails
         */
        function setIntegrationRecData(responseData, customRecDetails, ifRecId) {
            try {
                let today = new Date();
                let customRecord = record.load({
                    type: 'customrecord_jj_adobe_order_sync_szco227',
                    id: Number(customRecDetails.recId)
                });
                customRecord.setValue({
                    fieldId: "custrecord_api_request_if",
                    value: JSON.stringify(responseData.payLoad)
                });

                if (responseData.code == '200') {
                    customRecord.setValue({
                        fieldId: "custrecord_jj_status_if_creation",
                        value: "CREATED"
                    });
                    let IFArray = customRecord.getValue('custrecord_jj_item_fulfil_id');
                    IFArray.push(ifRecId);
                    customRecord.setValue({
                        fieldId: "custrecord_jj_item_fulfil_id",
                        value: IFArray
                    });
                    let shipID = customRecord.getValue('custrecord_jj_magento_if_id');
                    if (shipID) {
                        customRecord.setValue('custrecord_jj_magento_if_id', shipID + ", " + JSON.parse(responseData.response))
                    } else {
                        customRecord.setValue({
                            fieldId: "custrecord_jj_magento_if_id",
                            value: JSON.parse(responseData.response)
                        });
                        log.debug("responseData.ifId", JSON.parse(responseData.response));
                    }

                    customRecord.setValue('custrecord_jj_error_if_creation', "");
                    customRecord.setValue('custrecord_if_updated_date', today);
                    // set value in IF record in netsuite
                    record.submitFields({
                        type: record.Type.ITEM_FULFILLMENT,
                        id: ifRecId,
                        values: {
                            custbody_jj_adobe_if_id: JSON.parse(responseData.response)
                        },
                        options: {
                            enableSourcing: false,
                            ignoreMandatoryFields: true
                        }
                    });
                }
                else {
                    customRecord.setValue('custrecord_jj_error_if_creation', JSON.parse(responseData.response)?.message);
                    customRecord.setValue('custrecord_jj_status_if_creation', "FAILED");
                }
                customRecord.save({
                    enableSourcing: false,
                    ignoreMandatoryFields: true
                });
            } catch (e) {
                log.error("error @setIntegrationRecData", e);
            }
        }


        /**
         * function to create IF in Adobe
         * @param {Object} newRecord 
         * @param {Number} soAdobeId 
         * @returns {Object}
         */
        function createIfInAdobe(newRecord, soAdobeId) {
            let payLoad;
            try {

                //loop through the item sublist
                let numLines = newRecord.getLineCount({
                    sublistId: 'item'
                });
                let shippingCarrier = newRecord.getText({ fieldId: 'shipcarrier' })
                let items = [], tracks = [];
                for (let i = 0; i < numLines; i++) {
                    let lineItemObj = {};
                    let fulfill = newRecord.getSublistValue({
                        fieldId: 'itemreceive',
                        sublistId: 'item',
                        line: i
                    });
                    if (fulfill == true) {
                        let itemQuantity = newRecord.getSublistValue({
                            fieldId: 'quantity',
                            sublistId: 'item',
                            line: i
                        });
                        let itemType = newRecord.getSublistValue({
                            fieldId: 'itemtype',
                            sublistId: 'item',
                            line: i
                        });
                        if (itemType == "InvtPart") {
                            let lineItemIdArr = newRecord.getSublistValue({
                                fieldId: 'custcol_jj_adobe_line_id',
                                sublistId: 'item',
                                line: i
                            });

                            lineItemObj.qty = itemQuantity;
                            lineItemObj.order_item_id = lineItemIdArr;
                            items.push(lineItemObj);
                        }
                    }
                }

                //get the tracking number/s
                let trackignLines = newRecord.getLineCount({
                    sublistId: 'package'
                });
                log.debug('trackignLines', trackignLines)
                for (let i = 0; i < trackignLines; i++) {
                    let trackNumberObj = {};
                    let trackNum = newRecord.getSublistValue({
                        sublistId: 'package',
                        fieldId: 'packagetrackingnumber',
                        line: i
                    });
                    log.debug("trackNum",trackNum)

                    if (trackNum) {
                        trackNumberObj.track_number = trackNum;
                        trackNumberObj.title = shippingCarrier;
                        trackNumberObj.carrier_code = (shippingCarrier == 'nonups') ? "custom" : "United Parcel Service";
                        tracks.push(trackNumberObj);
                        log.debug('tracks111', tracks)
                    }
                }
                log.debug('tracks', tracks)

                let responseData = {};
                //Call the create API to create the shipment in website
                let shipmentCreateApi = adobeLib.ADOBE_API_REQUESTS.CREATE_ITEM_FULFILLMENT;
                shipmentCreateApi = shipmentCreateApi.replace('{orderId}', soAdobeId);
                log.debug('shipmentCreateApi', shipmentCreateApi)

                let shipmentCreateResponse = adobeLib.commonFunctions.sendAPIRequest(
                    "POST",
                    shipmentCreateApi,
                    {
                        "items": items,
                        "tracks": tracks
                    }
                );
                log.debug('shipmentCreateResponse', shipmentCreateResponse)
                responseData.payLoad = {
                    "items": items,
                    "tracks": tracks
                }
                payLoad = responseData.payLoad;
                responseData.code = shipmentCreateResponse.code;
                responseData.response = shipmentCreateResponse.body;
                return responseData;
            } catch (e) {
                log.error("createIfInAdobe", e);
                return { 'payLoad': payLoad, 'code': '', 'response': e.message };
            }
        }


        /**
         * 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 {

                //code for checking in sandbox/production // to avoid integration via sandbox after Sandbox refresh

                let isSandbox = jjUtil.refFunction.isSandbox();
                log.debug("isSandbox", isSandbox);
                if (isSandbox) return;

                if (scriptContext.type == scriptContext.UserEventType.DELETE) {
                    return;
                }

                let newRecord = scriptContext.newRecord;

                let ifRecId = newRecord.id;
                let soId = newRecord.getValue('createdfrom');
                let shipStatus = newRecord.getValue('shipstatus');

                let adobeIdExist = newRecord.getValue('custbody_jj_adobe_if_id');
                if (adobeIdExist || (shipStatus !== 'C')) {
                    return;
                }
                //get the custom record entry created for this sales order
                let customRecDetails = fetchIntegrationRecData(soId)
                if (customRecDetails.count == 0) {
                    return;
                }
                let soAdobeId = customRecDetails.orderEnityId;
                let responseData = createIfInAdobe(newRecord, soAdobeId);
                log.debug('responseData', responseData)
                setIntegrationRecData(responseData, customRecDetails, ifRecId);
            } catch (e) {
                log.debug("error", e);
            }
        };
        return { afterSubmit: afterSubmit }
    });

Leave a comment

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