We’re integrating another system into NetSuite tha...
# suitescript
f
We’re integrating another system into NetSuite that will send over invoice data. I’m trying to create invoices directly but I can’t figure out how to set a/r account. It complains every time I try to set the internal id with setValue. Any idea what I’m missing? I’ve tried the flow manually and been able to create the record with the values that I try to set
c
Share your code.
f
Copy code
/**
 * @NApiVersion 2.1
 * @NScriptType Restlet
 * @NModuleScope SameAccount
 */

import * as log from 'N/log'
import * as record from 'N/record'

export const post = (requestBody): number => {

    const data = requestBody.data

    const rec = record.create({
        type: record.Type.INVOICE,
        isDynamic: true
    })

    for (const [key, value] of fieldMapping.entries()) {
        try {
            if (!key) { continue }
            const extractedValue = getValueFromPath(data, value)
            if (extractedValue) {

                if (key === 'item' && Array.isArray(extractedValue)) {
                    log.debug('items.length', extractedValue.length)
                    for (const item of extractedValue) {
                        rec.selectNewLine({ sublistId: 'item' })

                        rec.setCurrentSublistValue({ sublistId: key, fieldId: 'item', value: item.numeric_id })
                        rec.setCurrentSublistValue({ sublistId: key, fieldId: 'amount', value: item.amount.amount })
                        rec.setCurrentSublistValue({ sublistId: key, fieldId: 'taxcode', value: 5 })

                        rec.commitLine({ sublistId: 'item' })
                    }
                    continue
                }

                rec.setValue({ fieldId: key, value: data[extractedValue] })
                log.debug('Extracted Value', `fieldId: ${key}, value: ${extractedValue}`)

            } else {
                log.debug('No Extracted Value', `Value for fieldId ${key} is undefined.`)
            }
        } catch(e) {
            log.error('Caught Error', e.message)
        }
    }

    rec.setValue({ fieldId: 'subsidiary', value: 2 }) // this fails
    rec.setValue({ fieldId: 'account', value: 119 }) // this fails

    const recId = rec.save({
        ignoreMandatoryFields: true
    })
    return recId
}

const fieldMapping = new Map([
    ['entity', 'customer.company_id'],
    ['currency', 'currency'],
    ['memo', 'description'],
    ['trandate', 'date'],
    ['duedate', 'latest_date'],
    ['item', 'items'],
    ['exchangerate', 'exchange_rate'],
])

function getValueFromPath(data, path) {
    const steps = path.split('.')
    let currentValue = data

    for (const step of steps) {
        if (currentValue[step]) {
            currentValue = currentValue[step]
        } else {
            return undefined
        }
    }
    return currentValue
}
c
I thought the subsidiary and account get set automatically based on the customer that you enter?
Granted, multi-sub customers may be different
f
When I run without setting the values it complains about the A/R Account missing
Copy code
{
  "error": {
    "code": "USER_ERROR",
    "message": "{\"type\":\"error.SuiteScriptError\",\"name\":\"USER_ERROR\",\"message\":\"Please select an A/R account for this invoice.\",\"id\":\"\",\"stack\":[\"Error\n    at RecordInvoker.save (suitescript/resources/javascript/record/serverRecordService.js:371:13)\n    at NetSuiteObject.thenableFunction() (suitescript/resources/javascript/record/proxy.js:115:24)\n    at <http://Object.post|Object.post> (/SuiteScripts/sta_rl_jom_post.js:146:27)\"],\"cause\":{\"type\":\"internal error\",\"code\":\"USER_ERROR\",\"details\":\"Please select an A/R account for this invoice.\",\"userEvent\":null,\"stackTrace\":[\"Error\n    at RecordInvoker.save (suitescript/resources/javascript/record/serverRecordService.js:371:13)\n    at NetSuiteObject.thenableFunction() (suitescript/resources/javascript/record/proxy.js:115:24)\n    at <http://Object.post|Object.post> (/SuiteScripts/sta_rl_jom_post.js:146:27)\"],\"notifyOff\":false},\"notifyOff\":false,\"userFacing\":true}"
  }
}
c
Hang on- you need to set the customer first. Is that gusranteed by the order in your KV loop?
f
Yeah, I do have the customer up on the top, so it should be set first
Looks like it was a permissions issue