xero_gateway 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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