如何使用QuickBooks_IPP显示发票中的每个项目?

时间:2014-01-16 17:54:56

标签: php quickbooks quickbooks-online

我使用QuickBooks PHP DevKit获取每位客户的发票。这样可以正常工作,但是我需要从发票中的每一行获取每个项目以简单地显示它,并且由于某种原因我很难获得这些信息。

我可以使用

获取ItemRef
$Item = $Line->getSalesItemLineDetail();
$itemRef = $Item->getItemRef();

但它会抛出一个致命错误:"在非对象上调用成员函数getItemRef()"并杀死剧本。

这是我的代码。

    //get QuickBooks customer ID    
    $customers = $CustomerService->query($Context, $realm, "SELECT * FROM Customer WHERE id = '18' ");

    if (count($customers))
    {
        foreach ($customers as $Customer)
        {

            $invoices = $InvoiceService->query($Context, $realm, "SELECT * FROM Invoice WHERE CustomerRef = '" . QuickBooks_IPP_IDS::usableIDType($Customer->getId()) . "' ");

            if (count($invoices))
            {
                foreach ($invoices as $Invoice)
                {
                    echo $Invoice->getTotalAmt();

                    $line_count = $Invoice->countLine();

                    for ($i = 0; $i < $line_count; $i++)
                    {
                      $Line = $Invoice->getLine($i);
                      //print_r($Line);

                      $Item = $Line->getSalesItemLineDetail();
                      $itemRef = $Item->getItemRef();

                      $item = $ItemService->query($Context, $realm, "SELECT * FROM Item WHERE id = '" . QuickBooks_IPP_IDS::usableIDType($itemRef) . "' ");

                      foreach($item as $Item){
                          echo $Item->getName();
                      }

                    }
                }
            }
            else
            {
                print(' &nbsp; &nbsp; This customer has no invoices.<br>');
            }
        }
    }
    else
    {
        print('There are no customers with the provided ID');
    }

简而言之,在发票的每一行中查询项目的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

这里有一些值得注意的事情,而且很难确切地说出你的代码究竟发生了什么......所以这里有一些事情需要检查:

<强> 1。确保您提取订单项:

默认情况下,Intuit的某些查询不会返回订单项。这对于PHP或其他任何东西都不是特定的,它只是Intuit的API工作方式。

如果您想要订单项,则可能需要执行以下查询:

SELECT *, Line.* FROM Invoice WHERE Id = '5'

<强> 2。并非每个订单项都会有SalesItemLineDetail个节点。

订单项可以包含各种不同的详细信息节点。某些订单项可能包含SalesItemLineDetail个节点,而其他订单项可能包含DiscountLineDetail个节点,而其他订单项可能包含其他类型。

在此处查看可能性:

所以,像这样的声明

是不安全的
$Line = $Invoice->getLine(0);
$Item = $Line->getSalesItemLineDetail();
$itemRef = $Item->getItemRef();

因为您尝试获取SalesItemLineDetail节点可能不存在,这会导致$ItemNULL,这会导致print($IPP->lastRequest()); print($IPP->lastResponse()); 一个错误。

第3。调试!

对您而言可能有用的一件事(当您发布寻求帮助时肯定会有所帮助)将是查看您从Intuit获得的实际XML响应。

您可以这样做:

print_r($Line);

这将转储一些有用的调试输出。您还可以打印出对象:

$num_lines = $Invoice->countLine();                 // How many line items are there?
for ($i = 0; $i < $num_lines; $i++)
{
    $Line = $Invoice->getLine(0);

    // Let's find out what detail type this uses - only fetching item lines here 
    if ($Line->getDetailType() == 'SalesItemLineDetail')
    {
            $Detail = $Line->getSalesItemLineDetail();

            $item_id = $Detail->getItemRef();

            print('Item id is: ' . $item_id . "\n");

            // Query for the item 
            $items = $ItemService->query($Context, $realm, "SELECT * FROM Item WHERE Id = '" . QuickBooks_IPP_IDS::usableIDType($item_id) . "' ");
            print('   That item is named: ' . $items[0]->getName() . "\n");
    }
}

这也可以帮助您追踪问题。

<强> 4。最后 - 一个有效的例子!

这是一个适合你的例子:

简而言之,您想要做的是:

{{1}}