如何使用下一个计划开票金额创建销售订单发票。我不想创建全额发票。在 NetSuite UI 中,我们可以使用“下一个账单”按钮来查看下一个可计费金额。我们如何使用 Suite 脚本模拟类似的功能?
3 回答
SuiteAnswers 解释说,您需要将billdate
发票的日期设置为与销售订单的下一个计费日期相同。但是,他们提供的示例有错误并且不起作用。
下面的代码片段在 SuiteScript 1.0 中用作客户端脚本。您可以在检查销售订单记录时在浏览器控制台中运行它来进行验证。它改编自 SuiteAnswer 63760,但该答案中的示例日期格式不正确,因此失败。
var recordId = nlapiGetRecordId();
var recordType = nlapiGetRecordType();
var soRecord = nlapiLoadRecord(recordType,
recordId);
var nextBill = soRecord.getFieldValue('nextbill');
var inv = nlapiTransformRecord('salesorder', soRecord.id, 'invoice', {'billdate': nextBill});
nlapiSubmitRecord(inv,true);
对于 SuiteScript 2.0,SuiteAnswer 70522 中的示例根本不起作用。它设置billdate
使用setValue()
. 即使将setValue()
报表更正为fieldId: 'billdate'
而不是fieldId: billdate
,发票上的全部金额也会被计费。Oleg Laskov 的回答提供了一种使用defaultValues
. 以下是使用 moment.js 进行日期格式化的 Oleg 答案的扩展版本。
var oSalesOrder = scriptContext.newRecord;
var billdate = oSalesOrder.getValue({
fieldId: 'nextbill'
});
var sBillDate = moment(billdate).format('M/D/YYYY');
var invoice = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: oSalesOrder.id,
toType: record.Type.INVOICE,
isDynamic: true,
defaultValues: {
billdate: sBillDate
}
})
var invoiceId = invoice.save();
var rec = record.transform({
fromType: 'salesorder',
fromId: soId,
toType: 'invoice',
isDynamic: true,
defaultValues: {
customform : customform,
billdate: trandate
}
});
根据 SuiteAnswers https://netsuite.custhelp.com/app/answers/detail/a_id/70522
解决方案
可以使用两个选项对具有计费计划的销售订单进行计费:
- 下一个账单
- 剩余账单
Bill Remaining 选项可以通过脚本转换销售订单记录来实现。但是,要仅为下一个计费计划的金额向销售订单开具账单,则必须将账单日期设置为等于销售订单的下一个账单日期。
示例脚本:
require(['N/record', 'N/search', 'N/log'], function(record, search, log) {
var soId = '5347';
var invoice;
var mySalesOrderSearch = search.create({
type: search.Type.SALES_ORDER,
columns: [{
name: 'nextbilldate'
}],
filters: [{
name: 'mainline',
operator: 'is',
values: ['T']
}, {
name: 'internalid',
operator: 'anyof',
values: ['soId']
}]
});
var searchResult = mySalesOrderSearch.run().getRange({
start: 0,
end: 1
});
if (searchResult != null && searchResult.length != 0) {
invoice = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: soId,
toType: record.Type.INVOICE,
isDynamic: true
});
var billdate = searchResult[0].getValue({
name: 'nextbilldate'
});
if (billdate != null && billdate != '') {
invoice.setValue({
fieldId: billdate,
value: billdate
})
}
var invoiceId = invoice.save();
}
});