Quickbooks - 选择发票的所有付款

时间:2016-03-07 10:25:44

标签: php quickbooks quickbooks-online

我正在尝试使用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;
}

有人能把我推向更好的方向吗?

2 个答案:

答案 0 :(得分:0)

使用QuickBooks Online API进行此操作并不容易。这不是QuickBooks Online本身支持的东西。

您可以采取两种不同的方法来优化您正在做的事情。

  1. 应用的付款应始终与发票的客户相同,因此您可以将查询更改为update,其中@Override public void onBackPressed() { } 是发票中的SELECT * FROM Payment WHERE CustomerRef = 'xyz'。然后,使用现有代码确切地检查应用哪些发票付款。

  2. 使用CDC功能在您自己的数据库中保留所有付款的缓存副本,并查询您自己的数据库以获取相关信息(正常的SQL数据库比QuickBooks Online提供的内容更加灵活和可查询)。

  3. 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");
     }