Tcl
Tcl
Quickbooks Update an Invoice
See more QuickBooks Examples
Demonstrates how to update an invoice using the Quickbooks REST API.Chilkat Tcl Downloads
load ./chilkat.dll
set success 0
# This example requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.
# First get our previously obtained OAuth2 access token.
set jsonToken [new_CkJsonObject]
set success [CkJsonObject_LoadFile $jsonToken "qa_data/tokens/qb-access-token.json"]
set rest [new_CkRest]
# Connect to the REST server.
set bTls 1
set port 443
set bAutoReconnect 1
set success [CkRest_Connect $rest "sandbox-quickbooks.api.intuit.com" $port $bTls $bAutoReconnect]
set sbAuth [new_CkStringBuilder]
CkStringBuilder_Append $sbAuth "Bearer "
CkStringBuilder_Append $sbAuth [CkJsonObject_stringOf $jsonToken "access_token"]
CkRest_put_Authorization $rest [CkStringBuilder_getAsString $sbAuth]
# --------------------------------------------------------------------------
# Note: The above code to setup the initial REST connection
# can be done once. After connecting, any number of REST calls can be made.
# If the connection is lost, the next REST method call will automatically
# reconnect if needed.
# --------------------------------------------------------------------------
# Create the following JSON:
# {
# "DocNumber": "1070",
# "SyncToken": "0",
# "domain": "QBO",
# "Balance": 150.0,
# "BillAddr": {
# "City": "Bayshore",
# "Line1": "4581 Finch St.",
# "PostalCode": "94326",
# "Lat": "INVALID",
# "Long": "INVALID",
# "CountrySubDivisionCode": "CA",
# "Id": "2"
# },
# "TxnDate": "2015-07-24",
# "TotalAmt": 150.0,
# "CustomerRef": {
# "name": "Amy's Bird Sanctuary",
# "value": "1"
# },
# "CustomerMemo": {
# "value": "Added customer memo."
# },
# "ShipAddr": {
# "City": "Bayshore",
# "Line1": "4581 Finch St.",
# "PostalCode": "94326",
# "Lat": "INVALID",
# "Long": "INVALID",
# "CountrySubDivisionCode": "CA",
# "Id": "109"
# },
# "LinkedTxn": [
# ],
# "DueDate": "2015-08-23",
# "PrintStatus": "NeedToPrint",
# "EmailStatus": "NotSet",
# "sparse": false,
# "Line": [
# {
# "LineNum": 1,
# "Amount": 150.0,
# "SalesItemLineDetail": {
# "TaxCodeRef": {
# "value": "NON"
# },
# "ItemRef": {
# "name": "Services",
# "value": "1"
# }
# },
# "Id": "1",
# "DetailType": "SalesItemLineDetail"
# },
# {
# "DetailType": "SubTotalLineDetail",
# "Amount": 150.0,
# "SubTotalLineDetail": {}
# }
# ],
# "ApplyTaxAfterDiscount": false,
# "CustomField": [
# {
# "DefinitionId": "1",
# "Type": "StringType",
# "Name": "Crew #"
# }
# ],
# "Id": "239",
# "TxnTaxDetail": {
# "TotalTax": 0
# },
# "MetaData": {
# "CreateTime": "2015-07-24T10:35:08-07:00",
# "LastUpdatedTime": "2015-07-24T10:35:08-07:00"
# }
# }
#
# Use the this online tool to generate the code from sample JSON:
# Generate Code to Create JSON
set jsonReq [new_CkJsonObject]
CkJsonObject_UpdateString $jsonReq "DocNumber" "1070"
CkJsonObject_UpdateString $jsonReq "SyncToken" "0"
CkJsonObject_UpdateString $jsonReq "domain" "QBO"
CkJsonObject_UpdateNumber $jsonReq "Balance" "150.0"
CkJsonObject_UpdateString $jsonReq "BillAddr.City" "Bayshore"
CkJsonObject_UpdateString $jsonReq "BillAddr.Line1" "4581 Finch St."
CkJsonObject_UpdateString $jsonReq "BillAddr.PostalCode" "94326"
CkJsonObject_UpdateString $jsonReq "BillAddr.Lat" "INVALID"
CkJsonObject_UpdateString $jsonReq "BillAddr.Long" "INVALID"
CkJsonObject_UpdateString $jsonReq "BillAddr.CountrySubDivisionCode" "CA"
CkJsonObject_UpdateString $jsonReq "BillAddr.Id" "2"
CkJsonObject_UpdateString $jsonReq "TxnDate" "2015-07-24"
CkJsonObject_UpdateNumber $jsonReq "TotalAmt" "150.0"
CkJsonObject_UpdateString $jsonReq "CustomerRef.name" "Amy's Bird Sanctuary"
CkJsonObject_UpdateString $jsonReq "CustomerRef.value" "1"
CkJsonObject_UpdateString $jsonReq "CustomerMemo.value" "Added customer memo."
CkJsonObject_UpdateString $jsonReq "ShipAddr.City" "Bayshore"
CkJsonObject_UpdateString $jsonReq "ShipAddr.Line1" "4581 Finch St."
CkJsonObject_UpdateString $jsonReq "ShipAddr.PostalCode" "94326"
CkJsonObject_UpdateString $jsonReq "ShipAddr.Lat" "INVALID"
CkJsonObject_UpdateString $jsonReq "ShipAddr.Long" "INVALID"
CkJsonObject_UpdateString $jsonReq "ShipAddr.CountrySubDivisionCode" "CA"
CkJsonObject_UpdateString $jsonReq "ShipAddr.Id" "109"
CkJsonObject_UpdateNewArray $jsonReq "LinkedTxn"
CkJsonObject_UpdateString $jsonReq "DueDate" "2015-08-23"
CkJsonObject_UpdateString $jsonReq "PrintStatus" "NeedToPrint"
CkJsonObject_UpdateString $jsonReq "EmailStatus" "NotSet"
CkJsonObject_UpdateBool $jsonReq "sparse" 0
CkJsonObject_UpdateInt $jsonReq "Line[0].LineNum" 1
CkJsonObject_UpdateNumber $jsonReq "Line[0].Amount" "150.0"
CkJsonObject_UpdateString $jsonReq "Line[0].SalesItemLineDetail.TaxCodeRef.value" "NON"
CkJsonObject_UpdateString $jsonReq "Line[0].SalesItemLineDetail.ItemRef.name" "Services"
CkJsonObject_UpdateString $jsonReq "Line[0].SalesItemLineDetail.ItemRef.value" "1"
CkJsonObject_UpdateString $jsonReq "Line[0].Id" "1"
CkJsonObject_UpdateString $jsonReq "Line[0].DetailType" "SalesItemLineDetail"
CkJsonObject_UpdateString $jsonReq "Line[1].DetailType" "SubTotalLineDetail"
CkJsonObject_UpdateNumber $jsonReq "Line[1].Amount" "150.0"
CkJsonObject_UpdateNewObject $jsonReq "Line[1].SubTotalLineDetail"
CkJsonObject_UpdateBool $jsonReq "ApplyTaxAfterDiscount" 0
CkJsonObject_UpdateString $jsonReq "CustomField[0].DefinitionId" "1"
CkJsonObject_UpdateString $jsonReq "CustomField[0].Type" "StringType"
CkJsonObject_UpdateString $jsonReq "CustomField[0].Name" "Crew #"
CkJsonObject_UpdateString $jsonReq "Id" "239"
CkJsonObject_UpdateInt $jsonReq "TxnTaxDetail.TotalTax" 0
CkJsonObject_UpdateString $jsonReq "MetaData.CreateTime" "2015-07-24T10:35:08-07:00"
CkJsonObject_UpdateString $jsonReq "MetaData.LastUpdatedTime" "2015-07-24T10:35:08-07:00"
set sbRequestBody [new_CkStringBuilder]
CkJsonObject_EmitSb $jsonReq $sbRequestBody
CkRest_AddHeader $rest "Content-Type" "application/json"
CkRest_AddHeader $rest "Accept" "application/json"
CkRest_put_AllowHeaderFolding $rest 0
set sbResponseBody [new_CkStringBuilder]
set success [CkRest_FullRequestSb $rest "POST" "/v3/company/<realmID>/invoice" $sbRequestBody $sbResponseBody]
if {$success != 1} then {
puts [CkRest_lastErrorText $rest]
delete_CkJsonObject $jsonToken
delete_CkRest $rest
delete_CkStringBuilder $sbAuth
delete_CkJsonObject $jsonReq
delete_CkStringBuilder $sbRequestBody
delete_CkStringBuilder $sbResponseBody
exit
}
set respStatusCode [CkRest_get_ResponseStatusCode $rest]
# Success is indicated by a 200 response status code.
puts "response status code = $respStatusCode"
set jsonResponse [new_CkJsonObject]
CkJsonObject_LoadSb $jsonResponse $sbResponseBody
CkJsonObject_put_EmitCompact $jsonResponse 0
puts [CkJsonObject_emit $jsonResponse]
if {[CkRest_get_ResponseStatusCode $rest] != 200} then {
puts "Failed."
delete_CkJsonObject $jsonToken
delete_CkRest $rest
delete_CkStringBuilder $sbAuth
delete_CkJsonObject $jsonReq
delete_CkStringBuilder $sbRequestBody
delete_CkStringBuilder $sbResponseBody
delete_CkJsonObject $jsonResponse
exit
}
# Sample output...
# (See the parsing code below..)
#
# Use the this online tool to generate parsing code from sample JSON:
# Generate Parsing Code from JSON
# {
# "Invoice": {
# "TxnDate": "2015-07-24",
# "domain": "QBO",
# "PrintStatus": "NeedToPrint",
# "TotalAmt": 150.0,
# "Line": [
# {
# "LineNum": 1,
# "Amount": 150.0,
# "SalesItemLineDetail": {
# "TaxCodeRef": {
# "value": "NON"
# },
# "ItemRef": {
# "name": "Services",
# "value": "1"
# }
# },
# "Id": "1",
# "DetailType": "SalesItemLineDetail"
# },
# {
# "DetailType": "SubTotalLineDetail",
# "Amount": 150.0,
# "SubTotalLineDetail": {}
# }
# ],
# "DueDate": "2015-08-23",
# "ApplyTaxAfterDiscount": false,
# "DocNumber": "1070",
# "sparse": false,
# "CustomerMemo": {
# "value": "Added customer memo."
# },
# "Deposit": 0,
# "Balance": 150.0,
# "CustomerRef": {
# "name": "Amy's Bird Sanctuary",
# "value": "1"
# },
# "TxnTaxDetail": {
# "TotalTax": 0
# },
# "SyncToken": "1",
# "LinkedTxn": [
# ],
# "ShipAddr": {
# "CountrySubDivisionCode": "CA",
# "City": "Bayshore",
# "PostalCode": "94326",
# "Id": "118",
# "Line1": "4581 Finch St."
# },
# "EmailStatus": "NotSet",
# "BillAddr": {
# "CountrySubDivisionCode": "CA",
# "City": "Bayshore",
# "PostalCode": "94326",
# "Id": "117",
# "Line1": "4581 Finch St."
# },
# "MetaData": {
# "CreateTime": "2015-07-24T10:35:08-07:00",
# "LastUpdatedTime": "2015-07-24T10:53:39-07:00"
# },
# "CustomField": [
# {
# "DefinitionId": "1",
# "Type": "StringType",
# "Name": "Crew #"
# }
# ],
# "Id": "239"
# },
# "time": "2015-07-24T10:53:39.287-07:00"
# }
#
set InvoiceTxnDate [CkJsonObject_stringOf $jsonResponse "Invoice.TxnDate"]
set InvoiceDomain [CkJsonObject_stringOf $jsonResponse "Invoice.domain"]
set InvoicePrintStatus [CkJsonObject_stringOf $jsonResponse "Invoice.PrintStatus"]
set InvoiceTotalAmt [CkJsonObject_stringOf $jsonResponse "Invoice.TotalAmt"]
set InvoiceDueDate [CkJsonObject_stringOf $jsonResponse "Invoice.DueDate"]
set InvoiceApplyTaxAfterDiscount [CkJsonObject_BoolOf $jsonResponse "Invoice.ApplyTaxAfterDiscount"]
set InvoiceDocNumber [CkJsonObject_stringOf $jsonResponse "Invoice.DocNumber"]
set InvoiceSparse [CkJsonObject_BoolOf $jsonResponse "Invoice.sparse"]
set InvoiceCustomerMemoValue [CkJsonObject_stringOf $jsonResponse "Invoice.CustomerMemo.value"]
set InvoiceDeposit [CkJsonObject_IntOf $jsonResponse "Invoice.Deposit"]
set InvoiceBalance [CkJsonObject_stringOf $jsonResponse "Invoice.Balance"]
set InvoiceCustomerRefName [CkJsonObject_stringOf $jsonResponse "Invoice.CustomerRef.name"]
set InvoiceCustomerRefValue [CkJsonObject_stringOf $jsonResponse "Invoice.CustomerRef.value"]
set InvoiceTxnTaxDetailTotalTax [CkJsonObject_IntOf $jsonResponse "Invoice.TxnTaxDetail.TotalTax"]
set InvoiceSyncToken [CkJsonObject_stringOf $jsonResponse "Invoice.SyncToken"]
set InvoiceShipAddrCountrySubDivisionCode [CkJsonObject_stringOf $jsonResponse "Invoice.ShipAddr.CountrySubDivisionCode"]
set InvoiceShipAddrCity [CkJsonObject_stringOf $jsonResponse "Invoice.ShipAddr.City"]
set InvoiceShipAddrPostalCode [CkJsonObject_stringOf $jsonResponse "Invoice.ShipAddr.PostalCode"]
set InvoiceShipAddrId [CkJsonObject_stringOf $jsonResponse "Invoice.ShipAddr.Id"]
set InvoiceShipAddrLine1 [CkJsonObject_stringOf $jsonResponse "Invoice.ShipAddr.Line1"]
set InvoiceEmailStatus [CkJsonObject_stringOf $jsonResponse "Invoice.EmailStatus"]
set InvoiceBillAddrCountrySubDivisionCode [CkJsonObject_stringOf $jsonResponse "Invoice.BillAddr.CountrySubDivisionCode"]
set InvoiceBillAddrCity [CkJsonObject_stringOf $jsonResponse "Invoice.BillAddr.City"]
set InvoiceBillAddrPostalCode [CkJsonObject_stringOf $jsonResponse "Invoice.BillAddr.PostalCode"]
set InvoiceBillAddrId [CkJsonObject_stringOf $jsonResponse "Invoice.BillAddr.Id"]
set InvoiceBillAddrLine1 [CkJsonObject_stringOf $jsonResponse "Invoice.BillAddr.Line1"]
set InvoiceMetaDataCreateTime [CkJsonObject_stringOf $jsonResponse "Invoice.MetaData.CreateTime"]
set InvoiceMetaDataLastUpdatedTime [CkJsonObject_stringOf $jsonResponse "Invoice.MetaData.LastUpdatedTime"]
set InvoiceId [CkJsonObject_stringOf $jsonResponse "Invoice.Id"]
set time [CkJsonObject_stringOf $jsonResponse "time"]
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonResponse "Invoice.Line"]
while {$i < $count_i} {
CkJsonObject_put_I $jsonResponse $i
set LineNum [CkJsonObject_IntOf $jsonResponse "Invoice.Line[i].LineNum"]
set Amount [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].Amount"]
set SalesItemLineDetailTaxCodeRefValue [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].SalesItemLineDetail.TaxCodeRef.value"]
set SalesItemLineDetailItemRefName [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].SalesItemLineDetail.ItemRef.name"]
set SalesItemLineDetailItemRefValue [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].SalesItemLineDetail.ItemRef.value"]
set Id [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].Id"]
set DetailType [CkJsonObject_stringOf $jsonResponse "Invoice.Line[i].DetailType"]
set i [expr $i + 1]
}
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonResponse "Invoice.LinkedTxn"]
while {$i < $count_i} {
CkJsonObject_put_I $jsonResponse $i
set i [expr $i + 1]
}
set i 0
set count_i [CkJsonObject_SizeOfArray $jsonResponse "Invoice.CustomField"]
while {$i < $count_i} {
CkJsonObject_put_I $jsonResponse $i
set DefinitionId [CkJsonObject_stringOf $jsonResponse "Invoice.CustomField[i].DefinitionId"]
set invType [CkJsonObject_stringOf $jsonResponse "Invoice.CustomField[i].Type"]
set Name [CkJsonObject_stringOf $jsonResponse "Invoice.CustomField[i].Name"]
set i [expr $i + 1]
}
delete_CkJsonObject $jsonToken
delete_CkRest $rest
delete_CkStringBuilder $sbAuth
delete_CkJsonObject $jsonReq
delete_CkStringBuilder $sbRequestBody
delete_CkStringBuilder $sbResponseBody
delete_CkJsonObject $jsonResponse