xero_gateway 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15bce269e603d39203dbafb5858843c8e8fe8b3e
4
- data.tar.gz: a996fa84e4ca2471b3efc06eb68c080fbe4ed8cb
3
+ metadata.gz: '0195a3504b16daf5f4e5ef6c9644fcb7fd8ea146'
4
+ data.tar.gz: 770b6ae03cf67b5f9575b83ad446e9b049c619ce
5
5
  SHA512:
6
- metadata.gz: 57f8ec61dbe74dcd7fb6fbdb4a2f65087079e2f4808bc8a08696e445d6f91b2b9ec4661ca557029041b1ffe35a11e3b2f49f42faf458c9b42c4bacad77b02cca
7
- data.tar.gz: 4a203e5a9a76a0146c758249126bc595946422960d4cb37a056fb9607e0e5ad1493d336f5b24ad02a87076875a41b5dfd2ed09c3cc51f5d14b27caccb9158045
6
+ metadata.gz: e236f63458fa76c432032efd36ae3449c2d2aec38c43d0912d0015eb0536fdca81cd2ac58ca8f526d3c68032bff7f7f4348d1ac969abcf4095a52b3556ee5ce9
7
+ data.tar.gz: 914c8e0ed970d288f04ab4bcd2f7bf9ff538034882c62647926ee78f898fdcc53e7c001f1873e74230a7abc0c7f3923295361d5ae967bf7aa3884a8eb91c33a3
@@ -19,12 +19,15 @@ require File.join(File.dirname(__FILE__), 'xero_gateway', 'money')
19
19
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'line_item_calculations')
20
20
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'response')
21
21
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'base_record')
22
+ require File.join(File.dirname(__FILE__), 'xero_gateway', 'branding_theme')
22
23
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'account')
23
24
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'accounts_list')
24
25
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'tracking_category')
26
+ require File.join(File.dirname(__FILE__), 'xero_gateway', 'address')
27
+ require File.join(File.dirname(__FILE__), 'xero_gateway', 'phone')
28
+ require File.join(File.dirname(__FILE__), 'xero_gateway', 'contact_person')
25
29
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'contact')
26
30
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'contact_group')
27
- require File.join(File.dirname(__FILE__), 'xero_gateway', 'contact_person')
28
31
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'line_item')
29
32
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'payment')
30
33
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'payroll_calendar')
@@ -34,9 +37,7 @@ require File.join(File.dirname(__FILE__), 'xero_gateway', 'bank_transaction')
34
37
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'credit_note')
35
38
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'journal_line')
36
39
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'manual_journal')
37
- require File.join(File.dirname(__FILE__), 'xero_gateway', 'address')
38
40
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'report')
39
- require File.join(File.dirname(__FILE__), 'xero_gateway', 'phone')
40
41
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'organisation')
41
42
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'tax_rate')
42
43
  require File.join(File.dirname(__FILE__), 'xero_gateway', 'currency')
@@ -157,16 +157,16 @@ module XeroGateway
157
157
  when "UpdatedDateUTC" then bank_transaction.updated_at = parse_date_time(element.text)
158
158
  when "Type" then bank_transaction.type = element.text
159
159
  when "CurrencyCode" then bank_transaction.currency_code = element.text
160
- when "CurrencyRate" then bank_transaction.currency_rate = BigDecimal.new(element.text)
160
+ when "CurrencyRate" then bank_transaction.currency_rate = BigDecimal(element.text)
161
161
  when "Contact" then bank_transaction.contact = Contact.from_xml(element)
162
162
  when "BankAccount" then bank_transaction.bank_account = Account.from_xml(element)
163
163
  when "Date" then bank_transaction.date = parse_date(element.text)
164
164
  when "Status" then bank_transaction.status = element.text
165
165
  when "Reference" then bank_transaction.reference = element.text
166
166
  when "LineItems" then element.children.each {|line_item| bank_transaction.line_items_downloaded = true; bank_transaction.line_items << LineItem.from_xml(line_item) }
167
- when "Total" then bank_transaction.total = BigDecimal.new(element.text)
168
- when "SubTotal" then bank_transaction.sub_total = BigDecimal.new(element.text)
169
- when "TotalTax" then bank_transaction.total_tax = BigDecimal.new(element.text)
167
+ when "Total" then bank_transaction.total = BigDecimal(element.text)
168
+ when "SubTotal" then bank_transaction.sub_total = BigDecimal(element.text)
169
+ when "TotalTax" then bank_transaction.total_tax = BigDecimal(element.text)
170
170
  when "IsReconciled" then bank_transaction.is_reconciled = (element.text.strip.downcase == "true")
171
171
  when "Url" then bank_transaction.url = element.text
172
172
  end
@@ -5,6 +5,10 @@ module XeroGateway
5
5
 
6
6
  class_attribute :element_name
7
7
  class_attribute :attribute_definitions
8
+ class_attribute :attribute_definitions_readonly
9
+
10
+ # The source XML record that initialized this instance.
11
+ attr_reader :source_xml
8
12
 
9
13
  class << self
10
14
  def attributes(hash)
@@ -27,8 +31,15 @@ module XeroGateway
27
31
  end
28
32
  end
29
33
 
30
- def from_xml(base_element)
31
- new.from_xml(base_element)
34
+ # Set list of attributes that should never be included in update/create responses.
35
+ def readonly_attributes(*attrs)
36
+ self.attribute_definitions_readonly ||= []
37
+ self.attribute_definitions_readonly += attrs.flatten
38
+ end
39
+
40
+ def from_xml(base_element, gateway = nil)
41
+ args = gateway ? [{ gateway: gateway }] : []
42
+ new(*args).from_xml(base_element)
32
43
  end
33
44
 
34
45
  def xml_element
@@ -46,14 +57,14 @@ module XeroGateway
46
57
  to_xml == other.to_xml
47
58
  end
48
59
 
49
- def to_xml
50
- builder = Builder::XmlMarkup.new
60
+ def to_xml(builder = Builder::XmlMarkup.new)
51
61
  builder.__send__(self.class.xml_element) do
52
62
  to_xml_attributes(builder)
53
63
  end
54
64
  end
55
65
 
56
66
  def from_xml(base_element)
67
+ @source_xml = base_element
57
68
  from_xml_attributes(base_element)
58
69
  self
59
70
  end
@@ -79,11 +90,13 @@ module XeroGateway
79
90
  when :boolean then element.text == "true"
80
91
  when :float then element.text.to_f
81
92
  when :integer then element.text.to_i
82
- when :currency then BigDecimal.new(element.text)
83
- when :date then Date.strptime(element.text, "%Y-%m-%d")
84
- when :datetime then Date.strptime(element.text, "%Y-%m-%dT%H:%M:%S")
85
- when :datetime_utc then Date.strptime(element.text + "Z", "%Y-%m-%dT%H:%M:%S%Z")
93
+ when :currency then BigDecimal(element.text)
94
+ when :date then Dates::Helpers.parse_date(element.text)
95
+ when :datetime then Dates::Helpers.parse_date_time(element.text)
96
+ when :datetime_utc then Dates::Helpers.parse_date_time_utc(element.text)
86
97
  when Array then array_from_xml(element, attr_definition)
98
+ when Class
99
+ attr_definition.from_xml(element) if attr_definition.respond_to?(:from_xml)
87
100
  else element.text
88
101
  end if element.text.present? || element.children.present?
89
102
 
@@ -97,6 +110,8 @@ module XeroGateway
97
110
 
98
111
  def to_xml_attributes(builder = Builder::XmlMarkup.new, path = nil, attr_definitions = self.class.attribute_definitions)
99
112
  attr_definitions.each do |attr, value|
113
+ next if self.class.attribute_definitions_readonly && self.class.attribute_definitions_readonly.include?(attr)
114
+
100
115
  case value
101
116
  when Hash
102
117
  builder.__send__(attr) do
@@ -104,14 +119,19 @@ module XeroGateway
104
119
  end
105
120
  when Array
106
121
  raise UnsupportedAttributeType.new("#{value} instances don't respond to #to_xml") unless value.first.method_defined?(:to_xml)
107
- value = send("#{path}#{attr}".underscore) || []
122
+ options = value.length > 1 ? value.last : {}
123
+
124
+ value = send("#{path}#{attr}".underscore)
125
+ value ||= [] unless options[:omit_if_empty]
126
+
108
127
  builder.__send__(attr) do |array_wrapper|
109
128
  value.map do |k|
110
129
  k.to_xml(array_wrapper)
111
130
  end
112
- end
131
+ end unless value.nil?
113
132
  else
114
- builder.__send__(attr, send("#{path}#{attr}".underscore))
133
+ value = send("#{path}#{attr}".underscore)
134
+ builder.__send__(attr, value) unless value.nil?
115
135
  end
116
136
  end
117
137
  end
@@ -0,0 +1,14 @@
1
+ module XeroGateway
2
+ class BrandingTheme < BaseRecord
3
+ attributes({
4
+ "BrandingThemeID" => :string,
5
+ "Name" => :string,
6
+ "SortOrder" => :integer,
7
+ "CreatedDateUTC" => :string
8
+ })
9
+
10
+ def default?
11
+ sort_order == 0
12
+ end
13
+ end
14
+ end
@@ -1,7 +1,5 @@
1
1
  module XeroGateway
2
- class Contact
3
- include Dates
4
-
2
+ class Contact < BaseRecord
5
3
  GUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ unless defined?(GUID_REGEX)
6
4
 
7
5
  CONTACT_STATUS = {
@@ -9,29 +7,50 @@ module XeroGateway
9
7
  'DELETED' => 'Deleted'
10
8
  } unless defined?(CONTACT_STATUS)
11
9
 
12
- # Xero::Gateway associated with this contact.
13
- attr_accessor :gateway
14
-
15
- # Any errors that occurred when the #valid? method called.
16
- attr_reader :errors
17
-
18
- attr_accessor :contact_id, :contact_number, :account_number, :status, :name, :first_name, :last_name, :email, :addresses, :phones, :updated_at,
19
- :bank_account_details, :tax_number, :accounts_receivable_tax_type, :accounts_payable_tax_type, :is_customer, :is_supplier,
20
- :default_currency, :contact_groups, :contact_persons
21
-
10
+ attr_accessor :gateway, :errors
11
+
12
+ attributes({
13
+ "ContactID" => :string,
14
+ "ContactNumber" => :string,
15
+ "AccountNumber" => :string,
16
+ "ContactStatus" => :string,
17
+ "Name" => :string,
18
+ "FirstName" => :string,
19
+ "LastName" => :string,
20
+ "EmailAddress" => :string,
21
+ "Addresses" => [Address, { :omit_if_empty => true }],
22
+ "Phones" => [Phone],
23
+ "BankAccountDetails" => :string,
24
+ "TaxNumber" => :string,
25
+ "AccountsReceivableTaxType" => :string,
26
+ "AccountsPayableTaxType" => :string,
27
+ "ContactGroups" => :string,
28
+ "IsCustomer" => :boolean,
29
+ "IsSupplier" => :boolean,
30
+ "DefaultCurrency" => :string,
31
+ "UpdatedDateUTC" => :datetime_utc,
32
+ "ContactPersons" => [ContactPerson],
33
+ "BrandingTheme" => BrandingTheme
34
+ })
35
+
36
+ readonly_attributes "IsCustomer", "IsSupplier", "BrandingTheme"
37
+
38
+ { :updated_at => :updated_date_utc,
39
+ :status => :contact_status,
40
+ :email => :email_address }.each do |alt, orig|
41
+ alias_method alt, orig
42
+ alias_method "#{alt}=", "#{orig}="
43
+ end
22
44
 
23
45
  def initialize(params = {})
24
- @errors ||= []
25
-
26
- params = {}.merge(params)
27
- params.each do |k,v|
28
- self.send("#{k}=", v)
29
- end
46
+ super
30
47
 
48
+ @errors ||= []
31
49
  @phones ||= []
32
50
  @addresses ||= nil
33
51
  end
34
52
 
53
+
35
54
  def address=(address)
36
55
  self.addresses = [address]
37
56
  end
@@ -84,6 +103,7 @@ module XeroGateway
84
103
  self.contact_persons << ContactPerson.new(contact_person_params)
85
104
  end
86
105
 
106
+
87
107
  # Validate the Contact record according to what will be valid by the gateway.
88
108
  #
89
109
  # Usage:
@@ -142,73 +162,5 @@ module XeroGateway
142
162
  gateway.update_contact(self)
143
163
  end
144
164
 
145
- def to_xml(b = Builder::XmlMarkup.new)
146
- b.Contact {
147
- b.ContactID self.contact_id if self.contact_id
148
- b.ContactNumber self.contact_number if self.contact_number
149
- b.AccountNumber self.account_number if self.account_number
150
- b.Name self.name if self.name
151
- b.EmailAddress self.email if self.email
152
- b.FirstName self.first_name if self.first_name
153
- b.LastName self.last_name if self.last_name
154
- b.BankAccountDetails self.bank_account_details if self.bank_account_details
155
- b.TaxNumber self.tax_number if self.tax_number
156
- b.AccountsReceivableTaxType self.accounts_receivable_tax_type if self.accounts_receivable_tax_type
157
- b.AccountsPayableTaxType self.accounts_payable_tax_type if self.accounts_payable_tax_type
158
- b.ContactGroups if self.contact_groups
159
- b.IsCustomer true if self.is_customer
160
- b.IsSupplier true if self.is_supplier
161
- b.DefaultCurrency if self.default_currency
162
- b.Addresses {
163
- addresses.each { |address| address.to_xml(b) }
164
- } unless addresses.nil?
165
- b.Phones {
166
- phones.each { |phone| phone.to_xml(b) }
167
- } if self.phones.any?
168
- b.ContactPersons {
169
- contact_persons.each { |contact_person| contact_person.to_xml(b) }
170
- } unless contact_persons.nil?
171
- }
172
- end
173
-
174
- # Take a Contact element and convert it into an Contact object
175
- def self.from_xml(contact_element, gateway = nil)
176
- contact = Contact.new(:gateway => gateway)
177
- contact_element.children.each do |element|
178
- case(element.name)
179
- when "ContactID" then contact.contact_id = element.text
180
- when "ContactNumber" then contact.contact_number = element.text
181
- when "AccountNumber" then contact.account_number = element.text
182
- when "ContactStatus" then contact.status = element.text
183
- when "Name" then contact.name = element.text
184
- when "FirstName" then contact.first_name = element.text
185
- when "LastName" then contact.last_name = element.text
186
- when "EmailAddress" then contact.email = element.text
187
- when "Addresses" then element.children.each { |address_element| contact.addresses ||= []; contact.addresses << Address.from_xml(address_element) }
188
- when "Phones" then element.children.each { |phone_element| contact.phones << Phone.from_xml(phone_element) }
189
- when "BankAccountDetails" then contact.bank_account_details = element.text
190
- when "TaxNumber" then contact.tax_number = element.text
191
- when "AccountsReceivableTaxType" then contact.accounts_receivable_tax_type = element.text
192
- when "AccountsPayableTaxType" then contact.accounts_payable_tax_type = element.text
193
- when "ContactGroups" then contact.contact_groups = element.text
194
- when "IsCustomer" then contact.is_customer = (element.text == "true")
195
- when "IsSupplier" then contact.is_supplier = (element.text == "true")
196
- when "DefaultCurrency" then contact.default_currency = element.text
197
- when "UpdatedDateUTC" then contact.updated_at = parse_date_time(element.text)
198
- when "ContactPersons" then element.children.each { |contact_person_element| contact.contact_persons ||= []; contact.contact_persons << ContactPerson.from_xml(contact_person_element) }
199
- end
200
- end
201
- contact
202
- end
203
-
204
- def ==(other)
205
- [ :contact_id, :contact_number, :account_number, :status, :name, :first_name, :last_name, :email, :addresses, :phones, :updated_at,
206
- :bank_account_details, :tax_number, :accounts_receivable_tax_type, :accounts_payable_tax_type, :is_customer, :is_supplier,
207
- :default_currency, :contact_groups ].each do |field|
208
- return false if send(field) != other.send(field)
209
- end
210
- return true
211
- end
212
-
213
165
  end
214
166
  end
@@ -197,13 +197,13 @@ module XeroGateway
197
197
  when "Reference" then credit_note.reference = element.text
198
198
  when "LineAmountTypes" then credit_note.line_amount_types = element.text
199
199
  when "LineItems" then element.children.each {|line_item| credit_note.line_items_downloaded = true; credit_note.line_items << LineItem.from_xml(line_item) }
200
- when "SubTotal" then credit_note.sub_total = BigDecimal.new(element.text)
201
- when "TotalTax" then credit_note.total_tax = BigDecimal.new(element.text)
202
- when "Total" then credit_note.total = BigDecimal.new(element.text)
200
+ when "SubTotal" then credit_note.sub_total = BigDecimal(element.text)
201
+ when "TotalTax" then credit_note.total_tax = BigDecimal(element.text)
202
+ when "Total" then credit_note.total = BigDecimal(element.text)
203
203
  when "Payments" then element.children.each { | payment | credit_note.payments << Payment.from_xml(payment) }
204
- when "AmountDue" then credit_note.amount_due = BigDecimal.new(element.text)
205
- when "AmountPaid" then credit_note.amount_paid = BigDecimal.new(element.text)
206
- when "AmountCredited" then credit_note.amount_credited = BigDecimal.new(element.text)
204
+ when "AmountDue" then credit_note.amount_due = BigDecimal(element.text)
205
+ when "AmountPaid" then credit_note.amount_paid = BigDecimal(element.text)
206
+ when "AmountCredited" then credit_note.amount_credited = BigDecimal(element.text)
207
207
  end
208
208
  end
209
209
  credit_note
@@ -25,5 +25,9 @@ module XeroGateway
25
25
  Time.utc(time[0..3].to_i, time[5..6].to_i, time[8..9].to_i, time[11..12].to_i, time[14..15].to_i, time[17..18].to_i)
26
26
  end
27
27
  end
28
+
29
+ module Helpers
30
+ extend ClassMethods
31
+ end
28
32
  end
29
33
  end
@@ -165,14 +165,16 @@ module XeroGateway
165
165
 
166
166
  request_params = {}
167
167
 
168
- request_params[:InvoiceID] = options[:invoice_id] if options[:invoice_id]
169
- request_params[:InvoiceNumber] = options[:invoice_number] if options[:invoice_number]
170
- request_params[:order] = options[:order] if options[:order]
171
- request_params[:ModifiedAfter] = options[:modified_since] if options[:modified_since]
172
- request_params[:ContactIDs] = Array(options[:contact_ids]).join(",") if options[:contact_ids]
173
- request_params[:page] = options[:page] if options[:page]
168
+ request_params[:InvoiceID] = options[:invoice_id] if options[:invoice_id]
169
+ request_params[:InvoiceNumber] = options[:invoice_number] if options[:invoice_number]
170
+ request_params[:order] = options[:order] if options[:order]
171
+ request_params[:ModifiedAfter] = options[:modified_since] if options[:modified_since]
172
+ request_params[:IDs] = Array(options[:invoice_ids]).join(",") if options[:invoice_ids]
173
+ request_params[:InvoiceNumbers] = Array(options[:invoice_numbers]).join(",") if options[:invoice_numbers]
174
+ request_params[:ContactIDs] = Array(options[:contact_ids]).join(",") if options[:contact_ids]
175
+ request_params[:page] = options[:page] if options[:page]
174
176
 
175
- request_params[:where] = options[:where] if options[:where]
177
+ request_params[:where] = options[:where] if options[:where]
176
178
 
177
179
  response_xml = http_get(@client, "#{@xero_url}/Invoices", request_params)
178
180
 
@@ -209,7 +209,7 @@ module XeroGateway
209
209
  when "InvoiceNumber" then invoice.invoice_number = element.text
210
210
  when "Type" then invoice.invoice_type = element.text
211
211
  when "CurrencyCode" then invoice.currency_code = element.text
212
- when "CurrencyRate" then invoice.currency_rate = BigDecimal.new(element.text)
212
+ when "CurrencyRate" then invoice.currency_rate = BigDecimal(element.text)
213
213
  when "Contact" then invoice.contact = Contact.from_xml(element)
214
214
  when "Date" then invoice.date = parse_date(element.text)
215
215
  when "DueDate" then invoice.due_date = parse_date(element.text)
@@ -220,13 +220,13 @@ module XeroGateway
220
220
  when "BrandingThemeID" then invoice.branding_theme_id = element.text
221
221
  when "LineAmountTypes" then invoice.line_amount_types = element.text
222
222
  when "LineItems" then element.children.each {|line_item| invoice.line_items_downloaded = true; invoice.line_items << LineItem.from_xml(line_item) }
223
- when "SubTotal" then invoice.sub_total = BigDecimal.new(element.text)
224
- when "TotalTax" then invoice.total_tax = BigDecimal.new(element.text)
225
- when "Total" then invoice.total = BigDecimal.new(element.text)
223
+ when "SubTotal" then invoice.sub_total = BigDecimal(element.text)
224
+ when "TotalTax" then invoice.total_tax = BigDecimal(element.text)
225
+ when "Total" then invoice.total = BigDecimal(element.text)
226
226
  when "Payments" then element.children.each { | payment | invoice.payments << Payment.from_xml(payment) }
227
- when "AmountDue" then invoice.amount_due = BigDecimal.new(element.text)
228
- when "AmountPaid" then invoice.amount_paid = BigDecimal.new(element.text)
229
- when "AmountCredited" then invoice.amount_credited = BigDecimal.new(element.text)
227
+ when "AmountDue" then invoice.amount_due = BigDecimal(element.text)
228
+ when "AmountPaid" then invoice.amount_paid = BigDecimal(element.text)
229
+ when "AmountCredited" then invoice.amount_credited = BigDecimal(element.text)
230
230
  when "SentToContact" then invoice.sent_to_contact = (element.text.strip.downcase == "true")
231
231
  when "Url" then invoice.url = element.text
232
232
  when "ValidationErrors" then invoice.errors = element.children.map { |error| Error.parse(error) }
@@ -3,7 +3,7 @@ require File.join(File.dirname(__FILE__), 'account')
3
3
  module XeroGateway
4
4
  class JournalLine
5
5
  include Money
6
-
6
+
7
7
  TAX_TYPE = Account::TAX_TYPE unless defined?(TAX_TYPE)
8
8
 
9
9
  # Any errors that occurred when the #valid? method called.
@@ -11,29 +11,29 @@ module XeroGateway
11
11
 
12
12
  # All accessible fields
13
13
  attr_accessor :journal_line_id, :line_amount, :account_code, :description, :tax_type, :tracking
14
-
14
+
15
15
  def initialize(params = {})
16
16
  @errors ||= []
17
17
  @tracking ||= []
18
-
18
+
19
19
  params.each do |k,v|
20
20
  self.send("#{k}=", v)
21
21
  end
22
22
  end
23
-
23
+
24
24
  # Validate the JournalLineItem record according to what will be valid by the gateway.
25
25
  #
26
- # Usage:
26
+ # Usage:
27
27
  # journal_line_item.valid? # Returns true/false
28
- #
28
+ #
29
29
  # Additionally sets journal_line_item.errors array to an array of field/error.
30
30
  def valid?
31
31
  @errors = []
32
-
32
+
33
33
  if !journal_line_id.nil? && journal_line_id !~ GUID_REGEX
34
34
  @errors << ['journal_line_id', 'must be blank or a valid Xero GUID']
35
35
  end
36
-
36
+
37
37
  unless line_amount
38
38
  @errors << ['line_amount', "can't be blank"]
39
39
  end
@@ -41,20 +41,20 @@ module XeroGateway
41
41
  unless account_code
42
42
  @errors << ['account_code', "can't be blank"]
43
43
  end
44
-
44
+
45
45
  @errors.size == 0
46
46
  end
47
-
47
+
48
48
  def has_tracking?
49
49
  return false if tracking.nil?
50
-
50
+
51
51
  if tracking.is_a?(Array)
52
52
  return tracking.any?
53
53
  else
54
54
  return tracking.is_a?(TrackingCategory)
55
55
  end
56
56
  end
57
-
57
+
58
58
  def to_xml(b = Builder::XmlMarkup.new)
59
59
  b.JournalLine {
60
60
  b.LineAmount line_amount # mandatory
@@ -73,12 +73,12 @@ module XeroGateway
73
73
  end
74
74
  }
75
75
  end
76
-
76
+
77
77
  def self.from_xml(journal_line_element)
78
78
  journal_line = JournalLine.new
79
79
  journal_line_element.children.each do |element|
80
80
  case(element.name)
81
- when "LineAmount" then journal_line.line_amount = BigDecimal.new(element.text)
81
+ when "LineAmount" then journal_line.line_amount = BigDecimal(element.text)
82
82
  when "AccountCode" then journal_line.account_code = element.text
83
83
  when "JournalLineID" then journal_line.journal_line_id = element.text
84
84
  when "Description" then journal_line.description = element.text
@@ -90,7 +90,7 @@ module XeroGateway
90
90
  end
91
91
  end
92
92
  journal_line
93
- end
93
+ end
94
94
 
95
95
  def ==(other)
96
96
  [:description, :line_amount, :account_code, :tax_type].each do |field|
@@ -98,5 +98,5 @@ module XeroGateway
98
98
  end
99
99
  return true
100
100
  end
101
- end
101
+ end
102
102
  end
@@ -16,7 +16,7 @@ module XeroGateway
16
16
  @errors ||= []
17
17
  @tracking ||= []
18
18
  @quantity = 1
19
- @unit_amount = BigDecimal.new('0')
19
+ @unit_amount = BigDecimal('0')
20
20
 
21
21
  params.each do |k,v|
22
22
  self.send("#{k}=", v)
@@ -68,7 +68,7 @@ module XeroGateway
68
68
  # for the API call to succeed.
69
69
  def line_amount
70
70
  total = quantity * unit_amount
71
- total = total * (1 - (discount_rate / BigDecimal.new(100))) if discount_rate
71
+ total = total * (1 - (discount_rate / BigDecimal(100))) if discount_rate
72
72
  total
73
73
  end
74
74
 
@@ -103,12 +103,12 @@ module XeroGateway
103
103
  when "LineItemID" then line_item.line_item_id = element.text
104
104
  when "Description" then line_item.description = element.text
105
105
  when "Quantity" then line_item.quantity = BigDecimal(element.text)
106
- when "UnitAmount" then line_item.unit_amount = BigDecimal.new(element.text)
106
+ when "UnitAmount" then line_item.unit_amount = BigDecimal(element.text)
107
107
  when "ItemCode" then line_item.item_code = element.text
108
108
  when "TaxType" then line_item.tax_type = element.text
109
- when "TaxAmount" then line_item.tax_amount = BigDecimal.new(element.text)
110
- when "LineAmount" then line_item.line_amount = BigDecimal.new(element.text)
111
- when "DiscountRate" then line_item.discount_rate = BigDecimal.new(element.text)
109
+ when "TaxAmount" then line_item.tax_amount = BigDecimal(element.text)
110
+ when "LineAmount" then line_item.line_amount = BigDecimal(element.text)
111
+ when "DiscountRate" then line_item.discount_rate = BigDecimal(element.text)
112
112
  when "AccountCode" then line_item.account_code = element.text
113
113
  when "Tracking" then
114
114
  element.children.each do | tracking_element |
@@ -40,8 +40,8 @@ module XeroGateway
40
40
  end
41
41
 
42
42
  def sum_line_items(lines, sum_type = :line_amount)
43
- lines.inject(BigDecimal.new('0')) do |sum, line|
44
- sum + BigDecimal.new(line.send(sum_type).to_s)
43
+ lines.inject(BigDecimal('0')) do |sum, line|
44
+ sum + BigDecimal(line.send(sum_type).to_s)
45
45
  end
46
46
  end
47
47
 
@@ -26,9 +26,9 @@ module XeroGateway
26
26
  when 'PaymentType' then payment.payment_type = element.text
27
27
  when 'Date' then payment.date = parse_date_time(element.text)
28
28
  when 'UpdatedDateUTC' then payment.updated_at = parse_date_time(element.text)
29
- when 'Amount' then payment.amount = BigDecimal.new(element.text)
29
+ when 'Amount' then payment.amount = BigDecimal(element.text)
30
30
  when 'Reference' then payment.reference = element.text
31
- when 'CurrencyRate' then payment.currency_rate = BigDecimal.new(element.text)
31
+ when 'CurrencyRate' then payment.currency_rate = BigDecimal(element.text)
32
32
  when 'Invoice'
33
33
  payment.invoice_id = element.elements["//InvoiceID"].text
34
34
  payment.invoice_number = element.elements["//InvoiceNumber"].text
@@ -1,3 +1,3 @@
1
1
  module XeroGateway
2
- VERSION = "2.6.0"
2
+ VERSION = "2.7.0"
3
3
  end
@@ -161,8 +161,8 @@ module TestHelper
161
161
  line_item_params[0] = {
162
162
  :description => "A LINE ITEM",
163
163
  :account_code => "200",
164
- :unit_amount => BigDecimal.new("100"),
165
- :tax_amount => BigDecimal.new("12.5"),
164
+ :unit_amount => BigDecimal("100"),
165
+ :tax_amount => BigDecimal("12.5"),
166
166
  :tracking => XeroGateway::TrackingCategory.new(:name => "blah", :options => "hello")
167
167
  }.merge(line_item_params[0])
168
168
 
@@ -230,14 +230,14 @@ module TestHelper
230
230
  journal_line_params[0] = {
231
231
  :description => "FIRST LINE",
232
232
  :account_code => "200",
233
- :line_amount => BigDecimal.new("100"),
233
+ :line_amount => BigDecimal("100"),
234
234
  :tracking => XeroGateway::TrackingCategory.new(:name => "blah", :options => "hello")
235
235
  }.merge(journal_line_params[0])
236
236
  params_line_1 = journal_line_params[1] || {}
237
237
  journal_line_params[1] = {
238
238
  :description => "SECOND LINE",
239
239
  :account_code => "200",
240
- :line_amount => BigDecimal.new("-100"),
240
+ :line_amount => BigDecimal("-100"),
241
241
  :tracking => XeroGateway::TrackingCategory.new(:name => "blah2", :options => "hello2")
242
242
  }.merge(params_line_1)
243
243
 
@@ -30,8 +30,8 @@ class BankTransactionTest < Test::Unit::TestCase
30
30
  line_item = bank_transaction.line_items.first
31
31
  assert_equal('A LINE ITEM', line_item.description)
32
32
  assert_equal('200', line_item.account_code)
33
- assert_equal(BigDecimal.new('100'), line_item.unit_amount)
34
- assert_equal(BigDecimal.new('12.5'), line_item.tax_amount)
33
+ assert_equal(BigDecimal('100'), line_item.unit_amount)
34
+ assert_equal(BigDecimal('12.5'), line_item.tax_amount)
35
35
  end
36
36
 
37
37
  should "allow overriding transaction defaults" do
@@ -114,7 +114,7 @@ class BankTransactionTest < Test::Unit::TestCase
114
114
  XeroGateway::BankTransaction.any_instance.stubs(:line_items_downloaded?).returns(false)
115
115
  parsed_bank_transaction = XeroGateway::BankTransaction.from_xml(bank_transaction_element)
116
116
  assert_equal 'http://example.com?with=params&and=more', parsed_bank_transaction.url
117
- assert_equal BigDecimal.new('1000'), parsed_bank_transaction.total
117
+ assert_equal BigDecimal('1000'), parsed_bank_transaction.total
118
118
  end
119
119
 
120
120
  should "ignore missing contact" do
@@ -98,7 +98,7 @@ class ContactTest < Test::Unit::TestCase
98
98
  contact_element = REXML::XPath.first(REXML::Document.new(test_xml.gsub(/\s/, "")), "/Contact")
99
99
  contact = XeroGateway::Contact.from_xml(contact_element)
100
100
 
101
- assert_equal Time.new(2016, 8, 31, 04, 55, 39), contact.updated_at.utc
101
+ assert_equal Time.utc(2016, 8, 31, 04, 55, 39), contact.updated_at.utc
102
102
 
103
103
  end
104
104
 
@@ -165,6 +165,59 @@ class ContactTest < Test::Unit::TestCase
165
165
  assert(!phone.valid?)
166
166
  end
167
167
 
168
+ def test_loads_branding_theme_if_set
169
+ test_xml = <<-TESTING.strip_heredoc.chomp
170
+ <Contact>
171
+ <ContactID>f1d403d1-7d30-46c2-a2be-fc2bb29bd295</ContactID>
172
+ <ContactStatus>ACTIVE</ContactStatus>
173
+ <Name>24 Locks</Name>
174
+ <Addresses>
175
+ <Address>
176
+ <AddressType>POBOX</AddressType>
177
+ </Address>
178
+ <Address>
179
+ <AddressType>STREET</AddressType>
180
+ </Address>
181
+ </Addresses>
182
+ <Phones>
183
+ <Phone>
184
+ <PhoneType>DDI</PhoneType>
185
+ </Phone>
186
+ <Phone>
187
+ <PhoneType>DEFAULT</PhoneType>
188
+ </Phone>
189
+ <Phone>
190
+ <PhoneType>FAX</PhoneType>
191
+ </Phone>
192
+ <Phone>
193
+ <PhoneType>MOBILE</PhoneType>
194
+ </Phone>
195
+ </Phones>
196
+ <ContactPersons>
197
+ <ContactPerson>
198
+ <FirstName>John</FirstName>
199
+ <LastName>Smith</LastName>
200
+ <EmailAddress>john@acme.com</EmailAddress>
201
+ <IncludeInEmails>true</IncludeInEmails>
202
+ </ContactPerson>
203
+ </ContactPersons>
204
+ <UpdatedDateUTC>2016-08-31T04:55:39.217</UpdatedDateUTC>
205
+ <IsSupplier>false</IsSupplier>
206
+ <IsCustomer>false</IsCustomer>
207
+ <HasAttachments>false</HasAttachments>
208
+ <BrandingTheme>
209
+ <BrandingThemeID>3761deb4-209e-4197-80bb-2993aff35387</BrandingThemeID>
210
+ <Name>Test_Theme</Name>
211
+ </BrandingTheme>
212
+ </Contact>
213
+ TESTING
214
+
215
+ contact_element = REXML::XPath.first(REXML::Document.new(test_xml.gsub(/\s/, "")), "/Contact")
216
+ contact = XeroGateway::Contact.from_xml(contact_element)
217
+
218
+ assert_equal "Test_Theme", contact.branding_theme.name
219
+ end
220
+
168
221
  private
169
222
 
170
223
  def create_test_contact
@@ -24,14 +24,14 @@ class CreditNoteTest < Test::Unit::TestCase
24
24
  line_item = credit_note.line_items.first
25
25
 
26
26
  # Make sure that everything adds up to begin with.
27
- expected_sub_total = credit_note.line_items.inject(BigDecimal.new('0')) { | sum, l | l.line_amount }
27
+ expected_sub_total = credit_note.line_items.inject(BigDecimal('0')) { | sum, l | l.line_amount }
28
28
  assert_equal(expected_sub_total, credit_note.sub_total)
29
29
 
30
30
  # Change the amount of the first line item and make sure that
31
31
  # everything still continues to add up.
32
32
  line_item.unit_amount = line_item.unit_amount + 10
33
33
  assert_not_equal(expected_sub_total, credit_note.sub_total)
34
- expected_sub_total = credit_note.line_items.inject(BigDecimal.new('0')) { | sum, l | l.line_amount }
34
+ expected_sub_total = credit_note.line_items.inject(BigDecimal('0')) { | sum, l | l.line_amount }
35
35
  assert_equal(expected_sub_total, credit_note.sub_total)
36
36
  end
37
37
 
@@ -41,14 +41,14 @@ class CreditNoteTest < Test::Unit::TestCase
41
41
  line_item = credit_note.line_items.first
42
42
 
43
43
  # Make sure that everything adds up to begin with.
44
- expected_total_tax = credit_note.line_items.inject(BigDecimal.new('0')) { | sum, l | l.tax_amount }
44
+ expected_total_tax = credit_note.line_items.inject(BigDecimal('0')) { | sum, l | l.tax_amount }
45
45
  assert_equal(expected_total_tax, credit_note.total_tax)
46
46
 
47
47
  # Change the tax_amount of the first line item and make sure that
48
48
  # everything still continues to add up.
49
49
  line_item.tax_amount = line_item.tax_amount + 10
50
50
  assert_not_equal(expected_total_tax, credit_note.total_tax)
51
- expected_total_tax = credit_note.line_items.inject(BigDecimal.new('0')) { | sum, l | l.tax_amount }
51
+ expected_total_tax = credit_note.line_items.inject(BigDecimal('0')) { | sum, l | l.tax_amount }
52
52
  assert_equal(expected_total_tax, credit_note.total_tax)
53
53
  end
54
54
 
@@ -96,9 +96,9 @@ class CreditNoteTest < Test::Unit::TestCase
96
96
  credit_note.line_items = []
97
97
 
98
98
  assert_nothing_raised(Exception) {
99
- assert_equal(BigDecimal.new('0'), credit_note.sub_total)
100
- assert_equal(BigDecimal.new('0'), credit_note.total_tax)
101
- assert_equal(BigDecimal.new('0'), credit_note.total)
99
+ assert_equal(BigDecimal('0'), credit_note.sub_total)
100
+ assert_equal(BigDecimal('0'), credit_note.total_tax)
101
+ assert_equal(BigDecimal('0'), credit_note.total)
102
102
  }
103
103
  end
104
104
 
@@ -142,8 +142,8 @@ class CreditNoteTest < Test::Unit::TestCase
142
142
  # Test the line_item defaults.
143
143
  assert_equal('A LINE ITEM', credit_note.line_items.first.description)
144
144
  assert_equal('200', credit_note.line_items.first.account_code)
145
- assert_equal(BigDecimal.new('100'), credit_note.line_items.first.unit_amount)
146
- assert_equal(BigDecimal.new('12.5'), credit_note.line_items.first.tax_amount)
145
+ assert_equal(BigDecimal('100'), credit_note.line_items.first.unit_amount)
146
+ assert_equal(BigDecimal('12.5'), credit_note.line_items.first.tax_amount)
147
147
 
148
148
  # Test overriding an credit_note parameter (assume works for all).
149
149
  credit_note = create_test_credit_note({:type => 'ACCPAYCREDIT'})
@@ -159,18 +159,18 @@ class CreditNoteTest < Test::Unit::TestCase
159
159
  credit_note = create_test_credit_note({}, {}, {:description => 'OVERRIDDEN LINE ITEM'})
160
160
  assert_equal(1, credit_note.line_items.size)
161
161
  assert_equal('OVERRIDDEN LINE ITEM', credit_note.line_items.first.description)
162
- assert_equal(BigDecimal.new('100'), credit_note.line_items.first.unit_amount)
162
+ assert_equal(BigDecimal('100'), credit_note.line_items.first.unit_amount)
163
163
 
164
164
  # Test overriding line_items with array of 2 line_items.
165
165
  credit_note = create_test_credit_note({}, {}, [
166
166
  {:description => 'OVERRIDDEN ITEM 1'},
167
- {:description => 'OVERRIDDEN ITEM 2', :account_code => '200', :unit_amount => BigDecimal.new('200'), :tax_amount => '25.0'}
167
+ {:description => 'OVERRIDDEN ITEM 2', :account_code => '200', :unit_amount => BigDecimal('200'), :tax_amount => '25.0'}
168
168
  ])
169
169
  assert_equal(2, credit_note.line_items.size)
170
170
  assert_equal('OVERRIDDEN ITEM 1', credit_note.line_items[0].description)
171
- assert_equal(BigDecimal.new('100'), credit_note.line_items[0].unit_amount)
171
+ assert_equal(BigDecimal('100'), credit_note.line_items[0].unit_amount)
172
172
  assert_equal('OVERRIDDEN ITEM 2', credit_note.line_items[1].description)
173
- assert_equal(BigDecimal.new('200'), credit_note.line_items[1].unit_amount)
173
+ assert_equal(BigDecimal('200'), credit_note.line_items[1].unit_amount)
174
174
  end
175
175
 
176
176
  def test_auto_creation_of_associated_contact
@@ -256,8 +256,8 @@ class CreditNoteTest < Test::Unit::TestCase
256
256
  line_item_params[0] = {
257
257
  :description => "A LINE ITEM",
258
258
  :account_code => "200",
259
- :unit_amount => BigDecimal.new("100"),
260
- :tax_amount => BigDecimal.new("12.5"),
259
+ :unit_amount => BigDecimal("100"),
260
+ :tax_amount => BigDecimal("12.5"),
261
261
  :tracking => XeroGateway::TrackingCategory.new(:name => "blah", :options => "hello")
262
262
  }.merge(line_item_params[0])
263
263
 
@@ -97,7 +97,7 @@ class InvoiceTest < Test::Unit::TestCase
97
97
  line_item = invoice.line_items.first
98
98
 
99
99
  # Make sure that everything adds up to begin with.
100
- expected_sub_total = invoice.line_items.inject(BigDecimal.new('0')) { | sum, l | l.line_amount }
100
+ expected_sub_total = invoice.line_items.inject(BigDecimal('0')) { | sum, l | l.line_amount }
101
101
  assert_equal(expected_sub_total, invoice.sub_total)
102
102
 
103
103
  # Change the sub_total and check that it doesn't modify anything.
@@ -108,7 +108,7 @@ class InvoiceTest < Test::Unit::TestCase
108
108
  # everything still continues to add up.
109
109
  line_item.unit_amount = line_item.unit_amount + 10
110
110
  assert_not_equal(expected_sub_total, invoice.sub_total)
111
- expected_sub_total = invoice.line_items.inject(BigDecimal.new('0')) { | sum, l | l.line_amount }
111
+ expected_sub_total = invoice.line_items.inject(BigDecimal('0')) { | sum, l | l.line_amount }
112
112
  assert_equal(expected_sub_total, invoice.sub_total)
113
113
  end
114
114
 
@@ -118,7 +118,7 @@ class InvoiceTest < Test::Unit::TestCase
118
118
  line_item = invoice.line_items.first
119
119
 
120
120
  # Make sure that everything adds up to begin with.
121
- expected_total_tax = invoice.line_items.inject(BigDecimal.new('0')) { | sum, l | l.tax_amount }
121
+ expected_total_tax = invoice.line_items.inject(BigDecimal('0')) { | sum, l | l.tax_amount }
122
122
  assert_equal(expected_total_tax, invoice.total_tax)
123
123
 
124
124
  # Change the total_tax and check that it doesn't modify anything.
@@ -129,7 +129,7 @@ class InvoiceTest < Test::Unit::TestCase
129
129
  # everything still continues to add up.
130
130
  line_item.tax_amount = line_item.tax_amount + 10
131
131
  assert_not_equal(expected_total_tax, invoice.total_tax)
132
- expected_total_tax = invoice.line_items.inject(BigDecimal.new('0')) { | sum, l | l.tax_amount }
132
+ expected_total_tax = invoice.line_items.inject(BigDecimal('0')) { | sum, l | l.tax_amount }
133
133
  assert_equal(expected_total_tax, invoice.total_tax)
134
134
  end
135
135
 
@@ -202,9 +202,9 @@ class InvoiceTest < Test::Unit::TestCase
202
202
  invoice.line_items = []
203
203
 
204
204
  assert_nothing_raised(Exception) {
205
- assert_equal(BigDecimal.new('0'), invoice.sub_total)
206
- assert_equal(BigDecimal.new('0'), invoice.total_tax)
207
- assert_equal(BigDecimal.new('0'), invoice.total)
205
+ assert_equal(BigDecimal('0'), invoice.sub_total)
206
+ assert_equal(BigDecimal('0'), invoice.total_tax)
207
+ assert_equal(BigDecimal('0'), invoice.total)
208
208
  }
209
209
  end
210
210
 
@@ -250,8 +250,8 @@ class InvoiceTest < Test::Unit::TestCase
250
250
  # Test the line_item defaults.
251
251
  assert_equal('A LINE ITEM', invoice.line_items.first.description)
252
252
  assert_equal('200', invoice.line_items.first.account_code)
253
- assert_equal(BigDecimal.new('100'), invoice.line_items.first.unit_amount)
254
- assert_equal(BigDecimal.new('12.5'), invoice.line_items.first.tax_amount)
253
+ assert_equal(BigDecimal('100'), invoice.line_items.first.unit_amount)
254
+ assert_equal(BigDecimal('12.5'), invoice.line_items.first.tax_amount)
255
255
 
256
256
  # Test optional params
257
257
  assert_nil invoice.url
@@ -270,18 +270,18 @@ class InvoiceTest < Test::Unit::TestCase
270
270
  invoice = create_test_invoice({}, {}, {:description => 'OVERRIDDEN LINE ITEM'})
271
271
  assert_equal(1, invoice.line_items.size)
272
272
  assert_equal('OVERRIDDEN LINE ITEM', invoice.line_items.first.description)
273
- assert_equal(BigDecimal.new('100'), invoice.line_items.first.unit_amount)
273
+ assert_equal(BigDecimal('100'), invoice.line_items.first.unit_amount)
274
274
 
275
275
  # Test overriding line_items with array of 2 line_items.
276
276
  invoice = create_test_invoice({}, {}, [
277
277
  {:description => 'OVERRIDDEN ITEM 1'},
278
- {:description => 'OVERRIDDEN ITEM 2', :account_code => '200', :unit_amount => BigDecimal.new('200'), :tax_amount => '25.0'}
278
+ {:description => 'OVERRIDDEN ITEM 2', :account_code => '200', :unit_amount => BigDecimal('200'), :tax_amount => '25.0'}
279
279
  ])
280
280
  assert_equal(2, invoice.line_items.size)
281
281
  assert_equal('OVERRIDDEN ITEM 1', invoice.line_items[0].description)
282
- assert_equal(BigDecimal.new('100'), invoice.line_items[0].unit_amount)
282
+ assert_equal(BigDecimal('100'), invoice.line_items[0].unit_amount)
283
283
  assert_equal('OVERRIDDEN ITEM 2', invoice.line_items[1].description)
284
- assert_equal(BigDecimal.new('200'), invoice.line_items[1].unit_amount)
284
+ assert_equal(BigDecimal('200'), invoice.line_items[1].unit_amount)
285
285
  end
286
286
 
287
287
  def test_auto_creation_of_associated_contact
@@ -391,8 +391,8 @@ class InvoiceTest < Test::Unit::TestCase
391
391
  line_item_params[0] = {
392
392
  :description => "A LINE ITEM",
393
393
  :account_code => "200",
394
- :unit_amount => BigDecimal.new("100"),
395
- :tax_amount => BigDecimal.new("12.5"),
394
+ :unit_amount => BigDecimal("100"),
395
+ :tax_amount => BigDecimal("12.5"),
396
396
  :tracking => XeroGateway::TrackingCategory.new(:name => "blah", :options => "hello")
397
397
  }.merge(line_item_params[0])
398
398
 
@@ -16,7 +16,7 @@ class ManualJournalTest < Test::Unit::TestCase
16
16
  journal_line = manual_journal.journal_lines.first
17
17
  assert_equal('FIRST LINE', journal_line.description)
18
18
  assert_equal('200', journal_line.account_code)
19
- assert_equal(BigDecimal.new('100'), journal_line.line_amount)
19
+ assert_equal(BigDecimal('100'), journal_line.line_amount)
20
20
  end
21
21
 
22
22
  should "allow overriding transaction defaults" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xero_gateway
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Connor
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-02-14 00:00:00.000000000 Z
13
+ date: 2019-03-26 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: builder
@@ -188,6 +188,7 @@ files:
188
188
  - lib/xero_gateway/address.rb
189
189
  - lib/xero_gateway/bank_transaction.rb
190
190
  - lib/xero_gateway/base_record.rb
191
+ - lib/xero_gateway/branding_theme.rb
191
192
  - lib/xero_gateway/ca-certificates.crt
192
193
  - lib/xero_gateway/contact.rb
193
194
  - lib/xero_gateway/contact_group.rb