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.
Files changed (234) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +158 -110
  8. data/Rakefile +6 -0
  9. data/bin/bundle +105 -0
  10. data/bin/coderay +29 -0
  11. data/bin/console +14 -0
  12. data/bin/htmldiff +29 -0
  13. data/bin/ldiff +29 -0
  14. data/bin/pry +29 -0
  15. data/bin/rake +29 -0
  16. data/bin/rspec +29 -0
  17. data/bin/setup +8 -0
  18. data/bin/yard +29 -0
  19. data/bin/yardoc +29 -0
  20. data/bin/yri +29 -0
  21. data/lib/data/ca-certificates.crt +31 -0
  22. data/lib/recurly/client/operations.rb +935 -0
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/errors/api_errors.rb +35 -0
  25. data/lib/recurly/errors/network_errors.rb +8 -0
  26. data/lib/recurly/errors.rb +34 -0
  27. data/lib/recurly/pager.rb +119 -0
  28. data/lib/recurly/request.rb +30 -0
  29. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  30. data/lib/recurly/requests/account_create_only.rb +18 -0
  31. data/lib/recurly/requests/account_updatable.rb +50 -0
  32. data/lib/recurly/requests/add_on_create.rb +38 -0
  33. data/lib/recurly/requests/add_on_update.rb +38 -0
  34. data/lib/recurly/requests/address.rb +42 -0
  35. data/lib/recurly/requests/billing_info_create.rb +58 -0
  36. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  37. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  38. data/lib/recurly/requests/create_account.rb +62 -0
  39. data/lib/recurly/requests/create_coupon.rb +90 -0
  40. data/lib/recurly/requests/invoice_create.rb +42 -0
  41. data/lib/recurly/requests/invoice_refund.rb +30 -0
  42. data/lib/recurly/requests/line_item_create.rb +46 -0
  43. data/lib/recurly/requests/plan_create.rb +66 -0
  44. data/lib/recurly/requests/plan_update.rb +70 -0
  45. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  46. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  47. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  48. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  49. data/lib/recurly/requests/subscription_create.rb +86 -0
  50. data/lib/recurly/requests/subscription_update.rb +42 -0
  51. data/lib/recurly/requests/update_coupon.rb +30 -0
  52. data/lib/recurly/resource.rb +16 -1114
  53. data/lib/recurly/resources/account.rb +86 -0
  54. data/lib/recurly/resources/account_acquisition.rb +42 -0
  55. data/lib/recurly/resources/account_balance.rb +22 -0
  56. data/lib/recurly/resources/account_note.rb +30 -0
  57. data/lib/recurly/resources/add_on.rb +62 -0
  58. data/lib/recurly/resources/address.rb +42 -0
  59. data/lib/recurly/resources/billing_info.rb +62 -0
  60. data/lib/recurly/resources/coupon.rb +110 -0
  61. data/lib/recurly/resources/coupon_discount.rb +22 -0
  62. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  63. data/lib/recurly/resources/credit_payment.rb +62 -0
  64. data/lib/recurly/resources/error.rb +18 -0
  65. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  66. data/lib/recurly/resources/invoice.rb +138 -0
  67. data/lib/recurly/resources/invoice_collection.rb +18 -0
  68. data/lib/recurly/resources/line_item.rb +166 -0
  69. data/lib/recurly/resources/plan.rb +86 -0
  70. data/lib/recurly/resources/settings.rb +18 -0
  71. data/lib/recurly/resources/shipping_address.rb +74 -0
  72. data/lib/recurly/resources/site.rb +46 -0
  73. data/lib/recurly/resources/subscription.rb +134 -0
  74. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  75. data/lib/recurly/resources/subscription_change.rb +54 -0
  76. data/lib/recurly/resources/tax_info.rb +18 -0
  77. data/lib/recurly/resources/transaction.rb +146 -0
  78. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  79. data/lib/recurly/resources/user.rb +38 -0
  80. data/lib/recurly/schema/json_deserializer.rb +53 -0
  81. data/lib/recurly/schema/json_parser.rb +71 -0
  82. data/lib/recurly/schema/request_caster.rb +66 -0
  83. data/lib/recurly/schema/schema_factory.rb +50 -0
  84. data/lib/recurly/schema/schema_validator.rb +125 -0
  85. data/lib/recurly/schema.rb +114 -0
  86. data/lib/recurly/version.rb +1 -10
  87. data/lib/recurly.rb +14 -167
  88. data/recurly.gemspec +32 -0
  89. data/scripts/build +4 -0
  90. data/scripts/clean +6 -0
  91. data/scripts/test +3 -0
  92. metadata +132 -199
  93. data/lib/recurly/account.rb +0 -230
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -23
  96. data/lib/recurly/add_on.rb +0 -52
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -101
  99. data/lib/recurly/api/errors.rb +0 -208
  100. data/lib/recurly/api/net_http_adapter.rb +0 -111
  101. data/lib/recurly/api.rb +0 -110
  102. data/lib/recurly/billing_info.rb +0 -134
  103. data/lib/recurly/business_entity.rb +0 -35
  104. data/lib/recurly/coupon.rb +0 -136
  105. data/lib/recurly/credit_payment.rb +0 -32
  106. data/lib/recurly/currency_percentage_tier.rb +0 -17
  107. data/lib/recurly/custom_field.rb +0 -15
  108. data/lib/recurly/custom_field_definition.rb +0 -14
  109. data/lib/recurly/customer_permission.rb +0 -10
  110. data/lib/recurly/delivery.rb +0 -19
  111. data/lib/recurly/dunning_campaign.rb +0 -30
  112. data/lib/recurly/dunning_cycle.rb +0 -18
  113. data/lib/recurly/entitlement.rb +0 -19
  114. data/lib/recurly/error.rb +0 -13
  115. data/lib/recurly/external_account.rb +0 -17
  116. data/lib/recurly/external_charge.rb +0 -20
  117. data/lib/recurly/external_invoice.rb +0 -27
  118. data/lib/recurly/external_payment_phase.rb +0 -27
  119. data/lib/recurly/external_product.rb +0 -34
  120. data/lib/recurly/external_product_reference.rb +0 -18
  121. data/lib/recurly/external_subscription.rb +0 -62
  122. data/lib/recurly/gateway_attribute.rb +0 -10
  123. data/lib/recurly/general_ledger_account.rb +0 -16
  124. data/lib/recurly/gift_card.rb +0 -86
  125. data/lib/recurly/helper.rb +0 -51
  126. data/lib/recurly/invoice.rb +0 -355
  127. data/lib/recurly/invoice_collection.rb +0 -14
  128. data/lib/recurly/invoice_template.rb +0 -14
  129. data/lib/recurly/item.rb +0 -36
  130. data/lib/recurly/js.rb +0 -14
  131. data/lib/recurly/juris_detail.rb +0 -15
  132. data/lib/recurly/measured_unit.rb +0 -16
  133. data/lib/recurly/money.rb +0 -120
  134. data/lib/recurly/note.rb +0 -14
  135. data/lib/recurly/percentage_tier.rb +0 -17
  136. data/lib/recurly/performance_obligation.rb +0 -15
  137. data/lib/recurly/plan.rb +0 -59
  138. data/lib/recurly/plan_ramp_interval.rb +0 -10
  139. data/lib/recurly/purchase.rb +0 -240
  140. data/lib/recurly/redemption.rb +0 -46
  141. data/lib/recurly/resource/association.rb +0 -16
  142. data/lib/recurly/resource/errors.rb +0 -20
  143. data/lib/recurly/resource/pager.rb +0 -313
  144. data/lib/recurly/rev_rec.rb +0 -18
  145. data/lib/recurly/shipping_address.rb +0 -26
  146. data/lib/recurly/shipping_fee.rb +0 -17
  147. data/lib/recurly/shipping_method.rb +0 -13
  148. data/lib/recurly/sub_add_on_percentage_tier.rb +0 -17
  149. data/lib/recurly/subscription/add_ons.rb +0 -82
  150. data/lib/recurly/subscription.rb +0 -374
  151. data/lib/recurly/subscription_add_on.rb +0 -64
  152. data/lib/recurly/subscription_ramp_interval.rb +0 -12
  153. data/lib/recurly/tax_detail.rb +0 -18
  154. data/lib/recurly/tax_type.rb +0 -13
  155. data/lib/recurly/tier.rb +0 -18
  156. data/lib/recurly/transaction/errors.rb +0 -119
  157. data/lib/recurly/transaction.rb +0 -132
  158. data/lib/recurly/usage.rb +0 -29
  159. data/lib/recurly/verify.rb +0 -12
  160. data/lib/recurly/webhook/account_notification.rb +0 -13
  161. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  162. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  163. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  164. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  165. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  166. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  167. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  168. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  169. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  170. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  171. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  172. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  173. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  175. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  176. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  177. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  178. data/lib/recurly/webhook/item_notification.rb +0 -7
  179. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  180. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  181. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  182. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  183. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  184. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  185. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  186. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  187. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  188. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  189. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  190. data/lib/recurly/webhook/notification.rb +0 -18
  191. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  192. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  193. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  194. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  195. data/lib/recurly/webhook/prerenewal_notification.rb +0 -6
  196. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  197. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  198. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  199. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  200. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  201. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  202. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  203. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  204. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  205. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  206. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  207. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  208. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  209. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  210. data/lib/recurly/webhook/scheduled_subscription_update_notification.rb +0 -6
  211. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  212. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  213. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  214. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  215. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  216. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  217. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  218. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  219. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  220. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  221. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  222. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  223. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  224. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  225. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  226. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  227. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  228. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  229. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  230. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  231. data/lib/recurly/webhook.rb +0 -113
  232. data/lib/recurly/xml/nokogiri.rb +0 -60
  233. data/lib/recurly/xml/rexml.rb +0 -52
  234. data/lib/recurly/xml.rb +0 -122
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,14 +0,0 @@
1
- module Recurly
2
- # Recurly Documentation: https://dev.recurly.com/docs/list-account-notes
3
- class Note < Resource
4
- # @return [Account]
5
- belongs_to :account
6
-
7
- define_attribute_methods %w(
8
- account
9
- message
10
- created_at
11
- )
12
-
13
- end
14
- end
@@ -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
@@ -1,15 +0,0 @@
1
- module Recurly
2
- class PerformanceObligation < Resource
3
-
4
- define_attribute_methods %w(
5
- id
6
- name
7
- created_at
8
- updated_at
9
- )
10
-
11
- def self.collection_path
12
- "performance_obligations"
13
- end
14
- end
15
- 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
@@ -1,10 +0,0 @@
1
- module Recurly
2
- class PlanRampInterval < Resource
3
- belongs_to :plan
4
-
5
- define_attribute_methods %w(
6
- starting_billing_cycle
7
- unit_amount_in_cents
8
- )
9
- end
10
- end
@@ -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
@@ -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