quaderno 1.13.2 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +56 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/Gemfile +2 -15
  6. data/README.md +120 -42
  7. data/Rakefile +4 -50
  8. data/changelog.md +67 -41
  9. data/lib/quaderno-ruby.rb +5 -5
  10. data/lib/quaderno-ruby/base.rb +112 -107
  11. data/lib/quaderno-ruby/behavior/block.rb +20 -19
  12. data/lib/quaderno-ruby/behavior/crud.rb +108 -95
  13. data/lib/quaderno-ruby/behavior/deliver.rb +20 -18
  14. data/lib/quaderno-ruby/behavior/payment.rb +38 -34
  15. data/lib/quaderno-ruby/behavior/retrieve.rb +26 -25
  16. data/lib/quaderno-ruby/checkout_session.rb +4 -0
  17. data/lib/quaderno-ruby/collection.rb +1 -0
  18. data/lib/quaderno-ruby/contact.rb +6 -8
  19. data/lib/quaderno-ruby/credit.rb +10 -12
  20. data/lib/quaderno-ruby/document_item.rb +1 -3
  21. data/lib/quaderno-ruby/estimate.rb +5 -7
  22. data/lib/quaderno-ruby/evidence.rb +5 -7
  23. data/lib/quaderno-ruby/exceptions/exceptions.rb +50 -44
  24. data/lib/quaderno-ruby/expense.rb +6 -8
  25. data/lib/quaderno-ruby/helpers/authentication.rb +16 -18
  26. data/lib/quaderno-ruby/helpers/rate_limit.rb +12 -0
  27. data/lib/quaderno-ruby/income.rb +8 -10
  28. data/lib/quaderno-ruby/invoice.rb +9 -11
  29. data/lib/quaderno-ruby/item.rb +3 -6
  30. data/lib/quaderno-ruby/payment.rb +2 -3
  31. data/lib/quaderno-ruby/receipt.rb +6 -8
  32. data/lib/quaderno-ruby/recurring.rb +4 -7
  33. data/lib/quaderno-ruby/report.rb +67 -29
  34. data/lib/quaderno-ruby/tax.rb +51 -46
  35. data/lib/quaderno-ruby/version.rb +3 -0
  36. data/lib/quaderno-ruby/webhook.rb +3 -5
  37. data/quaderno.gemspec +28 -148
  38. metadata +92 -92
  39. data/Gemfile.lock +0 -91
  40. data/VERSION +0 -1
  41. data/test/fixtures/quaderno_cassettes/.DS_Store +0 -0
  42. data/test/fixtures/quaderno_cassettes/all_contacts.yml +0 -52
  43. data/test/fixtures/quaderno_cassettes/all_contacts_by_access_token.yml +0 -56
  44. data/test/fixtures/quaderno_cassettes/all_contacts_by_authentication_token.yml +0 -57
  45. data/test/fixtures/quaderno_cassettes/all_estimates.yml +0 -52
  46. data/test/fixtures/quaderno_cassettes/all_expenses.yml +0 -55
  47. data/test/fixtures/quaderno_cassettes/all_invoices.yml +0 -56
  48. data/test/fixtures/quaderno_cassettes/all_items.yml +0 -46
  49. data/test/fixtures/quaderno_cassettes/all_receipts.yml +0 -53
  50. data/test/fixtures/quaderno_cassettes/all_webhooks.yml +0 -214
  51. data/test/fixtures/quaderno_cassettes/create_estimate_on_downgraded_API.yml +0 -156
  52. data/test/fixtures/quaderno_cassettes/create_expense_on_downgraded_API.yml +0 -278
  53. data/test/fixtures/quaderno_cassettes/create_invoice_on_downgraded_API.yml +0 -159
  54. data/test/fixtures/quaderno_cassettes/create_receipt_on_downgraded_API.yml +0 -196
  55. data/test/fixtures/quaderno_cassettes/deleted_contact.yml +0 -187
  56. data/test/fixtures/quaderno_cassettes/deleted_contact_by_access_token.yml +0 -199
  57. data/test/fixtures/quaderno_cassettes/deleted_contact_by_authentication_token.yml +0 -199
  58. data/test/fixtures/quaderno_cassettes/deleted_estimate.yml +0 -187
  59. data/test/fixtures/quaderno_cassettes/deleted_expense.yml +0 -189
  60. data/test/fixtures/quaderno_cassettes/deleted_invoice.yml +0 -190
  61. data/test/fixtures/quaderno_cassettes/deleted_item.yml +0 -128
  62. data/test/fixtures/quaderno_cassettes/deleted_receipt.yml +0 -223
  63. data/test/fixtures/quaderno_cassettes/deleted_webhook.yml +0 -257
  64. data/test/fixtures/quaderno_cassettes/delivered_estimate.yml +0 -136
  65. data/test/fixtures/quaderno_cassettes/delivered_invoice.yml +0 -143
  66. data/test/fixtures/quaderno_cassettes/delivered_receipt.yml +0 -140
  67. data/test/fixtures/quaderno_cassettes/evidence_invoice.yml +0 -98
  68. data/test/fixtures/quaderno_cassettes/found_contact.yml +0 -95
  69. data/test/fixtures/quaderno_cassettes/found_contact_by_access_token.yml +0 -99
  70. data/test/fixtures/quaderno_cassettes/found_contact_by_authentication_token.yml +0 -100
  71. data/test/fixtures/quaderno_cassettes/found_estimate.yml +0 -97
  72. data/test/fixtures/quaderno_cassettes/found_expense.yml +0 -99
  73. data/test/fixtures/quaderno_cassettes/found_invoice.yml +0 -100
  74. data/test/fixtures/quaderno_cassettes/found_item.yml +0 -91
  75. data/test/fixtures/quaderno_cassettes/found_receipt.yml +0 -98
  76. data/test/fixtures/quaderno_cassettes/found_webhook.yml +0 -130
  77. data/test/fixtures/quaderno_cassettes/new_contact.yml +0 -48
  78. data/test/fixtures/quaderno_cassettes/new_contact_by_access_token.yml +0 -48
  79. data/test/fixtures/quaderno_cassettes/new_contact_by_authentication_token.yml +0 -48
  80. data/test/fixtures/quaderno_cassettes/new_estimate.yml +0 -137
  81. data/test/fixtures/quaderno_cassettes/new_evidence.yml +0 -48
  82. data/test/fixtures/quaderno_cassettes/new_expense.yml +0 -189
  83. data/test/fixtures/quaderno_cassettes/new_invoice.yml +0 -137
  84. data/test/fixtures/quaderno_cassettes/new_item.yml +0 -48
  85. data/test/fixtures/quaderno_cassettes/new_receipt.yml +0 -173
  86. data/test/fixtures/quaderno_cassettes/new_webhook.yml +0 -87
  87. data/test/fixtures/quaderno_cassettes/paid_expense.yml +0 -98
  88. data/test/fixtures/quaderno_cassettes/paid_invoice.yml +0 -99
  89. data/test/fixtures/quaderno_cassettes/rate_limit.yml +0 -46
  90. data/test/fixtures/quaderno_cassettes/unpay_an_expense.yml +0 -138
  91. data/test/fixtures/quaderno_cassettes/unpay_an_invoice.yml +0 -138
  92. data/test/fixtures/quaderno_cassettes/updated_contact.yml +0 -97
  93. data/test/fixtures/quaderno_cassettes/updated_contact_by_access_token.yml +0 -101
  94. data/test/fixtures/quaderno_cassettes/updated_contact_by_authentication_token.yml +0 -102
  95. data/test/fixtures/quaderno_cassettes/updated_estimate.yml +0 -185
  96. data/test/fixtures/quaderno_cassettes/updated_expense.yml +0 -184
  97. data/test/fixtures/quaderno_cassettes/updated_invoice.yml +0 -184
  98. data/test/fixtures/quaderno_cassettes/updated_item.yml +0 -93
  99. data/test/fixtures/quaderno_cassettes/updated_receipt.yml +0 -220
  100. data/test/fixtures/quaderno_cassettes/updated_webhook.yml +0 -175
  101. data/test/fixtures/quaderno_cassettes/validate_invalid_VAT_number.yml +0 -44
  102. data/test/fixtures/quaderno_cassettes/validate_valid_VAT_number.yml +0 -44
  103. data/test/helper.rb +0 -32
  104. data/test/unit/test_quaderno_contacts.rb +0 -83
  105. data/test/unit/test_quaderno_contacts_thread_safe.rb +0 -104
  106. data/test/unit/test_quaderno_estimates.rb +0 -155
  107. data/test/unit/test_quaderno_evidences.rb +0 -41
  108. data/test/unit/test_quaderno_expenses.rb +0 -162
  109. data/test/unit/test_quaderno_invoices.rb +0 -177
  110. data/test/unit/test_quaderno_items.rb +0 -84
  111. data/test/unit/test_quaderno_receipts.rb +0 -156
  112. data/test/unit/test_quaderno_tax.rb +0 -46
  113. data/test/unit/test_quaderno_webhooks.rb +0 -93
@@ -0,0 +1,4 @@
1
+ class Quaderno::CheckoutSession < Quaderno::Base
2
+ api_model Quaderno::CheckoutSession
3
+ api_path 'checkout/sessions'
4
+ end
@@ -1,4 +1,5 @@
1
1
  class Quaderno::Collection < Array
2
+ include Quaderno::Helpers::RateLimit
2
3
 
3
4
  def current_page=(page_number)
4
5
  @page = page_number
@@ -1,9 +1,7 @@
1
- module Quaderno
2
- class Contact < Base
3
- include Quaderno::Behavior::Retrieve
1
+ class Quaderno::Contact < Quaderno::Base
2
+ include Quaderno::Behavior::Retrieve
4
3
 
5
- api_model Quaderno::Contact
6
- api_path 'contacts'
7
- retrieve_path 'customers'
8
- end
9
- end
4
+ api_model Quaderno::Contact
5
+ api_path 'contacts'
6
+ retrieve_path 'customers'
7
+ end
@@ -1,13 +1,11 @@
1
- module Quaderno
2
- class Credit < Base
3
- include Quaderno::Behavior::Deliver
4
- include Quaderno::Behavior::Payment
5
- include Quaderno::Behavior::Retrieve
6
- include Quaderno::Behavior::Block
1
+ class Quaderno::Credit < Quaderno::Base
2
+ include Quaderno::Behavior::Deliver
3
+ include Quaderno::Behavior::Payment
4
+ include Quaderno::Behavior::Retrieve
5
+ include Quaderno::Behavior::Block
7
6
 
8
- api_model Quaderno::Credit
9
- api_path 'credits'
10
- retrieve_path 'refunds'
11
- is_a_document? true
12
- end
13
- end
7
+ api_model Quaderno::Credit
8
+ api_path 'credits'
9
+ retrieve_path 'refunds'
10
+ is_a_document? true
11
+ end
@@ -1,4 +1,2 @@
1
- module Quaderno
2
- class DocumentItem < OpenStruct
3
- end
1
+ class Quaderno::DocumentItem < OpenStruct
4
2
  end
@@ -1,9 +1,7 @@
1
- module Quaderno
2
- class Estimate < Base
3
- include Quaderno::Behavior::Deliver
1
+ class Quaderno::Estimate < Quaderno::Base
2
+ include Quaderno::Behavior::Deliver
4
3
 
5
- api_model Quaderno::Estimate
6
- api_path 'estimates'
7
- is_a_document? true
8
- end
4
+ api_model Quaderno::Estimate
5
+ api_path 'estimates'
6
+ is_a_document? true
9
7
  end
@@ -1,10 +1,8 @@
1
- module Quaderno
2
- class Evidence < Base
3
- api_model Quaderno::Evidence
4
- api_path 'evidences'
1
+ class Quaderno::Evidence < Quaderno::Base
2
+ api_model Quaderno::Evidence
3
+ api_path 'evidences'
5
4
 
6
- class << self
7
- undef :all, :find, :update, :delete, :parse_nested
8
- end
5
+ class << self
6
+ undef :all, :find, :update, :delete, :parse_nested
9
7
  end
10
8
  end
@@ -1,56 +1,62 @@
1
- module Quaderno
2
- module Exceptions
3
- class BaseException < StandardError
4
- end
1
+ module Quaderno::Exceptions
2
+ class BaseException < StandardError
3
+ include Quaderno::Helpers::RateLimit
4
+ end
5
5
 
6
- class InvalidSubdomainOrToken < BaseException
7
- end
6
+ class InvalidSubdomainOrToken < BaseException
7
+ end
8
8
 
9
- class InvalidID < BaseException
10
- end
9
+ class InvalidID < BaseException
10
+ end
11
11
 
12
- class RateLimitExceeded < BaseException
13
- end
12
+ class RateLimitExceeded < BaseException
13
+ end
14
14
 
15
- class HasAssociatedDocuments < BaseException
16
- end
15
+ class HasAssociatedDocuments < BaseException
16
+ end
17
17
 
18
- class RequiredFieldsEmptyOrInvalid < BaseException
19
- end
18
+ class RequiredFieldsEmptyOrInvalid < BaseException
19
+ end
20
20
 
21
- class ThrottleLimitExceeded < BaseException
22
- end
21
+ class ThrottleLimitExceeded < BaseException
22
+ end
23
23
 
24
- class UnsupportedApiVersion < BaseException
25
- end
24
+ class UnsupportedApiVersion < BaseException
25
+ end
26
26
 
27
- def self.included(receiver)
28
- receiver.send :extend, ClassMethods
29
- end
27
+ def self.included(receiver)
28
+ receiver.send :extend, ClassMethods
29
+ end
30
30
 
31
- module ClassMethods
32
- def check_exception_for(party_response, params = {})
33
- raise(Quaderno::Exceptions::UnsupportedApiVersion, 'Unsupported API version') if !!(party_response.body =~ /Unsupported API version/)
34
-
35
- if params[:throttle_limit].nil? == false
36
- raise(Quaderno::Exceptions::ThrottleLimitExceeded, 'Throttle limit exceeded, please try again later') if party_response.response.class == Net::HTTPServiceUnavailable
37
- end
38
- if params[:rate_limit].nil? == false
39
- raise(Quaderno::Exceptions::RateLimitExceeded, 'Rate limit exceeded') if party_response.response.class == Net::HTTPForbidden
40
- end
41
- if params[:subdomain_or_token].nil? == false
42
- raise(Quaderno::Exceptions::InvalidSubdomainOrToken, 'Invalid subdomain or token') if party_response.response.class == Net::HTTPUnauthorized
43
- end
44
- if params[:id].nil? == false
45
- raise(Quaderno::Exceptions::InvalidID, "Invalid #{ api_model } instance identifier") if (party_response.response.class == Net::HTTPInternalServerError) || (party_response.response.class == Net::HTTPNotFound)
46
- end
47
- if params[:required_fields].nil? == false
48
- raise(Quaderno::Exceptions::RequiredFieldsEmptyOrInvalid, party_response.body) if party_response.response.class == Net::HTTPUnprocessableEntity
49
- end
50
- if params[:has_documents].nil? == false
51
- raise(Quaderno::Exceptions::HasAssociatedDocuments, party_response.body) if party_response.response.class == Net::HTTPClientError
52
- end
31
+ module ClassMethods
32
+ def check_exception_for(party_response, params = {})
33
+ raise_exception(Quaderno::Exceptions::UnsupportedApiVersion, 'Unsupported API version', party_response) if !!(party_response.body =~ /Unsupported API version/)
34
+
35
+ if params[:throttle_limit].nil? == false && party_response.response.class == Net::HTTPServiceUnavailable
36
+ raise_exception(Quaderno::Exceptions::ThrottleLimitExceeded, 'Throttle limit exceeded, please try again later', party_response)
37
+ end
38
+ if params[:rate_limit].nil? == false && party_response.response.class == Net::HTTPForbidden
39
+ raise_exception(Quaderno::Exceptions::RateLimitExceeded, 'Rate limit exceeded', party_response)
40
+ end
41
+ if params[:subdomain_or_token].nil? == false
42
+ raise_exception(Quaderno::Exceptions::InvalidSubdomainOrToken, 'Invalid subdomain or token', party_response) if party_response.response.class == Net::HTTPUnauthorized
53
43
  end
44
+ if params[:id].nil? == false
45
+ raise_exception(Quaderno::Exceptions::InvalidID, "Invalid #{ api_model } instance identifier", party_response) if (party_response.response.class == Net::HTTPInternalServerError) || (party_response.response.class == Net::HTTPNotFound)
46
+ end
47
+ if params[:required_fields].nil? == false
48
+ raise_exception(Quaderno::Exceptions::RequiredFieldsEmptyOrInvalid, party_response.body, party_response) if party_response.response.class == Net::HTTPUnprocessableEntity
49
+ end
50
+ if params[:has_documents].nil? == false
51
+ raise_exception(Quaderno::Exceptions::HasAssociatedDocuments, party_response.body, party_response) if party_response.response.class == Net::HTTPClientError
52
+ end
53
+ end
54
+
55
+ def raise_exception(klass, message, response)
56
+ exception = klass.new(message)
57
+ exception.rate_limit_info = response
58
+
59
+ raise exception
54
60
  end
55
61
  end
56
- end
62
+ end
@@ -1,10 +1,8 @@
1
- module Quaderno
2
- class Expense < Base
3
- include Quaderno::Behavior::Payment
4
- include Quaderno::Behavior::Block
1
+ class Quaderno::Expense < Quaderno::Base
2
+ include Quaderno::Behavior::Payment
3
+ include Quaderno::Behavior::Block
5
4
 
6
- api_model Quaderno::Expense
7
- api_path 'expenses'
8
- is_a_document? true
9
- end
5
+ api_model Quaderno::Expense
6
+ api_path 'expenses'
7
+ is_a_document? true
10
8
  end
@@ -1,26 +1,24 @@
1
- module Quaderno
2
- module Helpers
3
- module Authentication
1
+ module Quaderno::Helpers
2
+ module Authentication
4
3
 
5
- def get_authentication(options = {})
6
- mode = options[:mode] || :production
4
+ def get_authentication(options = {})
5
+ mode = options[:mode] || :production
7
6
 
8
- local_api_model = options[:api_model]
9
- url = options[:api_url] || (local_api_model && local_api_model.url) || (mode == :production ? 'https://quadernoapp.com/api/' : 'http://sandbox-quadernoapp.com/api/')
7
+ local_api_model = options[:api_model]
8
+ url = options[:api_url] || (local_api_model && local_api_model.url) || (mode == :production ? 'https://quadernoapp.com/api/' : 'http://sandbox-quadernoapp.com/api/')
10
9
 
11
- auth_token = options[:auth_token] || options['auth_token'] || (local_api_model && local_api_model.auth_token)
12
- access_token = options[:access_token] || options['access_token']
10
+ auth_token = options[:auth_token] || options['auth_token'] || (local_api_model && local_api_model.auth_token)
11
+ access_token = options[:access_token] || options['access_token']
13
12
 
14
- authentication = { url: url, headers: {}, basic_auth: nil }
13
+ authentication = { url: url, headers: {}, basic_auth: nil }
15
14
 
16
- if access_token
17
- authentication[:headers] = { 'Authorization' => "Bearer #{access_token}" }
18
- elsif auth_token
19
- authentication[:basic_auth] = { username: auth_token }
20
- end
21
-
22
- authentication
15
+ if access_token
16
+ authentication[:headers] = { 'Authorization' => "Bearer #{access_token}" }
17
+ elsif auth_token
18
+ authentication[:basic_auth] = { username: auth_token }
23
19
  end
20
+
21
+ authentication
24
22
  end
25
23
  end
26
- end
24
+ end
@@ -0,0 +1,12 @@
1
+ module Quaderno::Helpers
2
+ module RateLimit
3
+
4
+ def rate_limit_info=(response)
5
+ @rate_limit_info = { reset: response.headers['x-ratelimit-reset'].to_i, remaining: response.headers["x-ratelimit-remaining"].to_i }
6
+ end
7
+
8
+ def rate_limit_info
9
+ @rate_limit_info
10
+ end
11
+ end
12
+ end
@@ -1,13 +1,11 @@
1
- module Quaderno
2
- class Income < Base
3
- include Quaderno::Behavior::Block
1
+ class Quaderno::Income < Quaderno::Base
2
+ include Quaderno::Behavior::Block
4
3
 
5
- class << self
6
- undef :find, :update, :delete
7
- end
8
-
9
- api_model Quaderno::Income
10
- api_path 'income'
11
- is_a_document? true
4
+ class << self
5
+ undef :find, :update, :delete
12
6
  end
7
+
8
+ api_model Quaderno::Income
9
+ api_path 'income'
10
+ is_a_document? true
13
11
  end
@@ -1,13 +1,11 @@
1
- module Quaderno
2
- class Invoice < Base
3
- include Quaderno::Behavior::Deliver
4
- include Quaderno::Behavior::Payment
5
- include Quaderno::Behavior::Retrieve
6
- include Quaderno::Behavior::Block
1
+ class Quaderno::Invoice < Quaderno::Base
2
+ include Quaderno::Behavior::Deliver
3
+ include Quaderno::Behavior::Payment
4
+ include Quaderno::Behavior::Retrieve
5
+ include Quaderno::Behavior::Block
7
6
 
8
- api_model Quaderno::Invoice
9
- api_path 'invoices'
10
- retrieve_path 'charges'
11
- is_a_document? true
12
- end
7
+ api_model Quaderno::Invoice
8
+ api_path 'invoices'
9
+ retrieve_path 'charges'
10
+ is_a_document? true
13
11
  end
@@ -1,7 +1,4 @@
1
- module Quaderno
2
- class Item < Base
3
-
4
- api_model Quaderno::Item
5
- api_path 'items'
6
- end
1
+ class Quaderno::Item < Quaderno::Base
2
+ api_model Quaderno::Item
3
+ api_path 'items'
7
4
  end
@@ -1,4 +1,3 @@
1
- module Quaderno
2
- class Payment < OpenStruct
3
- end
1
+ class Quaderno::Payment < OpenStruct
2
+ include Quaderno::Helpers::RateLimit
4
3
  end
@@ -1,10 +1,8 @@
1
- module Quaderno
2
- class Receipt < Base
3
- include Quaderno::Behavior::Deliver
4
- include Quaderno::Behavior::Block
1
+ class Quaderno::Receipt < Quaderno::Base
2
+ include Quaderno::Behavior::Deliver
3
+ include Quaderno::Behavior::Block
5
4
 
6
- api_model Quaderno::Receipt
7
- api_path 'receipts'
8
- is_a_document? true
9
- end
5
+ api_model Quaderno::Receipt
6
+ api_path 'receipts'
7
+ is_a_document? true
10
8
  end
@@ -1,8 +1,5 @@
1
- module Quaderno
2
- class Recurring < Base
3
-
4
- api_model Quaderno::Recurring
5
- api_path 'recurring'
6
- is_a_document? true
7
- end
1
+ class Quaderno::Recurring < Quaderno::Base
2
+ api_model Quaderno::Recurring
3
+ api_path 'recurring'
4
+ is_a_document? true
8
5
  end
@@ -1,40 +1,78 @@
1
- module Quaderno
2
- class Report < Base
3
- api_model Quaderno::Report
4
- api_path 'reports'
1
+ class Quaderno::Report < Quaderno::Base
2
+ api_model Quaderno::Report
3
+ api_path 'reports'
5
4
 
6
- class << self
7
- undef :all, :find, :create, :update, :delete, :parse_nested
8
- end
5
+ class << self
6
+ undef :all, :find, :create, :update, :delete, :parse_nested
7
+ end
8
+
9
+ def self.journal(options = {})
10
+ authentication = get_authentication(options.merge(api_model: api_model))
11
+ filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
12
+
13
+ response = get("#{authentication[:url]}#{api_model.api_path}/journal.json",
14
+ query: filter,
15
+ basic_auth: authentication[:basic_auth],
16
+ headers: version_header.merge(authentication[:headers])
17
+ )
18
+
19
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
20
+
21
+ response.parsed_response
22
+ end
23
+
24
+ def self.taxes(options = {})
25
+ authentication = get_authentication(options.merge(api_model: api_model))
26
+ filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
27
+
28
+ response = get("#{authentication[:url]}#{api_model.api_path}/taxes.json",
29
+ query: filter,
30
+ basic_auth: authentication[:basic_auth],
31
+ headers: version_header.merge(authentication[:headers])
32
+ )
9
33
 
10
- def self.journal(options = {})
11
- authentication = get_authentication(options.merge(api_model: api_model))
12
- filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
34
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
35
+
36
+ response.parsed_response
37
+ end
13
38
 
14
- response = get("#{authentication[:url]}#{api_model.api_path}/journal.json",
15
- query: filter,
16
- basic_auth: authentication[:basic_auth],
17
- headers: version_header.merge(authentication[:headers])
18
- )
39
+ def self.domestic_taxes(options = {})
40
+ request_tax_report('domestic_taxes', options)
41
+ end
42
+
43
+ def self.sales_taxes(options = {})
44
+ request_tax_report('sales_taxes', options)
45
+ end
46
+
47
+ def self.vat_moss(options = {})
48
+ request_tax_report('vat_moss', options)
49
+ end
50
+
51
+ def self.ec_sales(options = {})
52
+ request_tax_report('ec_sales', options)
53
+ end
54
+
55
+ def self.international_taxes(options = {})
56
+ request_tax_report('international_taxes', options)
57
+ end
19
58
 
20
- check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
59
+ private
21
60
 
22
- response.parsed_response
23
- end
61
+ def self.request_tax_report(tax_report_type, options)
62
+ authentication = get_authentication(options.merge(api_model: api_model))
63
+ filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
24
64
 
25
- def self.taxes(options = {})
26
- authentication = get_authentication(options.merge(api_model: api_model))
27
- filter = options.delete_if { |k,v| %w(auth_token access_token api_url mode api_model).include? k.to_s }
65
+ response = get("#{authentication[:url]}#{api_model.api_path}/#{tax_report_type}.json",
66
+ query: filter,
67
+ basic_auth: authentication[:basic_auth],
68
+ headers: version_header.merge(authentication[:headers])
69
+ )
28
70
 
29
- response = get("#{authentication[:url]}#{api_model.api_path}/taxes.json",
30
- query: filter,
31
- basic_auth: authentication[:basic_auth],
32
- headers: version_header.merge(authentication[:headers])
33
- )
71
+ check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
34
72
 
35
- check_exception_for(response, { rate_limit: true, subdomain_or_token: true })
73
+ collection = Array.new
74
+ response.parsed_response.each { |tax_report| collection << self.new(tax_report) }
36
75
 
37
- response.parsed_response
38
- end
76
+ collection
39
77
  end
40
78
  end