首页 > 解决方案 > Quickbooks Online API PHP SDK 无法使用从查询返回的值更新 Bill

问题描述

根据 QBO docs,为了更新账单的内容,你应该

Use this operation to update any of the writable fields of an existing bill object. The request body must include all writable fields of the existing object as returned in a read response. Writable fields omitted from the request body are set to NULL. The ID of the object to update is specified in the request body.

我们像这样查询账单

SELECT * FROM Bill where DocNumber='150577' and VendorRef='156'

它返回以下内容:

   (
    [0] => QuickBooksOnline\API\Data\IPPBill Object
        (
            [PayerRef] =>
            [SalesTermRef] =>
            [DueDate] => 2020-10-22
            [RemitToAddr] =>
            [ShipAddr] =>
            [Balance] => 89.59
            [HomeBalance] => 89.59
            [BillEx] =>
            [VendorRef] => 156
            [APAccountRef] => 46
            [TotalAmt] => 89.59
            [BillEmail] =>
            [ReplyEmail] =>
            [Memo] =>
            [GlobalTaxCalculation] => TaxExcluded
            [DocNumber] => 150577
            [TxnDate] => 2020-10-22
            [DepartmentRef] =>
            [CurrencyRef] => CAD
            [ExchangeRate] => 1
            [PrivateNote] =>
            [TxnStatus] =>
            [LinkedTxn] =>
            [Line] => Array
                (
                    [0] => QuickBooksOnline\API\Data\IPPLine Object
                        (
                            [Id] => 1
                            [LineNum] => 1
                            [Description] =>
                            [Amount] => 54.02
                            [LinkedTxn] =>
                            [DetailType] => AccountBasedExpenseLineDetail
                            [PaymentLineDetail] =>
                            [DiscountLineDetail] =>
                            [TaxLineDetail] =>
                            [SalesItemLineDetail] =>
                            [DescriptionLineDetail] =>
                            [ItemBasedExpenseLineDetail] =>
                            [AccountBasedExpenseLineDetail] => QuickBooksOnline\API\Data\IPPAccountBasedExpenseLineDetail Object
                                (
                                    [CustomerRef] =>
                                    [ClassRef] =>
                                    [AccountRef] => 40
                                    [BillableStatus] => NotBillable
                                    [MarkupInfo] =>
                                    [TaxAmount] =>
                                    [TaxCodeRef] => 22
                                    [TaxInclusiveAmt] =>
                                    [ExpenseDetailLineDetailEx] =>
                                )

                            [DepositLineDetail] =>
                            [PurchaseOrderItemLineDetail] =>
                            [SalesOrderItemLineDetail] =>
                            [ItemReceiptLineDetail] =>
                            [JournalEntryLineDetail] =>
                            [GroupLineDetail] =>
                            [SubTotalLineDetail] =>
                            [TDSLineDetail] =>
                            [CustomField] =>
                            [LineEx] =>
                        )

                    [1] => QuickBooksOnline\API\Data\IPPLine Object
                        (
                            [Id] => 2
                            [LineNum] => 2
                            [Description] =>
                            [Amount] => 23.88
                            [LinkedTxn] =>
                            [DetailType] => AccountBasedExpenseLineDetail
                            [PaymentLineDetail] =>
                            [DiscountLineDetail] =>
                            [TaxLineDetail] =>
                            [SalesItemLineDetail] =>
                            [DescriptionLineDetail] =>
                            [ItemBasedExpenseLineDetail] =>
                            [AccountBasedExpenseLineDetail] => QuickBooksOnline\API\Data\IPPAccountBasedExpenseLineDetail Object
                                (
                                    [CustomerRef] =>
                                    [ClassRef] =>
                                    [AccountRef] => 37
                                    [BillableStatus] => NotBillable
                                    [MarkupInfo] =>
                                    [TaxAmount] =>
                                    [TaxCodeRef] => 22
                                    [TaxInclusiveAmt] =>
                                    [ExpenseDetailLineDetailEx] =>
                                )

                            [DepositLineDetail] =>
                            [PurchaseOrderItemLineDetail] =>
                            [SalesOrderItemLineDetail] =>
                            [ItemReceiptLineDetail] =>
                            [JournalEntryLineDetail] =>
                            [GroupLineDetail] =>
                            [SubTotalLineDetail] =>
                            [TDSLineDetail] =>
                            [CustomField] =>
                            [LineEx] =>
                        )

                    [2] => QuickBooksOnline\API\Data\IPPLine Object
                        (
                            [Id] => 3
                            [LineNum] => 3
                            [Description] =>
                            [Amount] => 0
                            [LinkedTxn] =>
                            [DetailType] => AccountBasedExpenseLineDetail
                            [PaymentLineDetail] =>
                            [DiscountLineDetail] =>
                            [TaxLineDetail] =>
                            [SalesItemLineDetail] =>
                            [DescriptionLineDetail] =>
                            [ItemBasedExpenseLineDetail] =>
                            [AccountBasedExpenseLineDetail] => QuickBooksOnline\API\Data\IPPAccountBasedExpenseLineDetail Object
                                (
                                    [CustomerRef] =>
                                    [ClassRef] =>
                                    [AccountRef] => 94
                                    [BillableStatus] => NotBillable
                                    [MarkupInfo] =>
                                    [TaxAmount] =>
                                    [TaxCodeRef] => 22
                                    [TaxInclusiveAmt] =>
                                    [ExpenseDetailLineDetailEx] =>
                                )

                            [DepositLineDetail] =>
                            [PurchaseOrderItemLineDetail] =>
                            [SalesOrderItemLineDetail] =>
                            [ItemReceiptLineDetail] =>
                            [JournalEntryLineDetail] =>
                            [GroupLineDetail] =>
                            [SubTotalLineDetail] =>
                            [TDSLineDetail] =>
                            [CustomField] =>
                            [LineEx] =>
                        )

                )

            [TxnTaxDetail] => QuickBooksOnline\API\Data\IPPTxnTaxDetail Object
                (
                    [DefaultTaxCodeRef] =>
                    [TxnTaxCodeRef] =>
                    [TotalTax] => 11.69
                    [TaxLine] => QuickBooksOnline\API\Data\IPPLine Object
                        (
                            [Id] =>
                            [LineNum] =>
                            [Description] =>
                            [Amount] => 11.69
                            [LinkedTxn] =>
                            [DetailType] => TaxLineDetail
                            [PaymentLineDetail] =>
                            [DiscountLineDetail] =>
                            [TaxLineDetail] => QuickBooksOnline\API\Data\IPPTaxLineDetail Object
                                (
                                    [TaxRateRef] => 37
                                    [PercentBased] => true
                                    [TaxPercent] => 15
                                    [NetAmountTaxable] => 77.90
                                    [TaxInclusiveAmount] =>
                                    [OverrideDeltaAmount] =>
                                    [ServiceDate] =>
                                    [TaxLineDetailEx] =>
                                )

                            [SalesItemLineDetail] =>
                            [DescriptionLineDetail] =>
                            [ItemBasedExpenseLineDetail] =>
                            [AccountBasedExpenseLineDetail] =>
                            [DepositLineDetail] =>
                            [PurchaseOrderItemLineDetail] =>
                            [SalesOrderItemLineDetail] =>
                            [ItemReceiptLineDetail] =>
                            [JournalEntryLineDetail] =>
                            [GroupLineDetail] =>
                            [SubTotalLineDetail] =>
                            [TDSLineDetail] =>
                            [CustomField] =>
                            [LineEx] =>
                        )

                )

            [TxnSource] =>
            [TaxFormType] =>
            [TaxFormNum] =>
            [TransactionLocationType] =>
            [Id] => 282835
            [SyncToken] => 0
            [MetaData] => QuickBooksOnline\API\Data\IPPModificationMetaData Object
                (
                    [CreatedByRef] =>
                    [CreateTime] => 2020-10-22T14:40:58-07:00
                    [LastModifiedByRef] =>
                    [LastUpdatedTime] => 2020-10-22T14:40:58-07:00
                    [LastChangedInQB] =>
                    [Synchronized] =>
                )

            [CustomField] =>
            [AttachableRef] =>
            [domain] =>
            [status] =>
            [sparse] =>
        )

)

然后我们进行一些修改并尝试使用重新发布更新的数据

            $out = Bill::update($qb_data_original, $qb_data_updated);
            $config = $oAuthKeys->getAsArray();
            $resultingBillObj = $dataService->Update($out);
            print_r($resultingBillObj);

但是我们得到的错误说

PHP Fatal error:  Uncaught Exception: Can't convert Passed Parameter to IPPReferenceType. in /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/FacadeHelper.php:293
Stack trace:
#0 [internal function]: QuickBooksOnline\API\Facades\FacadeHelper::getIPPReferenceTypeBasedOnArray(NULL, 'PayerRef')
#1 /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/FacadeHelper.php(195): ReflectionMethod->invoke(NULL, NULL, 'PayerRef')
#2 /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/FacadeHelper.php(117): QuickBooksOnline\API\Facades\FacadeHelper::getComplexListObject('getIPPReference...', 'PayerRef', NULL)
#3 /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/Bill.php(8): QuickBooksOnline\API\Facades\FacadeHelper::reflectArrayToObject('Bill', Array, true)
#4 /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/Bill.php(17): QuickBooksOnline\API\Facades\Bill::create(Array)
#5 /var/www/html/qb_match.php(214): QuickBooksOnline\API\Facades\Bill::update(Object(QuickBooksOnline\API\Data\IPPBill), Array)
#6 {main}
  thrown in /var/www/html/vendor/quickbooks/v3-php-sdk/src/Facades/FacadeHelper.php on line 293

似乎它被困在PayerRef结果中哪个是第一个值。

真正奇怪的是,在 API Explorer 上,当我们运行相同的查询时,它返回的数据集要小得多(它不包括“PayerRef”值),然后如果我们将这些数据发回 API Explorer(在更新部分)它工作正常。这是 API 资源管理器的结果

{
 "QueryResponse": {
  "Bill": [
   {
    "DueDate": "2020-10-22",
    "Balance": 89.59,
    "HomeBalance": 89.59,
    "domain": "QBO",
    "sparse": false,
    "Id": "282835",
    "SyncToken": "0",
    "MetaData": {
     "CreateTime": "2020-10-22T14:40:58-07:00",
     "LastUpdatedTime": "2020-10-22T14:40:58-07:00"
    },
    "DocNumber": "150577",
    "TxnDate": "2020-10-22",
    "CurrencyRef": {
     "value": "CAD",
     "name": "Canadian Dollar"
    },
    "ExchangeRate": 1,
    "Line": [
     {
      "Id": "1",
      "LineNum": 1,
      "Amount": 54.02,
      "LinkedTxn": [],
      "DetailType": "AccountBasedExpenseLineDetail",
      "AccountBasedExpenseLineDetail": {
       "AccountRef": {
        "value": "40",
        "name": "Purchases"
       },
       "BillableStatus": "NotBillable",
       "TaxCodeRef": {
        "value": "22"
       }
      }
     },
     {
      "Id": "2",
      "LineNum": 2,
      "Amount": 23.88,
      "LinkedTxn": [],
      "DetailType": "AccountBasedExpenseLineDetail",
      "AccountBasedExpenseLineDetail": {
       "AccountRef": {
        "value": "37",
        "name": "Shipping"
       },
       "BillableStatus": "NotBillable",
       "TaxCodeRef": {
        "value": "22"
       }
      }
     },
     {
      "Id": "3",
      "LineNum": 3,
      "Amount": 0,
      "LinkedTxn": [],
      "DetailType": "AccountBasedExpenseLineDetail",
      "AccountBasedExpenseLineDetail": {
       "AccountRef": {
        "value": "94",
        "name": "otherFees"
       },
       "BillableStatus": "NotBillable",
       "TaxCodeRef": {
        "value": "22"
       }
      }
     }
    ],
    "TxnTaxDetail": {
     "TotalTax": 11.69,
     "TaxLine": [
      {
       "Amount": 11.69,
       "DetailType": "TaxLineDetail",
       "TaxLineDetail": {
        "TaxRateRef": {
         "value": "37"
        },
        "PercentBased": true,
        "TaxPercent": 15,
        "NetAmountTaxable": 77.9
       }
      }
     ]
    },
    "VendorRef": {
     "value": "156",
     "name": "vendora"
    },
    "APAccountRef": {
     "value": "46",
     "name": "Accounts Payable (A/P)"
    },
    "TotalAmt": 89.59,
    "GlobalTaxCalculation": "TaxExcluded"
   }
  ],
  "startPosition": 1,
  "maxResults": 1,
  "totalCount": 1
 },
 "time": "2020-11-22T10:01:06.526-08:00"
}

那么,这个错误的原因是什么?是不是因为数据集是意外的,如果是这样,我们如何返回出现在 API Explorer 中的相同数据集?

谢谢

标签: phpquickbooks-online

解决方案


推荐阅读