hps 2.2.5 → 2.4.0
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.
- checksums.yaml +5 -5
- data/Gemfile +4 -4
- data/Gemfile.lock +59 -0
- data/LICENSE.md +264 -0
- data/PRIVACY.txt +65 -65
- data/README.md +213 -216
- data/Rakefile +15 -15
- data/examples/sinatra-verify-only/Gemfile +4 -4
- data/examples/sinatra-verify-only/app.rb +32 -32
- data/examples/sinatra-verify-only/views/index.erb +478 -478
- data/examples/sinatra-verify-only/views/result.erb +39 -39
- data/hps.gemspec +28 -28
- data/lib/hps/configuration.rb +17 -17
- data/lib/hps/entities/hps_account_verify.rb +8 -8
- data/lib/hps/entities/hps_address.rb +6 -6
- data/lib/hps/entities/hps_authorization.rb +12 -12
- data/lib/hps/entities/hps_batch.rb +6 -6
- data/lib/hps/entities/hps_cardholder.rb +6 -6
- data/lib/hps/entities/hps_charge.rb +8 -8
- data/lib/hps/entities/hps_charge_exceptions.rb +6 -6
- data/lib/hps/entities/hps_check.rb +18 -18
- data/lib/hps/entities/hps_check_holder.rb +10 -10
- data/lib/hps/entities/hps_check_response.rb +45 -45
- data/lib/hps/entities/hps_check_response_details.rb +9 -9
- data/lib/hps/entities/hps_credit_card.rb +34 -34
- data/lib/hps/entities/hps_direct_market_data.rb +5 -5
- data/lib/hps/entities/hps_encryption_data.rb +6 -6
- data/lib/hps/entities/hps_gift_card.rb +133 -0
- data/lib/hps/entities/hps_manage_tokens.rb +8 -8
- data/lib/hps/entities/hps_refund.rb +8 -8
- data/lib/hps/entities/hps_report_transaction_details.rb +10 -10
- data/lib/hps/entities/hps_report_transaction_summary.rb +6 -6
- data/lib/hps/entities/hps_reversal.rb +10 -10
- data/lib/hps/entities/hps_token_data.rb +10 -10
- data/lib/hps/entities/hps_track_data.rb +5 -5
- data/lib/hps/entities/hps_transaction.rb +161 -161
- data/lib/hps/entities/hps_transaction_details.rb +6 -6
- data/lib/hps/entities/hps_transaction_header.rb +8 -8
- data/lib/hps/entities/hps_transaction_type.rb +16 -16
- data/lib/hps/entities/hps_void.rb +8 -8
- data/lib/hps/infrastructure/api_connection_exception.rb +11 -11
- data/lib/hps/infrastructure/authentication_exception.rb +11 -11
- data/lib/hps/infrastructure/card_exception.rb +15 -15
- data/lib/hps/infrastructure/exceptions.json +547 -468
- data/lib/hps/infrastructure/hps_account_type.rb +11 -11
- data/lib/hps/infrastructure/hps_check_exception.rb +13 -13
- data/lib/hps/infrastructure/hps_check_type.rb +11 -11
- data/lib/hps/infrastructure/hps_data_entry_mode.rb +11 -11
- data/lib/hps/infrastructure/hps_exception.rb +25 -25
- data/lib/hps/infrastructure/hps_exception_mapper.rb +145 -134
- data/lib/hps/infrastructure/hps_gateway_response_validation.rb +20 -20
- data/lib/hps/infrastructure/hps_input_validation.rb +13 -13
- data/lib/hps/infrastructure/hps_sdk_codes.rb +48 -48
- data/lib/hps/infrastructure/hps_sec_code.rb +27 -27
- data/lib/hps/infrastructure/hps_track_data_method.rb +6 -6
- data/lib/hps/infrastructure/invalid_request_exception.rb +15 -15
- data/lib/hps/services/hps_batch_service.rb +29 -29
- data/lib/hps/services/hps_charge_service.rb +773 -773
- data/lib/hps/services/hps_check_service.rb +110 -110
- data/lib/hps/services/hps_gift_card_service.rb +301 -0
- data/lib/hps/services/hps_service.rb +141 -136
- data/lib/hps/version.rb +3 -3
- data/lib/hps.rb +63 -61
- data/tests/amex_tests.rb +292 -292
- data/tests/cert_tests.rb +80 -80
- data/tests/certification/card_present_spec.rb +320 -320
- data/tests/certification/gift_card_certification_test.rb +107 -0
- data/tests/certification/gift_card_certification_tests.rb +107 -0
- data/tests/check_tests.rb +50 -50
- data/tests/discover_tests.rb +386 -386
- data/tests/exception_mapper_tests.rb +311 -244
- data/tests/general_tests.rb +140 -140
- data/tests/giftcard_tests.rb +212 -0
- data/tests/hps_token_service.rb +56 -56
- data/tests/mastercard_tests.rb +387 -387
- data/tests/secret_key.rb +11 -11
- data/tests/test_check.rb +77 -77
- data/tests/test_data.rb +138 -128
- data/tests/test_helper.rb +179 -116
- data/tests/token_tests.rb +512 -512
- data/tests/visa_tests.rb +445 -445
- metadata +40 -15
- data/LICENSE.txt +0 -32
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
module Hps
|
|
2
|
-
class HpsCheckService < HpsService
|
|
3
|
-
def sale(check, amount, client_txn_id = nil)
|
|
4
|
-
build_transaction('SALE', check, amount, client_txn_id)
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def void(transaction_id = nil, client_txn_id = nil)
|
|
8
|
-
if (transaction_id == nil && client_txn_id == nil) ||
|
|
9
|
-
(transaction_id != nil && client_txn_id != nil)
|
|
10
|
-
raise Error, 'Please provide either a transaction ID or a client transaction ID'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
xml = Builder::XmlMarkup.new
|
|
14
|
-
xml.hps :Transaction do
|
|
15
|
-
xml.hps :CheckVoid do
|
|
16
|
-
xml.hps :Block1 do
|
|
17
|
-
xml.hps :GatewayTxnId, transaction_id if transaction_id
|
|
18
|
-
xml.hps :ClientTxnId, client_txn_id if client_txn_id
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
submit_transaction(xml.target!, :CheckVoid)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def build_transaction(action, check, amount, client_txn_id)
|
|
29
|
-
amount = HpsInputValidation::check_amount(amount)
|
|
30
|
-
|
|
31
|
-
if check.sec_code == HpsSECCode.ccd &&
|
|
32
|
-
(check.check_holder == nil || check.check_holder.check_name == nil)
|
|
33
|
-
raise Error, 'For SEC code CCD, the check name is require', 'check_name'
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
xml = Builder::XmlMarkup.new
|
|
37
|
-
xml.hps :Transaction do
|
|
38
|
-
xml.hps :CheckSale do
|
|
39
|
-
xml.hps :Block1 do
|
|
40
|
-
xml.hps :Amt, amount
|
|
41
|
-
xml << hydrate_check_data(check)
|
|
42
|
-
xml.hps :CheckAction, action
|
|
43
|
-
xml.hps :SECCode, check.sec_code
|
|
44
|
-
xml.hps :CheckType, check.check_type if check.check_type
|
|
45
|
-
xml << hydrate_consumer_info(check.check_holder) if check.check_holder
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
submit_transaction(xml.target!, :CheckSale, client_txn_id)
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def hydrate_check_data(check)
|
|
54
|
-
xml = Builder::XmlMarkup.new
|
|
55
|
-
xml.hps :AccountInfo do
|
|
56
|
-
xml.hps :AccountNumber, check.account_number if check.account_number
|
|
57
|
-
xml.hps :CheckNumber, check.check_number if check.check_number
|
|
58
|
-
xml.hps :MICRData, check.micr_number if check.micr_number
|
|
59
|
-
xml.hps :RoutingNumber, check.routing_number if check.routing_number
|
|
60
|
-
xml.hps :AccountType, check.account_type if check.account_type
|
|
61
|
-
end
|
|
62
|
-
xml.target!
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def hydrate_consumer_info(check_holder)
|
|
66
|
-
xml = Builder::XmlMarkup.new
|
|
67
|
-
xml.hps :ConsumerInfo do
|
|
68
|
-
if check_holder.address
|
|
69
|
-
xml.hps :Address1, check_holder.address.address if check_holder.address.address
|
|
70
|
-
xml.hps :City, check_holder.address.city if check_holder.address.city
|
|
71
|
-
xml.hps :State, check_holder.address.state if check_holder.address.state
|
|
72
|
-
xml.hps :Zip, check_holder.address.zip if check_holder.address.zip
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
xml.hps :CheckName, check_holder.check_name if check_holder.check_name
|
|
76
|
-
xml.hps :CourtesyCard, check_holder.courtesy_card if check_holder.courtesy_card
|
|
77
|
-
xml.hps :DLNumber, check_holder.dl_number if check_holder.dl_number
|
|
78
|
-
xml.hps :DLState, check_holder.dl_state if check_holder.dl_state
|
|
79
|
-
xml.hps :EmailAddress, check_holder.email if check_holder.email_address
|
|
80
|
-
xml.hps :FirstName, check_holder.first_name if check_holder.first_name
|
|
81
|
-
xml.hps :LastName, check_holder.last_name if check_holder.last_name
|
|
82
|
-
xml.hps :PhoneNumber, check_holder.phone if check_holder.phone
|
|
83
|
-
|
|
84
|
-
if check_holder.ssl4 || check_holder.dob_year
|
|
85
|
-
xml.hps :IdentityInfo do
|
|
86
|
-
xml.hps :SSNL4, check_holder.ssl4 if check_holder.ssl4
|
|
87
|
-
xml.hps :DOBYear, check_holder.dob_year if check_holder.dob_year
|
|
88
|
-
end
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
xml.target!
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def submit_transaction(xml, txn_type, client_txn_id = nil)
|
|
96
|
-
response = doTransaction(xml, client_txn_id)
|
|
97
|
-
HpsGatewayResponseValidation::check_response(response, txn_type)
|
|
98
|
-
response = HpsCheckResponse::from_hash(response, txn_type)
|
|
99
|
-
|
|
100
|
-
return response if response.response_code == '0'
|
|
101
|
-
|
|
102
|
-
raise HpsCheckException.new(
|
|
103
|
-
response.transaction_id,
|
|
104
|
-
response.details,
|
|
105
|
-
response.response_code,
|
|
106
|
-
response.response_text
|
|
107
|
-
)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
end
|
|
1
|
+
module Hps
|
|
2
|
+
class HpsCheckService < HpsService
|
|
3
|
+
def sale(check, amount, client_txn_id = nil)
|
|
4
|
+
build_transaction('SALE', check, amount, client_txn_id)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def void(transaction_id = nil, client_txn_id = nil)
|
|
8
|
+
if (transaction_id == nil && client_txn_id == nil) ||
|
|
9
|
+
(transaction_id != nil && client_txn_id != nil)
|
|
10
|
+
raise Error, 'Please provide either a transaction ID or a client transaction ID'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
xml = Builder::XmlMarkup.new
|
|
14
|
+
xml.hps :Transaction do
|
|
15
|
+
xml.hps :CheckVoid do
|
|
16
|
+
xml.hps :Block1 do
|
|
17
|
+
xml.hps :GatewayTxnId, transaction_id if transaction_id
|
|
18
|
+
xml.hps :ClientTxnId, client_txn_id if client_txn_id
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
submit_transaction(xml.target!, :CheckVoid)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def build_transaction(action, check, amount, client_txn_id)
|
|
29
|
+
amount = HpsInputValidation::check_amount(amount)
|
|
30
|
+
|
|
31
|
+
if check.sec_code == HpsSECCode.ccd &&
|
|
32
|
+
(check.check_holder == nil || check.check_holder.check_name == nil)
|
|
33
|
+
raise Error, 'For SEC code CCD, the check name is require', 'check_name'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
xml = Builder::XmlMarkup.new
|
|
37
|
+
xml.hps :Transaction do
|
|
38
|
+
xml.hps :CheckSale do
|
|
39
|
+
xml.hps :Block1 do
|
|
40
|
+
xml.hps :Amt, amount
|
|
41
|
+
xml << hydrate_check_data(check)
|
|
42
|
+
xml.hps :CheckAction, action
|
|
43
|
+
xml.hps :SECCode, check.sec_code
|
|
44
|
+
xml.hps :CheckType, check.check_type if check.check_type
|
|
45
|
+
xml << hydrate_consumer_info(check.check_holder) if check.check_holder
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
submit_transaction(xml.target!, :CheckSale, client_txn_id)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def hydrate_check_data(check)
|
|
54
|
+
xml = Builder::XmlMarkup.new
|
|
55
|
+
xml.hps :AccountInfo do
|
|
56
|
+
xml.hps :AccountNumber, check.account_number if check.account_number
|
|
57
|
+
xml.hps :CheckNumber, check.check_number if check.check_number
|
|
58
|
+
xml.hps :MICRData, check.micr_number if check.micr_number
|
|
59
|
+
xml.hps :RoutingNumber, check.routing_number if check.routing_number
|
|
60
|
+
xml.hps :AccountType, check.account_type if check.account_type
|
|
61
|
+
end
|
|
62
|
+
xml.target!
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def hydrate_consumer_info(check_holder)
|
|
66
|
+
xml = Builder::XmlMarkup.new
|
|
67
|
+
xml.hps :ConsumerInfo do
|
|
68
|
+
if check_holder.address
|
|
69
|
+
xml.hps :Address1, check_holder.address.address if check_holder.address.address
|
|
70
|
+
xml.hps :City, check_holder.address.city if check_holder.address.city
|
|
71
|
+
xml.hps :State, check_holder.address.state if check_holder.address.state
|
|
72
|
+
xml.hps :Zip, check_holder.address.zip if check_holder.address.zip
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
xml.hps :CheckName, check_holder.check_name if check_holder.check_name
|
|
76
|
+
xml.hps :CourtesyCard, check_holder.courtesy_card if check_holder.courtesy_card
|
|
77
|
+
xml.hps :DLNumber, check_holder.dl_number if check_holder.dl_number
|
|
78
|
+
xml.hps :DLState, check_holder.dl_state if check_holder.dl_state
|
|
79
|
+
xml.hps :EmailAddress, check_holder.email if check_holder.email_address
|
|
80
|
+
xml.hps :FirstName, check_holder.first_name if check_holder.first_name
|
|
81
|
+
xml.hps :LastName, check_holder.last_name if check_holder.last_name
|
|
82
|
+
xml.hps :PhoneNumber, check_holder.phone if check_holder.phone
|
|
83
|
+
|
|
84
|
+
if check_holder.ssl4 || check_holder.dob_year
|
|
85
|
+
xml.hps :IdentityInfo do
|
|
86
|
+
xml.hps :SSNL4, check_holder.ssl4 if check_holder.ssl4
|
|
87
|
+
xml.hps :DOBYear, check_holder.dob_year if check_holder.dob_year
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
xml.target!
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def submit_transaction(xml, txn_type, client_txn_id = nil)
|
|
96
|
+
response = doTransaction(xml, client_txn_id)
|
|
97
|
+
HpsGatewayResponseValidation::check_response(response, txn_type)
|
|
98
|
+
response = HpsCheckResponse::from_hash(response, txn_type)
|
|
99
|
+
|
|
100
|
+
return response if response.response_code == '0'
|
|
101
|
+
|
|
102
|
+
raise HpsCheckException.new(
|
|
103
|
+
response.transaction_id,
|
|
104
|
+
response.details,
|
|
105
|
+
response.response_code,
|
|
106
|
+
response.response_text
|
|
107
|
+
)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
module Hps
|
|
2
|
+
class HpsGiftCardService < HpsService
|
|
3
|
+
def activate(giftcard, amount, currency = "USD")
|
|
4
|
+
HpsInputValidation.check_amount(amount)
|
|
5
|
+
txn_type = "GiftCardActivate"
|
|
6
|
+
|
|
7
|
+
xml = Builder::XmlMarkup.new
|
|
8
|
+
xml.hps :Transaction do
|
|
9
|
+
xml.hps txn_type.to_sym do
|
|
10
|
+
xml.hps :Block1 do
|
|
11
|
+
xml.hps :Amt, amount
|
|
12
|
+
|
|
13
|
+
if giftcard.is_a? HpsTokenData
|
|
14
|
+
card_data = HpsGiftCard.new
|
|
15
|
+
card_data.token_value = giftcard.token_value
|
|
16
|
+
else
|
|
17
|
+
card_data = giftcard
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
submit_transaction(xml.target!, txn_type)
|
|
25
|
+
end # activate
|
|
26
|
+
|
|
27
|
+
def add_value(giftcard, amount, currency = "USD")
|
|
28
|
+
HpsInputValidation.check_amount(amount)
|
|
29
|
+
txn_type = "GiftCardAddValue"
|
|
30
|
+
|
|
31
|
+
xml = Builder::XmlMarkup.new
|
|
32
|
+
xml.hps :Transaction do
|
|
33
|
+
xml.hps txn_type.to_sym do
|
|
34
|
+
xml.hps :Block1 do
|
|
35
|
+
xml.hps :Amt, amount
|
|
36
|
+
|
|
37
|
+
if giftcard.is_a? HpsTokenData
|
|
38
|
+
card_data = HpsGiftCard.new
|
|
39
|
+
card_data.token_value = giftcard.token_value
|
|
40
|
+
else
|
|
41
|
+
card_data = giftcard
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
submit_transaction(xml.target!, txn_type)
|
|
49
|
+
end # add_value
|
|
50
|
+
|
|
51
|
+
def balance(giftcard)
|
|
52
|
+
txn_type = "GiftCardBalance"
|
|
53
|
+
|
|
54
|
+
xml = Builder::XmlMarkup.new
|
|
55
|
+
xml.hps :Transaction do
|
|
56
|
+
xml.hps txn_type.to_sym do
|
|
57
|
+
xml.hps :Block1 do
|
|
58
|
+
|
|
59
|
+
if giftcard.is_a? HpsTokenData
|
|
60
|
+
card_data = HpsGiftCard.new
|
|
61
|
+
card_data.token_value = giftcard.token_value
|
|
62
|
+
else
|
|
63
|
+
card_data = giftcard
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
submit_transaction(xml.target!, txn_type)
|
|
71
|
+
end # balance
|
|
72
|
+
|
|
73
|
+
def deactivate(giftcard)
|
|
74
|
+
txn_type = "GiftCardDeactivate"
|
|
75
|
+
|
|
76
|
+
xml = Builder::XmlMarkup.new
|
|
77
|
+
xml.hps :Transaction do
|
|
78
|
+
xml.hps txn_type.to_sym do
|
|
79
|
+
xml.hps :Block1 do
|
|
80
|
+
|
|
81
|
+
if giftcard.is_a? HpsTokenData
|
|
82
|
+
card_data = HpsGiftCard.new
|
|
83
|
+
card_data.token_value = giftcard.token_value
|
|
84
|
+
else
|
|
85
|
+
card_data = giftcard
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
submit_transaction(xml.target!, txn_type)
|
|
93
|
+
end # deactivate
|
|
94
|
+
|
|
95
|
+
def replace(old_card, new_card)
|
|
96
|
+
txn_type = "GiftCardReplace"
|
|
97
|
+
|
|
98
|
+
xml = Builder::XmlMarkup.new
|
|
99
|
+
xml.hps :Transaction do
|
|
100
|
+
xml.hps txn_type.to_sym do
|
|
101
|
+
xml.hps :Block1 do
|
|
102
|
+
|
|
103
|
+
hydrate_gift_card_data(old_card, xml, 'OldCardData')
|
|
104
|
+
hydrate_gift_card_data(new_card, xml, 'NewCardData')
|
|
105
|
+
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
submit_transaction(xml.target!, txn_type)
|
|
110
|
+
end # replace
|
|
111
|
+
|
|
112
|
+
def reward(giftcard, amount, currency = "USD", gratuity = nil, tax = nil)
|
|
113
|
+
HpsInputValidation.check_amount(amount)
|
|
114
|
+
txn_type = "GiftCardReward"
|
|
115
|
+
|
|
116
|
+
xml = Builder::XmlMarkup.new
|
|
117
|
+
xml.hps :Transaction do
|
|
118
|
+
xml.hps txn_type.to_sym do
|
|
119
|
+
xml.hps :Block1 do
|
|
120
|
+
xml.hps :Amt, amount
|
|
121
|
+
|
|
122
|
+
if giftcard.is_a? HpsTokenData
|
|
123
|
+
card_data = HpsGiftCard.new
|
|
124
|
+
card_data.token_value = giftcard.token_value
|
|
125
|
+
else
|
|
126
|
+
card_data = giftcard
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
130
|
+
|
|
131
|
+
if ["USD", "POINTS"].include? currency.upcase
|
|
132
|
+
xml.hps :Currency, currency.upcase
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
if gratuity
|
|
136
|
+
xml.hps :GratuityAmtInfo, gratuity
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
if tax
|
|
140
|
+
xml.hps :TaxAmtInfo, tax
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
submit_transaction(xml.target!, txn_type)
|
|
147
|
+
end # reward
|
|
148
|
+
|
|
149
|
+
def sale(giftcard, amount, currency = "USD", gratuity = nil, tax = nil)
|
|
150
|
+
HpsInputValidation.check_amount(amount)
|
|
151
|
+
txn_type = "GiftCardSale"
|
|
152
|
+
|
|
153
|
+
xml = Builder::XmlMarkup.new
|
|
154
|
+
xml.hps :Transaction do
|
|
155
|
+
xml.hps txn_type.to_sym do
|
|
156
|
+
xml.hps :Block1 do
|
|
157
|
+
xml.hps :Amt, amount
|
|
158
|
+
|
|
159
|
+
if giftcard.is_a? HpsTokenData
|
|
160
|
+
card_data = HpsGiftCard.new
|
|
161
|
+
card_data.token_value = giftcard.token_value
|
|
162
|
+
else
|
|
163
|
+
card_data = giftcard
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
hydrate_gift_card_data(giftcard, xml)
|
|
167
|
+
|
|
168
|
+
if ["USD", "POINTS"].include? currency.upcase
|
|
169
|
+
xml.hps :Currency, currency.upcase
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
if gratuity
|
|
173
|
+
xml.hps :GratuityAmtInfo, gratuity
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
if tax
|
|
177
|
+
xml.hps :TaxAmtInfo, tax
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
submit_transaction(xml.target!, txn_type)
|
|
184
|
+
end # sale
|
|
185
|
+
|
|
186
|
+
def void(txn_id)
|
|
187
|
+
txn_type = "GiftCardVoid"
|
|
188
|
+
|
|
189
|
+
xml = Builder::XmlMarkup.new
|
|
190
|
+
xml.hps :Transaction do
|
|
191
|
+
xml.hps txn_type.to_sym do
|
|
192
|
+
xml.hps :Block1 do
|
|
193
|
+
xml.hps :GatewayTxnId, txn_id
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
submit_transaction(xml.target!, txn_type)
|
|
198
|
+
end # void
|
|
199
|
+
|
|
200
|
+
def reverse(giftcard, amount)
|
|
201
|
+
HpsInputValidation.check_amount(amount)
|
|
202
|
+
txn_type = "GiftCardReversal"
|
|
203
|
+
|
|
204
|
+
xml = Builder::XmlMarkup.new
|
|
205
|
+
xml.hps :Transaction do
|
|
206
|
+
xml.hps txn_type.to_sym do
|
|
207
|
+
xml.hps :Block1 do
|
|
208
|
+
xml.hps :Amt, amount
|
|
209
|
+
|
|
210
|
+
if giftcard.is_a? HpsTokenData
|
|
211
|
+
xml.hps :TokenValue, giftcard.token_value
|
|
212
|
+
elsif giftcard.is_a? HpsGiftCard
|
|
213
|
+
card_data = giftcard
|
|
214
|
+
hydrate_gift_card_data(card_data, xml)
|
|
215
|
+
else
|
|
216
|
+
xml.hps :GatewayTxnId, giftcard
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
submit_transaction(xml.target!, txn_type)
|
|
223
|
+
end # reverse
|
|
224
|
+
|
|
225
|
+
private
|
|
226
|
+
def hydrate_gift_card_data(gift_card, xml, element_name = 'CardData')
|
|
227
|
+
xml.hps element_name.to_sym do
|
|
228
|
+
if gift_card.number
|
|
229
|
+
xml.hps :CardNbr, gift_card.number
|
|
230
|
+
elsif gift_card.track_data
|
|
231
|
+
xml.hps :TrackData, gift_card.track_data
|
|
232
|
+
elsif gift_card.alias
|
|
233
|
+
xml.hps :Alias, gift_card.alias
|
|
234
|
+
elsif gift_card.token_value
|
|
235
|
+
xml.hps :TokenValue, gift_card.token_value
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
if gift_card.encryption_data
|
|
239
|
+
hydrate_encryption_data(gift_card.encryption_data, xml)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
if gift_card.pin
|
|
243
|
+
xml.hps :PIN, gift_card.pin
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end # hydrate_gift_card_data
|
|
247
|
+
|
|
248
|
+
def hydrate_encryption_data(encryption_data, xml)
|
|
249
|
+
xml.hps :EncryptionData do
|
|
250
|
+
if encryption_data.encrypted_track_number
|
|
251
|
+
xml.hps :EncryptedTrackNumber, encryption_data.encrypted_track_number
|
|
252
|
+
end
|
|
253
|
+
xml.hps :KSN, encryption_data.ksn
|
|
254
|
+
xml.hps :KTB, encryption_data.ktb
|
|
255
|
+
xml.hps :Version, encryption_data.version
|
|
256
|
+
end
|
|
257
|
+
end # hydrate_encryption_data
|
|
258
|
+
|
|
259
|
+
def submit_transaction(transaction, txn_type, client_txn_id = nil)
|
|
260
|
+
response = doTransaction(transaction, client_txn_id)
|
|
261
|
+
|
|
262
|
+
header = response['Header']
|
|
263
|
+
transaction_response = response["Transaction"][txn_type]
|
|
264
|
+
|
|
265
|
+
if !transaction_response["RspCode"].eql? "0"
|
|
266
|
+
raise @exception_mapper.map_gift_card_exception(header["GatewayTxnId"], transaction_response["RspCode"], transaction_response["RspText"])
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
if !header["GatewayRspCode"].eql? "0"
|
|
270
|
+
raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
rvalue = ''
|
|
274
|
+
case txn_type
|
|
275
|
+
when 'GiftCardActivate'
|
|
276
|
+
rvalue = HpsGiftCardActivate::from_response(response, txn_type)
|
|
277
|
+
when 'GiftCardAddValue'
|
|
278
|
+
rvalue = HpsGiftCardAddValue::from_response(response, txn_type)
|
|
279
|
+
when 'GiftCardAlias'
|
|
280
|
+
rvalue = HpsGiftCardAlias::from_response(response, txn_type)
|
|
281
|
+
when 'GiftCardBalance'
|
|
282
|
+
rvalue = HpsGiftCardBalance::from_response(response, txn_type)
|
|
283
|
+
when 'GiftCardDeactivate'
|
|
284
|
+
rvalue = HpsGiftCardDeactivate::from_response(response, txn_type)
|
|
285
|
+
when 'GiftCardReplace'
|
|
286
|
+
rvalue = HpsGiftCardReplace::from_response(response, txn_type)
|
|
287
|
+
when 'GiftCardReward'
|
|
288
|
+
rvalue = HpsGiftCardReward::from_response(response, txn_type)
|
|
289
|
+
when 'GiftCardSale'
|
|
290
|
+
rvalue = HpsGiftCardSale::from_response(response, txn_type)
|
|
291
|
+
when 'GiftCardVoid'
|
|
292
|
+
rvalue = HpsGiftCardVoid::from_response(response, txn_type)
|
|
293
|
+
when 'GiftCardReversal'
|
|
294
|
+
rvalue = HpsGiftCardReversal::from_response(response, txn_type)
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
return rvalue;
|
|
298
|
+
end # submit_transaction
|
|
299
|
+
|
|
300
|
+
end # HpsGiftCardService
|
|
301
|
+
end # Hps
|