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,211 @@
1
+ module Agms
2
+ class SAFERequest < Request
3
+ # A class representing AGMS SAFE Request objects.
4
+
5
+ alias AgmsAutoValidate autoValidate
6
+
7
+ def initialize(op)
8
+ super(op)
9
+ @fields = {
10
+ :TransactionType => {:setting => '', :value => ''},
11
+ :PaymentType => {:setting => '', :value => 'creditcard'},
12
+ :Amount => {:setting => '', :value => ''}, # Required for sale or auth
13
+ :TipAmount => {:setting => '', :value => ''}, # Required for Adjustment
14
+ :Tax => {:setting => '', :value => ''},
15
+ :Shipping => {:setting => '', :value => ''},
16
+ :OrderDescription => {:setting => '', :value => ''},
17
+ :OrderID => {:setting => '', :value => ''},
18
+ :PONumber => {:setting => '', :value => ''},
19
+ :CCNumber => {:setting => '', :value => ''}, # Required for sale and auth if payment type = creditcard without safe id
20
+ :CCExpDate => {:setting => '', :value => ''}, # Required for sale and auth if payment type = creditcard without safe id
21
+ :CVV => {:setting => '', :value => ''},
22
+ :CheckName => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
23
+ :CheckABA => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
24
+ :CheckAccount => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
25
+ :AccountHolderType => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
26
+ :AccountType => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
27
+ :SecCode => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
28
+ :FirstName => {:setting => '', :value => ''},
29
+ :LastName => {:setting => '', :value => ''},
30
+ :Company => {:setting => '', :value => ''},
31
+ :Address1 => {:setting => '', :value => ''},
32
+ :Address2 => {:setting => '', :value => ''},
33
+ :City => {:setting => '', :value => ''},
34
+ :State => {:setting => '', :value => ''},
35
+ :Zip => {:setting => '', :value => ''},
36
+ :Country => {:setting => '', :value => ''},
37
+ :Phone => {:setting => '', :value => ''},
38
+ :Fax => {:setting => '', :value => ''},
39
+ :EMail => {:setting => '', :value => ''},
40
+ :Website => {:setting => '', :value => ''},
41
+ :ShippingFirstName => {:setting => '', :value => ''},
42
+ :ShippingLastName => {:setting => '', :value => ''},
43
+ :ShippingCompany => {:setting => '', :value => ''},
44
+ :ShippingAddress1 => {:setting => '', :value => ''},
45
+ :ShippingAddress2 => {:setting => '', :value => ''},
46
+ :ShippingCity => {:setting => '', :value => ''},
47
+ :ShippingState => {:setting => '', :value => ''},
48
+ :ShippingZip => {:setting => '', :value => ''},
49
+ :ShippingCountry => {:setting => '', :value => ''},
50
+ :ShippingEmail => {:setting => '', :value => ''},
51
+ :ProcessorID => {:setting => '', :value => ''},
52
+ :TransactionID => {:setting => '', :value => ''},
53
+ :Tracking_Number => {:setting => '', :value => ''},
54
+ :Shipping_Carrier => {:setting => '', :value => ''},
55
+ :IPAddress => {:setting => '', :value => ''},
56
+ :Track1 => {:setting => '', :value => ''},
57
+ :Track2 => {:setting => '', :value => ''},
58
+ :Track3 => {:setting => '', :value => ''},
59
+ :Custom_Field_1 => {:setting => '', :value => ''},
60
+ :Custom_Field_2 => {:setting => '', :value => ''},
61
+ :Custom_Field_3 => {:setting => '', :value => ''},
62
+ :Custom_Field_4 => {:setting => '', :value => ''},
63
+ :Custom_Field_5 => {:setting => '', :value => ''},
64
+ :Custom_Field_6 => {:setting => '', :value => ''},
65
+ :Custom_Field_7 => {:setting => '', :value => ''},
66
+ :Custom_Field_8 => {:setting => '', :value => ''},
67
+ :Custom_Field_9 => {:setting => '', :value => ''},
68
+ :Custom_Field_10 => {:setting => '', :value => ''},
69
+ :SAFE_Action => {:setting => '', :value => ''},
70
+ :SAFE_ID => {:setting => '', :value => ''},
71
+ :ReceiptType => {:setting => '', :value => ''},
72
+ :MagData => {:setting => '', :value => ''},
73
+ :MagHardware => {:setting => '', :value => ''},
74
+ }
75
+
76
+ @numeric = %w(Amount Tax Shipping ProcessorID TransactionID CheckABA CheckAccount CCNumber CCExpDate)
77
+
78
+ @enums = {
79
+ :TransactionType => %w(sale auth safe\ only capture void refund update adjustment),
80
+ :SAFE_Action => %w(add_safe update_safe delete_safe),
81
+ :PaymentType => %w(creditcard check),
82
+ :SecCode => %w(PPD WEB TEL CCD),
83
+ :AccountHolderType => %w(business personal),
84
+ :AccountType => %w(checking savings),
85
+ :MagHardware => %w(MAGTEK IDTECH),
86
+ :Shipping_Carrier => %w(ups fedex dhl usps UPS Fedex DHL USPS),
87
+ }
88
+
89
+ @date = %w(StartDate EndDate)
90
+
91
+ @digit_2 = %w(State ShippingState)
92
+
93
+ @amount = %w(Amount TipAmount Tax Shipping)
94
+
95
+ # Override mapping with api-specific field maps
96
+ @mapping[:shipping_tracking_number] = :Tracking_Number
97
+ @mapping[:shipping_carrier] = :Shipping_Carrier
98
+
99
+ end
100
+
101
+ def validate
102
+ @required = Array.new
103
+
104
+ # If no transaction type, require a Safe Action
105
+ if @fields[:TransactionType][:value] == ''
106
+ @required.push(:SAFE_Action)
107
+ end
108
+
109
+ # All sales and auths require an amount
110
+ if ( @fields[:TransactionType][:value] == 'sale' or
111
+ @fields[:TransactionType][:value] == 'auth' )
112
+ @required.push(:Amount)
113
+ end
114
+
115
+ # Captures, refunds, voids, updates, adjustments need a Transaction ID
116
+ if ( @fields[:TransactionType][:value] == 'capture' or
117
+ @fields[:TransactionType][:value] == 'refund' or
118
+ @fields[:TransactionType][:value] == 'void' or
119
+ @fields[:TransactionType][:value] == 'adjustment' )
120
+ @required.push(:TransactionID)
121
+ end
122
+
123
+ # Require TipAmount for Tip Adjustment transactions
124
+ if @fields[:TransactionType][:value] == 'adjustment'
125
+ @required.push(:TipAmount)
126
+ end
127
+
128
+ # All safe updates and deletes require a safe id
129
+ if ( @fields[:SAFE_Action][:value] == 'update' or
130
+ @fields[:SAFE_Action][:value] == 'delete' )
131
+ @required.push(:SAFE_ID)
132
+ end
133
+
134
+
135
+ if @fields[:PaymentType][:value] == 'check'
136
+ # Cheque transaction
137
+ if @fields[:SAFE_ID][:value] == ''
138
+ # If no Safe ID we need all the check info
139
+ @required.push(:CheckName)
140
+ @required.push(:CheckABA)
141
+ @required.push(:CheckAccount)
142
+ if ( @fields[:TransactionType][:value] == 'sale' or
143
+ @fields[:TransactionType][:value] == 'auth' )
144
+ @required.push(:SecCode)
145
+ end
146
+ end
147
+ else
148
+ # Credit card transaction
149
+ # If no SAFE ID and its a sale or auth
150
+ if ( @fields[:SAFE_ID][:value] == '' and
151
+ ( @fields[:TransactionType][:value] == 'sale' or
152
+ @fields[:TransactionType][:value] == 'auth' ) )
153
+ # If no Safe ID we need the card info
154
+ # If no MagData then we need keyed info
155
+ if @fields[:MagData][:value] == ''
156
+ @required.push(:CCNumber)
157
+ @required.push(:CCExpDate)
158
+ else
159
+ @required.push(:MagHardware)
160
+ end
161
+ end
162
+ end
163
+
164
+ error_array = AgmsAutoValidate();
165
+
166
+ errors = error_array['errors'];
167
+ messages = error_array['messages'];
168
+
169
+ # ExpDate MMYY
170
+ if ( @fields[:CCExpDate][:value] != '' and
171
+ ( @fields[:CCExpDate][:value].length != 4 or
172
+ not /(0[1-9]|1[0-2])([0-9][0-9])/.match(@fields[:CCExpDate][:value]) ) )
173
+ errors += 1
174
+ messages.push('CCExpDate (credit card expiration date) must be MMYY.')
175
+ end
176
+
177
+ # CCNumber length
178
+ if ( @fields[:CCNumber][:value] != '' and
179
+ @fields[:CCNumber][:value].length != 16 and
180
+ @fields[:CCNumber][:value].length != 15 )
181
+ errors += 1
182
+ messages.push('CCNumber (credit card number) must be 15-16 digits long.')
183
+ end
184
+
185
+ # ABA length
186
+ if ( @fields[:CheckABA][:value] != '' and
187
+ @fields[:CheckABA][:value].length != 9)
188
+ errors += 1
189
+ messages.push('CheckABA (routing number) must be 9 digits long.')
190
+ end
191
+
192
+ @validate_errors = errors;
193
+ @validate_messages = messages;
194
+
195
+ if errors == 0
196
+ return {'errors' => errors, 'messages' => messages}
197
+ else
198
+ raise RequestValidationError, "Request validation failed with #{messages.join(' ')}."
199
+ end
200
+
201
+ end
202
+
203
+ def getFields
204
+ return getFieldArray
205
+ end
206
+
207
+ def getParams(request)
208
+ return {:vParameter => request}
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,217 @@
1
+ module Agms
2
+ class TransactionRequest < 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
+ :PaymentType => {:setting => '', :value => 'creditcard'},
12
+ :Amount => {:setting => '', :value => ''}, # Required for sale or auth
13
+ :TipAmount => {:setting => '', :value => ''}, # Required for Adjustment
14
+ :Tax => {:setting => '', :value => ''},
15
+ :Shipping => {:setting => '', :value => ''},
16
+ :OrderDescription => {:setting => '', :value => ''},
17
+ :OrderID => {:setting => '', :value => ''},
18
+ :ClerkID => {:setting => '', :value => ''},
19
+ :PONumber => {:setting => '', :value => ''},
20
+ :CCNumber => {:setting => '', :value => ''}, # Required for sale and auth if payment type = creditcard without safe id
21
+ :CCExpDate => {:setting => '', :value => ''}, # Required for sale and auth if payment type = creditcard without safe id
22
+ :CVV => {:setting => '', :value => ''},
23
+ :CheckName => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
24
+ :CheckABA => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
25
+ :CheckAccount => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
26
+ :AccountHolderType => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
27
+ :AccountType => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
28
+ :SecCode => {:setting => '', :value => ''}, # Required for sale and auth if payment type = check without safe id
29
+ :FirstName => {:setting => '', :value => ''},
30
+ :LastName => {:setting => '', :value => ''},
31
+ :Company => {:setting => '', :value => ''},
32
+ :Address1 => {:setting => '', :value => ''},
33
+ :Address2 => {:setting => '', :value => ''},
34
+ :City => {:setting => '', :value => ''},
35
+ :State => {:setting => '', :value => ''},
36
+ :Zip => {:setting => '', :value => ''},
37
+ :Country => {:setting => '', :value => ''},
38
+ :Phone => {:setting => '', :value => ''},
39
+ :Fax => {:setting => '', :value => ''},
40
+ :EMail => {:setting => '', :value => ''},
41
+ :Website => {:setting => '', :value => ''},
42
+ :ShippingFirstName => {:setting => '', :value => ''},
43
+ :ShippingLastName => {:setting => '', :value => ''},
44
+ :ShippingCompany => {:setting => '', :value => ''},
45
+ :ShippingAddress1 => {:setting => '', :value => ''},
46
+ :ShippingAddress2 => {:setting => '', :value => ''},
47
+ :ShippingCity => {:setting => '', :value => ''},
48
+ :ShippingState => {:setting => '', :value => ''},
49
+ :ShippingZip => {:setting => '', :value => ''},
50
+ :ShippingCountry => {:setting => '', :value => ''},
51
+ :ShippingEmail => {:setting => '', :value => ''},
52
+ :ShippingPhone => {:setting => '', :value => ''},
53
+ :ShippingFax => {:setting => '', :value => ''},
54
+ :ProcessorID => {:setting => '', :value => ''},
55
+ :TransactionID => {:setting => '', :value => ''},
56
+ :Tracking_Number => {:setting => '', :value => ''},
57
+ :Shipping_Carrier => {:setting => '', :value => ''},
58
+ :IPAddress => {:setting => '', :value => ''},
59
+ :Track1 => {:setting => '', :value => ''},
60
+ :Track2 => {:setting => '', :value => ''},
61
+ :Track3 => {:setting => '', :value => ''},
62
+ :Custom_Field_1 => {:setting => '', :value => ''},
63
+ :Custom_Field_2 => {:setting => '', :value => ''},
64
+ :Custom_Field_3 => {:setting => '', :value => ''},
65
+ :Custom_Field_4 => {:setting => '', :value => ''},
66
+ :Custom_Field_5 => {:setting => '', :value => ''},
67
+ :Custom_Field_6 => {:setting => '', :value => ''},
68
+ :Custom_Field_7 => {:setting => '', :value => ''},
69
+ :Custom_Field_8 => {:setting => '', :value => ''},
70
+ :Custom_Field_9 => {:setting => '', :value => ''},
71
+ :Custom_Field_10 => {:setting => '', :value => ''},
72
+ :SAFE_Action => {:setting => '', :value => ''},
73
+ :SAFE_ID => {:setting => '', :value => ''},
74
+ :ReceiptType => {:setting => '', :value => ''},
75
+ :MagData => {:setting => '', :value => ''},
76
+ :MagHardware => {:setting => '', :value => ''},
77
+ }
78
+
79
+ @numeric = %w(Amount Tax Shipping ProcessorID TransactionID CheckABA CheckAccount CCNumber CCExpDate)
80
+
81
+ @enums = {
82
+ :TransactionType => %w(sale auth safe\ only capture void refund update adjustment),
83
+ :SAFE_Action => %w(add_safe update_safe delete_safe),
84
+ :PaymentType => %w(creditcard check),
85
+ :SecCode => %w(PPD WEB TEL CCD),
86
+ :AccountHolderType => %w(business personal),
87
+ :AccountType => %w(checking savings),
88
+ :MagHardware => %w(MAGTEK IDTECH),
89
+ :Shipping_Carrier => %w(ups fedex dhl usps UPS Fedex DHL USPS),
90
+ }
91
+
92
+ @digit_2 = %w(State ShippingState)
93
+
94
+ @amount = %w(Amount TipAmount Tax Shipping)
95
+
96
+ # Override mapping with api-specific field maps
97
+ @mapping[:shipping_tracking_number] = :Tracking_Number
98
+ @mapping[:shipping_carrier] = :Shipping_Carrier
99
+
100
+ end
101
+
102
+ def validate
103
+ @required = Array.new
104
+
105
+ # Unless this is a safe action only request, require a transaction type
106
+ if @fields[:SAFE_Action][:value] == ''
107
+ @required.push(:TransactionType)
108
+ end
109
+
110
+ # If no transaction type, require a Safe Action
111
+ if @fields[:TransactionType][:value] == ''
112
+ @required.push(:SAFE_Action)
113
+ end
114
+
115
+ # All sales and auths require an amount
116
+ if ( @fields[:TransactionType][:value] == 'sale' or
117
+ @fields[:TransactionType][:value] == 'auth' )
118
+ @required.push(:Amount)
119
+ end
120
+
121
+ # Captures, refunds, voids, updates, adjustments need a Transaction ID
122
+ if ( @fields[:TransactionType][:value] == 'capture' or
123
+ @fields[:TransactionType][:value] == 'refund' or
124
+ @fields[:TransactionType][:value] == 'void' or
125
+ @fields[:TransactionType][:value] == 'adjustment' )
126
+ @required.push(:TransactionID)
127
+ end
128
+
129
+ # Require TipAmount for Tip Adjustment transactions
130
+ if @fields[:TransactionType][:value] == 'adjustment'
131
+ @required.push(:TipAmount)
132
+ end
133
+
134
+ # All safe updates and deletes require a safe id
135
+ if ( @fields[:SAFE_Action][:value] == 'update' or
136
+ @fields[:SAFE_Action][:value] == 'delete' )
137
+ @required.push(:SAFE_ID)
138
+ end
139
+
140
+
141
+ if @fields[:PaymentType][:value] == 'check'
142
+ # Cheque transaction
143
+ if @fields[:SAFE_ID][:value] == ''
144
+ # If no Safe ID we need all the check info
145
+ @required.push(:CheckName)
146
+ @required.push(:CheckABA)
147
+ @required.push(:CheckAccount)
148
+ if ( @fields[:TransactionType][:value] == 'sale' or
149
+ @fields[:TransactionType][:value] == 'auth' )
150
+ @required.push(:SecCode)
151
+ end
152
+ end
153
+ else
154
+ # Credit card transaction
155
+ # If no SAFE ID and its a sale or auth
156
+ if ( @fields[:SAFE_ID][:value] == '' and
157
+ ( @fields[:TransactionType][:value] == 'sale' or
158
+ @fields[:TransactionType][:value] == 'auth' ) )
159
+ # If no Safe ID we need the card info
160
+ # If no MagData then we need keyed info
161
+ if @fields[:MagData][:value] == ''
162
+ @required.push(:CCNumber)
163
+ @required.push(:CCExpDate)
164
+ else
165
+ @required.push(:MagHardware)
166
+ end
167
+ end
168
+ end
169
+
170
+ error_array = AgmsAutoValidate();
171
+ errors = error_array['errors'];
172
+ messages = error_array['messages'];
173
+
174
+ # ExpDate MMYY
175
+ if ( @fields[:CCExpDate][:value] != '' and
176
+ ( @fields[:CCExpDate][:value].length != 4 or
177
+ not /(0[1-9]|1[0-2])([0-9][0-9])/.match(@fields[:CCExpDate][:value]) ) )
178
+ errors += 1
179
+ messages.push('CCExpDate (credit card expiration date) must be MMYY.')
180
+ end
181
+
182
+ # CCNumber length
183
+ if ( @fields[:CCNumber][:value] != '' and
184
+ @fields[:CCNumber][:value].length != 16 and
185
+ @fields[:CCNumber][:value].length != 15 )
186
+ errors += 1
187
+ messages.push('CCNumber (credit card number) must be 15-16 digits long.')
188
+ end
189
+
190
+ # ABA length
191
+ if ( @fields[:CheckABA][:value] != '' and
192
+ @fields[:CheckABA][:value].length != 9)
193
+ errors += 1
194
+ messages.push('CheckABA (routing number) must be 9 digits long.')
195
+ end
196
+
197
+ @validate_errors = errors;
198
+ @validate_messages = messages;
199
+
200
+ if errors == 0
201
+ return {'errors' => errors, 'messages' => messages}
202
+ else
203
+ print "Request validation failed with #{messages.join(' ')}"
204
+ raise RequestValidationError, "Request validation failed with #{messages.join(' ')}."
205
+ end
206
+
207
+ end
208
+
209
+ def getFields
210
+ return getFieldArray
211
+ end
212
+
213
+ def getParams(request)
214
+ return {:objparameters => request}
215
+ end
216
+ end
217
+ end
@@ -0,0 +1,39 @@
1
+ module Agms
2
+ class HPPResponse < Response
3
+ # A class representing AGMS HPP Response objects.
4
+
5
+ def initialize(response, op)
6
+ super(response, op)
7
+ @op = op
8
+ @mapping = {'0' => 'hash', }
9
+ @response = Hash.new
10
+ @response['0'] = response
11
+ @hash = response
12
+
13
+ if not isSuccessful()
14
+ raise ResponseError, 'HPP Generation failed with message ' + @hash
15
+ end
16
+ end
17
+
18
+ def getHash
19
+ return @hash
20
+ end
21
+
22
+ def isSuccessful
23
+ @hash = getHash()
24
+ if ( not @hash or
25
+ @hash == 0 or
26
+ @hash.include? 'INVALID' or
27
+ @hash.include? 'ERROR' or
28
+ @hash.include? 'EXCEPTION' or
29
+ @hash.include? 'REQUIRED' or
30
+ @hash.include? 'IF USED' or
31
+ @hash.include? 'MUST BE' or
32
+ @hash.include? 'FAILED')
33
+ return false
34
+ else
35
+ return true
36
+ end
37
+ end
38
+ end
39
+ end