killbill 3.1.3 → 3.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/Jarfile +7 -5
  3. data/NEWS +3 -0
  4. data/README.md +41 -17
  5. data/VERSION +1 -1
  6. data/generators/active_merchant/templates/Jarfile.rb +7 -5
  7. data/generators/active_merchant/templates/config.yml.rb +3 -3
  8. data/generators/active_merchant/templates/db/ddl.sql.rb +4 -0
  9. data/generators/active_merchant/templates/db/schema.rb +4 -0
  10. data/generators/active_merchant/templates/lib/api.rb +42 -22
  11. data/generators/active_merchant/templates/lib/models/response.rb +3 -1
  12. data/generators/active_merchant/templates/plugin.gemspec.rb +1 -1
  13. data/lib/killbill.rb +7 -4
  14. data/lib/killbill/gen/api/account.rb +4 -3
  15. data/lib/killbill/gen/api/account_api_exception.rb +4 -3
  16. data/lib/killbill/gen/api/account_audit_logs.rb +12 -68
  17. data/lib/killbill/gen/api/account_audit_logs_for_object_type.rb +4 -3
  18. data/lib/killbill/gen/api/account_data.rb +4 -3
  19. data/lib/killbill/gen/api/account_email.rb +4 -3
  20. data/lib/killbill/gen/api/account_user_api.rb +4 -3
  21. data/lib/killbill/gen/api/audit_log.rb +4 -3
  22. data/lib/killbill/gen/api/audit_user_api.rb +4 -3
  23. data/lib/killbill/gen/api/billing_exception_base.rb +4 -3
  24. data/lib/killbill/gen/api/block.rb +4 -3
  25. data/lib/killbill/gen/api/blockable.rb +4 -3
  26. data/lib/killbill/gen/api/blocking_api_exception.rb +4 -3
  27. data/lib/killbill/gen/api/blocking_state.rb +4 -3
  28. data/lib/killbill/gen/api/call_context.rb +4 -3
  29. data/lib/killbill/gen/api/catalog.rb +4 -3
  30. data/lib/killbill/gen/api/catalog_api_exception.rb +4 -3
  31. data/lib/killbill/gen/api/catalog_user_api.rb +4 -3
  32. data/lib/killbill/gen/api/column_info.rb +4 -3
  33. data/lib/killbill/gen/api/control_tag.rb +4 -3
  34. data/lib/killbill/gen/api/currency_conversion.rb +4 -3
  35. data/lib/killbill/gen/api/currency_conversion_api.rb +4 -3
  36. data/lib/killbill/gen/api/currency_conversion_exception.rb +4 -3
  37. data/lib/killbill/gen/api/currency_value_null.rb +4 -3
  38. data/lib/killbill/gen/api/custom_field.rb +4 -3
  39. data/lib/killbill/gen/api/custom_field_api_exception.rb +4 -3
  40. data/lib/killbill/gen/api/custom_field_user_api.rb +4 -3
  41. data/lib/killbill/gen/api/database_export_output_stream.rb +4 -3
  42. data/lib/killbill/gen/api/direct_payment.rb +39 -11
  43. data/lib/killbill/gen/api/direct_payment_api.rb +643 -31
  44. data/lib/killbill/gen/api/direct_payment_transaction.rb +37 -12
  45. data/lib/killbill/gen/api/duration.rb +4 -3
  46. data/lib/killbill/gen/api/entitlement.rb +4 -3
  47. data/lib/killbill/gen/api/entitlement_ao_status_dry_run.rb +4 -3
  48. data/lib/killbill/gen/api/entitlement_api.rb +4 -3
  49. data/lib/killbill/gen/api/entitlement_api_exception.rb +4 -3
  50. data/lib/killbill/gen/api/entity.rb +4 -3
  51. data/lib/killbill/gen/api/fixed.rb +4 -3
  52. data/lib/killbill/gen/api/illegal_plan_change.rb +4 -3
  53. data/lib/killbill/gen/api/international_price.rb +4 -3
  54. data/lib/killbill/gen/api/invalid_config_exception.rb +4 -3
  55. data/lib/killbill/gen/api/invoice.rb +4 -3
  56. data/lib/killbill/gen/api/invoice_api_exception.rb +4 -3
  57. data/lib/killbill/gen/api/invoice_creation_event.rb +4 -3
  58. data/lib/killbill/gen/api/invoice_formatter.rb +4 -3
  59. data/lib/killbill/gen/api/invoice_item.rb +4 -3
  60. data/lib/killbill/gen/api/invoice_item_formatter.rb +4 -3
  61. data/lib/killbill/gen/api/invoice_payment.rb +7 -7
  62. data/lib/killbill/gen/api/invoice_payment_api.rb +7 -153
  63. data/lib/killbill/gen/api/invoice_user_api.rb +22 -3
  64. data/lib/killbill/gen/api/limit.rb +4 -3
  65. data/lib/killbill/gen/api/listing.rb +4 -3
  66. data/lib/killbill/gen/api/migration_plan.rb +4 -3
  67. data/lib/killbill/gen/api/mutable_account_data.rb +4 -3
  68. data/lib/killbill/gen/api/osgi_killbill.rb +15 -7
  69. data/lib/killbill/gen/api/osgi_plugin_properties.rb +4 -3
  70. data/lib/killbill/gen/api/pagination.rb +4 -3
  71. data/lib/killbill/gen/api/payment_api_exception.rb +4 -3
  72. data/lib/killbill/gen/api/payment_gateway_api.rb +4 -3
  73. data/lib/killbill/gen/api/payment_method.rb +11 -4
  74. data/lib/killbill/gen/api/payment_method_plugin.rb +5 -76
  75. data/lib/killbill/gen/api/payment_options.rb +68 -0
  76. data/lib/killbill/gen/api/plan.rb +4 -3
  77. data/lib/killbill/gen/api/plan_change_result.rb +4 -3
  78. data/lib/killbill/gen/api/plan_phase.rb +4 -3
  79. data/lib/killbill/gen/api/plan_phase_specifier.rb +4 -3
  80. data/lib/killbill/gen/api/plan_specifier.rb +4 -3
  81. data/lib/killbill/gen/api/plugin_config_service_api.rb +4 -3
  82. data/lib/killbill/gen/api/plugin_property.rb +4 -3
  83. data/lib/killbill/gen/api/price.rb +4 -3
  84. data/lib/killbill/gen/api/price_list.rb +4 -3
  85. data/lib/killbill/gen/api/price_list_set.rb +4 -3
  86. data/lib/killbill/gen/api/product.rb +4 -3
  87. data/lib/killbill/gen/api/rate.rb +4 -3
  88. data/lib/killbill/gen/api/record_id_api.rb +4 -3
  89. data/lib/killbill/gen/api/recurring.rb +4 -3
  90. data/lib/killbill/gen/api/refund.rb +7 -6
  91. data/lib/killbill/gen/api/require_gen.rb +5 -6
  92. data/lib/killbill/gen/api/rolled_up_usage.rb +4 -3
  93. data/lib/killbill/gen/api/security_api_exception.rb +4 -3
  94. data/lib/killbill/gen/api/static_catalog.rb +4 -3
  95. data/lib/killbill/gen/api/subscription.rb +4 -3
  96. data/lib/killbill/gen/api/subscription_api.rb +4 -3
  97. data/lib/killbill/gen/api/subscription_api_exception.rb +4 -3
  98. data/lib/killbill/gen/api/subscription_bundle.rb +4 -3
  99. data/lib/killbill/gen/api/subscription_bundle_timeline.rb +4 -3
  100. data/lib/killbill/gen/api/subscription_event.rb +4 -3
  101. data/lib/killbill/gen/api/tag.rb +4 -3
  102. data/lib/killbill/gen/api/tag_api_exception.rb +4 -3
  103. data/lib/killbill/gen/api/tag_definition.rb +4 -3
  104. data/lib/killbill/gen/api/tag_definition_api_exception.rb +4 -3
  105. data/lib/killbill/gen/api/tag_user_api.rb +4 -3
  106. data/lib/killbill/gen/api/tenant.rb +4 -3
  107. data/lib/killbill/gen/api/tenant_api_exception.rb +4 -3
  108. data/lib/killbill/gen/api/tenant_context.rb +4 -3
  109. data/lib/killbill/gen/api/tenant_data.rb +4 -3
  110. data/lib/killbill/gen/api/tenant_kv.rb +4 -3
  111. data/lib/killbill/gen/api/tenant_user_api.rb +4 -3
  112. data/lib/killbill/gen/api/tier.rb +4 -3
  113. data/lib/killbill/gen/api/tiered_block.rb +4 -3
  114. data/lib/killbill/gen/api/unit.rb +4 -3
  115. data/lib/killbill/gen/api/usage.rb +4 -3
  116. data/lib/killbill/gen/api/usage_user_api.rb +4 -3
  117. data/lib/killbill/gen/plugin-api/currency_plugin_api.rb +4 -3
  118. data/lib/killbill/gen/plugin-api/ext_bus_event.rb +4 -3
  119. data/lib/killbill/gen/plugin-api/gateway_notification.rb +4 -3
  120. data/lib/killbill/gen/plugin-api/hosted_payment_page_form_descriptor.rb +4 -3
  121. data/lib/killbill/gen/plugin-api/notification_plugin_api.rb +4 -3
  122. data/lib/killbill/gen/plugin-api/payment_method_info_plugin.rb +4 -3
  123. data/lib/killbill/gen/plugin-api/payment_plugin_api.rb +75 -81
  124. data/lib/killbill/gen/plugin-api/payment_plugin_api_exception.rb +4 -3
  125. data/lib/killbill/gen/plugin-api/{payment_info_plugin.rb → payment_transaction_info_plugin.rb} +21 -6
  126. data/lib/killbill/gen/plugin-api/require_gen.rb +5 -5
  127. data/lib/killbill/helpers/active_merchant/active_record/models/payment_method.rb +20 -36
  128. data/lib/killbill/helpers/active_merchant/active_record/models/response.rb +72 -81
  129. data/lib/killbill/helpers/active_merchant/active_record/models/transaction.rb +62 -43
  130. data/lib/killbill/helpers/active_merchant/killbill_spec_helper.rb +0 -13
  131. data/lib/killbill/helpers/active_merchant/payment_plugin.rb +127 -125
  132. data/lib/killbill/http_servlet.rb +16 -1
  133. data/lib/killbill/killbill_api.rb +0 -3
  134. data/lib/killbill/payment.rb +22 -6
  135. data/lib/killbill/rake_task.rb +93 -31
  136. data/spec/killbill/helpers/payment_method_spec.rb +153 -0
  137. data/spec/killbill/helpers/response_spec.rb +58 -15
  138. data/spec/killbill/helpers/test_schema.rb +12 -8
  139. data/spec/killbill/helpers/transaction_spec.rb +134 -0
  140. data/spec/killbill/payment_plugin_api_spec.rb +18 -18
  141. data/spec/killbill/payment_plugin_spec.rb +26 -15
  142. data/spec/killbill/payment_test.rb +6 -7
  143. data/spec/spec_helper.rb +3 -0
  144. metadata +6 -5
  145. data/lib/killbill/gen/api/payment.rb +0 -187
  146. data/lib/killbill/gen/plugin-api/refund_info_plugin.rb +0 -152
@@ -1,10 +1,11 @@
1
1
  ###################################################################################
2
2
  # #
3
3
  # Copyright 2010-2013 Ning, Inc. #
4
+ # Copyright 2014 The Billing Project, LLC #
4
5
  # #
5
- # Ning licenses this file to you under the Apache License, version 2.0 #
6
- # (the "License"); you may not use this file except in compliance with the #
7
- # License. You may obtain a copy of the License at: #
6
+ # The Billing Project licenses this file to you under the Apache License, #
7
+ # version 2.0 (the "License"); you may not use this file except in #
8
+ # compliance with the License. You may obtain a copy of the License at: #
8
9
  # #
9
10
  # http://www.apache.org/licenses/LICENSE-2.0 #
10
11
  # #
@@ -1,10 +1,11 @@
1
1
  ###################################################################################
2
2
  # #
3
3
  # Copyright 2010-2013 Ning, Inc. #
4
+ # Copyright 2014 The Billing Project, LLC #
4
5
  # #
5
- # Ning licenses this file to you under the Apache License, version 2.0 #
6
- # (the "License"); you may not use this file except in compliance with the #
7
- # License. You may obtain a copy of the License at: #
6
+ # The Billing Project licenses this file to you under the Apache License, #
7
+ # version 2.0 (the "License"); you may not use this file except in #
8
+ # compliance with the License. You may obtain a copy of the License at: #
8
9
  # #
9
10
  # http://www.apache.org/licenses/LICENSE-2.0 #
10
11
  # #
@@ -28,11 +29,11 @@ module Killbill
28
29
  module Model
29
30
 
30
31
  java_package 'org.killbill.billing.payment.plugin.api'
31
- class PaymentInfoPlugin
32
+ class PaymentTransactionInfoPlugin
32
33
 
33
- include org.killbill.billing.payment.plugin.api.PaymentInfoPlugin
34
+ include org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin
34
35
 
35
- attr_accessor :kb_payment_id, :amount, :currency, :created_date, :effective_date, :status, :gateway_error, :gateway_error_code, :first_payment_reference_id, :second_payment_reference_id, :properties
36
+ attr_accessor :kb_payment_id, :kb_transaction_payment_id, :transaction_type, :amount, :currency, :created_date, :effective_date, :status, :gateway_error, :gateway_error_code, :first_payment_reference_id, :second_payment_reference_id, :properties
36
37
 
37
38
  def initialize()
38
39
  end
@@ -41,6 +42,12 @@ module Killbill
41
42
  # conversion for kb_payment_id [type = java.util.UUID]
42
43
  @kb_payment_id = java.util.UUID.fromString(@kb_payment_id.to_s) unless @kb_payment_id.nil?
43
44
 
45
+ # conversion for kb_transaction_payment_id [type = java.util.UUID]
46
+ @kb_transaction_payment_id = java.util.UUID.fromString(@kb_transaction_payment_id.to_s) unless @kb_transaction_payment_id.nil?
47
+
48
+ # conversion for transaction_type [type = org.killbill.billing.payment.api.TransactionType]
49
+ @transaction_type = Java::org.killbill.billing.payment.api.TransactionType.value_of("#{@transaction_type.to_s}") unless @transaction_type.nil?
50
+
44
51
  # conversion for amount [type = java.math.BigDecimal]
45
52
  if @amount.nil?
46
53
  @amount = java.math.BigDecimal::ZERO
@@ -94,6 +101,14 @@ module Killbill
94
101
  @kb_payment_id = j_obj.kb_payment_id
95
102
  @kb_payment_id = @kb_payment_id.nil? ? nil : @kb_payment_id.to_s
96
103
 
104
+ # conversion for kb_transaction_payment_id [type = java.util.UUID]
105
+ @kb_transaction_payment_id = j_obj.kb_transaction_payment_id
106
+ @kb_transaction_payment_id = @kb_transaction_payment_id.nil? ? nil : @kb_transaction_payment_id.to_s
107
+
108
+ # conversion for transaction_type [type = org.killbill.billing.payment.api.TransactionType]
109
+ @transaction_type = j_obj.transaction_type
110
+ @transaction_type = @transaction_type.to_s.to_sym unless @transaction_type.nil?
111
+
97
112
  # conversion for amount [type = java.math.BigDecimal]
98
113
  @amount = j_obj.amount
99
114
  @amount = @amount.nil? ? 0 : BigDecimal.new(@amount.to_s)
@@ -1,10 +1,11 @@
1
1
  ###################################################################################
2
2
  # #
3
3
  # Copyright 2010-2013 Ning, Inc. #
4
+ # Copyright 2014 The Billing Project, LLC #
4
5
  # #
5
- # Ning licenses this file to you under the Apache License, version 2.0 #
6
- # (the "License"); you may not use this file except in compliance with the #
7
- # License. You may obtain a copy of the License at: #
6
+ # The Billing Project licenses this file to you under the Apache License, #
7
+ # version 2.0 (the "License"); you may not use this file except in #
8
+ # compliance with the License. You may obtain a copy of the License at: #
8
9
  # #
9
10
  # http://www.apache.org/licenses/LICENSE-2.0 #
10
11
  # #
@@ -31,5 +32,4 @@ require 'killbill/gen/plugin-api/notification_plugin_api'
31
32
  require 'killbill/gen/plugin-api/currency_plugin_api'
32
33
  require 'killbill/gen/plugin-api/gateway_notification'
33
34
  require 'killbill/gen/plugin-api/hosted_payment_page_form_descriptor'
34
- require 'killbill/gen/plugin-api/payment_info_plugin'
35
- require 'killbill/gen/plugin-api/refund_info_plugin'
35
+ require 'killbill/gen/plugin-api/payment_transaction_info_plugin'
@@ -3,6 +3,7 @@ module Killbill
3
3
  module ActiveMerchant
4
4
  module ActiveRecord
5
5
  require 'active_record'
6
+ require 'active_merchant'
6
7
  require 'killbill/helpers/active_merchant/active_record/models/helpers'
7
8
 
8
9
  class PaymentMethod < ::ActiveRecord::Base
@@ -14,9 +15,9 @@ module Killbill
14
15
  def self.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, cc_or_token, response, options, extra_params = {}, model = PaymentMethod)
15
16
  model.new({
16
17
  :kb_account_id => kb_account_id,
17
- :kb_tenant_id => kb_tenant_id,
18
18
  :kb_payment_method_id => kb_payment_method_id,
19
- :token => response.authorization,
19
+ :kb_tenant_id => kb_tenant_id,
20
+ :token => cc_or_token.kind_of?(::ActiveMerchant::Billing::CreditCard) ? response.authorization : (cc_or_token || response.authorization),
20
21
  :cc_first_name => cc_or_token.kind_of?(::ActiveMerchant::Billing::CreditCard) ? cc_or_token.first_name : nil,
21
22
  :cc_last_name => cc_or_token.kind_of?(::ActiveMerchant::Billing::CreditCard) ? cc_or_token.last_name : nil,
22
23
  :cc_type => cc_or_token.kind_of?(::ActiveMerchant::Billing::CreditCard) ? cc_or_token.brand : nil,
@@ -34,7 +35,7 @@ module Killbill
34
35
 
35
36
  def self.from_kb_account_id(kb_account_id, kb_tenant_id)
36
37
  if kb_tenant_id.nil?
37
- where('kb_account_id = ? AND is_deleted = ?', kb_account_id, false)
38
+ where('kb_account_id = ? AND kb_tenant_id is NULL AND is_deleted = ?', kb_account_id, false)
38
39
  else
39
40
  where('kb_account_id = ? AND kb_tenant_id = ? AND is_deleted = ?', kb_account_id, kb_tenant_id, false)
40
41
  end
@@ -42,7 +43,7 @@ module Killbill
42
43
 
43
44
  def self.from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id)
44
45
  if kb_tenant_id.nil?
45
- payment_methods = where('kb_payment_method_id = ? AND is_deleted = ?', kb_payment_method_id, false)
46
+ payment_methods = where('kb_payment_method_id = ? AND kb_tenant_id is NULL AND is_deleted = ?', kb_payment_method_id, false)
46
47
  else
47
48
  payment_methods = where('kb_payment_method_id = ? AND kb_tenant_id = ? AND is_deleted = ?', kb_payment_method_id, kb_tenant_id, false)
48
49
  end
@@ -117,7 +118,7 @@ module Killbill
117
118
  actual_limit = [pagination.max_nb_records, limit].min
118
119
  pagination.iterator = StreamyResultSet.new(actual_limit) do |offset,limit|
119
120
  self.find_by_sql(self.search_query(search_key, kb_tenant_id, offset, limit))
120
- .map(&:to_payment_method_response)
121
+ .map(&:to_payment_method_plugin)
121
122
  end
122
123
  pagination
123
124
  end
@@ -132,43 +133,31 @@ module Killbill
132
133
  false
133
134
  end
134
135
 
135
- def to_payment_method_response
136
+ def to_payment_method_plugin
136
137
  properties = []
137
- properties << create_pm_kv_info('token', external_payment_method_id)
138
- properties << create_pm_kv_info('ccName', cc_name)
139
- properties << create_pm_kv_info('ccType', cc_type)
140
- properties << create_pm_kv_info('ccExpirationMonth', cc_exp_month)
141
- properties << create_pm_kv_info('ccExpirationYear', cc_exp_year)
142
- properties << create_pm_kv_info('ccLast4', cc_last_4)
143
- properties << create_pm_kv_info('address1', address1)
144
- properties << create_pm_kv_info('address2', address2)
145
- properties << create_pm_kv_info('city', city)
146
- properties << create_pm_kv_info('state', state)
147
- properties << create_pm_kv_info('zip', zip)
148
- properties << create_pm_kv_info('country', country)
138
+ properties << create_plugin_property('token', external_payment_method_id)
139
+ properties << create_plugin_property('ccName', cc_name)
140
+ properties << create_plugin_property('ccType', cc_type)
141
+ properties << create_plugin_property('ccExpirationMonth', cc_exp_month)
142
+ properties << create_plugin_property('ccExpirationYear', cc_exp_year)
143
+ properties << create_plugin_property('ccLast4', cc_last_4)
144
+ properties << create_plugin_property('address1', address1)
145
+ properties << create_plugin_property('address2', address2)
146
+ properties << create_plugin_property('city', city)
147
+ properties << create_plugin_property('state', state)
148
+ properties << create_plugin_property('zip', zip)
149
+ properties << create_plugin_property('country', country)
149
150
 
150
151
  pm_plugin = Killbill::Plugin::Model::PaymentMethodPlugin.new
151
152
  pm_plugin.kb_payment_method_id = kb_payment_method_id
152
153
  pm_plugin.external_payment_method_id = external_payment_method_id
153
154
  pm_plugin.is_default_payment_method = is_default
154
155
  pm_plugin.properties = properties
155
- pm_plugin.type = 'CreditCard'
156
- pm_plugin.cc_name = cc_name
157
- pm_plugin.cc_type = cc_type
158
- pm_plugin.cc_expiration_month = cc_exp_month
159
- pm_plugin.cc_expiration_year = cc_exp_year
160
- pm_plugin.cc_last4 = cc_last_4
161
- pm_plugin.address1 = address1
162
- pm_plugin.address2 = address2
163
- pm_plugin.city = city
164
- pm_plugin.state = state
165
- pm_plugin.zip = zip
166
- pm_plugin.country = country
167
156
 
168
157
  pm_plugin
169
158
  end
170
159
 
171
- def to_payment_method_info_response
160
+ def to_payment_method_info_plugin
172
161
  pm_info_plugin = Killbill::Plugin::Model::PaymentMethodInfoPlugin.new
173
162
  pm_info_plugin.account_id = kb_account_id
174
163
  pm_info_plugin.payment_method_id = kb_payment_method_id
@@ -191,11 +180,6 @@ module Killbill
191
180
 
192
181
  private
193
182
 
194
- # Deprecated
195
- def create_pm_kv_info(key, value)
196
- create_plugin_property(key, value)
197
- end
198
-
199
183
  def create_plugin_property(key, value)
200
184
  prop = Killbill::Plugin::Model::PluginProperty.new
201
185
  prop.key = key
@@ -13,58 +13,94 @@ module Killbill
13
13
 
14
14
  self.abstract_class = true
15
15
 
16
- def self.from_response(api_call, kb_account_id, kb_payment_id, kb_tenant_id, response, extra_params = {}, model = Response)
16
+ def self.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response, extra_params = {}, model = Response)
17
17
  model.new({
18
- :api_call => api_call,
19
- :kb_account_id => kb_account_id,
20
- :kb_payment_id => kb_payment_id,
21
- :kb_tenant_id => kb_tenant_id,
22
- :message => response.message,
23
- :authorization => response.authorization,
24
- :fraud_review => response.fraud_review?,
25
- :test => response.test?,
26
- :avs_result_code => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.code : response.avs_result['code'],
27
- :avs_result_message => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.message : response.avs_result['message'],
28
- :avs_result_street_match => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.street_match : response.avs_result['street_match'],
29
- :avs_result_postal_match => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.postal_match : response.avs_result['postal_match'],
30
- :cvv_result_code => response.cvv_result.kind_of?(::ActiveMerchant::Billing::CVVResult) ? response.cvv_result.code : response.cvv_result['code'],
31
- :cvv_result_message => response.cvv_result.kind_of?(::ActiveMerchant::Billing::CVVResult) ? response.cvv_result.message : response.cvv_result['message'],
32
- :success => response.success?
18
+ :api_call => api_call,
19
+ :kb_account_id => kb_account_id,
20
+ :kb_payment_id => kb_payment_id,
21
+ :kb_payment_transaction_id => kb_payment_transaction_id,
22
+ :transaction_type => transaction_type,
23
+ :kb_tenant_id => kb_tenant_id,
24
+ :message => response.message,
25
+ :authorization => response.authorization,
26
+ :fraud_review => response.fraud_review?,
27
+ :test => response.test?,
28
+ :avs_result_code => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.code : response.avs_result['code'],
29
+ :avs_result_message => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.message : response.avs_result['message'],
30
+ :avs_result_street_match => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.street_match : response.avs_result['street_match'],
31
+ :avs_result_postal_match => response.avs_result.kind_of?(::ActiveMerchant::Billing::AVSResult) ? response.avs_result.postal_match : response.avs_result['postal_match'],
32
+ :cvv_result_code => response.cvv_result.kind_of?(::ActiveMerchant::Billing::CVVResult) ? response.cvv_result.code : response.cvv_result['code'],
33
+ :cvv_result_message => response.cvv_result.kind_of?(::ActiveMerchant::Billing::CVVResult) ? response.cvv_result.message : response.cvv_result['message'],
34
+ :success => response.success?
33
35
  }.merge!(extra_params))
34
36
  end
35
37
 
36
- def to_payment_response(transaction=nil)
37
- to_killbill_response :payment, transaction
38
- end
38
+ def to_transaction_info_plugin(transaction=nil)
39
+ if transaction.nil?
40
+ amount_in_cents = nil
41
+ currency = nil
42
+ created_date = created_at
43
+ else
44
+ amount_in_cents = transaction.amount_in_cents
45
+ currency = transaction.currency
46
+ created_date = transaction.created_at
47
+ end
39
48
 
40
- def to_refund_response(transaction=nil)
41
- to_killbill_response :refund, transaction
49
+ t_info_plugin = Killbill::Plugin::Model::PaymentTransactionInfoPlugin.new
50
+ t_info_plugin.kb_payment_id = kb_payment_id
51
+ t_info_plugin.kb_transaction_payment_id = kb_payment_transaction_id
52
+ t_info_plugin.transaction_type = transaction_type.nil? ? nil : transaction_type.to_sym
53
+ t_info_plugin.amount = Money.new(amount_in_cents, currency).to_d if currency
54
+ t_info_plugin.currency = currency
55
+ t_info_plugin.created_date = created_date
56
+ t_info_plugin.effective_date = effective_date
57
+ t_info_plugin.status = (success ? :PROCESSED : :ERROR)
58
+ t_info_plugin.gateway_error = gateway_error
59
+ t_info_plugin.gateway_error_code = gateway_error_code
60
+ t_info_plugin.first_payment_reference_id = first_reference_id
61
+ t_info_plugin.second_payment_reference_id = second_reference_id
62
+
63
+ properties = []
64
+ properties << create_plugin_property('message', message)
65
+ properties << create_plugin_property('authorization', authorization)
66
+ properties << create_plugin_property('fraudReview', fraud_review)
67
+ properties << create_plugin_property('test', self.read_attribute(:test))
68
+ properties << create_plugin_property('avsResultCode', avs_result_code)
69
+ properties << create_plugin_property('avsResultMessage', avs_result_message)
70
+ properties << create_plugin_property('avsResultStreetMatch', avs_result_street_match)
71
+ properties << create_plugin_property('avsResultPostalMatch', avs_result_postal_match)
72
+ properties << create_plugin_property('cvvResultCode', cvv_result_code)
73
+ properties << create_plugin_property('cvvResultMessage', cvv_result_message)
74
+ properties << create_plugin_property('success', success)
75
+ t_info_plugin.properties = properties
76
+
77
+ t_info_plugin
42
78
  end
43
79
 
44
80
  # Override in your plugin if needed
45
- def self.search_where_clause(t, search_key, api_call)
81
+ def self.search_where_clause(t, search_key)
46
82
  # Exact matches only
47
83
  where_clause = t[:kb_payment_id].eq(search_key)
84
+ .or(t[:kb_payment_transaction_id].eq(search_key))
48
85
  .or(t[:message].eq(search_key))
49
86
  .or(t[:authorization].eq(search_key))
50
87
  .or(t[:fraud_review].eq(search_key))
51
88
 
52
89
  # Only search successful payments and refunds
53
- where_clause = where_clause.and(t[:api_call].eq(api_call))
54
- .and(t[:success].eq(true))
90
+ where_clause = where_clause.and(t[:success].eq(true))
55
91
 
56
92
  where_clause
57
93
  end
58
94
 
59
95
  # VisibleForTesting
60
- def self.search_query(api_call, search_key, kb_tenant_id, offset = nil, limit = nil)
96
+ def self.search_query(search_key, kb_tenant_id, offset = nil, limit = nil)
61
97
  t = self.arel_table
62
98
 
63
99
  if kb_tenant_id.nil?
64
- query = t.where(search_where_clause(t, search_key, api_call))
100
+ query = t.where(search_where_clause(t, search_key))
65
101
  .order(t[:id])
66
102
  else
67
- query = t.where(search_where_clause(t, search_key, api_call).and(t[:kb_tenant_id].eq(kb_tenant_id)))
103
+ query = t.where(search_where_clause(t, search_key).and(t[:kb_tenant_id].eq(kb_tenant_id)))
68
104
  .order(t[:id])
69
105
  end
70
106
 
@@ -81,18 +117,16 @@ module Killbill
81
117
  query
82
118
  end
83
119
 
84
- def self.search(search_key, kb_tenant_id, offset = 0, limit = 100, type = :payment)
85
- api_call = type == :payment ? 'charge' : 'refund'
120
+ def self.search(search_key, kb_tenant_id, offset = 0, limit = 100)
86
121
  pagination = ::Killbill::Plugin::Model::Pagination.new
87
122
  pagination.current_offset = offset
88
- pagination.total_nb_records = self.count_by_sql(self.search_query(api_call, search_key, kb_tenant_id))
89
- pagination.max_nb_records = self.where(:api_call => api_call, :success => true).count
123
+ pagination.total_nb_records = self.count_by_sql(self.search_query(search_key, kb_tenant_id))
124
+ pagination.max_nb_records = self.where(:success => true).count
90
125
  pagination.next_offset = (!pagination.total_nb_records.nil? && offset + limit >= pagination.total_nb_records) ? nil : offset + limit
91
126
  # Reduce the limit if the specified value is larger than the number of records
92
127
  actual_limit = [pagination.max_nb_records, limit].min
93
128
  pagination.iterator = ::Killbill::Plugin::ActiveMerchant::ActiveRecord::StreamyResultSet.new(actual_limit) do |offset, limit|
94
- self.find_by_sql(self.search_query(api_call, search_key, kb_tenant_id, offset, limit))
95
- .map { |x| type == :payment ? x.to_payment_response : x.to_refund_response }
129
+ self.find_by_sql(self.search_query(search_key, kb_tenant_id, offset, limit)).map { |x| x.to_transaction_info_plugin }
96
130
  end
97
131
  pagination
98
132
  end
@@ -102,16 +136,6 @@ module Killbill
102
136
  authorization
103
137
  end
104
138
 
105
- # Override in your plugin if needed
106
- def first_payment_reference_id
107
- nil
108
- end
109
-
110
- # Override in your plugin if needed
111
- def second_payment_reference_id
112
- nil
113
- end
114
-
115
139
  # Override in your plugin if needed
116
140
  def first_reference_id
117
141
  nil
@@ -139,44 +163,11 @@ module Killbill
139
163
 
140
164
  private
141
165
 
142
- def to_killbill_response(type, transaction)
143
- if transaction.nil?
144
- amount_in_cents = nil
145
- currency = nil
146
- created_date = created_at
147
- else
148
- amount_in_cents = transaction.amount_in_cents
149
- currency = transaction.currency
150
- created_date = transaction.created_at
151
- end
152
-
153
- if type == :payment
154
- p_info_plugin = Killbill::Plugin::Model::PaymentInfoPlugin.new
155
- p_info_plugin.kb_payment_id = kb_payment_id
156
- p_info_plugin.amount = Money.new(amount_in_cents, currency).to_d if currency
157
- p_info_plugin.currency = currency
158
- p_info_plugin.created_date = created_date
159
- p_info_plugin.effective_date = effective_date
160
- p_info_plugin.status = (success ? :PROCESSED : :ERROR)
161
- p_info_plugin.gateway_error = gateway_error
162
- p_info_plugin.gateway_error_code = gateway_error_code
163
- p_info_plugin.first_payment_reference_id = first_reference_id
164
- p_info_plugin.second_payment_reference_id = second_reference_id
165
- p_info_plugin
166
- else
167
- r_info_plugin = Killbill::Plugin::Model::RefundInfoPlugin.new
168
- r_info_plugin.kb_payment_id = kb_payment_id
169
- r_info_plugin.amount = Money.new(amount_in_cents, currency).to_d if currency
170
- r_info_plugin.currency = currency
171
- r_info_plugin.created_date = created_date
172
- r_info_plugin.effective_date = effective_date
173
- r_info_plugin.status = (success ? :PROCESSED : :ERROR)
174
- r_info_plugin.gateway_error = gateway_error
175
- r_info_plugin.gateway_error_code = gateway_error_code
176
- r_info_plugin.first_refund_reference_id = first_reference_id
177
- r_info_plugin.second_refund_reference_id = second_reference_id
178
- r_info_plugin
179
- end
166
+ def create_plugin_property(key, value)
167
+ prop = Killbill::Plugin::Model::PluginProperty.new
168
+ prop.key = key
169
+ prop.value = value
170
+ prop
180
171
  end
181
172
  end
182
173
  end
@@ -8,62 +8,81 @@ module Killbill
8
8
 
9
9
  self.abstract_class = true
10
10
 
11
- def self.authorization_from_kb_payment_id(kb_payment_id, kb_tenant_id)
12
- transaction_from_kb_payment_id :authorize, kb_payment_id, kb_tenant_id, :single
13
- end
11
+ class << self
12
+ def transactions_from_kb_payment_id(kb_payment_id, kb_tenant_id)
13
+ where(:kb_payment_id => kb_payment_id, :kb_tenant_id => kb_tenant_id).order(:created_at)
14
+ end
14
15
 
15
- def self.charge_from_kb_payment_id(kb_payment_id, kb_tenant_id)
16
- transaction_from_kb_payment_id :charge, kb_payment_id, kb_tenant_id, :single
17
- end
16
+ [:authorize, :capture, :purchase, :credit, :refund].each do |transaction_type|
17
+ define_method("#{transaction_type.to_s}s_from_kb_payment_id") do |kb_payment_id, kb_tenant_id|
18
+ transaction_from_kb_payment_id(transaction_type.to_s.upcase, kb_payment_id, kb_tenant_id, :multiple)
19
+ end
20
+ end
18
21
 
19
- def self.refunds_from_kb_payment_id(kb_payment_id, kb_tenant_id)
20
- transaction_from_kb_payment_id :refund, kb_payment_id, kb_tenant_id, :multiple
21
- end
22
+ # For convenience
23
+ alias_method :authorizations_from_kb_payment_id, :authorizes_from_kb_payment_id
22
24
 
23
- def self.find_candidate_transaction_for_refund(kb_payment_id, kb_tenant_id, amount_in_cents)
24
- begin
25
- do_find_candidate_transaction_for_refund :authorize, kb_payment_id, kb_tenant_id, amount_in_cents
26
- rescue
27
- do_find_candidate_transaction_for_refund :charge, kb_payment_id, kb_tenant_id, amount_in_cents
25
+ # void is special: unique void per payment_id
26
+ def void_from_kb_payment_id(kb_payment_id, kb_tenant_id)
27
+ transaction_from_kb_payment_id(:VOID, kb_payment_id, kb_tenant_id, :single)
28
28
  end
29
- end
30
29
 
31
- def self.do_find_candidate_transaction_for_refund(api_call, kb_payment_id, kb_tenant_id, amount_in_cents)
30
+ def from_kb_payment_transaction_id(kb_payment_transaction_id, kb_tenant_id)
31
+ transaction_from_kb_payment_transaction_id(nil, kb_payment_transaction_id, kb_tenant_id, :single)
32
+ end
32
33
 
33
- if kb_tenant_id.nil?
34
- transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_payment_id = ?', amount_in_cents, api_call, kb_payment_id)
35
- else
36
- transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id = ? AND kb_payment_id = ?', amount_in_cents, api_call, kb_tenant_id, kb_payment_id)
34
+ def find_candidate_transaction_for_refund(kb_payment_id, kb_tenant_id, amount_in_cents)
35
+ begin
36
+ do_find_candidate_transaction_for_refund(:authorize, kb_payment_id, kb_tenant_id, amount_in_cents)
37
+ rescue
38
+ do_find_candidate_transaction_for_refund(:purchase, kb_payment_id, kb_tenant_id, amount_in_cents)
39
+ end
37
40
  end
38
- # Find one successful charge which amount is at least the amount we are trying to refund
39
- transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id = ? AND kb_payment_id = ?', amount_in_cents, api_call, kb_tenant_id, kb_payment_id)
40
- raise "Unable to find transaction for payment #{kb_payment_id} and api_call #{api_call}" if transactions.size == 0
41
41
 
42
- # We have candidates, but we now need to make sure we didn't refund more than for the specified amount
43
- amount_refunded_in_cents = where('api_call = ? and kb_payment_id = ?', :refund, kb_payment_id)
44
- .sum('amount_in_cents')
42
+ private
45
43
 
46
- amount_left_to_refund_in_cents = -amount_refunded_in_cents
47
- transactions.map { |transaction| amount_left_to_refund_in_cents += transaction.amount_in_cents }
48
- raise "Amount #{amount_in_cents} too large to refund for payment #{kb_payment_id}" if amount_left_to_refund_in_cents < amount_in_cents
44
+ def do_find_candidate_transaction_for_refund(api_call, kb_payment_id, kb_tenant_id, amount_in_cents)
45
+ # Find one successful charge which amount is at least the amount we are trying to refund
46
+ if kb_tenant_id.nil?
47
+ transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id is NULL AND kb_payment_id = ?', amount_in_cents, api_call, kb_payment_id).order(:created_at)
48
+ else
49
+ transactions = where('amount_in_cents >= ? AND api_call = ? AND kb_tenant_id = ? AND kb_payment_id = ?', amount_in_cents, api_call, kb_tenant_id, kb_payment_id).order(:created_at)
50
+ end
51
+ raise "Unable to find transaction for payment #{kb_payment_id} and api_call #{api_call}" if transactions.size == 0
49
52
 
50
- transactions.first
51
- end
53
+ # We have candidates, but we now need to make sure we didn't refund more than for the specified amount
54
+ amount_refunded_in_cents = where('api_call = ? and kb_payment_id = ?', :refund, kb_payment_id)
55
+ .sum('amount_in_cents')
52
56
 
53
- private
57
+ amount_left_to_refund_in_cents = -amount_refunded_in_cents
58
+ transactions.map { |transaction| amount_left_to_refund_in_cents += transaction.amount_in_cents }
59
+ raise "Amount #{amount_in_cents} too large to refund for payment #{kb_payment_id}" if amount_left_to_refund_in_cents < amount_in_cents
54
60
 
55
- def self.transaction_from_kb_payment_id(api_call, kb_payment_id, kb_tenant_id, how_many)
56
- if kb_tenant_id.nil?
57
- transactions = where('api_call = ? AND kb_payment_id = ?', api_call, kb_payment_id)
58
- else
59
- transactions = where('api_call = ? AND kb_tenant_id = ? AND kb_payment_id = ?', api_call, kb_tenant_id, kb_payment_id)
61
+ transactions.first
60
62
  end
61
- raise "Unable to find transaction id for payment #{kb_payment_id}" if transactions.empty?
62
- if how_many == :single
63
- raise "Kill Bill payment #{kb_payment_id} mapping to multiple plugin transactions" if transactions.size > 1
64
- transactions[0]
65
- else
66
- transactions
63
+
64
+ [:kb_payment_id, :kb_payment_transaction_id].each do |attribute|
65
+ define_method("transaction_from_#{attribute.to_s}") do |transaction_type, attribute_value, kb_tenant_id, how_many|
66
+ if kb_tenant_id.nil?
67
+ if transaction_type.nil?
68
+ transactions = where("kb_tenant_id is NULL AND #{attribute.to_s} = ?", attribute_value).order(:created_at)
69
+ else
70
+ transactions = where("transaction_type = ? AND kb_tenant_id is NULL AND #{attribute.to_s} = ?", transaction_type, attribute_value).order(:created_at)
71
+ end
72
+ else
73
+ if transaction_type.nil?
74
+ transactions = where("kb_tenant_id = ? AND #{attribute.to_s} = ?", kb_tenant_id, attribute_value).order(:created_at)
75
+ else
76
+ transactions = where("transaction_type = ? AND kb_tenant_id = ? AND #{attribute.to_s} = ?", transaction_type, kb_tenant_id, attribute_value).order(:created_at)
77
+ end
78
+ end
79
+ if how_many == :single
80
+ raise "Kill Bill #{attribute} = #{attribute_value} mapping to multiple plugin transactions" if transactions.size > 1
81
+ transactions[0]
82
+ else
83
+ transactions
84
+ end
85
+ end
67
86
  end
68
87
  end
69
88
  end