我正在尝试使用consolibyte quickbooks php工具包查询分配给发票的所有付款。我希望我可以使用查询将其拉回来,但到目前为止我能看到的唯一方法是抓住所有付款然后循环并检查LinkedTxn数组中的内容并检查它是否具有'Invoice类型'并且'TxnId'值与我存储的发票ID相匹配。到目前为止我得到的是这笔付款,但显然不是一个选项,因为系统中可能有成千上万的付款:
public function getAllPaymentsForInvoice(Invoice $invoice)
{
$query = "SELECT * FROM Payment";
$payments = $this->qbPaymentService->query($this->context, $this->realm, $query);
$lines = [];
foreach ($payments as $payment) {
$num_lines = $payment->countLine();
for ($i = 0; $i < $num_lines; $i++) {
$line = $payment->getLine($i);
$txnId = $this->parseResponse($line->getLinkedTxn()->getTxnId());// convert {-1} to 1
$txnType = $line->getLinkedTxn()->getTxnType();
if ($txnType == 'Invoice' && $txnId == $invoice->qb_ref) {
$lines[] = $line;
}
}
}
return $lines;
}
有人能把我推向更好的方向吗?
答案 0 :(得分:0)
使用QuickBooks Online API进行此操作并不容易。这不是QuickBooks Online本身支持的东西。
您可以采取两种不同的方法来优化您正在做的事情。
应用的付款应始终与发票的客户相同,因此您可以将查询更改为update
,其中@Override
public void onBackPressed() {
}
是发票中的SELECT * FROM Payment WHERE CustomerRef = 'xyz'
。然后,使用现有代码确切地检查应用哪些发票付款。
使用CDC功能在您自己的数据库中保留所有付款的缓存副本,并查询您自己的数据库以获取相关信息(正常的SQL数据库比QuickBooks Online提供的内容更加灵活和可查询)。
CDC功能专门设计用于在您自己的应用程序中保留QuickBooks数据的准确缓存副本,专门用于解决您遇到的情况。你传递一个时间戳,它给你自那个时间戳以来发生了变化的一切。通过记住上次运行xyz
方法的日期/时间,您可以不断获得自上次查询以来已更改的任何对象的轻量级更新。
CustomerRef
文档链接:
答案 1 :(得分:0)
这个问题已经很老了,无论如何,以防其他人正在寻找答案:
$InvoiceService = new QuickBooks_IPP_Service_Invoice();
// $invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice STARTPOSITION 1 MAXRESULTS 10");
// If, we have QB Invoice # i.e.DocNumber
$invoice_no = 1001;
$invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice WHERE DocNumber = '$invoice_no' ");
foreach ($invoices as $Invoice)
{
$txnId = 0;
if (is_object($Invoice->getLinkedTxn()) && $Invoice->getLinkedTxn()->getTxnType() == 'Payment') {
$txnId = $Invoice->getLinkedTxn()->getTxnId();
}
print('Invoice # '.$Invoice->getDocNumber().' has a total of $'.$Invoice->getTotalAmt().' and Linked Payment ID: ' . $txnId . "\n");
}