xero-ruby 3.8.0 → 3.11.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.
@@ -93,6 +93,91 @@ module XeroRuby
93
93
  return data, status_code, headers
94
94
  end
95
95
 
96
+ # Allows you to create a task
97
+ # Allows you to create a specific task
98
+ # @param xero_tenant_id [String] Xero identifier for Tenant
99
+ # @param project_id [String] You can create a task on a specified projectId
100
+ # @param task_create_or_update [TaskCreateOrUpdate] The task object you are creating
101
+ # @param [Hash] opts the optional parameters
102
+ # @return [nil]
103
+ def create_task(xero_tenant_id, project_id, task_create_or_update, opts = {})
104
+ create_task_with_http_info(xero_tenant_id, project_id, task_create_or_update, opts)
105
+ nil
106
+ end
107
+
108
+ # Allows you to create a task
109
+ # Allows you to create a specific task
110
+ # @param xero_tenant_id [String] Xero identifier for Tenant
111
+ # @param project_id [String] You can create a task on a specified projectId
112
+ # @param task_create_or_update [TaskCreateOrUpdate] The task object you are creating
113
+ # @param [Hash] opts the optional parameters
114
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
115
+ def create_task_with_http_info(xero_tenant_id, project_id, task_create_or_update, options = {})
116
+ opts = options.dup
117
+ if @api_client.config.debugging
118
+ @api_client.config.logger.debug 'Calling API: ProjectApi.create_task ...'
119
+ end
120
+ # verify the required parameter 'xero_tenant_id' is set
121
+ if @api_client.config.client_side_validation && xero_tenant_id.nil?
122
+ fail ArgumentError, "Missing the required parameter 'xero_tenant_id' when calling ProjectApi.create_task"
123
+ end
124
+ # verify the required parameter 'project_id' is set
125
+ if @api_client.config.client_side_validation && project_id.nil?
126
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ProjectApi.create_task"
127
+ end
128
+ # verify the required parameter 'task_create_or_update' is set
129
+ if @api_client.config.client_side_validation && task_create_or_update.nil?
130
+ fail ArgumentError, "Missing the required parameter 'task_create_or_update' when calling ProjectApi.create_task"
131
+ end
132
+ # resource path
133
+ local_var_path = '/Projects/{projectId}/Tasks'.sub('{' + 'projectId' + '}', project_id.to_s)
134
+
135
+ # camelize keys of incoming `where` opts
136
+ opts[:'where'] = @api_client.parameterize_where(opts[:'where']) if !opts[:'where'].nil?
137
+
138
+ # query parameters
139
+ query_params = opts[:query_params] || {}
140
+
141
+ # XeroAPI's `IDs` convention openapi-generator does not snake_case properly.. manual over-riding `i_ds` malformations:
142
+ query_params[:'IDs'] = @api_client.build_collection_param(opts[:'ids'], :csv) if !opts[:'ids'].nil?
143
+ query_params[:'ContactIDs'] = @api_client.build_collection_param(opts[:'contact_ids'], :csv) if !opts[:'contact_ids'].nil?
144
+
145
+ # header parameters
146
+ header_params = opts[:header_params] || {}
147
+ # HTTP header 'Accept' (if needed)
148
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
149
+ # HTTP header 'Content-Type'
150
+ header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])
151
+ header_params[:'Xero-Tenant-Id'] = xero_tenant_id
152
+
153
+ # form parameters
154
+ form_params = opts[:form_params] || {}
155
+
156
+ # http body (model)
157
+ post_body = opts[:body] || @api_client.object_to_http_body(task_create_or_update)
158
+
159
+ # return_type
160
+ return_type = opts[:return_type]
161
+
162
+ # auth_names
163
+ auth_names = opts[:auth_names] || ['OAuth2']
164
+
165
+ new_options = opts.merge(
166
+ :header_params => header_params,
167
+ :query_params => query_params,
168
+ :form_params => form_params,
169
+ :body => post_body,
170
+ :auth_names => auth_names,
171
+ :return_type => return_type
172
+ )
173
+
174
+ data, status_code, headers = @api_client.call_api(:POST, local_var_path, "ProjectApi", new_options)
175
+ if @api_client.config.debugging
176
+ @api_client.config.logger.debug "API called: ProjectApi#create_task\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
177
+ end
178
+ return data, status_code, headers
179
+ end
180
+
96
181
  # Creates a time entry for a specific project
97
182
  # Allows you to create a specific task
98
183
  # @param xero_tenant_id [String] Xero identifier for Tenant
@@ -178,6 +263,89 @@ module XeroRuby
178
263
  return data, status_code, headers
179
264
  end
180
265
 
266
+ # Allows you to delete a task
267
+ # Allows you to delete a specific task
268
+ # @param xero_tenant_id [String] Xero identifier for Tenant
269
+ # @param project_id [String] You can specify an individual project by appending the projectId to the endpoint
270
+ # @param task_id [String] You can specify an individual task by appending the id to the endpoint
271
+ # @param [Hash] opts the optional parameters
272
+ # @return [nil]
273
+ def delete_task(xero_tenant_id, project_id, task_id, opts = {})
274
+ delete_task_with_http_info(xero_tenant_id, project_id, task_id, opts)
275
+ nil
276
+ end
277
+
278
+ # Allows you to delete a task
279
+ # Allows you to delete a specific task
280
+ # @param xero_tenant_id [String] Xero identifier for Tenant
281
+ # @param project_id [String] You can specify an individual project by appending the projectId to the endpoint
282
+ # @param task_id [String] You can specify an individual task by appending the id to the endpoint
283
+ # @param [Hash] opts the optional parameters
284
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
285
+ def delete_task_with_http_info(xero_tenant_id, project_id, task_id, options = {})
286
+ opts = options.dup
287
+ if @api_client.config.debugging
288
+ @api_client.config.logger.debug 'Calling API: ProjectApi.delete_task ...'
289
+ end
290
+ # verify the required parameter 'xero_tenant_id' is set
291
+ if @api_client.config.client_side_validation && xero_tenant_id.nil?
292
+ fail ArgumentError, "Missing the required parameter 'xero_tenant_id' when calling ProjectApi.delete_task"
293
+ end
294
+ # verify the required parameter 'project_id' is set
295
+ if @api_client.config.client_side_validation && project_id.nil?
296
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ProjectApi.delete_task"
297
+ end
298
+ # verify the required parameter 'task_id' is set
299
+ if @api_client.config.client_side_validation && task_id.nil?
300
+ fail ArgumentError, "Missing the required parameter 'task_id' when calling ProjectApi.delete_task"
301
+ end
302
+ # resource path
303
+ local_var_path = '/Projects/{projectId}/Tasks/{taskId}'.sub('{' + 'projectId' + '}', project_id.to_s).sub('{' + 'taskId' + '}', task_id.to_s)
304
+
305
+ # camelize keys of incoming `where` opts
306
+ opts[:'where'] = @api_client.parameterize_where(opts[:'where']) if !opts[:'where'].nil?
307
+
308
+ # query parameters
309
+ query_params = opts[:query_params] || {}
310
+
311
+ # XeroAPI's `IDs` convention openapi-generator does not snake_case properly.. manual over-riding `i_ds` malformations:
312
+ query_params[:'IDs'] = @api_client.build_collection_param(opts[:'ids'], :csv) if !opts[:'ids'].nil?
313
+ query_params[:'ContactIDs'] = @api_client.build_collection_param(opts[:'contact_ids'], :csv) if !opts[:'contact_ids'].nil?
314
+
315
+ # header parameters
316
+ header_params = opts[:header_params] || {}
317
+ # HTTP header 'Accept' (if needed)
318
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
319
+ header_params[:'Xero-Tenant-Id'] = xero_tenant_id
320
+
321
+ # form parameters
322
+ form_params = opts[:form_params] || {}
323
+
324
+ # http body (model)
325
+ post_body = opts[:body]
326
+
327
+ # return_type
328
+ return_type = opts[:return_type]
329
+
330
+ # auth_names
331
+ auth_names = opts[:auth_names] || ['OAuth2']
332
+
333
+ new_options = opts.merge(
334
+ :header_params => header_params,
335
+ :query_params => query_params,
336
+ :form_params => form_params,
337
+ :body => post_body,
338
+ :auth_names => auth_names,
339
+ :return_type => return_type
340
+ )
341
+
342
+ data, status_code, headers = @api_client.call_api(:DELETE, local_var_path, "ProjectApi", new_options)
343
+ if @api_client.config.debugging
344
+ @api_client.config.logger.debug "API called: ProjectApi#delete_task\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
345
+ end
346
+ return data, status_code, headers
347
+ end
348
+
181
349
  # Deletes a time entry for a specific project
182
350
  # Allows you to delete a specific time entry
183
351
  # @param xero_tenant_id [String] Xero identifier for Tenant
@@ -229,6 +397,8 @@ module XeroRuby
229
397
 
230
398
  # header parameters
231
399
  header_params = opts[:header_params] || {}
400
+ # HTTP header 'Accept' (if needed)
401
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
232
402
  header_params[:'Xero-Tenant-Id'] = xero_tenant_id
233
403
 
234
404
  # form parameters
@@ -1047,6 +1217,97 @@ module XeroRuby
1047
1217
  return data, status_code, headers
1048
1218
  end
1049
1219
 
1220
+ # Allows you to update a task
1221
+ # Allows you to update a specific task
1222
+ # @param xero_tenant_id [String] Xero identifier for Tenant
1223
+ # @param project_id [String] You can specify an individual project by appending the projectId to the endpoint
1224
+ # @param task_id [String] You can specify an individual task by appending the id to the endpoint
1225
+ # @param task_create_or_update [TaskCreateOrUpdate] The task object you are updating
1226
+ # @param [Hash] opts the optional parameters
1227
+ # @return [nil]
1228
+ def update_task(xero_tenant_id, project_id, task_id, task_create_or_update, opts = {})
1229
+ update_task_with_http_info(xero_tenant_id, project_id, task_id, task_create_or_update, opts)
1230
+ nil
1231
+ end
1232
+
1233
+ # Allows you to update a task
1234
+ # Allows you to update a specific task
1235
+ # @param xero_tenant_id [String] Xero identifier for Tenant
1236
+ # @param project_id [String] You can specify an individual project by appending the projectId to the endpoint
1237
+ # @param task_id [String] You can specify an individual task by appending the id to the endpoint
1238
+ # @param task_create_or_update [TaskCreateOrUpdate] The task object you are updating
1239
+ # @param [Hash] opts the optional parameters
1240
+ # @return [Array<(nil, Integer, Hash)>] nil, response status code and response headers
1241
+ def update_task_with_http_info(xero_tenant_id, project_id, task_id, task_create_or_update, options = {})
1242
+ opts = options.dup
1243
+ if @api_client.config.debugging
1244
+ @api_client.config.logger.debug 'Calling API: ProjectApi.update_task ...'
1245
+ end
1246
+ # verify the required parameter 'xero_tenant_id' is set
1247
+ if @api_client.config.client_side_validation && xero_tenant_id.nil?
1248
+ fail ArgumentError, "Missing the required parameter 'xero_tenant_id' when calling ProjectApi.update_task"
1249
+ end
1250
+ # verify the required parameter 'project_id' is set
1251
+ if @api_client.config.client_side_validation && project_id.nil?
1252
+ fail ArgumentError, "Missing the required parameter 'project_id' when calling ProjectApi.update_task"
1253
+ end
1254
+ # verify the required parameter 'task_id' is set
1255
+ if @api_client.config.client_side_validation && task_id.nil?
1256
+ fail ArgumentError, "Missing the required parameter 'task_id' when calling ProjectApi.update_task"
1257
+ end
1258
+ # verify the required parameter 'task_create_or_update' is set
1259
+ if @api_client.config.client_side_validation && task_create_or_update.nil?
1260
+ fail ArgumentError, "Missing the required parameter 'task_create_or_update' when calling ProjectApi.update_task"
1261
+ end
1262
+ # resource path
1263
+ local_var_path = '/Projects/{projectId}/Tasks/{taskId}'.sub('{' + 'projectId' + '}', project_id.to_s).sub('{' + 'taskId' + '}', task_id.to_s)
1264
+
1265
+ # camelize keys of incoming `where` opts
1266
+ opts[:'where'] = @api_client.parameterize_where(opts[:'where']) if !opts[:'where'].nil?
1267
+
1268
+ # query parameters
1269
+ query_params = opts[:query_params] || {}
1270
+
1271
+ # XeroAPI's `IDs` convention openapi-generator does not snake_case properly.. manual over-riding `i_ds` malformations:
1272
+ query_params[:'IDs'] = @api_client.build_collection_param(opts[:'ids'], :csv) if !opts[:'ids'].nil?
1273
+ query_params[:'ContactIDs'] = @api_client.build_collection_param(opts[:'contact_ids'], :csv) if !opts[:'contact_ids'].nil?
1274
+
1275
+ # header parameters
1276
+ header_params = opts[:header_params] || {}
1277
+ # HTTP header 'Accept' (if needed)
1278
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
1279
+ # HTTP header 'Content-Type'
1280
+ header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])
1281
+ header_params[:'Xero-Tenant-Id'] = xero_tenant_id
1282
+
1283
+ # form parameters
1284
+ form_params = opts[:form_params] || {}
1285
+
1286
+ # http body (model)
1287
+ post_body = opts[:body] || @api_client.object_to_http_body(task_create_or_update)
1288
+
1289
+ # return_type
1290
+ return_type = opts[:return_type]
1291
+
1292
+ # auth_names
1293
+ auth_names = opts[:auth_names] || ['OAuth2']
1294
+
1295
+ new_options = opts.merge(
1296
+ :header_params => header_params,
1297
+ :query_params => query_params,
1298
+ :form_params => form_params,
1299
+ :body => post_body,
1300
+ :auth_names => auth_names,
1301
+ :return_type => return_type
1302
+ )
1303
+
1304
+ data, status_code, headers = @api_client.call_api(:PUT, local_var_path, "ProjectApi", new_options)
1305
+ if @api_client.config.debugging
1306
+ @api_client.config.logger.debug "API called: ProjectApi#update_task\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
1307
+ end
1308
+ return data, status_code, headers
1309
+ end
1310
+
1050
1311
  # Updates a time entry for a specific project
1051
1312
  # Allows you to update time entry in a project
1052
1313
  # @param xero_tenant_id [String] Xero identifier for Tenant
@@ -1104,6 +1365,8 @@ module XeroRuby
1104
1365
 
1105
1366
  # header parameters
1106
1367
  header_params = opts[:header_params] || {}
1368
+ # HTTP header 'Accept' (if needed)
1369
+ header_params['Accept'] = @api_client.select_header_accept(['application/json'])
1107
1370
  # HTTP header 'Content-Type'
1108
1371
  header_params['Content-Type'] = @api_client.select_header_content_type(['application/json'])
1109
1372
  header_params[:'Xero-Tenant-Id'] = xero_tenant_id
@@ -0,0 +1,244 @@
1
+ =begin
2
+ #Xero Accounting API
3
+
4
+ #No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
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::Accounting
16
+ require 'bigdecimal'
17
+
18
+ class BatchPaymentDelete
19
+ # The Xero generated unique identifier for the bank transaction (read-only)
20
+ attr_accessor :batch_payment_id
21
+
22
+ # The status of the batch payment.
23
+ attr_accessor :status
24
+
25
+ # Attribute mapping from ruby-style variable name to JSON key.
26
+ def self.attribute_map
27
+ {
28
+ :'batch_payment_id' => :'BatchPaymentID',
29
+ :'status' => :'Status'
30
+ }
31
+ end
32
+
33
+ # Attribute type mapping.
34
+ def self.openapi_types
35
+ {
36
+ :'batch_payment_id' => :'String',
37
+ :'status' => :'String'
38
+ }
39
+ end
40
+
41
+ # Initializes the object
42
+ # @param [Hash] attributes Model attributes in the form of hash
43
+ def initialize(attributes = {})
44
+ if (!attributes.is_a?(Hash))
45
+ fail ArgumentError, "The input argument (attributes) must be a hash in `XeroRuby::Accounting::BatchPaymentDelete` initialize method"
46
+ end
47
+
48
+ # check to see if the attribute exists and convert string to symbol for hash key
49
+ attributes = attributes.each_with_object({}) { |(k, v), h|
50
+ if (!self.class.attribute_map.key?(k.to_sym))
51
+ fail ArgumentError, "`#{k}` is not a valid attribute in `XeroRuby::Accounting::BatchPaymentDelete`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
52
+ end
53
+ h[k.to_sym] = v
54
+ }
55
+
56
+ if attributes.key?(:'batch_payment_id')
57
+ self.batch_payment_id = attributes[:'batch_payment_id']
58
+ end
59
+
60
+ if attributes.key?(:'status')
61
+ self.status = attributes[:'status']
62
+ else
63
+ self.status = 'DELETED'
64
+ end
65
+ end
66
+
67
+ # Show invalid properties with the reasons. Usually used together with valid?
68
+ # @return Array for valid properties with the reasons
69
+ def list_invalid_properties
70
+ invalid_properties = Array.new
71
+ if @batch_payment_id.nil?
72
+ invalid_properties.push('invalid value for "batch_payment_id", batch_payment_id cannot be nil.')
73
+ end
74
+
75
+ if @status.nil?
76
+ invalid_properties.push('invalid value for "status", status cannot be nil.')
77
+ end
78
+
79
+ invalid_properties
80
+ end
81
+
82
+ # Check to see if the all the properties in the model are valid
83
+ # @return true if the model is valid
84
+ def valid?
85
+ return false if @batch_payment_id.nil?
86
+ return false if @status.nil?
87
+ true
88
+ end
89
+
90
+ # Checks equality by comparing each attribute.
91
+ # @param [Object] Object to be compared
92
+ def ==(o)
93
+ return true if self.equal?(o)
94
+ self.class == o.class &&
95
+ batch_payment_id == o.batch_payment_id &&
96
+ status == o.status
97
+ end
98
+
99
+ # @see the `==` method
100
+ # @param [Object] Object to be compared
101
+ def eql?(o)
102
+ self == o
103
+ end
104
+
105
+ # Calculates hash code according to all attributes.
106
+ # @return [Integer] Hash code
107
+ def hash
108
+ [batch_payment_id, status].hash
109
+ end
110
+
111
+ # Builds the object from hash
112
+ # @param [Hash] attributes Model attributes in the form of hash
113
+ # @return [Object] Returns the model itself
114
+ def self.build_from_hash(attributes)
115
+ new.build_from_hash(attributes)
116
+ end
117
+
118
+ # Builds the object from hash
119
+ # @param [Hash] attributes Model attributes in the form of hash
120
+ # @return [Object] Returns the model itself
121
+ def build_from_hash(attributes)
122
+ return nil unless attributes.is_a?(Hash)
123
+ self.class.openapi_types.each_pair do |key, type|
124
+ if type =~ /\AArray<(.*)>/i
125
+ # check to ensure the input is an array given that the attribute
126
+ # is documented as an array but the input is not
127
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
128
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
129
+ end
130
+ elsif !attributes[self.class.attribute_map[key]].nil?
131
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
132
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
133
+ end
134
+
135
+ self
136
+ end
137
+
138
+ # Deserializes the data based on type
139
+ # @param string type Data type
140
+ # @param string value Value to be deserialized
141
+ # @return [Object] Deserialized data
142
+ def _deserialize(type, value)
143
+ case type.to_sym
144
+ when :DateTime
145
+ DateTime.parse(parse_date(value))
146
+ when :Date
147
+ Date.parse(parse_date(value))
148
+ when :String
149
+ value.to_s
150
+ when :Integer
151
+ value.to_i
152
+ when :Float
153
+ value.to_f
154
+ when :BigDecimal
155
+ BigDecimal(value.to_s)
156
+ when :Boolean
157
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
158
+ true
159
+ else
160
+ false
161
+ end
162
+ when :Object
163
+ # generic object (usually a Hash), return directly
164
+ value
165
+ when /\AArray<(?<inner_type>.+)>\z/
166
+ inner_type = Regexp.last_match[:inner_type]
167
+ value.map { |v| _deserialize(inner_type, v) }
168
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
169
+ k_type = Regexp.last_match[:k_type]
170
+ v_type = Regexp.last_match[:v_type]
171
+ {}.tap do |hash|
172
+ value.each do |k, v|
173
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
174
+ end
175
+ end
176
+ else # model
177
+ XeroRuby::Accounting.const_get(type).build_from_hash(value)
178
+ end
179
+ end
180
+
181
+ # Returns the string representation of the object
182
+ # @return [String] String presentation of the object
183
+ def to_s
184
+ to_hash.to_s
185
+ end
186
+
187
+ # to_body is an alias to to_hash (backward compatibility)
188
+ # @return [Hash] Returns the object in the form of hash
189
+ def to_body
190
+ to_hash
191
+ end
192
+
193
+ # Returns the object in the form of hash
194
+ # @return [Hash] Returns the object in the form of hash
195
+ def to_hash(downcase: false)
196
+ hash = {}
197
+ self.class.attribute_map.each_pair do |attr, param|
198
+ value = self.send(attr)
199
+ next if value.nil?
200
+ key = downcase ? attr : param
201
+ hash[key] = _to_hash(value, downcase: downcase)
202
+ end
203
+ hash
204
+ end
205
+
206
+ # Returns the object in the form of hash with snake_case
207
+ def to_attributes
208
+ to_hash(downcase: true)
209
+ end
210
+
211
+ # Outputs non-array value in the form of hash
212
+ # For object, use to_hash. Otherwise, just return the value
213
+ # @param [Object] value Any valid value
214
+ # @return [Hash] Returns the value in the form of hash
215
+ def _to_hash(value, downcase: false)
216
+ if value.is_a?(Array)
217
+ value.map do |v|
218
+ v.to_hash(downcase: downcase)
219
+ end
220
+ elsif value.is_a?(Hash)
221
+ {}.tap do |hash|
222
+ value.map { |k, v| hash[k] = _to_hash(v, downcase: downcase) }
223
+ end
224
+ elsif value.respond_to? :to_hash
225
+ value.to_hash(downcase: downcase)
226
+ else
227
+ value
228
+ end
229
+ end
230
+
231
+ def parse_date(datestring)
232
+ if datestring.include?('Date')
233
+ date_pattern = /\/Date\((-?\d+)(\+\d+)?\)\//
234
+ original, date, timezone = *date_pattern.match(datestring)
235
+ date = (date.to_i / 1000)
236
+ Time.at(date).utc.strftime('%Y-%m-%dT%H:%M:%S%z').to_s
237
+ elsif /(\d\d\d\d)-(\d\d)/.match(datestring) # handles dates w/out Days: YYYY-MM*-DD
238
+ Time.parse(datestring + '-01').strftime('%Y-%m-%dT%H:%M:%S').to_s
239
+ else # handle date 'types' for small subset of payroll API's
240
+ Time.parse(datestring).strftime('%Y-%m-%dT%H:%M:%S').to_s
241
+ end
242
+ end
243
+ end
244
+ end