如何在QuickBooks中自动结清新建SalesOrder记录的未结余额?
解决QuickBooks销售记录显示未结余额&Open状态的问题
嘿,我来帮你搞定这个问题!你用nsoftware InQB SDK创建的销售订单显示未结余额和Open状态,主要原因是QuickBooks里的Sales Order(销售订单)本身就是待履行的意向订单,默认状态就是Open,未结余额等于订单总金额——因为它还没关联发票或收款流程。咱们分两种场景来解决:
场景1:你实际想要创建已开单且结清的销售记录(比如现金销售)
如果你的业务是直接完成收款的销售,不该用Salesorder对象,应该用SalesReceipt(销售收据)或者Invoice(发票+标记已付款)。这里给你用SalesReceipt的代码示例,它会直接记录已收款的销售,不会有未结余额:
var total = "999"; var connectionString = config.ToString(); // 使用SalesReceipt对象,对应已收款的现金销售 var salesReceipt = new nsoftware.InQB.SalesReceipt { QBConnectionString = connectionString, CustomerName = "Internal Application Test", TotalAmount = total }; var receiptItem = new SalesReceiptItem(); receiptItem.ItemName = "Daily Cash Sales Test"; receiptItem.Amount = total; salesReceipt.Items.Add(receiptItem); // 提交到QuickBooks salesReceipt.Add();
场景2:你确实需要创建销售订单,但要标记为已完成
如果你的需求就是创建销售订单,只是希望它不再显示Open状态和未结余额,需要做两个关键设置:
- 把订单的
Status设为"Closed" - 给每个行项设置
QuantityFulfilled等于Quantity(标记已发货)
修改后的代码如下:
var total = "999"; var connectionString = config.ToString(); var salesOrder = new nsoftware.InQB.Salesorder { QBConnectionString = connectionString, CustomerName = "Internal Application Test", Status = "Closed" // 标记订单为已关闭 }; var salesOrderItem = new SalesOrderItem(); salesOrderItem.ItemName = "Daily Cash Sales Test"; salesOrderItem.Quantity = 1; // 假设数量为1 salesOrderItem.QuantityFulfilled = 1; // 标记该商品已发货 salesOrderItem.Amount = total; salesOrder.Items.Add(salesOrderItem); // 提交到QuickBooks salesOrder.Add();
额外说明
QuickBooks的对象逻辑很清晰:
Salesorder:待履行的客户订单,默认Open状态,未结余额是订单总额,需要后续生成发票或收款后才会清零Invoice:已开单但可能未收款的记录,会显示未结余额,需要用ReceivePayment来关联收款SalesReceipt:已收款的销售记录,无未结余额,状态默认是Completed
内容的提问来源于stack exchange,提问作者Dan Beaulieu
相关产品推荐
相关产品推荐

