xero-ruby 3.1.4 → 3.4.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +257 -222
  3. data/lib/xero-ruby/api/accounting_api.rb +11 -2
  4. data/lib/xero-ruby/api/app_store_api.rb +87 -0
  5. data/lib/xero-ruby/api/payroll_au_api.rb +14 -14
  6. data/lib/xero-ruby/api/payroll_nz_api.rb +18 -12
  7. data/lib/xero-ruby/api/payroll_uk_api.rb +14 -2
  8. data/lib/xero-ruby/api_client.rb +35 -6
  9. data/lib/xero-ruby/configuration.rb +2 -0
  10. data/lib/xero-ruby/models/accounting/bank_transfer.rb +35 -1
  11. data/lib/xero-ruby/models/accounting/budget_balance.rb +2 -2
  12. data/lib/xero-ruby/models/accounting/payment.rb +11 -1
  13. data/lib/xero-ruby/models/accounting/time_zone.rb +1 -0
  14. data/lib/xero-ruby/models/app_store/plan.rb +310 -0
  15. data/lib/xero-ruby/models/app_store/price.rb +257 -0
  16. data/lib/xero-ruby/models/app_store/problem_details.rb +272 -0
  17. data/lib/xero-ruby/models/app_store/product.rb +288 -0
  18. data/lib/xero-ruby/models/app_store/subscription.rb +324 -0
  19. data/lib/xero-ruby/models/app_store/subscription_item.rb +292 -0
  20. data/lib/xero-ruby/models/payroll_au/earnings_type.rb +2 -0
  21. data/lib/xero-ruby/models/payroll_au/employee.rb +30 -1
  22. data/lib/xero-ruby/models/payroll_au/manual_tax_type.rb +1 -0
  23. data/lib/xero-ruby/models/payroll_au/payroll_calendar.rb +11 -1
  24. data/lib/xero-ruby/models/payroll_uk/earnings_rate.rb +4 -4
  25. data/lib/xero-ruby/version.rb +2 -2
  26. data/lib/xero-ruby.rb +7 -0
  27. data/spec/api_client_spec.rb +25 -2
  28. data/spec/app_store/api/app_store_api_spec.rb +45 -0
  29. data/spec/app_store/models/plan_spec.rb +62 -0
  30. data/spec/app_store/models/price_spec.rb +52 -0
  31. data/spec/app_store/models/problem_details_spec.rb +70 -0
  32. data/spec/app_store/models/product_spec.rb +56 -0
  33. data/spec/app_store/models/subscription_item_spec.rb +70 -0
  34. data/spec/app_store/models/subscription_spec.rb +82 -0
  35. metadata +24 -3
@@ -0,0 +1,324 @@
1
+ =begin
2
+ #Xero AppStore API
3
+
4
+ #These endpoints are for Xero Partners to interact with the App Store Billing platform
5
+
6
+ Contact: api@xero.com
7
+ Generated by: https://openapi-generator.tech
8
+ OpenAPI Generator version: 4.3.1
9
+
10
+ =end
11
+
12
+ require 'time'
13
+ require 'date'
14
+
15
+ module XeroRuby::AppStore
16
+ require 'bigdecimal'
17
+
18
+ class Subscription
19
+ # End of the current period that the subscription has been invoiced for.
20
+ attr_accessor :current_period_end
21
+
22
+ # If the subscription has been canceled, this is the date when the subscription ends. If null, the subscription is active and has not been cancelled
23
+ attr_accessor :end_date
24
+
25
+ # The unique identifier of the subscription
26
+ attr_accessor :id
27
+
28
+ # The Xero generated unique identifier for the organisation
29
+ attr_accessor :organisation_id
30
+
31
+ # List of plans for the subscription.
32
+ attr_accessor :plans
33
+
34
+ # Date when the subscription was first created.
35
+ attr_accessor :start_date
36
+
37
+ # Status of the subscription. Available statuses are ACTIVE, CANCELED, and PAST_DUE.
38
+ attr_accessor :status
39
+
40
+ # Boolean used to indicate if the subscription is in test mode
41
+ attr_accessor :test_mode
42
+
43
+ # Attribute mapping from ruby-style variable name to JSON key.
44
+ def self.attribute_map
45
+ {
46
+ :'current_period_end' => :'currentPeriodEnd',
47
+ :'end_date' => :'endDate',
48
+ :'id' => :'id',
49
+ :'organisation_id' => :'organisationId',
50
+ :'plans' => :'plans',
51
+ :'start_date' => :'startDate',
52
+ :'status' => :'status',
53
+ :'test_mode' => :'testMode'
54
+ }
55
+ end
56
+
57
+ # Attribute type mapping.
58
+ def self.openapi_types
59
+ {
60
+ :'current_period_end' => :'DateTime',
61
+ :'end_date' => :'DateTime',
62
+ :'id' => :'String',
63
+ :'organisation_id' => :'String',
64
+ :'plans' => :'Array<Plan>',
65
+ :'start_date' => :'DateTime',
66
+ :'status' => :'String',
67
+ :'test_mode' => :'Boolean'
68
+ }
69
+ end
70
+
71
+ # Initializes the object
72
+ # @param [Hash] attributes Model attributes in the form of hash
73
+ def initialize(attributes = {})
74
+ if (!attributes.is_a?(Hash))
75
+ fail ArgumentError, "The input argument (attributes) must be a hash in `XeroRuby::AppStore::Subscription` initialize method"
76
+ end
77
+
78
+ # check to see if the attribute exists and convert string to symbol for hash key
79
+ attributes = attributes.each_with_object({}) { |(k, v), h|
80
+ if (!self.class.attribute_map.key?(k.to_sym))
81
+ fail ArgumentError, "`#{k}` is not a valid attribute in `XeroRuby::AppStore::Subscription`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
82
+ end
83
+ h[k.to_sym] = v
84
+ }
85
+
86
+ if attributes.key?(:'current_period_end')
87
+ self.current_period_end = attributes[:'current_period_end']
88
+ end
89
+
90
+ if attributes.key?(:'end_date')
91
+ self.end_date = attributes[:'end_date']
92
+ end
93
+
94
+ if attributes.key?(:'id')
95
+ self.id = attributes[:'id']
96
+ end
97
+
98
+ if attributes.key?(:'organisation_id')
99
+ self.organisation_id = attributes[:'organisation_id']
100
+ end
101
+
102
+ if attributes.key?(:'plans')
103
+ if (value = attributes[:'plans']).is_a?(Array)
104
+ self.plans = value
105
+ end
106
+ end
107
+
108
+ if attributes.key?(:'start_date')
109
+ self.start_date = attributes[:'start_date']
110
+ end
111
+
112
+ if attributes.key?(:'status')
113
+ self.status = attributes[:'status']
114
+ end
115
+
116
+ if attributes.key?(:'test_mode')
117
+ self.test_mode = attributes[:'test_mode']
118
+ end
119
+ end
120
+
121
+ # Show invalid properties with the reasons. Usually used together with valid?
122
+ # @return Array for valid properties with the reasons
123
+ def list_invalid_properties
124
+ invalid_properties = Array.new
125
+ if @current_period_end.nil?
126
+ invalid_properties.push('invalid value for "current_period_end", current_period_end cannot be nil.')
127
+ end
128
+
129
+ if @id.nil?
130
+ invalid_properties.push('invalid value for "id", id cannot be nil.')
131
+ end
132
+
133
+ if @organisation_id.nil?
134
+ invalid_properties.push('invalid value for "organisation_id", organisation_id cannot be nil.')
135
+ end
136
+
137
+ if @plans.nil?
138
+ invalid_properties.push('invalid value for "plans", plans cannot be nil.')
139
+ end
140
+
141
+ if @start_date.nil?
142
+ invalid_properties.push('invalid value for "start_date", start_date cannot be nil.')
143
+ end
144
+
145
+ if @status.nil?
146
+ invalid_properties.push('invalid value for "status", status cannot be nil.')
147
+ end
148
+
149
+ invalid_properties
150
+ end
151
+
152
+ # Check to see if the all the properties in the model are valid
153
+ # @return true if the model is valid
154
+ def valid?
155
+ return false if @current_period_end.nil?
156
+ return false if @id.nil?
157
+ return false if @organisation_id.nil?
158
+ return false if @plans.nil?
159
+ return false if @start_date.nil?
160
+ return false if @status.nil?
161
+ true
162
+ end
163
+
164
+ # Checks equality by comparing each attribute.
165
+ # @param [Object] Object to be compared
166
+ def ==(o)
167
+ return true if self.equal?(o)
168
+ self.class == o.class &&
169
+ current_period_end == o.current_period_end &&
170
+ end_date == o.end_date &&
171
+ id == o.id &&
172
+ organisation_id == o.organisation_id &&
173
+ plans == o.plans &&
174
+ start_date == o.start_date &&
175
+ status == o.status &&
176
+ test_mode == o.test_mode
177
+ end
178
+
179
+ # @see the `==` method
180
+ # @param [Object] Object to be compared
181
+ def eql?(o)
182
+ self == o
183
+ end
184
+
185
+ # Calculates hash code according to all attributes.
186
+ # @return [Integer] Hash code
187
+ def hash
188
+ [current_period_end, end_date, id, organisation_id, plans, start_date, status, test_mode].hash
189
+ end
190
+
191
+ # Builds the object from hash
192
+ # @param [Hash] attributes Model attributes in the form of hash
193
+ # @return [Object] Returns the model itself
194
+ def self.build_from_hash(attributes)
195
+ new.build_from_hash(attributes)
196
+ end
197
+
198
+ # Builds the object from hash
199
+ # @param [Hash] attributes Model attributes in the form of hash
200
+ # @return [Object] Returns the model itself
201
+ def build_from_hash(attributes)
202
+ return nil unless attributes.is_a?(Hash)
203
+ self.class.openapi_types.each_pair do |key, type|
204
+ if type =~ /\AArray<(.*)>/i
205
+ # check to ensure the input is an array given that the attribute
206
+ # is documented as an array but the input is not
207
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
208
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
209
+ end
210
+ elsif !attributes[self.class.attribute_map[key]].nil?
211
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
212
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
213
+ end
214
+
215
+ self
216
+ end
217
+
218
+ # Deserializes the data based on type
219
+ # @param string type Data type
220
+ # @param string value Value to be deserialized
221
+ # @return [Object] Deserialized data
222
+ def _deserialize(type, value)
223
+ case type.to_sym
224
+ when :DateTime
225
+ DateTime.parse(parse_date(value))
226
+ when :Date
227
+ Date.parse(parse_date(value))
228
+ when :String
229
+ value.to_s
230
+ when :Integer
231
+ value.to_i
232
+ when :Float
233
+ value.to_f
234
+ when :BigDecimal
235
+ BigDecimal(value.to_s)
236
+ when :Boolean
237
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
238
+ true
239
+ else
240
+ false
241
+ end
242
+ when :Object
243
+ # generic object (usually a Hash), return directly
244
+ value
245
+ when /\AArray<(?<inner_type>.+)>\z/
246
+ inner_type = Regexp.last_match[:inner_type]
247
+ value.map { |v| _deserialize(inner_type, v) }
248
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
249
+ k_type = Regexp.last_match[:k_type]
250
+ v_type = Regexp.last_match[:v_type]
251
+ {}.tap do |hash|
252
+ value.each do |k, v|
253
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
254
+ end
255
+ end
256
+ else # model
257
+ XeroRuby::AppStore.const_get(type).build_from_hash(value)
258
+ end
259
+ end
260
+
261
+ # Returns the string representation of the object
262
+ # @return [String] String presentation of the object
263
+ def to_s
264
+ to_hash.to_s
265
+ end
266
+
267
+ # to_body is an alias to to_hash (backward compatibility)
268
+ # @return [Hash] Returns the object in the form of hash
269
+ def to_body
270
+ to_hash
271
+ end
272
+
273
+ # Returns the object in the form of hash
274
+ # @return [Hash] Returns the object in the form of hash
275
+ def to_hash(downcase: false)
276
+ hash = {}
277
+ self.class.attribute_map.each_pair do |attr, param|
278
+ value = self.send(attr)
279
+ next if value.nil?
280
+ key = downcase ? attr : param
281
+ hash[key] = _to_hash(value, downcase: downcase)
282
+ end
283
+ hash
284
+ end
285
+
286
+ # Returns the object in the form of hash with snake_case
287
+ def to_attributes
288
+ to_hash(downcase: true)
289
+ end
290
+
291
+ # Outputs non-array value in the form of hash
292
+ # For object, use to_hash. Otherwise, just return the value
293
+ # @param [Object] value Any valid value
294
+ # @return [Hash] Returns the value in the form of hash
295
+ def _to_hash(value, downcase: false)
296
+ if value.is_a?(Array)
297
+ value.map do |v|
298
+ v.to_hash(downcase: downcase)
299
+ end
300
+ elsif value.is_a?(Hash)
301
+ {}.tap do |hash|
302
+ value.map { |k, v| hash[k] = _to_hash(v, downcase: downcase) }
303
+ end
304
+ elsif value.respond_to? :to_hash
305
+ value.to_hash(downcase: downcase)
306
+ else
307
+ value
308
+ end
309
+ end
310
+
311
+ def parse_date(datestring)
312
+ if datestring.include?('Date')
313
+ date_pattern = /\/Date\((-?\d+)(\+\d+)?\)\//
314
+ original, date, timezone = *date_pattern.match(datestring)
315
+ date = (date.to_i / 1000)
316
+ Time.at(date).utc.strftime('%Y-%m-%dT%H:%M:%S%z').to_s
317
+ elsif /(\d\d\d\d)-(\d\d)/.match(datestring) # handles dates w/out Days: YYYY-MM*-DD
318
+ Time.parse(datestring + '-01').strftime('%Y-%m-%dT%H:%M:%S').to_s
319
+ else # handle date 'types' for small subset of payroll API's
320
+ Time.parse(datestring).strftime('%Y-%m-%dT%H:%M:%S').to_s
321
+ end
322
+ end
323
+ end
324
+ end
@@ -0,0 +1,292 @@
1
+ =begin
2
+ #Xero AppStore API
3
+
4
+ #These endpoints are for Xero Partners to interact with the App Store Billing platform
5
+
6
+ Contact: api@xero.com
7
+ Generated by: https://openapi-generator.tech
8
+ OpenAPI Generator version: 4.3.1
9
+
10
+ =end
11
+
12
+ require 'time'
13
+ require 'date'
14
+
15
+ module XeroRuby::AppStore
16
+ require 'bigdecimal'
17
+
18
+ class SubscriptionItem
19
+ # Date when the subscription to this product will end
20
+ attr_accessor :end_date
21
+
22
+ # The unique identifier of the subscription item.
23
+ attr_accessor :id
24
+
25
+
26
+ attr_accessor :price
27
+
28
+
29
+ attr_accessor :product
30
+
31
+ # Date the subscription started, or will start. Note: this could be in the future for downgrades or reduced number of seats that haven't taken effect yet.
32
+ attr_accessor :start_date
33
+
34
+ # If the subscription is a test subscription
35
+ attr_accessor :test_mode
36
+
37
+ # Attribute mapping from ruby-style variable name to JSON key.
38
+ def self.attribute_map
39
+ {
40
+ :'end_date' => :'endDate',
41
+ :'id' => :'id',
42
+ :'price' => :'price',
43
+ :'product' => :'product',
44
+ :'start_date' => :'startDate',
45
+ :'test_mode' => :'testMode'
46
+ }
47
+ end
48
+
49
+ # Attribute type mapping.
50
+ def self.openapi_types
51
+ {
52
+ :'end_date' => :'DateTime',
53
+ :'id' => :'String',
54
+ :'price' => :'Price',
55
+ :'product' => :'Product',
56
+ :'start_date' => :'DateTime',
57
+ :'test_mode' => :'Boolean'
58
+ }
59
+ end
60
+
61
+ # Initializes the object
62
+ # @param [Hash] attributes Model attributes in the form of hash
63
+ def initialize(attributes = {})
64
+ if (!attributes.is_a?(Hash))
65
+ fail ArgumentError, "The input argument (attributes) must be a hash in `XeroRuby::AppStore::SubscriptionItem` initialize method"
66
+ end
67
+
68
+ # check to see if the attribute exists and convert string to symbol for hash key
69
+ attributes = attributes.each_with_object({}) { |(k, v), h|
70
+ if (!self.class.attribute_map.key?(k.to_sym))
71
+ fail ArgumentError, "`#{k}` is not a valid attribute in `XeroRuby::AppStore::SubscriptionItem`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
72
+ end
73
+ h[k.to_sym] = v
74
+ }
75
+
76
+ if attributes.key?(:'end_date')
77
+ self.end_date = attributes[:'end_date']
78
+ end
79
+
80
+ if attributes.key?(:'id')
81
+ self.id = attributes[:'id']
82
+ end
83
+
84
+ if attributes.key?(:'price')
85
+ self.price = attributes[:'price']
86
+ end
87
+
88
+ if attributes.key?(:'product')
89
+ self.product = attributes[:'product']
90
+ end
91
+
92
+ if attributes.key?(:'start_date')
93
+ self.start_date = attributes[:'start_date']
94
+ end
95
+
96
+ if attributes.key?(:'test_mode')
97
+ self.test_mode = attributes[:'test_mode']
98
+ end
99
+ end
100
+
101
+ # Show invalid properties with the reasons. Usually used together with valid?
102
+ # @return Array for valid properties with the reasons
103
+ def list_invalid_properties
104
+ invalid_properties = Array.new
105
+ if @id.nil?
106
+ invalid_properties.push('invalid value for "id", id cannot be nil.')
107
+ end
108
+
109
+ if @price.nil?
110
+ invalid_properties.push('invalid value for "price", price cannot be nil.')
111
+ end
112
+
113
+ if @product.nil?
114
+ invalid_properties.push('invalid value for "product", product cannot be nil.')
115
+ end
116
+
117
+ if @start_date.nil?
118
+ invalid_properties.push('invalid value for "start_date", start_date cannot be nil.')
119
+ end
120
+
121
+ invalid_properties
122
+ end
123
+
124
+ # Check to see if the all the properties in the model are valid
125
+ # @return true if the model is valid
126
+ def valid?
127
+ return false if @id.nil?
128
+ return false if @price.nil?
129
+ return false if @product.nil?
130
+ return false if @start_date.nil?
131
+ true
132
+ end
133
+
134
+ # Checks equality by comparing each attribute.
135
+ # @param [Object] Object to be compared
136
+ def ==(o)
137
+ return true if self.equal?(o)
138
+ self.class == o.class &&
139
+ end_date == o.end_date &&
140
+ id == o.id &&
141
+ price == o.price &&
142
+ product == o.product &&
143
+ start_date == o.start_date &&
144
+ test_mode == o.test_mode
145
+ end
146
+
147
+ # @see the `==` method
148
+ # @param [Object] Object to be compared
149
+ def eql?(o)
150
+ self == o
151
+ end
152
+
153
+ # Calculates hash code according to all attributes.
154
+ # @return [Integer] Hash code
155
+ def hash
156
+ [end_date, id, price, product, start_date, test_mode].hash
157
+ end
158
+
159
+ # Builds the object from hash
160
+ # @param [Hash] attributes Model attributes in the form of hash
161
+ # @return [Object] Returns the model itself
162
+ def self.build_from_hash(attributes)
163
+ new.build_from_hash(attributes)
164
+ end
165
+
166
+ # Builds the object from hash
167
+ # @param [Hash] attributes Model attributes in the form of hash
168
+ # @return [Object] Returns the model itself
169
+ def build_from_hash(attributes)
170
+ return nil unless attributes.is_a?(Hash)
171
+ self.class.openapi_types.each_pair do |key, type|
172
+ if type =~ /\AArray<(.*)>/i
173
+ # check to ensure the input is an array given that the attribute
174
+ # is documented as an array but the input is not
175
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
176
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
177
+ end
178
+ elsif !attributes[self.class.attribute_map[key]].nil?
179
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
180
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
181
+ end
182
+
183
+ self
184
+ end
185
+
186
+ # Deserializes the data based on type
187
+ # @param string type Data type
188
+ # @param string value Value to be deserialized
189
+ # @return [Object] Deserialized data
190
+ def _deserialize(type, value)
191
+ case type.to_sym
192
+ when :DateTime
193
+ DateTime.parse(parse_date(value))
194
+ when :Date
195
+ Date.parse(parse_date(value))
196
+ when :String
197
+ value.to_s
198
+ when :Integer
199
+ value.to_i
200
+ when :Float
201
+ value.to_f
202
+ when :BigDecimal
203
+ BigDecimal(value.to_s)
204
+ when :Boolean
205
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
206
+ true
207
+ else
208
+ false
209
+ end
210
+ when :Object
211
+ # generic object (usually a Hash), return directly
212
+ value
213
+ when /\AArray<(?<inner_type>.+)>\z/
214
+ inner_type = Regexp.last_match[:inner_type]
215
+ value.map { |v| _deserialize(inner_type, v) }
216
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
217
+ k_type = Regexp.last_match[:k_type]
218
+ v_type = Regexp.last_match[:v_type]
219
+ {}.tap do |hash|
220
+ value.each do |k, v|
221
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
222
+ end
223
+ end
224
+ else # model
225
+ XeroRuby::AppStore.const_get(type).build_from_hash(value)
226
+ end
227
+ end
228
+
229
+ # Returns the string representation of the object
230
+ # @return [String] String presentation of the object
231
+ def to_s
232
+ to_hash.to_s
233
+ end
234
+
235
+ # to_body is an alias to to_hash (backward compatibility)
236
+ # @return [Hash] Returns the object in the form of hash
237
+ def to_body
238
+ to_hash
239
+ end
240
+
241
+ # Returns the object in the form of hash
242
+ # @return [Hash] Returns the object in the form of hash
243
+ def to_hash(downcase: false)
244
+ hash = {}
245
+ self.class.attribute_map.each_pair do |attr, param|
246
+ value = self.send(attr)
247
+ next if value.nil?
248
+ key = downcase ? attr : param
249
+ hash[key] = _to_hash(value, downcase: downcase)
250
+ end
251
+ hash
252
+ end
253
+
254
+ # Returns the object in the form of hash with snake_case
255
+ def to_attributes
256
+ to_hash(downcase: true)
257
+ end
258
+
259
+ # Outputs non-array value in the form of hash
260
+ # For object, use to_hash. Otherwise, just return the value
261
+ # @param [Object] value Any valid value
262
+ # @return [Hash] Returns the value in the form of hash
263
+ def _to_hash(value, downcase: false)
264
+ if value.is_a?(Array)
265
+ value.map do |v|
266
+ v.to_hash(downcase: downcase)
267
+ end
268
+ elsif value.is_a?(Hash)
269
+ {}.tap do |hash|
270
+ value.map { |k, v| hash[k] = _to_hash(v, downcase: downcase) }
271
+ end
272
+ elsif value.respond_to? :to_hash
273
+ value.to_hash(downcase: downcase)
274
+ else
275
+ value
276
+ end
277
+ end
278
+
279
+ def parse_date(datestring)
280
+ if datestring.include?('Date')
281
+ date_pattern = /\/Date\((-?\d+)(\+\d+)?\)\//
282
+ original, date, timezone = *date_pattern.match(datestring)
283
+ date = (date.to_i / 1000)
284
+ Time.at(date).utc.strftime('%Y-%m-%dT%H:%M:%S%z').to_s
285
+ elsif /(\d\d\d\d)-(\d\d)/.match(datestring) # handles dates w/out Days: YYYY-MM*-DD
286
+ Time.parse(datestring + '-01').strftime('%Y-%m-%dT%H:%M:%S').to_s
287
+ else # handle date 'types' for small subset of payroll API's
288
+ Time.parse(datestring).strftime('%Y-%m-%dT%H:%M:%S').to_s
289
+ end
290
+ end
291
+ end
292
+ end
@@ -24,6 +24,8 @@ module XeroRuby::PayrollAu
24
24
  LUMPSUMB = "LUMPSUMB".freeze
25
25
  BONUSESANDCOMMISSIONS = "BONUSESANDCOMMISSIONS".freeze
26
26
  LUMPSUME = "LUMPSUME".freeze
27
+ LUMPSUMW = "LUMPSUMW".freeze
28
+ DIRECTORSFEES = "DIRECTORSFEES".freeze
27
29
 
28
30
  # Builds the enum from string
29
31
  # @param [String] The enum value in the form of the string