recurly 2.20.3 → 3.0.0.beta.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 (234) 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/client/operations.rb +935 -0
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/errors/api_errors.rb +35 -0
  25. data/lib/recurly/errors/network_errors.rb +8 -0
  26. data/lib/recurly/errors.rb +34 -0
  27. data/lib/recurly/pager.rb +119 -0
  28. data/lib/recurly/request.rb +30 -0
  29. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  30. data/lib/recurly/requests/account_create_only.rb +18 -0
  31. data/lib/recurly/requests/account_updatable.rb +50 -0
  32. data/lib/recurly/requests/add_on_create.rb +38 -0
  33. data/lib/recurly/requests/add_on_update.rb +38 -0
  34. data/lib/recurly/requests/address.rb +42 -0
  35. data/lib/recurly/requests/billing_info_create.rb +58 -0
  36. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  37. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  38. data/lib/recurly/requests/create_account.rb +62 -0
  39. data/lib/recurly/requests/create_coupon.rb +90 -0
  40. data/lib/recurly/requests/invoice_create.rb +42 -0
  41. data/lib/recurly/requests/invoice_refund.rb +30 -0
  42. data/lib/recurly/requests/line_item_create.rb +46 -0
  43. data/lib/recurly/requests/plan_create.rb +66 -0
  44. data/lib/recurly/requests/plan_update.rb +70 -0
  45. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  46. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  47. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  48. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  49. data/lib/recurly/requests/subscription_create.rb +86 -0
  50. data/lib/recurly/requests/subscription_update.rb +42 -0
  51. data/lib/recurly/requests/update_coupon.rb +30 -0
  52. data/lib/recurly/resource.rb +16 -1114
  53. data/lib/recurly/resources/account.rb +86 -0
  54. data/lib/recurly/resources/account_acquisition.rb +42 -0
  55. data/lib/recurly/resources/account_balance.rb +22 -0
  56. data/lib/recurly/resources/account_note.rb +30 -0
  57. data/lib/recurly/resources/add_on.rb +62 -0
  58. data/lib/recurly/resources/address.rb +42 -0
  59. data/lib/recurly/resources/billing_info.rb +62 -0
  60. data/lib/recurly/resources/coupon.rb +110 -0
  61. data/lib/recurly/resources/coupon_discount.rb +22 -0
  62. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  63. data/lib/recurly/resources/credit_payment.rb +62 -0
  64. data/lib/recurly/resources/error.rb +18 -0
  65. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  66. data/lib/recurly/resources/invoice.rb +138 -0
  67. data/lib/recurly/resources/invoice_collection.rb +18 -0
  68. data/lib/recurly/resources/line_item.rb +166 -0
  69. data/lib/recurly/resources/plan.rb +86 -0
  70. data/lib/recurly/resources/settings.rb +18 -0
  71. data/lib/recurly/resources/shipping_address.rb +74 -0
  72. data/lib/recurly/resources/site.rb +46 -0
  73. data/lib/recurly/resources/subscription.rb +134 -0
  74. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  75. data/lib/recurly/resources/subscription_change.rb +54 -0
  76. data/lib/recurly/resources/tax_info.rb +18 -0
  77. data/lib/recurly/resources/transaction.rb +146 -0
  78. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  79. data/lib/recurly/resources/user.rb +38 -0
  80. data/lib/recurly/schema/json_deserializer.rb +53 -0
  81. data/lib/recurly/schema/json_parser.rb +71 -0
  82. data/lib/recurly/schema/request_caster.rb +66 -0
  83. data/lib/recurly/schema/schema_factory.rb +50 -0
  84. data/lib/recurly/schema/schema_validator.rb +125 -0
  85. data/lib/recurly/schema.rb +114 -0
  86. data/lib/recurly/version.rb +1 -10
  87. data/lib/recurly.rb +14 -167
  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 +129 -196
  93. data/lib/recurly/account.rb +0 -230
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -23
  96. data/lib/recurly/add_on.rb +0 -52
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -100
  99. data/lib/recurly/api/errors.rb +0 -208
  100. data/lib/recurly/api/net_http_adapter.rb +0 -111
  101. data/lib/recurly/api.rb +0 -110
  102. data/lib/recurly/billing_info.rb +0 -134
  103. data/lib/recurly/business_entity.rb +0 -35
  104. data/lib/recurly/coupon.rb +0 -136
  105. data/lib/recurly/credit_payment.rb +0 -32
  106. data/lib/recurly/currency_percentage_tier.rb +0 -17
  107. data/lib/recurly/custom_field.rb +0 -15
  108. data/lib/recurly/custom_field_definition.rb +0 -14
  109. data/lib/recurly/customer_permission.rb +0 -10
  110. data/lib/recurly/delivery.rb +0 -19
  111. data/lib/recurly/dunning_campaign.rb +0 -30
  112. data/lib/recurly/dunning_cycle.rb +0 -18
  113. data/lib/recurly/entitlement.rb +0 -19
  114. data/lib/recurly/error.rb +0 -13
  115. data/lib/recurly/external_account.rb +0 -17
  116. data/lib/recurly/external_charge.rb +0 -20
  117. data/lib/recurly/external_invoice.rb +0 -27
  118. data/lib/recurly/external_payment_phase.rb +0 -27
  119. data/lib/recurly/external_product.rb +0 -34
  120. data/lib/recurly/external_product_reference.rb +0 -18
  121. data/lib/recurly/external_subscription.rb +0 -62
  122. data/lib/recurly/gateway_attribute.rb +0 -10
  123. data/lib/recurly/general_ledger_account.rb +0 -16
  124. data/lib/recurly/gift_card.rb +0 -85
  125. data/lib/recurly/helper.rb +0 -51
  126. data/lib/recurly/invoice.rb +0 -354
  127. data/lib/recurly/invoice_collection.rb +0 -14
  128. data/lib/recurly/invoice_template.rb +0 -14
  129. data/lib/recurly/item.rb +0 -36
  130. data/lib/recurly/js.rb +0 -14
  131. data/lib/recurly/juris_detail.rb +0 -15
  132. data/lib/recurly/measured_unit.rb +0 -16
  133. data/lib/recurly/money.rb +0 -120
  134. data/lib/recurly/note.rb +0 -14
  135. data/lib/recurly/percentage_tier.rb +0 -17
  136. data/lib/recurly/performance_obligation.rb +0 -15
  137. data/lib/recurly/plan.rb +0 -59
  138. data/lib/recurly/plan_ramp_interval.rb +0 -10
  139. data/lib/recurly/purchase.rb +0 -239
  140. data/lib/recurly/redemption.rb +0 -46
  141. data/lib/recurly/resource/association.rb +0 -16
  142. data/lib/recurly/resource/errors.rb +0 -20
  143. data/lib/recurly/resource/pager.rb +0 -313
  144. data/lib/recurly/rev_rec.rb +0 -18
  145. data/lib/recurly/shipping_address.rb +0 -26
  146. data/lib/recurly/shipping_fee.rb +0 -17
  147. data/lib/recurly/shipping_method.rb +0 -13
  148. data/lib/recurly/sub_add_on_percentage_tier.rb +0 -17
  149. data/lib/recurly/subscription/add_ons.rb +0 -82
  150. data/lib/recurly/subscription.rb +0 -374
  151. data/lib/recurly/subscription_add_on.rb +0 -64
  152. data/lib/recurly/subscription_ramp_interval.rb +0 -12
  153. data/lib/recurly/tax_detail.rb +0 -18
  154. data/lib/recurly/tax_type.rb +0 -13
  155. data/lib/recurly/tier.rb +0 -18
  156. data/lib/recurly/transaction/errors.rb +0 -119
  157. data/lib/recurly/transaction.rb +0 -132
  158. data/lib/recurly/usage.rb +0 -29
  159. data/lib/recurly/verify.rb +0 -12
  160. data/lib/recurly/webhook/account_notification.rb +0 -13
  161. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  162. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  163. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  164. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  165. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  166. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  167. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  168. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  169. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  170. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  171. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  172. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  173. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  175. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  176. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  177. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  178. data/lib/recurly/webhook/item_notification.rb +0 -7
  179. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  180. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  181. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  182. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  183. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  184. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  185. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  186. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  187. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  188. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  189. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  190. data/lib/recurly/webhook/notification.rb +0 -18
  191. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  192. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  193. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  194. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  195. data/lib/recurly/webhook/prerenewal_notification.rb +0 -6
  196. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  197. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  198. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  199. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  200. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  201. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  202. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  203. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  204. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  205. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  206. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  207. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  208. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  209. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  210. data/lib/recurly/webhook/scheduled_subscription_update_notification.rb +0 -6
  211. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  212. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  213. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  214. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  215. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  216. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  217. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  218. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  219. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  220. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  221. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  222. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  223. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  224. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  225. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  226. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  227. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  228. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  229. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  230. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  231. data/lib/recurly/webhook.rb +0 -113
  232. data/lib/recurly/xml/nokogiri.rb +0 -60
  233. data/lib/recurly/xml/rexml.rb +0 -52
  234. data/lib/recurly/xml.rb +0 -122
@@ -1,374 +0,0 @@
1
- module Recurly
2
- class Subscription < Resource
3
- require 'recurly/subscription/add_ons'
4
-
5
- # @macro [attach] scope
6
- # @scope class
7
- # @return [Pager<Subscription>] A pager that yields +$1+ subscriptions.
8
- scope :active, state: :active
9
- scope :canceled, state: :canceled
10
- scope :expired, state: :expired
11
- scope :future, state: :future
12
- # @return [Pager<Subscription>] A pager that yields subscriptions in
13
- # trials.
14
- scope :in_trial, state: :in_trial
15
- # @return [Pager<Subscription>] A pager that yields active, canceled, and
16
- # future subscriptions.
17
- scope :live, state: :live
18
- scope :past_due, state: :past_due
19
-
20
- # @return [Pager<Redemption>, []]
21
- has_many :redemptions
22
-
23
- # @return [[CustomField], []]
24
- has_many :custom_fields, class_name: :CustomField, readonly: false
25
-
26
- # @return [[SubscriptionRampInterval], nil]
27
- has_many :ramp_intervals, class_name: :SubscriptionRampInterval
28
-
29
- # @return [Account]
30
- belongs_to :account
31
-
32
- # @return [Plan]
33
- belongs_to :plan
34
-
35
- # @return [Invoice, nil]
36
- has_one :invoice
37
-
38
- # @return [GiftCard, nil]
39
- has_one :gift_card
40
-
41
- # @return [ShippingAddress, nil]
42
- has_one :shipping_address, class_name: :ShippingAddress, readonly: false
43
-
44
- # @return [InvoiceCollection, nil]
45
- has_one :invoice_collection, class_name: :InvoiceCollection, readonly: true
46
-
47
- # @return [BillingInfo, nil]
48
- has_one :billing_info, class_name: :BillingInfo, readonly: false
49
-
50
- define_attribute_methods %w(
51
- uuid
52
- state
53
- unit_amount_in_cents
54
- cost_in_cents
55
- currency
56
- quantity
57
- updated_at
58
- activated_at
59
- canceled_at
60
- expires_at
61
- current_period_started_at
62
- current_period_ends_at
63
- trial_started_at
64
- trial_ends_at
65
- pending_subscription
66
- subscription_add_ons
67
- coupon_code
68
- coupon_codes
69
- ramp_intervals
70
- total_billing_cycles
71
- remaining_billing_cycles
72
- net_terms
73
- net_terms_type
74
- collection_method
75
- po_number
76
- tax_in_cents
77
- tax_type
78
- tax_region
79
- tax_rate
80
- tax_inclusive
81
- bulk
82
- bank_account_authorized_at
83
- terms_and_conditions
84
- customer_notes
85
- vat_reverse_charge_notes
86
- address
87
- revenue_schedule_type
88
- shipping_address_id
89
- shipping_method_code
90
- shipping_amount_in_cents
91
- timeframe
92
- started_with_gift
93
- converted_at
94
- billing_info_uuid
95
- no_billing_info_reason
96
- imported_trial
97
- credit_customer_notes
98
- remaining_pause_cycles
99
- paused_at
100
- auto_renew
101
- renewal_billing_cycles
102
- first_billing_date
103
- first_bill_date
104
- next_bill_date
105
- current_term_started_at
106
- current_term_ends_at
107
- total_amount_in_cents
108
- resume_at
109
- gateway_code
110
- transaction_type
111
- action_result
112
- proration_settings
113
- )
114
- alias to_param uuid
115
-
116
- def self.preview(attributes = {})
117
- new(attributes) { |record| record.preview }
118
- end
119
-
120
- def preview
121
- clear_errors
122
- @response = API.send(:post, "#{path}/preview", to_xml)
123
- reload response
124
- rescue API::UnprocessableEntity => e
125
- apply_errors e
126
- end
127
-
128
- # @return [Subscription] A new subscription.
129
- def initialize(attributes = {})
130
- super({ :currency => Recurly.default_currency }.merge attributes)
131
- end
132
-
133
- # Assign a Plan resource (rather than a plan code).
134
- #
135
- # @param plan [Plan]
136
- def plan= plan
137
- self.plan_code = (plan.plan_code if plan.respond_to? :plan_code)
138
- attributes[:plan] = plan
139
- end
140
-
141
- def plan_code
142
- self[:plan_code] ||= (plan.plan_code if plan.respond_to? :plan_code)
143
- end
144
-
145
- def plan_code= plan_code
146
- self[:plan_code] = plan_code
147
- end
148
-
149
- # Assign a Coupon resource (rather than a coupon code).
150
- #
151
- # @param coupon [Coupon]
152
- def coupon= coupon
153
- self.coupon_code = (
154
- coupon.coupon_code if coupon.respond_to? :coupon_code
155
- )
156
- attributes[:coupon] = coupon
157
- end
158
-
159
- # Assign Coupon resources (rather than coupon codes).
160
- #
161
- # @param coupons [[Coupons]]
162
- def coupons= coupons
163
- self.coupon_codes = coupons.map do |coupon|
164
- coupon.coupon_code if coupon.respond_to? :coupon_code
165
- end.compact
166
- attributes[:coupons] = coupons
167
- end
168
-
169
- # @return [AddOns]
170
- def subscription_add_ons
171
- self[:subscription_add_ons] ||= AddOns.new self, super
172
- end
173
- alias add_ons subscription_add_ons
174
-
175
- # Assign an array of subscription add-ons.
176
- def subscription_add_ons= subscription_add_ons
177
- super AddOns.new self, subscription_add_ons
178
- end
179
- alias add_ons= subscription_add_ons=
180
-
181
- def pending_subscription
182
- sub = self[:pending_subscription]
183
- sub.tap {|e| e.currency = currency} if sub.is_a? Subscription
184
- end
185
-
186
- # Convert free trial to paid subscription when transaction_type is "moto"
187
- # which stands for "Mail Order Telephone Order".
188
- #
189
- # @return true
190
- def convert_trial_moto()
191
- builder = XML.new("<subscription/>")
192
- builder.add_element('transaction_type', "moto")
193
- reload API.put("#{uri}/convert_trial", builder.to_s)
194
- true
195
- end
196
-
197
- # Convert free trial to paid subscription. Optionally uses a 3ds token.
198
- #
199
- # @param three_d_secure_action_result_token_id [String] three_d_secure_action_result_token_id
200
- # returned by Recurly.js referencing the result of the 3DS authentication for PSD2
201
- # @return true when payment is accepted
202
- def convert_trial(three_d_secure_action_result_token_id = nil)
203
- body = if three_d_secure_action_result_token_id != nil
204
- builder = Recurly::XML.new("<subscription/>")
205
- account = builder.add_element('account')
206
- billing_info = account.add_element('billing_info')
207
- billing_info.add_element('three_d_secure_action_result_token_id', three_d_secure_action_result_token_id)
208
- builder.to_s
209
- end
210
-
211
- reload API.put("#{uri}/convert_trial", body)
212
- true
213
- end
214
-
215
- # Cancel a subscription so that it will not renew.
216
- #
217
- # @param [String] optional timeframe. Choose one of "bill_date" or "term_end"
218
- # @return [true, false] +true+ when successful, +false+ when unable to
219
- # (e.g., the subscription is not active).
220
- # @example
221
- # account = Account.find account_code
222
- # subscription = account.subscriptions.first
223
- # subscription.cancel # => true
224
- def cancel(timeframe = nil)
225
- return false unless link? :cancel
226
- params = timeframe.nil? ? {} : { 'timeframe': timeframe }
227
- reload follow_link :cancel, params: params
228
- true
229
- end
230
-
231
- # An array of acceptable refund types.
232
- REFUND_TYPES = ['none', 'full', 'partial'].freeze
233
-
234
- # Immediately terminate a subscription (with optional refund).
235
- #
236
- # @return [true, false] +true+ when successful, +false+ when unable to
237
- # (e.g., the subscription is not active).
238
- # @param refund_type [:none, :full, :partial] <tt>:none</tt> terminates the
239
- # subscription with no refund (the default), <tt>:full</tt> refunds the
240
- # subscription in full, and <tt>:partial</tt> refunds the subscription in
241
- # part.
242
- # @raise [ArgumentError] Invalid +refund_type+.
243
- # @example
244
- # account = Account.find account_code
245
- # subscription = account.subscriptions.first
246
- # subscription.terminate(:partial) # => true
247
- def terminate refund_type = :none
248
- return false unless link? :terminate
249
- unless REFUND_TYPES.include? refund_type.to_s
250
- raise ArgumentError, "refund must be one of: #{REFUND_TYPES.join ', '}"
251
- end
252
- reload follow_link(:terminate, :params => { :refund => refund_type })
253
- true
254
- end
255
- alias destroy terminate
256
-
257
- # Reactivate a subscription.
258
- #
259
- # @return [true, false] +true+ when successful, +false+ when unable to
260
- # (e.g., the subscription is already active), and may raise an exception
261
- # if the reactivation fails.
262
- def reactivate
263
- return false unless link? :reactivate
264
- reload follow_link :reactivate
265
- true
266
- end
267
-
268
- # Postpone a subscription's renewal date.
269
- #
270
- # @return [true, false] +true+ when successful, +false+ when unable to
271
- # (e.g., the subscription is not active).
272
- # @param next_bill_date [Time] when the subscription should renew.
273
- # @param bulk [boolean] set to true for bulk updates (bypassing 60 second wait).
274
- def postpone next_bill_date, bulk=false
275
- return false unless link? :postpone
276
- reload follow_link(:postpone,
277
- :params => { :next_bill_date => next_bill_date, :bulk => bulk }
278
- )
279
- true
280
- end
281
-
282
- # Update the notes sections of the subscription. This endpoint also allows you to
283
- # update the custom fields.
284
- #
285
- # @example
286
- # subscription.custom_fields.first.value = nil
287
- # subscription.update_notes(terms_and_conditions: 'New T&C')
288
- # #=>
289
- # # <subscription>
290
- # # <custom_fields><custom_field><name>food</name><value nil="nil"/><custom_field></custom_fields>
291
- # # <terms_and_conditions>New T&C</terms_and_conditions>
292
- # # </subscription>
293
- # # it's also okay to call without notes
294
- # subscription.update_notes({})
295
- #
296
- # @param notes [Hash] should be the notes parameters you wish to update
297
- # @return [true, false] +true+ when successful, +false+ when unable to
298
- def update_notes(notes)
299
- return false unless link? :notes
300
- self.attributes = notes
301
- reload follow_link(:notes, body: to_xml)
302
- true
303
- end
304
-
305
- # Pauses a subscription or cancels a scheduled pause.
306
- #
307
- # * For an active subscription without a pause scheduled already,
308
- # this will schedule a pause period to begin at the next renewal
309
- # date for the specified number of billing cycles (remaining_pause_cycles).
310
- # * When a scheduled pause already exists, this will update the remaining
311
- # pause cycles with the new value sent. When zero (0) remaining_pause_cycles
312
- # is sent for a subscription with a scheduled pause, the pause will be canceled.
313
- # * For a paused subscription, the remaining_pause_cycles will adjust the
314
- # length of the current pause period. Sending zero (0) in the remaining_pause_cycles
315
- # field will cause the subscription to be resumed at the next renewal date.
316
- #
317
- # @param remaining_pause_cycles [Integer] The number of billing cycles that the subscription will be paused.
318
- # @return true
319
- def pause(remaining_pause_cycles)
320
- builder = XML.new("<subscription/>")
321
- builder.add_element('remaining_pause_cycles', remaining_pause_cycles)
322
- reload API.put("#{uri}/pause", builder.to_s)
323
- true
324
- end
325
-
326
- # Resumes a paused subscription.
327
- #
328
- # For a paused subscription, this will immediately resume the subscription
329
- # from the pause, produce an invoice, and return the newly resumed subscription.
330
- # Any at-renewal subscription changes will be immediately applied
331
- # when the subscription resumes.
332
- #
333
- # @return true
334
- def resume
335
- reload API.put("#{uri}/resume")
336
- true
337
- end
338
-
339
- # Overrides the behavior of `update_attributes` in Resource class so ensure
340
- # all attributes are marked as dirty if the plan code changes
341
- def update_attributes attributes = {}
342
- clear_attributes_if_plan_code_changed attributes
343
- super
344
- end
345
-
346
- def update_attributes! attributes = {}
347
- clear_attributes_if_plan_code_changed attributes
348
- super
349
- end
350
-
351
- def signable_attributes
352
- super.merge :plan_code => plan_code
353
- end
354
-
355
- def changed_attributes
356
- attrs = super
357
- if custom_fields.any?(&:changed?)
358
- attrs['custom_fields'] = custom_fields.select(&:changed?)
359
- end
360
- attrs
361
- end
362
-
363
-
364
- private
365
-
366
- def clear_attributes_if_plan_code_changed attributes
367
- if attributes[:plan_code] != plan_code
368
- attributes.each do |key, value|
369
- self.attributes[key.to_s] = nil
370
- end
371
- end
372
- end
373
- end
374
- end
@@ -1,64 +0,0 @@
1
- module Recurly
2
- class SubscriptionAddOn < Resource
3
- # @return [MeasuredUnit]
4
- has_one :measured_unit
5
-
6
- # @return [Pager<Usage>, []]
7
- has_many :usage
8
-
9
- # @return [[Tier], []]
10
- has_many :tiers, class_name: :Tier, readonly: false
11
-
12
- # @return [[PercentageTier], []]
13
- has_many :percentage_tiers, class_name: :SubAddOnPercentageTier, readonly: false
14
-
15
- define_attribute_methods %w(
16
- add_on_code
17
- quantity
18
- unit_amount_in_cents
19
- add_on_type
20
- usage_type
21
- usage_percentage
22
- usage_timeframe
23
- usage_calculation_type
24
- add_on_source
25
- )
26
-
27
- attr_reader :subscription
28
-
29
- def initialize add_on = nil, subscription = nil
30
- super()
31
-
32
- case add_on
33
- when AddOn, SubscriptionAddOn
34
- @add_on = add_on if add_on.is_a? AddOn
35
- self.add_on_code = add_on.add_on_code
36
- self.quantity = add_on.quantity
37
- if add_on.unit_amount_in_cents
38
- self.unit_amount_in_cents = add_on.unit_amount_in_cents.to_i
39
- end
40
- if add_on.respond_to? :add_on_source
41
- self.add_on_source = add_on.add_on_source
42
- end
43
- self.tiers = add_on.tiers if add_on.tiers.any?
44
- self.percentage_tiers = add_on.percentage_tiers if add_on.percentage_tiers.any?
45
- when Hash
46
- self.attributes = add_on
47
- when String, Symbol
48
- self.add_on_code = add_on
49
- end
50
-
51
- self.add_on_code = add_on_code.to_s
52
-
53
- @subscription = subscription
54
- end
55
-
56
- def add_on
57
- @add_on ||= subscription.plan.add_ons.find add_on_code
58
- end
59
-
60
- def currency
61
- subscription.currency if subscription
62
- end
63
- end
64
- end
@@ -1,12 +0,0 @@
1
- module Recurly
2
- class SubscriptionRampInterval < Resource
3
- belongs_to :subscription
4
-
5
- define_attribute_methods %w(
6
- starting_billing_cycle
7
- unit_amount_in_cents
8
- starting_on
9
- ending_on
10
- )
11
- end
12
- end
@@ -1,18 +0,0 @@
1
- require 'bigdecimal'
2
-
3
- module Recurly
4
- class TaxDetail < Resource
5
- define_attribute_methods %w(
6
- name
7
- type
8
- tax_rate
9
- tax_in_cents
10
- level
11
- billable
12
- tax_type
13
- tax_region
14
- )
15
-
16
- embedded! true
17
- end
18
- end
@@ -1,13 +0,0 @@
1
- module Recurly
2
- class TaxType < Resource
3
- define_attribute_methods %w(
4
- description
5
- tax_in_cents
6
- type
7
- juris_details
8
- tax_classification
9
- )
10
-
11
- embedded! true
12
- end
13
- end
data/lib/recurly/tier.rb DELETED
@@ -1,18 +0,0 @@
1
- module Recurly
2
- class Tier < Resource
3
-
4
- belongs_to :add_on
5
- belongs_to :subscription_add_on
6
-
7
- define_attribute_methods %w(
8
- ending_quantity
9
- unit_amount_in_cents
10
- )
11
-
12
- def xml_keys
13
- attributes.keys
14
- end
15
-
16
- embedded! true
17
- end
18
- end
@@ -1,119 +0,0 @@
1
- module Recurly
2
- class Transaction < Resource
3
- # The base error class for transaction errors, raised when a transaction
4
- # fails.
5
- #
6
- # Error messages are customer-friendly, though only {DeclinedError}
7
- # messages should be a part of the normal API flow (a {ConfigurationError},
8
- # for example, is a problem that a customer cannot solve and requires your
9
- # attention).
10
- #
11
- # If a record of the transaction was stored in Recurly, it will be
12
- # accessible via {Error#transaction}.
13
- #
14
- # @example
15
- # begin
16
- # subscription.save!
17
- # rescue Recurly::Resource::Invalid => e
18
- # # Display e.record.errors...
19
- # rescue Recurly::Transaction::DeclinedError => e
20
- # # Display e.message and/or subscription (and associated) errors...
21
- # rescue Recurly::Transaction::RetryableError => e
22
- # # You should be able to attempt to save this again later.
23
- # rescue Recurly::Transaction::Error => e
24
- # # Alert yourself of the issue (i.e., log e.transaction).
25
- # # Display a generic error message.
26
- # end
27
- class Error < API::UnprocessableEntity
28
- # @return [Transaction] The transaction as returned (or updated) by
29
- # Recurly.
30
- attr_reader :transaction
31
-
32
- def initialize request, response, transaction
33
- super request, response
34
- update_transaction transaction
35
- end
36
-
37
- # @return [String] A customer-friendly error message.
38
- def to_s
39
- xml.text '/errors/transaction_error/customer_message'
40
- end
41
-
42
- # @return [String] The transaction error code.
43
- def transaction_error_code
44
- xml.text '/errors/transaction_error/error_code'
45
- end
46
-
47
- def gateway_error_code
48
- xml.text '/errors/transaction_error/gateway_error_code'
49
- end
50
-
51
- def decline_code
52
- xml.text '/errors/transaction_error/decline_code'
53
- end
54
-
55
- private
56
-
57
- def update_transaction transaction
58
- return unless transaction_xml = xml['/errors/transaction']
59
-
60
- @transaction = transaction
61
- transaction = Transaction.from_xml transaction_xml
62
- if @transaction.nil?
63
- @transaction = transaction
64
- else
65
- @transaction.instance_variable_get(:@attributes).update(
66
- transaction.attributes
67
- )
68
- end
69
- @transaction.persist!
70
- end
71
- end
72
-
73
- # Raised when a transaction fails for a temporary reason. The transaction
74
- # should be retried later.
75
- class RetryableError < Error
76
- end
77
-
78
- # Raised when a transaction fails due to a misconfiguration, e.g. if the
79
- # gateway hasn't been configured.
80
- class ConfigurationError < Error
81
- end
82
-
83
- # Raised when a transaction fails because the billing information was
84
- # invalid.
85
- class DeclinedError < Error
86
- end
87
-
88
- # Raised when the gateway believes this transaction to be a duplicate.
89
- class DuplicateError < DeclinedError
90
- end
91
-
92
- # Raised when a 3DS result token is needed to complete a transaction
93
- class ThreeDSecureError < DeclinedError
94
- def three_d_secure_action_token_id
95
- xml.text '/errors/transaction_error/three_d_secure_action_token_id'
96
- end
97
- end
98
-
99
- class << Error
100
- CATEGORY_MAP = Hash.new DeclinedError
101
- CATEGORY_MAP.update(
102
- 'communication' => RetryableError,
103
- 'configuration' => ConfigurationError,
104
- 'duplicate' => DuplicateError,
105
- '3d_secure_action_required' => ThreeDSecureError
106
- )
107
-
108
- def validate! exception, transaction
109
- return unless exception.is_a? API::UnprocessableEntity
110
-
111
- category = exception.send(:xml).text(
112
- '/errors/transaction_error/error_category'
113
- ) and raise CATEGORY_MAP[category].new(
114
- exception.request, exception.response, transaction
115
- )
116
- end
117
- end
118
- end
119
- end