recurly 2.18.21 → 3.0.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +158 -110
  8. data/Rakefile +6 -0
  9. data/bin/bundle +105 -0
  10. data/bin/coderay +29 -0
  11. data/bin/console +14 -0
  12. data/bin/htmldiff +29 -0
  13. data/bin/ldiff +29 -0
  14. data/bin/pry +29 -0
  15. data/bin/rake +29 -0
  16. data/bin/rspec +29 -0
  17. data/bin/setup +8 -0
  18. data/bin/yard +29 -0
  19. data/bin/yardoc +29 -0
  20. data/bin/yri +29 -0
  21. data/lib/data/ca-certificates.crt +31 -0
  22. data/lib/recurly/client/operations.rb +935 -0
  23. data/lib/recurly/client.rb +198 -0
  24. data/lib/recurly/errors/api_errors.rb +35 -0
  25. data/lib/recurly/errors/network_errors.rb +8 -0
  26. data/lib/recurly/errors.rb +34 -0
  27. data/lib/recurly/pager.rb +119 -0
  28. data/lib/recurly/request.rb +30 -0
  29. data/lib/recurly/requests/account_acquisition_updatable.rb +22 -0
  30. data/lib/recurly/requests/account_create_only.rb +18 -0
  31. data/lib/recurly/requests/account_updatable.rb +50 -0
  32. data/lib/recurly/requests/add_on_create.rb +38 -0
  33. data/lib/recurly/requests/add_on_update.rb +38 -0
  34. data/lib/recurly/requests/address.rb +42 -0
  35. data/lib/recurly/requests/billing_info_create.rb +58 -0
  36. data/lib/recurly/requests/coupon_create_only.rb +66 -0
  37. data/lib/recurly/requests/coupon_updatable.rb +30 -0
  38. data/lib/recurly/requests/create_account.rb +62 -0
  39. data/lib/recurly/requests/create_coupon.rb +90 -0
  40. data/lib/recurly/requests/invoice_create.rb +42 -0
  41. data/lib/recurly/requests/invoice_refund.rb +30 -0
  42. data/lib/recurly/requests/line_item_create.rb +46 -0
  43. data/lib/recurly/requests/plan_create.rb +66 -0
  44. data/lib/recurly/requests/plan_update.rb +70 -0
  45. data/lib/recurly/requests/shipping_address_create.rb +58 -0
  46. data/lib/recurly/requests/shipping_address_update.rb +62 -0
  47. data/lib/recurly/requests/subscription_add_on_create.rb +22 -0
  48. data/lib/recurly/requests/subscription_change_create.rb +42 -0
  49. data/lib/recurly/requests/subscription_create.rb +86 -0
  50. data/lib/recurly/requests/subscription_update.rb +42 -0
  51. data/lib/recurly/requests/update_coupon.rb +30 -0
  52. data/lib/recurly/resource.rb +16 -1103
  53. data/lib/recurly/resources/account.rb +86 -0
  54. data/lib/recurly/resources/account_acquisition.rb +42 -0
  55. data/lib/recurly/resources/account_balance.rb +22 -0
  56. data/lib/recurly/resources/account_note.rb +30 -0
  57. data/lib/recurly/resources/add_on.rb +62 -0
  58. data/lib/recurly/resources/address.rb +42 -0
  59. data/lib/recurly/resources/billing_info.rb +62 -0
  60. data/lib/recurly/resources/coupon.rb +110 -0
  61. data/lib/recurly/resources/coupon_discount.rb +22 -0
  62. data/lib/recurly/resources/coupon_redemption.rb +46 -0
  63. data/lib/recurly/resources/credit_payment.rb +62 -0
  64. data/lib/recurly/resources/error.rb +18 -0
  65. data/lib/recurly/resources/error_may_have_transaction.rb +22 -0
  66. data/lib/recurly/resources/invoice.rb +138 -0
  67. data/lib/recurly/resources/invoice_collection.rb +18 -0
  68. data/lib/recurly/resources/line_item.rb +166 -0
  69. data/lib/recurly/resources/plan.rb +86 -0
  70. data/lib/recurly/resources/settings.rb +18 -0
  71. data/lib/recurly/resources/shipping_address.rb +74 -0
  72. data/lib/recurly/resources/site.rb +46 -0
  73. data/lib/recurly/resources/subscription.rb +134 -0
  74. data/lib/recurly/resources/subscription_add_on.rb +42 -0
  75. data/lib/recurly/resources/subscription_change.rb +54 -0
  76. data/lib/recurly/resources/tax_info.rb +18 -0
  77. data/lib/recurly/resources/transaction.rb +146 -0
  78. data/lib/recurly/resources/unique_coupon_code.rb +38 -0
  79. data/lib/recurly/resources/user.rb +38 -0
  80. data/lib/recurly/schema/json_deserializer.rb +53 -0
  81. data/lib/recurly/schema/json_parser.rb +71 -0
  82. data/lib/recurly/schema/request_caster.rb +66 -0
  83. data/lib/recurly/schema/schema_factory.rb +50 -0
  84. data/lib/recurly/schema/schema_validator.rb +125 -0
  85. data/lib/recurly/schema.rb +114 -0
  86. data/lib/recurly/version.rb +1 -10
  87. data/lib/recurly.rb +14 -145
  88. data/recurly.gemspec +32 -0
  89. data/scripts/build +4 -0
  90. data/scripts/clean +6 -0
  91. data/scripts/test +3 -0
  92. metadata +129 -173
  93. data/lib/recurly/account.rb +0 -209
  94. data/lib/recurly/account_acquisition.rb +0 -27
  95. data/lib/recurly/account_balance.rb +0 -21
  96. data/lib/recurly/add_on.rb +0 -46
  97. data/lib/recurly/address.rb +0 -25
  98. data/lib/recurly/adjustment.rb +0 -81
  99. data/lib/recurly/api/errors.rb +0 -208
  100. data/lib/recurly/api/net_http_adapter.rb +0 -111
  101. data/lib/recurly/api.rb +0 -110
  102. data/lib/recurly/billing_info.rb +0 -113
  103. data/lib/recurly/coupon.rb +0 -136
  104. data/lib/recurly/credit_payment.rb +0 -32
  105. data/lib/recurly/custom_field.rb +0 -15
  106. data/lib/recurly/delivery.rb +0 -19
  107. data/lib/recurly/error.rb +0 -13
  108. data/lib/recurly/gift_card.rb +0 -85
  109. data/lib/recurly/helper.rb +0 -51
  110. data/lib/recurly/invoice.rb +0 -304
  111. data/lib/recurly/invoice_collection.rb +0 -14
  112. data/lib/recurly/item.rb +0 -36
  113. data/lib/recurly/js.rb +0 -14
  114. data/lib/recurly/juris_detail.rb +0 -15
  115. data/lib/recurly/measured_unit.rb +0 -16
  116. data/lib/recurly/money.rb +0 -120
  117. data/lib/recurly/note.rb +0 -14
  118. data/lib/recurly/plan.rb +0 -43
  119. data/lib/recurly/purchase.rb +0 -238
  120. data/lib/recurly/redemption.rb +0 -46
  121. data/lib/recurly/resource/association.rb +0 -16
  122. data/lib/recurly/resource/errors.rb +0 -20
  123. data/lib/recurly/resource/pager.rb +0 -313
  124. data/lib/recurly/shipping_address.rb +0 -26
  125. data/lib/recurly/shipping_fee.rb +0 -17
  126. data/lib/recurly/shipping_method.rb +0 -13
  127. data/lib/recurly/subscription/add_ons.rb +0 -82
  128. data/lib/recurly/subscription.rb +0 -366
  129. data/lib/recurly/subscription_add_on.rb +0 -58
  130. data/lib/recurly/tax_detail.rb +0 -18
  131. data/lib/recurly/tax_type.rb +0 -13
  132. data/lib/recurly/tier.rb +0 -18
  133. data/lib/recurly/transaction/errors.rb +0 -115
  134. data/lib/recurly/transaction.rb +0 -131
  135. data/lib/recurly/usage.rb +0 -28
  136. data/lib/recurly/verify.rb +0 -12
  137. data/lib/recurly/webhook/account_notification.rb +0 -13
  138. data/lib/recurly/webhook/billing_info_update_failed_notification.rb +0 -6
  139. data/lib/recurly/webhook/billing_info_updated_notification.rb +0 -6
  140. data/lib/recurly/webhook/canceled_account_notification.rb +0 -6
  141. data/lib/recurly/webhook/canceled_gift_card_notification.rb +0 -6
  142. data/lib/recurly/webhook/canceled_subscription_notification.rb +0 -6
  143. data/lib/recurly/webhook/closed_credit_invoice_notification.rb +0 -6
  144. data/lib/recurly/webhook/closed_invoice_notification.rb +0 -6
  145. data/lib/recurly/webhook/credit_payment_notification.rb +0 -12
  146. data/lib/recurly/webhook/deactivated_item_notification.rb +0 -6
  147. data/lib/recurly/webhook/deleted_shipping_address_notification.rb +0 -6
  148. data/lib/recurly/webhook/dunning_notification.rb +0 -14
  149. data/lib/recurly/webhook/expired_subscription_notification.rb +0 -6
  150. data/lib/recurly/webhook/failed_charge_invoice_notification.rb +0 -6
  151. data/lib/recurly/webhook/failed_payment_notification.rb +0 -6
  152. data/lib/recurly/webhook/fraud_info_updated_notification.rb +0 -6
  153. data/lib/recurly/webhook/gift_card_notification.rb +0 -8
  154. data/lib/recurly/webhook/invoice_notification.rb +0 -12
  155. data/lib/recurly/webhook/item_notification.rb +0 -7
  156. data/lib/recurly/webhook/low_balance_gift_card_notification.rb +0 -6
  157. data/lib/recurly/webhook/new_account_notification.rb +0 -6
  158. data/lib/recurly/webhook/new_charge_invoice_notification.rb +0 -6
  159. data/lib/recurly/webhook/new_credit_invoice_notification.rb +0 -6
  160. data/lib/recurly/webhook/new_credit_payment_notification.rb +0 -6
  161. data/lib/recurly/webhook/new_dunning_event_notification.rb +0 -6
  162. data/lib/recurly/webhook/new_invoice_notification.rb +0 -6
  163. data/lib/recurly/webhook/new_item_notification.rb +0 -6
  164. data/lib/recurly/webhook/new_shipping_address_notification.rb +0 -6
  165. data/lib/recurly/webhook/new_subscription_notification.rb +0 -6
  166. data/lib/recurly/webhook/new_usage_notification.rb +0 -8
  167. data/lib/recurly/webhook/notification.rb +0 -18
  168. data/lib/recurly/webhook/paid_charge_invoice_notification.rb +0 -6
  169. data/lib/recurly/webhook/past_due_charge_invoice_notification.rb +0 -6
  170. data/lib/recurly/webhook/past_due_invoice_notification.rb +0 -6
  171. data/lib/recurly/webhook/paused_subscription_renewal_notification.rb +0 -6
  172. data/lib/recurly/webhook/prerenewal_notification.rb +0 -6
  173. data/lib/recurly/webhook/processing_charge_invoice_notification.rb +0 -6
  174. data/lib/recurly/webhook/processing_credit_invoice_notification.rb +0 -6
  175. data/lib/recurly/webhook/processing_invoice_notification.rb +0 -6
  176. data/lib/recurly/webhook/processing_payment_notification.rb +0 -6
  177. data/lib/recurly/webhook/purchased_gift_card_notification.rb +0 -7
  178. data/lib/recurly/webhook/reactivated_account_notification.rb +0 -6
  179. data/lib/recurly/webhook/reactivated_item_notification.rb +0 -6
  180. data/lib/recurly/webhook/redeemed_gift_card_notification.rb +0 -7
  181. data/lib/recurly/webhook/regenerated_gift_card_notification.rb +0 -6
  182. data/lib/recurly/webhook/renewed_subscription_notification.rb +0 -6
  183. data/lib/recurly/webhook/reopened_charge_invoice_notification.rb +0 -6
  184. data/lib/recurly/webhook/reopened_credit_invoice_notification.rb +0 -6
  185. data/lib/recurly/webhook/scheduled_payment_notification.rb +0 -6
  186. data/lib/recurly/webhook/scheduled_subscription_pause_notification.rb +0 -6
  187. data/lib/recurly/webhook/scheduled_subscription_update_notification.rb +0 -6
  188. data/lib/recurly/webhook/subscription_notification.rb +0 -12
  189. data/lib/recurly/webhook/subscription_pause_canceled_notification.rb +0 -6
  190. data/lib/recurly/webhook/subscription_pause_modified_notification.rb +0 -6
  191. data/lib/recurly/webhook/subscription_paused_notification.rb +0 -6
  192. data/lib/recurly/webhook/subscription_resumed_notification.rb +0 -6
  193. data/lib/recurly/webhook/successful_payment_notification.rb +0 -6
  194. data/lib/recurly/webhook/successful_refund_notification.rb +0 -6
  195. data/lib/recurly/webhook/transaction_authorized_notification.rb +0 -6
  196. data/lib/recurly/webhook/transaction_notification.rb +0 -12
  197. data/lib/recurly/webhook/transaction_status_updated_notification.rb +0 -6
  198. data/lib/recurly/webhook/updated_account_notification.rb +0 -6
  199. data/lib/recurly/webhook/updated_balance_gift_card_notification.rb +0 -7
  200. data/lib/recurly/webhook/updated_gift_card_notification.rb +0 -6
  201. data/lib/recurly/webhook/updated_invoice_notification.rb +0 -6
  202. data/lib/recurly/webhook/updated_item_notification.rb +0 -6
  203. data/lib/recurly/webhook/updated_shipping_address_notification.rb +0 -6
  204. data/lib/recurly/webhook/updated_subscription_notification.rb +0 -6
  205. data/lib/recurly/webhook/void_payment_notification.rb +0 -6
  206. data/lib/recurly/webhook/voided_credit_invoice_notification.rb +0 -6
  207. data/lib/recurly/webhook/voided_credit_payment_notification.rb +0 -6
  208. data/lib/recurly/webhook.rb +0 -113
  209. data/lib/recurly/xml/nokogiri.rb +0 -60
  210. data/lib/recurly/xml/rexml.rb +0 -52
  211. data/lib/recurly/xml.rb +0 -122
@@ -1,85 +0,0 @@
1
- module Recurly
2
- class GiftCard < Resource
3
- # @return [Invoice, nil]
4
- belongs_to :invoice
5
-
6
- # @return [Account, nil] The Account belonging to the gifter
7
- belongs_to :gifter_account, class_name: :Account, readonly: false
8
-
9
- # @return [Account, nil] The Account belonging to the recipient of the gift
10
- belongs_to :recipient_account, class_name: :Account, readonly: false
11
-
12
- # @return [Delivery, nil] Delivery information of the recipient.
13
- has_one :delivery, class_name: :Delivery, readonly: false
14
-
15
- # @return [Invoice, nil] The credit invoice for the gift card redemption.
16
- has_one :redemption_invoice, class_name: :Invoice, readonly: true
17
-
18
- # @return [Invoice, nil] The charge invoice for the gift card redemption.
19
- has_one :purchase_invoice, class_name: :Invoice, readonly: true
20
-
21
- # @return [BillingInfo, nil]
22
- has_one :billing_info, class_name: :BillingInfo, readonly: false
23
-
24
- define_attribute_methods %w(
25
- balance_in_cents
26
- currency
27
- created_at
28
- delivered_at
29
- id
30
- product_code
31
- redeemed_at
32
- redemption_code
33
- unit_amount_in_cents
34
- updated_at
35
- canceled_at
36
- gifter_account_code
37
- recipient_account_code
38
- invoice_number
39
- )
40
- alias to_param id
41
-
42
- # Preview a GiftCard given some attributes
43
- #
44
- # @param [Hash] attributes for the gift card
45
- # @return [GiftCard] The resulting preview GiftCard
46
- def self.preview(attributes = {})
47
- new(attributes) { |record| record.preview }
48
- end
49
-
50
- # Preview the GiftCard. Runs and validates the GiftCard but
51
- # does not persist it. Errors are applied to the GiftCard if there
52
- # are any errors.
53
- def preview
54
- clear_errors
55
- @response = API.send(:post, "#{path}/preview", to_xml)
56
- reload response
57
- rescue API::UnprocessableEntity => e
58
- apply_errors e
59
- end
60
-
61
- # Redeem this GiftCard on the given account.
62
- #
63
- # @param [String] Recipient's account code
64
- def redeem(recipient_account_code)
65
- clear_errors
66
- xml = <<-XML
67
- <recipient_account>
68
- <account_code>#{recipient_account_code}</account_code>
69
- </recipient_account>
70
- XML
71
- @response = API.send(:post, "#{self.class.collection_path}/#{redemption_code}/redeem", xml)
72
- reload response
73
- rescue API::UnprocessableEntity => e
74
- apply_errors e
75
- end
76
-
77
- private
78
-
79
- def xml_keys
80
- keys = super
81
- keys << 'redemption_code' if redemption_code? && !redemption_code_changed?
82
- keys.sort
83
- end
84
- end
85
- end
@@ -1,51 +0,0 @@
1
- module Recurly
2
- module Helper
3
- def camelize underscored_word
4
- underscored_word.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }
5
- end
6
-
7
- def classify table_name
8
- camelize singularize(table_name.to_s.sub(/.*\./, ''))
9
- end
10
-
11
- def demodulize class_name_in_module
12
- class_name_in_module.to_s.sub(/^.*::/, '')
13
- end
14
-
15
- def pluralize word
16
- word.to_s.sub(/([^s])$/, '\1s')
17
- end
18
-
19
- def singularize word
20
- word = word.to_s
21
- return word if word.end_with?('address')
22
- return "shipping_address" if word == "shipping_addresses"
23
- word.sub(/s$/, '').sub(/ie$/, 'y')
24
- end
25
-
26
- def underscore camel_cased_word
27
- word = camel_cased_word.to_s.dup
28
- word.gsub!(/::/, '/')
29
- word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
30
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
31
- word.tr! "-", "_"
32
- word.downcase!
33
- word
34
- end
35
-
36
- def hash_with_indifferent_read_access base = {}
37
- indifferent = Hash.new { |hash, key| hash[key.to_s] if key.is_a? Symbol }
38
- base.each_pair { |key, value| indifferent[key.to_s] = value }
39
- indifferent
40
- end
41
-
42
- def stringify_keys! hash
43
- hash.keys.each do |key|
44
- stringify_keys! hash[key] if hash[key].is_a? Hash
45
- hash[key.to_s] = hash.delete key if key.is_a? Symbol
46
- end
47
- end
48
-
49
- extend self
50
- end
51
- end
@@ -1,304 +0,0 @@
1
- module Recurly
2
- # Invoices are created through account objects.
3
- #
4
- # Recurly Documentation: https://dev.recurly.com/docs/list-invoices
5
- #
6
- # @example
7
- # account = Account.find(account_code)
8
- # account.invoice!
9
- class Invoice < Resource
10
- # @macro [attach] scope
11
- # @scope class
12
- # @return [Pager<Invoice>] A pager that yields +$1+ invoices.
13
- scope :pending, :state => :pending
14
- scope :paid, :state => :paid
15
- scope :failed, :state => :failed
16
- scope :past_due, :state => :past_due
17
-
18
- # These are deprecated as the states were renamed
19
- scope :open, :state => :pending
20
- scope :collected, :state => :paid
21
-
22
- # @return [Account]
23
- belongs_to :account
24
-
25
- # @return [Pager<Subscription>, []]
26
- has_many :subscriptions
27
-
28
- # This will only be present if the invoice has > 500 line items
29
- # @return [Pager<Adjustment>, []]
30
- has_many :all_line_items, class_name: :Adjustment
31
-
32
- # This will only be present if the invoice has > 500 transactions
33
- # @return [Pager<Transaction>, []]
34
- has_many :all_transactions, class_name: :Transaction
35
-
36
- # @return [Pager<Redemption>, []]
37
- has_many :redemptions
38
-
39
- # @return [ShippingAddress, nil]
40
- has_one :shipping_address, class_name: :ShippingAddress, readonly: true
41
-
42
- # @return [Pager<Invoice>, []]
43
- has_many :credit_invoices, class_name: :Invoice
44
-
45
- # @return [[CreditPayment]]
46
- has_many :credit_payments, class_name: :CreditPayment, readonly: true
47
-
48
- # @return [Pager<Invoice>, []]
49
- has_many :original_invoices, class_name: :Invoice, readonly: true
50
-
51
- # @return [Invoice, nil]
52
- has_one :original_invoice, class_name: :Invoice, readonly: true
53
-
54
- # @return [BillingInfo, nil]
55
- has_one :billing_info, class_name: :BillingInfo, readonly: true
56
-
57
- # Returns the first redemption in the Invoice's redemptions.
58
- # This was placed here for backwards compatibility when we went from
59
- # having a single redemption per invoice to multiple redemptions per invoice.
60
- #
61
- # @deprecated Use {#redemptions} and find the redemption you want.
62
- def redemption
63
- redemptions.first
64
- end
65
-
66
- # @return [String] The invoice number with the prefix (if there is one)
67
- def invoice_number_with_prefix
68
- "#{invoice_number_prefix}#{invoice_number}"
69
- end
70
-
71
- define_attribute_methods %w(
72
- uuid
73
- state
74
- invoice_number
75
- invoice_number_prefix
76
- po_number
77
- vat_number
78
- subtotal_in_cents
79
- tax_in_cents
80
- tax_type
81
- tax_region
82
- tax_rate
83
- total_in_cents
84
- currency
85
- created_at
86
- updated_at
87
- closed_at
88
- amount_remaining_in_cents
89
- line_items
90
- transactions
91
- terms_and_conditions
92
- vat_reverse_charge_notes
93
- customer_notes
94
- address
95
- net_terms
96
- collection_method
97
- tax_types
98
- refund_tax_date
99
- refund_geo_code
100
- subtotal_before_discount_in_cents
101
- attempt_next_collection_at
102
- recovery_reason
103
- discount_in_cents
104
- balance_in_cents
105
- due_on
106
- type
107
- origin
108
- credit_customer_notes
109
- refund_method
110
- subscription_id
111
- subscription_ids
112
- dunning_events_count
113
- final_dunning_event
114
- gateway_code
115
- surcharge_in_cents
116
- tax_details
117
- billing_info_uuid
118
- )
119
- alias to_param invoice_number_with_prefix
120
-
121
- def self.to_xml(attrs)
122
- invoice = new attrs
123
- invoice.to_xml
124
- end
125
-
126
- # Marks an invoice as paid successfully.
127
- #
128
- # @return [true, false] +true+ when successful, +false+ when unable to
129
- # (e.g., the invoice is no longer open).
130
- def mark_successful
131
- return false unless link? :mark_successful
132
- reload follow_link :mark_successful
133
- true
134
- end
135
-
136
- # Marks an invoice as failing collection.
137
- # Returns a new {InvoiceCollection} and does not
138
- # reload this invoice.
139
- #
140
- # @return [InvoiceCollection, false] InvoiceCollection when successful, +false+ when unable to
141
- # (e.g., the invoice is no longer open).
142
- def mark_failed
143
- return false unless link? :mark_failed
144
- InvoiceCollection.from_response follow_link(:mark_failed)
145
- rescue Recurly::API::UnprocessableEntity => e
146
- raise Invalid, e.message
147
- end
148
-
149
- # Initiate a collection attempt on an invoice.
150
- #
151
- # @example
152
- # # Optionally set transaction type
153
- # invoice.force_collect(transaction_type: 'moto')
154
- #
155
- # @param options [Hash] Optional set of details to send to collect endpoint.
156
- # @return [true, false] +true+ when successful, +false+ when unable to
157
- # (e.g., the invoice is no longer open).
158
- def force_collect(options = {})
159
- return false unless link? :force_collect
160
- http_opts = {}
161
- if body = force_collect_xml(options)
162
- http_opts[:body] = body
163
- end
164
- reload follow_link(:force_collect, http_opts)
165
- true
166
- end
167
-
168
- # Voids the invoice.
169
- #
170
- # @return [true, false] +true+ when successful, +false+ when unable to
171
- # (e.g., the invoice is no longer open).
172
- def void
173
- return false unless link? :void
174
- reload follow_link :void
175
- true
176
- end
177
-
178
- # Posts an offline payment on this invoice
179
- #
180
- # @return [Transaction]
181
- # @raise [Error] If the transaction fails.
182
- def enter_offline_payment(attrs={})
183
- Transaction.from_response API.post("#{uri}/transactions", attrs.empty? ? nil : Transaction.to_xml(attrs))
184
- rescue Recurly::API::UnprocessableEntity => e
185
- raise Invalid, e.message
186
- end
187
-
188
- # Fetches the pdf for this invoice
189
- def pdf
190
- self.class.find(to_param, format: 'pdf')
191
- end
192
-
193
- # Refunds specific line items on the invoice.
194
- #
195
- # @return [Invoice, false] Invoice if successful, false if the invoice isn't
196
- # refundable.
197
- # @raise [Error] If the refund fails.
198
- # @param line_items [Array, nil] An array of line items to refund.
199
- # @param refund_method ["credit_first", "transaction_first", "all_transaction", "all_credit"] The method used to refund.
200
- # @param external_refund [true, false] Designates that the refund transactions created are manual.
201
- # @param credit_customer_notes [String] Adds notes to refund credit invoice.
202
- # @param payment_method [String] Creates the manual transactions with this payment method. Allowed if *external_refund* is true.
203
- # @param description [String] Sets this value as the *transaction_note* on the manual transactions created. Allowed if *external_refund* is true.
204
- # @param refunded_at [DateTime] Sets this value as the *collected_at* on the manual transactions created. Allowed if *external_refund* is true.
205
- def refund(line_items = nil, refund_method = 'credit_first', options = {})
206
- return false unless link? :refund
207
- self.class.from_response(
208
- follow_link :refund, :body => refund_line_items_to_xml(line_items, refund_method, options)
209
- )
210
- rescue Recurly::API::UnprocessableEntity => e
211
- Transaction::Error.validate! e, (self if is_a?(Transaction))
212
- raise
213
- end
214
-
215
- # Refunds the invoice for a specific amount.
216
- #
217
- # @return [Invoice, false] Invoice if successful, false if the invoice isn't
218
- # refundable.
219
- # @raise [Error] If the refund fails.
220
- # @param amount_in_cents [Integer, nil] The amount (in cents) to refund.
221
- # @param refund_method ["credit_first", "transaction_first", "all_transaction", "all_credit"] The method used to refund.
222
- # @param external_refund [true, false] Designates that the refund transactions created are manual.
223
- # @param credit_customer_notes [String] Adds notes to refund credit invoice.
224
- # @param payment_method [String] Creates the manual transactions with this payment method. Allowed if *external_refund* is true.
225
- # @param description [String] Sets this value as the *transaction_note* on the manual transactions created. Allowed if *external_refund* is true.
226
- # @param refunded_at [DateTime] Sets this value as the *collected_at* on the manual transactions created. Allowed if *external_refund* is true.
227
- def refund_amount(amount_in_cents = nil, refund_method = 'credit_first', options = {})
228
- return false unless link? :refund
229
- self.class.from_response(
230
- follow_link :refund, :body => refund_amount_to_xml(amount_in_cents, refund_method, options)
231
- )
232
- end
233
-
234
- def xml_keys
235
- super - ['currency']
236
- end
237
-
238
- # Attempts to update the invoice, returning the success of the request.
239
- # Raises an error if attempting to create an invoice using this method.
240
- #
241
- # @return [true, false]
242
- # @raise [RuntimeError] Raises error if you attempt to create an invoice.
243
- # @example
244
- # invoice = Recurly::Invoice.find('1000')
245
- # invoice.po_number = '1234'
246
- # invoice.save # => true
247
- def save
248
- unless persisted?
249
- raise "Invoices can only be updated with Invoice#save. New invoices cannot be created using this method."
250
- end
251
- super
252
- end
253
-
254
- private
255
-
256
- def initialize(attributes = {})
257
- super({ :currency => Recurly.default_currency }.merge attributes)
258
- end
259
-
260
- def refund_amount_to_xml(amount_in_cents = nil, refund_method = nil, options = {})
261
- builder = XML.new("<invoice/>")
262
- builder.add_element 'refund_method', refund_method
263
- builder.add_element 'amount_in_cents', amount_in_cents
264
- options.each do |k, v|
265
- builder.add_element k.to_s, v
266
- end
267
- builder.to_s
268
- end
269
-
270
- def refund_line_items_to_xml(line_items = nil, refund_method = nil, options = {})
271
- builder = XML.new("<invoice/>")
272
- builder.add_element 'refund_method', refund_method
273
- options.each do |k, v|
274
- builder.add_element k.to_s, v
275
- end
276
- line_items ||= []
277
- node = builder.add_element 'line_items'
278
- line_items.each do |line_item|
279
- adj_node = node.add_element 'adjustment'
280
- adj_node.add_element 'uuid', line_item[:adjustment].uuid
281
- adj_node.add_element 'quantity', line_item[:quantity]
282
- adj_node.add_element 'prorate', line_item[:prorate]
283
- end
284
- builder.to_s
285
- end
286
-
287
- # Returns an xml body or nil given some options
288
- def force_collect_xml(options = {})
289
- if options[:transaction_type] || options[:billing_info]
290
- ForceCollect.new(options).to_xml
291
- end
292
- end
293
-
294
- # Invoices are only writeable through {Account} instances.
295
- embedded! true
296
- undef destroy
297
-
298
- # Represents a body for the force collect endpoint
299
- class ForceCollect < Resource
300
- has_one :billing_info, class_name: :BillingInfo, readonly: false
301
- define_attribute_methods %w[transaction_type]
302
- end
303
- end
304
- end
@@ -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