2016-03-07 55 views
0

我想查詢使用consolibyte quickbooks php工具包分配給發票的所有付款。我希望我可以使用查詢將其撤回,但到目前爲止,我唯一可以看到的方法是獲取所有付款,然後遍歷並檢查LinkedTxn數組中的內容,並檢查它是否包含「Invoice」類型'並且'TxnId'的值與我存儲的發票ID相匹配。我有什麼到目前爲止,這是它得到了付款,但顯然不是一個選項前進,因爲可能會支付數萬系統:Quickbooks - 選擇發票的所有付款

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

使用QuickBooks Online API完成此操作並不容易,而且是一種簡單的方法。這不僅僅是QuickBooks Online本身支持的。

您可以採取兩種不同的方法來優化您的操作。

  1. 應用應該始終爲同一客戶的發票支付的款項,這樣你就可以查詢更改爲SELECT * FROM Payment WHERE CustomerRef = 'xyz'其中xyz是從發票的CustomerRef。然後,使用您現有的代碼來檢查確切應用哪些發票付款。

  2. 使用CDC功能將所有付款的緩存副本保留在您自己的數據庫中,並查詢您自己的數據庫以獲取相應信息(正常的SQL數據庫比QuickBooks Online提供的更靈活且查詢能力更強) 。

疾病預防控制中心的功能是專門設計用來讓你保持QuickBooks的數據的準確,緩存拷貝到自己的應用程序,專門解決像你運行到的情況。您將時間戳傳遞給它,它會爲您提供自該時間戳以來已更改的所有內容。通過記住上次運行->cdc(...)方法的日期/時間,您可以持續輕量更新自上次查詢以來發生更改的任何對象。

<?php 
$CDCService = new QuickBooks_IPP_Service_ChangeDataCapture(); 

// What types of objects do you want to get? 
$objects = array( 
    'Payment', 
    'Invoice', 
    ); 

// The date they should have been updated after 
$timestamp = QuickBooks_Utilities::datetime($datetime_you_last_called_cdc_method); 
$cdc = $CDCService->cdc($Context, $realm, 
    $objects, 
    $timestamp); 

// You would cache all the stuff you get back here 
print_r($cdc); 

文檔鏈接:

+0

喜基思。只是注意到你發佈了一個答案。迄今爲止,我的解決方案涉及從發票中獲取關聯交易,將它們內化,然後在支付表上查詢ID位於字符串中的支付。例如:「SELECT * FROM Payment WHERE Id IN('」。implode(「','」,$ paymentIds)。「')」。其中$ paymentIds已經過預處理以獲取發票中的所有關聯交易。這似乎正在做我所需要的。這對你來說似乎是一個很好的解決方案嗎? – Steven1978

+0

這個解決方案與「IN(..)」完美結合,IMO應該是一個被接受的答案 – Aramir