更新发票时设置商品的orderLine属性

时间:2015-12-15 05:45:03

标签: c# web-services netsuite

我的问题是,在创建发票后,我永远无法获得新的订单项来引用相应的销售订单行项目。

我一直在通过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;
}

2 个答案:

答案 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);
            }