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.
- checksums.yaml +4 -4
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +158 -110
- data/Rakefile +6 -0
- data/bin/bundle +105 -0
- data/bin/coderay +29 -0
- data/bin/console +14 -0
- data/bin/htmldiff +29 -0
- data/bin/ldiff +29 -0
- data/bin/pry +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/bin/yard +29 -0
- data/bin/yardoc +29 -0
- data/bin/yri +29 -0
- data/lib/data/ca-certificates.crt +31 -0
- data/lib/recurly/client/operations.rb +935 -0
- data/lib/recurly/client.rb +198 -0
- data/lib/recurly/errors/api_errors.rb +35 -0
- data/lib/recurly/errors/network_errors.rb +8 -0
- data/lib/recurly/errors.rb +34 -0
- data/lib/recurly/pager.rb +119 -0
- data/lib/recurly/request.rb +30 -0
- data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
- data/lib/recurly/requests/account_create_only.rb +18 -0
- data/lib/recurly/requests/account_updatable.rb +50 -0
- data/lib/recurly/requests/add_on_create.rb +38 -0
- data/lib/recurly/requests/add_on_update.rb +38 -0
- data/lib/recurly/requests/address.rb +42 -0
- data/lib/recurly/requests/billing_info_create.rb +58 -0
- data/lib/recurly/requests/coupon_create_only.rb +66 -0
- data/lib/recurly/requests/coupon_updatable.rb +30 -0
- data/lib/recurly/requests/create_account.rb +62 -0
- data/lib/recurly/requests/create_coupon.rb +90 -0
- data/lib/recurly/requests/invoice_create.rb +42 -0
- data/lib/recurly/requests/invoice_refund.rb +30 -0
- data/lib/recurly/requests/line_item_create.rb +46 -0
- data/lib/recurly/requests/plan_create.rb +66 -0
- data/lib/recurly/requests/plan_update.rb +70 -0
- data/lib/recurly/requests/shipping_address_create.rb +58 -0
- data/lib/recurly/requests/shipping_address_update.rb +62 -0
- data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
- data/lib/recurly/requests/subscription_change_create.rb +42 -0
- data/lib/recurly/requests/subscription_create.rb +86 -0
- data/lib/recurly/requests/subscription_update.rb +42 -0
- data/lib/recurly/requests/update_coupon.rb +30 -0
- data/lib/recurly/resource.rb +16 -1114
- data/lib/recurly/resources/account.rb +86 -0
- data/lib/recurly/resources/account_acquisition.rb +42 -0
- data/lib/recurly/resources/account_balance.rb +22 -0
- data/lib/recurly/resources/account_note.rb +30 -0
- data/lib/recurly/resources/add_on.rb +62 -0
- data/lib/recurly/resources/address.rb +42 -0
- data/lib/recurly/resources/billing_info.rb +62 -0
- data/lib/recurly/resources/coupon.rb +110 -0
- data/lib/recurly/resources/coupon_discount.rb +22 -0
- data/lib/recurly/resources/coupon_redemption.rb +46 -0
- data/lib/recurly/resources/credit_payment.rb +62 -0
- data/lib/recurly/resources/error.rb +18 -0
- data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
- data/lib/recurly/resources/invoice.rb +138 -0
- data/lib/recurly/resources/invoice_collection.rb +18 -0
- data/lib/recurly/resources/line_item.rb +166 -0
- data/lib/recurly/resources/plan.rb +86 -0
- data/lib/recurly/resources/settings.rb +18 -0
- data/lib/recurly/resources/shipping_address.rb +74 -0
- data/lib/recurly/resources/site.rb +46 -0
- data/lib/recurly/resources/subscription.rb +134 -0
- data/lib/recurly/resources/subscription_add_on.rb +42 -0
- data/lib/recurly/resources/subscription_change.rb +54 -0
- data/lib/recurly/resources/tax_info.rb +18 -0
- data/lib/recurly/resources/transaction.rb +146 -0
- data/lib/recurly/resources/unique_coupon_code.rb +38 -0
- data/lib/recurly/resources/user.rb +38 -0
- data/lib/recurly/schema/json_deserializer.rb +53 -0
- data/lib/recurly/schema/json_parser.rb +71 -0
- data/lib/recurly/schema/request_caster.rb +66 -0
- data/lib/recurly/schema/schema_factory.rb +50 -0
- data/lib/recurly/schema/schema_validator.rb +125 -0
- data/lib/recurly/schema.rb +114 -0
- data/lib/recurly/version.rb +1 -10
- data/lib/recurly.rb +14 -167
- data/recurly.gemspec +32 -0
- data/scripts/build +4 -0
- data/scripts/clean +6 -0
- data/scripts/test +3 -0
- metadata +129 -196
- data/lib/recurly/account.rb +0 -230
- data/lib/recurly/account_acquisition.rb +0 -27
- data/lib/recurly/account_balance.rb +0 -23
- data/lib/recurly/add_on.rb +0 -52
- data/lib/recurly/address.rb +0 -25
- data/lib/recurly/adjustment.rb +0 -100
- data/lib/recurly/api/errors.rb +0 -208
- data/lib/recurly/api/net_http_adapter.rb +0 -111
- data/lib/recurly/api.rb +0 -110
- data/lib/recurly/billing_info.rb +0 -134
- data/lib/recurly/business_entity.rb +0 -35
- data/lib/recurly/coupon.rb +0 -136
- data/lib/recurly/credit_payment.rb +0 -32
- data/lib/recurly/currency_percentage_tier.rb +0 -17
- data/lib/recurly/custom_field.rb +0 -15
- data/lib/recurly/custom_field_definition.rb +0 -14
- data/lib/recurly/customer_permission.rb +0 -10
- data/lib/recurly/delivery.rb +0 -19
- data/lib/recurly/dunning_campaign.rb +0 -30
- data/lib/recurly/dunning_cycle.rb +0 -18
- data/lib/recurly/entitlement.rb +0 -19
- data/lib/recurly/error.rb +0 -13
- data/lib/recurly/external_account.rb +0 -17
- data/lib/recurly/external_charge.rb +0 -20
- data/lib/recurly/external_invoice.rb +0 -27
- data/lib/recurly/external_payment_phase.rb +0 -27
- data/lib/recurly/external_product.rb +0 -34
- data/lib/recurly/external_product_reference.rb +0 -18
- data/lib/recurly/external_subscription.rb +0 -62
- data/lib/recurly/gateway_attribute.rb +0 -10
- data/lib/recurly/general_ledger_account.rb +0 -16
- data/lib/recurly/gift_card.rb +0 -85
- data/lib/recurly/helper.rb +0 -51
- data/lib/recurly/invoice.rb +0 -354
- data/lib/recurly/invoice_collection.rb +0 -14
- data/lib/recurly/invoice_template.rb +0 -14
- data/lib/recurly/item.rb +0 -36
- data/lib/recurly/js.rb +0 -14
- data/lib/recurly/juris_detail.rb +0 -15
- data/lib/recurly/measured_unit.rb +0 -16
- data/lib/recurly/money.rb +0 -120
- data/lib/recurly/note.rb +0 -14
- data/lib/recurly/percentage_tier.rb +0 -17
- data/lib/recurly/performance_obligation.rb +0 -15
- data/lib/recurly/plan.rb +0 -59
- data/lib/recurly/plan_ramp_interval.rb +0 -10
- data/lib/recurly/purchase.rb +0 -239
- data/lib/recurly/redemption.rb +0 -46
- data/lib/recurly/resource/association.rb +0 -16
- data/lib/recurly/resource/errors.rb +0 -20
- data/lib/recurly/resource/pager.rb +0 -313
- data/lib/recurly/rev_rec.rb +0 -18
- data/lib/recurly/shipping_address.rb +0 -26
- data/lib/recurly/shipping_fee.rb +0 -17
- data/lib/recurly/shipping_method.rb +0 -13
- data/lib/recurly/sub_add_on_percentage_tier.rb +0 -17
- data/lib/recurly/subscription/add_ons.rb +0 -82
- data/lib/recurly/subscription.rb +0 -374
- data/lib/recurly/subscription_add_on.rb +0 -64
- data/lib/recurly/subscription_ramp_interval.rb +0 -12
- data/lib/recurly/tax_detail.rb +0 -18
- data/lib/recurly/tax_type.rb +0 -13
- data/lib/recurly/tier.rb +0 -18
- data/lib/recurly/transaction/errors.rb +0 -119
- data/lib/recurly/transaction.rb +0 -132
- data/lib/recurly/usage.rb +0 -29
- data/lib/recurly/verify.rb +0 -12
- data/lib/recurly/webhook/account_notification.rb +0 -13
- data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
- data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
- data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
- data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/dunning_notification.rb +0 -14
- data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
- data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
- data/lib/recurly/webhook/gift_card_notification.rb +0 -8
- data/lib/recurly/webhook/invoice_notification.rb +0 -12
- data/lib/recurly/webhook/item_notification.rb +0 -7
- data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/new_account_notification.rb +0 -6
- data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
- data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
- data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/new_item_notification.rb +0 -6
- data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/new_usage_notification.rb +0 -8
- data/lib/recurly/webhook/notification.rb +0 -18
- data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
- data/lib/recurly/webhook/prerenewal_notification.rb +0 -6
- data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
- data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
- data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
- data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
- data/lib/recurly/webhook/scheduled_subscription_update_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_notification.rb +0 -12
- data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
- data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
- data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
- data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
- data/lib/recurly/webhook/transaction_notification.rb +0 -12
- data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
- data/lib/recurly/webhook/updated_account_notification.rb +0 -6
- data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
- data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
- data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/updated_item_notification.rb +0 -6
- data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
- data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
- data/lib/recurly/webhook/void_payment_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
- data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
- data/lib/recurly/webhook.rb +0 -113
- data/lib/recurly/xml/nokogiri.rb +0 -60
- data/lib/recurly/xml/rexml.rb +0 -52
- data/lib/recurly/xml.rb +0 -122
data/lib/recurly/subscription.rb
DELETED
@@ -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
|
data/lib/recurly/tax_detail.rb
DELETED
data/lib/recurly/tax_type.rb
DELETED
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
|