octobat 0.0.12 → 2.0.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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +20 -10
  5. data/History.txt +33 -0
  6. data/VERSION +1 -1
  7. data/lib/octobat.rb +95 -19
  8. data/lib/octobat/api_operations/delete.rb +1 -0
  9. data/lib/octobat/api_operations/list.rb +16 -9
  10. data/lib/octobat/api_operations/update.rb +7 -4
  11. data/lib/octobat/api_resource.rb +5 -2
  12. data/lib/octobat/{payment_mode.rb → checkout.rb} +1 -1
  13. data/lib/octobat/coupon.rb +32 -0
  14. data/lib/octobat/credit_note.rb +35 -0
  15. data/lib/octobat/credit_note_numbering_sequence.rb +13 -0
  16. data/lib/octobat/customer.rb +10 -2
  17. data/lib/octobat/document.rb +17 -0
  18. data/lib/octobat/document_email_template.rb +19 -0
  19. data/lib/octobat/document_language.rb +19 -0
  20. data/lib/octobat/document_template.rb +33 -0
  21. data/lib/octobat/emails_setting.rb +19 -0
  22. data/lib/octobat/errors/api_connection_error.rb +1 -1
  23. data/lib/octobat/errors/api_error.rb +1 -1
  24. data/lib/octobat/errors/authentication_error.rb +1 -1
  25. data/lib/octobat/errors/invalid_request_error.rb +2 -4
  26. data/lib/octobat/errors/octobat_error.rb +31 -5
  27. data/lib/octobat/errors/octobat_lib_error.rb +20 -0
  28. data/lib/octobat/exports_setting.rb +19 -0
  29. data/lib/octobat/invoice.rb +61 -12
  30. data/lib/octobat/invoice_numbering_sequence.rb +18 -0
  31. data/lib/octobat/item.rb +64 -0
  32. data/lib/octobat/list_object.rb +12 -4
  33. data/lib/octobat/octobat_object.rb +13 -4
  34. data/lib/octobat/payment_recipient.rb +7 -0
  35. data/lib/octobat/{numbering_sequence.rb → payment_recipient_reference.rb} +1 -1
  36. data/lib/octobat/payment_source.rb +16 -0
  37. data/lib/octobat/{invoice_item.rb → tax_evidence.rb} +1 -1
  38. data/lib/octobat/tax_evidence_request.rb +5 -0
  39. data/lib/octobat/tax_region_setting.rb +27 -0
  40. data/lib/octobat/transaction.rb +11 -0
  41. data/lib/octobat/util.rb +28 -10
  42. data/lib/octobat/version.rb +1 -1
  43. data/octobat.gemspec +3 -3
  44. metadata +33 -45
@@ -0,0 +1,35 @@
1
+ module Octobat
2
+ class CreditNote < APIResource
3
+ extend Octobat::APIOperations::List
4
+ include Octobat::APIOperations::Create
5
+ include Octobat::APIOperations::Update
6
+
7
+ def send_by_email(email_data = {})
8
+ response, api_key = Octobat.request(:post, send_url, @api_key, email_data)
9
+ refresh_from(response, api_key)
10
+ end
11
+
12
+ def confirm
13
+ response, api_key = Octobat.request(:patch, confirm_url, @api_key)
14
+ refresh_from(response, api_key)
15
+ end
16
+
17
+ def items(params = {})
18
+ Item.list(params.merge({ :invoice => id }), @api_key)
19
+ end
20
+
21
+ def transactions(params = {})
22
+ Transaction.list(params.merge(invoice: id), @api_key)
23
+ end
24
+
25
+ private
26
+
27
+ def send_url
28
+ url + '/send'
29
+ end
30
+
31
+ def confirm_url
32
+ url + '/confirm'
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,18 @@
1
1
  module Octobat
2
2
  class CreditNoteNumberingSequence < APIResource
3
3
  extend Octobat::APIOperations::List
4
+ include Octobat::APIOperations::Create
5
+ include Octobat::APIOperations::Update
6
+
7
+ def set_to_default
8
+ response, api_key = Octobat.request(:patch, set_to_default_url, @api_key)
9
+ refresh_from(response, api_key)
10
+ end
11
+
12
+ private
13
+
14
+ def set_to_default_url
15
+ url + '/default'
16
+ end
4
17
  end
5
18
  end
@@ -3,10 +3,18 @@ module Octobat
3
3
  extend Octobat::APIOperations::List
4
4
  include Octobat::APIOperations::Create
5
5
  include Octobat::APIOperations::Update
6
-
6
+
7
7
  def invoices(params = {})
8
8
  Invoice.all(params.merge({ :customer => id }), @api_key)
9
9
  end
10
-
10
+
11
+ def credit_notes(params = {})
12
+ CreditNote.all(params.merge({ :customer => id }), @api_key)
13
+ end
14
+
15
+ def payment_sources(params = {})
16
+ PaymentSource.all(params.merge({ :customer => id }), @api_key)
17
+ end
18
+
11
19
  end
12
20
  end
@@ -0,0 +1,17 @@
1
+ module Octobat
2
+ class Document < APIResource
3
+
4
+
5
+ def self.csv_export(params = {}, opts={})
6
+ api_key, headers = Util.parse_opts(opts)
7
+ api_key ||= @api_key
8
+ opts[:api_key] = api_key
9
+
10
+ instance = self.new(nil, opts)
11
+
12
+ response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params)
13
+ return true
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,19 @@
1
+ module Octobat
2
+ class DocumentEmailTemplate < APIResource
3
+ include Octobat::APIOperations::Create
4
+ include Octobat::APIOperations::Update
5
+
6
+ def self.default(params = {}, opts={})
7
+ api_key, headers = Util.parse_opts(opts)
8
+ api_key ||= @api_key
9
+ opts[:api_key] = api_key
10
+
11
+ instance = self.new(nil, opts)
12
+
13
+ response, api_key = Octobat.request(:get, url + '/default', api_key, params)
14
+ instance.refresh_from(response, api_key)
15
+ instance
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ module Octobat
2
+ class DocumentLanguage < APIResource
3
+ include Octobat::APIOperations::Create
4
+ include Octobat::APIOperations::Update
5
+
6
+ def self.default(params = {}, opts={})
7
+ api_key, headers = Util.parse_opts(opts)
8
+ api_key ||= @api_key
9
+ opts[:api_key] = api_key
10
+
11
+ instance = self.new(nil, opts)
12
+
13
+ response, api_key = Octobat.request(:get, url + '/default', api_key, params)
14
+ instance.refresh_from(response, api_key)
15
+ instance
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,33 @@
1
+ module Octobat
2
+ class DocumentTemplate < APIResource
3
+ extend Octobat::APIOperations::List
4
+ include Octobat::APIOperations::Create
5
+ include Octobat::APIOperations::Update
6
+
7
+ def duplicate(params = {})
8
+ response, api_key = Octobat.request(:post, duplicate_url, @api_key, params)
9
+ refresh_from(response, api_key)
10
+ end
11
+
12
+ def activate
13
+ response, api_key = Octobat.request(:patch, activate_url, @api_key)
14
+ refresh_from(response, api_key)
15
+ end
16
+
17
+ def delete
18
+ response, api_key = Octobat.request(:delete, url, @api_key)
19
+ refresh_from(response, api_key)
20
+ end
21
+
22
+ private
23
+
24
+ def duplicate_url
25
+ url + '/duplicate'
26
+ end
27
+
28
+ def activate_url
29
+ url + '/activate'
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ module Octobat
2
+ class EmailsSetting < APIResource
3
+ include Octobat::APIOperations::Create
4
+ include Octobat::APIOperations::Update
5
+
6
+ def self.default(params = {}, opts={})
7
+ api_key, headers = Util.parse_opts(opts)
8
+ api_key ||= @api_key
9
+ opts[:api_key] = api_key
10
+
11
+ instance = self.new(nil, opts)
12
+
13
+ response, api_key = Octobat.request(:get, url + '/default', api_key, params)
14
+ instance.refresh_from(response, api_key)
15
+ instance
16
+ end
17
+
18
+ end
19
+ end
@@ -1,4 +1,4 @@
1
1
  module Octobat
2
- class APIConnectionError < OctobatError
2
+ class APIConnectionError < OctobatLibError
3
3
  end
4
4
  end
@@ -1,4 +1,4 @@
1
1
  module Octobat
2
- class APIError < OctobatError
2
+ class APIError < OctobatLibError
3
3
  end
4
4
  end
@@ -1,4 +1,4 @@
1
1
  module Octobat
2
- class AuthenticationError < OctobatError
2
+ class AuthenticationError < OctobatLibError
3
3
  end
4
4
  end
@@ -1,10 +1,8 @@
1
1
  module Octobat
2
2
  class InvalidRequestError < OctobatError
3
- attr_accessor :param
4
3
 
5
- def initialize(message, param, http_status=nil, http_body=nil, json_body=nil)
6
- super(message, http_status, http_body, json_body)
7
- @param = param
4
+ def initialize(error, http_status=nil, http_body=nil, json_body=nil)
5
+ super(error, http_status, http_body, json_body)
8
6
  end
9
7
  end
10
8
  end
@@ -1,20 +1,46 @@
1
1
  module Octobat
2
2
  class OctobatError < StandardError
3
- attr_reader :message
3
+ attr_accessor :message
4
+ attr_reader :error
4
5
  attr_reader :http_status
5
6
  attr_reader :http_body
6
7
  attr_reader :json_body
7
8
 
8
- def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil)
9
- @message = message
9
+ def initialize(error=nil, http_status=nil, http_body=nil, json_body=nil)
10
+ @error = error
10
11
  @http_status = http_status
11
12
  @http_body = http_body
12
13
  @json_body = json_body
13
14
  end
15
+
16
+ def message
17
+ @message ||= generate_message_from_error
18
+ end
14
19
 
15
20
  def to_s
16
21
  status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
17
- "#{status_string}#{@message}"
22
+ "#{status_string}#{message}"
23
+ end
24
+
25
+ def generate_message_from_error
26
+ return "" if @error.nil?
27
+ a = []
28
+
29
+ @error.each_key do |k|
30
+ msg = k.eql?(:global) ? "" : "#{k.to_s}: "
31
+ msg << "#{serialize_errors_from(@error[k])}"
32
+ a << msg
33
+ end
34
+
35
+ a.join(". ")
36
+ end
37
+
38
+ def serialize_errors_from(err)
39
+ a = []
40
+ err.each do |e|
41
+ a << "#{e[:details]}"
42
+ end
43
+ a.join(', ')
18
44
  end
19
45
  end
20
- end
46
+ end
@@ -0,0 +1,20 @@
1
+ module Octobat
2
+ class OctobatLibError < StandardError
3
+ attr_reader :message
4
+ attr_reader :http_status
5
+ attr_reader :http_body
6
+ attr_reader :json_body
7
+
8
+ def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil)
9
+ @message = message
10
+ @http_status = http_status
11
+ @http_body = http_body
12
+ @json_body = json_body
13
+ end
14
+
15
+ def to_s
16
+ status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
17
+ "#{status_string}#{@message}"
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module Octobat
2
+ class ExportsSetting < APIResource
3
+ include Octobat::APIOperations::Create
4
+ include Octobat::APIOperations::Update
5
+
6
+ def self.default(params = {}, opts={})
7
+ api_key, headers = Util.parse_opts(opts)
8
+ api_key ||= @api_key
9
+ opts[:api_key] = api_key
10
+
11
+ instance = self.new(nil, opts)
12
+
13
+ response, api_key = Octobat.request(:get, url + '/default', api_key, params)
14
+ instance.refresh_from(response, api_key)
15
+ instance
16
+ end
17
+
18
+ end
19
+ end
@@ -3,35 +3,84 @@ module Octobat
3
3
  extend Octobat::APIOperations::List
4
4
  include Octobat::APIOperations::Create
5
5
  include Octobat::APIOperations::Update
6
+
7
+
8
+ def self.pdf_export(params = {}, opts={})
9
+ api_key, headers = Util.parse_opts(opts)
10
+ api_key ||= @api_key
11
+ opts[:api_key] = api_key
6
12
 
7
- def pay(payment_data)
8
- response, api_key = Octobat.request(:patch, pay_url, @api_key, {payment: payment_data})
9
- refresh_from(response, api_key)
13
+ instance = self.new(nil, opts)
14
+
15
+ response, api_key = Octobat.request(:post, url + '/pdf_export', api_key, params)
16
+ return true
10
17
  end
11
18
 
12
- def send(enforce_errors = false)
13
- response, api_key = Octobat.request(:post, send_url, @api_key, {enforce_errors: enforce_errors})
14
- refresh_from(response, api_key)
19
+ def self.csv_export(params = {}, opts={})
20
+ api_key, headers = Util.parse_opts(opts)
21
+ api_key ||= @api_key
22
+ opts[:api_key] = api_key
23
+
24
+ instance = self.new(nil, opts)
25
+
26
+ response, api_key = Octobat.request(:post, url + '/csv_export', api_key, params)
27
+ return true
15
28
  end
16
29
 
17
-
30
+
31
+ def send_by_email(email_data = {})
32
+ response, api_key = Octobat.request(:post, send_url, @api_key, email_data)
33
+ refresh_from(response, api_key)
34
+ end
35
+
18
36
  def confirm
19
37
  response, api_key = Octobat.request(:patch, confirm_url, @api_key)
20
38
  refresh_from(response, api_key)
21
39
  end
22
40
 
41
+ def cancel
42
+ response, api_key = Octobat.request(:patch, cancel_url, @api_key)
43
+ refresh_from(response, api_key)
44
+ end
45
+
46
+ def cancel_and_replace
47
+ response, api_key = Octobat.request(:patch, cancel_and_replace_url, @api_key)
48
+ refresh_from(response, api_key)
49
+ end
50
+
51
+ def delete
52
+ response, api_key = Octobat.request(:delete, url, @api_key)
53
+ refresh_from(response, api_key)
54
+ end
55
+
56
+ def items(params = {})
57
+ Item.list(params.merge({ :invoice => id }), @api_key)
58
+ end
59
+
60
+ def transactions(params = {})
61
+ Transaction.list(params.merge(invoice: id), @api_key)
62
+ end
63
+
64
+
23
65
  private
24
66
 
25
- def pay_url
26
- url + '/pay'
27
- end
28
-
29
67
  def send_url
30
68
  url + '/send'
31
69
  end
32
-
70
+
33
71
  def confirm_url
34
72
  url + '/confirm'
35
73
  end
74
+
75
+ def cancel_url
76
+ url + '/cancel'
77
+ end
78
+
79
+ def cancel_and_replace_url
80
+ url + '/cancel_and_replace'
81
+ end
82
+
36
83
  end
84
+
85
+
37
86
  end
@@ -0,0 +1,18 @@
1
+ module Octobat
2
+ class InvoiceNumberingSequence < APIResource
3
+ extend Octobat::APIOperations::List
4
+ include Octobat::APIOperations::Create
5
+ include Octobat::APIOperations::Update
6
+
7
+ def set_to_default
8
+ response, api_key = Octobat.request(:patch, set_to_default_url, @api_key)
9
+ refresh_from(response, api_key)
10
+ end
11
+
12
+ private
13
+
14
+ def set_to_default_url
15
+ url + '/default'
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,64 @@
1
+ module Octobat
2
+ class Item < APIResource
3
+ extend Octobat::APIOperations::List
4
+ include Octobat::APIOperations::Create
5
+ include Octobat::APIOperations::Update
6
+ include Octobat::APIOperations::Delete
7
+
8
+
9
+ def url
10
+ !parent_obj.nil? ? parentize_url : super
11
+ end
12
+
13
+
14
+ def save_url
15
+ if self[:id] == nil && self.class.respond_to?(:create)
16
+ self.relative_save_url
17
+ else
18
+ url
19
+ end
20
+ end
21
+
22
+
23
+ def parentize_url
24
+ if parent_obj.include?(:transaction)
25
+ "#{Transaction.url}/#{CGI.escape(parent_obj[:transaction])}/items/#{CGI.escape(id)}"
26
+ elsif parent_obj.include?(:invoice)
27
+ "#{Invoice.url}/#{CGI.escape(parent_obj[:invoice])}/items/#{CGI.escape(id)}"
28
+ elsif parent_obj.include?(:credit_note)
29
+ "#{CreditNote.url}/#{CGI.escape(parent_obj[:credit_note])}/items/#{CGI.escape(id)}"
30
+ else
31
+ url
32
+ end
33
+ end
34
+
35
+
36
+
37
+ def relative_save_url
38
+ if self[:transaction]
39
+ "#{Transaction.url}/#{CGI.escape(self[:transaction])}/items"
40
+ elsif self[:invoice]
41
+ "#{Invoice.url}/#{CGI.escape(self[:invoice])}/items"
42
+ elsif self[:credit_note]
43
+ "#{CreditNote.url}/#{CGI.escape(self[:credit_note])}/items"
44
+ end
45
+ end
46
+
47
+
48
+ def self.url
49
+ if @parent_resource.include?(:transaction)
50
+ "#{Transaction.url}/#{CGI.escape(@parent_resource[:transaction])}/items"
51
+ elsif @parent_resource.include?(:invoice)
52
+ "#{Invoice.url}/#{CGI.escape(@parent_resource[:invoice])}/items"
53
+ elsif @parent_resource.include?(:credit_note)
54
+ "#{CreditNote.url}/#{CGI.escape(@parent_resource[:credit_note])}/items"
55
+ end
56
+ end
57
+
58
+ def self.set_parent_resource(filters)
59
+ @parent_resource = filters.select{|k, v| [:transaction, :invoice, :credit_note].include?(k)}
60
+ end
61
+
62
+
63
+ end
64
+ end