script
/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 */
define(['N/record', 'N/search', 'N/log'], function (record, search, log) {
    function afterSubmit(context) {
        if (context.type !== context.UserEventType.CREATE &&
            context.type !== context.UserEventType.EDIT) {
            return;
        }
        var salesOrder;
        try {
            // Load the record in dynamic mode
            salesOrder = record.load({
                type: record.Type.SALES_ORDER,
                id: context.newRecord.id,
                isDynamic: true
            });
        } catch (e) {
            log.error('Error Loading Record', 'Failed to load Sales Order in dynamic mode: ' + e.message);
            return;
        }
        // Log initial line count for debugging
        var initialLineCount = salesOrder.getLineCount({ sublistId: 'item' });
        log.debug('Initial Line Count', 'Number of item lines before processing: ' + initialLineCount);
        if (initialLineCount === 0) {
            log.error('No Item Lines', 'Sales Order has no item lines. Cannot process Item Group replacement.');
            return;
        }
        for (var i = 0; i < initialLineCount; i++) {
            try {
                // Select the line in dynamic mode
                salesOrder.selectLine({
                    sublistId: 'item',
                    line: i
                });
                var itemText = salesOrder.getCurrentSublistText({
                    sublistId: 'item',
                    fieldId: 'item'
                });
                var description = salesOrder.getCurrentSublistValue({
                    sublistId: 'item',
                    fieldId: 'description'
                });
                // Log line details for debugging
                log.debug('Processing Line ' + i, {
                    itemText: itemText,
                    description: description
                });
                // Check for "Amazon Test"
                if (itemText === 'Amazon Test' ) {
                        // Get existing field values
                        var rate = salesOrder.getCurrentSublistValue({
                            sublistId: 'item',
                            fieldId: 'rate'
                        });
                        var amount = salesOrder.getCurrentSublistValue({
                            sublistId: 'item',
                            fieldId: 'amount'
                        });
                        var etailOrderLineId = salesOrder.getCurrentSublistValue({
                            sublistId: 'item',
                            fieldId: 'custcol_celigo_etail_order_line_id'
                        });
                        // Replace the line with an Item Group (hardcoded ID 25005)
                        var newItemId = 17698;
                        if (newItemId) {
                            // Set the Item Group
                            salesOrder.setCurrentSublistValue({
                                sublistId: 'item',
                                fieldId: 'item',
                                value: newItemId
                            });
                            // Set quantity (use extracted quantity or default to 2)
                            salesOrder.setCurrentSublistValue({
                                sublistId: 'item',
                                fieldId: 'quantity',
                                value: quantity || 2
                            });
                            // Set custom price if applicable
                            if (rate != null || amount != null) {
                                salesOrder.setCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'price',
                                    value: -1 // Custom price level
                                });
                            }
                            if (rate != null) {
                                salesOrder.setCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'rate',
                                    value: rate
                                });
                            }
                            if (amount != null) {
                                salesOrder.setCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'amount',
                                    value: amount
                                });
                            } else {
                                // Ensure amount is set to avoid invalid lines
                                var calculatedAmount = rate && quantity ? rate * (quantity || 2) : 0;
                                salesOrder.setCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'amount',
                                    value: calculatedAmount
                                });
                            }
                            if (etailOrderLineId) {
                                salesOrder.setCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'custcol_celigo_etail_order_line_id',
                                    value: etailOrderLineId
                                });
                            }
                            // Commit the Item Group line
                            salesOrder.commitLine({
                                sublistId: 'item'
                            });
                            // Optional: Loop through component items to set custom fields
                            var newLineCount = salesOrder.getLineCount({ sublistId: 'item' });
                            for (var j = i + 1; j < newLineCount; j++) {
                                salesOrder.selectLine({
                                    sublistId: 'item',
                                    line: j
                                });
                                var itemType = salesOrder.getCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'itemtype'
                                });
                                if (itemType === 'Group' || itemType === 'EndGroup') {
                                    continue; // Skip Group or EndGroup lines
                                }
                                // Set custom fields on component items
                                if (etailOrderLineId) {
                                    salesOrder.setCurrentSublistValue({
                                        sublistId: 'item',
                                        fieldId: 'custcol_celigo_etail_order_line_id',
                                        value: etailOrderLineId
                                    });
                                }
                                // Ensure component lines have valid pricing
                                var compRate = salesOrder.getCurrentSublistValue({
                                    sublistId: 'item',
                                    fieldId: 'rate'
                                });
                                if (!compRate) {
                                    salesOrder.setCurrentSublistValue({
                                        sublistId: 'item',
                                        fieldId: 'price',
                                        value: -1 // Custom price level
                                    });
                                    salesOrder.setCurrentSublistValue({
                                        sublistId: 'item',
                                        fieldId: 'rate',
                                        value: 0 // Default to 0 if no rate
                                    });
                                }
                                salesOrder.commitLine({
                                    sublistId: 'item'
                                });
                            }
                            // Log the update
                            log.debug('Line updated with Item Group', {
                                line: i,
                                item: itemNameToFind,
                                newItemId: newItemId,
                                quantity: quantity || 2,
                                rate: rate,
                                amount: amount,
                                etailOrderLineId: etailOrderLineId
                            });
                            // Adjust loop index to account for added component lines
                            i = newLineCount - 1;
                        } else {
                            log.error('Item Group Not Found', 'No Item Group found with ID: ' + newItemId);
                        }
                    } else {
                        log.debug('No valid pattern', 'Line ' + i + ' description "' + description + '" did not match expected pattern.');
                }
            } catch (e) {
                log.error('Error Processing Line ' + i, e.message);
            }
        }
        // Log final line count before saving
        var finalLineCount = salesOrder.getLineCount({ sublistId: 'item' });
        log.debug('Final Line Count', 'Number of item lines after processing: ' + finalLineCount);
        if (finalLineCount === 0) {
            log.error('No Valid Lines', 'Sales Order has no valid item lines after processing. Cannot save.');
            return;
        }
        // Save the record
        try {
            salesOrder.save({
                ignoreMandatoryFields: false
            });
            log.debug('Sales Order Saved', 'Successfully saved Sales Order ID: ' + context.newRecord.id);
        } catch (e) {
            log.error('Error Saving Sales Order', 'Failed to save Sales Order: ' + e.message);
            if (e.name === 'RCRD_HAS_BEEN_CHANGED') {
                log.error('Concurrency Issue', 'Record was modified by another process. Consider retrying or checking for conflicting scripts/workflows.');
            }
        }
    }
    return {
        afterSubmit: afterSubmit
    };
});