recurly 2.18.15 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +158 -110
  8. data/Rakefile +6 -0
  9. data/bin/bundle +105 -0
  10. data/bin/coderay +29 -0
  11. data/bin/console +14 -0
  12. data/bin/htmldiff +29 -0
  13. data/bin/ldiff +29 -0
  14. data/bin/pry +29 -0
  15. data/bin/rake +29 -0
  16. data/bin/rspec +29 -0
  17. data/bin/setup +8 -0
  18. data/bin/yard +29 -0
  19. data/bin/yardoc +29 -0
  20. data/bin/yri +29 -0
  21. data/lib/data/ca-certificates.crt +31 -0
  22. data/lib/recurly.rb +14 -145
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/client/operations.rb +935 -0
  25. data/lib/recurly/errors.rb +34 -0
  26. data/lib/recurly/errors/api_errors.rb +35 -0
  27. data/lib/recurly/errors/network_errors.rb +8 -0
  28. data/lib/recurly/pager.rb +119 -0
  29. data/lib/recurly/request.rb +30 -0
  30. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  31. data/lib/recurly/requests/account_create_only.rb +18 -0
  32. data/lib/recurly/requests/account_updatable.rb +50 -0
  33. data/lib/recurly/requests/add_on_create.rb +38 -0
  34. data/lib/recurly/requests/add_on_update.rb +38 -0
  35. data/lib/recurly/requests/address.rb +42 -0
  36. data/lib/recurly/requests/billing_info_create.rb +58 -0
  37. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  38. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  39. data/lib/recurly/requests/create_account.rb +62 -0
  40. data/lib/recurly/requests/create_coupon.rb +90 -0
  41. data/lib/recurly/requests/invoice_create.rb +42 -0
  42. data/lib/recurly/requests/invoice_refund.rb +30 -0
  43. data/lib/recurly/requests/line_item_create.rb +46 -0
  44. data/lib/recurly/requests/plan_create.rb +66 -0
  45. data/lib/recurly/requests/plan_update.rb +70 -0
  46. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  47. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  48. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  49. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  50. data/lib/recurly/requests/subscription_create.rb +86 -0
  51. data/lib/recurly/requests/subscription_update.rb +42 -0
  52. data/lib/recurly/requests/update_coupon.rb +30 -0
  53. data/lib/recurly/resource.rb +16 -1103
  54. data/lib/recurly/resources/account.rb +86 -0
  55. data/lib/recurly/resources/account_acquisition.rb +42 -0
  56. data/lib/recurly/resources/account_balance.rb +22 -0
  57. data/lib/recurly/resources/account_note.rb +30 -0
  58. data/lib/recurly/resources/add_on.rb +62 -0
  59. data/lib/recurly/resources/address.rb +42 -0
  60. data/lib/recurly/resources/billing_info.rb +62 -0
  61. data/lib/recurly/resources/coupon.rb +110 -0
  62. data/lib/recurly/resources/coupon_discount.rb +22 -0
  63. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  64. data/lib/recurly/resources/credit_payment.rb +62 -0
  65. data/lib/recurly/resources/error.rb +18 -0
  66. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  67. data/lib/recurly/resources/invoice.rb +138 -0
  68. data/lib/recurly/resources/invoice_collection.rb +18 -0
  69. data/lib/recurly/resources/line_item.rb +166 -0
  70. data/lib/recurly/resources/plan.rb +86 -0
  71. data/lib/recurly/resources/settings.rb +18 -0
  72. data/lib/recurly/resources/shipping_address.rb +74 -0
  73. data/lib/recurly/resources/site.rb +46 -0
  74. data/lib/recurly/resources/subscription.rb +134 -0
  75. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  76. data/lib/recurly/resources/subscription_change.rb +54 -0
  77. data/lib/recurly/resources/tax_info.rb +18 -0
  78. data/lib/recurly/resources/transaction.rb +146 -0
  79. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  80. data/lib/recurly/resources/user.rb +38 -0
  81. data/lib/recurly/schema.rb +114 -0
  82. data/lib/recurly/schema/json_deserializer.rb +53 -0
  83. data/lib/recurly/schema/json_parser.rb +71 -0
  84. data/lib/recurly/schema/request_caster.rb +66 -0
  85. data/lib/recurly/schema/schema_factory.rb +50 -0
  86. data/lib/recurly/schema/schema_validator.rb +125 -0
  87. data/lib/recurly/version.rb +1 -10
  88. data/recurly.gemspec +32 -0
  89. data/scripts/build +4 -0
  90. data/scripts/clean +6 -0
  91. data/scripts/test +3 -0
  92. metadata +121 -245
  93. data/lib/recurly/account.rb +0 -190
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -21
  96. data/lib/recurly/add_on.rb +0 -44
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -81
  99. data/lib/recurly/api.rb +0 -110
  100. data/lib/recurly/api/errors.rb +0 -208
  101. data/lib/recurly/api/net_http_adapter.rb +0 -111
  102. data/lib/recurly/billing_info.rb +0 -109
  103. data/lib/recurly/coupon.rb +0 -134
  104. data/lib/recurly/credit_payment.rb +0 -32
  105. data/lib/recurly/custom_field.rb +0 -15
  106. data/lib/recurly/delivery.rb +0 -19
  107. data/lib/recurly/error.rb +0 -13
  108. data/lib/recurly/gift_card.rb +0 -85
  109. data/lib/recurly/helper.rb +0 -51
  110. data/lib/recurly/invoice.rb +0 -297
  111. data/lib/recurly/invoice_collection.rb +0 -14
  112. data/lib/recurly/item.rb +0 -36
  113. data/lib/recurly/js.rb +0 -14
  114. data/lib/recurly/juris_detail.rb +0 -15
  115. data/lib/recurly/measured_unit.rb +0 -16
  116. data/lib/recurly/money.rb +0 -120
  117. data/lib/recurly/note.rb +0 -14
  118. data/lib/recurly/plan.rb +0 -43
  119. data/lib/recurly/purchase.rb +0 -234
  120. data/lib/recurly/redemption.rb +0 -46
  121. data/lib/recurly/resource/association.rb +0 -16
  122. data/lib/recurly/resource/errors.rb +0 -20
  123. data/lib/recurly/resource/pager.rb +0 -313
  124. data/lib/recurly/shipping_address.rb +0 -26
  125. data/lib/recurly/shipping_fee.rb +0 -17
  126. data/lib/recurly/shipping_method.rb +0 -13
  127. data/lib/recurly/subscription.rb +0 -365
  128. data/lib/recurly/subscription/add_ons.rb +0 -82
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -16
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction.rb +0 -131
  134. data/lib/recurly/transaction/errors.rb +0 -115
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook.rb +0 -111
  138. data/lib/recurly/webhook/account_notification.rb +0 -13
  139. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  140. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  143. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  146. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  147. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  148. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  149. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  150. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  152. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  153. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  154. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  155. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  156. data/lib/recurly/webhook/item_notification.rb +0 -7
  157. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  167. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  168. data/lib/recurly/webhook/notification.rb +0 -18
  169. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  172. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  173. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  175. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  176. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  177. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  178. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  179. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  180. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  181. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  182. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  183. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  184. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  185. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  186. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  187. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  188. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  189. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  192. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  194. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  196. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  197. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  199. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  200. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  204. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  205. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  207. data/lib/recurly/xml.rb +0 -122
  208. data/lib/recurly/xml/nokogiri.rb +0 -60
  209. data/lib/recurly/xml/rexml.rb +0 -52
@@ -1,208 +0,0 @@
1
- require 'cgi'
2
-
3
- module Recurly
4
- class API
5
- # The superclass to all errors that occur when making an API request.
6
- class ResponseError < Error
7
- attr_reader :request
8
- attr_reader :response
9
-
10
- def initialize request, response
11
- @request, @response = request, response
12
- end
13
-
14
- def code
15
- response.code.to_i if response
16
- end
17
-
18
- def to_s
19
- if description
20
- return CGI.unescapeHTML [description, details].compact.join(' ')
21
- end
22
-
23
- return super unless code
24
- "%d %s (%s %s)" % [
25
- code, http_error, request.method, API.base_uri + request.path
26
- ]
27
- end
28
-
29
- def symbol
30
- xml and xml.root and xml.text '/error/symbol'
31
- end
32
-
33
- def description
34
- xml and xml.root and xml.text '/error/description'
35
- end
36
-
37
- def details
38
- xml and xml.root and xml.text '/error/details'
39
- end
40
-
41
- private
42
-
43
- def http_error
44
- Helper.demodulize self.class.name.gsub(/([a-z])([A-Z])/, '\1 \2')
45
- end
46
-
47
- def xml
48
- @xml ||= begin
49
- XML.new(response.body) if response and response.body and not response.body.empty?
50
- rescue Recurly::XML::ParseError
51
- nil
52
- end
53
- end
54
- end
55
-
56
- # === 3xx Redirection
57
- #
58
- # Not an error, per se, but should result in one in the normal course of
59
- # API interaction.
60
- class Redirection < ResponseError
61
- end
62
-
63
- # === 304 Not Modified
64
- #
65
- # Catchably raised when a request is made with an ETag.
66
- class NotModified < ResponseError
67
- end
68
-
69
- # === 4xx Client Error
70
- #
71
- # The superclass to all client errors (responses with status code 4xx).
72
- class ClientError < ResponseError
73
- end
74
-
75
- # === 400 Bad Request
76
- #
77
- # The request was invalid or could not be understood by the server.
78
- # Resubmitting the request will likely result in the same error.
79
- class BadRequest < ClientError
80
- end
81
-
82
- # === 401 Unauthorized
83
- #
84
- # The API key is missing or invalid for the given request.
85
- class Unauthorized < ClientError
86
- def description
87
- response.body.strip
88
- end
89
- end
90
-
91
- # === 402 Payment Required
92
- #
93
- # Your Recurly account is in production mode but is not in good standing.
94
- # Please pay any outstanding invoices.
95
- class PaymentRequired < ClientError
96
- end
97
-
98
- # === 403 Forbidden
99
- #
100
- # The login is attempting to perform an action it does not have privileges
101
- # to access. The login credentials are correct.
102
- class Forbidden < ClientError
103
- end
104
-
105
- # === 404 Not Found
106
- #
107
- # The resource was not found. This may be returned if the given account
108
- # code or subscription plan does not exist. The response body will explain
109
- # which resource was not found.
110
- class NotFound < ClientError
111
- end
112
-
113
- # === 405 Method Not Allowed
114
- #
115
- # A method was attempted where it is not allowed.
116
- #
117
- # If this is raised, there may be a bug with the client library or with
118
- # the server. Please contact support@recurly.com or
119
- # {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
120
- class MethodNotAllowed < ClientError
121
- end
122
-
123
- # === 406 Not Acceptable
124
- #
125
- # The request content type was not acceptable.
126
- #
127
- # If this is raised, there may be a bug with the client library or with
128
- # the server. Please contact support@recurly.com or
129
- # {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
130
- class NotAcceptable < ClientError
131
- end
132
-
133
- # === 412 Precondition Failed
134
- #
135
- # The request was unsuccessful because a condition was not met. For
136
- # example, this message may be returned if you attempt to cancel a
137
- # subscription for an account that has no subscription.
138
- class PreconditionFailed < ClientError
139
- end
140
-
141
- # === 415 Unsupported Media Type
142
- #
143
- # The request body was not recognized as XML.
144
- #
145
- # If this is raised, there may be a bug with the client library or with
146
- # the server. Please contact support@recurly.com or
147
- # {file a bug}[https://github.com/recurly/recurly-client-ruby/issues].
148
- class UnsupportedMediaType < ClientError
149
- end
150
-
151
- # === 422 Unprocessable Entity
152
- #
153
- # Could not process a POST or PUT request because the request is invalid.
154
- # See the response body for more details.
155
- class UnprocessableEntity < ClientError
156
- end
157
-
158
- # === 5xx Server Error
159
- #
160
- # The superclass to all server errors (responses with status code 5xx).
161
- class ServerError < ResponseError
162
- end
163
-
164
- # === 500 Internal Server Error
165
- #
166
- # The server encountered an error while processing your request and failed.
167
- class InternalServerError < ServerError
168
- end
169
-
170
- # === 502 Gateway Error
171
- #
172
- # The load balancer or web server had trouble connecting to the Recurly.
173
- # Please try the request again.
174
- class GatewayError < ServerError
175
- end
176
-
177
- # === 503 Service Unavailable
178
- #
179
- # The service is temporarily unavailable. Please try the request again.
180
- class ServiceUnavailable < ServerError
181
- end
182
-
183
- # Error mapping by status code.
184
- ERRORS = Hash.new { |hash, code|
185
- unless hash.key? code
186
- case code
187
- when 400...500 then ClientError
188
- when 500...600 then ServerError
189
- else ResponseError
190
- end
191
- end
192
- }.update(
193
- 304 => NotModified,
194
- 400 => BadRequest,
195
- 401 => Unauthorized,
196
- 402 => PaymentRequired,
197
- 403 => Forbidden,
198
- 404 => NotFound,
199
- 406 => NotAcceptable,
200
- 412 => PreconditionFailed,
201
- 415 => UnsupportedMediaType,
202
- 422 => UnprocessableEntity,
203
- 500 => InternalServerError,
204
- 502 => GatewayError,
205
- 503 => ServiceUnavailable
206
- ).freeze
207
- end
208
- end
@@ -1,111 +0,0 @@
1
- require 'cgi'
2
- require 'net/https'
3
-
4
- module Recurly
5
- class API
6
- module Net
7
- module HTTPAdapter
8
- # A hash of Net::HTTP settings configured before the request.
9
- #
10
- # @return [Hash]
11
- def net_http
12
- @net_http ||= {}
13
- end
14
-
15
- # Used to store any Net::HTTP settings.
16
- #
17
- # @example
18
- # Recurly::API.net_http = {
19
- # :verify_mode => OpenSSL::SSL::VERIFY_PEER,
20
- # :ca_path => "/etc/ssl/certs",
21
- # :ca_file => "/opt/local/share/curl/curl-ca-bundle.crt"
22
- # }
23
- attr_writer :net_http
24
-
25
- private
26
-
27
- METHODS = {
28
- :head => ::Net::HTTP::Head,
29
- :get => ::Net::HTTP::Get,
30
- :post => ::Net::HTTP::Post,
31
- :put => ::Net::HTTP::Put,
32
- :delete => ::Net::HTTP::Delete
33
- }
34
-
35
- def request method, uri, options = {}
36
- head = headers.dup
37
- head.update options[:head] if options[:head]
38
- head.delete_if { |_, value| value.nil? }
39
- uri = base_uri + uri
40
- if options[:params] && !options[:params].empty?
41
- pairs = options[:params].map { |key, value|
42
- "#{CGI.escape key.to_s}=#{CGI.escape value.to_s}"
43
- }
44
- uri += "?#{pairs.join '&'}"
45
- end
46
- self.validate_uri!(uri)
47
- request = METHODS[method].new uri.request_uri, head
48
- request.basic_auth(*[Recurly.api_key, nil].flatten[0, 2])
49
- if options[:body]
50
- request['Content-Type'] = content_type
51
- request.body = options[:body]
52
- end
53
- if options[:etag]
54
- request['If-None-Match'] = options[:etag]
55
- end
56
- if options[:format]
57
- request['Accept'] = FORMATS[options[:format]]
58
- end
59
- if options[:locale]
60
- request['Accept-Language'] = options[:locale]
61
- end
62
- http = ::Net::HTTP.new uri.host, uri.port
63
- http.use_ssl = uri.scheme == 'https'
64
- net_http.each_pair { |key, value| http.send "#{key}=", value }
65
-
66
- if Recurly.logger
67
- Recurly.log :info, "===> %s %s" % [request.method, uri]
68
- headers = request.to_hash
69
- headers['authorization'] &&= ['Basic [FILTERED]']
70
- Recurly.log :debug, headers.inspect
71
- if request.body && !request.body.empty?
72
- Recurly.log :debug, XML.filter(request.body)
73
- end
74
- start_time = Time.now
75
- end
76
-
77
- response = http.start { http.request request }
78
- code = response.code.to_i
79
-
80
- if Recurly.logger
81
- latency = (Time.now - start_time) * 1_000
82
- level = case code
83
- when 200...300 then :info
84
- when 300...400 then :warn
85
- when 400...500 then :error
86
- else :fatal
87
- end
88
- Recurly.log level, "<=== %d %s (%.1fms)" % [
89
- code,
90
- response.class.name[9, response.class.name.length].gsub(
91
- /([a-z])([A-Z])/, '\1 \2'
92
- ),
93
- latency
94
- ]
95
- Recurly.log :debug, response.to_hash.inspect
96
- Recurly.log :debug, response.body if response.body
97
- end
98
-
99
- case code
100
- when 200...300 then response
101
- else raise ERRORS[code].new request, response
102
- end
103
- rescue Errno::ECONNREFUSED => e
104
- raise Error, e.message
105
- end
106
- end
107
- end
108
-
109
- extend Net::HTTPAdapter
110
- end
111
- end
@@ -1,109 +0,0 @@
1
- module Recurly
2
- # Represents an account's Billing Information. You normally want to use a token when creating billing information.
3
- #
4
- # Recurly Documentation: https://dev.recurly.com/docs/create-an-accounts-billing-info-token
5
- class BillingInfo < Resource
6
- BANK_ACCOUNT_ATTRIBUTES = %w(name_on_account account_type last_four routing_number).freeze
7
- CREDIT_CARD_ATTRIBUTES = %w(number verification_value card_type year month first_six last_four).freeze
8
- AMAZON_ATTRIBUTES = %w(amazon_billing_agreement_id amazon_region).freeze
9
- PAYPAL_ATTRIBUTES = %w(paypal_billing_agreement_id).freeze
10
- ROKU_ATTRIBUTES = %w(roku_billing_agreement_id last_four).freeze
11
- SEPA_ATTRIBUTES = %w(iban).freeze
12
- BACS_ATTRIBUTES = %w(account_number sort_code type).freeze
13
- BECS_ATTRIBUTES = %w(account_number bsb_code type).freeze
14
-
15
- # @return [Account]
16
- belongs_to :account
17
-
18
- define_attribute_methods %w(
19
- first_name
20
- last_name
21
- company
22
- address1
23
- address2
24
- city
25
- state
26
- zip
27
- country
28
- phone
29
- vat_number
30
- ip_address
31
- ip_address_country
32
- token_id
33
- currency
34
- geo_code
35
- updated_at
36
- external_hpp_type
37
- gateway_token
38
- gateway_code
39
- fraud_session_id
40
- three_d_secure_action_result_token_id
41
- transaction_type
42
- mandate_reference
43
- tax_identifier
44
- tax_identifier_type
45
- ) | CREDIT_CARD_ATTRIBUTES | BANK_ACCOUNT_ATTRIBUTES | AMAZON_ATTRIBUTES | PAYPAL_ATTRIBUTES | ROKU_ATTRIBUTES | SEPA_ATTRIBUTES | BACS_ATTRIBUTES | BECS_ATTRIBUTES
46
-
47
- # Verify an account's stored billing info
48
- #
49
- # @param [Hash] gateway_code (optional) is the code for the gateway to use for verification. If unspecified, a gateway will be selected using the normal rules.
50
- # @return [Transaction]
51
- # @raise [Invalid] Raise if the account's billing info cannot be verified
52
- def verify(attrs = {})
53
- Transaction.from_response API.post("#{path}/verify", attrs.empty? ? nil : Verify.to_xml(attrs))
54
- end
55
-
56
- # @return [String]
57
- def inspect
58
- attributes = self.class.attribute_names
59
- case type
60
- when 'credit_card'
61
- attributes -= (AMAZON_ATTRIBUTES + PAYPAL_ATTRIBUTES + BANK_ACCOUNT_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
62
- attributes |= CREDIT_CARD_ATTRIBUTES
63
- when 'paypal'
64
- attributes -= (CREDIT_CARD_ATTRIBUTES | BANK_ACCOUNT_ATTRIBUTES + AMAZON_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
65
- when 'amazon'
66
- attributes -= (CREDIT_CARD_ATTRIBUTES | BANK_ACCOUNT_ATTRIBUTES + PAYPAL_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
67
- when 'bank_account'
68
- attributes -= (CREDIT_CARD_ATTRIBUTES + PAYPAL_ATTRIBUTES + AMAZON_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
69
- attributes |= BANK_ACCOUNT_ATTRIBUTES
70
- when 'roku'
71
- attributes -= (CREDIT_CARD_ATTRIBUTES + PAYPAL_ATTRIBUTES + AMAZON_ATTRIBUTES + BANK_ACCOUNT_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
72
- attributes |= ROKU_ATTRIBUTES
73
- when 'sepa'
74
- attributes -= (CREDIT_CARD_ATTRIBUTES + PAYPAL_ATTRIBUTES + AMAZON_ATTRIBUTES + BANK_ACCOUNT_ATTRIBUTES + ROKU_ATTRIBUTES + BACS_ATTRIBUTES + BECS_ATTRIBUTES)
75
- attributes |= SEPA_ATTRIBUTES
76
- when 'bacs'
77
- attributes -= (CREDIT_CARD_ATTRIBUTES + PAYPAL_ATTRIBUTES + AMAZON_ATTRIBUTES + BANK_ACCOUNT_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BECS_ATTRIBUTES)
78
- attributes |= BACS_ATTRIBUTES
79
- when 'becs'
80
- attributes -= (CREDIT_CARD_ATTRIBUTES + PAYPAL_ATTRIBUTES + AMAZON_ATTRIBUTES + BANK_ACCOUNT_ATTRIBUTES + ROKU_ATTRIBUTES + SEPA_ATTRIBUTES + BACS_ATTRIBUTES)
81
- attributes |= BECS_ATTRIBUTES
82
- end
83
- super attributes
84
- end
85
-
86
- # @return ["credit_card", "paypal", "amazon", "bank_account", "roku", "sepa", "bacs", "becs", nil] The type of billing info.
87
- def type
88
- self[:type] || @type
89
- end
90
-
91
- class << self
92
- # Overrides the inherited member_path method to allow for billing info's
93
- # irregular URL structure.
94
- #
95
- # @return [String] The relative path to an account's billing info from the
96
- # API's base URI.
97
- # @param uuid [String]
98
- # @example
99
- # Recurly::BillingInfo.member_path "code"
100
- # # => "accounts/code/billing_info"
101
- def member_path uuid
102
- "accounts/#{uuid}/billing_info"
103
- end
104
- end
105
-
106
- # Billing info is only writeable through an {Account} instance.
107
- embedded!
108
- end
109
- end
@@ -1,134 +0,0 @@
1
- module Recurly
2
-
3
- # Recurly Documentation: https://dev.recurly.com/docs/list-active-coupons
4
- class Coupon < Resource
5
- BULK = 'bulk'.freeze
6
- SINGLE_CODE = 'single_code'.freeze
7
-
8
- # @macro [attach] scope
9
- # @scope class
10
- # @return [Pager<Coupon>] A pager that yields +$1+ coupons.
11
- scope :redeemable, :state => :redeemable
12
- scope :expired, :state => :expired
13
- scope :maxed_out, :state => :maxed_out
14
-
15
- # @return [Pager<Redemption>, []] A pager that yields Redemptions
16
- has_many :redemptions
17
-
18
- # @return [Pager<Coupon>, []] A pager that yields coupon-code type Coupons
19
- has_many :unique_coupon_codes, class_name: :Coupon
20
-
21
- define_attribute_methods %w(
22
- id
23
- coupon_code
24
- name
25
- state
26
- discount_type
27
- discount_percent
28
- discount_in_cents
29
- redeem_by_date
30
- single_use
31
- applies_for_months
32
- duration
33
- temporal_unit
34
- temporal_amount
35
- max_redemptions
36
- max_redemptions_per_account
37
- applies_to_all_plans
38
- created_at
39
- updated_at
40
- plan_codes
41
- description
42
- invoice_description
43
- applies_to_non_plan_charges
44
- redemption_resource
45
- coupon_type
46
- unique_template_code
47
- free_trial_amount
48
- free_trial_unit
49
- )
50
- alias to_param coupon_code
51
-
52
- # Redeem a coupon with a given account or account code.
53
- #
54
- # @return [true]
55
- # @param account_or_code [Account, String]
56
- # @param currency [String] Three-letter currency code
57
- # @param extra_opts [Hash] extra options that go into the {Redemption}
58
- # @example
59
- # coupon = Coupon.find(coupon_code)
60
- # coupon.redeem(account_code, 'USD', subscription_uuid: 'ab3b1dbabc3195')
61
- #
62
- # coupon = Coupon.find(coupon_code)
63
- # account = Account.find(account_code)
64
- # coupon.redeem(account)
65
- def redeem account_or_code, currency = nil, extra_opts={}
66
- return false unless link? :redeem
67
-
68
- account_code = if account_or_code.is_a? Account
69
- account_or_code.account_code
70
- else
71
- account_or_code
72
- end
73
-
74
- redemption_options = {
75
- :account_code => account_code,
76
- :currency => currency || Recurly.default_currency
77
- }.merge(extra_opts)
78
-
79
- redemption = Redemption.new(redemption_options)
80
-
81
- Redemption.from_response follow_link(:redeem,
82
- :body => redemption.to_xml
83
- )
84
- rescue API::UnprocessableEntity => e
85
- redemption.apply_errors e
86
- redemption
87
- end
88
-
89
- # Generate unique coupon codes on the server. This is based on the unique_template_code.
90
- #
91
- # @param amount [Integer]
92
- # @return [Pager<Coupon>] A pager that yields the coupon-code type Coupons
93
- # @example
94
- # unique_codes = coupon.generate(10)
95
- # unique_codes.each do |c|
96
- # puts c.coupon_code
97
- # end
98
- def generate(amount)
99
- builder = XML.new("<coupon/>")
100
- builder.add_element 'number_of_unique_codes', amount
101
-
102
- resp = follow_link(:generate,
103
- :body => builder.to_s
104
- )
105
-
106
- Pager.new(Recurly::Coupon, uri: resp['location'], parent: self, etag: resp['ETag'])
107
- end
108
-
109
- # Redeem a coupon on the given account code
110
- #
111
- # @param account_code [String] Acccount's account code
112
- # @param currency [String] Three-letter currency code
113
- # @raise [Invalid] If the coupon cannot be redeemed
114
- # @return [Redemption] The Coupon Redemption
115
- def redeem!(account_code, currency = nil)
116
- redemption = redeem(account_code, currency)
117
- raise Invalid.new(self) unless redemption && redemption.persisted?
118
- redemption
119
- end
120
-
121
- # Restores the coupon
122
- def restore!
123
- return false unless link? :restore
124
- reload follow_link(:restore, body: self.to_xml(delta: true))
125
- end
126
-
127
- # Will return true if there are no limits on number of redemptions for this Coupon.
128
- #
129
- # @return [true, false]
130
- def unlimited_redemptions_per_account?
131
- !max_redemptions_per_account
132
- end
133
- end
134
- end