2016-03-07 74 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