我的问题是,在创建发票后,我永远无法获得新的订单项来引用相应的销售订单行项目。
我一直在通过SuiteTalk生成发票。当我最初创建发票时,我清空lineItemList并添加回我需要的项目。我确保orderLine属性与销售订单行项目行号匹配。这很有效。
但是当我尝试使用其他订单项更新发票时,我永远无法获取新商品以保留其orderLine属性。 orderLine属性用于销售订单上的“已开票”列。
为了使引用正确,我需要删除发票并使用我需要的所有订单项再次创建。
有谁知道我想做什么是可能的?
在此示例中,我使用此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属性。发票也会丢失其“创建自”字段,因为没有设置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;
}
答案 0 :(得分:0)
这是正常的,当将交易转换为另一个交易时(例如SO到Inv,PO到IR)。转换时,源事务中的大部分信息都将被转移。就像你正在做的那样,从销售订单创建一个发票(根据你的代码)。
createdFrom = new RecordRef() {
internalId = salesOrder.internalId,
},
您不需要从销售订单中获取订单项信息并将其放入发票中,因为一旦您从Sales Oder创建它就会预先填充(除非您需要更改a的值订单项列)。
转换记录的一种行为(在您的情况下是发票),如果您从发票中删除订单项,您将丢失指向销售订单(orderLine)的链接,如果您删除所有订单项,您将完全失去两个事务之间的链接(createdfrom)。这就是您所经历的。 orderLine / createdFrom是系统填充的字段,看起来你正在填充它,但你不是。
答案 1 :(得分:0)
实际上你正在寻找的是初始化操作。您需要使用初始化以便Netsuite正确填写创建的from和orderline道具。在NS帮助中,有一个创建现金销售的C#示例:
private void Initialize() { this.login(真);
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);
}