Sample code for 30+ languages & platforms
Tcl

Xero Create New Accounts

Demonstrates how to create a new account in Xero.

Note: Requires Chilkat v9.5.0.64 or greater.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

# Note: Requires Chilkat v9.5.0.64 or greater.

# This requires the Chilkat API to have been previously unlocked.
# See Global Unlock Sample for sample code.

set rest [new_CkRest]

# Before sending REST API calls, the REST object needs to be
# initialized for OAuth1.
# See Xero 2-Legged OAuth1 Setup for sample code.

# Assuming the REST object's OAuth1 authenticator is setup, and the initial
# connection was made, we may now send REST HTTP requests..

# --------------------------------------------------------------
# To add certain accounts, we need a unique Code that hasn't yet been used.
# Chilkat provided an example to download and save the Accounts data.
# We can load this data into a hashtable to help us find an unused Code.
# See Hash Xero Account Codes to see how this file was created.
set sbAccounts [new_CkStringBuilder]

set success [CkStringBuilder_LoadFile $sbAccounts "qa_cache/xero_accounts_by_code.xml" "utf-8"]
if {!$success} then {
    puts "failed to load xero_accounts_by_code.xml"
    delete_CkRest $rest
    delete_CkStringBuilder $sbAccounts
    exit
}

set htAccounts [new_CkHashtable]

CkHashtable_AddFromXmlSb $htAccounts $sbAccounts

# --------------------------------------------------------------
# Build the request XML to create a Xero sales account.
# Find an unused Code...
set code 600
while {[CkHashtable_ContainsIntKey $htAccounts $code] == 1} {
    set code [expr $code + 1]
}

set xml [new_CkXml]

CkXml_put_Tag $xml "Account"
CkXml_NewChildInt2 $xml "Code" $code
CkXml_NewChild2 $xml "Name" "Sales - clearance lines"
CkXml_NewChild2 $xml "Type" "SALES"
CkXml_put_EmitCompact $xml 1

# Do not emit the XML declarator. Xero does not accept the XML if it
# has the initial line: <?xml version="1.0" encoding="utf-8"?>
CkXml_put_EmitXmlDecl $xml 0

CkRest_AddQueryParam $rest "xml" [CkXml_getXml $xml]

CkRest_put_VerboseLogging $rest 1
set responseXml [CkRest_fullRequestFormUrlEncoded $rest "PUT" "/api.xro/2.0/Accounts"]
if {[CkRest_get_LastMethodSuccess $rest] != 1} then {
    puts [CkRest_lastErrorText $rest]
    delete_CkRest $rest
    delete_CkStringBuilder $sbAccounts
    delete_CkHashtable $htAccounts
    delete_CkXml $xml
    exit
}

# A 200 response is expected for actual success.
if {[CkRest_get_ResponseStatusCode $rest] != 200} then {
    puts "$responseXml"
    delete_CkRest $rest
    delete_CkStringBuilder $sbAccounts
    delete_CkHashtable $htAccounts
    delete_CkXml $xml
    exit
}

# Examine the XML response
puts "$responseXml"

# A successful XML response is as follows:

# <Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
#   <Id>dac71f1b-7afb-49a7-8a57-719b91f2088e</Id>
#   <Status>OK</Status>
#   <ProviderName>ChilkatPrivate</ProviderName>
#   <DateTimeUTC>2016-11-10T23:53:43.487791Z</DateTimeUTC>
#   <Accounts>
#     <Account>
#       <AccountID>cb8c94cf-57d4-41ee-b866-4c27632fe838</AccountID>
#       <Code>601</Code>
#       <Name>Sales - clearance lines</Name>
#       <Status>ACTIVE</Status>
#       <Type>SALES</Type>
#       <TaxType>OUTPUT</TaxType>
#       <Class>REVENUE</Class>
#       <EnablePaymentsToAccount>false</EnablePaymentsToAccount>
#       <ShowInExpenseClaims>false</ShowInExpenseClaims>
#       <ReportingCode>REV</ReportingCode>
#       <ReportingCodeName>Revenue</ReportingCodeName>
#       <UpdatedDateUTC>2016-11-10T23:53:43.94</UpdatedDateUTC>
#     </Account>
#   </Accounts>
# </Response>

# To access the information:
CkXml_LoadXml $xml $responseXml

puts "AccountID: [CkXml_getChildContent $xml Accounts|Account|AccountID]"
puts "TaxType: [CkXml_getChildContent $xml Accounts|Account|TaxType]"
# ..

delete_CkRest $rest
delete_CkStringBuilder $sbAccounts
delete_CkHashtable $htAccounts
delete_CkXml $xml