agms 0.1.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.
Files changed (58) hide show
  1. checksums.yaml +15 -0
  2. data/.travis.yml +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +51 -0
  5. data/Rakefile +40 -0
  6. data/agms.gemspec +29 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +7 -0
  9. data/example/hpp.rb +18 -0
  10. data/example/invoicing.rb +23 -0
  11. data/example/recurring.rb +23 -0
  12. data/example/report.rb +16 -0
  13. data/example/safe.rb +17 -0
  14. data/example/transaction.rb +17 -0
  15. data/init.yml +9 -0
  16. data/lib/agms.rb +59 -0
  17. data/lib/agms/agms.rb +109 -0
  18. data/lib/agms/configuration.rb +71 -0
  19. data/lib/agms/connect.rb +176 -0
  20. data/lib/agms/error/agms_error.rb +9 -0
  21. data/lib/agms/error/authentication_error.rb +7 -0
  22. data/lib/agms/error/authorization_error.rb +7 -0
  23. data/lib/agms/error/client_error_error.rb +7 -0
  24. data/lib/agms/error/configuation_error.rb +7 -0
  25. data/lib/agms/error/down_for_maintenance_error.rb +7 -0
  26. data/lib/agms/error/forged_query_String_error.rb +7 -0
  27. data/lib/agms/error/invalid_parameter_error.rb +7 -0
  28. data/lib/agms/error/invalid_request_error.rb +7 -0
  29. data/lib/agms/error/invalid_signature_error.rb +7 -0
  30. data/lib/agms/error/not_found_error.rb +7 -0
  31. data/lib/agms/error/request_validation_error.rb +7 -0
  32. data/lib/agms/error/response_error.rb +7 -0
  33. data/lib/agms/error/server_error_error.rb +7 -0
  34. data/lib/agms/error/ssl_certificate_error.rb +7 -0
  35. data/lib/agms/error/unexpected_error.rb +7 -0
  36. data/lib/agms/error/upgrade_required_error.rb +7 -0
  37. data/lib/agms/hpp.rb +65 -0
  38. data/lib/agms/invoicing.rb +63 -0
  39. data/lib/agms/recurring.rb +76 -0
  40. data/lib/agms/report.rb +53 -0
  41. data/lib/agms/request/hpp_request.rb +181 -0
  42. data/lib/agms/request/invoicing_request.rb +8 -0
  43. data/lib/agms/request/recurring_request.rb +115 -0
  44. data/lib/agms/request/report_request.rb +106 -0
  45. data/lib/agms/request/request.rb +455 -0
  46. data/lib/agms/request/safe_request.rb +211 -0
  47. data/lib/agms/request/transaction_request.rb +217 -0
  48. data/lib/agms/response/hpp_response.rb +39 -0
  49. data/lib/agms/response/invoicing_response.rb +10 -0
  50. data/lib/agms/response/recurring_response.rb +28 -0
  51. data/lib/agms/response/report_response.rb +141 -0
  52. data/lib/agms/response/response.rb +48 -0
  53. data/lib/agms/response/safe_response.rb +51 -0
  54. data/lib/agms/response/transaction_response.rb +50 -0
  55. data/lib/agms/safe.rb +66 -0
  56. data/lib/agms/transaction.rb +37 -0
  57. data/lib/agms/version.rb +3 -0
  58. metadata +156 -0
@@ -0,0 +1,63 @@
1
+ module Agms
2
+ class Invoicing < Agms
3
+ # A class representing AGMS Invoicing objects.
4
+
5
+ alias AgmsResetParameters resetParameters
6
+ alias AgmsSetParameter setParameter
7
+ alias AgmsDoConnect doConnect
8
+
9
+ def initialize
10
+ super()
11
+ @api_url = 'https://gateway.agms.com/roxapi/AGMS_BillPay.asmx'
12
+ @requestObject = 'InvoicingRequest'
13
+ @responseObject = 'InvoicingResponse'
14
+ end
15
+
16
+ # @return [Object]
17
+ def customer(params)
18
+ @op = 'RetrieveCustomerIDList'
19
+ AgmsResetParameters()
20
+ params.each do |param, config|
21
+ AgmsSetParameter(param, config)
22
+ end
23
+ # self.execute()
24
+ # return @response.toArray()
25
+ end
26
+
27
+ # @return [Object]
28
+ def invoice(params)
29
+ @op = 'RetrieveInvoices'
30
+ AgmsResetParameters()
31
+ params.each do |param, config|
32
+ AgmsSetParameter(param, config)
33
+ end
34
+ # self.execute()
35
+ # return @response.toArray()
36
+ end
37
+
38
+ # @return [Object]
39
+ def submit(params)
40
+ @op = 'SubmitInvoice'
41
+ AgmsResetParameters()
42
+ params.each do |param, config|
43
+ AgmsSetParameter(param, config)
44
+ end
45
+ # self.execute()
46
+ # return @response.toArray()
47
+ end
48
+
49
+ protected
50
+ def execute
51
+ if self.op == 'RetrieveCustomerIDList'
52
+ AgmsDoConnect('RetrieveCustomerIDList', @responseObject)
53
+ elsif self.op == 'RetrieveInvoices'
54
+ AgmsDoConnect('RetrieveInvoices', @responseObject)
55
+ elsif self.op == 'SubmitInvoice'
56
+ AgmsDoConnect('SubmitInvoice', @responseObject)
57
+ else
58
+ raise InvalidRequestError, "Invalid request to Transaction API #{@op}"
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,76 @@
1
+ module Agms
2
+ class Recurring < Agms
3
+ # A class representing AGMS Recurring objects.
4
+
5
+ alias AgmsResetParameters resetParameters
6
+ alias AgmsSetParameter setParameter
7
+ alias AgmsDoConnect doConnect
8
+
9
+ def initialize
10
+ super()
11
+ @api_url = 'https://gateway.agms.com/roxapi/AGMS_Recurring.asmx'
12
+ @requestObject = 'RecurringRequest'
13
+ @responseObject = 'RecurringResponse'
14
+ end
15
+
16
+ # @return [Object]
17
+ def add(params)
18
+ @op = 'RecurringAdd'
19
+ AgmsResetParameters()
20
+ params.each do |param, config|
21
+ AgmsSetParameter(param, config)
22
+ end
23
+ self.execute()
24
+ return @response.toArray()
25
+ end
26
+
27
+ # @return [Object]
28
+ def update(params)
29
+ @op = 'RecurringUpdate'
30
+ AgmsResetParameters()
31
+ params.each do |param, config|
32
+ AgmsSetParameter(param, config)
33
+ end
34
+ self.execute()
35
+ return @response.toArray()
36
+ end
37
+
38
+ # @return [Object]
39
+ def delete(params)
40
+ @op = 'RecurringDelete'
41
+ AgmsResetParameters()
42
+ params.each do |param, config|
43
+ AgmsSetParameter(param, config)
44
+ end
45
+ self.execute()
46
+ return @response.toArray()
47
+ end
48
+
49
+ # @return [Object]
50
+ def get(params)
51
+ @op = 'RetrieveRecurringID'
52
+ AgmsResetParameters()
53
+ params.each do |param, config|
54
+ AgmsSetParameter(param, config)
55
+ end
56
+ self.execute()
57
+ return @response.toArray()
58
+ end
59
+
60
+ protected
61
+ def execute
62
+ if @op == 'RecurringAdd'
63
+ AgmsDoConnect('RecurringAdd', @responseObject)
64
+ elsif @op == 'RecurringUpdate'
65
+ AgmsDoConnect('RecurringUpdate', @responseObject)
66
+ elsif @op == 'RecurringDelete'
67
+ AgmsDoConnect('RecurringDelete', @responseObject)
68
+ elsif @op == 'RetrieveRecurringID'
69
+ AgmsDoConnect('RetrieveRecurringID', @responseObject)
70
+ else
71
+ raise InvalidRequestError, "Invalid request to Transaction API #{@op}"
72
+ end
73
+ end
74
+
75
+ end
76
+ end
@@ -0,0 +1,53 @@
1
+ module Agms
2
+ class Report < Agms
3
+ # A class representing AGMS Report objects.
4
+
5
+ alias AgmsResetParameters resetParameters
6
+ alias AgmsSetParameter setParameter
7
+ alias AgmsDoConnect doConnect
8
+
9
+ def initialize
10
+ super()
11
+ @trans_api_url = 'https://gateway.agms.com/roxapi/agms.asmx'
12
+ @safe_api_url = 'https://gateway.agms.com/roxapi/AGMS_SAFE_API.asmx'
13
+ @requestObject = 'ReportRequest'
14
+ @responseObject = 'ReportResponse'
15
+ end
16
+
17
+ # @return [Object]
18
+ def listTransactions(params)
19
+ @op = 'TransactionAPI'
20
+ AgmsResetParameters()
21
+ params.each do |param, config|
22
+ AgmsSetParameter(param, config)
23
+ end
24
+ self.execute()
25
+ return @response.toArray()
26
+ end
27
+
28
+ # @return [Object]
29
+ def listSAFEs(params)
30
+ @op = 'QuerySAFE'
31
+ AgmsResetParameters()
32
+ params.each do |param, config|
33
+ AgmsSetParameter(param, config)
34
+ end
35
+ self.execute()
36
+ return @response.toArray()
37
+ end
38
+
39
+ protected
40
+ def execute
41
+ if @op == 'TransactionAPI'
42
+ @api_url = @trans_api_url
43
+ AgmsDoConnect('TransactionAPI', @responseObject)
44
+ elsif @op == 'QuerySAFE'
45
+ @api_url = @safe_api_url
46
+ AgmsDoConnect('QuerySAFE', @responseObject)
47
+ else
48
+ raise InvalidRequestError, "Invalid request to Transaction API #{@op}"
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,181 @@
1
+ module Agms
2
+ class HPPRequest < Request
3
+ # A class representing AGMS Transaction Request objects.
4
+
5
+ alias AgmsAutoValidate autoValidate
6
+
7
+ def initialize(op)
8
+ super(op)
9
+ @fields = {
10
+ :TransactionType => {:setting => '', :value => ''},
11
+ :Amount => {:setting => '', :value => ''},
12
+ :TipAmount => {:setting => '', :value => ''},
13
+ :Tax => {:setting => '', :value => ''},
14
+ :Shipping => {:setting => '', :value => ''},
15
+ :OrderDescription => {:setting => '', :value => ''},
16
+ :OrderID => {:setting => '', :value => ''},
17
+ :ClerkID => {:setting => '', :value => ''},
18
+ :PONumber => {:setting => '', :value => ''},
19
+ :RetURL => {:setting => '', :value => ''},
20
+ :ACHEnabled => {:setting => '', :value => ''},
21
+ :SAFE_ID => {:setting => '', :value => ''},
22
+ :Donation => {:setting => '', :value => ''},
23
+ :UsageCount => {:setting => '', :value => ''},
24
+ :Internal => {:setting => '', :value => ''},
25
+ :FirstName => {:setting => '', :value => ''},
26
+ :LastName => {:setting => '', :value => ''},
27
+ :Company => {:setting => '', :value => ''},
28
+ :Address1 => {:setting => '', :value => ''},
29
+ :Address2 => {:setting => '', :value => ''},
30
+ :City => {:setting => '', :value => ''},
31
+ :State => {:setting => '', :value => ''},
32
+ :Zip => {:setting => '', :value => ''},
33
+ :Country => {:setting => '', :value => ''},
34
+ :Phone => {:setting => '', :value => ''},
35
+ :Fax => {:setting => '', :value => ''},
36
+ :EMail => {:setting => '', :value => ''},
37
+ :Website => {:setting => '', :value => ''},
38
+ :ShippingFirstName => {:setting => '', :value => ''},
39
+ :ShippingLastName => {:setting => '', :value => ''},
40
+ :ShippingCompany => {:setting => '', :value => ''},
41
+ :ShippingAddress1 => {:setting => '', :value => ''},
42
+ :ShippingAddress2 => {:setting => '', :value => ''},
43
+ :ShippingCity => {:setting => '', :value => ''},
44
+ :ShippingState => {:setting => '', :value => ''},
45
+ :ShippingZip => {:setting => '', :value => ''},
46
+ :ShippingCountry => {:setting => '', :value => ''},
47
+ :ShippingEmail => {:setting => '', :value => ''},
48
+ :ShippingPhone => {:setting => '', :value => ''},
49
+ :ShippingFax => {:setting => '', :value => ''},
50
+ :ProcessorID => {:setting => '', :value => ''},
51
+ :TransactionID => {:setting => '', :value => ''},
52
+ :Tracking_Number => {:setting => '', :value => ''},
53
+ :Shipping_Carrier => {:setting => '', :value => ''},
54
+ :IPAddress => {:setting => '', :value => ''},
55
+ :Custom_Field_1 => {:setting => '', :value => ''},
56
+ :Custom_Field_2 => {:setting => '', :value => ''},
57
+ :Custom_Field_3 => {:setting => '', :value => ''},
58
+ :Custom_Field_4 => {:setting => '', :value => ''},
59
+ :Custom_Field_5 => {:setting => '', :value => ''},
60
+ :Custom_Field_6 => {:setting => '', :value => ''},
61
+ :Custom_Field_7 => {:setting => '', :value => ''},
62
+ :Custom_Field_8 => {:setting => '', :value => ''},
63
+ :Custom_Field_9 => {:setting => '', :value => ''},
64
+ :Custom_Field_10 => {:setting => '', :value => ''},
65
+ :HPPFormat => {:setting => '', :value => ''},
66
+ :StartDate => {:setting => '', :value => ''},
67
+ :EndDate => {:setting => '', :value => ''},
68
+ :StartTime => {:setting => '', :value => ''},
69
+ :EndTime => {:setting => '', :value => ''},
70
+ :SuppressAutoSAFE => {:setting => '', :value => ''}
71
+ }
72
+
73
+ @optionable = %w('FirstName', 'LastName', 'Company', 'Address1', 'Address2',
74
+ 'City', 'State', 'Zip', 'Country', 'Phone', 'Fax',
75
+ 'EMail', 'Website', 'Tax', 'Shipping', 'OrderID',
76
+ 'PONumber', 'ShippingFirstName', 'ShippingLastName', 'ShippingCompany', 'ShippingAddress1',
77
+ 'ShippingAddress2', 'ShippingCity', 'ShippingState', 'ShippingZip', 'ShippingCountry',
78
+ 'ShippingEmail', 'ShippingPhone', 'ShippingFax', 'ShippingTrackingNumber', 'ShippingCarrier',
79
+ 'Custom_Field_1', 'Custom_Field_2', 'Custom_Field_3', 'Custom_Field_4', 'Custom_Field_5',
80
+ 'Custom_Field_6', 'Custom_Field_7', 'Custom_Field_8', 'Custom_Field_9', 'Custom_Field_10')
81
+
82
+ @numeric = %w(Amount Tax Shipping ProcessorID TransactionID CheckABA CheckAccount CCNumber CCExpDate)
83
+
84
+ @enums = {
85
+ :TransactionType => %w(sale auth safe\ only capture void refund update adjustment),
86
+ :Shipping_Carrier => %w(ups fedex dhl usps UPS Fedex DHL USPS),
87
+ :HPPFormat => %w(1 2)
88
+ }
89
+ @boolean = %w(Donation AutoSAFE SuppressAutoSAFE)
90
+
91
+ @date = %w(StartDate EndDate)
92
+
93
+ @digit_2 = %w(State ShippingState)
94
+
95
+ @amount = %w(Amount TipAmount Tax Shipping)
96
+
97
+ @required = %w(TransactionType)
98
+
99
+ # Override mapping with api-specific field maps
100
+ @mapping[:shipping_tracking_number] = :Tracking_Number
101
+ @mapping[:shipping_carrier] = :Shipping_Carrier
102
+
103
+ end
104
+
105
+ def validate
106
+ @required = Array.new
107
+
108
+ # All sales and auth require an amount unless donation
109
+ if ( ( @fields[:Donation][:value] != '' or
110
+ @fields[:Donation][:value] != false ) and
111
+ (@fields[:TransactionType][:value] == 'sale' or
112
+ @fields[:TransactionType][:value] == 'auth') )
113
+ @required.push(:Amount)
114
+ end
115
+
116
+ error_array = AgmsAutoValidate();
117
+
118
+ errors = error_array['errors'];
119
+ messages = error_array['messages'];
120
+
121
+ # ExpDate MMYY
122
+ if ( @fields.has_key?(:CCExpDate) and
123
+ @fields[:CCExpDate][:value] != '' and
124
+ ( @fields[:CCExpDate][:value].length != 4 or
125
+ not /(0[1-9]|1[0-2])([0-9][0-9])/.match(@fields[:CCExpDate][:value]) ) )
126
+ errors += 1
127
+ messages.push('CCExpDate (credit card expiration date) must be MMYY.')
128
+ end
129
+
130
+ # CCNumber length
131
+ if ( @fields.has_key?(:CCNumber) and
132
+ @fields[:CCNumber][:value] != '' and
133
+ @fields[:CCNumber][:value].length != 16 and
134
+ @fields[:CCNumber][:value].length != 15 )
135
+ errors += 1
136
+ messages.push('CCNumber (credit card number) must be 15-16 digits long.')
137
+ end
138
+
139
+ # ABA length
140
+ if ( @fields.has_key?(:CheckABA) and
141
+ @fields[:CheckABA][:value] != '' and
142
+ @fields[:CheckABA][:value].length != 9)
143
+ errors += 1
144
+ messages.push('CheckABA (routing number) must be 9 digits long.')
145
+ end
146
+
147
+ @validate_errors = errors;
148
+ @validate_messages = messages;
149
+
150
+ if errors == 0
151
+ return {'errors' => errors, 'messages' => messages}
152
+ else
153
+ raise RequestValidationError, "Request validation failed with #{messages.join(' ')}."
154
+ end
155
+
156
+ end
157
+
158
+ def getFields
159
+ fields = getFieldArray
160
+ if fields.has_key?(:AutoSAFE)
161
+ if fields[:AutoSAFE] == true
162
+ fields[:AutoSAFE] = 1
163
+ else
164
+ fields[:AutoSAFE] = 0
165
+ end
166
+ end
167
+ if fields.has_key?(:SuppressAutoSAFE)
168
+ if fields[:SuppressAutoSAFE] == true
169
+ fields[:SuppressAutoSAFE] = 1
170
+ else
171
+ fields[:SuppressAutoSAFE] = 0
172
+ end
173
+ end
174
+ return fields
175
+ end
176
+
177
+ def getParams(request)
178
+ return {:objparameters => request}
179
+ end
180
+ end
181
+ end
@@ -0,0 +1,8 @@
1
+ module Agms
2
+ class InvoicingRequest < Request
3
+
4
+ def initialize(op)
5
+ super(op)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,115 @@
1
+ module Agms
2
+ class RecurringRequest < Request
3
+ # A class representing AGMS Recurring Request objects.
4
+
5
+ alias AgmsAutoValidate autoValidate
6
+
7
+ def initialize(op)
8
+ super(op)
9
+ @fields1 = {
10
+ :RecurringID => {:setting => '', :value => ''},
11
+ :MerchantID => {:setting => '', :value => ''},
12
+ :PaymentType => {:setting => '', :value => 'creditcard'},
13
+ :InitialAmount => {:setting => '', :value => ''},
14
+ :RecurringAmount => {:setting => '', :value => ''},
15
+ :CCNumber => {:setting => '', :value => ''},
16
+ :CCExpDate => {:setting => '', :value => ''},
17
+ :CVV => {:setting => '', :value => ''},
18
+ :CheckName => {:setting => '', :value => ''},
19
+ :CheckABA => {:setting => '', :value => ''},
20
+ :CheckAccount => {:setting => '', :value => ''},
21
+ :AccountHolderType => {:setting => '', :value => ''},
22
+ :AccountType => {:setting => '', :value => ''},
23
+ :SecCode => {:setting => '', :value => ''},
24
+ :FirstName => {:setting => '', :value => ''},
25
+ :LastName => {:setting => '', :value => ''},
26
+ :Company => {:setting => '', :value => ''},
27
+ :Address1 => {:setting => '', :value => ''},
28
+ :Address2 => {:setting => '', :value => ''},
29
+ :City => {:setting => '', :value => ''},
30
+ :State => {:setting => '', :value => ''},
31
+ :Zip => {:setting => '', :value => ''},
32
+ :Country => {:setting => '', :value => ''},
33
+ :Phone => {:setting => '', :value => ''},
34
+ :Fax => {:setting => '', :value => ''},
35
+ :EMail => {:setting => '', :value => ''},
36
+ :Website => {:setting => '', :value => ''},
37
+ :Custom_Field_1 => {:setting => '', :value => ''},
38
+ :Custom_Field_2 => {:setting => '', :value => ''},
39
+ :Custom_Field_3 => {:setting => '', :value => ''},
40
+ :Custom_Field_4 => {:setting => '', :value => ''},
41
+ :Custom_Field_5 => {:setting => '', :value => ''},
42
+ :Custom_Field_6 => {:setting => '', :value => ''},
43
+ :Custom_Field_7 => {:setting => '', :value => ''},
44
+ :Custom_Field_8 => {:setting => '', :value => ''},
45
+ :Custom_Field_9 => {:setting => '', :value => ''},
46
+ :Custom_Field_10 => {:setting => '', :value => ''},
47
+ :StartDate => {:setting => '', :value => ''},
48
+ :Frequency => {:setting => '', :value => ''},
49
+ :Quantity => {:setting => '', :value => ''},
50
+ :NumberOfOccurrences => {:setting => '', :value => ''},
51
+ :EndDate => {:setting => '', :value => ''},
52
+ :NumberOfRetries => {:setting => '', :value => ''}
53
+ }
54
+
55
+ @numeric = %w(InitialAmount RecurringAmount Quantity NumberOfOccurrences NumberOfRetries CCNumber CCExpDate CheckABA CheckAccount)
56
+
57
+ @enums = {
58
+ :PaymentType => %w(creditcard check),
59
+ :SecCode => %w(PPD WEB TEL CCD),
60
+ :AccountHolderType => %w(business personal),
61
+ :AccountType => %w(checking savings),
62
+ :Frequency => %w(days weeks months)
63
+ }
64
+
65
+ @date = %w(StartDate EndDate)
66
+
67
+ @digit_2 = %w(State)
68
+
69
+ @amount = %w(Amount TipAmount Tax Shipping)
70
+
71
+ if @op == 'RecurringAdd'
72
+ @fields = @fields1
73
+ else
74
+ raise InvalidRequestError, "Invalid op #{@op} in Request."
75
+ end
76
+
77
+ end
78
+
79
+ def validate
80
+ @required = Array.new
81
+
82
+ if @fields[:Frequency][:value] == ''
83
+ @required.push(:Frequency)
84
+ end
85
+
86
+ # If no transaction type, require a Safe Action
87
+ if @fields[:NumberOfRetries][:value] == ''
88
+ @required.push(:NumberOfRetries)
89
+ end
90
+
91
+ error_array = AgmsAutoValidate();
92
+
93
+ errors = error_array['errors'];
94
+ messages = error_array['messages'];
95
+
96
+ @validate_errors = errors;
97
+ @validate_messages = messages;
98
+
99
+ if errors == 0
100
+ return {'errors' => errors, 'messages' => messages}
101
+ else
102
+ raise RequestValidationError, "Request validation failed with #{messages.join(' ')}."
103
+ end
104
+
105
+ end
106
+
107
+ def getFields
108
+ return getFieldArray
109
+ end
110
+
111
+ def getParams(request)
112
+ return {:vRecurringParams => request}
113
+ end
114
+ end
115
+ end