recurly 2.18.15 → 3.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) 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.rb +14 -145
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/client/operations.rb +935 -0
  25. data/lib/recurly/errors.rb +34 -0
  26. data/lib/recurly/errors/api_errors.rb +35 -0
  27. data/lib/recurly/errors/network_errors.rb +8 -0
  28. data/lib/recurly/pager.rb +119 -0
  29. data/lib/recurly/request.rb +30 -0
  30. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  31. data/lib/recurly/requests/account_create_only.rb +18 -0
  32. data/lib/recurly/requests/account_updatable.rb +50 -0
  33. data/lib/recurly/requests/add_on_create.rb +38 -0
  34. data/lib/recurly/requests/add_on_update.rb +38 -0
  35. data/lib/recurly/requests/address.rb +42 -0
  36. data/lib/recurly/requests/billing_info_create.rb +58 -0
  37. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  38. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  39. data/lib/recurly/requests/create_account.rb +62 -0
  40. data/lib/recurly/requests/create_coupon.rb +90 -0
  41. data/lib/recurly/requests/invoice_create.rb +42 -0
  42. data/lib/recurly/requests/invoice_refund.rb +30 -0
  43. data/lib/recurly/requests/line_item_create.rb +46 -0
  44. data/lib/recurly/requests/plan_create.rb +66 -0
  45. data/lib/recurly/requests/plan_update.rb +70 -0
  46. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  47. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  48. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  49. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  50. data/lib/recurly/requests/subscription_create.rb +86 -0
  51. data/lib/recurly/requests/subscription_update.rb +42 -0
  52. data/lib/recurly/requests/update_coupon.rb +30 -0
  53. data/lib/recurly/resource.rb +16 -1103
  54. data/lib/recurly/resources/account.rb +86 -0
  55. data/lib/recurly/resources/account_acquisition.rb +42 -0
  56. data/lib/recurly/resources/account_balance.rb +22 -0
  57. data/lib/recurly/resources/account_note.rb +30 -0
  58. data/lib/recurly/resources/add_on.rb +62 -0
  59. data/lib/recurly/resources/address.rb +42 -0
  60. data/lib/recurly/resources/billing_info.rb +62 -0
  61. data/lib/recurly/resources/coupon.rb +110 -0
  62. data/lib/recurly/resources/coupon_discount.rb +22 -0
  63. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  64. data/lib/recurly/resources/credit_payment.rb +62 -0
  65. data/lib/recurly/resources/error.rb +18 -0
  66. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  67. data/lib/recurly/resources/invoice.rb +138 -0
  68. data/lib/recurly/resources/invoice_collection.rb +18 -0
  69. data/lib/recurly/resources/line_item.rb +166 -0
  70. data/lib/recurly/resources/plan.rb +86 -0
  71. data/lib/recurly/resources/settings.rb +18 -0
  72. data/lib/recurly/resources/shipping_address.rb +74 -0
  73. data/lib/recurly/resources/site.rb +46 -0
  74. data/lib/recurly/resources/subscription.rb +134 -0
  75. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  76. data/lib/recurly/resources/subscription_change.rb +54 -0
  77. data/lib/recurly/resources/tax_info.rb +18 -0
  78. data/lib/recurly/resources/transaction.rb +146 -0
  79. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  80. data/lib/recurly/resources/user.rb +38 -0
  81. data/lib/recurly/schema.rb +114 -0
  82. data/lib/recurly/schema/json_deserializer.rb +53 -0
  83. data/lib/recurly/schema/json_parser.rb +71 -0
  84. data/lib/recurly/schema/request_caster.rb +66 -0
  85. data/lib/recurly/schema/schema_factory.rb +50 -0
  86. data/lib/recurly/schema/schema_validator.rb +125 -0
  87. data/lib/recurly/version.rb +1 -10
  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 +121 -245
  93. data/lib/recurly/account.rb +0 -190
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -21
  96. data/lib/recurly/add_on.rb +0 -44
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -81
  99. data/lib/recurly/api.rb +0 -110
  100. data/lib/recurly/api/errors.rb +0 -208
  101. data/lib/recurly/api/net_http_adapter.rb +0 -111
  102. data/lib/recurly/billing_info.rb +0 -109
  103. data/lib/recurly/coupon.rb +0 -134
  104. data/lib/recurly/credit_payment.rb +0 -32
  105. data/lib/recurly/custom_field.rb +0 -15
  106. data/lib/recurly/delivery.rb +0 -19
  107. data/lib/recurly/error.rb +0 -13
  108. data/lib/recurly/gift_card.rb +0 -85
  109. data/lib/recurly/helper.rb +0 -51
  110. data/lib/recurly/invoice.rb +0 -297
  111. data/lib/recurly/invoice_collection.rb +0 -14
  112. data/lib/recurly/item.rb +0 -36
  113. data/lib/recurly/js.rb +0 -14
  114. data/lib/recurly/juris_detail.rb +0 -15
  115. data/lib/recurly/measured_unit.rb +0 -16
  116. data/lib/recurly/money.rb +0 -120
  117. data/lib/recurly/note.rb +0 -14
  118. data/lib/recurly/plan.rb +0 -43
  119. data/lib/recurly/purchase.rb +0 -234
  120. data/lib/recurly/redemption.rb +0 -46
  121. data/lib/recurly/resource/association.rb +0 -16
  122. data/lib/recurly/resource/errors.rb +0 -20
  123. data/lib/recurly/resource/pager.rb +0 -313
  124. data/lib/recurly/shipping_address.rb +0 -26
  125. data/lib/recurly/shipping_fee.rb +0 -17
  126. data/lib/recurly/shipping_method.rb +0 -13
  127. data/lib/recurly/subscription.rb +0 -365
  128. data/lib/recurly/subscription/add_ons.rb +0 -82
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -16
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction.rb +0 -131
  134. data/lib/recurly/transaction/errors.rb +0 -115
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook.rb +0 -111
  138. data/lib/recurly/webhook/account_notification.rb +0 -13
  139. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  140. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  143. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  146. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  147. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  148. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  149. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  150. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  152. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  153. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  154. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  155. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  156. data/lib/recurly/webhook/item_notification.rb +0 -7
  157. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  167. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  168. data/lib/recurly/webhook/notification.rb +0 -18
  169. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  172. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  173. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  175. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  176. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  177. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  178. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  179. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  180. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  181. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  182. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  183. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  184. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  185. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  186. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  187. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  188. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  189. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  192. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  194. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  196. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  197. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  199. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  200. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  204. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  205. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  207. data/lib/recurly/xml.rb +0 -122
  208. data/lib/recurly/xml/nokogiri.rb +0 -60
  209. data/lib/recurly/xml/rexml.rb +0 -52
@@ -1,14 +0,0 @@
1
- module Recurly
2
- class InvoiceCollection < Resource
3
- # @return [Invoice, nil]
4
- has_one :charge_invoice, class_name: :Invoice, readonly: true
5
-
6
- # @return [[Invoice], []]
7
- has_many :credit_invoices, class_name: :Invoice, readonly: true
8
-
9
- # These are readonly resources
10
- embedded! true
11
- undef save
12
- undef destroy
13
- end
14
- end
@@ -1,36 +0,0 @@
1
- module Recurly
2
- class Item < Resource
3
- # @return [[CustomField], []]
4
- has_many :custom_fields, class_name: :CustomField, readonly: false
5
-
6
- define_attribute_methods %w(
7
- item_code
8
- name
9
- description
10
- external_sku
11
- accounting_code
12
- revenue_schedule_type
13
- state
14
- avalara_transaction_type
15
- avalara_service_type
16
- created_at
17
- updated_at
18
- deleted_at
19
- )
20
-
21
- def changed_attributes
22
- attrs = super
23
- if custom_fields.any?(&:changed?)
24
- attrs['custom_fields'] = custom_fields.select(&:changed?)
25
- end
26
- attrs
27
- end
28
-
29
- def reactivate
30
- return false unless link? :reactivate
31
- reload follow_link :reactivate
32
- true
33
- end
34
-
35
- end
36
- end
@@ -1,14 +0,0 @@
1
- module Recurly
2
- module JS
3
- class << self
4
- # @return [String] A public key for Recurly.js.
5
- # @raise [ConfigurationError] No public key has been set.
6
- def public_key
7
- defined? @public_key and @public_key or raise(
8
- ConfigurationError, "public_key not configured"
9
- )
10
- end
11
- attr_writer :public_key
12
- end
13
- end
14
- end
@@ -1,15 +0,0 @@
1
- module Recurly
2
- class JurisDetail < Resource
3
- define_attribute_methods %w(
4
- description
5
- jurisdiction
6
- rate
7
- tax_in_cents
8
- sub_type
9
- jurisdiction_name
10
- classification
11
- )
12
-
13
- embedded! true
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- module Recurly
2
- # Measured Units are used in Recurly's usage-based billing feature.
3
- #
4
- # Recurly Documentation: https://dev.recurly.com/docs/measured-unit-object
5
- class MeasuredUnit < Resource
6
- define_attribute_methods %w(
7
- id
8
- name
9
- display_name
10
- description
11
- created_at
12
- updated_at
13
- )
14
- alias to_param id
15
- end
16
- end
@@ -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
@@ -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,43 +0,0 @@
1
- module Recurly
2
- # Recurly Documentation: https://dev.recurly.com/docs/list-plans
3
- class Plan < Resource
4
- # @return [Pager<AddOn>, []]
5
- has_many :add_ons
6
-
7
- define_attribute_methods %w(
8
- plan_code
9
- name
10
- description
11
- success_url
12
- cancel_url
13
- display_donation_amounts
14
- display_quantity
15
- display_phone_number
16
- bypass_hosted_confirmation
17
- unit_name
18
- payment_page_tos_link
19
- payment_page_css
20
- setup_fee_in_cents
21
- unit_amount_in_cents
22
- plan_interval_length
23
- plan_interval_unit
24
- trial_interval_length
25
- trial_interval_unit
26
- total_billing_cycles
27
- accounting_code
28
- setup_fee_accounting_code
29
- revenue_schedule_type
30
- setup_fee_revenue_schedule_type
31
- tax_exempt
32
- tax_code
33
- trial_requires_billing_info
34
- auto_renew
35
- allow_any_item_on_subscriptions
36
- avalara_transaction_type
37
- avalara_service_type
38
- created_at
39
- updated_at
40
- )
41
- alias to_param plan_code
42
- end
43
- end
@@ -1,234 +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
- define_attribute_methods %w(
132
- currency
133
- collection_method
134
- po_number
135
- net_terms
136
- coupon_codes
137
- terms_and_conditions
138
- customer_notes
139
- vat_reverse_charge_notes
140
- shipping_address_id
141
- gateway_code
142
- transaction_type
143
- )
144
-
145
- class << self
146
-
147
- # Generate an invoice for the purchase and run any needed transactions.
148
- #
149
- # @param purchase [Purchase] The purchase data for the request.
150
- # @return [InvoiceCollection] The saved invoice(s) representing this purchase.
151
- # @raise [Invalid] Raised if the purchase cannot be invoiced.
152
- # @raise [Transaction::Error] Raised if the transaction failed.
153
- def invoice!(purchase)
154
- post(purchase, collection_path)
155
- end
156
-
157
- # Generate a preview invoice for the purchase. Runs validations
158
- # but does not run any transactions.
159
- #
160
- # @param purchase [Purchase] The purchase data for the request.
161
- # @return [InvoiceCollection] The preview invoice(s) representing this purchase.
162
- # @raise [Invalid] Raised if the purchase cannot be invoiced.
163
- def preview!(purchase)
164
- post(purchase, "#{collection_path}/preview")
165
- end
166
-
167
- # Generate an authorized invoice for the purchase. Runs validations
168
- # but does not run any transactions. This endpoint will create a
169
- # pending purchase that can be activated at a later time once payment
170
- # has been completed on an external source (e.g. Adyen's Hosted
171
- # Payment Pages).
172
- #
173
- # @param purchase [Purchase] The purchase data for the request.
174
- # @return [InvoiceCollection] The authorized invoice collection representing this purchase.
175
- # @raise [Invalid] Raised if the purchase cannot be invoiced.
176
- def authorize!(purchase)
177
- post(purchase, "#{collection_path}/authorize")
178
- end
179
-
180
- # Use for Adyen HPP transaction requests. Runs validations
181
- # but does not run any transactions.
182
- #
183
- # @param purchase [Purchase] The purchase data for the request.
184
- # @return [InvoiceCollection] The authorized invoice collection representing this purchase.
185
- # @raise [Invalid] Raised if the purchase cannot be invoiced.
186
- def pending!(purchase)
187
- post(purchase, "#{collection_path}/pending")
188
- end
189
-
190
- # Allows the merchant to cancel an authorization.
191
- #
192
- # @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
193
- # @return [InvoiceCollection] The canceled invoice collection.
194
- # @raise [Invalid] Raised if the authorization cannot be canceled.
195
- def cancel!(transaction_uuid)
196
- post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/cancel")
197
- end
198
-
199
- # Allows the merchants to initiate a capture transaction tied to the original authorization.
200
- #
201
- # @param transaction_uuid [String] The uuid for the transaction representing the authorization. Can typically be found at invoice_collection.charge_invoice.transactions.first.uuid.
202
- # @return [InvoiceCollection] The captured invoice collection.
203
- # @raise [Invalid] Raised if the authorization cannot be captured.
204
- def capture!(transaction_uuid)
205
- post(nil, "#{collection_path}/transaction-uuid-#{transaction_uuid}/capture")
206
- end
207
-
208
- def post(purchase, path)
209
- body = purchase.nil? ? nil : purchase.to_xml
210
- response = API.send(:post, path, body)
211
- InvoiceCollection.from_response(response)
212
- rescue API::UnprocessableEntity => e
213
- purchase.apply_errors(e) if purchase
214
- Transaction::Error.validate!(e, nil)
215
- raise Resource::Invalid.new(purchase)
216
- end
217
- end
218
-
219
- # TODO
220
- # This is a temporary solution which allows us to
221
- # embed these resources in a purchase without changing their
222
- # interface. It will be removed once we get rid of default_currency.
223
- def to_xml(options = {})
224
- subscriptions.each {|s| s.currency = nil}
225
- adjustments.each {|a| a.currency = nil}
226
- super(options)
227
- end
228
-
229
- # This object does not represent a model on the server side
230
- # so we do not need to expose these methods.
231
- protected(*%w(save save!))
232
- private_class_method(*%w(all find_each first paginate scoped where post create! create))
233
- end
234
- end