Create invoice automatically for shipped quantity of items in SO

define([‘N/search’, ‘N/record’], function (search, record) {

    function getInputData() {

        return search.create({

            type: “itemfulfillment”,

            filters: [

                [“type”, “anyof”, “ItemShip”],

                “AND”,

                [“status”, “anyof”, “ItemShip:C”],

                “AND”,

                [“taxline”, “is”, “F”],

                “AND”,

                [“shipping”, “is”, “F”],

                “AND”,

                [“cogs”, “is”, “F”],

                “AND”,

                [“createdfrom”, “anyof”, “2908708”],

                “AND”,

                [“mainline”, “is”, “T”],

                “AND”,

                [“createdfrom.status”, “noneof”, “SalesOrd:G”],

                “AND”,

                [“createdfrom.type”, “anyof”, “SalesOrd”]

            ],

            columns: [

                search.createColumn({ name: “createdfrom”, label: “Created From” }),

                search.createColumn({ name: “tranid”, label: “Document Number” }),

                search.createColumn({ name: “statusref”, label: “Status” }),

                search.createColumn({ name: “item”, label: “Item” }),

                search.createColumn({ name: “quantity”, label: “Quantity” }),

                search.createColumn({ name: “line”, label: “Line ID” }),

                search.createColumn({ name: “lineuniquekey”, label: “Line Unique Key” })

            ]

        });

    }

    function map(context) {

        let searchResult = JSON.parse(context.value);

        log.debug(“searchResult”, searchResult);

        let createdFrom = searchResult.values.createdfrom.value;

        context.write({

            key: createdFrom,

            value: searchResult

        });

    }

    function reduce(context) {

        try {

            let salesOrderId = context.key;

            let fulfillments = context.values.map(function (value) {

                return JSON.parse(value);

            });

            log.debug(‘Transforming Sales Order’, ‘Sales Order ID: ‘ + salesOrderId);

            let invoice = record.transform({

                fromType: record.Type.SALES_ORDER,

                fromId: salesOrderId,

                toType: record.Type.INVOICE

            });

            let invoiceLines = invoice.getLineCount({ sublistId: ‘item’ });

            log.debug(‘Invoice Line Count’, ‘Invoice Lines: ‘ + invoiceLines);

            let salesOrder = record.load({

                type: record.Type.SALES_ORDER,

                id: salesOrderId

            });

            let salesOrderLines = salesOrder.getLineCount({ sublistId: ‘item’ });

            let orderLineQuantities = {};

            for (let j = 0; j < fulfillments.length; j++) {

                let fulfillment = record.load({

                    type: record.Type.ITEM_FULFILLMENT,

                    id: fulfillments[j].id

                });

                let fulfillmentLines = fulfillment.getLineCount({ sublistId: ‘item’ });

                for (let k = 0; k < fulfillmentLines; k++) {

                    let orderline = fulfillment.getSublistValue({

                        sublistId: ‘item’,

                        fieldId: ‘orderline’,

                        line: k

                    });

                    log.debug(‘Order Line ID’, ‘Order Line ID: ‘ + orderline);

                    let quantity = fulfillment.getSublistValue({

                        sublistId: ‘item’,

                        fieldId: ‘quantity’,

                        line: k

                    });

                    log.debug(‘Quantity’, ‘Quantity: ‘ + quantity);

                    if (orderLineQuantities.hasOwnProperty(orderline)) {

                        orderLineQuantities[orderline] += quantity;

                    } else {

                        orderLineQuantities[orderline] = quantity;

                    }

                    log.debug(‘Order Line: ‘ + orderline, ‘Quantity: ‘ + quantity + ‘, Accumulated Quantity: ‘ + orderLineQuantities[orderline]);

                }

            }

            let linesToDelete = [];

            for (let i = parseInt(invoiceLines) 1; i >= 0; i) {

                let invoiceLineId = invoice.getSublistValue({

                    sublistId: ‘item’,

                    fieldId: ‘orderline’,

                    line: i

                });

                let itemName = invoice.getSublistText({

                    sublistId: ‘item’,

                    fieldId: ‘item’,

                    line: i

                });

                log.debug(‘Invoice Line ID’, ‘Invoice Line ID: ‘ + invoiceLineId + ” Item Name “ + itemName);

                log.debug(“orderLineQuantities”, orderLineQuantities);

                let salesOrder = record.load({

                    type: record.Type.SALES_ORDER,

                    id: salesOrderId

                });

                let salesOrderLines = salesOrder.getLineCount({ sublistId: ‘item’ });

                if (orderLineQuantities.hasOwnProperty(invoiceLineId)) {

                    let totalQuantity = orderLineQuantities[invoiceLineId];

                    for (let m = 0; m < salesOrderLines; m++) {

                        let salesOrderLineId = salesOrder.getSublistValue({

                            sublistId: ‘item’,

                            fieldId: ‘line’,

                            line: m

                        });

                        if (salesOrderLineId == invoiceLineId) {

                            let salesOrderLineFieldValue = salesOrder.getSublistValue({

                                sublistId: ‘item’,

                                fieldId: ‘quantitybilled’,

                                line: m

                            });

                            totalQuantity -= salesOrderLineFieldValue;

                            break;

                        }

                    }

                    invoice.setSublistValue({

                        sublistId: ‘item’,

                        fieldId: ‘quantity’,

                        line: i,

                        value: totalQuantity

                    });

                }

                else {

                    let itemId = invoice.getSublistValue({

                        sublistId: ‘item’,

                        fieldId: ‘item’,

                        line: i

                    });

                    log.debug(‘Item ID’, ‘Item ID: ‘ + itemId);

                    let itemFields = search.lookupFields({

                        type: search.Type.ITEM,

                        id: itemId,

                        columns: [‘recordtype’]

                    });

                    let itemType = itemFields.recordtype;

                    log.debug(‘Item Type’, ‘Item Type: ‘ + itemType);

                    let itemRecord = record.load({

                        type: itemType,

                        id: itemId

                    });

                    let flag = 0;

                    let itemFulfillmentCheckbox = itemRecord.getValue({ fieldId: ‘isfulfillable’ });

                    if ((itemType === ‘discountitem’ || (itemType === ‘noninventoryitem’ && !itemFulfillmentCheckbox)) && i > 0) {

                        log.debug(“dis , noninv”);

                        for (let t = 0; t < salesOrderLines; t++) {

                            let salesOrderLineId = salesOrder.getSublistValue({

                                sublistId: ‘item’,

                                fieldId: ‘line’,

                                line: t

                            });

                            let itemInSo = salesOrder.getSublistValue({

                                sublistId: ‘item’,

                                fieldId: ‘item’,

                                line: t

                            });

                            if ((itemId == itemInSo) && (salesOrderLineId == invoiceLineId)) {

                                for (let h = parseInt(t) 1; h >= 0; h) {

                                    let nextItem = salesOrder.getSublistValue({

                                        sublistId: ‘item’,

                                        fieldId: ‘item’,

                                        line: h

                                    });

                                    let itemTypeInSo = salesOrder.getSublistValue({

                                        sublistId: ‘item’,

                                        fieldId: ‘itemtype’,

                                        line: h

                                    });

                                    let secondLineId = salesOrder.getSublistValue({

                                        sublistId: ‘item’,

                                        fieldId: ‘line’,

                                        line: h

                                    });

                                    log.debug(‘Item Type in SO’, ‘Item Type in SO: ‘ + itemTypeInSo);

                                    let itemFieldsInSo = search.lookupFields({

                                        type: search.Type.ITEM,

                                        id: nextItem,

                                        columns: [‘recordtype’]

                                    });

                                    let itemTypeSO = itemFieldsInSo.recordtype;

                                    log.debug(‘Item Type’, ‘Item Type: ‘ + itemTypeSO);

                                    let itemRecordInSO = record.load({

                                        type: itemTypeSO,

                                        id: nextItem

                                    });

                                    let itemFulfillmentCheckboxInSO = itemRecordInSO.getValue({ fieldId: ‘isfulfillable’ });

                                    if ((itemTypeInSo == ‘InvtPart’) || (itemTypeInSo == “NonInvtPart” && itemFulfillmentCheckboxInSO)) {

                                        if (orderLineQuantities.hasOwnProperty(secondLineId)) {

                                            flag = parseInt(flag) + 1;

                                        }

                                        break;

                                    }

                                }

                            }

                        }

                    }

                    log.debug(‘Flag’, ‘Flag: ‘ + flag);

                    if (flag == 0) {

                        invoice.removeLine({

                            sublistId: ‘item’,

                            line: i

                        });

                    }

                }

            }

            log.debug(‘Lines to Delete total’, ‘Lines to Delete: ‘ + linesToDelete);

            log.debug(‘Before Save Invoice’, ‘Attempting to save invoice’);

            let invoiceId = invoice.save({ ignoreMandatoryFields: true });

            log.debug(‘Invoice Created’, ‘Invoice ID: ‘ + invoiceId);

        } catch (e) {

            log.error(‘Error Transforming Sales Order to Invoice’, ‘Sales Order ID: ‘ + salesOrderId + ‘, Error: ‘ + e.name + ‘ – ‘ + e.message);

        }

    }

Leave a comment

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