Sync historic orders from Shopify to NetSuite

Jira Code:  NDAZ-28

The client needed to bring all the historic orders from Shopify to NetSuite. For every paid and fulfilled orders in Shopify, sales orders, item fulfilment, invoices and payments are created. Similarly, for paid but unfulfilled orders, all the above records except item fulfilment are created. The task was achieved using a scheduled script.

DAZ-28 JJ SS Bring historic orders from Shopify to NetSuite

/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
/**
 * Script Description
 * This script will create Sales orders in Netsuite for all orders in Shopify (One time Sync)
 * ie, Sales Order Sync
 * 
 * Date Created : 26 April 2019
 */
/*******************************************************************************
 * 7 Daze LLC | DAZ-9 | Sales Order Sync
 * **************************************************************************
 * Author: Jobin & Jismi IT Services LLP
 * 
 * Date Created : 26 April 2019
 *
 * REVISION HISTORY
 */
define(['N/https', 'N/search', 'N/runtime', 'N/task', 'N/url', 'N/format', 'N/log', 'N/email', 'N/record', 'N/file', 'Jobin and Jismi IT Services LLP/moment.js'],
    function (https, search, runtime, task, url, format, log, email, record, file, moment) {
        var flag = 0;
        var salesorderArr = [];
        var CUSTOMER_OBJ = {},
            ITEM_OBJ = {};
        var ERR_OBJ = {};
        var DISC_OBJ = {};
        var ERR_ARR = [];
        var main = {
            //change the date in endpoint every three months
            execute: function (scriptContext) {
                try {
                    //URL of the app
                    var appURL = 'bfbb2c59c5c96793ca4acddc69ac3e70:c3d1104a816cd8b3ee224b2697ae266d@7daze-manufacturing.myshopify.com';

                    //count of orders in Shopify
                    var ordersCount = https.get({
                        url: 'https://' + appURL + '/admin/api/2019-04/orders/count.json?status=cancelled&financial_status=refunded&fulfillment_status=unshipped',
                    });
                    ordersCount = JSON.parse(ordersCount.body);
                    log.debug('Total count of orders', ordersCount.count);

                    var scriptObj = runtime.getCurrentScript();
                    var since_id = scriptObj.getParameter({ name: 'custscript_since_id' });
                    log.debug('since_id', since_id)

                    //retrieves a list of orders (50) from Shopify
                    // var orderList = https.get({
                    //     url: 'https://' + appURL + '/admin/api/2019-04/orders.json?financial_status=paid&fulfillment_status=shipped&limit=91&since_id=' + (since_id ? '&since_id=' + since_id : '')
                    // });

                    // var orderList = https.get({
                    //     url: 'https://' + appURL + '/admin/api/2019-04/orders.json?financial_status=paid&fulfillment_status=shipped&limit=50&since_id=5000935624'
                    // });

                    //181471510558

                    var orderList = https.get({
                        url: 'https://' + appURL + '/admin/api/2019-04/orders.json?limit=120&status=cancelled&financial_status=refunded&fulfillment_status=unshipped' + (since_id ? '&since_id=' + since_id : '&since_id=')
                    });

                    // var orderList = https.get({
                    //     url: 'https://' + appURL + '/admin/api/2019-04/orders.json?financial_status=paid&fulfillment_status=shipped&limit=1&since_id=181899362334'
                    // });

                    var fileId = file.create({
                        name: 'orderList.txt',
                        fileType: file.Type.PLAINTEXT,
                        contents: JSON.stringify(orderList),
                        //description: 'This is a plain text file.',
                        encoding: file.Encoding.UTF8,
                        folder: 1124
                    }).save();

                    var fileObj = file.load({
                        id: 1752
                    });

                    if (fileObj.size < 10485760) {
                        var content = fileObj.getContents();
                    }

                    var bodyObj = JSON.parse(orderList.body);
                    var ordersArr = bodyObj.orders;
                    log.debug('Total number of orders', ordersArr.length);
                    main.processOrders(ordersArr, since_id);

                } catch (er) {
                    log.debug('er', er.message)
                    return;
                }
            },
            createLog: function () {
                var fileObj = file.load({
                    id: 1752
                });
                if (fileObj.size < 10485760) {
                    var content = fileObj.getContents();
                }
                if (content.body) {
                    //log.debug('contentyes', content.body);
                    content = JSON.parse(content.body);
                }
                else
                    content = [];
                content.push(ERR_ARR);

                var fileId = file.create({
                    name: 'error_log_shopify.json',
                    fileType: file.Type.JSON,
                    contents: JSON.stringify(content),
                    encoding: file.Encoding.UTF8,
                    folder: 1124
                }).save();
            },
            getDiscountItem: function (DISCOUNT_CODE) {
                //log.debug('notify in', DISCOUNT_CODE)
                if (DISC_OBJ[DISCOUNT_CODE])
                    return DISC_OBJ[DISCOUNT_CODE];
                else {
                    var discountitemSearchObj = search.create({
                        type: "discountitem",
                        filters:
                            [
                                ["isinactive", "is", "F"],
                                "AND",
                                ["type", "anyof", "Discount"],
                                "AND",
                                ["name", "is", DISCOUNT_CODE]
                            ],
                        columns:
                            [search.createColumn({ name: "externalid", label: "External ID" }), search.createColumn({ name: "internalid", label: "Internal ID" }), search.createColumn({ name: "baseprice", label: "Base Price" })]
                    });
                    var searchResultCount = discountitemSearchObj.runPaged().count;
                    //log.debug('searchResultCount', searchResultCount)
                    discountitemSearchObj.run().each(function (result) {
                        DISC_OBJ[DISCOUNT_CODE] = { keyOne: result.getValue(discountitemSearchObj.columns[1]), keyTwo: result.getValue(discountitemSearchObj.columns[2]) }
                        return false;
                    });
                    //log.debug('Disc Object', DISC_OBJ[DISCOUNT_CODE])
                    return DISC_OBJ[DISCOUNT_CODE];
                }
            },
            checkBackordered: function (itemdeId) {
                var itemSearchObj = search.create({
                    type: "item",
                    filters: [["quantitybackordered", "greaterthan", "0"], "AND", ["internalidnumber", "equalto", itemdeId]],
                    columns: [search.createColumn({ name: "itemid", sort: search.Sort.ASC, label: "Name" }), search.createColumn({ name: "baseprice", label: "Base Price" }), search.createColumn({ name: "quantitybackordered", label: "Back Ordered" })]
                });
                var searchResultCount = itemSearchObj.runPaged().count;
                if (searchResultCount > 0)
                    return true;
                else
                    return false;
            },
            getCustomerID: function (EMAIL_ID) {
                if (CUSTOMER_OBJ[EMAIL_ID])
                    return CUSTOMER_OBJ[EMAIL_ID];
                var custSearchObj = search.create({
                    type: "customer",
                    filters: [
                        ["stage", "anyof", "CUSTOMER"], "AND", ["email", "is", EMAIL_ID]
                    ],
                    columns: [search.createColumn({ name: "email", label: "Email" }), search.createColumn({ name: "internalid", label: "Internal ID" })]
                });
                var arr = [];
                var custObj = {};
                custSearchObj.run().each(function (result) {
                    custObj.email = result.getValue(custSearchObj.columns[0]);
                    custObj.internalid = result.getValue(custSearchObj.columns[1]);
                    CUSTOMER_OBJ[EMAIL_ID] = custObj.internalid;
                    return false;
                });
                return CUSTOMER_OBJ[EMAIL_ID];
            },
            mappedItems: function (VARIANT_ID) {
                var itemSearchObj = search.create({
                    type: "item",
                    filters: [["externalid", "noneof", "@NONE@"], "AND", ["isinactive", "is", "F"], "AND", ["type", "anyof", "InvtPart", "NonInvtPart"]],
                    columns: [search.createColumn({ name: "externalid", label: "External ID" }), search.createColumn({ name: "internalid", label: "Internal ID" })]
                })
                var searchResultCount = itemSearchObj.runPaged().count;
                //log.debug('searchResultCount', searchResultCount)
                itemSearchObj.run().each(function (result) {
                    var externalID = result.getValue(itemSearchObj.columns[0]);
                    //if (externalID.includes('/'))
                    if (externalID.indexOf('/') != -1)
                        externalID = externalID.split('/')[1];
                    ITEM_OBJ[externalID] = result.getValue(itemSearchObj.columns[1]);
                    return true;
                });
                if (!ITEM_OBJ[VARIANT_ID])
                    ITEM_OBJ[VARIANT_ID] = false;
                return ITEM_OBJ[VARIANT_ID];
            },
            getItemID: function (VARIANT_ID) {
                //if (ITEM_OBJ[VARIANT_ID] !== false)
                if (ITEM_OBJ[VARIANT_ID])
                    return ITEM_OBJ[VARIANT_ID];
                else {
                    return main.mappedItems(VARIANT_ID);
                }
            },
            processOrders: function (ordersArr, since_id) {
                try {
                    for (var i = 0; i < ordersArr.length; i++) {
                        log.debug('ordersArr', ordersArr[i])

                        // if (i != 0) {
                        //     if (main.isReschedule(ordersArr[i - 1].id)) {
                        //         return true;
                        //     }
                        // }


                        var emailCus = ordersArr[i].email;
                        log.debug('emailCus', emailCus)
                        var singleOrder = ordersArr[i];
                        var customerID = main.getCustomerID(emailCus);

                        if (customerID) {
                            log.debug('Customer exists')
                            main.createSalesOrder(singleOrder, customerID);
                        } else { main.createCustomer(singleOrder) }
                    }
                    main.createLog();
                    if (ordersArr.length != 0)
                        log.debug('since_id', ordersArr[ordersArr.length - 1].id);
                    var x = main.remainingUsage();
                    log.debug('Remaining Time', x);

                    // if (ordersArr.length) {
                    //     main.rescheduleScript(ordersArr[ordersArr.length - 1].id);
                    // }

                } catch (er) {
                    log.debug('er', er.message)
                    return;
                }
            },
            createCustomer: function (singleOrder) {
                try {
                    // create Customer in Netsuite
                    log.debug('Customer do not exists')

                    var custRec = record.create({ type: record.Type.CUSTOMER })
                    custRec.setValue({ fieldId: 'isperson', value: 'T' });
                    custRec.setValue({ fieldId: 'firstname', value: singleOrder.customer.first_name });
                    custRec.setValue({ fieldId: 'lastname', value: singleOrder.customer.last_name });
                    custRec.setValue({ fieldId: 'email', value: singleOrder.customer.email });
                    custRec.setValue({ fieldId: 'subsidiary', value: 1 });
                    custRec.setValue({ fieldId: 'salesrep', value: 26235 });
                    custRec.setValue({ fieldId: 'category', value: 3 });
                    custRec.setValue({ fieldId: 'custentity3', value: singleOrder.customer.accepts_marketing });

                    for (var m = 0; m < 2; m++) {
                        if (m == 0) {
                            try {
                                custRec.setSublistValue({ sublistId: 'addressbook', fieldId: 'defaultbilling', line: m, value: true })
                                var myaddressSubrecord = custRec.getSublistSubrecord({ sublistId: 'addressbook', fieldId: 'addressbookaddress', line: m });
                                //myaddressSubrecord.setText({ fieldId: 'country', text: singleOrder.shipping_address.country });
                                myaddressSubrecord.setValue({ fieldId: 'country', value: singleOrder.shipping_address.country_code });
                                myaddressSubrecord.setValue({ fieldId: 'zip', value: singleOrder.shipping_address.zip });
                                myaddressSubrecord.setValue({ fieldId: 'city', value: singleOrder.shipping_address.city });
                                myaddressSubrecord.setValue({ fieldId: 'addr1', value: singleOrder.shipping_address.address1 });
                                myaddressSubrecord.setValue({ fieldId: 'attention', value: singleOrder.shipping_address.first_name + ' ' + singleOrder.shipping_address.last_name });
                            } catch (er) {
                                log.debug('err@shippinggAddress', er.message)
                            }
                        } else {
                            try {
                                custRec.setSublistValue({ sublistId: 'addressbook', fieldId: 'defaultshipping', line: m, value: true })
                                var myaddressSubrecord = custRec.getSublistSubrecord({ sublistId: 'addressbook', fieldId: 'addressbookaddress', line: m });
                                //myaddressSubrecord.setText({ fieldId: 'country', text: singleOrder.billing_address.country });
                                myaddressSubrecord.setValue({ fieldId: 'country', value: singleOrder.shipping_address.country_code });
                                myaddressSubrecord.setValue({ fieldId: 'zip', value: singleOrder.billing_address.zip });
                                myaddressSubrecord.setValue({ fieldId: 'city', value: singleOrder.billing_address.city });
                                myaddressSubrecord.setValue({ fieldId: 'addr1', value: singleOrder.billing_address.address1 });
                                myaddressSubrecord.setValue({ fieldId: 'attention', value: singleOrder.billing_address.first_name + ' ' + singleOrder.billing_address.last_name });
                            } catch (er) {
                                log.debug('err@billingAddress', er.message)
                            }
                        }
                    }
                    var custRecID = custRec.save();
                    log.debug('custRecID', custRecID);
                    main.createSalesOrder(singleOrder, custRecID);
                } catch (er) {
                    log.debug('er', er.message)
                    ERR_OBJ[singleOrder.id] = ({ orderType: 'Customer', ERROR: er.message });
                    ERR_ARR.push(ERR_OBJ);
                    ERR_OBJ = {};
                    return;
                };
            },
            createSalesOrder: function (singleOrder, custRecID) {
                try {
                    // create Salesorder in Netsuite
                    var salesOrderID;
                    var taxLines = singleOrder.tax_lines;
                    if (singleOrder.fulfillments.length != 0) {
                        var trackingNumber = singleOrder.fulfillments[0].tracking_number;
                        var trackingURL = singleOrder.fulfillments[0].tracking_url;
                    }
                    //filter - external id any of order id
                    var soSearchObj = search.create({
                        type: "salesorder",
                        filters: [
                            ["type", "anyof", "SalesOrd"],
                            "AND",
                            ["taxline", "is", "F"],
                            "AND",
                            ["mainline", "is", "T"],
                            "AND",
                            ["externalid", "anyof", singleOrder.id]
                        ],
                        columns: [
                            search.createColumn({ name: "externalid", label: "External ID" }), search.createColumn({ name: "internalid", label: "Internal ID" })
                        ]
                    });

                    var soSearchCount = soSearchObj.runPaged().count;
                    log.debug('soSearchCount', soSearchCount)
                    soSearchObj.run().each(function (result) {
                        salesOrderID = result.getValue(soSearchObj.columns[1])
                        return false;
                    });

                    if (soSearchCount == '0') {
                        log.debug('Creating Sales order');
                        var date = singleOrder.created_at;
                        if (singleOrder.shipping_lines != 0) {
                            var shippingMethod = singleOrder.shipping_lines[0].title;
                            var shippingCost = singleOrder.shipping_lines[0].price;
                            //log.debug('shippingCost', shippingCost);
                        }


                        var athens = format.format({
                            value: date,
                            type: format.Type.DATETIME,
                            timezone: format.Timezone.AMERICA_LOS_ANGELES
                        })
                        athens = moment(athens);

                        var todayDate = athens.format('M/D/YYYY');
                        todayDate = new Date(todayDate);

                        var soRec = record.create({ type: record.Type.SALES_ORDER })
                        soRec.setValue({ fieldId: 'entity', value: custRecID });
                        soRec.setValue({ fieldId: 'externalid', value: singleOrder.id });
                        soRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                        soRec.setValue({ fieldId: 'orderstatus', value: 'B' });
                        //UPDATE
                        soRec.setValue({ fieldId: 'trandate', value: todayDate });
                        //log.debug('Length', singleOrder.discount_codes.length)
                        if (singleOrder.discount_codes.length != 0) {
                            var discItem = singleOrder.discount_codes[0].code;
                            var discRate = singleOrder.discount_codes[0].amount;
                            //log.debug('discItem', discItem);
                            //log.debug('discRate', discRate);
                            if (discItem) {
                                var discPercentVal = main.getDiscountItem(discItem);
                            }
                            soRec.setValue({ fieldId: 'discountitem', value: discPercentVal.keyOne });
                            soRec.setValue({ fieldId: 'discountrate', value: discRate });
                        }

                        if (taxLines.length == 1) {
                            if (taxLines[0].title == 'Los Angeles County Tax') {
                                soRec.setValue({ fieldId: 'istaxable', value: true });
                                soRec.setValue({ fieldId: 'taxitem', value: 5734 });
                            } else if (taxLines[0].title == 'CA State Tax') {
                                soRec.setValue({ fieldId: 'istaxable', value: true });
                                soRec.setValue({ fieldId: 'taxitem', value: 5733 });
                            } else
                                log.debug('Test');
                        } else if (taxLines.length == 2) {
                            if ((taxLines[0].title == 'Los Angeles County Tax' && taxLines[1].title == 'CA State Tax') || (taxLines[1].title == 'Los Angeles County Tax' && taxLines[0].title == 'CA State Tax')) {
                                soRec.setValue({ fieldId: 'istaxable', value: true });
                                soRec.setValue({ fieldId: 'taxitem', value: 5735 });
                            }
                        }

                        //DOUBT
                        if (shippingMethod == 'UPS')
                            soRec.setValue({ fieldId: 'shipcarrier', value: 'ups' });
                        else if (shippingMethod == 'Standard Shipping') {
                            soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                            soRec.setValue({ fieldId: 'shipmethod', value: 4905 });
                        }
                        else if (shippingMethod == 'USPS Priority Mail' || shippingMethod == 'USPS Priority International') {
                            soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                            soRec.setValue({ fieldId: 'shipmethod', value: 5031 });
                        }
                        else {
                            soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                            soRec.setValue({ fieldId: 'shipmethod', value: 4905 });
                        }

                        soRec.setValue({ fieldId: 'shippingcost', value: shippingCost });


                        soRec.setValue({ fieldId: 'shipaddress', value: singleOrder.shipping_address.first_name + ' ' + singleOrder.shipping_address.last_name + '\n' + singleOrder.shipping_address.address1 + ' ' + singleOrder.shipping_address.city + '\n' + singleOrder.shipping_address.zip + ' ' + singleOrder.shipping_address.province + '\n' + singleOrder.shipping_address.country });

                        soRec.setValue({ fieldId: 'billaddress', value: singleOrder.billing_address.first_name + ' ' + singleOrder.billing_address.last_name + '\n' + singleOrder.billing_address.address1 + ' ' + singleOrder.billing_address.city + '\n' + singleOrder.billing_address.zip + ' ' + singleOrder.shipping_address.province + '\n' + singleOrder.billing_address.country });

                        for (var j = 0; j < singleOrder.line_items.length; j++) {
                            var variantID = singleOrder.line_items[j].variant_id;
                            //log.debug('variant_id', variantID)
                            var itemID = main.getItemID(variantID)
                            //log.debug('itemID', itemID)
                            soRec.setSublistValue({ sublistId: 'item', fieldId: 'item', line: j, value: itemID });
                            soRec.setSublistValue({ sublistId: 'item', fieldId: 'quantity', line: j, value: singleOrder.line_items[j].quantity });
                            soRec.setSublistValue({ sublistId: 'item', fieldId: 'rate', line: j, value: singleOrder.line_items[j].price });
                            //UPDATE
                            if (taxLines.length != 0)
                                soRec.setSublistValue({ sublistId: 'item', fieldId: 'istaxable', line: j, value: true });
                        }
                        var soRecID = soRec.save();
                        log.debug('soRecID', soRecID);
                        var externalID = soRec.getValue({ fieldId: 'externalid' })
                        main.create_Fulfillment_Invoice_Payment(singleOrder, soRecID, todayDate, trackingNumber, trackingURL);

                    }
                    // else {
                    //     log.debug('Loading Sales order');
                    //     var date = singleOrder.created_at;

                    //     if (singleOrder.shipping_lines != 0) {
                    //         var shippingMethod = singleOrder.shipping_lines[0].title;
                    //         var shippingCost = singleOrder.shipping_lines[0].price;
                    //         //log.debug('shippingCost', shippingCost);
                    //     }

                    //     var athens = format.format({
                    //         value: date,
                    //         type: format.Type.DATETIME,
                    //         timezone: format.Timezone.AMERICA_LOS_ANGELES
                    //     })
                    //     athens = moment(athens);

                    //     var todayDate = athens.format('M/D/YYYY');
                    //     todayDate = new Date(todayDate);

                    //     var soRec = record.load({ type: record.Type.SALES_ORDER, id: salesOrderID })
                    //     soRec.setValue({ fieldId: 'entity', value: custRecID });
                    //     soRec.setValue({ fieldId: 'externalid', value: singleOrder.id });
                    //     soRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded) ' + singleOrder.id });
                    //     soRec.setValue({ fieldId: 'orderstatus', value: 'B' });
                    //     //UPDATE
                    //     soRec.setValue({ fieldId: 'trandate', value: todayDate });
                    //     if (singleOrder.discount_applications.length != 0) {
                    //         var discItem = singleOrder.discount_codes[0].code;
                    //         var discRate = singleOrder.discount_codes[0].amount;

                    //         if (discItem) {
                    //             var discPercentVal = main.getDiscountItem(discItem);
                    //         }

                    //         soRec.setValue({ fieldId: 'discountitem', value: discPercentVal.keyOne });
                    //         soRec.setValue({ fieldId: 'discountrate', value: discRate });

                    //         if (discPercentVal.keyTwo.indexOf('%') > -1) {
                    //             //log.debug('Percentage', discPercentVal.keyTwo)
                    //             var percentageVal = discPercentVal.keyTwo.split('%')[0];
                    //             //percentageVal = percentageVal * -1;
                    //             flag = 1;


                    //         } else {
                    //             //log.debug('Value', discPercentVal.keyTwo)
                    //             var percentageVal = discPercentVal.keyTwo;
                    //             flag = 0;
                    //         }
                    //         var SORecordLen = soRec.getLineCount({ sublistId: 'item' });
                    //         if (flag == 1) {
                    //             var totalAmount = 0;
                    //             for (var i = 0; i < SORecordLen; i++) {
                    //                 var amount = soRec.getSublistValue({ sublistId: 'item', fieldId: 'amount', line: i })
                    //                 totalAmount = parseFloat(totalAmount) + parseFloat(amount);
                    //             }
                    //             rate = ((totalAmount * percentageVal) / 100);
                    //             //log.debug('rate', rate);


                    //             rate = rate.toString();
                    //             //log.debug('rate', rate);

                    //             var indexlen = rate.indexOf('.');
                    //             //log.debug('indexlen', indexlen);

                    //             var index = rate.split('.');
                    //             //log.debug('index', index);

                    //             var startarr = index[0];
                    //             //log.debug('startarr', startarr);

                    //             var endarr = index[1];
                    //             //log.debug('endarr', endarr);

                    //             var newendarr = endarr.substring(0, 2)
                    //             //log.debug('newendarr', newendarr);

                    //             //rate = startarr + '.' + newendarr;
                    //             var rate = startarr.concat('.', newendarr)
                    //             //rate = parseFloat(percentageVal);
                    //             //log.debug('New rate', rate);


                    //             soRec.setValue({ fieldId: 'discountrate', value: rate })
                    //         } else {
                    //             // for (var i = 0; i < SORecordLen; i++) {
                    //             //     var amount = soRec.getSublistValue({ sublistId: 'item', fieldId: 'amount', line: i })
                    //             //     totalAmount = totalAmount + amount;
                    //             // }
                    //             // rate = totalAmount - percentageVal;
                    //             // //log.debug('rate', rate);
                    //             // soRec.setValue({ fieldId: 'discountrate', value: rate })
                    //         }
                    //     }
                    //     if (taxLines.length == 1) {
                    //         if (taxLines[0].title == 'Los Angeles County Tax') {
                    //             soRec.setValue({ fieldId: 'istaxable', value: true });
                    //             soRec.setValue({ fieldId: 'taxitem', value: 5734 });
                    //         } else if (taxLines[0].title == 'CA State Tax') {
                    //             soRec.setValue({ fieldId: 'istaxable', value: true });
                    //             soRec.setValue({ fieldId: 'taxitem', value: 5733 });
                    //         } else
                    //             log.debug('Test');
                    //     } else if (taxLines.length == 2) {
                    //         if ((taxLines[0].title == 'Los Angeles County Tax' && taxLines[1].title == 'CA State Tax') || (taxLines[1].title == 'Los Angeles County Tax' && taxLines[0].title == 'CA State Tax')) {
                    //             soRec.setValue({ fieldId: 'istaxable', value: true });
                    //             soRec.setValue({ fieldId: 'taxitem', value: 5735 });
                    //         }
                    //     }
                    //     //DOUBT
                    //     if (shippingMethod == 'UPS')
                    //         soRec.setValue({ fieldId: 'shipcarrier', value: 'ups' });
                    //     else if (shippingMethod == 'Standard Shipping') {
                    //         soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                    //         soRec.setValue({ fieldId: 'shipmethod', value: 4905 });
                    //     }
                    //     else if (shippingMethod == 'USPS Priority Mail' || shippingMethod == 'USPS Priority International') {
                    //         soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                    //         soRec.setValue({ fieldId: 'shipmethod', value: 5031 });
                    //     }
                    //     else {
                    //         soRec.setValue({ fieldId: 'shipcarrier', value: 'nonups' });
                    //         soRec.setValue({ fieldId: 'shipmethod', value: 4905 });
                    //     }

                    //     soRec.setValue({ fieldId: 'shippingcost', value: shippingCost });

                    //     soRec.setValue({ fieldId: 'shipaddress', value: singleOrder.shipping_address.first_name + ' ' + singleOrder.shipping_address.last_name + '\n' + singleOrder.shipping_address.address1 + ' ' + singleOrder.shipping_address.city + '\n' + singleOrder.shipping_address.zip + ' ' + singleOrder.shipping_address.province + '\n' + singleOrder.shipping_address.country });

                    //     soRec.setValue({ fieldId: 'billaddress', value: singleOrder.billing_address.first_name + ' ' + singleOrder.billing_address.last_name + '\n' + singleOrder.billing_address.address1 + ' ' + singleOrder.billing_address.city + '\n' + singleOrder.billing_address.zip + ' ' + singleOrder.shipping_address.province + '\n' + singleOrder.billing_address.country });

                    //     for (var j = 0; j < singleOrder.line_items.length; j++) {
                    //         var variantID = singleOrder.line_items[j].variant_id;
                    //         var itemID = main.getItemID(variantID)
                    //         log.debug('itemID', itemID);
                    //         soRec.setSublistValue({ sublistId: 'item', fieldId: 'item', line: j, value: itemID });
                    //         soRec.setSublistValue({ sublistId: 'item', fieldId: 'quantity', line: j, value: singleOrder.line_items[j].quantity });
                    //         soRec.setSublistValue({ sublistId: 'item', fieldId: 'rate', line: j, value: singleOrder.line_items[j].price });
                    //         //UPDATE
                    //         if (taxLines.length != 0)
                    //             soRec.setSublistValue({ sublistId: 'item', fieldId: 'istaxable', line: j, value: true });
                    //     }
                    //     var soRecID = soRec.save();
                    //     log.debug('soRecID', soRecID);
                    //     var externalID = soRec.getValue({ fieldId: 'externalid' })
                    //     main.create_Fulfillment_Invoice_Payment(singleOrder, soRecID, todayDate, trackingNumber, trackingURL);
                    // }
                } catch (er) {
                    log.debug('er', er.message)
                    ERR_OBJ[singleOrder.id] = ({ orderType: 'SALES_ORDER', ERROR: er.message });
                    log.debug('ERR_OBJ', ERR_OBJ)
                    ERR_ARR.push(ERR_OBJ);
                    ERR_OBJ = {};
                    //log.debug('ERR_ARR_SALES', ERR_ARR)
                    return;
                }
            },
            create_Fulfillment_Invoice_Payment: function (singleOrder, soRecID, recDate, trackingNumber, trackingURL) {
                try {
                    try {
                        //create Item Fulfillment in Netsuite
                        var IFRec = record.transform({
                            fromType: record.Type.SALES_ORDER,
                            fromId: soRecID,
                            toType: record.Type.ITEM_FULFILLMENT
                        });
                        var C = 'IF_' + singleOrder.id;
                        C = C.toString();
                        IFRec.setText({ fieldId: 'externalid', text: C });
                        IFRec.setValue({ fieldId: 'shipstatus', value: 'C' });
                        IFRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                        IFRec.setValue({ fieldId: 'trandate', value: recDate });
                        IFRec.setText({ fieldId: 'custbody_package_tracking_url', text: trackingURL });
                        var linesPackage = IFRec.getLineCount({ sublistId: 'package' });
                        for (var y = 0; y < linesPackage; y++) {
                            IFRec.setSublistText({ sublistId: 'package', fieldId: 'packagetrackingnumber', line: y, text: trackingNumber })
                        }
                        var linesIF = IFRec.getLineCount({ sublistId: 'item' });
                        var itemArr = [];
                        for (var p = 0; p < linesIF; p++) {
                            IFRec.setSublistValue({ sublistId: 'item', fieldId: 'location', line: p, value: 1 })
                            var onHandQty = IFRec.getSublistValue({ sublistId: 'item', fieldId: 'onhand', line: p })
                            if ((onHandQty == null) || (onHandQty == "") || (onHandQty == undefined)) {
                                onHandQty = 0;
                            }
                            var QtyRem = IFRec.getSublistValue({ sublistId: 'item', fieldId: 'quantityremaining', line: p })
                            var newQty = parseFloat(QtyRem) - parseFloat(onHandQty);

                            var variantID = singleOrder.line_items[p].variant_id;
                            var itemID = main.getItemID(variantID);
                            //log.debug('itemID', itemID);
                            if (newQty > 0 && (!main.checkBackordered(itemID))) {
                                var itemObj = {};
                                itemObj.item = IFRec.getSublistValue({ sublistId: 'item', fieldId: 'item', line: p })
                                itemObj.reqQty = newQty;
                                itemArr.push(itemObj);
                            }
                        }
                        if (itemArr.length != 0) {
                            try {
                                var invAdj = record.create({ type: record.Type.INVENTORY_ADJUSTMENT })
                                invAdj.setValue({ fieldId: 'subsidiary', value: 1 })
                                invAdj.setValue({ fieldId: 'account', value: 326 })
                                invAdj.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                                //invAdj.setValue({ fieldId: 'trandate', value: recDate })

                                for (var b = 0; b < itemArr.length; b++) {
                                    invAdj.setSublistValue({ sublistId: 'inventory', fieldId: 'item', line: b, value: itemArr[b].item });
                                    invAdj.setSublistValue({ sublistId: 'inventory', fieldId: 'location', line: b, value: 1 });
                                    invAdj.setSublistValue({ sublistId: 'inventory', fieldId: 'adjustqtyby', line: b, value: itemArr[b].reqQty });
                                }
                                var invAdjID = invAdj.save();
                                log.debug('invAdjID', invAdjID)
                                if (invAdjID) {
                                    var IFRec = record.transform({
                                        fromType: record.Type.SALES_ORDER,
                                        fromId: soRecID,
                                        toType: record.Type.ITEM_FULFILLMENT
                                    });
                                    var C = 'IF_' + singleOrder.id;
                                    C = C.toString();
                                    IFRec.setText({ fieldId: 'custbody_package_tracking_url', text: trackingURL })
                                    for (var y = 0; y < linesPackage; y++) {
                                        IFRec.setSublistText({ sublistId: 'package', fieldId: 'packagetrackingnumber', line: y, text: trackingNumber })
                                    }
                                    IFRec.setText({ fieldId: 'externalid', text: C });
                                    IFRec.setValue({ fieldId: 'shipstatus', value: 'C' });
                                    IFRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                                    IFRec.setValue({ fieldId: 'trandate', value: recDate });
                                    for (var r = 0; r < linesIF; r++) {
                                        IFRec.setSublistValue({ sublistId: 'item', fieldId: 'location', line: r, value: 1 })
                                    }
                                }
                            } catch (er) {
                                log.debug('err@INV_ADJ', er.message)
                                ERR_OBJ[singleOrder.id] = ({ orderType: 'Inv adjustment', ERROR: er.message });
                                ERR_ARR.push(ERR_OBJ);
                                ERR_OBJ = {};
                            }
                        }

                        var IFRecID = IFRec.save();
                        log.debug('IFRecID', IFRecID);
                    } catch (er) {
                        log.debug('err@IF', er.message);
                        ERR_OBJ[singleOrder.id] = ({ orderType: 'Item_fullfilment', ERROR: er.message });
                        ERR_ARR.push(ERR_OBJ);
                        ERR_OBJ = {};

                    }
                    if (IFRecID) {
                        // create Invoice in Netsuite
                        var invRec = record.transform({
                            fromType: record.Type.SALES_ORDER,
                            fromId: soRecID,
                            toType: record.Type.INVOICE
                        });
                        var a = 'INV_' + singleOrder.id;
                        a = a.toString();
                        invRec.setText({ fieldId: 'externalid', text: a });
                        invRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                        invRec.setValue({ fieldId: 'trandate', value: recDate });
                        //DOUBT
                        invRec.setValue({ fieldId: 'shipdate', value: recDate });

                        var invRecID = invRec.save();
                        log.debug('invRecID', invRecID);

                        var externalID = invRec.getText({ fieldId: 'externalid' })

                        // create Customer Payment in Netsuite
                        var paymentRec = record.transform({
                            fromType: record.Type.INVOICE,
                            fromId: invRecID,
                            toType: record.Type.CUSTOMER_PAYMENT
                        });
                        var b = 'CUSPMNT_' + singleOrder.id;
                        b = b.toString();
                        paymentRec.setText({ fieldId: 'externalid', text: b });
                        paymentRec.setText({ fieldId: 'memo', text: 'Historic order from Shopify (original posting date - refunded, unfulfilled, cancelled) ' + singleOrder.id });
                        paymentRec.setValue({ fieldId: 'trandate', value: recDate });

                        var paymentRecID = paymentRec.save();
                        log.debug('paymentRecID', paymentRecID);

                        var externalID = paymentRec.getText({ fieldId: 'externalid' })
                    }
                } catch (er) {
                    log.debug('er', er.message);

                    ERR_OBJ[singleOrder.id] = ({
                        orderType: 'Invoice',
                        ERROR: er.message
                    });
                    ERR_ARR.push(ERR_OBJ);
                    ERR_OBJ = {};
                    return;
                }
            },
            remainingUsage: function () {
                var remainingTime = runtime.getCurrentScript().getRemainingUsage();
                return remainingTime;
            },
            rescheduleScript: function (since_id) {
                main.createLog();
                var currentDate = new Date();
                log.debug('EXECUTION RESCHEDULES', 'EXECUTION RESCHEDULES AT ' + (currentDate.toUTCString()));
                var remainingTime = runtime.getCurrentScript().getRemainingUsage();
                log.debug("Remaining governance units", remainingTime);
                var rescheduleTask = task.create({
                    taskType: task.TaskType.SCHEDULED_SCRIPT,
                    scriptId: "customscript_daz9_jj_ss_sync_sales_order",
                    deploymentId: "customdeploy_daz9_jj_ss_sync_sales_order",
                    params: {
                        custscript_since_id: since_id
                    }
                });
                var scriptTaskId = rescheduleTask.submit();
                log.debug("reschedule scriptTaskId ", scriptTaskId);
                return true;
            },
            isReschedule: function (since_id) {
                if (parseInt(main.remainingUsage()) < 500)
                    return main.rescheduleScript(since_id);
                else
                    return false;
            }
        }
        return main;
    });

Leave a comment

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