pp-adaptive 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/.gitignore +6 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -0
  4. data/README.md +54 -0
  5. data/Rakefile +8 -0
  6. data/lib/pp-adaptive/abstract_request.rb +44 -0
  7. data/lib/pp-adaptive/abstract_response.rb +46 -0
  8. data/lib/pp-adaptive/cancel_preapproval_request.rb +7 -0
  9. data/lib/pp-adaptive/cancel_preapproval_response.rb +7 -0
  10. data/lib/pp-adaptive/client.rb +56 -0
  11. data/lib/pp-adaptive/convert_currency_request.rb +33 -0
  12. data/lib/pp-adaptive/convert_currency_response.rb +11 -0
  13. data/lib/pp-adaptive/execute_payment_request.rb +9 -0
  14. data/lib/pp-adaptive/execute_payment_response.rb +12 -0
  15. data/lib/pp-adaptive/get_payment_options_request.rb +7 -0
  16. data/lib/pp-adaptive/get_payment_options_response.rb +32 -0
  17. data/lib/pp-adaptive/pay_request.rb +64 -0
  18. data/lib/pp-adaptive/pay_response.rb +29 -0
  19. data/lib/pp-adaptive/payment_details_request.rb +9 -0
  20. data/lib/pp-adaptive/payment_details_response.rb +53 -0
  21. data/lib/pp-adaptive/preapproval_details_request.rb +8 -0
  22. data/lib/pp-adaptive/preapproval_details_response.rb +35 -0
  23. data/lib/pp-adaptive/preapproval_request.rb +36 -0
  24. data/lib/pp-adaptive/preapproval_response.rb +7 -0
  25. data/lib/pp-adaptive/refund_request.rb +14 -0
  26. data/lib/pp-adaptive/refund_response.rb +12 -0
  27. data/lib/pp-adaptive/set_payment_options_request.rb +33 -0
  28. data/lib/pp-adaptive/set_payment_options_response.rb +7 -0
  29. data/lib/pp-adaptive/support/aliases.rb +33 -0
  30. data/lib/pp-adaptive/support/coerced_array.rb +52 -0
  31. data/lib/pp-adaptive/support/json_model.rb +140 -0
  32. data/lib/pp-adaptive/support/node.rb +45 -0
  33. data/lib/pp-adaptive/support/node_list.rb +45 -0
  34. data/lib/pp-adaptive/types/account_identifier.rb +6 -0
  35. data/lib/pp-adaptive/types/address.rb +17 -0
  36. data/lib/pp-adaptive/types/address_list.rb +5 -0
  37. data/lib/pp-adaptive/types/aliases/receiver_aliases.rb +15 -0
  38. data/lib/pp-adaptive/types/aliases/receiver_list_aliases.rb +32 -0
  39. data/lib/pp-adaptive/types/base_address.rb +11 -0
  40. data/lib/pp-adaptive/types/client_details_type.rb +12 -0
  41. data/lib/pp-adaptive/types/currency_code.rb +5 -0
  42. data/lib/pp-adaptive/types/currency_conversion.rb +17 -0
  43. data/lib/pp-adaptive/types/currency_conversion_list.rb +15 -0
  44. data/lib/pp-adaptive/types/currency_conversion_table.rb +5 -0
  45. data/lib/pp-adaptive/types/currency_list.rb +5 -0
  46. data/lib/pp-adaptive/types/currency_type.rb +6 -0
  47. data/lib/pp-adaptive/types/display_options.rb +8 -0
  48. data/lib/pp-adaptive/types/error_data.rb +11 -0
  49. data/lib/pp-adaptive/types/error_list.rb +5 -0
  50. data/lib/pp-adaptive/types/fault_message.rb +23 -0
  51. data/lib/pp-adaptive/types/funding_constraint.rb +5 -0
  52. data/lib/pp-adaptive/types/funding_plan.rb +28 -0
  53. data/lib/pp-adaptive/types/funding_plan_charge.rb +11 -0
  54. data/lib/pp-adaptive/types/funding_source.rb +9 -0
  55. data/lib/pp-adaptive/types/funding_type_info.rb +5 -0
  56. data/lib/pp-adaptive/types/funding_type_list.rb +5 -0
  57. data/lib/pp-adaptive/types/initiating_entity.rb +15 -0
  58. data/lib/pp-adaptive/types/institution_customer.rb +11 -0
  59. data/lib/pp-adaptive/types/invoice_data.rb +7 -0
  60. data/lib/pp-adaptive/types/invoice_item.rb +9 -0
  61. data/lib/pp-adaptive/types/pay_error.rb +18 -0
  62. data/lib/pp-adaptive/types/pay_error_list.rb +5 -0
  63. data/lib/pp-adaptive/types/payment_info.rb +16 -0
  64. data/lib/pp-adaptive/types/payment_info_list.rb +5 -0
  65. data/lib/pp-adaptive/types/phone_number_type.rb +7 -0
  66. data/lib/pp-adaptive/types/receiver.rb +17 -0
  67. data/lib/pp-adaptive/types/receiver_identifier.rb +12 -0
  68. data/lib/pp-adaptive/types/receiver_list.rb +5 -0
  69. data/lib/pp-adaptive/types/receiver_options.rb +21 -0
  70. data/lib/pp-adaptive/types/refund_info.rb +20 -0
  71. data/lib/pp-adaptive/types/refund_info_list.rb +5 -0
  72. data/lib/pp-adaptive/types/request_envelope.rb +6 -0
  73. data/lib/pp-adaptive/types/response_envelope.rb +13 -0
  74. data/lib/pp-adaptive/types/sender_identifier.rb +5 -0
  75. data/lib/pp-adaptive/types/sender_options.rb +5 -0
  76. data/lib/pp-adaptive/version.rb +3 -0
  77. data/lib/pp-adaptive.rb +75 -0
  78. data/pp-adaptive.gemspec +25 -0
  79. data/spec/public/cancel_preapproval_request_spec.rb +15 -0
  80. data/spec/public/cancel_preapproval_response_spec.rb +6 -0
  81. data/spec/public/client_spec.rb +85 -0
  82. data/spec/public/convert_currency_request_spec.rb +29 -0
  83. data/spec/public/convert_currency_response_spec.rb +62 -0
  84. data/spec/public/execute_payment_request_spec.rb +30 -0
  85. data/spec/public/execute_payment_response_spec.rb +66 -0
  86. data/spec/public/get_payment_options_request_spec.rb +15 -0
  87. data/spec/public/get_payment_options_response_spec.rb +141 -0
  88. data/spec/public/json_model_spec.rb +56 -0
  89. data/spec/public/node_list_spec.rb +58 -0
  90. data/spec/public/node_spec.rb +54 -0
  91. data/spec/public/pay_request_spec.rb +150 -0
  92. data/spec/public/pay_response_spec.rb +197 -0
  93. data/spec/public/payment_details_request_spec.rb +30 -0
  94. data/spec/public/payment_details_response_spec.rb +211 -0
  95. data/spec/public/preapproval_details_request_spec.rb +25 -0
  96. data/spec/public/preapproval_details_response_spec.rb +200 -0
  97. data/spec/public/preapproval_request_spec.rb +110 -0
  98. data/spec/public/preapproval_response_spec.rb +14 -0
  99. data/spec/public/refund_request_spec.rb +57 -0
  100. data/spec/public/refund_response_spec.rb +116 -0
  101. data/spec/public/set_payment_options_request_spec.rb +136 -0
  102. data/spec/public/set_payment_options_response_spec.rb +6 -0
  103. data/spec/shared/a_fault_message.rb +60 -0
  104. data/spec/shared/a_request_envelope.rb +14 -0
  105. data/spec/shared/a_response_envelope.rb +36 -0
  106. data/spec/spec_helper.rb +6 -0
  107. metadata +225 -0
@@ -0,0 +1,33 @@
1
+ module AdaptivePayments
2
+ class SetPaymentOptionsRequest < AbstractRequest
3
+ operation :SetPaymentOptions
4
+
5
+ attribute :pay_key, String, :param => "payKey"
6
+ attribute :initiating_entity, Node[InitiatingEntity], :param => "initiatingEntity"
7
+ attribute :display_options, Node[DisplayOptions], :param => "displayOptions"
8
+ attribute :shipping_address_id, String, :param => "shippingAddressId"
9
+ attribute :sender_options, Node[SenderOptions], :param => "senderOptions"
10
+ attribute :receiver_options, NodeList[ReceiverOptions], :param => "receiverOptions"
11
+
12
+ alias_params :initiating_entity, {
13
+ :institution_id => :institution_id,
14
+ :customer_first_name => :customer_first_name,
15
+ :customer_last_name => :customer_last_name,
16
+ :customer_display_name => :customer_display_name,
17
+ :institution_customer_id => :institution_customer_id,
18
+ :customer_country_code => :customer_country_code,
19
+ :customer_email => :customer_email
20
+ }
21
+
22
+ alias_params :display_options, {
23
+ :email_header_image_url => :email_header_image_url,
24
+ :email_marketing_image_url => :email_marketing_image_url,
25
+ :header_image_url => :header_image_url,
26
+ :business_name => :business_name
27
+ }
28
+
29
+ alias_params :sender_options, {
30
+ :require_shipping_address_selection => :require_shipping_address_selection
31
+ }
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ module AdaptivePayments
2
+ class SetPaymentOptionsResponse < AbstractResponse
3
+ operation :SetPaymentOptions
4
+
5
+ # no fields to define
6
+ end
7
+ end
@@ -0,0 +1,33 @@
1
+ require "forwardable"
2
+ require "virtus"
3
+
4
+ module AdaptivePayments
5
+ # Provides an interface to create shortcuts to child nodes without traversing an object graph
6
+ module Aliases
7
+ include Forwardable
8
+
9
+ # Invoke alias_name as if original_name were invoked on attr
10
+ #
11
+ # @param [Symbol] attr
12
+ # the name of the attribute containing the child node
13
+ # @param [Symbol] alias_name
14
+ # the name of the alias method to define
15
+ # @param [Symbol] original_name
16
+ # the name of the original method in attr
17
+ def alias_param(attr, alias_name, original_name)
18
+ def_delegator attr, original_name, alias_name
19
+ def_delegator attr, :"#{original_name}=", :"#{alias_name}="
20
+ def_delegator attr, :"#{original_name}?", :"#{alias_name}?" # FIXME: Only alias this for Booleans
21
+ end
22
+
23
+ # Shortcut for definining multiple aliases in a single call
24
+ #
25
+ # @param [Symbol] attr
26
+ # the name of the attribute containing the child node
27
+ # @param [Hash] aliases
28
+ # a Hash mapping { :alias_name => :original_name }
29
+ def alias_params(attr, aliases)
30
+ aliases.each { |k, v| alias_param(attr, k, v) }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ module AdaptivePayments
2
+ # Array that coerces all input values to a JsonModel of the given type
3
+ class CoercedArray < Array
4
+ # Initialize the CoercedArray for the given type
5
+ #
6
+ # @param [Class<JsonModel>] type
7
+ # the JsonModel descendant to coerce to
8
+ def initialize(type)
9
+ raise ArgumentError, "The type in a CoercedArray must be a JsonModel" unless type <= JsonModel
10
+
11
+ super()
12
+ @type = type
13
+ end
14
+
15
+ # Append the given value to the Array
16
+ # The value may be a Hash to coerce, or a valid JsonModel
17
+ #
18
+ # @param [Hash, JsonModel] object
19
+ # the object to append
20
+ #
21
+ # @return CoercedArray
22
+ def push(object)
23
+ object = @type.new(object) unless object.kind_of?(@type)
24
+ super
25
+ end
26
+
27
+ alias_method :<<, :push
28
+
29
+ # Concatenate another Array with this one and return the result as a new Array
30
+ # All items in other will be coerced to the correct type
31
+ #
32
+ # @param [Array] other
33
+ # another Array to concatenate with
34
+ #
35
+ # @return CoercedArray
36
+ def +(other)
37
+ raise ArgumentError, "Cannot union #{other.class} with #{self.class}<#{@type}>" unless other.kind_of?(Array)
38
+ super(CoercedArray.new(@type).concat(other))
39
+ end
40
+
41
+ # Concatenate another Array with this one and modify the Array in place
42
+ #
43
+ # @param [Array] other
44
+ # another Array to concatenate with
45
+ #
46
+ # @return CoercedArray
47
+ def concat(other)
48
+ raise ArgumentError, "Cannot append #{other.class} to #{self.class}<#{@type}>" unless other.kind_of?(Array)
49
+ super(other.inject(CoercedArray.new(@type)) { |ary, v| ary.push(v) })
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,140 @@
1
+ require "virtus"
2
+ require "json"
3
+
4
+ module AdaptivePayments
5
+ # A client-side, nestable, model based on Virtus, mapping JSON parameters to method names and vice-versa
6
+ #
7
+ # All types defined in the Adaptive Payments API documentation (both request and response) are built from this class.
8
+ #
9
+ # class CurrencyConversion < JsonModel
10
+ # attribute :from, Node[CurrencyType]
11
+ # attribute :to, Node[CurrencyType]
12
+ # attribute :exchange_rate, Decimal, :param => "exchangeRate"
13
+ #
14
+ # alias_params :from, {
15
+ # :from_amount => :amount,
16
+ # :from_currency_code => :code
17
+ # }
18
+ #
19
+ # alias_params :to, {
20
+ # :to_amount => :amount,
21
+ # :to_currency_code => :code
22
+ # }
23
+ # end
24
+ #
25
+ # Virtus will allow varying input types and will cast them accordingly, so assigning '0.8767' to #exchange_rate in the
26
+ # above example will actually store BigDecimal('0.8767') in the model.
27
+ #
28
+ # The optional :param option defines the name of the property in the JSON representation, if it is different from the
29
+ # name of the attribute itself.
30
+ #
31
+ # In the above example, #alias_params has been used to create shortcuts to the #amount and #code attributes of the
32
+ # two [CurrencyType] attributes, #from and #to. So:
33
+ #
34
+ # conversion.from_amount == conversion.from.amount
35
+ # conversion.from_currency_code == conversion.from.code
36
+ #
37
+ # It's possible to repeatedly create aliases like this, by chaining them together through multiple levels of the object
38
+ # graph. The Adaptive Payments API is rather deeply nested and verbose by default, so to be a little easier to use and
39
+ # feel more ruby-esque, pp-adaptive define aliases where it seems logical to do so. The fully qualified paths will always
40
+ # work, however.
41
+ class JsonModel
42
+ include Virtus
43
+ extend Aliases
44
+
45
+ # Methods used for building a JsonModel given a JSON string.
46
+ module Parsing
47
+ # Process JSON input and return a JsonModel for the data.
48
+ #
49
+ # This method must be invoked on a subclass of the correct type. Invoking it on JsonModel itself will do nothing.
50
+ # All parameters in the JSON are recursively mapped to their attribute names, based on :param on the attribute.
51
+ # Unknown parameters are ignored.
52
+ #
53
+ # @param [String] json
54
+ # the raw JSON string as returned by the API
55
+ #
56
+ # @return [JsonModel]
57
+ # a JsonModel mapped against the provided JSON
58
+ def from_json(json)
59
+ new(to_attributes(JSON.parse(json)))
60
+ end
61
+
62
+ # Given a ruby Hash representation of raw JSON from the API (or a subset thereof), map all JSON parameter keys to attribute names
63
+ #
64
+ # @param [Hash] json
65
+ # a ruby Hash representing a subset of the overall JSON structure
66
+ #
67
+ # @return [Hash]
68
+ # a new Hash with all keys mapped to their attribute names
69
+ def to_attributes(json)
70
+ json = {} unless json.kind_of?(Hash)
71
+ json.inject({}) { |hash, (key, value)| (attr_value = attribute_value(key, value)) ? hash.merge(attribute_key(key) => attr_value) : hash }
72
+ end
73
+
74
+ private
75
+
76
+ def attribute_key(key)
77
+ Hash[attributes.map { |attr| [attr.options.fetch(:param, attr.name).to_s, attr.name.to_sym] }][key] || key.to_sym
78
+ end
79
+
80
+ def attribute_value(key, value)
81
+ return unless attribute = attributes[attribute_key(key)]
82
+
83
+ case attribute
84
+ when Node
85
+ attribute.type.to_attributes(value)
86
+ when NodeList
87
+ value.map { |v| attribute.type.to_attributes(v) } if value.kind_of?(Array)
88
+ else
89
+ value
90
+ end
91
+ end
92
+ end
93
+
94
+ # Methods for converting a JsonModel into a JSON string for transport to the API
95
+ module Writing
96
+ # Recursively read all attributes in a ruby Hash, mapping attribute names to JSON parameters, according to the :param option
97
+ #
98
+ # @return [Hash]
99
+ # the JSON representation in ruby Hash form
100
+ def to_hash
101
+ attributes.inject({}) { |hash, (key, value)| value.nil? ? hash : hash.merge(json_key(key) => json_value(value)) } \
102
+ .reject { |key, value| value.kind_of?(Enumerable) && value.none? }
103
+ end
104
+
105
+ # Convert this JsonModel into a JSON string for transport to the PayPal API
106
+ #
107
+ # @return [String]
108
+ # the JSON string, containing all children, if any
109
+ def to_json(*)
110
+ to_hash.to_json
111
+ end
112
+
113
+ private
114
+
115
+ def json_key(key)
116
+ if self.class.attributes[key]
117
+ self.class.attributes[key].options.fetch(:param, key).to_s
118
+ else
119
+ key.to_s
120
+ end
121
+ end
122
+
123
+ def json_value(value)
124
+ case value
125
+ when JsonModel
126
+ value.to_hash
127
+ when CoercedArray
128
+ value.collect { |v| v.to_hash }
129
+ when BigDecimal, Float
130
+ "%.2f" % value
131
+ else
132
+ value
133
+ end
134
+ end
135
+ end
136
+
137
+ include Writing
138
+ extend Parsing
139
+ end
140
+ end
@@ -0,0 +1,45 @@
1
+ require "virtus"
2
+
3
+ module AdaptivePayments
4
+ # A Virtus Attribute used to box a type from the API to an Attribute in a JsonModel
5
+ #
6
+ # The Node type should not be used directly. Instead it should be given a type to box.
7
+ #
8
+ # attribute :child, Node[Child], :param => "childItem"
9
+ #
10
+ # In the above, the model gets an Attribute named #child, mapping to a JSON parameter named 'childItem'.
11
+ # The object at `model.child` is present by default, and is an object of type Child.
12
+ #
13
+ # Assigning a Hash directly to the attribute will store an object of the boxed type, based on the elements
14
+ # in the Hash.
15
+ class Node < Virtus::Attribute::Object
16
+ # Provide access to the boxed type
17
+ attr_reader :type
18
+
19
+ class << self
20
+ # Returns a descendant of Node, boxing the given type
21
+ #
22
+ # @param [Class<JsonModel>] type
23
+ # the class definition to box
24
+ #
25
+ # @return [Node<type>]
26
+ # an anonymous descendant of Node boxing the given type
27
+ def [](type)
28
+ raise ArgumentError, "Child nodes may only be other JsonModel classes" unless type <= JsonModel
29
+
30
+ @generated_class_map ||= {}
31
+ @generated_class_map[type] ||= Class.new(self) do
32
+ default lambda { |m, a| type.new }
33
+
34
+ define_method :type do
35
+ type
36
+ end
37
+
38
+ define_method :coerce do |value|
39
+ value.kind_of?(Hash) ? type.new(value) : value
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ require "virtus"
2
+
3
+ module AdaptivePayments
4
+ # A Virtus Attribute used to hold a collection of objects boxed to a given type.
5
+ #
6
+ # The NodeList Attribute should not be used directly. Instead, it should be given a type to box.
7
+ #
8
+ # attribute :children, NodeList[Child], :param => "child"
9
+ #
10
+ # In the above, the model gets an Array accessible through model.children. All objects contained
11
+ # in the Array will be coerced to the boxed type. If an Array is assigned directly to the attribute,
12
+ # all items inside it will be coerced to the boxed type. If a Hash is pushed onto the existing
13
+ # Array, it will be coerced to the boxed type.
14
+ class NodeList < Virtus::Attribute::Object
15
+ primitive ::Array
16
+
17
+ # Allow access to the boxed type
18
+ attr_reader :type
19
+
20
+ class << self
21
+ # Return a descendant of NodeList boxing the given type.
22
+ #
23
+ # @param [Class<JsonModel>] type
24
+ # the type to box
25
+ #
26
+ # @return [NodeList]
27
+ # an anonymous descendant of NodeList boxing the given type
28
+ def [](type)
29
+ raise ArgumentError, "Lists may only be created from JsonModel classes" unless type <= JsonModel
30
+
31
+ Class.new(self) do
32
+ default lambda { |m, a| CoercedArray.new(type) }
33
+
34
+ define_method :type do
35
+ type
36
+ end
37
+
38
+ define_method :coerce do |value|
39
+ CoercedArray.new(type) + Array(value)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,6 @@
1
+ module AdaptivePayments
2
+ class AccountIdentifier < JsonModel
3
+ attribute :email, String
4
+ attribute :phone, Node[PhoneNumberType]
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module AdaptivePayments
2
+ class Address < JsonModel
3
+ attribute :id, String, :param => "addressId"
4
+ attribute :addressee_name, String, :param => "addresseeName"
5
+ attribute :base_address, Node[BaseAddress], :param => "baseAddress"
6
+
7
+ alias_params :base_address, {
8
+ :line1 => :line1,
9
+ :line2 => :line2,
10
+ :city => :city,
11
+ :state => :state,
12
+ :postal_code => :postal_code,
13
+ :country_code => :country_code,
14
+ :type => :type
15
+ }
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class AddressList < JsonModel
3
+ attribute :addresses, NodeList[Address], :param => "address"
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module AdaptivePayments
2
+ module ReceiverAliases
3
+ def self.included(base)
4
+ base.instance_eval do
5
+ alias_params :receiver, {
6
+ :receiver_email => :email,
7
+ :receiver_amount => :amount,
8
+ :payment_type => :payment_type,
9
+ :payment_subtype => :payment_subtype,
10
+ :invoice_id => :invoice_id
11
+ }
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ module AdaptivePayments
2
+ module ReceiverListAliases
3
+ def self.included(base)
4
+ base.instance_eval do
5
+ alias_params :receiver_list, {
6
+ :receivers => :receivers
7
+ }
8
+
9
+ alias_params :first_receiver, {
10
+ :receiver_email => :email,
11
+ :receiver_amount => :amount,
12
+ :payment_type => :payment_type,
13
+ :payment_subtype => :payment_subtype,
14
+ :invoice_id => :invoice_id,
15
+ :receiver_phone => :phone
16
+ }
17
+
18
+ alias_params :receiver_phone, {
19
+ :receiver_phone_number => :phone_number,
20
+ :receiver_phone_country_code => :country_code,
21
+ :receiver_phone_extension => :extension
22
+ }
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def first_receiver
29
+ receivers[0] ||= Receiver.new
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,11 @@
1
+ module AdaptivePayments
2
+ class BaseAddress < JsonModel
3
+ attribute :line1, String
4
+ attribute :line2, String
5
+ attribute :city, String
6
+ attribute :state, String
7
+ attribute :postal_code, String, :param => "postalCode"
8
+ attribute :country_code, String, :param => "countryCode"
9
+ attribute :type, String
10
+ end
11
+ end
@@ -0,0 +1,12 @@
1
+ module AdaptivePayments
2
+ class ClientDetailsType < JsonModel
3
+ attribute :ip_address, String, :param => "ipAddress"
4
+ attribute :device_id, String, :param => "deviceId"
5
+ attribute :application_id, String, :param => "applicationId"
6
+ attribute :model, String
7
+ attribute :geo_location, String, :param => "geoLocation"
8
+ attribute :customer_type, String, :param => "customerType"
9
+ attribute :partner_name, String, :param => "partnerName"
10
+ attribute :customer_id, String, :param => "customerId"
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class CurrencyCode < JsonModel
3
+ attribute :code, String, :param => "currencyCode"
4
+ end
5
+ end
@@ -0,0 +1,17 @@
1
+ module AdaptivePayments
2
+ class CurrencyConversion < JsonModel
3
+ attribute :from, Node[CurrencyType]
4
+ attribute :to, Node[CurrencyType]
5
+ attribute :exchange_rate, Decimal, :param => "exchangeRate"
6
+
7
+ alias_params :from, {
8
+ :from_currency_amount => :amount,
9
+ :from_currency_code => :code
10
+ }
11
+
12
+ alias_params :to, {
13
+ :to_currency_amount => :amount,
14
+ :to_currency_code => :code
15
+ }
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ module AdaptivePayments
2
+ class CurrencyConversionList < JsonModel
3
+ attribute :base_amount, Node[CurrencyType], :param => 'baseAmount'
4
+ attribute :currency_list, Node[CurrencyList], :param => 'currencyList'
5
+
6
+ alias_params :base_amount, {
7
+ :base_currency_code => :code,
8
+ :base_currency_amount => :amount
9
+ }
10
+
11
+ alias_params :currency_list, {
12
+ :currencies => :currencies
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class CurrencyConversionTable < JsonModel
3
+ attribute :currency_conversion_list, NodeList[CurrencyConversionList], :param => 'currencyConversionList'
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class CurrencyList < JsonModel
3
+ attribute :currencies, NodeList[CurrencyType], :param => "currency"
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module AdaptivePayments
2
+ class CurrencyType < JsonModel
3
+ attribute :amount, Decimal
4
+ attribute :code, String
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ module AdaptivePayments
2
+ class DisplayOptions < JsonModel
3
+ attribute :email_header_image_url, String, :param => "emailHeaderImageUrl"
4
+ attribute :email_marketing_image_url, String, :param => "emailMarketingImageUrl"
5
+ attribute :header_image_url, String, :param => "headerImageUrl"
6
+ attribute :business_name, String, :param => "businessName"
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module AdaptivePayments
2
+ class ErrorData < JsonModel
3
+ attribute :id, Integer, :param => "errorId"
4
+ attribute :domain, String, :param => "domain"
5
+ attribute :subdomain, String, :param => "subdomain"
6
+ attribute :severity, String, :param => "severity"
7
+ attribute :category, String, :param => "category"
8
+ attribute :message, String, :param => "message"
9
+ attribute :parameters, Array, :param => "parameter", :default => lambda { |m, a| [] }
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class ErrorList < JsonModel
3
+ attribute :errors, NodeList[ErrorData], :param => "error"
4
+ end
5
+ end
@@ -0,0 +1,23 @@
1
+ module AdaptivePayments
2
+ module FaultMessage
3
+ def self.included(base)
4
+ base.instance_eval do
5
+ attribute :errors, NodeList[ErrorData], :param => "error"
6
+
7
+ alias_params :first_error, {
8
+ :error_id => :id,
9
+ :error_domain => :domain,
10
+ :error_subdomain => :subdomain,
11
+ :error_severity => :severity,
12
+ :error_category => :category,
13
+ :error_message => :message,
14
+ :error_parameters => :parameters
15
+ }
16
+ end
17
+ end
18
+
19
+ def first_error
20
+ errors.first || ErrorData.new
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class FundingConstraint < JsonModel
3
+ attribute :allowed_funding_type, Node[FundingTypeList], :param => "allowedFundingType"
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ module AdaptivePayments
2
+ class FundingPlan < JsonModel
3
+ attribute :id, String, :param => "fundingPlanId"
4
+ attribute :funding_amount, Node[CurrencyType], :param => "fundingAmount"
5
+ attribute :backup_funding_source, Node[FundingSource], :param => "backupFundingSource"
6
+ attribute :sender_fees, Node[CurrencyType], :param => "senderFees"
7
+ attribute :currency_conversion, Node[CurrencyConversion], :param => "currencyConversion"
8
+ attribute :charges, NodeList[FundingPlanCharge], :param => "charge"
9
+
10
+ alias_params :funding_amount, {
11
+ :amount => :amount,
12
+ :currency_code => :code
13
+ }
14
+
15
+ alias_params :sender_fees, {
16
+ :sender_fees_amount => :amount,
17
+ :sender_fees_currency_code => :code
18
+ }
19
+
20
+ alias_params :currency_conversion, {
21
+ :from_currency_amount => :from_currency_amount,
22
+ :from_currency_code => :from_currency_code,
23
+ :to_currency_amount => :to_currency_amount,
24
+ :to_currency_code => :to_currency_code,
25
+ :exchange_rate => :exchange_rate
26
+ }
27
+ end
28
+ end
@@ -0,0 +1,11 @@
1
+ module AdaptivePayments
2
+ class FundingPlanCharge < JsonModel
3
+ attribute :charge, Node[CurrencyType]
4
+ attribute :funding_source, Node[FundingSource], :param => "fundingSource"
5
+
6
+ alias_params :charge, {
7
+ :amount => :amount,
8
+ :currency_code => :code
9
+ }
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module AdaptivePayments
2
+ class FundingSource < JsonModel
3
+ attribute :id, String, :param => "fundingSourceId"
4
+ attribute :last_four_digits_of_account, String, :param => "lastFourOfAccountNumber"
5
+ attribute :type, String
6
+ attribute :display_name, String, :param => "displayName"
7
+ attribute :allowed, Boolean
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class FundingTypeInfo < JsonModel
3
+ attribute :funding_type, String, :param => "fundingType"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module AdaptivePayments
2
+ class FundingTypeList < JsonModel
3
+ attribute :funding_type_info, NodeList[FundingTypeInfo], :param => "fundingTypeInfo"
4
+ end
5
+ end