recurly 2.18.21 → 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 (211) 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 -1103
  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 -145
  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 -173
  93. data/lib/recurly/account.rb +0 -209
  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 -46
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -81
  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 -113
  103. data/lib/recurly/coupon.rb +0 -136
  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 -304
  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 -238
  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/add_ons.rb +0 -82
  128. data/lib/recurly/subscription.rb +0 -366
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -18
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction/errors.rb +0 -115
  134. data/lib/recurly/transaction.rb +0 -131
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook/account_notification.rb +0 -13
  138. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  139. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  140. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  143. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  146. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  147. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  148. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  149. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  150. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  152. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  153. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  154. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  155. data/lib/recurly/webhook/item_notification.rb +0 -7
  156. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  157. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  167. data/lib/recurly/webhook/notification.rb +0 -18
  168. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  169. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  172. data/lib/recurly/webhook/prerenewal_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/scheduled_subscription_update_notification.rb +0 -6
  188. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  189. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  192. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  194. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  196. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  197. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  199. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  200. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  204. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  205. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  207. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  208. data/lib/recurly/webhook.rb +0 -113
  209. data/lib/recurly/xml/nokogiri.rb +0 -60
  210. data/lib/recurly/xml/rexml.rb +0 -52
  211. data/lib/recurly/xml.rb +0 -122
@@ -1,82 +0,0 @@
1
- module Recurly
2
- class Subscription < Resource
3
- class AddOns
4
- instance_methods.each do |method|
5
- undef_method method if method !~ /^__|^(object_id|respond_to\?|send)$/
6
- end
7
-
8
- # @param subscription [Subscription]
9
- # @param add_ons [Array, nil]
10
- def initialize subscription, add_ons = []
11
- @subscription, @add_ons = subscription, []
12
- add_ons and add_ons.each { |a| self << a }
13
- end
14
-
15
- # @return [self]
16
- # @param add_on [AddOn, String, Symbol, Hash] A {Plan} add-on,
17
- # +add_on_code+, or hash with optional <tt>:quantity</tt> and
18
- # <tt>:unit_amount_in_cents</tt> keys.
19
- # @example
20
- # pp subscription.add_ons << '1YEARWAR' << '1YEARWAR' << :BONUS
21
- # [
22
- # {:add_on_code => "1YEARWAR", :quantity => 2},
23
- # {:add_on_code => "BONUS"}
24
- # ]
25
- def << add_on
26
- add_on = SubscriptionAddOn.new(add_on, @subscription)
27
-
28
- exist = @add_ons.find do |a|
29
- source1 = a.add_on_source || "plan_add_on"
30
- source2 = add_on.add_on_source || "plan_add_on"
31
- a.add_on_code == add_on.add_on_code && source1 == source2
32
- end
33
-
34
- if exist
35
- exist.quantity ||= 1
36
- exist.quantity += add_on.quantity || 1
37
-
38
- if add_on.unit_amount_in_cents
39
- exist.unit_amount_in_cents = add_on.unit_amount_in_cents
40
- end
41
- else
42
- @add_ons << add_on
43
- end
44
-
45
- self
46
- end
47
-
48
- def to_a
49
- @add_ons.dup
50
- end
51
-
52
- def errors
53
- @add_ons.map { |add_on| add_on.errors }
54
- end
55
-
56
- def to_xml options = {}
57
- builder = options[:builder] || XML.new('<subscription_add_ons/>')
58
- @add_ons.each do |add_on|
59
- node = builder.add_element 'subscription_add_on'
60
- add_on.attributes.each_pair do |k, v|
61
- node.add_element k.to_s, v if v
62
- end
63
- end
64
- builder.to_s
65
- end
66
-
67
- def respond_to? method_name, include_private = false
68
- super || @add_ons.respond_to?(method_name, include_private)
69
- end
70
-
71
- private
72
-
73
- def method_missing name, *args, &block
74
- if @add_ons.respond_to? name
75
- return @add_ons.send name, *args, &block
76
- end
77
-
78
- super
79
- end
80
- end
81
- end
82
- end
@@ -1,366 +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 [Account]
27
- belongs_to :account
28
-
29
- # @return [Plan]
30
- belongs_to :plan
31
-
32
- # @return [Invoice, nil]
33
- has_one :invoice
34
-
35
- # @return [GiftCard, nil]
36
- has_one :gift_card
37
-
38
- # @return [ShippingAddress, nil]
39
- has_one :shipping_address, class_name: :ShippingAddress, readonly: false
40
-
41
- # @return [InvoiceCollection, nil]
42
- has_one :invoice_collection, class_name: :InvoiceCollection, readonly: true
43
-
44
- # @return [BillingInfo, nil]
45
- has_one :billing_info, class_name: :BillingInfo, readonly: false
46
-
47
- define_attribute_methods %w(
48
- uuid
49
- state
50
- unit_amount_in_cents
51
- cost_in_cents
52
- currency
53
- quantity
54
- updated_at
55
- activated_at
56
- canceled_at
57
- expires_at
58
- current_period_started_at
59
- current_period_ends_at
60
- trial_started_at
61
- trial_ends_at
62
- pending_subscription
63
- subscription_add_ons
64
- coupon_code
65
- coupon_codes
66
- total_billing_cycles
67
- remaining_billing_cycles
68
- net_terms
69
- collection_method
70
- po_number
71
- tax_in_cents
72
- tax_type
73
- tax_region
74
- tax_rate
75
- bulk
76
- bank_account_authorized_at
77
- terms_and_conditions
78
- customer_notes
79
- vat_reverse_charge_notes
80
- address
81
- revenue_schedule_type
82
- shipping_address_id
83
- shipping_method_code
84
- shipping_amount_in_cents
85
- timeframe
86
- started_with_gift
87
- converted_at
88
- billing_info_uuid
89
- no_billing_info_reason
90
- imported_trial
91
- credit_customer_notes
92
- remaining_pause_cycles
93
- paused_at
94
- auto_renew
95
- renewal_billing_cycles
96
- first_billing_date
97
- first_bill_date
98
- next_bill_date
99
- current_term_started_at
100
- current_term_ends_at
101
- total_amount_in_cents
102
- resume_at
103
- gateway_code
104
- transaction_type
105
- )
106
- alias to_param uuid
107
-
108
- def self.preview(attributes = {})
109
- new(attributes) { |record| record.preview }
110
- end
111
-
112
- def preview
113
- clear_errors
114
- @response = API.send(:post, "#{path}/preview", to_xml)
115
- reload response
116
- rescue API::UnprocessableEntity => e
117
- apply_errors e
118
- end
119
-
120
- # @return [Subscription] A new subscription.
121
- def initialize(attributes = {})
122
- super({ :currency => Recurly.default_currency }.merge attributes)
123
- end
124
-
125
- # Assign a Plan resource (rather than a plan code).
126
- #
127
- # @param plan [Plan]
128
- def plan= plan
129
- self.plan_code = (plan.plan_code if plan.respond_to? :plan_code)
130
- attributes[:plan] = plan
131
- end
132
-
133
- def plan_code
134
- self[:plan_code] ||= (plan.plan_code if plan.respond_to? :plan_code)
135
- end
136
-
137
- def plan_code= plan_code
138
- self[:plan_code] = plan_code
139
- end
140
-
141
- # Assign a Coupon resource (rather than a coupon code).
142
- #
143
- # @param coupon [Coupon]
144
- def coupon= coupon
145
- self.coupon_code = (
146
- coupon.coupon_code if coupon.respond_to? :coupon_code
147
- )
148
- attributes[:coupon] = coupon
149
- end
150
-
151
- # Assign Coupon resources (rather than coupon codes).
152
- #
153
- # @param coupons [[Coupons]]
154
- def coupons= coupons
155
- self.coupon_codes = coupons.map do |coupon|
156
- coupon.coupon_code if coupon.respond_to? :coupon_code
157
- end.compact
158
- attributes[:coupons] = coupons
159
- end
160
-
161
- # @return [AddOns]
162
- def subscription_add_ons
163
- self[:subscription_add_ons] ||= AddOns.new self, super
164
- end
165
- alias add_ons subscription_add_ons
166
-
167
- # Assign an array of subscription add-ons.
168
- def subscription_add_ons= subscription_add_ons
169
- super AddOns.new self, subscription_add_ons
170
- end
171
- alias add_ons= subscription_add_ons=
172
-
173
- def pending_subscription
174
- sub = self[:pending_subscription]
175
- sub.tap {|e| e.currency = currency} if sub.is_a? Subscription
176
- end
177
-
178
- # Convert free trial to paid subscription when transaction_type is "moto"
179
- # which stands for "Mail Order Telephone Order".
180
- #
181
- # @return true
182
- def convert_trial_moto()
183
- builder = XML.new("<subscription/>")
184
- builder.add_element('transaction_type', "moto")
185
- reload API.put("#{uri}/convert_trial", builder.to_s)
186
- true
187
- end
188
-
189
- # Convert free trial to paid subscription. Optionally uses a 3ds token.
190
- #
191
- # @param three_d_secure_action_result_token_id [String] three_d_secure_action_result_token_id
192
- # returned by Recurly.js referencing the result of the 3DS authentication for PSD2
193
- # @return true when payment is accepted
194
- def convert_trial(three_d_secure_action_result_token_id = nil)
195
- body = if three_d_secure_action_result_token_id != nil
196
- builder = Recurly::XML.new("<subscription/>")
197
- account = builder.add_element('account')
198
- billing_info = account.add_element('billing_info')
199
- billing_info.add_element('three_d_secure_action_result_token_id', three_d_secure_action_result_token_id)
200
- builder.to_s
201
- end
202
-
203
- reload API.put("#{uri}/convert_trial", body)
204
- true
205
- end
206
-
207
- # Cancel a subscription so that it will not renew.
208
- #
209
- # @param [String] optional timeframe. Choose one of "bill_date" or "term_end"
210
- # @return [true, false] +true+ when successful, +false+ when unable to
211
- # (e.g., the subscription is not active).
212
- # @example
213
- # account = Account.find account_code
214
- # subscription = account.subscriptions.first
215
- # subscription.cancel # => true
216
- def cancel(timeframe = nil)
217
- return false unless link? :cancel
218
- params = timeframe.nil? ? {} : { 'timeframe': timeframe }
219
- reload follow_link :cancel, params: params
220
- true
221
- end
222
-
223
- # An array of acceptable refund types.
224
- REFUND_TYPES = ['none', 'full', 'partial'].freeze
225
-
226
- # Immediately terminate a subscription (with optional refund).
227
- #
228
- # @return [true, false] +true+ when successful, +false+ when unable to
229
- # (e.g., the subscription is not active).
230
- # @param refund_type [:none, :full, :partial] <tt>:none</tt> terminates the
231
- # subscription with no refund (the default), <tt>:full</tt> refunds the
232
- # subscription in full, and <tt>:partial</tt> refunds the subscription in
233
- # part.
234
- # @raise [ArgumentError] Invalid +refund_type+.
235
- # @example
236
- # account = Account.find account_code
237
- # subscription = account.subscriptions.first
238
- # subscription.terminate(:partial) # => true
239
- def terminate refund_type = :none
240
- return false unless link? :terminate
241
- unless REFUND_TYPES.include? refund_type.to_s
242
- raise ArgumentError, "refund must be one of: #{REFUND_TYPES.join ', '}"
243
- end
244
- reload follow_link(:terminate, :params => { :refund => refund_type })
245
- true
246
- end
247
- alias destroy terminate
248
-
249
- # Reactivate a subscription.
250
- #
251
- # @return [true, false] +true+ when successful, +false+ when unable to
252
- # (e.g., the subscription is already active), and may raise an exception
253
- # if the reactivation fails.
254
- def reactivate
255
- return false unless link? :reactivate
256
- reload follow_link :reactivate
257
- true
258
- end
259
-
260
- # Postpone a subscription's renewal date.
261
- #
262
- # @return [true, false] +true+ when successful, +false+ when unable to
263
- # (e.g., the subscription is not active).
264
- # @param next_bill_date [Time] when the subscription should renew.
265
- # @param bulk [boolean] set to true for bulk updates (bypassing 60 second wait).
266
- def postpone next_bill_date, bulk=false
267
- return false unless link? :postpone
268
- reload follow_link(:postpone,
269
- :params => { :next_bill_date => next_bill_date, :bulk => bulk }
270
- )
271
- true
272
- end
273
-
274
- # Update the notes sections of the subscription. This endpoint also allows you to
275
- # update the custom fields.
276
- #
277
- # @example
278
- # subscription.custom_fields.first.value = nil
279
- # subscription.update_notes(terms_and_conditions: 'New T&C')
280
- # #=>
281
- # # <subscription>
282
- # # <custom_fields><custom_field><name>food</name><value nil="nil"/><custom_field></custom_fields>
283
- # # <terms_and_conditions>New T&C</terms_and_conditions>
284
- # # </subscription>
285
- # # it's also okay to call without notes
286
- # subscription.update_notes({})
287
- #
288
- # @param notes [Hash] should be the notes parameters you wish to update
289
- # @return [true, false] +true+ when successful, +false+ when unable to
290
- def update_notes(notes)
291
- return false unless link? :notes
292
- self.attributes = notes
293
- reload follow_link(:notes, body: to_xml)
294
- true
295
- end
296
-
297
- # Pauses a subscription or cancels a scheduled pause.
298
- #
299
- # * For an active subscription without a pause scheduled already,
300
- # this will schedule a pause period to begin at the next renewal
301
- # date for the specified number of billing cycles (remaining_pause_cycles).
302
- # * When a scheduled pause already exists, this will update the remaining
303
- # pause cycles with the new value sent. When zero (0) remaining_pause_cycles
304
- # is sent for a subscription with a scheduled pause, the pause will be canceled.
305
- # * For a paused subscription, the remaining_pause_cycles will adjust the
306
- # length of the current pause period. Sending zero (0) in the remaining_pause_cycles
307
- # field will cause the subscription to be resumed at the next renewal date.
308
- #
309
- # @param remaining_pause_cycles [Integer] The number of billing cycles that the subscription will be paused.
310
- # @return true
311
- def pause(remaining_pause_cycles)
312
- builder = XML.new("<subscription/>")
313
- builder.add_element('remaining_pause_cycles', remaining_pause_cycles)
314
- reload API.put("#{uri}/pause", builder.to_s)
315
- true
316
- end
317
-
318
- # Resumes a paused subscription.
319
- #
320
- # For a paused subscription, this will immediately resume the subscription
321
- # from the pause, produce an invoice, and return the newly resumed subscription.
322
- # Any at-renewal subscription changes will be immediately applied
323
- # when the subscription resumes.
324
- #
325
- # @return true
326
- def resume
327
- reload API.put("#{uri}/resume")
328
- true
329
- end
330
-
331
- # Overrides the behavior of `update_attributes` in Resource class so ensure
332
- # all attributes are marked as dirty if the plan code changes
333
- def update_attributes attributes = {}
334
- clear_attributes_if_plan_code_changed attributes
335
- super
336
- end
337
-
338
- def update_attributes! attributes = {}
339
- clear_attributes_if_plan_code_changed attributes
340
- super
341
- end
342
-
343
- def signable_attributes
344
- super.merge :plan_code => plan_code
345
- end
346
-
347
- def changed_attributes
348
- attrs = super
349
- if custom_fields.any?(&:changed?)
350
- attrs['custom_fields'] = custom_fields.select(&:changed?)
351
- end
352
- attrs
353
- end
354
-
355
-
356
- private
357
-
358
- def clear_attributes_if_plan_code_changed attributes
359
- if attributes[:plan_code] != plan_code
360
- attributes.each do |key, value|
361
- self.attributes[key.to_s] = nil
362
- end
363
- end
364
- end
365
- end
366
- end
@@ -1,58 +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
- define_attribute_methods %w(
13
- add_on_code
14
- quantity
15
- unit_amount_in_cents
16
- add_on_type
17
- usage_type
18
- usage_percentage
19
- add_on_source
20
- )
21
-
22
- attr_reader :subscription
23
-
24
- def initialize add_on = nil, subscription = nil
25
- super()
26
-
27
- case add_on
28
- when AddOn, SubscriptionAddOn
29
- @add_on = add_on if add_on.is_a? AddOn
30
- self.add_on_code = add_on.add_on_code
31
- self.quantity = add_on.quantity
32
- if add_on.unit_amount_in_cents
33
- self.unit_amount_in_cents = add_on.unit_amount_in_cents.to_i
34
- end
35
- if add_on.respond_to? :add_on_source
36
- self.add_on_source = add_on.add_on_source
37
- end
38
- self.tiers = add_on.tiers if add_on.tiers.any?
39
- when Hash
40
- self.attributes = add_on
41
- when String, Symbol
42
- self.add_on_code = add_on
43
- end
44
-
45
- self.add_on_code = add_on_code.to_s
46
-
47
- @subscription = subscription
48
- end
49
-
50
- def add_on
51
- @add_on ||= subscription.plan.add_ons.find add_on_code
52
- end
53
-
54
- def currency
55
- subscription.currency if subscription
56
- end
57
- end
58
- end