在更新发票时设置物料的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;
}

在更新发票时设置物料的orderLine属性

实际上,您要查找的是初始化操作。您需要使用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是一个由系统填充的字段,看起来您正在填充它,但实际上并没有。