在更新发票时设置物料的orderLine属性
本文关键字:orderLine 属性 设置 更新 | 更新日期: 2023-09-27 18:26:45
我的问题是,在创建发票后,我永远无法获得新的行项目来引用其相应的销售订单行项目。
我一直在通过SuiteTalk生成发票。当我最初创建发票时,我清空lineItemList并添加回我需要的项目。我确保orderLine属性与销售订单行项目行号匹配。这很管用。
但是,当我尝试用其他行项目更新发票时,我永远无法使新项目保留其orderLine属性。orderLine属性用于销售订单上的"Invoiced"列。
为了使引用正确,我需要删除发票,并使用我需要的所有行项目重新创建它。
有人知道我想做的事情是否可行吗?
在本例中,我使用CreateInvoice函数从头开始创建发票,并将其添加到NetSuite中。一切如预期。
public void CreateInvoice(SalesOrder salesOrder) {
Invoice brandNewInvoice = new Invoice() {
createdFrom = new RecordRef() {
internalId = salesOrder.internalId,
},
entity = salesOrder.entity,
tranDate = endDate,
tranDateSpecified = true,
startDate = startDate,
startDateSpecified = true,
endDate = endDate,
endDateSpecified = true,
itemList = new InvoiceItemList(),
};
invoice.itemList.item = GetInvoiceItemList(salesOrder); //see the function shown further down
netSuiteService.add(brandNewInvoice);
}
在本例中,发票已经创建,因此我从NetSuite获取发票,然后用新的itemList替换现有的itemList。更新后,发票现在将具有任何行项目的"无订单行"属性。发票也会丢失其"创建者"字段,因为没有设置了orderLine属性的行项目。
public void UpdateInvoice(SalesOrder salesOrder, String invoiceInternalId) {
Invoice invoice = GetNetSuiteInvoice(invoiceInternalId);
invoice.itemList.item = GetInvoiceItemList(salesOrder); //see the function shown further down
netSuiteService.update(invoice);
}
这是用于创建itemList:的函数
public InvoiceItem[] GetInvoiceItemList(SalesOrder salesOrder) {
InvoiceItem[] invoiceItemList = new InvoiceItem[salesOrder.itemList.item.Length];
for (int i = 0; i < salesOrder.itemList.item.Length; i++) {
SalesOrderItem soItem = salesOrder.itemList.item[i];
double quantity = 1;
invoiceItemList[i] = new InvoiceItem() {
item = new RecordRef() {
internalId = soItem.item.internalId,
name = soItem.item.name,
},
amount = quantity * Double.Parse(soItem.rate),
amountSpecified = true,
quantity = quantity,
quantitySpecified = true,
price = new RecordRef() {
internalId = soItem.price.internalId,
name = soItem.price.name,
},
rate = soItem.rate,
orderLine = soItem.line, //this will establish the link between the invoice and the sales order
orderLineSpecified = true,
taxRate1 = soItem.taxRate1,
taxRate1Specified = true,
};
}
return invoiceItemList;
}
实际上,您要查找的是初始化操作。您需要使用initialize,以便Netsuite正确填写created from和orderline道具。NS帮助中有一个创建现金销售的C#示例:
private void Initialize(){this.login(true);
InitializeRef ref1 = new InitializeRef();
ref1.type = InitializeRefType.salesOrder;
//internal id of the sales order to be converted to cash sale
ref1.internalId = "792";
ref1.typeSpecified = true;
InitializeRecord rec = new InitializeRecord();
rec.type = InitializeType.cashSale;
rec.reference = ref1;
ReadResponse read1 = _service.initialize(rec);
}
当将一笔交易转换为另一笔交易(例如SO到Inv,PO到IR)时,这是正常的。当您转换时,来自源事务的大部分信息都将被转移。就像您正在做的从销售订单创建发票一样(基于下面的代码)。
createdFrom = new RecordRef() {
internalId = salesOrder.internalId,
},
您不需要从销售订单中获取行项目信息并将其放入发票中,因为一旦您从销售订单创建它,它就会被预先填充(除非您需要更改行项目列的值)。
转换后的记录(在您的情况下为发票)的一种行为是,如果您从发票中删除一个行项目,您将失去与销售订单(orderLine)的链接,如果您删除所有行项目,则您将完全失去两个交易之间的链接(createdfrom)。这就是你正在经历的。orderLine/createdFrom是一个由系统填充的字段,看起来您正在填充它,但实际上并没有。