activemerchant-payline 0.1.9

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 (74) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +5 -0
  3. data/.gitignore +18 -0
  4. data/.travis.yml +9 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +57 -0
  8. data/Rakefile +1 -0
  9. data/activemerchant-payline.gemspec +33 -0
  10. data/lib/active_merchant/billing/gateways/payline.rb +57 -0
  11. data/lib/active_merchant/billing/gateways/payline/payline_common.rb +368 -0
  12. data/lib/active_merchant/billing/gateways/payline/payline_constants.rb +83 -0
  13. data/lib/active_merchant/billing/gateways/payline/payline_direct_api.rb +78 -0
  14. data/lib/active_merchant/billing/gateways/payline/payline_management_payment_api.rb +154 -0
  15. data/lib/active_merchant/billing/gateways/payline/payline_status_api.rb +36 -0
  16. data/lib/active_merchant/billing/gateways/payline/payline_wallet_management.rb +249 -0
  17. data/lib/active_merchant/billing/gateways/payline/payline_web_api.rb +186 -0
  18. data/lib/active_merchant/billing/iso_4217_currency_codes.rb +32 -0
  19. data/lib/activemerchant-payline.rb +2 -0
  20. data/test/fixtures.yml +8 -0
  21. data/test/fixtures/vcr_cassettes/test_failed_create_wallet.yml +1820 -0
  22. data/test/fixtures/vcr_cassettes/test_failed_disable_payment_record.yml +1821 -0
  23. data/test/fixtures/vcr_cassettes/test_failed_disable_wallet.yml +1820 -0
  24. data/test/fixtures/vcr_cassettes/test_failed_do_authorization.yml +1956 -0
  25. data/test/fixtures/vcr_cassettes/test_failed_do_capture.yml +1890 -0
  26. data/test/fixtures/vcr_cassettes/test_failed_do_credit.yml +1882 -0
  27. data/test/fixtures/vcr_cassettes/test_failed_do_debit.yml +1981 -0
  28. data/test/fixtures/vcr_cassettes/test_failed_do_recurrent_wallet_payment.yml +2033 -0
  29. data/test/fixtures/vcr_cassettes/test_failed_do_refund.yml +1944 -0
  30. data/test/fixtures/vcr_cassettes/test_failed_do_reset.yml +1820 -0
  31. data/test/fixtures/vcr_cassettes/test_failed_do_scheduled_wallet_payment.yml +1927 -0
  32. data/test/fixtures/vcr_cassettes/test_failed_do_web_payment.yml +1822 -0
  33. data/test/fixtures/vcr_cassettes/test_failed_enable_wallet.yml +1819 -0
  34. data/test/fixtures/vcr_cassettes/test_failed_get_payment_record.yml +1821 -0
  35. data/test/fixtures/vcr_cassettes/test_failed_get_wallet.yml +1819 -0
  36. data/test/fixtures/vcr_cassettes/test_failed_get_web_payment_details.yml +1851 -0
  37. data/test/fixtures/vcr_cassettes/test_failed_immediate_wallet_payment.yml +1938 -0
  38. data/test/fixtures/vcr_cassettes/test_failed_manage_web_wallet.yml +1870 -0
  39. data/test/fixtures/vcr_cassettes/test_failed_update_wallet.yml +1820 -0
  40. data/test/fixtures/vcr_cassettes/test_failed_update_web_wallet.yml +1819 -0
  41. data/test/fixtures/vcr_cassettes/test_get_transaction_details.yml +3711 -0
  42. data/test/fixtures/vcr_cassettes/test_get_web_wallet.yml +1871 -0
  43. data/test/fixtures/vcr_cassettes/test_missing_parameters_create_web_wallet.yml +1870 -0
  44. data/test/fixtures/vcr_cassettes/test_missing_parameters_do_web_payment.yml +1822 -0
  45. data/test/fixtures/vcr_cassettes/test_successful_create_wallet.yml +1826 -0
  46. data/test/fixtures/vcr_cassettes/test_successful_create_web_wallet.yml +1822 -0
  47. data/test/fixtures/vcr_cassettes/test_successful_disable_payment_record.yml +1876 -0
  48. data/test/fixtures/vcr_cassettes/test_successful_disable_wallet.yml +1871 -0
  49. data/test/fixtures/vcr_cassettes/test_successful_do_authorization.yml +1837 -0
  50. data/test/fixtures/vcr_cassettes/test_successful_do_bank_transfer.yml +1826 -0
  51. data/test/fixtures/vcr_cassettes/test_successful_do_capture.yml +1889 -0
  52. data/test/fixtures/vcr_cassettes/test_successful_do_credit.yml +1829 -0
  53. data/test/fixtures/vcr_cassettes/test_successful_do_debit.yml +1834 -0
  54. data/test/fixtures/vcr_cassettes/test_successful_do_immediate_wallet_payment.yml +1875 -0
  55. data/test/fixtures/vcr_cassettes/test_successful_do_recurrent_wallet_payment.yml +1827 -0
  56. data/test/fixtures/vcr_cassettes/test_successful_do_refund.yml +1888 -0
  57. data/test/fixtures/vcr_cassettes/test_successful_do_reset.yml +1892 -0
  58. data/test/fixtures/vcr_cassettes/test_successful_do_scheduled_wallet_payment.yml +1821 -0
  59. data/test/fixtures/vcr_cassettes/test_successful_do_web_payment.yml +1821 -0
  60. data/test/fixtures/vcr_cassettes/test_successful_enable_wallet.yml +1924 -0
  61. data/test/fixtures/vcr_cassettes/test_successful_get_payment_record.yml +1891 -0
  62. data/test/fixtures/vcr_cassettes/test_successful_get_wallet.yml +1894 -0
  63. data/test/fixtures/vcr_cassettes/test_successful_get_web_payment_details.yml +1908 -0
  64. data/test/fixtures/vcr_cassettes/test_successful_manage_web_wallet.yml +1821 -0
  65. data/test/fixtures/vcr_cassettes/test_successful_update_wallet.yml +1825 -0
  66. data/test/fixtures/vcr_cassettes/test_successful_update_web_wallet.yml +1820 -0
  67. data/test/run_test.rb +9 -0
  68. data/test/test_helper.rb +350 -0
  69. data/test/unit/gateways/payline/payline_direct_api_test.rb +122 -0
  70. data/test/unit/gateways/payline/payline_management_payment_api_test.rb +197 -0
  71. data/test/unit/gateways/payline/payline_status_api_test.rb +30 -0
  72. data/test/unit/gateways/payline/payline_wallet_management_api_test.rb +297 -0
  73. data/test/unit/gateways/payline/payline_web_api_test.rb +221 -0
  74. metadata +360 -0
@@ -0,0 +1,83 @@
1
+ require_relative '../../iso_4217_currency_codes'
2
+
3
+ module PaylineConstants
4
+
5
+ WDSL_URL = 'https://services.payline.com/V4/services/WebPaymentAPI?wsdl'.freeze
6
+ WDSL_TEST_URL = 'https://homologation.payline.com/V4/services/WebPaymentAPI?wsdl'.freeze
7
+
8
+ WEB_API_VERSION = '16'.freeze
9
+
10
+ IMPL_NAMESPACE = 'http://impl.ws.payline.experian.com'.freeze
11
+ OBJ_NAMESPACE = 'http://obj.ws.payline.experian.com'.freeze
12
+
13
+ LOG_FILTERED_TAGS = %w( number cvx ).freeze
14
+
15
+ DATE_FORMAT = "%d/%m/%Y".freeze
16
+ DATETIME_FORMAT = "#{DATE_FORMAT} %H:%M".freeze
17
+
18
+ ACTION_CODES = {
19
+ :authorization => 100, # Authorization
20
+ :purchase => 101, # Authorization + Validation
21
+ :capture => 201 # Validation
22
+ }.freeze
23
+
24
+ CARD_BRAND_CODES = Hash.new('CB').update(
25
+ 'visa' => 'VISA',
26
+ 'master' => 'MASTERCARD',
27
+ 'american_express' => 'AMEX',
28
+ 'diners_club' => 'DINERS',
29
+ 'jcb' => 'JCB',
30
+ 'switch' => 'SWITCH',
31
+ 'maestro' => 'MAESTRO'
32
+ ).freeze
33
+
34
+ EXPIRATION_DATE_FORMAT = "%.2d%.2d".freeze
35
+
36
+ PAYMENT_MODES = {
37
+ :direct => 'CPT',
38
+ :deffered => 'DIF',
39
+ :installments => 'NX',
40
+ :recurrent => 'REC'
41
+ }.freeze
42
+
43
+ # locale => ISO 639-2 code
44
+ LANGUAGE_CODES = {
45
+ 'fr' => 'fre',
46
+ 'en' => 'eng',
47
+ 'es' => 'spa',
48
+ 'it' => 'ita',
49
+ 'pt' => 'por',
50
+ 'de' => 'ger',
51
+ 'nl' => 'dut',
52
+ 'fi' => 'fin'
53
+ }.freeze
54
+
55
+ RECURRING_FREQUENCIES = {
56
+ :daily => 10,
57
+ :weekly => 20,
58
+ :fortnightly => 30,
59
+ :monthly => 40,
60
+ :bimonthly => 50,
61
+ :quarterly => 60,
62
+ :semiannual => 70,
63
+ :yearly => 80,
64
+ :biannual => 90
65
+ }.freeze
66
+
67
+ SSL = 'SSL'.freeze
68
+
69
+ SUCCESS_MESSAGES = {
70
+ # Card & Check
71
+ "00000" => "Transaction approved",
72
+ "01001" => "Transaction approved but required a verification by merchant",
73
+ # Wallet
74
+ "02500" => "Operation successful",
75
+ "02501" => "Operation successful but wallet will expire",
76
+ "02517" => "Cannot disable some wallet(s)",
77
+ "02520" => "Cannot enable some wallet(s)",
78
+ # Cancelling & Reauthorizing
79
+ "02616" => "Error while creating the wallet"
80
+ }.freeze
81
+
82
+ SUCCESS_CODES = SUCCESS_MESSAGES.keys.freeze
83
+ end
@@ -0,0 +1,78 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineDirectAPI
7
+ # :amount [Number] Amount of transaction (required)
8
+ # :credit_card [Hash] Credit card informations - Must contain number, brand, month, year, verification_value (required)
9
+ # :order_ref [String] Order ref (required)
10
+ # :currency [String] Default currency code is default_currency
11
+ # :action [String] Default is :purchase (101 (Authorization + Validation))
12
+ # :mode [String] Default is :direct ("CPT")
13
+ # Optional parameters: media
14
+ # Optional objects: buyer, private_data, contract_number_wallet
15
+ def do_authorization(amount, credit_card, options = {})
16
+ #requires!(options, :order_id, :credit_card)
17
+ currency = currency_code(options[:currency])
18
+ action = options[:action] || :authorization
19
+
20
+ optional_parameters = ['media']
21
+
22
+ data = merged_data([
23
+ # Required parameters
24
+ add_payment(amount, currency, action, options[:mode], options[:payment]),
25
+ add_bank_account_data(options[:bank_account_data]), # Doest seem required
26
+ add_credit_card(credit_card),
27
+ add_order(amount, currency, options[:order_ref], options[:order]),
28
+ # Optional parameters
29
+ add_buyer(options[:buyer]),
30
+ add_owner(options[:owner]),
31
+ add_private_data(options[:private_data]),
32
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
33
+ add_optional_parameters(options, optional_parameters)
34
+ ])
35
+
36
+ direct_api_request :do_authorization, data
37
+ end
38
+ alias_method :authorize, :do_authorization
39
+
40
+ # payment_record_id [String] Payment record ID, can be retrieved after a do_recurrent_wallet_payment request (required)
41
+ def get_payment_record(payment_record_id)
42
+ payment_record_request :get, payment_record_id
43
+ end
44
+
45
+ # payment_record_id [String] Payment record ID, can be retrieved after a do_recurrent_wallet_payment request (required)
46
+ def disable_payment_record(payment_record_id)
47
+ payment_record_request :disable, payment_record_id
48
+ end
49
+
50
+ protected
51
+ def payment_record_request(method_name, payment_record_id)
52
+ data = { paymentRecordId: payment_record_id }
53
+ direct_api_request :"#{method_name}_payment_record", data
54
+ end
55
+
56
+ def add_bank_account_data(bank_account_data)
57
+ if bank_account_data
58
+ optional_parameters = {
59
+ countryCode: bank_account_data[:country_code],
60
+ bankCode: bank_account_data[:bank_code],
61
+ accountNumber: bank_account_data[:account_number],
62
+ key: bank_account_data[:key]
63
+ }
64
+
65
+ parameters = [add_optional_parameters(bank_account_data, optional_parameters)]
66
+
67
+ data = { bankAccountData: merged_data(parameters) }
68
+ end
69
+
70
+ data ||= {}
71
+ end
72
+
73
+ def expiration_date(month, year)
74
+ EXPIRATION_DATE_FORMAT % [month, year.to_s[-2..-1]]
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,154 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineManagementPaymentAPI
7
+
8
+ # Optional parameters: comment, transaction_id, order_id
9
+ # Required objects: payment, creditor
10
+ def do_bank_transfer(amount, options = {})
11
+ optional_parameters = ['comment', 'transactionID', 'orderID']
12
+
13
+ data = merged_data([
14
+ # Required parameters
15
+ add_payment(amount, currency_code(options[:currency]), options[:action], options[:mode], options[:payment]),
16
+ add_creditor(options[:creditor]),
17
+ # Optional parameters
18
+ add_optional_parameters(options, optional_parameters)
19
+ ])
20
+
21
+ direct_api_request :do_bank_transfer, data
22
+ end
23
+
24
+ # :amount [Number] Amount of transaction (required)
25
+ # :transaction_id [String] Transaction id (required)
26
+ # :currency [String] Default currency code is default_currency
27
+ # :mode [String] CPT for Full (default) / DIF for Deferred/ NX for N instalments / REC for Recurring
28
+ # Optional parameters: sequence_number, media
29
+ # Optional objects: payment
30
+ def do_capture(amount, transaction_id, options = {})
31
+ optional_parameters = ['sequenceNumber', 'media']
32
+ required_parameters = { transactionID: transaction_id }
33
+
34
+ data = merged_data([
35
+ # Required parameters
36
+ required_parameters,
37
+ add_payment(amount, currency_code(options[:currency]), 201, options[:mode], options[:payment]),
38
+ # Optional parameters
39
+ add_private_data(options[:private_data]),
40
+ add_optional_parameters(options, optional_parameters)
41
+ ])
42
+
43
+ direct_api_request :do_capture, data
44
+ end
45
+ alias_method :capture, :do_capture
46
+
47
+ # Optional parameters: comment, media
48
+ # Required objects: payment, card, order
49
+ # Optional objects: buyer, owner, private_data, optional_parameters
50
+ def do_credit(amount, credit_card, order_ref, options = {})
51
+ optional_parameters = ['comment', 'media']
52
+
53
+ data = merged_data([
54
+ # Required parameters
55
+ add_payment(amount, currency_code(options[:currency]), 422, options[:mode], options[:payment]),
56
+ add_credit_card(credit_card),
57
+ add_order(amount, currency_code(options[:currency]), order_ref, options[:order]),
58
+ # Optional parameters
59
+ add_buyer(options[:buyer]),
60
+ add_owner(options[:owner]),
61
+ add_private_data(options[:private_data]),
62
+ add_optional_parameters(options, optional_parameters)
63
+ ])
64
+
65
+ direct_api_request :do_credit, data
66
+ end
67
+
68
+ # Optional parameters: media
69
+ # Required objects: payment, card, order, authorization
70
+ # Optional parameters: buyer, owner, private_data
71
+ def do_debit(amount, credit_card, order_ref, options = {})
72
+ optional_parameters = ['media']
73
+
74
+ data = merged_data([
75
+ # Required parameters
76
+ add_payment(amount, currency_code(options[:currency]), 204, options[:mode], options[:payment]),
77
+ add_credit_card(credit_card),
78
+ add_order(amount, currency_code(options[:currency]), order_ref, options[:order]),
79
+ add_authorization(options[:authorization]), # Seems to be required
80
+ # Optional parameters
81
+ add_buyer(options[:buyer]),
82
+ add_owner(options[:owner]),
83
+ add_private_data(options[:private_data]),
84
+ add_optional_parameters(options, optional_parameters)
85
+ ])
86
+
87
+ direct_api_request :do_debit, data
88
+ end
89
+
90
+ # :amount [Number] Amount of transaction
91
+ # :transaction_id [String] Transaction id
92
+ # :currency [String] Default currency code is default_currency
93
+ # :mode [String] CPT for Full (default) / DIF for Deferred/ NX for N instalments / REC for Recurring
94
+ # Optional parameters: comment, sequence_number, media
95
+ # Optional objects: payment
96
+ def do_refund(amount, transaction_id, options = {})
97
+ optional_parameters = ['comment', 'sequenceNumber', 'media']
98
+ required_parameters = { transactionID: transaction_id }
99
+
100
+ data = merged_data([
101
+ # Required parameters
102
+ required_parameters,
103
+ add_payment(amount, currency_code(options[:currency]), 421, options[:mode], options[:payment]),
104
+ # Optional parameters
105
+ add_optional_parameters(options, optional_parameters)
106
+ ])
107
+
108
+ direct_api_request :do_refund, data
109
+ end
110
+ alias_method :refund, :do_refund
111
+
112
+ # Transaction_id [String] Transaction id (required)
113
+ # Optional parameters: comment, sequence_number, media
114
+ def do_reset(transaction_id, options = {})
115
+ optional_parameters = ['comment', 'sequenceNumber', 'media']
116
+ required_parameters = { transactionID: transaction_id }
117
+
118
+ data = merged_data([
119
+ # Required parameters
120
+ required_parameters,
121
+ # Optional parameters
122
+ add_optional_parameters(options, optional_parameters)
123
+ ])
124
+
125
+ direct_api_request :do_reset, data
126
+ end
127
+ alias_method :void, :do_reset
128
+
129
+ private
130
+ def add_creditor(creditor_data)
131
+ if creditor_data
132
+ required_parameters = {
133
+ bic: creditor_data[:bic],
134
+ iban: creditor_data[:iban],
135
+ name: creditor_data[:name]
136
+ }
137
+ end
138
+ data = { creditor: required_parameters }
139
+ end
140
+
141
+ def add_authorization(authorization_data)
142
+ if authorization_data
143
+ required_parameters = {
144
+ number: authorization_data[:number],
145
+ date: authorization_data[:date]
146
+ }
147
+ end
148
+ required_parameters ||= {}
149
+
150
+ data = {authorization: required_parameters}
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,36 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineStatusAPI
7
+ # Required parameter: transaction_id
8
+ # Optional parameters: order_ref, start_date, end_date, transaction_history, archive_search
9
+ def get_transaction_details(transaction_id, options={})
10
+ optional_parameters = ['orderRef', 'startDate', 'endDate', 'transactionHistory', 'archiveSearch']
11
+ required_parameters = { transaction_id: transaction_id }
12
+
13
+ data = merged_data([
14
+ # Required parameters
15
+ required_parameters,
16
+ # Optional parameters
17
+ add_optional_parameters(options, optional_parameters)
18
+ ])
19
+
20
+ extended_api_request :get_transaction_details, data
21
+ end
22
+
23
+ protected
24
+ def extended_api_request(method_name, data)
25
+ savon_request(extended_api_savon_client, method_name, data)
26
+ end
27
+
28
+ def extended_api_savon_client
29
+ url = test? ? self.extended_test_payment_url : self.extended_payment_url
30
+
31
+ @extended_api_savon_client ||= create_savon_client(url)
32
+ end
33
+
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,249 @@
1
+ require_relative 'payline_common'
2
+ include ActiveMerchant::Billing::PaylineCommon
3
+
4
+ module ActiveMerchant
5
+ module Billing
6
+ module PaylineWalletManagementAPI
7
+
8
+ # Optional parameters: media
9
+ # Required objects: Wallet
10
+ # Optional objects: buyer, owner, private_data, authentication_3D_secure, contract_number_wallet
11
+ def create_wallet(wallet, options = {})
12
+ optional_parameters = ['media']
13
+ data = merged_data([
14
+ # Required parameters
15
+ add_wallet(wallet),
16
+ # Option parameters,
17
+ add_buyer(options[:buyer]),
18
+ add_owner(options[:owner]),
19
+ add_private_data(options[:private_data]),
20
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
21
+ add_optional_parameters(options, optional_parameters),
22
+ add_contract_number_wallet_list(options[:contract_number_wallet])
23
+ ])
24
+
25
+ direct_api_request :create_wallet, data
26
+ end
27
+
28
+ def disable_wallet(contract_number, wallet_id, options={})
29
+ optional_parameters = ['cardInd']
30
+ required_parameters = { contractNumber: contract_number}
31
+
32
+ data = merged_data([
33
+ required_parameters,
34
+ add_optional_parameters(options, optional_parameters),
35
+ add_wallet_id_list(wallet_id)
36
+ ])
37
+
38
+ direct_api_request :disable_wallet, data
39
+ end
40
+
41
+ # :wallet_id [String] Wallet ID
42
+ # :order_ref [String] Order ID (required)
43
+ # Required parameters: order_ref, wallet_id, buyer
44
+ # Optional parameters: card_ind, media, wallet_cvx
45
+ # Required objects: order, payment, authentication_3D_secure
46
+ # Optional parameters: private_data
47
+ def do_immediate_wallet_payment(amount, wallet_id, options = {})
48
+ currency = currency_code(options[:currency])
49
+
50
+ optional_parameters = ['cardInd', 'media', 'walletCvx']
51
+ required_parameters = {
52
+ walletId: wallet_id
53
+ }
54
+
55
+ buyer_options = options[:buyer].blank? ? { wallet_id: wallet_id} : options[:buyer]
56
+
57
+ data = merged_data([
58
+ # Required parameters
59
+ required_parameters,
60
+ add_payment( amount, currency, options[:action], :direct, options[:payment]),
61
+ add_order( amount, currency, options[:order_ref], options[:order]),
62
+ add_buyer(buyer_options),
63
+ # Optional parameters
64
+ add_private_data(options[:private_data]),
65
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
66
+ add_optional_parameters(options, optional_parameters)
67
+ ])
68
+
69
+ direct_api_request :do_immediate_wallet_payment, data
70
+ end
71
+
72
+ # :wallet_id [String] Wallet ID
73
+ # :order_ref [String] Order ID (required)
74
+ # Required parameters: order_ref, order_data, schedule_date, wallet_id
75
+ # Optional parameters: card_ind, media
76
+ # Required objects: payment, recurring
77
+ # Optional parameters: order, private_data
78
+ def do_recurrent_wallet_payment(amount, wallet_id, options = {})
79
+ currency = currency_code(options[:currency])
80
+
81
+ optional_parameters = ['cardInd', 'media']
82
+ required_parameters = {
83
+ orderRef: options[:order_ref],
84
+ orderDate: options[:order_date], # Doesnt seem required
85
+ scheduledDate: options[:scheduled_date], # Doesnt seem required
86
+ walletId: wallet_id,
87
+ }
88
+
89
+ data = merged_data([
90
+ # Required parameters
91
+ required_parameters,
92
+ add_payment( amount, currency, options[:action], :recurrent, options[:payment]),
93
+ add_recurring( options[:recurring]),
94
+ # Optional parameters
95
+ add_order( amount, currency, options[:order_ref], options[:order]),
96
+ add_private_data(options[:private_data]),
97
+ add_optional_parameters(options, optional_parameters)
98
+ ])
99
+
100
+ direct_api_request :do_recurrent_wallet_payment, data
101
+ end
102
+
103
+ # :wallet_id [String] Wallet ID
104
+ # :order_ref [String] Order ID (required)
105
+ # Required parameters: order_ref, wallet_id, scheduled_date (doesn't seem that required)
106
+ # Optional parameters: card_ind, media, wallet_cvx
107
+ # Required objects: order, payment, authentication_3D_secure
108
+ # Optional parameters: private_data
109
+ def do_scheduled_wallet_payment(amount, wallet_id, options = {})
110
+ currency = currency_code(options[:currency])
111
+
112
+ optional_parameters = ['cardInd', 'media', 'orderDate']
113
+ required_parameters = {
114
+ walletId: wallet_id,
115
+ scheduledDate: options[:scheduled_data],
116
+ orderRef: options[:order_ref]
117
+ }
118
+
119
+ buyer_options = options[:buyer].blank? ? { wallet_id: wallet_id} : options[:buyer]
120
+
121
+ data = merged_data([
122
+ # Required parameters
123
+ required_parameters,
124
+ add_payment( amount, currency, options[:action], :direct, options[:payment]),
125
+ add_order( amount, currency, options[:order_ref], options[:order]),
126
+ # Optional parameters
127
+ add_private_data(options[:private_data]),
128
+ add_optional_parameters(options, optional_parameters)
129
+ ])
130
+
131
+ direct_api_request :do_scheduled_wallet_payment, data
132
+ end
133
+
134
+
135
+ # :wallet_id [String] Wallet ID
136
+ # Required parameters: contract_number, wallet_id
137
+ # Optional parameters: card_ind
138
+ def enable_wallet(contract_number, wallet_id, options={})
139
+ optional_parameters = ['cardInd']
140
+ required_parameters = {
141
+ contractNumber: contract_number,
142
+ walletId: wallet_id
143
+ }
144
+
145
+ data = merged_data([
146
+ required_parameters,
147
+ add_optional_parameters(options, optional_parameters)
148
+ ])
149
+
150
+ direct_api_request :enable_wallet, data
151
+ end
152
+
153
+ # :wallet_id [String] Wallet ID
154
+ # Required parameters: contract_number, wallet_id
155
+ # Optional parameters: card_ind
156
+ def get_wallet(contract_number, wallet_id, options={})
157
+ optional_parameters = ['cardInd', 'media']
158
+ required_parameters = {
159
+ contractNumber: contract_number,
160
+ walletId: wallet_id
161
+ }
162
+
163
+ data = merged_data([
164
+ required_parameters,
165
+ add_optional_parameters(options, optional_parameters)
166
+ ])
167
+
168
+ direct_api_request :get_wallet, data
169
+ end
170
+
171
+ # Optional parameters: card_ind, media
172
+ # Required objects: Wallet
173
+ # Optional objects: buyer, owner, private_data, authentication_3D_secure, contract_number_wallet
174
+ def update_wallet(wallet, options = {})
175
+ optional_parameters = ['cardInd', 'media']
176
+ data = merged_data([
177
+ # Required parameters
178
+ add_wallet(wallet),
179
+ # Option parameters
180
+ add_buyer(options[:buyer]),
181
+ add_owner(options[:owner]),
182
+ add_private_data(options[:private_data]),
183
+ add_authentication_3D_secure(options[:authentication_3D_secure]),
184
+ add_optional_parameters(options, optional_parameters),
185
+ add_contract_number_wallet_list(options[:contract_number_wallet])
186
+ ])
187
+
188
+ direct_api_request :update_wallet, data
189
+ end
190
+
191
+ private
192
+ # Optional parameters: first_amount, billing_left, start_date, end_date, new_amount, amount_modification_date
193
+ # Required parameters: amount, billing_cycle
194
+ def add_recurring(recurring_data)
195
+ optional_parameters = ['firstAmount', 'billingLeft', 'startDate', 'endDate', 'newAmount', 'amountModificationDate']
196
+ if recurring_data
197
+ required_parameters = {
198
+ amount: recurring_data[:amount],
199
+ billingCycle: PaylineCommon::RECURRING_FREQUENCIES[recurring_data[:billing_cycle]]
200
+ }
201
+ objects = [
202
+ required_parameters,
203
+ add_optional_parameters(options, optional_parameters)
204
+ ]
205
+
206
+ data = { recurring: merged_data(objects)}
207
+ end
208
+ data ||= { recurring: {} }
209
+ end
210
+
211
+ # Optional parameters: last_name, first_name, email, comment, default, card_status, card_brand
212
+ # Required parameters: wallet_id
213
+ # Required objects: card
214
+ # Optional objects: shipping_address
215
+ def add_wallet(wallet_data)
216
+ if wallet_data
217
+ optional_parameters = ['lastName', 'firstName', 'email', 'comment', 'default', 'cardStatus', 'cardBrand']
218
+ required_parameters = {
219
+ walletId: wallet_data[:wallet_id]
220
+ }
221
+
222
+ objects = [
223
+ # Required parameters
224
+ required_parameters,
225
+ add_credit_card(wallet_data[:card]),
226
+ # Optional parameters
227
+ add_address(wallet_data[:shipping_address], :shipping_address),
228
+ add_optional_parameters(wallet_data, optional_parameters)
229
+ ]
230
+
231
+ data = { wallet: merged_data(objects) }
232
+ end
233
+
234
+ data ||= {}
235
+ end
236
+
237
+ def add_wallet_id_list(wallet_id)
238
+ if wallet_id
239
+ data = { walletIdList:
240
+ {
241
+ walletId: wallet_id
242
+ }
243
+ }
244
+ end
245
+ data ||= {}
246
+ end
247
+ end
248
+ end
249
+ end