mollie-api-ruby 2.2.0 → 2.2.1

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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +15 -2
  4. data/examples/apis/api_docs.rb +37 -0
  5. data/examples/apis/connect.rb +58 -0
  6. data/examples/apis/customers.rb +115 -0
  7. data/examples/apis/invoices.rb +38 -0
  8. data/examples/apis/issuers.rb +35 -0
  9. data/examples/apis/mandates.rb +83 -0
  10. data/examples/apis/methods.rb +50 -0
  11. data/examples/apis/organizations.rb +16 -0
  12. data/examples/apis/payments.rb +140 -0
  13. data/examples/apis/permissions.rb +32 -0
  14. data/examples/apis/profiles.rb +126 -0
  15. data/examples/apis/refunds.rb +17 -0
  16. data/examples/apis/settlements.rb +84 -0
  17. data/examples/apis/subscriptions.rb +165 -0
  18. data/examples/config.ru +58 -0
  19. data/examples/public/images/collapse.gif +0 -0
  20. data/examples/public/images/expand.gif +0 -0
  21. data/examples/public/images/explorer_icons.png +0 -0
  22. data/examples/public/images/favicon-16x16.png +0 -0
  23. data/examples/public/images/favicon-32x32.png +0 -0
  24. data/examples/public/images/favicon.ico +0 -0
  25. data/examples/public/images/logo_small.png +0 -0
  26. data/examples/public/images/pet_store_api.png +0 -0
  27. data/examples/public/images/throbber.gif +0 -0
  28. data/examples/public/images/wordnik_api.png +0 -0
  29. data/examples/public/index.html +101 -0
  30. data/examples/public/javascripts/lib/backbone-min.js +1 -0
  31. data/examples/public/javascripts/lib/es5-shim.js +1 -0
  32. data/examples/public/javascripts/lib/handlebars-4.0.5.js +3 -0
  33. data/examples/public/javascripts/lib/highlight.9.1.0.pack.js +1 -0
  34. data/examples/public/javascripts/lib/highlight.9.1.0.pack_extended.js +1 -0
  35. data/examples/public/javascripts/lib/jquery-1.8.0.min.js +3 -0
  36. data/examples/public/javascripts/lib/jquery.ba-bbq.min.js +1 -0
  37. data/examples/public/javascripts/lib/jquery.slideto.min.js +1 -0
  38. data/examples/public/javascripts/lib/jquery.wiggle.min.js +1 -0
  39. data/examples/public/javascripts/lib/js-yaml.min.js +2 -0
  40. data/examples/public/javascripts/lib/jsoneditor.min.js +5 -0
  41. data/examples/public/javascripts/lib/lodash.min.js +2 -0
  42. data/examples/public/javascripts/lib/marked.js +1 -0
  43. data/examples/public/javascripts/lib/object-assign-pollyfill.js +1 -0
  44. data/examples/public/javascripts/lib/sanitize-html.min.js +4 -0
  45. data/examples/public/javascripts/lib/swagger-oauth.js +1 -0
  46. data/examples/public/javascripts/swagger-ui.js +25378 -0
  47. data/examples/public/javascripts/swagger-ui.min.js +15 -0
  48. data/examples/public/javascripts/swagger_docs.js +14 -0
  49. data/examples/public/o2c.html +20 -0
  50. data/examples/public/stylesheets/reset.css +1 -0
  51. data/examples/public/stylesheets/screen.css +1545 -0
  52. data/examples/public/stylesheets/swagger_docs.css +4 -0
  53. data/examples/public/stylesheets/typography.css +0 -0
  54. data/lib/mollie/api/client.rb +42 -22
  55. data/lib/mollie/api/client/version.rb +1 -1
  56. data/lib/mollie/api/object/invoice.rb +70 -0
  57. data/lib/mollie/api/object/method.rb +1 -0
  58. data/lib/mollie/api/object/organization.rb +1 -1
  59. data/lib/mollie/api/object/payment.rb +21 -7
  60. data/lib/mollie/api/object/payment/refund.rb +5 -1
  61. data/lib/mollie/api/resource/base.rb +6 -6
  62. data/lib/mollie/api/resource/invoices.rb +11 -0
  63. data/lib/mollie/api/resource/permissions.rb +20 -0
  64. data/lib/mollie/api/resource/profiles/apikeys.rb +6 -0
  65. data/lib/mollie/api/resource/refunds.rb +11 -0
  66. data/lib/mollie/api/resource/settlements.rb +8 -0
  67. data/lib/mollie/api/resource/settlements/payments.rb +27 -0
  68. data/mollie.gemspec +7 -0
  69. data/test/mollie/api/client_test.rb +12 -5
  70. data/test/mollie/api/object/invoice_test.rb +59 -0
  71. data/test/mollie/api/object/organization_test.rb +0 -6
  72. data/test/mollie/api/object/payment_test.rb +15 -0
  73. data/test/mollie/api/resource/invoices_test.rb +13 -0
  74. metadata +159 -12
  75. data/examples/1-new-payment.rb +0 -56
  76. data/examples/2-webhook-verification.rb +0 -41
  77. data/examples/3-return-page.rb +0 -21
  78. data/examples/4-ideal-payment.rb +0 -79
  79. data/examples/5-payments-history.rb +0 -27
  80. data/examples/6-list-activated-methods.rb +0 -30
  81. data/examples/7-refund-payment.rb +0 -40
  82. data/examples/app.rb +0 -58
  83. data/examples/orders/.gitignore +0 -1
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= require typography
3
+ *= require screen
4
+ */
@@ -2,6 +2,7 @@ require "json"
2
2
  require "time"
3
3
  require "ostruct"
4
4
  require "bigdecimal"
5
+ require "net/https"
5
6
 
6
7
  ["exception",
7
8
  "util",
@@ -11,20 +12,24 @@ require "bigdecimal"
11
12
  "resource/customers/mandates",
12
13
  "resource/customers/payments",
13
14
  "resource/customers/subscriptions",
15
+ "resource/invoices",
14
16
  "resource/issuers",
15
17
  "resource/methods",
16
18
  "resource/organizations",
17
19
  "resource/payments",
18
20
  "resource/payments/refunds",
21
+ "resource/refunds",
19
22
  "resource/permissions",
20
23
  "resource/profiles",
21
24
  "resource/profiles/apikeys",
22
25
  "resource/settlements",
26
+ "resource/settlements/payments",
23
27
  "object/base",
24
28
  "object/list",
25
29
  "object/customer",
26
30
  "object/customer/mandate",
27
31
  "object/customer/subscription",
32
+ "object/invoice",
28
33
  "object/issuer",
29
34
  "object/method",
30
35
  "object/organization",
@@ -46,8 +51,8 @@ module Mollie
46
51
 
47
52
  attr_accessor :api_key
48
53
  attr_reader :customers, :customers_payments, :customers_mandates, :customers_subscriptions,
49
- :issuers, :methods, :organizations, :payments, :payments_refunds,
50
- :permissions, :profiles, :profiles_api_keys, :settlements,
54
+ :issuers, :methods, :organizations, :payments, :payments_refunds, :refunds,
55
+ :permissions, :profiles, :profiles_api_keys, :settlements, :settlements_payments, :invoices,
51
56
  :api_endpoint
52
57
 
53
58
  def initialize(api_key)
@@ -60,10 +65,13 @@ module Mollie
60
65
  @organizations = Mollie::API::Resource::Organizations.new self
61
66
  @payments = Mollie::API::Resource::Payments.new self
62
67
  @payments_refunds = Mollie::API::Resource::Payments::Refunds.new self
68
+ @refunds = Mollie::API::Resource::Refunds.new self
63
69
  @permissions = Mollie::API::Resource::Permissions.new self
64
70
  @profiles = Mollie::API::Resource::Profiles.new self
65
71
  @profiles_api_keys = Mollie::API::Resource::Profiles::ApiKeys.new self
66
72
  @settlements = Mollie::API::Resource::Settlements.new self
73
+ @settlements_payments = Mollie::API::Resource::Settlements::Payments.new self
74
+ @invoices = Mollie::API::Resource::Invoices.new self
67
75
 
68
76
  @api_endpoint = API_ENDPOINT
69
77
  @api_key = api_key
@@ -84,44 +92,56 @@ module Mollie
84
92
 
85
93
  def perform_http_call(http_method, api_method, id = nil, http_body = {}, query = {})
86
94
  path = "/#{API_VERSION}/#{api_method}/#{id}".chomp('/')
87
- path += "?#{URI.encode_www_form(query)}" if query.length > 0
95
+ if query.length > 0
96
+ camelized_query = Util.camelize_keys(query)
97
+ path += "?#{URI.encode_www_form(camelized_query)}"
98
+ end
88
99
 
89
100
  case http_method
90
- when 'GET'
91
- request = Net::HTTP::Get.new(path)
92
- when 'POST'
93
- http_body.delete_if { |k, v| v.nil? }
94
- request = Net::HTTP::Post.new(path)
95
- request.body = Util.camelize_keys(http_body).to_json
96
- when 'DELETE'
97
- request = Net::HTTP::Delete.new(path)
98
- else
99
- raise Mollie::API::Exception.new("Invalid HTTP Method: #{http_method}")
101
+ when 'GET'
102
+ request = Net::HTTP::Get.new(path)
103
+ when 'POST'
104
+ http_body.delete_if { |k, v| v.nil? }
105
+ request = Net::HTTP::Post.new(path)
106
+ request.body = Util.camelize_keys(http_body).to_json
107
+ when 'DELETE'
108
+ http_body.delete_if { |k, v| v.nil? }
109
+ request = Net::HTTP::Delete.new(path)
110
+ request.body = Util.camelize_keys(http_body).to_json
111
+ else
112
+ raise Mollie::API::Exception.new("Invalid HTTP Method: #{http_method}")
100
113
  end
101
114
 
102
115
  request['Accept'] = 'application/json'
116
+ request['Content-Type'] = 'application/json'
103
117
  request['Authorization'] = "Bearer #{@api_key}"
104
118
  request['User-Agent'] = @version_strings.join(" ")
105
119
 
106
120
  begin
107
121
  response = client.request(request)
108
122
  rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError,
109
- Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
123
+ Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e
110
124
  raise Mollie::API::Exception.new(e.message)
111
125
  end
112
126
 
113
127
  http_code = response.code.to_i
114
128
  case http_code
115
- when 200, 201
116
- Util.nested_underscore_keys(JSON.parse(response.body))
117
- when 204
118
- {} # No Content
119
- else
120
- response = JSON.parse(response.body)
129
+ when 200, 201
130
+ Util.nested_underscore_keys(JSON.parse(response.body))
131
+ when 204
132
+ {} # No Content
133
+ else
134
+ response = JSON.parse(response.body)
135
+ if response['error']
121
136
  exception = Mollie::API::Exception.new response['error']['message']
122
- exception.code = http_code
123
137
  exception.field = response['error']['field'] unless response['error']['field'].nil?
124
- raise exception
138
+ elsif response['errors']
139
+ exception = Mollie::API::Exception.new response['errors'].values.join(", ")
140
+ else
141
+ exception = Mollie::API::Exception.new response.body
142
+ end
143
+ exception.code = http_code
144
+ raise exception
125
145
  end
126
146
  end
127
147
 
@@ -1,7 +1,7 @@
1
1
  module Mollie
2
2
  module API
3
3
  class Client
4
- VERSION = "2.2.0"
4
+ VERSION = "2.2.1"
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,70 @@
1
+ module Mollie
2
+ module API
3
+ module Object
4
+ class Invoice < Base
5
+ STATUS_OPEN = "open"
6
+ STATUS_PAID = "paid"
7
+ STATUS_OVERDUE = "overdue"
8
+
9
+ class Amount < Base
10
+ attr_accessor :net, :vat, :gross
11
+
12
+ def net=(net)
13
+ @net = BigDecimal.new(net.to_s)
14
+ end
15
+
16
+ def vat=(vat)
17
+ @vat = BigDecimal.new(vat.to_s, 2)
18
+ end
19
+
20
+ def gross=(gross)
21
+ @gross = BigDecimal.new(gross.to_s)
22
+ end
23
+ end
24
+
25
+ class Line < Base
26
+ attr_accessor :period, :description, :count, :vat_percentage, :amount
27
+
28
+ def amount=(amount)
29
+ @amount = BigDecimal.new(amount.to_s)
30
+ end
31
+ end
32
+
33
+ attr_accessor :resource, :id, :reference, :vat_number, :status,
34
+ :issue_date, :due_date, :amount, :lines, :links
35
+
36
+ def open?
37
+ status == STATUS_OPEN
38
+ end
39
+
40
+ def paid?
41
+ status == STATUS_PAID
42
+ end
43
+
44
+ def overdue?
45
+ status == STATUS_OVERDUE
46
+ end
47
+
48
+ def amount=(amount)
49
+ @amount = Amount.new(amount)
50
+ end
51
+
52
+ def issue_date=(issue_date)
53
+ @issue_date = Time.parse(issue_date) rescue nil
54
+ end
55
+
56
+ def due_date=(due_date)
57
+ @due_date = Time.parse(due_date) rescue nil
58
+ end
59
+
60
+ def lines=(lines)
61
+ @lines = lines.map { |line| Line.new(line) }
62
+ end
63
+
64
+ def pdf
65
+ links && links['pdf']
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -14,6 +14,7 @@ module Mollie
14
14
  BELFIUS = "belfius"
15
15
  PAYSAFECARD = "paysafecard"
16
16
  PODIUMCADEAUKAART = "podiumcadeaukaart"
17
+ GIFTCARD = "giftcard"
17
18
 
18
19
  attr_accessor :id,
19
20
  :description,
@@ -16,7 +16,7 @@ module Mollie
16
16
  :verified_datetime
17
17
 
18
18
  def registration_datetime=(registration_datetime)
19
- @registration_datetime = Time.parse(registration_datetime.to_s)
19
+ @registration_datetime = Time.parse(registration_datetime.to_s) rescue nil
20
20
  end
21
21
 
22
22
  def verified_datetime=(verified_datetime)
@@ -2,13 +2,15 @@ module Mollie
2
2
  module API
3
3
  module Object
4
4
  class Payment < Base
5
- STATUS_OPEN = "open"
6
- STATUS_CANCELLED = "cancelled"
7
- STATUS_EXPIRED = "expired"
8
- STATUS_PAID = "paid"
9
- STATUS_PAIDOUT = "paidout"
10
- STATUS_FAILED = "failed"
11
- STATUS_REFUNDED = "refunded"
5
+ STATUS_OPEN = "open"
6
+ STATUS_CANCELLED = "cancelled"
7
+ STATUS_EXPIRED = "expired"
8
+ STATUS_PAID = "paid"
9
+ STATUS_PAIDOUT = "paidout"
10
+ STATUS_FAILED = "failed"
11
+ STATUS_REFUNDED = "refunded"
12
+ STATUS_PENDING = "pending"
13
+ STATUS_CHARGED_BACK = "charged_back"
12
14
 
13
15
  RECURRINGTYPE_NONE = nil
14
16
  RECURRINGTYPE_FIRST = "first"
@@ -62,6 +64,18 @@ module Mollie
62
64
  status == STATUS_REFUNDED
63
65
  end
64
66
 
67
+ def failed?
68
+ status == STATUS_FAILED
69
+ end
70
+
71
+ def pending?
72
+ status == STATUS_PENDING
73
+ end
74
+
75
+ def charged_back?
76
+ status == STATUS_CHARGED_BACK
77
+ end
78
+
65
79
  def details=(details)
66
80
  @details = OpenStruct.new(details) if details.is_a?(Hash)
67
81
  end
@@ -3,6 +3,7 @@ module Mollie
3
3
  module Object
4
4
  class Payment
5
5
  class Refund < Base
6
+ STATUS_QUEUED = "queued"
6
7
  STATUS_PENDING = "pending"
7
8
  STATUS_PROCESSING = "processing"
8
9
  STATUS_REFUNDED = "refunded"
@@ -12,7 +13,10 @@ module Mollie
12
13
  :amount,
13
14
  :status,
14
15
  :refunded_datetime
15
-
16
+ def queued?
17
+ status == STATUS_QUEUED
18
+ end
19
+
16
20
  def pending?
17
21
  status == STATUS_PENDING
18
22
  end
@@ -16,8 +16,8 @@ module Mollie
16
16
  }
17
17
  end
18
18
 
19
- def get(id)
20
- request("GET", id, {}) { |response|
19
+ def get(id, options = {})
20
+ request("GET", id, {}, options) { |response|
21
21
  new_resource_object response
22
22
  }
23
23
  end
@@ -28,12 +28,12 @@ module Mollie
28
28
  }
29
29
  end
30
30
 
31
- def delete(id)
32
- request "DELETE", id, {}
31
+ def delete(id, options = {})
32
+ request "DELETE", id, options
33
33
  end
34
34
 
35
- def all(offset = 0, limit = 50)
36
- request("GET", nil, {}, { offset: offset, count: limit }) { |response|
35
+ def all(offset = 0, limit = 50, options = {})
36
+ request("GET", nil, {}, { offset: offset, count: limit }.merge(options)) { |response|
37
37
  Object::List.new response, resource_object
38
38
  }
39
39
  end
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Invoices < Base
5
+ def resource_object
6
+ Object::Invoice
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -2,6 +2,26 @@ module Mollie
2
2
  module API
3
3
  module Resource
4
4
  class Permissions < Base
5
+ def self.available
6
+ %w(
7
+ payments.read
8
+ payments.write
9
+ refunds.read
10
+ refunds.write
11
+ customers.read
12
+ customers.write
13
+ mandates.read
14
+ mandates.write
15
+ subscriptions.read
16
+ subscriptions.write
17
+ profiles.read
18
+ profiles.write
19
+ invoices.read
20
+ settlements.read
21
+ organizations.read
22
+ organizations.write)
23
+ end
24
+
5
25
  def resource_object
6
26
  Object::Permission
7
27
  end
@@ -20,6 +20,12 @@ module Mollie
20
20
  @profile_id = profile_or_id.is_a?(Object::Profile) ? profile_or_id.id : profile_or_id
21
21
  self
22
22
  end
23
+
24
+ def create(mode)
25
+ request("POST", mode, {}) { |response|
26
+ new_resource_object response
27
+ }
28
+ end
23
29
  end
24
30
  end
25
31
  end
@@ -0,0 +1,11 @@
1
+ module Mollie
2
+ module API
3
+ module Resource
4
+ class Refunds < Base
5
+ def resource_object
6
+ Object::Payment::Refund
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -5,6 +5,14 @@ module Mollie
5
5
  def resource_object
6
6
  Object::Settlement
7
7
  end
8
+
9
+ def next(options = {})
10
+ get("next", options)
11
+ end
12
+
13
+ def open(options = {})
14
+ get("open", options)
15
+ end
8
16
  end
9
17
  end
10
18
  end
@@ -0,0 +1,27 @@
1
+ require 'open-uri'
2
+
3
+ module Mollie
4
+ module API
5
+ module Resource
6
+ class Settlements
7
+ class Payments < Base
8
+ @settlement_id = nil
9
+
10
+ def resource_object
11
+ Object::Payment
12
+ end
13
+
14
+ def resource_name
15
+ settlement_id = URI::encode(@settlement_id)
16
+ "settlements/#{settlement_id}/payments"
17
+ end
18
+
19
+ def with(settlement_or_id)
20
+ @settlement_id = settlement_or_id.is_a?(Object::Settlement) ? settlement_or_id.id : settlement_or_id
21
+ self
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -23,4 +23,11 @@ Gem::Specification.new do |s|
23
23
  s.add_development_dependency("rake")
24
24
  s.add_development_dependency("test-unit")
25
25
  s.add_development_dependency("webmock")
26
+ s.add_development_dependency("thin")
27
+ s.add_development_dependency("sinatra")
28
+ s.add_development_dependency("sinatra-contrib")
29
+ s.add_development_dependency("sinatra-cross_origin")
30
+ s.add_development_dependency("rack-oauth2")
31
+ s.add_development_dependency("swagger-blocks")
32
+ s.add_development_dependency("ngrok-tunnel")
26
33
  end