octobat 2.0.14 → 2.0.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/History.txt +24 -0
- data/VERSION +1 -1
- data/lib/octobat.rb +9 -1
- data/lib/octobat/coupon.rb +7 -6
- data/lib/octobat/credit_note.rb +20 -9
- data/lib/octobat/credit_note_numbering_sequence.rb +2 -2
- data/lib/octobat/customer.rb +6 -6
- data/lib/octobat/document.rb +1 -2
- data/lib/octobat/document_email_template.rb +1 -1
- data/lib/octobat/document_language.rb +1 -1
- data/lib/octobat/document_template.rb +8 -8
- data/lib/octobat/emails_setting.rb +1 -1
- data/lib/octobat/exports_setting.rb +1 -1
- data/lib/octobat/file_link.rb +41 -0
- data/lib/octobat/file_upload.rb +59 -0
- data/lib/octobat/invoice.rb +16 -16
- data/lib/octobat/invoice_numbering_sequence.rb +2 -2
- data/lib/octobat/multipart_encoder.rb +131 -0
- data/lib/octobat/octobat_object.rb +10 -9
- data/lib/octobat/order.rb +4 -11
- data/lib/octobat/payout.rb +2 -2
- data/lib/octobat/reporting/report_run.rb +12 -0
- data/lib/octobat/reporting/report_type.rb +12 -0
- data/lib/octobat/tax_evidence_request.rb +1 -1
- data/lib/octobat/tax_id.rb +17 -0
- data/lib/octobat/tax_region_setting.rb +4 -4
- data/lib/octobat/transaction.rb +2 -2
- data/lib/octobat/util.rb +6 -1
- data/lib/octobat/version.rb +1 -1
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34920a5c3e02774dc3c34f466dd9976748a83d01
|
4
|
+
data.tar.gz: 874a799adf02044785ee24bdb1ba40293d60cb10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00e77e52e4ec757ad3a643361cf1b926a0f1003cf59d8649e6ffa36c7c45ef68b7e2486bf915e390684a14baa19357df51218bb12de0be1e5b37210d13edce95
|
7
|
+
data.tar.gz: 949f9a01bc21c9eb3f38d6a693cf35c785bcbde52ca64fb8723a307e95e0404be59e30fae72c76c5f32c7a3817f807b9f459c4074089b94f9368e4c89fc72541
|
data/Gemfile.lock
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
octobat (2.0.
|
4
|
+
octobat (2.0.19)
|
5
5
|
rest-client (>= 1.4, < 4.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
domain_name (0.5.
|
10
|
+
domain_name (0.5.20190701)
|
11
11
|
unf (>= 0.0.5, < 1.0.0)
|
12
12
|
http-cookie (1.0.3)
|
13
13
|
domain_name (~> 0.5)
|
14
14
|
mime-types (3.2.2)
|
15
15
|
mime-types-data (~> 3.2015)
|
16
|
-
mime-types-data (3.
|
16
|
+
mime-types-data (3.2019.0331)
|
17
17
|
netrc (0.11.0)
|
18
18
|
rest-client (2.0.2)
|
19
19
|
http-cookie (>= 1.0.2, < 2.0)
|
@@ -21,7 +21,7 @@ GEM
|
|
21
21
|
netrc (~> 0.8)
|
22
22
|
unf (0.1.4)
|
23
23
|
unf_ext
|
24
|
-
unf_ext (0.0.7.
|
24
|
+
unf_ext (0.0.7.6)
|
25
25
|
|
26
26
|
PLATFORMS
|
27
27
|
ruby
|
data/History.txt
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
=== 2.0.19 2020-05-28
|
2
|
+
* 2 major enhancements:
|
3
|
+
* Add { opts } param for all nested methods, so you can include headers such as the Connected Octobat Account ID in subrequests
|
4
|
+
* Add support for CreditNote#cancel endpoint
|
5
|
+
|
6
|
+
|
7
|
+
=== 2.0.18 2020-05-25
|
8
|
+
* 3 major enhancements:
|
9
|
+
* Add support for multipart encoder (file upload)
|
10
|
+
* Add support for File API endpoints
|
11
|
+
* Add support for Reporting API endpoints
|
12
|
+
|
13
|
+
=== 2.0.17 2020-04-27
|
14
|
+
* 1 minor enhancement:
|
15
|
+
* Update Order API endpoints
|
16
|
+
|
17
|
+
=== 2.0.16 2020-03-20
|
18
|
+
* 1 major enhancement:
|
19
|
+
* Add TaxId resource
|
20
|
+
|
21
|
+
=== 2.0.15 2019-09-10
|
22
|
+
* 1 minor enhancement:
|
23
|
+
* Add Setup Intent statuses support for Orders
|
24
|
+
|
1
25
|
=== 2.0.14 2019-07-24
|
2
26
|
* 1 minor enhancement:
|
3
27
|
* Add Order
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.19
|
data/lib/octobat.rb
CHANGED
@@ -17,6 +17,7 @@ require 'octobat/api_operations/delete'
|
|
17
17
|
require 'octobat/api_operations/list'
|
18
18
|
|
19
19
|
# Resources
|
20
|
+
require 'octobat/multipart_encoder'
|
20
21
|
require 'octobat/util'
|
21
22
|
require 'octobat/octobat_object'
|
22
23
|
require 'octobat/api_resource'
|
@@ -49,6 +50,12 @@ require 'octobat/tax_evidence_request'
|
|
49
50
|
require 'octobat/document_email_template'
|
50
51
|
require 'octobat/exports_setting'
|
51
52
|
require 'octobat/emails_setting'
|
53
|
+
require 'octobat/tax_id'
|
54
|
+
|
55
|
+
require 'octobat/file_upload'
|
56
|
+
require 'octobat/file_link'
|
57
|
+
require 'octobat/reporting/report_type'
|
58
|
+
require 'octobat/reporting/report_run'
|
52
59
|
|
53
60
|
|
54
61
|
# Errors
|
@@ -63,6 +70,7 @@ module Octobat
|
|
63
70
|
#DEFAULT_CA_BUNDLE_PATH = File.dirname(__FILE__) + '/data/ca-certificates.crt'
|
64
71
|
@api_base = 'https://apiv2.octobat.com'
|
65
72
|
#@api_base = 'http://api.octobat.local:3052'
|
73
|
+
@uploads_base = "https://files.octobat.com"
|
66
74
|
|
67
75
|
@max_network_retries = 0
|
68
76
|
@max_network_retry_delay = 2
|
@@ -75,7 +83,7 @@ module Octobat
|
|
75
83
|
|
76
84
|
|
77
85
|
class << self
|
78
|
-
attr_accessor :api_key, :api_base, :verify_ssl_certs, :api_version
|
86
|
+
attr_accessor :api_key, :api_base, :verify_ssl_certs, :api_version, :uploads_base
|
79
87
|
attr_reader :max_network_retry_delay, :initial_network_retry_delay
|
80
88
|
end
|
81
89
|
|
data/lib/octobat/coupon.rb
CHANGED
@@ -4,20 +4,21 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Create
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
|
7
|
-
def activate
|
8
|
-
response, api_key = Octobat.request(:patch, activate_url, @api_key)
|
7
|
+
def activate(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:patch, activate_url, @api_key, params, opts)
|
9
9
|
refresh_from(response, api_key)
|
10
10
|
end
|
11
11
|
|
12
|
-
def unactivate
|
13
|
-
response, api_key = Octobat.request(:patch, unactivate_url, @api_key)
|
12
|
+
def unactivate(params = {}, opts = {})
|
13
|
+
response, api_key = Octobat.request(:patch, unactivate_url, @api_key, params, opts)
|
14
14
|
refresh_from(response, api_key)
|
15
15
|
end
|
16
16
|
|
17
|
-
def delete
|
18
|
-
response, api_key = Octobat.request(:delete, url, @api_key)
|
17
|
+
def delete(params = {}, opts = {})
|
18
|
+
response, api_key = Octobat.request(:delete, url, @api_key, params, opts)
|
19
19
|
refresh_from(response, api_key)
|
20
20
|
end
|
21
|
+
|
21
22
|
|
22
23
|
private
|
23
24
|
|
data/lib/octobat/credit_note.rb
CHANGED
@@ -12,30 +12,41 @@ module Octobat
|
|
12
12
|
|
13
13
|
instance = self.new(nil, opts)
|
14
14
|
|
15
|
-
response, api_key = Octobat.request(:post, url + '/pdf_export', api_key, params)
|
15
|
+
response, api_key = Octobat.request(:post, url + '/pdf_export', api_key, params, headers)
|
16
16
|
return true
|
17
17
|
end
|
18
18
|
|
19
19
|
|
20
|
-
def send_by_email(
|
21
|
-
response, api_key = Octobat.request(:post, send_url, @api_key,
|
20
|
+
def send_by_email(params = {}, opts = {})
|
21
|
+
response, api_key = Octobat.request(:post, send_url, @api_key, params, opts)
|
22
22
|
refresh_from(response, api_key)
|
23
23
|
end
|
24
24
|
|
25
|
-
def confirm(
|
26
|
-
response, api_key = Octobat.request(:patch, confirm_url, @api_key,
|
25
|
+
def confirm(params = {}, opts = {})
|
26
|
+
response, api_key = Octobat.request(:patch, confirm_url, @api_key, params, opts)
|
27
27
|
refresh_from(response, api_key)
|
28
28
|
end
|
29
|
+
|
30
|
+
|
31
|
+
def cancel(params = {}, opts = {})
|
32
|
+
response, api_key = Octobat.request(:patch, cancel_url, @api_key, params, opts)
|
33
|
+
refresh_from(response, api_key)
|
34
|
+
end
|
35
|
+
|
36
|
+
|
29
37
|
|
30
|
-
def items(params = {})
|
31
|
-
Item.list(params.merge({credit_note: id }), @api_key)
|
38
|
+
def items(params = {}, opts = {})
|
39
|
+
Item.list(params.merge({ credit_note: id }), {api_key: @api_key}.merge(opts))
|
32
40
|
end
|
33
41
|
|
34
|
-
def transactions(params = {})
|
35
|
-
Transaction.list(params.merge(credit_note: id), @api_key)
|
42
|
+
def transactions(params = {}, opts = {})
|
43
|
+
Transaction.list(params.merge(credit_note: id), {api_key: @api_key}.merge(opts))
|
36
44
|
end
|
37
45
|
|
38
46
|
private
|
47
|
+
def cancel_url
|
48
|
+
url + '/cancel'
|
49
|
+
end
|
39
50
|
|
40
51
|
def send_url
|
41
52
|
url + '/send'
|
@@ -4,8 +4,8 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Create
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
|
7
|
-
def set_to_default
|
8
|
-
response, api_key = Octobat.request(:patch, set_to_default_url, @api_key)
|
7
|
+
def set_to_default(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:patch, set_to_default_url, @api_key, params, opts)
|
9
9
|
refresh_from(response, api_key)
|
10
10
|
end
|
11
11
|
|
data/lib/octobat/customer.rb
CHANGED
@@ -5,16 +5,16 @@ module Octobat
|
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
include Octobat::APIOperations::Delete
|
7
7
|
|
8
|
-
def invoices(params = {})
|
9
|
-
Invoice.
|
8
|
+
def invoices(params = {}, opts = {})
|
9
|
+
Invoice.list(params.merge({ :customer => id }), {api_key: @api_key}.merge(opts))
|
10
10
|
end
|
11
11
|
|
12
|
-
def credit_notes(params = {})
|
13
|
-
CreditNote.
|
12
|
+
def credit_notes(params = {}, opts = {})
|
13
|
+
CreditNote.list(params.merge({ :customer => id }), {api_key: @api_key}.merge(opts))
|
14
14
|
end
|
15
15
|
|
16
|
-
def payment_sources(params = {})
|
17
|
-
PaymentSource.
|
16
|
+
def payment_sources(params = {}, opts = {})
|
17
|
+
PaymentSource.list(params.merge({ :customer => id }), {api_key: @api_key}.merge(opts))
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
data/lib/octobat/document.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
module Octobat
|
2
2
|
class Document < APIResource
|
3
3
|
|
4
|
-
|
5
4
|
def self.csv_export(params = {}, opts={})
|
6
5
|
api_key, headers = Util.parse_opts(opts)
|
7
6
|
api_key ||= @api_key
|
@@ -9,7 +8,7 @@ module Octobat
|
|
9
8
|
|
10
9
|
instance = self.new(nil, opts)
|
11
10
|
|
12
|
-
response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params)
|
11
|
+
response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params, opts)
|
13
12
|
return true
|
14
13
|
end
|
15
14
|
|
@@ -10,7 +10,7 @@ module Octobat
|
|
10
10
|
|
11
11
|
instance = self.new(nil, opts)
|
12
12
|
|
13
|
-
response, api_key = Octobat.request(:get, url + '/default', api_key, params)
|
13
|
+
response, api_key = Octobat.request(:get, url + '/default', api_key, params, opts)
|
14
14
|
instance.refresh_from(response, api_key)
|
15
15
|
instance
|
16
16
|
end
|
@@ -10,7 +10,7 @@ module Octobat
|
|
10
10
|
|
11
11
|
instance = self.new(nil, opts)
|
12
12
|
|
13
|
-
response, api_key = Octobat.request(:get, url + '/default', api_key, params)
|
13
|
+
response, api_key = Octobat.request(:get, url + '/default', api_key, params, opts)
|
14
14
|
instance.refresh_from(response, api_key)
|
15
15
|
instance
|
16
16
|
end
|
@@ -4,23 +4,23 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Create
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
|
7
|
-
def duplicate(params = {})
|
8
|
-
response, api_key = Octobat.request(:post, duplicate_url, @api_key, params)
|
7
|
+
def duplicate(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:post, duplicate_url, @api_key, params, opts)
|
9
9
|
refresh_from(response, api_key)
|
10
10
|
end
|
11
11
|
|
12
|
-
def activate
|
13
|
-
response, api_key = Octobat.request(:patch, activate_url, @api_key)
|
12
|
+
def activate(params = {}, opts = {})
|
13
|
+
response, api_key = Octobat.request(:patch, activate_url, @api_key, params, opts)
|
14
14
|
refresh_from(response, api_key)
|
15
15
|
end
|
16
16
|
|
17
|
-
def delete
|
18
|
-
response, api_key = Octobat.request(:delete, url, @api_key)
|
17
|
+
def delete(params = {}, opts = {})
|
18
|
+
response, api_key = Octobat.request(:delete, url, @api_key, params, opts)
|
19
19
|
refresh_from(response, api_key)
|
20
20
|
end
|
21
21
|
|
22
|
-
def preview(params = {})
|
23
|
-
response, api_key = Octobat.request(:get, preview_url, @api_key, params)
|
22
|
+
def preview(params = {}, opts = {})
|
23
|
+
response, api_key = Octobat.request(:get, preview_url, @api_key, params, opts)
|
24
24
|
refresh_from(response, api_key)
|
25
25
|
end
|
26
26
|
|
@@ -10,7 +10,7 @@ module Octobat
|
|
10
10
|
|
11
11
|
instance = self.new(nil, opts)
|
12
12
|
|
13
|
-
response, api_key = Octobat.request(:get, url + '/default', api_key, params)
|
13
|
+
response, api_key = Octobat.request(:get, url + '/default', api_key, params, opts)
|
14
14
|
instance.refresh_from(response, api_key)
|
15
15
|
instance
|
16
16
|
end
|
@@ -10,7 +10,7 @@ module Octobat
|
|
10
10
|
|
11
11
|
instance = self.new(nil, opts)
|
12
12
|
|
13
|
-
response, api_key = Octobat.request(:get, url + '/default', api_key, params)
|
13
|
+
response, api_key = Octobat.request(:get, url + '/default', api_key, params, opts)
|
14
14
|
instance.refresh_from(response, api_key)
|
15
15
|
instance
|
16
16
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Octobat
|
2
|
+
class FileLink < APIResource
|
3
|
+
include Octobat::APIOperations::Create
|
4
|
+
extend Octobat::APIOperations::List
|
5
|
+
|
6
|
+
def self.create(params = {}, opts = {})
|
7
|
+
api_key, headers = Util.parse_opts(opts)
|
8
|
+
response, api_key = Octobat.request(:post, self.url, api_key, params, headers, Octobat.uploads_base)
|
9
|
+
Util.convert_to_octobat_object(response, api_key)
|
10
|
+
end
|
11
|
+
|
12
|
+
def refresh
|
13
|
+
response, api_key = Octobat.request(:get, url, @api_key, @retrieve_options, @headers, Octobat.uploads_base)
|
14
|
+
refresh_from(response, api_key)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.list(filters={}, opts={})
|
18
|
+
set_parent_resource(filters)
|
19
|
+
api_key, headers = Util.parse_opts(opts)
|
20
|
+
|
21
|
+
api_key ||= @api_key
|
22
|
+
|
23
|
+
f = filters.select{|request_filter| !@parent_resource.has_key?(request_filter)}
|
24
|
+
|
25
|
+
response, api_key = Octobat.request(:get, url, api_key, f, headers, Octobat.uploads_base)
|
26
|
+
obj = ListObject.construct_from(response, api_key)
|
27
|
+
|
28
|
+
obj.filters = filters.dup
|
29
|
+
obj.cursors[:ending_before] = obj.filters.delete(:ending_before)
|
30
|
+
obj.cursors[:starting_after] = obj.filters.delete(:starting_after)
|
31
|
+
|
32
|
+
obj.filters.delete(:expand)
|
33
|
+
obj.parent_resource = @parent_resource
|
34
|
+
|
35
|
+
obj
|
36
|
+
end
|
37
|
+
|
38
|
+
self.singleton_class.send(:alias_method, :all, :list)
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Octobat
|
2
|
+
class FileUpload < APIResource
|
3
|
+
include Octobat::APIOperations::Create
|
4
|
+
extend Octobat::APIOperations::List
|
5
|
+
|
6
|
+
def self.url
|
7
|
+
"/files"
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def self.create(params = {}, opts = {})
|
12
|
+
if params[:attachment] && !params[:attachment].is_a?(String)
|
13
|
+
unless params[:attachment].respond_to?(:read)
|
14
|
+
raise ArgumentError, "attachment must respond to `#read`"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
api_key, headers = Util.parse_opts(opts)
|
19
|
+
headers = headers.merge(content_type: MultipartEncoder::MULTIPART_FORM_DATA)
|
20
|
+
|
21
|
+
response, api_key = Octobat.request(:post, self.url, api_key, params, headers, Octobat.uploads_base)
|
22
|
+
Util.convert_to_octobat_object(response, api_key)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def refresh
|
27
|
+
response, api_key = Octobat.request(:get, url, @api_key, @retrieve_options, @headers, Octobat.uploads_base)
|
28
|
+
refresh_from(response, api_key)
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
def self.list(filters={}, opts={})
|
33
|
+
set_parent_resource(filters)
|
34
|
+
api_key, headers = Util.parse_opts(opts)
|
35
|
+
|
36
|
+
api_key ||= @api_key
|
37
|
+
|
38
|
+
f = filters.select{|request_filter| !@parent_resource.has_key?(request_filter)}
|
39
|
+
|
40
|
+
response, api_key = Octobat.request(:get, url, api_key, f, headers, Octobat.uploads_base)
|
41
|
+
obj = ListObject.construct_from(response, api_key)
|
42
|
+
|
43
|
+
obj.filters = filters.dup
|
44
|
+
obj.cursors[:ending_before] = obj.filters.delete(:ending_before)
|
45
|
+
obj.cursors[:starting_after] = obj.filters.delete(:starting_after)
|
46
|
+
|
47
|
+
obj.filters.delete(:expand)
|
48
|
+
obj.parent_resource = @parent_resource
|
49
|
+
|
50
|
+
obj
|
51
|
+
end
|
52
|
+
|
53
|
+
self.singleton_class.send(:alias_method, :all, :list)
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
data/lib/octobat/invoice.rb
CHANGED
@@ -12,7 +12,7 @@ module Octobat
|
|
12
12
|
|
13
13
|
instance = self.new(nil, opts)
|
14
14
|
|
15
|
-
response, api_key = Octobat.request(:post, url + '/pdf_export', api_key, params)
|
15
|
+
response, api_key = Octobat.request(:post, url + '/pdf_export', api_key, params, opts)
|
16
16
|
return true
|
17
17
|
end
|
18
18
|
|
@@ -23,42 +23,42 @@ module Octobat
|
|
23
23
|
|
24
24
|
instance = self.new(nil, opts)
|
25
25
|
|
26
|
-
response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params)
|
26
|
+
response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params, opts)
|
27
27
|
return true
|
28
28
|
end
|
29
29
|
|
30
30
|
|
31
|
-
def send_by_email(
|
32
|
-
response, api_key = Octobat.request(:post, send_url, @api_key,
|
31
|
+
def send_by_email(params = {}, opts = {})
|
32
|
+
response, api_key = Octobat.request(:post, send_url, @api_key, params, opts)
|
33
33
|
refresh_from(response, api_key)
|
34
34
|
end
|
35
35
|
|
36
|
-
def confirm(
|
37
|
-
response, api_key = Octobat.request(:patch, confirm_url, @api_key,
|
36
|
+
def confirm(params = {}, opts = {})
|
37
|
+
response, api_key = Octobat.request(:patch, confirm_url, @api_key, params, opts)
|
38
38
|
refresh_from(response, api_key)
|
39
39
|
end
|
40
40
|
|
41
|
-
def cancel
|
42
|
-
response, api_key = Octobat.request(:patch, cancel_url, @api_key)
|
41
|
+
def cancel(params = {}, opts = {})
|
42
|
+
response, api_key = Octobat.request(:patch, cancel_url, @api_key, params, opts)
|
43
43
|
refresh_from(response, api_key)
|
44
44
|
end
|
45
45
|
|
46
|
-
def cancel_and_replace
|
47
|
-
response, api_key = Octobat.request(:patch, cancel_and_replace_url, @api_key)
|
46
|
+
def cancel_and_replace(params = {}, opts = {})
|
47
|
+
response, api_key = Octobat.request(:patch, cancel_and_replace_url, @api_key, params, opts)
|
48
48
|
refresh_from(response, api_key)
|
49
49
|
end
|
50
50
|
|
51
|
-
def delete
|
52
|
-
response, api_key = Octobat.request(:delete, url, @api_key)
|
51
|
+
def delete(params = {}, opts = {})
|
52
|
+
response, api_key = Octobat.request(:delete, url, @api_key, params, opts)
|
53
53
|
refresh_from(response, api_key)
|
54
54
|
end
|
55
55
|
|
56
|
-
def items(params = {})
|
57
|
-
Item.list(params.merge({ :invoice => id }), @api_key)
|
56
|
+
def items(params = {}, opts = {})
|
57
|
+
Item.list(params.merge({ :invoice => id }), {api_key: @api_key}.merge(opts))
|
58
58
|
end
|
59
59
|
|
60
|
-
def transactions(params = {})
|
61
|
-
Transaction.list(params.merge(invoice: id), @api_key)
|
60
|
+
def transactions(params = {}, opts = {})
|
61
|
+
Transaction.list(params.merge(invoice: id), {api_key: @api_key}.merge(opts))
|
62
62
|
end
|
63
63
|
|
64
64
|
|
@@ -4,8 +4,8 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Create
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
|
7
|
-
def set_to_default
|
8
|
-
response, api_key = Octobat.request(:patch, set_to_default_url, @api_key)
|
7
|
+
def set_to_default(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:patch, set_to_default_url, @api_key, params, opts)
|
9
9
|
refresh_from(response, api_key)
|
10
10
|
end
|
11
11
|
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "securerandom"
|
4
|
+
require "tempfile"
|
5
|
+
|
6
|
+
module Octobat
|
7
|
+
# Encodes parameters into a `multipart/form-data` payload as described by RFC
|
8
|
+
# 2388:
|
9
|
+
#
|
10
|
+
# https://tools.ietf.org/html/rfc2388
|
11
|
+
#
|
12
|
+
# This is most useful for transferring file-like objects.
|
13
|
+
#
|
14
|
+
# Parameters should be added with `#encode`. When ready, use `#body` to get
|
15
|
+
# the encoded result and `#content_type` to get the value that should be
|
16
|
+
# placed in the `Content-Type` header of a subsequent request (which includes
|
17
|
+
# a boundary value).
|
18
|
+
class MultipartEncoder
|
19
|
+
MULTIPART_FORM_DATA = "multipart/form-data"
|
20
|
+
|
21
|
+
# A shortcut for encoding a single set of parameters and finalizing a
|
22
|
+
# result.
|
23
|
+
#
|
24
|
+
# Returns an encoded body and the value that should be set in the content
|
25
|
+
# type header of a subsequent request.
|
26
|
+
def self.encode(params)
|
27
|
+
encoder = MultipartEncoder.new
|
28
|
+
encoder.encode(params)
|
29
|
+
encoder.close
|
30
|
+
[encoder.body, encoder.content_type]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Gets the object's randomly generated boundary string.
|
34
|
+
attr_reader :boundary
|
35
|
+
|
36
|
+
# Initializes a new multipart encoder.
|
37
|
+
def initialize
|
38
|
+
# Kind of weird, but required by Rubocop because the unary plus operator
|
39
|
+
# is considered faster than `Octobat.new`.
|
40
|
+
@body = +""
|
41
|
+
|
42
|
+
# Chose the same number of random bytes that Go uses in its standard
|
43
|
+
# library implementation. Easily enough entropy to ensure that it won't
|
44
|
+
# be present in a file we're sending.
|
45
|
+
@boundary = SecureRandom.hex(30)
|
46
|
+
|
47
|
+
@closed = false
|
48
|
+
@first_field = true
|
49
|
+
end
|
50
|
+
|
51
|
+
# Gets the encoded body. `#close` must be called first.
|
52
|
+
def body
|
53
|
+
raise "object must be closed before getting body" unless @closed
|
54
|
+
|
55
|
+
@body
|
56
|
+
end
|
57
|
+
|
58
|
+
# Finalizes the object by writing the final boundary.
|
59
|
+
def close
|
60
|
+
raise "object already closed" if @closed
|
61
|
+
|
62
|
+
@body << "\r\n"
|
63
|
+
@body << "--#{@boundary}--"
|
64
|
+
|
65
|
+
@closed = true
|
66
|
+
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
# Gets the value including boundary that should be put into a multipart
|
71
|
+
# request's `Content-Type`.
|
72
|
+
def content_type
|
73
|
+
"#{MULTIPART_FORM_DATA}; boundary=#{@boundary}"
|
74
|
+
end
|
75
|
+
|
76
|
+
# Encodes a set of parameters to the body.
|
77
|
+
#
|
78
|
+
# Note that parameters are expected to be a hash, but a "flat" hash such
|
79
|
+
# that complex substructures like hashes and arrays have already been
|
80
|
+
# appropriately Octobat-encoded. Pass a complex structure through
|
81
|
+
# `Util.flatten_params` first before handing it off to this method.
|
82
|
+
def encode(params)
|
83
|
+
raise "no more parameters can be written to closed object" if @closed
|
84
|
+
|
85
|
+
params.each do |name, val|
|
86
|
+
if val.is_a?(::File) || val.is_a?(::Tempfile)
|
87
|
+
write_field(name, val.read, filename: ::File.basename(val.path))
|
88
|
+
elsif val.respond_to?(:read)
|
89
|
+
write_field(name, val.read, filename: "blob")
|
90
|
+
else
|
91
|
+
write_field(name, val, filename: nil)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
nil
|
96
|
+
end
|
97
|
+
|
98
|
+
#
|
99
|
+
# private
|
100
|
+
#
|
101
|
+
|
102
|
+
# Escapes double quotes so that the given value can be used in a
|
103
|
+
# double-quoted string and replaces any linebreak characters with spaces.
|
104
|
+
private def escape(str)
|
105
|
+
str.gsub('"', "%22").tr("\n", " ").tr("\r", " ")
|
106
|
+
end
|
107
|
+
|
108
|
+
private def write_field(name, data, filename:)
|
109
|
+
if !@first_field
|
110
|
+
@body << "\r\n"
|
111
|
+
else
|
112
|
+
@first_field = false
|
113
|
+
end
|
114
|
+
|
115
|
+
@body << "--#{@boundary}\r\n"
|
116
|
+
|
117
|
+
if filename
|
118
|
+
@body << %(Content-Disposition: form-data) +
|
119
|
+
%(; name="#{escape(name.to_s)}") +
|
120
|
+
%(; filename="#{escape(filename)}"\r\n)
|
121
|
+
@body << %(Content-Type: application/octet-stream\r\n)
|
122
|
+
else
|
123
|
+
@body << %(Content-Disposition: form-data) +
|
124
|
+
%(; name="#{escape(name.to_s)}"\r\n)
|
125
|
+
end
|
126
|
+
|
127
|
+
@body << "\r\n"
|
128
|
+
@body << data.to_s
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -57,10 +57,11 @@ module Octobat
|
|
57
57
|
# customer, where there is no persistent card parameter. Mark those values
|
58
58
|
# which don't persist as transient
|
59
59
|
|
60
|
-
instance_eval do
|
61
|
-
|
62
|
-
|
63
|
-
end
|
60
|
+
#instance_eval do
|
61
|
+
remove_accessors(removed)
|
62
|
+
add_accessors(added)
|
63
|
+
#end
|
64
|
+
|
64
65
|
removed.each do |k|
|
65
66
|
@values.delete(k)
|
66
67
|
@transient_values.add(k)
|
@@ -141,9 +142,10 @@ module Octobat
|
|
141
142
|
metaclass.instance_eval do
|
142
143
|
keys.each do |k|
|
143
144
|
next if @@permanent_attributes.include?(k)
|
144
|
-
|
145
|
-
|
146
|
-
|
145
|
+
|
146
|
+
[k, :"#{k}="].each do |method_name|
|
147
|
+
remove_method(method_name) if method_defined?(method_name)
|
148
|
+
end
|
147
149
|
end
|
148
150
|
end
|
149
151
|
end
|
@@ -152,9 +154,8 @@ module Octobat
|
|
152
154
|
metaclass.instance_eval do
|
153
155
|
keys.each do |k|
|
154
156
|
next if @@permanent_attributes.include?(k)
|
155
|
-
k_eq = :"#{k}="
|
156
157
|
define_method(k) { @values[k] }
|
157
|
-
define_method(
|
158
|
+
define_method(:"#{k}=") do |v|
|
158
159
|
=begin
|
159
160
|
if v == ""
|
160
161
|
raise ArgumentError.new(
|
data/lib/octobat/order.rb
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
module Octobat
|
2
2
|
class Order < APIResource
|
3
3
|
extend Octobat::APIOperations::List
|
4
|
+
include Octobat::APIOperations::Update
|
4
5
|
|
5
|
-
def expire
|
6
|
-
response, api_key = Octobat.request(:patch, expire_url, @api_key)
|
7
|
-
refresh_from(response, api_key)
|
8
|
-
end
|
9
|
-
|
10
|
-
def update_payment_intent_status(payment_intent_status_data = {})
|
11
|
-
response, api_key = Octobat.request(:patch, update_payment_intent_status_url, @api_key, payment_intent_status_data)
|
6
|
+
def expire(params = {}, opts = {})
|
7
|
+
response, api_key = Octobat.request(:patch, expire_url, @api_key, params, opts)
|
12
8
|
refresh_from(response, api_key)
|
13
9
|
end
|
14
10
|
|
@@ -16,10 +12,7 @@ module Octobat
|
|
16
12
|
def expire_url
|
17
13
|
url + '/expire'
|
18
14
|
end
|
19
|
-
|
20
|
-
def update_payment_intent_status_url
|
21
|
-
url + '/payment_intent_status'
|
22
|
-
end
|
15
|
+
|
23
16
|
|
24
17
|
end
|
25
18
|
|
data/lib/octobat/payout.rb
CHANGED
@@ -2,8 +2,8 @@ module Octobat
|
|
2
2
|
class Payout < APIResource
|
3
3
|
extend Octobat::APIOperations::List
|
4
4
|
|
5
|
-
def balance_transactions(params = {})
|
6
|
-
BalanceTransaction.list(params.merge({ payout: id }), @api_key)
|
5
|
+
def balance_transactions(params = {}, opts = {})
|
6
|
+
BalanceTransaction.list(params.merge({ payout: id }), {api_key: @api_key}.merge(opts))
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.csv_export(params = {}, opts={})
|
@@ -9,7 +9,7 @@ module Octobat
|
|
9
9
|
|
10
10
|
instance = self.new(nil, opts)
|
11
11
|
|
12
|
-
response, api_key = Octobat.request(:post, url + '/for_supplier', api_key, params)
|
12
|
+
response, api_key = Octobat.request(:post, url + '/for_supplier', api_key, params, opts)
|
13
13
|
instance.refresh_from(response, api_key)
|
14
14
|
instance
|
15
15
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Octobat
|
2
|
+
class TaxId < APIResource
|
3
|
+
extend Octobat::APIOperations::List
|
4
|
+
include Octobat::APIOperations::Create
|
5
|
+
include Octobat::APIOperations::Update
|
6
|
+
|
7
|
+
def archive(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:patch, archive_url, @api_key, params, opts)
|
9
|
+
refresh_from(response, api_key)
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
def archive_url
|
14
|
+
url + '/archive'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -4,13 +4,13 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Update
|
5
5
|
include Octobat::APIOperations::Create
|
6
6
|
|
7
|
-
def activate
|
8
|
-
response, api_key = Octobat.request(:patch, activate_url, @api_key)
|
7
|
+
def activate(params = {}, opts = {})
|
8
|
+
response, api_key = Octobat.request(:patch, activate_url, @api_key, params, opts)
|
9
9
|
refresh_from(response, api_key)
|
10
10
|
end
|
11
11
|
|
12
|
-
def unactivate
|
13
|
-
response, api_key = Octobat.request(:patch, unactivate_url, @api_key)
|
12
|
+
def unactivate(params = {}, opts = {})
|
13
|
+
response, api_key = Octobat.request(:patch, unactivate_url, @api_key, params, opts)
|
14
14
|
refresh_from(response, api_key)
|
15
15
|
end
|
16
16
|
|
data/lib/octobat/transaction.rb
CHANGED
@@ -4,8 +4,8 @@ module Octobat
|
|
4
4
|
include Octobat::APIOperations::Create
|
5
5
|
include Octobat::APIOperations::Update
|
6
6
|
|
7
|
-
def items(params = {})
|
8
|
-
Item.list(params.merge({ :transaction => id }), @api_key)
|
7
|
+
def items(params = {}, opts = {})
|
8
|
+
Item.list(params.merge({ :transaction => id }), {api_key: @api_key}.merge(opts))
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.csv_export(params = {}, opts={})
|
data/lib/octobat/util.rb
CHANGED
@@ -58,13 +58,18 @@ module Octobat
|
|
58
58
|
'product' => Product,
|
59
59
|
'proforma_invoice' => ProformaInvoice,
|
60
60
|
'tax_region_setting' => TaxRegionSetting,
|
61
|
+
'tax_id' => TaxId,
|
61
62
|
'transaction' => Transaction,
|
62
63
|
'tax_evidence' => TaxEvidence,
|
63
64
|
'tax_evidence_request' => TaxEvidenceRequest,
|
64
65
|
'document_email_template' => DocumentEmailTemplate,
|
65
66
|
'exports_setting' => ExportsSetting,
|
66
67
|
'document' => Document,
|
67
|
-
'emails_setting' => EmailsSetting
|
68
|
+
'emails_setting' => EmailsSetting,
|
69
|
+
'file' => FileUpload,
|
70
|
+
'file_link' => FileLink,
|
71
|
+
'reporting.report_type' => Reporting::ReportType,
|
72
|
+
'reporting.report_run' => Reporting::ReportRun
|
68
73
|
}
|
69
74
|
end
|
70
75
|
|
data/lib/octobat/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octobat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gaultier Laperche
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -79,10 +79,13 @@ files:
|
|
79
79
|
- lib/octobat/errors/octobat_error.rb
|
80
80
|
- lib/octobat/errors/octobat_lib_error.rb
|
81
81
|
- lib/octobat/exports_setting.rb
|
82
|
+
- lib/octobat/file_link.rb
|
83
|
+
- lib/octobat/file_upload.rb
|
82
84
|
- lib/octobat/invoice.rb
|
83
85
|
- lib/octobat/invoice_numbering_sequence.rb
|
84
86
|
- lib/octobat/item.rb
|
85
87
|
- lib/octobat/list_object.rb
|
88
|
+
- lib/octobat/multipart_encoder.rb
|
86
89
|
- lib/octobat/octobat_object.rb
|
87
90
|
- lib/octobat/order.rb
|
88
91
|
- lib/octobat/payment_recipient.rb
|
@@ -91,9 +94,12 @@ files:
|
|
91
94
|
- lib/octobat/payout.rb
|
92
95
|
- lib/octobat/product.rb
|
93
96
|
- lib/octobat/proforma_invoice.rb
|
97
|
+
- lib/octobat/reporting/report_run.rb
|
98
|
+
- lib/octobat/reporting/report_type.rb
|
94
99
|
- lib/octobat/singleton_api_resource.rb
|
95
100
|
- lib/octobat/tax_evidence.rb
|
96
101
|
- lib/octobat/tax_evidence_request.rb
|
102
|
+
- lib/octobat/tax_id.rb
|
97
103
|
- lib/octobat/tax_region_setting.rb
|
98
104
|
- lib/octobat/transaction.rb
|
99
105
|
- lib/octobat/util.rb
|