recurly 2.20.5 → 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 +132 -199
- 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 -101
- 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 -86
- data/lib/recurly/helper.rb +0 -51
- data/lib/recurly/invoice.rb +0 -355
- 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 -240
- 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/money.rb
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
# Represents a collection of currencies (in cents).
|
|
3
|
-
class Money
|
|
4
|
-
# @return A money object representing multiple currencies (in cents).
|
|
5
|
-
# @param currencies [Hash] A hash of currency codes and amounts.
|
|
6
|
-
# @example
|
|
7
|
-
# # 12 United States dollars.
|
|
8
|
-
# Recurly::Money.new :USD => 12_00
|
|
9
|
-
#
|
|
10
|
-
# # $9.99 (or €6.99).
|
|
11
|
-
# Recurly::Money.new :USD => 9_99, :EUR => 6_99
|
|
12
|
-
#
|
|
13
|
-
# # Using a default currency.
|
|
14
|
-
# Recurly.default_currency = 'USD'
|
|
15
|
-
# Recurly::Money.new(49_00) # => #<Recurly::Money USD: 49_00>
|
|
16
|
-
def initialize currencies = {}, parent = nil, attribute = nil
|
|
17
|
-
@currencies = {}
|
|
18
|
-
@parent = parent
|
|
19
|
-
@attribute = attribute
|
|
20
|
-
|
|
21
|
-
if currencies.respond_to? :each_pair
|
|
22
|
-
currencies.each_pair { |key, value| @currencies[key.to_s] = value }
|
|
23
|
-
elsif Recurly.default_currency
|
|
24
|
-
self[Recurly.default_currency] = currencies
|
|
25
|
-
else
|
|
26
|
-
message = 'expected a Hash'
|
|
27
|
-
message << ' or Numeric' if Recurly.default_currency
|
|
28
|
-
message << " but received #{currencies.class}"
|
|
29
|
-
raise ArgumentError, message
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def [] code
|
|
34
|
-
currencies[code.to_s]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def []= code, amount
|
|
38
|
-
currencies[code.to_s] = amount
|
|
39
|
-
@parent.send "#@attribute=", dup if @parent
|
|
40
|
-
amount
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# @return [Hash] A hash of currency codes to amounts.
|
|
44
|
-
def to_hash
|
|
45
|
-
currencies.dup
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# @return [true, false] Whether or not the currency is equal to another
|
|
49
|
-
# instance.
|
|
50
|
-
# @param other [Money]
|
|
51
|
-
def eql? other
|
|
52
|
-
other.respond_to?(:currencies) && currencies.eql?(other.currencies)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# @return [Integer] Unique identifier.
|
|
56
|
-
# @see Hash#hash
|
|
57
|
-
def hash
|
|
58
|
-
currencies.hash
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# Implemented so that solitary currencies can be compared and sorted.
|
|
62
|
-
#
|
|
63
|
-
# @return [-1, 0, 1]
|
|
64
|
-
# @param other [Money]
|
|
65
|
-
# @example
|
|
66
|
-
# [Recurly::Money.new(2_00), Recurly::Money.new(1_00)].sort
|
|
67
|
-
# # => [#<Recurly::Money USD: 1_00>, #<Recurly::Money USD: 2_00>]
|
|
68
|
-
# @see Hash#<=>
|
|
69
|
-
def <=> other
|
|
70
|
-
if currencies.keys.length == 1 && other.currencies.length == 1
|
|
71
|
-
if currencies.keys == other.currencies.keys
|
|
72
|
-
return currencies.values.first <=> other.currencies.values.first
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
currencies <=> other.currencies
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
# @return [true, false]
|
|
80
|
-
# @see Object#respond_to?
|
|
81
|
-
def respond_to? method_name, include_private = false
|
|
82
|
-
super || currencies.respond_to?(method_name, include_private)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# @return [String]
|
|
86
|
-
def inspect
|
|
87
|
-
string = "#<#{self.class}"
|
|
88
|
-
if currencies.any?
|
|
89
|
-
string << " %s" % currencies.keys.sort.map { |code|
|
|
90
|
-
value = currencies[code].to_s
|
|
91
|
-
value.gsub!(/^(\d)$/, '0_0\1')
|
|
92
|
-
value.gsub!(/^(\d{2})$/, '0_\1')
|
|
93
|
-
value.gsub!(/(\d)(\d{2})$/, '\1_\2')
|
|
94
|
-
value.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, '\1_')
|
|
95
|
-
"#{code}: #{value}"
|
|
96
|
-
}.join(', ')
|
|
97
|
-
end
|
|
98
|
-
string << '>'
|
|
99
|
-
end
|
|
100
|
-
alias to_s inspect
|
|
101
|
-
|
|
102
|
-
attr_reader :currencies
|
|
103
|
-
|
|
104
|
-
private
|
|
105
|
-
|
|
106
|
-
def method_missing name, *args, &block
|
|
107
|
-
if currencies.respond_to? name
|
|
108
|
-
return currencies.send name, *args, &block
|
|
109
|
-
elsif c = currencies[Recurly.default_currency] and c.respond_to? name
|
|
110
|
-
if currencies.keys.length > 1
|
|
111
|
-
raise TypeError, "can't convert multicurrency into Integer"
|
|
112
|
-
else
|
|
113
|
-
return c.send name, *args, &block
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
super
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
data/lib/recurly/note.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
class PercentageTier < Resource
|
|
3
|
-
|
|
4
|
-
belongs_to :currency_percentage_tier
|
|
5
|
-
|
|
6
|
-
define_attribute_methods %w(
|
|
7
|
-
ending_amount_in_cents
|
|
8
|
-
usage_percentage
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
def xml_keys
|
|
12
|
-
attributes.keys
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
embedded! true
|
|
16
|
-
end
|
|
17
|
-
end
|
data/lib/recurly/plan.rb
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
# Recurly Documentation: https://dev.recurly.com/docs/list-plans
|
|
3
|
-
class Plan < Resource
|
|
4
|
-
|
|
5
|
-
# @return [Pager<AddOn>, []]
|
|
6
|
-
has_many :add_ons
|
|
7
|
-
|
|
8
|
-
# @return <ExternalProduct>
|
|
9
|
-
has_one :external_product
|
|
10
|
-
|
|
11
|
-
# @return [[PlanRampInterval], nil]
|
|
12
|
-
has_many :ramp_intervals, class_name: :PlanRampInterval
|
|
13
|
-
|
|
14
|
-
# @return [[CustomField], []]
|
|
15
|
-
has_many :custom_fields, class_name: :CustomField, readonly: false
|
|
16
|
-
|
|
17
|
-
# Define attribute methods
|
|
18
|
-
define_attribute_methods %w(
|
|
19
|
-
plan_code
|
|
20
|
-
name
|
|
21
|
-
description
|
|
22
|
-
success_url
|
|
23
|
-
cancel_url
|
|
24
|
-
display_donation_amounts
|
|
25
|
-
display_quantity
|
|
26
|
-
display_phone_number
|
|
27
|
-
bypass_hosted_confirmation
|
|
28
|
-
unit_name
|
|
29
|
-
payment_page_tos_link
|
|
30
|
-
payment_page_css
|
|
31
|
-
setup_fee_in_cents
|
|
32
|
-
unit_amount_in_cents
|
|
33
|
-
plan_interval_length
|
|
34
|
-
plan_interval_unit
|
|
35
|
-
pricing_model
|
|
36
|
-
ramp_intervals
|
|
37
|
-
trial_interval_length
|
|
38
|
-
trial_interval_unit
|
|
39
|
-
total_billing_cycles
|
|
40
|
-
accounting_code
|
|
41
|
-
setup_fee_accounting_code
|
|
42
|
-
revenue_schedule_type
|
|
43
|
-
setup_fee_revenue_schedule_type
|
|
44
|
-
tax_exempt
|
|
45
|
-
tax_code
|
|
46
|
-
vertex_transaction_type
|
|
47
|
-
trial_requires_billing_info
|
|
48
|
-
auto_renew
|
|
49
|
-
allow_any_item_on_subscriptions
|
|
50
|
-
avalara_transaction_type
|
|
51
|
-
avalara_service_type
|
|
52
|
-
dunning_campaign_id
|
|
53
|
-
custom_fields
|
|
54
|
-
created_at
|
|
55
|
-
updated_at
|
|
56
|
-
) + RevRec::PLAN_ATTRIBUTES
|
|
57
|
-
alias to_param plan_code
|
|
58
|
-
end
|
|
59
|
-
end
|
data/lib/recurly/purchase.rb
DELETED
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
# The Purchase object works in a slightly different way than the rest of the models.
|
|
3
|
-
# You build up the purchase data into an object then pass to either:
|
|
4
|
-
# {Purchase.invoice!} or {Purchase.preview!} and it will
|
|
5
|
-
# return an {InvoiceCollection}.
|
|
6
|
-
#
|
|
7
|
-
# You can build your purchase object with a new account or an existing account.
|
|
8
|
-
# For an existing account, you just need an account_code:
|
|
9
|
-
# Recurly::Purchase.new({account: {account_code: 'myexistingaccount'}})
|
|
10
|
-
# or
|
|
11
|
-
# account = Recurly::Account.find('existing_account')
|
|
12
|
-
# Recurly::Purchase.new({account: account})
|
|
13
|
-
# or
|
|
14
|
-
# account = Recurly::Account.find('existing_account')
|
|
15
|
-
# purchase = Recurly::Purchase.new
|
|
16
|
-
# purchase.account = account
|
|
17
|
-
#
|
|
18
|
-
# For a new account, you can pass in {Account} data, {BillingInfo} data, etc
|
|
19
|
-
# in the same way you would when creating a {Subscription} with a new account.
|
|
20
|
-
#
|
|
21
|
-
# You can also pass in adjustments and invoicing data to be added to the invoice.
|
|
22
|
-
#
|
|
23
|
-
# There are multiple ways to set the shipping addresses:
|
|
24
|
-
# 1. Use {Purchase#shipping_address_id} if you want to apply an existing shipping
|
|
25
|
-
# address to all subscriptions, adjustments, and shipping fees in this purchase.
|
|
26
|
-
# 2. Use {Purchase#shipping_address} if you want to add and apply a single shipping address.
|
|
27
|
-
# 3. Use {Subscription#shipping_address_id} or {Subscription#shipping_address}
|
|
28
|
-
# to set a shipping address for only the subscription.
|
|
29
|
-
# 4. Use {Adjustment#shipping_address_id} or {Adjustment#shipping_address}
|
|
30
|
-
# to set a shipping address for only the adjustment.
|
|
31
|
-
# 5. Use {ShippingFee#shipping_address_id} or {ShippingFee#shipping_address}
|
|
32
|
-
# to set a shipping address for only the shipping fee. If there are multiple
|
|
33
|
-
# shipping fees on a single purchase, each can have its own shipping address.
|
|
34
|
-
# This way, if you ship different adjustments to multiple addresses, the
|
|
35
|
-
# shipping fees on the purchase can be associated with the same address
|
|
36
|
-
# as the adjustment.
|
|
37
|
-
#
|
|
38
|
-
# @example
|
|
39
|
-
# require 'securerandom'
|
|
40
|
-
#
|
|
41
|
-
# purchase = Recurly::Purchase.new(
|
|
42
|
-
# currency: 'USD',
|
|
43
|
-
# collection_method: :automatic,
|
|
44
|
-
# account: {
|
|
45
|
-
# account_code: SecureRandom.uuid,
|
|
46
|
-
# billing_info: {
|
|
47
|
-
# first_name: 'Benjamin',
|
|
48
|
-
# last_name: 'Du Monde',
|
|
49
|
-
# address1: '400 Alabama St.',
|
|
50
|
-
# city: 'San Francisco',
|
|
51
|
-
# state: 'CA',
|
|
52
|
-
# zip: '94110',
|
|
53
|
-
# country: 'US',
|
|
54
|
-
# number: '4111-1111-1111-1111',
|
|
55
|
-
# month: 12,
|
|
56
|
-
# year: 2019,
|
|
57
|
-
# }
|
|
58
|
-
# },
|
|
59
|
-
# adjustments: [
|
|
60
|
-
# {
|
|
61
|
-
# product_code: 'product_1',
|
|
62
|
-
# unit_amount_in_cents: 1000,
|
|
63
|
-
# quantity: 1,
|
|
64
|
-
# revenue_schedule_type: :at_invoice
|
|
65
|
-
# },
|
|
66
|
-
# {
|
|
67
|
-
# product_code: 'product_2',
|
|
68
|
-
# unit_amount_in_cents: 3000,
|
|
69
|
-
# quantity: 5,
|
|
70
|
-
# revenue_schedule_type: :at_invoice
|
|
71
|
-
# }
|
|
72
|
-
# ],
|
|
73
|
-
# shipping_address: {
|
|
74
|
-
# first_name: 'Benjamin',
|
|
75
|
-
# last_name: 'Du Monde',
|
|
76
|
-
# address1: '400 Dolores St.',
|
|
77
|
-
# city: 'San Francisco',
|
|
78
|
-
# state: 'CA',
|
|
79
|
-
# zip: '94110',
|
|
80
|
-
# country: 'US',
|
|
81
|
-
# nickname: 'Home'
|
|
82
|
-
# },
|
|
83
|
-
# shipping_fees: [
|
|
84
|
-
# {
|
|
85
|
-
# shipping_method_code: 'fast_fast_fast',
|
|
86
|
-
# shipping_amount_in_cents: '999'
|
|
87
|
-
# }
|
|
88
|
-
# ]
|
|
89
|
-
# )
|
|
90
|
-
#
|
|
91
|
-
# begin
|
|
92
|
-
# preview_collection = Recurly::Purchase.preview!(purchase)
|
|
93
|
-
# puts preview_collection.inspect
|
|
94
|
-
# rescue Recurly::Resource::Invalid => e
|
|
95
|
-
# # Invalid data
|
|
96
|
-
# end
|
|
97
|
-
#
|
|
98
|
-
# begin
|
|
99
|
-
# invoice_collection = Recurly::Purchase.invoice!(purchase)
|
|
100
|
-
# puts invoice_collection.inspect
|
|
101
|
-
# rescue Recurly::Resource::Invalid => e
|
|
102
|
-
# # Invalid data
|
|
103
|
-
# rescue Recurly::Transaction::DeclinedError => e
|
|
104
|
-
# # Display e.message and/or subscription (and associated) errors...
|
|
105
|
-
# rescue Recurly::Transaction::RetryableError => e
|
|
106
|
-
# # You should be able to attempt to save this again later.
|
|
107
|
-
# rescue Recurly::Transaction::Error => e
|
|
108
|
-
# # Fallback transaction error
|
|
109
|
-
# # e.transaction
|
|
110
|
-
# # e.transaction_error_code
|
|
111
|
-
# end
|
|
112
|
-
class Purchase < Resource
|
|
113
|
-
# @return [[Adjustment], nil]
|
|
114
|
-
has_many :adjustments, class_name: :Adjustment, readonly: false
|
|
115
|
-
|
|
116
|
-
# @return [Account, nil]
|
|
117
|
-
has_one :account, class_name: :Account, readonly: false
|
|
118
|
-
|
|
119
|
-
# @return [GiftCard, nil]
|
|
120
|
-
has_one :gift_card, class_name: :GiftCard, readonly: false
|
|
121
|
-
|
|
122
|
-
# @return [ShippingAddress, nil]
|
|
123
|
-
has_one :shipping_address, class_name: :ShippingAddress, readonly: false
|
|
124
|
-
|
|
125
|
-
# @return [[Subscription], nil]
|
|
126
|
-
has_many :subscriptions, class_name: :Subscription, readonly: false
|
|
127
|
-
|
|
128
|
-
# @return [[ShippingFee], nil]
|
|
129
|
-
has_many :shipping_fees, class_name: :ShippingFee, readonly: false
|
|
130
|
-
|
|
131
|
-
# @return [BillingInfo, nil]
|
|
132
|
-
has_one :billing_info, class_name: :BillingInfo, readonly: true
|
|
133
|
-
|
|
134
|
-
define_attribute_methods %w(
|
|
135
|
-
currency
|
|
136
|
-
collection_method
|
|
137
|
-
po_number
|
|
138
|
-
net_terms
|
|
139
|
-
net_terms_type
|
|
140
|
-
coupon_codes
|
|
141
|
-
terms_and_conditions
|
|
142
|
-
customer_notes
|
|
143
|
-
vat_reverse_charge_notes
|
|
144
|
-
shipping_address_id
|
|
145
|
-
gateway_code
|
|
146
|
-
transaction_type
|
|
147
|
-
vertex_transaction_type
|
|
148
|
-
billing_info_uuid
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
class << self
|
|
152
|
-
|
|
153
|
-
# Generate an invoice for the purchase and run any needed transactions.
|
|
154
|
-
#
|
|
155
|
-
# @param purchase [Purchase] The purchase data for the request.
|
|
156
|
-
# @return [InvoiceCollection] The saved invoice(s) representing this purchase.
|
|
157
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
|
158
|
-
# @raise [Transaction::Error] Raised if the transaction failed.
|
|
159
|
-
def invoice!(purchase)
|
|
160
|
-
post(purchase, collection_path)
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
# Generate a preview invoice for the purchase. Runs validations
|
|
164
|
-
# but does not run any transactions.
|
|
165
|
-
#
|
|
166
|
-
# @param purchase [Purchase] The purchase data for the request.
|
|
167
|
-
# @return [InvoiceCollection] The preview invoice(s) representing this purchase.
|
|
168
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
|
169
|
-
def preview!(purchase)
|
|
170
|
-
post(purchase, "#{collection_path}/preview")
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
# Generate an authorized invoice for the purchase. Runs validations
|
|
174
|
-
# but does not run any transactions. This endpoint will create a
|
|
175
|
-
# pending purchase that can be activated at a later time once payment
|
|
176
|
-
# has been completed on an external source (e.g. Adyen's Hosted
|
|
177
|
-
# Payment Pages).
|
|
178
|
-
#
|
|
179
|
-
# @param purchase [Purchase] The purchase data for the request.
|
|
180
|
-
# @return [InvoiceCollection] The authorized invoice collection representing this purchase.
|
|
181
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
|
182
|
-
def authorize!(purchase)
|
|
183
|
-
post(purchase, "#{collection_path}/authorize")
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
# Use for Adyen HPP transaction requests. Runs validations
|
|
187
|
-
# but does not run any transactions.
|
|
188
|
-
#
|
|
189
|
-
# @param purchase [Purchase] The purchase data for the request.
|
|
190
|
-
# @return [InvoiceCollection] The authorized invoice collection representing this purchase.
|
|
191
|
-
# @raise [Invalid] Raised if the purchase cannot be invoiced.
|
|
192
|
-
def pending!(purchase)
|
|
193
|
-
post(purchase, "#{collection_path}/pending")
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
# Allows the merchant to cancel an authorization.
|
|
197
|
-
#
|
|
198
|
-
# @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
|
|
199
|
-
# @return [InvoiceCollection] The canceled invoice collection.
|
|
200
|
-
# @raise [Invalid] Raised if the authorization cannot be canceled.
|
|
201
|
-
def cancel!(transaction_uuid)
|
|
202
|
-
post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/cancel")
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
# Allows the merchants to initiate a capture transaction tied to the original authorization.
|
|
206
|
-
#
|
|
207
|
-
# @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
|
|
208
|
-
# @return [InvoiceCollection] The captured invoice collection.
|
|
209
|
-
# @raise [Invalid] Raised if the authorization cannot be captured.
|
|
210
|
-
def capture!(transaction_uuid)
|
|
211
|
-
post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/capture")
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
def post(purchase, path)
|
|
215
|
-
body = purchase.nil? ? nil : purchase.to_xml
|
|
216
|
-
response = API.send(:post, path, body)
|
|
217
|
-
InvoiceCollection.from_response(response)
|
|
218
|
-
rescue API::UnprocessableEntity => e
|
|
219
|
-
purchase.apply_errors(e) if purchase
|
|
220
|
-
Transaction::Error.validate!(e, nil)
|
|
221
|
-
raise Resource::Invalid.new(purchase)
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
# TODO
|
|
226
|
-
# This is a temporary solution which allows us to
|
|
227
|
-
# embed these resources in a purchase without changing their
|
|
228
|
-
# interface. It will be removed once we get rid of default_currency.
|
|
229
|
-
def to_xml(options = {})
|
|
230
|
-
subscriptions.each {|s| s.currency = nil}
|
|
231
|
-
adjustments.each {|a| a.currency = nil}
|
|
232
|
-
super(options)
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
# This object does not represent a model on the server side
|
|
236
|
-
# so we do not need to expose these methods.
|
|
237
|
-
protected(*%w(save save!))
|
|
238
|
-
private_class_method(*%w(all find_each first paginate scoped where post create! create))
|
|
239
|
-
end
|
|
240
|
-
end
|
data/lib/recurly/redemption.rb
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
# Redemptions are not top-level resources, but they can be accessed (and
|
|
3
|
-
# created) through {Coupon} instances.
|
|
4
|
-
#
|
|
5
|
-
# @example
|
|
6
|
-
# coupon = Coupon.find("summer2011")
|
|
7
|
-
# coupon.redemptions.each { |r| p r }
|
|
8
|
-
# coupon.redeem Account.find("groupon_lover")
|
|
9
|
-
class Redemption < Resource
|
|
10
|
-
# @return [Coupon]
|
|
11
|
-
belongs_to :coupon
|
|
12
|
-
|
|
13
|
-
# @return [Account]
|
|
14
|
-
belongs_to :account, :readonly => false
|
|
15
|
-
|
|
16
|
-
# @return [Subscription]
|
|
17
|
-
belongs_to :subscription
|
|
18
|
-
|
|
19
|
-
# @return [Invoice]
|
|
20
|
-
belongs_to :invoice
|
|
21
|
-
|
|
22
|
-
define_attribute_methods %w(
|
|
23
|
-
uuid
|
|
24
|
-
single_use
|
|
25
|
-
total_discounted_in_cents
|
|
26
|
-
currency
|
|
27
|
-
state
|
|
28
|
-
coupon_code
|
|
29
|
-
subscription_uuid
|
|
30
|
-
created_at
|
|
31
|
-
updated_at
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
def save
|
|
35
|
-
return false if persisted?
|
|
36
|
-
copy_from coupon.redeem account, currency
|
|
37
|
-
true
|
|
38
|
-
rescue Recurly::API::UnprocessableEntity => e
|
|
39
|
-
apply_errors e
|
|
40
|
-
false
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# Redemptions are only writeable through {Coupon} instances.
|
|
44
|
-
embedded!
|
|
45
|
-
end
|
|
46
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
class Resource
|
|
3
|
-
class Association
|
|
4
|
-
attr_reader :relation, :resource_class
|
|
5
|
-
|
|
6
|
-
def initialize relation, resource_class, options = {}
|
|
7
|
-
@relation, @resource_class, @options = relation, resource_class, options
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def class_name
|
|
11
|
-
return @class_name if defined? @class_name
|
|
12
|
-
@class_name = @options[:class_name]
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
module Recurly
|
|
2
|
-
class Resource
|
|
3
|
-
class Errors < Hash
|
|
4
|
-
def [] key
|
|
5
|
-
super key.to_s
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def []= key, value
|
|
9
|
-
super key.to_s, value
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def full_messages
|
|
13
|
-
map { |attribute, messages|
|
|
14
|
-
attribute_name = attribute.capitalize.gsub('_', ' ')
|
|
15
|
-
messages.map { |message| "#{attribute_name} #{message}." }
|
|
16
|
-
}.flatten
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|